ZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCmluZGV4IDRlMDhhMmUuLjRiNGM1MmYgMTAwNjQ0Ci0tLSBhLy5naXRpZ25vcmUKKysrIGIvLmdpdGlnbm9yZQpAQCAtMzUsMyArMzUsNiBAQAogZGVwZW5kZW5jeS1yZWR1Y2VkLXBvbS54bWwKIGRlcmJ5LmxvZwogbWV0YXN0b3JlX2RiCisuc2V0dGluZ3MvCisqKi8ucHJvamVjdAorKiovLmNsYXNzcGF0aApkaWZmIC0tZ2l0IGEvLnRyYXZpcy55bWwgYi8udHJhdmlzLnltbAppbmRleCA2ZDg2NGQ1Li4wNWUyNGZlIDEwMDY0NAotLS0gYS8udHJhdmlzLnltbAorKysgYi8udHJhdmlzLnltbApAQCAtOSwxNyArOSwyNCBAQAogIyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAjICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAjICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLWxhbmd1YWdlOiBqYXZhCiAKK2VudjoKKyAgLSBNT0RVTEVTPXN0b3JtLWNvcmUKKyAgLSBNT0RVTEVTPSchc3Rvcm0tY29yZScKKworbGFuZ3VhZ2U6IGphdmEKIGpkazoKICAgLSBvcmFjbGVqZGs3CiAgIC0gb3JhY2xlamRrOAotCiBiZWZvcmVfaW5zdGFsbDoKICAgLSBydm0gdXNlIDIuMS41IC0taW5zdGFsbAogICAtIG52bSBpbnN0YWxsIDAuMTIuMgogICAtIG52bSB1c2UgMC4xMi4yCi0KIGluc3RhbGw6IC9iaW4vYmFzaCAuL2Rldi10b29scy90cmF2aXMvdHJhdmlzLWluc3RhbGwuc2ggYHB3ZGAKLQotc2NyaXB0OiAvYmluL2Jhc2ggLi9kZXYtdG9vbHMvdHJhdmlzL3RyYXZpcy1zY3JpcHQuc2ggYHB3ZGAKK3NjcmlwdDogL2Jpbi9iYXNoIC4vZGV2LXRvb2xzL3RyYXZpcy90cmF2aXMtc2NyaXB0LnNoIGBwd2RgICRNT0RVTEVTCitzdWRvOiBmYWxzZQorY2FjaGU6CisgIGRpcmVjdG9yaWVzOgorICAgIC0gIiRIT01FLy5tMi9yZXBvc2l0b3J5IgorICAgIC0gIiRIT01FLy5ydm0iCisgICAgLSAiJE5WTV9ESVIiCmRpZmYgLS1naXQgYS9DSEFOR0VMT0cubWQgYi9DSEFOR0VMT0cubWQKaW5kZXggYzVkMDUyYi4uZjUxM2E3ZiAxMDA2NDQKLS0tIGEvQ0hBTkdFTE9HLm1kCisrKyBiL0NIQU5HRUxPRy5tZApAQCAtMSw2ICsxLDEwMSBAQAogIyMgMC4xMS4wCiAgKiBTVE9STS0xMDYwOiBTZXJpYWxpemUgQ2FsY2l0ZSBwbGFucyBpbnRvIEpTT04gZm9ybWF0LgogICogU1RPUk0tMTA2MjogRXN0YWJsaXNoIHRoZSBiYXNpYyBzdHJ1Y3R1cmUgb2YgdGhlIGNvZGUgZ2VuZXJhdG9yLgorICogU1RPUk0tMTM0MTogTGV0IHRvcG9sb2d5IGhhdmUgb3duIGhlYXJ0YmVhdCB0aW1lb3V0IGZvciBtdWx0aWxhbmcgc3VicHJvY2VzcworICogU1RPUk0tMTIwNzogQWRkZWQgZmx1eCBzdXBwb3J0IGZvciBJV2luZG93ZWRCb2x0CisgKiBTVE9STS0xMzUyOiBUcmlkZW50IHNob3VsZCBzdXBwb3J0IHdyaXRpbmcgdG8gbXVsdGlwbGUgS2Fma2EgY2x1c3RlcnMuCisgKiBTVE9STS0xMjIwOiBBdm9pZCBkb3VibGUgY29weWluZyBpbiB0aGUgS2Fma2Egc3BvdXQuCisgKiBTVE9STS0xMzQwOiBVc2UgVHJhdmlzLUNJIGJ1aWxkIG1hdHJpeCB0byBpbXByb3ZlIHRlc3QgZXhlY3V0aW9uIHRpbWVzCisgKiBTVE9STS0xMTI2OiBBbGxvdyBhIGNvbmZpZ01ldGhvZCB0aGF0IHRha2VzIG5vIGFyZ3VtZW50cyAoRmx1eCkKKyAqIFNUT1JNLTEyMDM6IHdvcmtlciBtZXRhZGF0YSBmaWxlIGNyZWF0aW9uIGRvZXNuJ3QgdXNlIHN0b3JtLmxvZy5kaXIgY29uZmlnCisgKiBTVE9STS0xMzQ5OiBbRmx1eF0gQWxsb3cgY29uc3RydWN0b3JBcmdzIHRvIHRha2UgTWFwcyBhcyBhcmd1bWVudHMKKyAqIFNUT1JNLTEyNjogQWRkIExpZmVjeWNsZSBzdXBwb3J0IEFQSSBmb3Igd29ya2VyIG5vZGVzCisgKiBTVE9STS0xMjEzOiBSZW1vdmUgc2lnYXIgYmluYXJpZXMgZnJvbSBzb3VyY2UgdHJlZQorICogU1RPUk0tODg1OiAgSGVhcnRiZWF0IFNlcnZlciAoUGFjZW1ha2VyKQorICogU1RPUk0tMTIyMTogQ3JlYXRlIGEgY29tbW9uIGludGVyZmFjZSBmb3IgYWxsIFRyaWRlbnQgc3BvdXQuCisgKiBTVE9STS0xMTk4OiBXZWIgVUkgdG8gc2hvdyByZXNvdXJjZSB1c2FnZXMgYW5kIFRvdGFsIFJlc291cmNlcyBvbiBhbGwgc3VwZXJ2aXNvcnMKKyAqIFNUT1JNLTExNjc6IEFkZCB3aW5kb3dpbmcgc3VwcG9ydCBmb3Igc3Rvcm0gY29yZS4KKyAqIFNUT1JNLTEyMTU6IFVzZSBBc3luYyBMb2dnZXJzIHRvIGF2b2lkIGxvY2tpbmcgIGFuZCBsb2dnaW5nIG92ZXJoZWFkCisgKiBTVE9STS0xMjA0OiBMb2d2aWV3ZXIgc2hvdWxkIGdyYWNlZnVsIHJlcG9ydCBwYWdlLW5vdC1mb3VuZCBpbnN0ZWFkIG9mIDUwMCBmb3IgYmFkIHRvcG8taWQgZXRjCisgKiBTVE9STS04MzE6IEFkZCBCdWdUcmFja2VyIGFuZCBDZW50cmFsIExvZ2dpbmcgVVJMIHRvIFVJCisgKiBTVE9STS0xMjA4OiBVSTogTlBFIHNlZW4gd2hlbiBhZ2dyZWdhdGluZyBib2x0IHN0cmVhbXMgc3RhdHMKKyAqIFNUT1JNLTEwMTY6IEdlbmVyYXRlIHRyaWRlbnQgYm9sdCBpZHMgd2l0aCBzb3J0ZWQgZ3JvdXAgbmFtZXMKKyAqIFNUT1JNLTExOTA6IFN5c3RlbSBMb2FkIHRvbyBoaWdoIGFmdGVyIHJlY2VudCBjaGFuZ2VzCisgKiBTVE9STS0xMDk4OiBOaW1idXMgaG9vayBmb3IgdG9wb2xvZ3kgYWN0aW9ucy4KKyAqIFNUT1JNLTExNDU6IEhhdmUgSUNvbm5lY3Rpb24gcHVzaCB0dXBsZXMgaW5zdGVhZCBvZiBwdWxsIHRoZW0KKyAqIFNUT1JNLTExOTE6IGJ1bXAgdGltZW91dCBieSA1MCUgZHVlIHRvIGludGVybWl0dGVudCB0cmF2aXMgYnVpbGQgZmFpbHVyZXMKKyAqIFNUT1JNLTc5NDogTW9kaWZ5IFNwb3V0IGFzeW5jIGxvb3AgdG8gdHJlYXQgYWN0aXZhdGUvZGVhY3RpdmF0ZSBBU0FQCisgKiBTVE9STS0xMTk2OiBVcGdyYWRlIHRvIHRocmlmdCAwLjkuMworICogU1RPUk0tMTE1NTogU3VwZXJ2aXNvciByZWN1cnJpbmcgaGVhbHRoIGNoZWNrcworICogU1RPUk0tMTE4OTogTWFpbnRhaW4gd2lyZSBjb21wYXRhYmlsaXR5IHdpdGggMC4xMC54IHZlcnNpb25zIG9mIHN0b3JtLgorICogU1RPUk0tMTE4NTogcmVwbGFjZSBuaW1idXMuaG9zdCB3aXRoIG5pbWJ1cy5zZWVkcworICogU1RPUk0tMTE2NDogQ29kZSBjbGVhbnVwIGZvciB0eXBvcywgd2FybmluZ3MgYW5kIGNvbmNpc2VuZXNzLgorICogU1RPUk0tOTAyOiBTaW1wbGUgTG9nIFNlYXJjaC4KKyAqIFNUT1JNLTEwNTI6IFRyaWRlbnRLYWZrYVN0YXRlIHVzZXMgbmV3IEthZmthIFByb2R1Y2VyIEFQSS4KKyAqIFNUT1JNLTExODI6IFJlbW92aW5nIGFuZCB3cmFwcGluZyBzb21lIGV4Y2VwdGlvbnMgaW4gQ29uZmlnVmFsaWRhdGlvbiB0byBtYWtlIGNvZGUgY2xlYW5lcgorICogU1RPUk0tMTEzNC4gV2luZG93czogRml4IGxvZzRqIGNvbmZpZy4KKyAqIFNUT1JNLTExMjc6IGFsbG93IGZvciBib29sZWFuIGFyZ3VtZW50cyAoRmx1eCkKKyAqIFNUT1JNLTExODA6IEZMVVggbG9nbyB3YXNuJ3QgYXBwZWFyaW5nIHF1aXRlIHJpZ2h0CisgKiBTVE9STS0xMTM4OiBTdG9ybS1oZGZzIFJFQURNRSBzaG91bGQgYmUgdXBkYXRlZCB3aXRoIEF2cm8gQm9sdCBpbmZvcm1hdGlvbgorICogU1RPUk0tMTE1NDogU2VxdWVuY2VGaWxlQm9sdCBuZWVkcyB1bml0IHRlc3RzCisgKiBTVE9STS0xNjI6IExvYWQgQXdhcmUgU2h1ZmZsZSBHcm91cGluZworICogU1RPUk0tMTE1ODogU3Rvcm0gbWV0cmljcyB0byBwcm9maWxlIHZhcmlvdXMgc3Rvcm0gZnVuY3Rpb25zCisgKiBTVE9STS0xMTYxOiBBZGQgTGljZW5zZSBoZWFkZXJzIGFuZCBhZGQgcmF0IGNoZWNrcyB0byBidWlsZHMKKyAqIFNUT1JNLTExNjU6IG5vcm1hbGl6ZSB0aGUgc2NhbGVzIG9mIENQVS9NZW0vTmV0IHdoZW4gY2hvb3NpbmcgdGhlIGJlc3Qgbm9kZSBmb3IgUmVzb3VyY2UgQXdhcmUgU2NoZWR1bGVyCisgKiBTVE9STS0xMTYzOiB1c2Ugcm1yIHJhdGhlciB0aGFuIHJtcGF0aCBmb3IgcmVtb3ZlIHdvcmtlci1yb290CisgKiBTVE9STS0xMTcwOiBGaXggdGhlIHByb2R1Y2VyIGFsaXZlIGlzc3VlIGluIERpc3J1cHRvclF1ZXVlVGVzdAorICogU1RPUk0tMTE2ODogcmVtb3ZlcyBub2lzeSBsb2cgbWVzc2FnZSAmIGEgVE9ETworICogU1RPUk0tMTE0MzogVmFsaWRhdGUgdG9wb2xvZ3kgQ29uZmlncyBkdXJpbmcgdG9wb2xvZ3kgc3VibWlzc2lvbgorICogU1RPUk0tMTE1NzogQWRkaW5nIGR5bmFtaWMgcHJvZmlsaW5nIGZvciB3b3JrZXIsIHJlc3RhcnRpbmcgd29ya2VyLCBqc3RhY2ssIGhlYXAgZHVtcCwgYW5kIHByb2ZpbGluZworICogU1RPUk0tMTEyMzogVHVwbGVJbXBsIC0gVW5uZWNlc3NhcnkgdmFyaWFibGUgaW5pdGlhbGl6YXRpb24uCisgKiBTVE9STS0xMTUzOiBVc2Ugc3RhdGljIGZpbmFsIGluc3RlYWQgb2YganVzdCBzdGF0aWMgZm9yIGNsYXNzIG1lbWJlcnMuCisgKiBTVE9STS04MTc6IEthZmthIFdpbGRjYXJkIFRvcGljIFN1cHBvcnQuCisgKiBTVE9STS00MDogVHVybiB3b3JrZXIgZ2FyYmFnZSBjb2xsZWN0aW9uIGFuZCBoZWFwZHVtcCBvbiBieSBkZWZhdWx0LgorICogU1RPUk0tMTE1MjogQ2hhbmdlIG1hcCBrZXlTZXQgaXRlcmF0aW9uIHRvIGVudHJ5U2V0IGl0ZXJhdGlvbiBmb3IgZWZmaWNpZW5jeS4KKyAqIFNUT1JNLTExNDc6IFN0b3JtIEpEQkNCb2x0IHNob3VsZCBhZGQgdmFsaWRhdGlvbiB0byBlbnN1cmUgZWl0aGVyIGluc2VydFF1ZXJ5IG9yIHRhYmxlIG5hbWUgaXMgc3BlY2lmaWVkIGFuZCBub3QgYm90aC4KKyAqIFNUT1JNLTExNTE6IEJhdGNoaW5nIGluIERpc3J1cHRvclF1ZXVlCisgKiBTVE9STS0zNTA6IFVwZGF0ZSBkaXNydXB0b3IgdG8gbGF0ZXN0IHZlcnNpb24gKDMuMy4yKQorICogU1RPUk0tNjk3OiBTdXBwb3J0IGZvciBFbWl0dGluZyBLYWZrYSBNZXNzYWdlIE9mZnNldCBhbmQgUGFydGl0aW9uCisgKiBTVE9STS0xMDc0OiBBZGQgQXZybyBIREZTIGJvbHQKKyAqIFNUT1JNLTU2NjogSW1wcm92ZSBkb2N1bWVudGF0aW9uIGluY2x1ZGluZyBpbmNvcnJlY3QgS3J5byBzZXIuIGZyYW1ld29yayBkb2NzCisgKiBTVE9STS0xMDczOiBSZWZhY3RvciBBYnN0cmFjdEhkZnNCb2x0CisgKiBTVE9STS0xMTI4OiBNYWtlIG1ldHJpY3MgZmFzdAorICogU1RPUk0tMTEyMjogRml4IHRoZSBmb3JtYXQgaXNzdWUgaW4gVXRpbHMuamF2YQorICogU1RPUk0tMTExMTogRml4IFZhbGlkYXRpb24gZm9yIGxvdHMgb2YgZGlmZmVyZW50IGNvbmZpZ3MKKyAqIFNUT1JNLTExMjU6IEFkZGluZyBzZXBhcmF0ZSBaSyBjbGllbnQgZm9yIHJlYWQgaW4gTmltYnVzIFpLIFN0YXRlCisgKiBTVE9STS0xMTIxOiBSZW1vdmUgbWV0aG9kIGNhbGwgdG8gYXZvaWQgb3ZlcmhlYWQgZHVyaW5nIHRvcG9sb2d5IHN1Ym1pc3Npb24gdGltZQorICogU1RPUk0tMTEyMDogRml4IGtleXdvcmQgKHNjaGVtYSAtPiBzY2hlbWUpIGZyb20gbWFpbi1yb3V0ZXMKKyAqIFNUT1JNLTExMTU6IFN0YWxlIGxlYWRlci1sb2NrIGtleSBlZmZlY3RpdmVseSBiYW5zIGFsbCBub2RlcyBmcm9tIGJlY29taW5nIGxlYWRlcnMKKyAqIFNUT1JNLTExMTk6IENyZWF0ZSBhY2Nlc3MgbG9nZ2luZyBmb3IgYWxsIGRhZW1vbnMKKyAqIFNUT1JNLTExMTc6IEFkZHMgdmlzdWFsaXphdGlvbi1pbml0IHJvdXRlIHByZXZpb3VzbHkgbWlzc2luZworICogU1RPUk0tMTExODogQWRkZWQgdGVzdCB0byBjb21wYXJlIGxhdGVuY3kgdnMuIHRocm91Z2hwdXQgaW4gc3Rvcm0uCisgKiBTVE9STS0xMTEwOiBGaXggQ29tcG9uZW50IFBhZ2UgZm9yIHN5c3RlbSBjb21wb25lbnRzCisgKiBTVE9STS0xMDkzOiBMYXVuY2hpbmcgV29ya2VycyB3aXRoIHJlc291cmNlcyBzcGVjaWZpZWQgaW4gcmVzb3VyY2UtYXdhcmUgc2NoZWR1bGVycworICogU1RPUk0tMTEwMjogQWRkIGEgZGVmYXVsdCBmbHVzaCBpbnRlcnZhbCBmb3IgSGl2ZUJvbHQKKyAqIFNUT1JNLTExMTI6IEFkZCBleGVjdXRvciBpZCB0byB0aGUgdGhyZWFkIG5hbWUgb2YgdGhlIGV4ZWN1dG9yIHRocmVhZCBmb3IgZGVidWcKKyAqIFNUT1JNLTEwNzk6IEJhdGNoIFB1dHMgdG8gSEJhc2UKKyAqIFNUT1JNLTEwODQ6IEltcHJvdmUgU3Rvcm0gY29uZmlnIHZhbGlkYXRpb24gcHJvY2VzcyB0byB1c2UgamF2YSBhbm5vdGF0aW9ucyBpbnN0ZWFkIG9mICpfU0NIRU1BIGZvcm1hdAorICogU1RPUk0tMTEwNjogTmV0dHkgc2hvdWxkIG5vdCBsaW1pdCBhdHRlbXB0cyB0byByZWNvbm5lY3QKKyAqIFNUT1JNLTExMDM6IENoYW5nZXMgbG9nIG1lc3NhZ2UgdG8gREVCVUcgZnJvbSBJTkZPCisgKiBTVE9STS0xMTA0OiBOaW1idXMgSEEgZmFpbHMgdG8gZmluZCBuZXdseSBkb3dubG9hZGVkIGNvZGUgZmlsZXMKKyAqIFNUT1JNLTEwODc6IEF2b2lkIGlzc3VlcyB3aXRoIHRyYW5zZmVyLXF1ZXVlIGJhY2twcmVzc3VyZS4KKyAqIFNUT1JNLTg5MzogUmVzb3VyY2UgQXdhcmUgU2NoZWR1bGluZyAoRXhwZXJpbWVudGFsKQorICogU1RPUk0tMTA5NTogVHVwbGUuZ2V0U291cmNlR2xvYmFsU3RyZWFtaWQoKSBoYXMgd3JvbmcgY2FtZWwtY2FzZSBuYW1pbmcKKyAqIFNUT1JNLTEwOTE6IEFkZCB1bml0IHRlc3QgZm9yIHRpY2sgdHVwbGVzIHRvIEhpdmVCb2x0IGFuZCBIZGZzQm9sdAorICogU1RPUk0tMTA5MDogTmltYnVzIEhBIHNob3VsZCBzdXBwb3J0IGBzdG9ybS5sb2NhbC5ob3N0bmFtZWAKKyAqIFNUT1JNLTgyMDogQWdncmVnYXRlIHRvcG8gc3RhdHMgb24gbmltYnVzLCBub3QgdWkKKyAqIFNUT1JNLTQxMjogQWxsb3cgdXNlcnMgdG8gbW9kaWZ5IGxvZ2dpbmcgbGV2ZWxzIG9mIHJ1bm5pbmcgdG9wb2xvZ2llcworICogU1RPUk0tMTA3ODogVXBkYXRlZCBSYXRlVHJhY2tlciB0byBiZSB0aHJlYWQgc2FmZQorICogU1RPUk0tMTA4MjogZml4IG5pdHMgZm9yIHByb3BlcnRpZXMgaW4ga2Fma2EgdGVzdHMKKyAqIFNUT1JNLTk5MzogaW5jbHVkZSB1cHRpbWVTZWNvbmRzIGFzIEpTT04gaW50ZWdlciBmaWVsZAorICogU1RPUk0tMTA1MzogVXBkYXRlIHN0b3JtLWthZmthIFJFQURNRSBmb3IgbmV3IHByb2R1Y2VyIEFQSSBjb25mcy4KKyAqIFNUT1JNLTEwNTg6IGNyZWF0ZSBDTEkga2lsbF93b3JrZXJzIHRvIGtpbGwgd29ya2VycyBvbiBhIHN1cGVydmlzb3Igbm9kZQorICogU1RPUk0tMTA2Mzogc3VwcG9ydCByZWxhdGl2ZSBsb2c0aiBjb25mIGRpciBmb3IgYm90aCBkYWVtb25zIGFuZCB3b3JrZXJzCisgKiBTVE9STS0xMDU5OiBVcGdyYWRlIFN0b3JtIHRvIHVzZSBDbG9qdXJlIDEuNy4wCisgKiBTVE9STS0xMDY5OiBhZGQgY2hlY2sgY2FzZSBmb3IgZXh0ZXJuYWwgY2hhbmdlIG9mICdub3cnIHZhbHVlLgorICogU1RPUk0tOTY5OiBIREZTIEJvbHQgY2FuIGVuZCB1cCBpbiBhbiB1bnJlY292ZXJhYmxlIHN0YXRlLgorICogU1RPUk0tMTA2ODogQ29uZmlndXJlIHJlcXVlc3QucmVxdWlyZWQuYWNrcyB0byBiZSAxIGluIEthZmthVXRpbHNUZXN0IGZvciBzeW5jCisgKiBTVE9STS0xMDE3OiBJZiBpZ25vcmVaa09mZnNldHMgc2V0IHRydWUsS2Fma2FTcG91dCB3aWxsIHJlc2V0IHprIG9mZnNldCB3aGVuIHJlY292ZXIgZnJvbSBmYWlsdXJlLgogICogU1RPUk0tMTA1NDogRXhjZXNzaXZlIGxvZ2dpbmcgU2hlbGxCYXNlZEdyb3Vwc01hcHBpbmcgaWYgdGhlIHVzZXIgZG9lc24ndCBoYXZlIGFueSBncm91cHMuCiAgKiBTVE9STS05NTQ6IFRvcGxvZ3kgRXZlbnQgSW5zcGVjdG9yCiAgKiBTVE9STS04NjI6IFBsdWdnYWJsZSBTeXN0ZW0gTWV0cmljcwpAQCAtNTksMTAgKzE1NCwyMSBAQAogICogU1RPUk0tOTc1OiBTdG9ybS1LYWZrYSB0cmlkZW50IHRvcG9sb2d5IGV4YW1wbGUKICAqIFNUT1JNLTk1ODogQWRkIGNvbmZpZyBmb3IgaW5pdCBwYXJhbXMgb2YgZ3JvdXAgbWFwcGluZyBzZXJ2aWNlCiAgKiBTVE9STS05NDk6IE9uIHRoZSB0b3BvbG9neSBzdW1tYXJ5IFVJIHBhZ2UsIGxhc3Qgc2hvd24gZXJyb3Igc2hvdWxkIGhhdmUgdGhlIHRpbWUgYW5kIGRhdGUKKyAqIFNUT1JNLTExNDI6IFNvbWUgY29uZmlnIHZhbGlkYXRvcnMgZm9yIHBvc2l0aXZlIGludHMgbmVlZCB0byBhbGxvdyAwCisgKiBTVE9STS05MDE6IFdvcmtlciBBcnRpZmFjdHMgRGlyZWN0b3J5CisgKiBTVE9STS0xMTQ0OiBEaXNwbGF5IHJlcXVlc3RlZCBhbmQgYXNzaWduZWQgY3B1L21lbSByZXNvdXJjZXMgZm9yIHNjaGVkdWxlcnMgaW4gVUkKKyAqIFNUT1JNLTEyMTc6IG1ha2luZyBzbWFsbCBmaXhlcyBpbiBSQVMKIAogIyMgMC4xMC4wLWJldGEyCisgKiBTVE9STS0xMTA4OiBGaXggTlBFIGluIHNpbXVsYXRlZCB0aW1lCisgKiBTVE9STS0xMDk5OiBGaXggd29ya2VyIGNoaWxkb3B0cyBhcyBhcnJheWxpc3Qgb2Ygc3RyaW5ncworICogU1RPUk0tMTA5NDogYWR2YW5jZSBrYWZrYSBvZmZzZXQgd2hlbiBkZXNlcmlhbGl6ZXIgeWllbGRzIG5vIG9iamVjdAorICogU1RPUk0tMTA2NjogU3BlY2lmeSBjdXJyZW50IGRpcmVjdG9yeSB3aGVuIHN1cGVydmlzb3IgbGF1bmNoZXMgYSB3b3JrZXIKKyAqIFNUT1JNLTEwMTI6IFNoYWRlZCBldmVyeXRoaW5nIHRoYXQgd2FzIG5vdCBhbHJlYWR5IHNoYWRlZAorICogU1RPUk0tOTY3OiBTaGFkZWQgZXZlcnl0aGluZyB0aGF0IHdhcyBub3QgYWxyZWFkeSBzaGFkZWQKKyAqIFNUT1JNLTkyMjogU2hhZGVkIGV2ZXJ5dGhpbmcgdGhhdCB3YXMgbm90IGFscmVhZHkgc2hhZGVkCisgKiBTVE9STS0xMDQyOiBTaGFkZWQgZXZlcnl0aGluZyB0aGF0IHdhcyBub3QgYWxyZWFkeSBzaGFkZWQKICAqIFNUT1JNLTEwMjY6IEFkZGluZyBleHRlcm5hbCBjbGFzc3BhdGggZWxlbWVudHMgZG9lcyBub3Qgd29yawotICogU1RPUk0tMTA1NjogYWxsb3cgc3VwZXJ2aXNvciBsb2cgZmlsZW5hbWUgdG8gYmUgY29uZmlndXJhYmxlIHZpYSBFTlYgdmFyaWFibGUKICAqIFNUT1JNLTEwNTU6IHN0b3JtLWpkYmMgUkVBRE1FIG5lZWRzIGZpeGVzIGFuZCBjb250ZXh0CiAgKiBTVE9STS0xMDQ0OiBTZXR0aW5nIGRvcCB0byB6ZXJvIGRvZXMgbm90IHJhaXNlIGFuIGVycm9yCiAgKiBTVE9STS0xMDUwOiBUb3BvbG9naWVzIHdpdGggc2FtZSBuYW1lIHJ1biBvbiBvbmUgY2x1c3RlcgpAQCAtNzAsNyArMTc2LDYgQEAKICAqIFNUT1JNLTgwMzogQmV0dGVyIENJIGxvZ3MKICAqIFNUT1JNLTEwMjc6IFVzZSBvdmVyZmxvdyBidWZmZXIgZm9yIGVtaXR0aW5nIG1ldHJpY3MKICAqIFNUT1JNLTEwMjQ6IGxvZzRqIGNoYW5nZXMgbGVhdmluZyAke3N5czpzdG9ybS5sb2cuZGlyfSB1bmRlciBTVE9STV9IT01FIGRpcgotICogU1RPUk0tOTk2OiBuZXR0eS11bml0LXRlc3RzL3Rlc3QtYmF0Y2ggZGVtb25zdHJhdGVzIG91dC1vZi1vcmRlciBkZWxpdmVyeQogICogU1RPUk0tOTQ0OiBzdG9ybS1oaXZlIHBvbS54bWwgaGFzIGEgZGVwZW5kZW5jeSBjb25mbGljdCB3aXRoIGNhbGNpdGUKICAqIFNUT1JNLTk5NDogQ29ubmVjdGlvbiBsZWFrIGJldHdlZW4gbmltYnVzIGFuZCBzdXBlcnZpc29ycwogICogU1RPUk0tMTAwMTogVW5kZWZpbmVkIFNUT1JNX0VYVF9DTEFTU1BBVEggYWRkcyAnOjonIHRvIGNsYXNzcGF0aCBvZiB3b3JrZXJzCkBAIC04OCw2ICsxOTMsOSBAQAogICogU1RPUk0tNzQyOiBMZXQgU2hlbGxCb2x0IHRyZWF0IGFsbCBtZXNzYWdlcyB0byB1cGRhdGUgaGVhcnRiZWF0CiAgKiBTVE9STS05OTI6IEEgYnVnIGluIHRoZSB0aW1lci5jbGogbWlnaHQgY2F1c2UgdW5leHBlY3RlZCBkZWxheSB0byBzY2hlZHVsZSBuZXcgZXZlbnQKIAorIyMgMC4xMC4wCisgKiBTVE9STS0xMDk2OiBGaXggc29tZSBpc3N1ZXMgd2l0aCBpbXBlcnNvbmF0aW9uIG9uIHRoZSBVSQorCiAjIyAwLjEwLjAtYmV0YTEKICAqIFNUT1JNLTg3MzogRmx1eCBkb2VzIG5vdCBoYW5kbGUgZGlhbW9uZCB0b3BvbG9naWVzCiAKQEAgLTI1NCw2ICszNjIsOCBAQAogICogU1RPUk0tMTMwOiBTdXBlcnZpc29yIGdldHRpbmcga2lsbGVkIGR1ZSB0byBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjogRmlsZSAnLi4vc3Rvcm1jb25mLnNlcicgZG9lcyBub3QgZXhpc3QuCiAKICMjIDAuOS42CisgKiBTVE9STS05OTY6IG5ldHR5LXVuaXQtdGVzdHMvdGVzdC1iYXRjaCBkZW1vbnN0cmF0ZXMgb3V0LW9mLW9yZGVyIGRlbGl2ZXJ5CisgKiBTVE9STS0xMDU2OiBhbGxvdyBzdXBlcnZpc29yIGxvZyBmaWxlbmFtZSB0byBiZSBjb25maWd1cmFibGUgdmlhIEVOViB2YXJpYWJsZQogICogU1RPUk0tMTA1MTogTmV0dHkgQ2xpZW50LmphdmEncyBmbHVzaE1lc3NhZ2VzIHByb2R1Y2VzIGEgTnVsbFBvaW50ZXJFeGNlcHRpb24KICAqIFNUT1JNLTc2MzogbmltYnVzIHJlYXNzaWduZWQgd29ya2VyIEEgdG8gYW5vdGhlciBtYWNoaW5lLCBidXQgb3RoZXIgd29ya2VyJ3MgbmV0dHkgY2xpZW50IGNhbid0IGNvbm5lY3QgdG8gdGhlIG5ldyB3b3JrZXIgQQogICogU1RPUk0tOTM1OiBVcGRhdGUgRGlzcnVwdG9yIHF1ZXVlIHZlcnNpb24gdG8gMi4xMC40CkBAIC04MTUsMyArOTI1LDQgQEAKICMjIDAuNS4wCiAgCiAgKiBJbml0aWFsIHJlbGVhc2UhCisKZGlmZiAtLWdpdCBhL0RFVkVMT1BFUi5tZCBiL0RFVkVMT1BFUi5tZAppbmRleCAwMmZlMTM1Li4xOGIyZWY2IDEwMDY0NAotLS0gYS9ERVZFTE9QRVIubWQKKysrIGIvREVWRUxPUEVSLm1kCkBAIC0xOTIsNiArMTkyLDcgQEAKIDMuIE1lcmdlIHRoZSBwdWxsIHJlcXVlc3QgaW50byB5b3VyIGxvY2FsIHRlc3QgYnJhbmNoLgogCiAgICAgICAgICQgZ2l0IHB1bGwgPHJlbW90ZV9yZXBvX3VybD4gPHJlbW90ZV9icmFuY2g+CisgICAgWW91IGNhbiB1c2UgYC4vZGV2LXRvb2xzL3N0b3JtLW1lcmdlLnB5IDxwdWxsLW51bWJlcj5gIHRvIHByb2R1Y2UgdGhlIGFib3ZlIGNvbW1hbmQgbW9zdCBvZiB0aGUgdGltZS4KIAogNC4gIEFzc3VtaW5nIHRoYXQgdGhlIHB1bGwgcmVxdWVzdCBtZXJnZXMgd2l0aG91dCBhbnkgY29uZmxpY3RzOgogICAgIFVwZGF0ZSB0aGUgdG9wLWxldmVsIGBDSEFOR0VMT0cubWRgLCBhbmQgYWRkIGluIHRoZSBKSVJBIHRpY2tldCBudW1iZXIgKGV4YW1wbGU6IGBTVE9STS0xMjM0YCkgYW5kIHRpY2tldApAQCAtMjIzLDYgKzIyNCw5IEBACiAjIEJ1aWxkIHRoZSBjb2RlIGFuZCBydW4gdGhlIHRlc3RzCiAKICMjIFByZXJlcXVpc2l0ZXMKK0ZpcnQgb2YgYWxsIHlvdSBuZWVkIHRvIG1ha2Ugc3VyZSB5b3UgYXJlIHVzaW5nIG1hdmVuIDMuMi41IG9yIGJlbG93LiAgVGhlcmUgaXMgYSBidWcgaW4gbGF0ZXIgdmVyc2lvbnMgb2YgbWF2ZW4gYXMgbGlua2VkIHRvIGZyb20gaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9NU0hBREUtMjA2IHRoYXQKK2NhdXNlIHNoYWRlZCBkZXBlbmRlbmNpZXMgdG8gbm90IGJlIHBhY2thZ2VkIGNvcnJlY3RseS4gIEFsc28gcGxlYXNlIGJlIGF3YXJlIHRoYXQgYmVjYXVzZSB3ZSBhcmUgc2hhZGluZyBkZXBlbmRlbmNpZXMgbXZuIGRlcGVuZGVuY3k6dHJlZSB3aWxsIG5vdCBhbHdheXMgc2hvdyB0aGUgZGVwZW5kZW5jaWVzIGNvcnJlY3RseS4gCisKIEluIG9yZGVyIHRvIGJ1aWxkIGBzdG9ybWAgeW91IG5lZWQgYHB5dGhvbmAsIGBydWJ5YCBhbmQgYG5vZGVqc2AuIEluIG9yZGVyIHRvIGF2b2lkIGFuIG92ZXJmdWwgcGFnZSB3ZSBkb24ndCBwcm92aWRlIHBsYXRmb3JtL09TIHNwZWNpZmljIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMgZm9yIHRob3NlIGhlcmUuIFBsZWFzZSByZWZlciB0byB5b3UgcGxhdGZvcm0ncy9PUycgZG9jdW1lbnRhdGlvbiBmb3Igc3VwcG9ydC4KIAogVGhlIGBydWJ5YCBwYWNrYWdlIG1hbmFnZXIgYHJ2bWAgYW5kIGBub2RlanNgIHBhY2thZ2UgbWFuYWdlciBgbnZtYCBhcmUgZm9yIGNvbnZlbmllbmNlIGFuZCBhcmUgdXNlZCBpbiB0aGUgdGVzdHMgd2hpY2ggcnVuIG9uIFt0cmF2aXNdKGh0dHBzOi8vdHJhdmlzLWNpLm9yZy9hcGFjaGUvc3Rvcm0pLiBUaGV5IGNhbiBiZSBpbnN0YWxsZWQgdXNpbmcgYGN1cmwgLUwgaHR0cHM6Ly9nZXQucnZtLmlvIHwgYmFzaCAtcyBzdGFibGUgLS1hdXRvbGlicz1lbmFibGVkICYmIHNvdXJjZSB+Ly5wcm9maWxlYCAoc2VlIHRoZSBbcnZtIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnNdKGh0dHBzOi8vZ2l0aHViLmNvbS9ydm0vcnZtKSBmb3IgZGV0YWlscykgYW5kIGB3Z2V0IC1xTy0gaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2NyZWF0aW9uaXgvbnZtL3YwLjI2LjEvaW5zdGFsbC5zaCB8IGJhc2ggJiYgc291cmNlIH4vLmJhc2hyY2AgKHNlZSB0aGUgW252bSBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zXShodHRwczovL2dpdGh1Yi5jb20vY3JlYXRpb25peC9udm0pIGZvciBkZXRhaWxzKS4KQEAgLTI0MSwxNyArMjQ1LDkgQEAKIAogVGhlIGZvbGxvd2luZyBjb21tYW5kcyBtdXN0IGJlIHJ1biBmcm9tIHRoZSB0b3AtbGV2ZWwgZGlyZWN0b3J5LgogCi0gICAgIyBCdWlsZCB0aGUgY29kZSBhbmQgcnVuIHRoZSB0ZXN0cyAocmVxdWlyZXMgbm9kZWpzLCBweXRob24gYW5kIHJ1YnkgaW5zdGFsbGVkKSAKLSAgICAjIGBtdm4gY2xlYW4gcGFja2FnZWAgd2lsbCBmYWlsIGJlY2F1c2Ugc3Rvcm0tY29yZSByZXF1aXJlcyBzdG9ybS1tYXZlbi1wbHVnaW4uCi0gICAgIyBUaGlzIHBsdWdpbiBzaG91bGQgYmUgaW5zdGFsbGVkIGJlZm9yZSBjb21waWxpbmcgc3Rvcm0tY29yZS4KLSAgICAkIG12biBjbGVhbiBpbnN0YWxsCitgbXZuIGNsZWFuIGluc3RhbGxgCiAKLSAgICAjIEJ1aWxkIHRoZSBjb2RlIGFuZCBydW4gdGhlIHRlc3RzLCB3aXRoIHNwZWNpZnlpbmcgZGVmYXVsdCB0ZXN0IHRpbWVvdXQgKGluIG1pbGxpc2Vjb25kKQotICAgICQgZXhwb3J0IFNUT1JNX1RFU1RfVElNRU9VVF9NUz0xMDAwMAotICAgICQgbXZuIGNsZWFuIGluc3RhbGwKLQotICAgICMgQnVpbGQgdGhlIGNvZGUgYnV0IHNraXAgdGhlIHRlc3RzCi0gICAgJCBtdm4gY2xlYW4gaW5zdGFsbCAtRHNraXBUZXN0cz10cnVlCitJZiB5b3Ugd2lzaCB0byBza2lwIHRoZSB1bml0IHRlc3RzIHlvdSBjYW4gZG8gdGhpcyBieSBhZGRpbmcgYC1Ec2tpcFRlc3RzYCB0byB0aGUgY29tbWFuZCBsaW5lLiAKIAogSW4gY2FzZSB5b3UgbW9kaWZpZWQgYHN0b3JtLnRocmlmdGAsIHlvdSBoYXZlIHRvIHJlZ2VuZXJhdGUgdGhyaWZ0IGNvZGUgYXMgamF2YSBhbmQgcHl0aG9uIGNvZGUgYmVmb3JlIGNvbXBpbGluZyB3aG9sZSBwcm9qZWN0LgogCkBAIC0yNjYsMTkgKzI2Miw3IEBACiBbYXV0aF90ZXN0LmNsal0oc3Rvcm0tY29yZS90ZXN0L2Nsai9iYWNrdHlwZS9zdG9ybS9zZWN1cml0eS9hdXRoL2F1dGhfdGVzdC5jbGopLCB3aGljaCBoYXMgdGhlIG5hbWVzcGFjZQogYGJhY2t0eXBlLnN0b3JtLnNlY3VyaXR5LmF1dGguYXV0aC10ZXN0YC4KIAotRmlyc3QsIHN0YXJ0IHRoZSBSRVBMIGZyb20gd2l0aGluIHRoZSByZWxldmFudCBzdWItcHJvamVjdCAoaGVyZTogYHN0b3JtLWNvcmVgKToKLQotICAgICQgY2Qgc3Rvcm0tY29yZS8KLSAgICAkIG12biBjbG9qdXJlOnJlcGwKLQotTm93IHdlIHJ1biB0aGUgdGVzdHMgaW4gYGF1dGhfdGVzdC5jbGpgIGluIHRoZSBSRVBMOgotCi1gYGBjbG9qdXJlCi07OyBZb3UgY2FuIHVzZSBib3RoIGFic29sdXRlIGFzIHdlbGwgYXMgcmVsYXRpdmUgcGF0aHMgdG8gdGhlIC5jbGogZmlsZS4KLShsb2FkLWZpbGUgInRlc3QvY2xqL2JhY2t0eXBlL3N0b3JtL3NlY3VyaXR5L2F1dGgvYXV0aF90ZXN0LmNsaiIpCi0obnMgYmFja3R5cGUuc3Rvcm0uc2VjdXJpdHkuYXV0aC5hdXRoLXRlc3QpCi0ocnVuLXRlc3RzKQotYGBgCitZb3UgY2FuIGFsc28gcnVuIHRlc3RzIHNlbGVjdGl2ZWx5IHdpdGggYC1EdGVzdD08dGVzdF9uYW1lPmAuICBUaGlzIHdvcmtzIGZvciBib3RoIGNsb2p1cmUgYW5kIGp1bml0IHRlc3RzLgogCiA+IFRpcDogSURFcyBzdWNoIGFzIEludGVsbGlKIElERUEgc3VwcG9ydCBhIGJ1aWx0LWluIENsb2p1cmUgUkVQTCwgd2hpY2ggeW91IGNhbiBhbHNvIHVzZSB0byBydW4gdGVzdHMgc2VsZWN0aXZlbHkuCiA+IFNvbWV0aW1lcyB5b3UgbWF5IGZpbmQgdGhhdCB0ZXN0cyBwYXNzL2ZhaWwgZGVwZW5kaW5nIG9uIHdoaWNoIFJFUEwgeW91IHVzZSwgd2hpY2ggLS0gYWx0aG91Z2ggZnJ1c3RyYXRpbmcgLS0KQEAgLTI4Niw3ICsyNzAsNiBAQAogCiBVbmZvcnR1bmF0ZWx5IHlvdSBtaWdodCBleHBlcmllbmNlIGZhaWx1cmVzIGluIGNsb2p1cmUgdGVzdHMgd2hpY2ggYXJlIHdyYXBwZWQgaW4gdGhlIGBtYXZlbi1jbG9qdXJlLXBsdWdpbmAgYW5kIHRodXMgZG9lc24ndCBwcm92aWRlIHRvbyBtdWNoIHVzZWZ1bCBvdXRwdXQgYXQgZmlyc3Qgc2lnaHQgLSB5b3UgbWlnaHQgZW5kIHVwIHdpdGggYSBtYXZlbiB0ZXN0IGZhaWx1cmUgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGFzIHVuaGVscGZ1bCBhcyBgQ2xvanVyZSBmYWlsZWQuYC4gSW4gdGhpcyBjYXNlIGl0J3MgcmVjb21tZW5kZWQgdG8gbG9vayBpbnRvIGB0YXJnZXQvdGVzdC1yZXBvcnRzYCBvZiB0aGUgZmFpbGVkIHByb2plY3QgdG8gc2VlIHdoYXQgYWN0dWFsIHRlc3RzIGhhdmUgZmFpbGVkIG9yIHNjcm9sbCB0aHJvdWdoIHRoZSBtYXZlbiBvdXRwdXQgbG9va2luZyBmb3Igb2J2aW91cyBpc3N1ZXMgbGlrZSBtaXNzaW5nIGJpbmFyaWVzLgogCi0KIDxhIG5hbWU9InBhY2thZ2luZyI+PC9hPgogCiAjIyBDcmVhdGUgYSBTdG9ybSBkaXN0cmlidXRpb24gKHBhY2thZ2luZykKQEAgLTI5NSw3ICsyNzgsNyBAQAogZG8gbm90IHVzZSB0aGUgTWF2ZW4gcmVsZWFzZSBwbHVnaW4gYmVjYXVzZSBjcmVhdGluZyBhbiBvZmZpY2lhbCByZWxlYXNlIGlzIHRoZSB0YXNrIG9mIG91ciByZWxlYXNlIG1hbmFnZXIuCiAKICAgICAjIEZpcnN0LCBidWlsZCB0aGUgY29kZS4KLSAgICAkIG12biBjbGVhbiBpbnN0YWxsICAjIHlvdSBtYXkgc2tpcCB0ZXN0cyB3aXRoIGAtRHNraXBUZXN0cz10cnVlYCB0byBzYXZlIHRpbWUKKyAgICAkIG12biBjbGVhbiBpbnN0YWxsICMgeW91IG1heSBza2lwIHRlc3RzIHdpdGggYC1Ec2tpcFRlc3RzPXRydWVgIHRvIHNhdmUgdGltZQogCiAgICAgIyBDcmVhdGUgdGhlIGJpbmFyeSBkaXN0cmlidXRpb24uCiAgICAgJCBjZCBzdG9ybS1kaXN0L2JpbmFyeSAmJiBtdm4gcGFja2FnZQpAQCAtMzgzLDYgKzM2Niw4IEBACiAKIElmIHlvdSBkbyBub3QgaGF2ZSBhIEpJUkEgYWNjb3VudCB5ZXQsIHRoZW4geW91IGNhbiBjcmVhdGUgb25lIHZpYSB0aGUgbGluayBhYm92ZSAocmVnaXN0cmF0aW9uIGlzIGZyZWUpLgogCis8YSBuYW1lPSJjb2RlLXNlYXJjaCI+PC9hPgorVGhlIHN0b3JtIGNvZGViYXNlIGlzIGF2YWlsYWJsZSBhdCBbQ29kb3RhXShodHRwczovL3d3dy5jb2RvdGEuY29tL3hyZWYvIy9naXRodWJfYXBhY2hlX3N0b3JtXzU2MGRhOWFkYThjYjg3MDMwMDhiYmZkYy9maW5kVXNhZ2VzKSB3aGVyZSB5b3UgY2FuIHNlbWFudGljYWxseSBzZWFyY2ggaXQgbGlrZSBpbiBhbiBJREUgKGUuZy4gZmluZCB1c2FnZXMgZm9yIGEgbWV0aG9kKS4gCiAKIDxhIG5hbWU9InF1ZXN0aW9ucyI+PC9hPgogCmRpZmYgLS1naXQgYS9ESVNDTEFJTUVSIGIvRElTQ0xBSU1FUgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYzODkwNC4uMDAwMDAwMAotLS0gYS9ESVNDTEFJTUVSCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotQXBhY2hlIFN0b3JtIGlzIGFuIGVmZm9ydCB1bmRlcmdvaW5nIGluY3ViYXRpb24gYXQgdGhlIEFwYWNoZSBTb2Z0d2FyZQotRm91bmRhdGlvbiAoQVNGKSwgc3BvbnNvcmVkIGJ5IHRoZSBBcGFjaGUgSW5jdWJhdG9yIFBNQy4KLQotSW5jdWJhdGlvbiBpcyByZXF1aXJlZCBvZiBhbGwgbmV3bHkgYWNjZXB0ZWQgcHJvamVjdHMgdW50aWwgYSBmdXJ0aGVyIHJldmlldwotaW5kaWNhdGVzIHRoYXQgdGhlIGluZnJhc3RydWN0dXJlLCBjb21tdW5pY2F0aW9ucywgYW5kIGRlY2lzaW9uIG1ha2luZyBwcm9jZXNzCi1oYXZlIHN0YWJpbGl6ZWQgaW4gYSBtYW5uZXIgY29uc2lzdGVudCB3aXRoIG90aGVyIHN1Y2Nlc3NmdWwgQVNGIHByb2plY3RzLgotCi1XaGlsZSBpbmN1YmF0aW9uIHN0YXR1cyBpcyBub3QgbmVjZXNzYXJpbHkgYSByZWZsZWN0aW9uIG9mIHRoZSBjb21wbGV0ZW5lc3MKLW9yIHN0YWJpbGl0eSBvZiB0aGUgY29kZSwgaXQgZG9lcyBpbmRpY2F0ZSB0aGF0IHRoZSBwcm9qZWN0IGhhcyB5ZXQgdG8gYmUKLWZ1bGx5IGVuZG9yc2VkIGJ5IHRoZSBBU0YuCmRpZmYgLS1naXQgYS9MSUNFTlNFIGIvTElDRU5TRQppbmRleCA4NzU1ZDFiLi5hNzZhZjY0IDEwMDY0NAotLS0gYS9MSUNFTlNFCisrKyBiL0xJQ0VOU0UKQEAgLTI1OCw2ICsyNTgsMTggQEAKIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAorRm9yIHR5cGVhaGVhZCBqcXVlcnkgMC4xMC41IChzdG9ybS1jb3JlL3NyYy91aS9wdWJsaWMvanMvdHlwZWFoZWFkLmpxdWVyeS5taW4uanMpCisKK0NvcHlyaWdodCAoYykgMjAxMy0yMDE0IFR3aXR0ZXIsIEluYworCisgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEFsbGFuIEphcmRpbmUgbm9yIFNwcnlNZWRpYSBVSyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwogQ29weXJpZ2h0IChjKSAyMDA4LTIwMTAsIEFsbGFuIEphcmRpbmUKIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAKQEAgLTU0MiwzICs1NTQsMzIgQEAKIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCiBTT0ZUV0FSRS4KIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRm9yIHN0YXRpc3RpYyBpbWFnZQorCitzdG9ybS1jb3JlL3NyYy91aS9wdWJsaWMvaW1hZ2VzL3N0YXRpc3RpYy5wbmcKKworQ29weXJpZ2h0IChjKSAyMDE1IEdpdGh1YiwgSW5jLgorCisKK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKK29mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCitpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCit0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCitjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKK2Z1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK0FVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKK0xJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCitPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCitUSEUgU09GVFdBUkUuCisKZGlmZiAtLWdpdCBhL1JFQURNRS5tYXJrZG93biBiL1JFQURNRS5tYXJrZG93bgppbmRleCA5MGE3OWM1Li4xOWFkNTIwIDEwMDY0NAotLS0gYS9SRUFETUUubWFya2Rvd24KKysrIGIvUkVBRE1FLm1hcmtkb3duCkBAIC0yMzIsNiArMjMyLDE3IEBACiAqIE1hdHRoaWFzIEouIFNheCAoW0BtanNheF0oaHR0cHM6Ly9naXRodWIuY29tL21qc2F4KSkKICogRXJpayBXZWF0aGVycyAoW0BlcmlrZHddKGh0dHBzOi8vZ2l0aHViLmNvbS9lcmlrZHcpKQogKiBCcnlhbiBTaGVsbCAoW0BzaGVsbGJqXShodHRwczovL2dpdGh1Yi5jb20vc2hlbGxiaikpCisqIERteXRybyBEcmFnYW4gKFtAM0RyYWdhbl0oaHR0cHM6Ly9naXRodWIuY29tLzNEcmFnYW4pKQorKiBOaW5neXUgQW4gKFtAamV0YW45XShodHRwczovL2dpdGh1Yi5jb20vamV0YW45KSkKKyogUGV0ZSBQcm9rb3Bvd2ljeiAoW0Bwcm9rb3Bvd2ljel0oaHR0cHM6Ly9naXRodWIuY29tL3Byb2tvcG93aWN6KSkKKyogUHJpeWFuayBTaGFoIChbQHByaXlhbms1NDg1XShodHRwczovL2dpdGh1Yi5jb20vcHJpeWFuazU0ODUpKQorKiBKb3NodWEgTWFydGVsbCAoW0BqbWFydGVsbDddKGh0dHBzOi8vZ2l0aHViLmNvbS9qbWFydGVsbDcpKQorKiBNYXR0aGV3IFRpZW1hbiAoW0BtanRpZW1hbl0oaHR0cHM6Ly9naXRodWIuY29tL21qdGllbWFuKSkKKyogQ2h1Y2sgQnVyZ2VzcyAoW0Bhc2huYXpnXShodHRwczovL2dpdGh1Yi5jb20vYXNobmF6ZykpCisqIFRvbSBHcmF2ZXMgKFtAdGdyYXZlc2NzXShodHRwczovL2dpdGh1Yi5jb20vdGdyYXZlc2NzKSkKKyogRHJvciBXZWlzcyAoW0Bkcm9yd2Vpc3NdKGh0dHBzOi8vZ2l0aHViLmNvbS9kcm9yd2Vpc3MpKQorKiBWaWN0b3IgV29uZyAoW0B2aWN0b3Itd29uZ10oaHR0cHM6Ly9naXRodWIuY29tL3ZpY3Rvci13b25nKSkKKyogRGF2aWQgV2ltc2V5IChbQGR3aW1zZXldKGh0dHBzOi8vZ2l0aHViLmNvbS9kd2ltc2V5KSkKIAogIyMgQWNrbm93bGVkZ2VtZW50cwogCmRpZmYgLS1naXQgYS9iaW4vZmxpZ2h0LmJhc2ggYi9iaW4vZmxpZ2h0LmJhc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTU3YzlhYwotLS0gL2Rldi9udWxsCisrKyBiL2Jpbi9mbGlnaHQuYmFzaApAQCAtMCwwICsxLDE1NCBAQAorIyEvYmluL2Jhc2gKKyMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisjICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworSkRLUEFUSD0iL2hvbWUveS9zaGFyZS95amF2YV9qZGsvamF2YSIKK0JJTlBBVEg9Ii91c3IvYmluIgorVVNFUj1gd2hvYW1pYAorCisjU0VUVElOR1M9L0xpYnJhcnkvSmF2YS9KYXZhVmlydHVhbE1hY2hpbmVzL2pkazEuOC4wXzUxLmpkay9Db250ZW50cy9Ib21lL2pyZS9saWIvamZyL3Byb2ZpbGUuamZjCitTRVRUSU5HUz1wcm9maWxlCisKK3BsYXRmb3JtPSd1bmtub3duJwordW5hbWVzdHI9YHVuYW1lYAoraWYgW1sgIiR1bmFtZXN0ciIgPT0gJ0xpbnV4JyBdXTsgdGhlbgorICAgIHBsYXRmb3JtPSdsaW51eCcKK2VsaWYgW1sgIiR1bmFtZXN0ciIgPT0gJ0RhcndpbicgXV07IHRoZW4KKyAgICBwbGF0Zm9ybT0nZGFyd2luJworZWxpZiBbWyAiJHVuYW1lc3RyIiA9PSAnRnJlZUJTRCcgXV07IHRoZW4KKyAgICBwbGF0Zm9ybT0nZnJlZWJzZCcKK2ZpCisKK2lmIFtbICRwbGF0Zm9ybSA9PSAnbGludXgnIF1dOyB0aGVuCisgICAgQklOUEFUSD0iJEpES1BBVEgvYmluIgorZWxpZiBbWyAkcGxhdGZvcm0gPT0gJ2RhcndpbicgXV07IHRoZW4KKyAgICBCSU5QQVRIPSIvdXNyL2JpbiIKK2ZpCisKK2Z1bmN0aW9uIHN0YXJ0X3JlY29yZCB7CisgICAgIyBzdGFydF9yZWNvcmQgcGlkCisgICAgYWxyZWFkeV9yZWNvcmRpbmc9ZmFsc2UKKyAgICBmb3IgcmlkIGluIGBnZXRfcmVjb3JkaW5nX2lkcyAkMWA7IGRvCisgICAgICAgIGFscmVhZHlfcmVjb3JkaW5nPXRydWUKKyAgICAgICAgYnJlYWs7CisgICAgZG9uZQorICAgIGlmIFsgIiRhbHJlYWR5X3JlY29yZGluZyIgPSBmYWxzZSBdOyB0aGVuCisgICAgICAgICRCSU5QQVRIL2pjbWQgJDEgSkZSLnN0YXJ0IHNldHRpbmdzPSR7U0VUVElOR1N9CisgICAgZmkKK30KKworZnVuY3Rpb24gZHVtcF9yZWNvcmQgeworICAgIGZvciByaWQgaW4gYGdldF9yZWNvcmRpbmdfaWRzICQxYDsgZG8KKyAgICAgICAgRklMRU5BTUU9cmVjb3JkaW5nLSQxLSR7cmlkfS0ke05PV30uamZyCisgICAgICAgICRCSU5QQVRIL2pjbWQgJDEgSkZSLmR1bXAgcmVjb3JkaW5nPSRyaWQgZmlsZW5hbWU9IiQyLyR7RklMRU5BTUV9IgorICAgIGRvbmUKK30KKworZnVuY3Rpb24ganN0YWNrX3JlY29yZCB7CisgICAgRklMRU5BTUU9anN0YWNrLSQxLSR7Tk9XfS50eHQKKyAgICAkQklOUEFUSC9qc3RhY2sgJDEgPiAiJDIvJHtGSUxFTkFNRX0iCit9CisKK2Z1bmN0aW9uIGptYXBfcmVjb3JkIHsKKyAgICBGSUxFTkFNRT1yZWNvcmRpbmctJDEtJHtOT1d9LmJpbgorICAgICRCSU5QQVRIL2ptYXAgLWR1bXA6Zm9ybWF0PWIsZmlsZT0iJDIvJHtGSUxFTkFNRX0iICQxCit9CisKK2Z1bmN0aW9uIHN0b3BfcmVjb3JkIHsKKyAgICBmb3IgcmlkIGluIGBnZXRfcmVjb3JkaW5nX2lkcyAkMWA7IGRvCisgICAgICAgIEZJTEVOQU1FPXJlY29yZGluZy0kMS0ke3JpZH0tJHtOT1d9LmpmcgorICAgICAgICAkQklOUEFUSC9qY21kICQxIEpGUi5kdW1wIHJlY29yZGluZz0kcmlkIGZpbGVuYW1lPSIkMi8ke0ZJTEVOQU1FfSIKKyAgICAgICAgJEJJTlBBVEgvamNtZCAkMSBKRlIuc3RvcCByZWNvcmRpbmc9JHJpZAorICAgIGRvbmUKK30KKworZnVuY3Rpb24gZ2V0X3JlY29yZGluZ19pZHMgeworICAgICRCSU5QQVRIL2pjbWQgJDEgSkZSLmNoZWNrIHwgcGVybCAtbiAtZSAnL3JlY29yZGluZz0oWzAtOV0rKS8gJiYgcHJpbnQgIiQxICInCit9CisKK2Z1bmN0aW9uIHVzYWdlX2FuZF9xdWl0IHsKKyAgICBlY2hvICJVc2FnZTogJDAgcGlkIHN0YXJ0IFtwcm9maWxlX3NldHRpbmdzXSIKKyAgICBlY2hvICIgICAgICAgJDAgcGlkIGR1bXAgdGFyZ2V0X2RpciIKKyAgICBlY2hvICIgICAgICAgJDAgcGlkIHN0b3AgdGFyZ2V0X2RpciIKKyAgICBlY2hvICIgICAgICAgJDAgcGlkIGpzdGFjayB0YXJnZXRfZGlyIgorICAgIGVjaG8gIiAgICAgICAkMCBwaWQgam1hcCB0YXJnZXRfZGlyIgorICAgIGVjaG8gIiAgICAgICAkMCBwaWQga2lsbCIKKyAgICBleGl0IC0xCit9CisKKyMgQmVmb3JlIHVzaW5nIHRoaXMgc2NyaXB0OiBtYWtlIHN1cmUgRmxpZ2h0UmVjb3JkZXIgaXMgZW5hYmxlZAorCitpZiBbICIkIyIgLWxlIDEgXTsgdGhlbgorICAgIGVjaG8gIldyb25nIG51bWJlciBvZiBhcmd1bWVudHMuLiIKKyAgICB1c2FnZV9hbmRfcXVpdAorCitmaQorIyBjYWxsIHRoaXMgc2NyaXB0IHdpdGggdGhlIHByb2Nlc3MgcGlkLCBleGFtcGxlOiAiLi9mbGlnaHQgUElEIHN0YXJ0IiBvciAiLi9mbGlnaHQgUElEIHN0b3AiCitQSUQ9IiQxIgorQ01EPSIkMiIKKworaWYgL2Jpbi9wcyAtcCAkUElEID4gL2Rldi9udWxsCit0aGVuCisgICAgaWYgW1sgJHBsYXRmb3JtID09ICdsaW51eCcgXV07IHRoZW4KKyAgICAgICAgVVNFUj1gL2Jpbi9wcyAtb3VzZXIgLS1ub2hlYWRlciAkUElEYAorICAgIGVsaWYgW1sgJHBsYXRmb3JtID09ICdkYXJ3aW4nIF1dOyB0aGVuCisgICAgICAgIFVTRVI9YC9iaW4vcHMgLW91c2VyICRQSURgCisgICAgZmkKK2Vsc2UKKyAgICBlY2hvICJObyBzdWNoIHBpZCBydW5uaW5nOiAkUElEIgorICAgIHVzYWdlX2FuZF9xdWl0CitmaQorCitpZiBbICIkQ01EIiAhPSAic3RhcnQiIF0gJiYgWyAiJENNRCIgIT0gImtpbGwiIF07IHRoZW4KKyAgICBpZiBbWyAkMyBdXSAmJiBbWyAtZCAkMyBdXQorICAgIHRoZW4KKyAgICAgICAgVEFSR0VURElSPSIkMyIKKyAgICAgICAgbWtkaXIgLXAgJHtUQVJHRVRESVJ9CisgICAgZWxzZQorICAgICAgICBlY2hvICJNaXNzaW5nIHRhcmdldCBkaXJlY3RvcnkiCisgICAgICAgIHVzYWdlX2FuZF9xdWl0CisgICAgZmkKK2ZpCisKK05PVz1gZGF0ZSArJyVZJW0lZC0lSCVNJVMnYAoraWYgWyAiJENNRCIgPSAiIiBdOyB0aGVuCisgICAgdXNhZ2VfYW5kX3F1aXQKK2VsaWYgWyAiJENNRCIgPSAia2lsbCIgXTsgdGhlbgorICAgIGVjaG8gIktpbGxpbmcgcHJvY2VzcyB3aXRoIHBpZDogJFBJRCIKKyAgICBraWxsIC05ICR7UElEfQorZWxpZiBbICIkQ01EIiA9ICJzdGFydCIgXTsgdGhlbgorICAgIGlmIFtbICQzIF1dCisgICAgdGhlbgorICAgICAgICBTRVRUSU5HUz0kMworICAgIGZpCisgICAgc3RhcnRfcmVjb3JkICR7UElEfQorZWxpZiBbICIkQ01EIiA9ICJzdG9wIiBdOyB0aGVuCisgICAgZWNobyAiQ2FwdHVyaW5nIGR1bXAgYmVmb3JlIHN0b3BwaW5nIGluIGRpciAkVEFSR0VURElSIgorICAgIHN0b3BfcmVjb3JkICR7UElEfSAke1RBUkdFVERJUn0KK2VsaWYgWyAiJENNRCIgPSAianN0YWNrIiBdOyB0aGVuCisgICAgZWNobyAiQ2FwdHVyaW5nIGR1bXAgaW4gZGlyICRUQVJHRVRESVIiCisgICAganN0YWNrX3JlY29yZCAke1BJRH0gJHtUQVJHRVRESVJ9CitlbGlmIFsgIiRDTUQiID0gImptYXAiIF07IHRoZW4KKyAgICBlY2hvICJDYXB0dXJpbmcgZHVtcCBpbiBkaXIgJFRBUkdFVERJUiIKKyAgICBqbWFwX3JlY29yZCAke1BJRH0gJHtUQVJHRVRESVJ9CitlbGlmIFsgIiRDTUQiID0gImR1bXAiIF07IHRoZW4KKyAgICBlY2hvICJDYXB0dXJpbmcgZHVtcCBpbiBkaXIgJFRBUkdFVERJUiIKKyAgICBkdW1wX3JlY29yZCAke1BJRH0gJHtUQVJHRVRESVJ9CitlbHNlCisgICAgdXNhZ2VfYW5kX3F1aXQKK2ZpCisKKwpkaWZmIC0tZ2l0IGEvYmluL3N0b3JtIGIvYmluL3N0b3JtCmluZGV4IDgwOWE4M2EuLjA5NjMwNjUgMTAwNzU1Ci0tLSBhL2Jpbi9zdG9ybQorKysgYi9iaW4vc3Rvcm0KQEAgLTEsNCArMSw0IEBACi0jIS9iaW4vYmFzaAorIyEvdXNyL2Jpbi9lbnYgYmFzaAogIwogIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAjIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQpAQCAtNTIsMTggKzUyLDE2IEBACiBleHBvcnQgU1RPUk1fQkFTRV9ESVI9YGNkICR7U1RPUk1fQklOX0RJUn0vLi47cHdkYAogCiAjY2hlY2sgdG8gc2VlIGlmIHRoZSBjb25mIGRpciBpcyBnaXZlbiBhcyBhbiBvcHRpb25hbCBhcmd1bWVudAotaWYgWyAkIyAtZ3QgMSBdCi10aGVuCi0gICAgaWYgWyAiLS1jb25maWciID0gIiQxIiBdCi0gICAgICAgICAgdGhlbgotICAgICAgICAgICAgICBjb25mX2ZpbGU9JDIKLSAgICAgICAgICAgICAgaWYgWyAhIC1mICIkY29uZl9maWxlIiBdOyB0aGVuCi0gICAgICAgICAgICAgICAgZWNobyAiRXJyb3I6IENhbm5vdCBmaW5kIGNvbmZpZ3VyYXRpb24gZGlyZWN0b3J5OiAkY29uZl9maWxlIgotICAgICAgICAgICAgICAgIGV4aXQgMQotICAgICAgICAgICAgIGZpCi0gICAgICAgICAgICAgIFNUT1JNX0NPTkZfRklMRT0kY29uZl9maWxlCi0gICAgICAgICAgICAgIFNUT1JNX0NPTkZfRElSPWBkaXJuYW1lICRjb25mX2ZpbGVgCitpZiBbICQjIC1ndCAxIF07IHRoZW4KKyAgaWYgWyAiLS1jb25maWciID0gIiQxIiBdOyB0aGVuCisgICAgY29uZl9maWxlPSQyCisgICAgaWYgWyAhIC1mICIkY29uZl9maWxlIiBdOyB0aGVuCisgICAgICBlY2hvICJFcnJvcjogQ2Fubm90IGZpbmQgY29uZmlndXJhdGlvbiBkaXJlY3Rvcnk6ICRjb25mX2ZpbGUiCisgICAgICBleGl0IDEKICAgICBmaQorICAgIFNUT1JNX0NPTkZfRklMRT0kY29uZl9maWxlCisgICAgU1RPUk1fQ09ORl9ESVI9YGRpcm5hbWUgJGNvbmZfZmlsZWAKKyAgZmkKIGZpCiAKIGV4cG9ydCBTVE9STV9DT05GX0RJUj0iJHtTVE9STV9DT05GX0RJUjotJFNUT1JNX0JBU0VfRElSL2NvbmZ9IgpkaWZmIC0tZ2l0IGEvYmluL3N0b3JtLWNvbmZpZy5jbWQgYi9iaW4vc3Rvcm0tY29uZmlnLmNtZAppbmRleCBiODM5MTYwLi5kMjU5ZTMwIDEwMDY0NAotLS0gYS9iaW4vc3Rvcm0tY29uZmlnLmNtZAorKysgYi9iaW4vc3Rvcm0tY29uZmlnLmNtZApAQCAtODcsNyArODcsNyBAQAogQHJlbQogCiAiJUpBVkElIiAtY2xpZW50IC1Ec3Rvcm0ub3B0aW9ucz0gLURzdG9ybS5jb25mLmZpbGU9IC1jcCAiJUNMQVNTUEFUSCUiIGJhY2t0eXBlLnN0b3JtLmNvbW1hbmQuY29uZmlnX3ZhbHVlIHN0b3JtLmxvZzRqMi5jb25mLmRpciA+ICVDTURfVEVNUF9GSUxFJQotICAKKwogRk9SIC9GICJkZWxpbXM9IiAlJWkgaW4gKCVDTURfVEVNUF9GSUxFJSkgZG8gKAogCUZPUiAvRiAidG9rZW5zPTEsKiBkZWxpbXM9ICIgJSVhIGluICgiJSVpIikgZG8gKAogCQlpZiAlJWEgPT0gVkFMVUU6ICgKQEAgLTk1LDIyICs5NSwyMiBAQAogCQkJZGVsIC9GICVDTURfVEVNUF9GSUxFJSkKIAkJKQogCSkKLSkJCQorKQogCiBAcmVtCiBAcmVtIGlmIFNUT1JNX0xPRzRKMl9DT05GSUdVUkFUSU9OX0RJUiB3YXMgZGVmaW5lZCwgYWxzbyBzZXQgU1RPUk1fTE9HNEoyX0NPTkZJR1VSQVRJT05fRklMRQogQHJlbQogCiBpZiBub3QgJVNUT1JNX0xPRzRKMl9DT05GSUdVUkFUSU9OX0RJUiUgPT0gbmlsICgKLQlzZXQgU1RPUk1fTE9HNEoyX0NPTkZJR1VSQVRJT05fRklMRT0lU1RPUk1fTE9HNEoyX0NPTkZJR1VSQVRJT05fRElSJVxjbHVzdGVyLnhtbAotKSAKKwlzZXQgU1RPUk1fTE9HNEoyX0NPTkZJR1VSQVRJT05fRklMRT0iZmlsZTovLyVTVE9STV9MT0c0SjJfQ09ORklHVVJBVElPTl9ESVIlXGNsdXN0ZXIueG1sIgorKQogCiBAcmVtCiBAcmVtIG90aGVyd2lzZSwgZmFsbCBiYWNrIHRvIGRlZmF1bHQKIEByZW0KIAogaWYgbm90IGRlZmluZWQgU1RPUk1fTE9HNEoyX0NPTkZJR1VSQVRJT05fRklMRSAoCi0gIHNldCBTVE9STV9MT0c0SjJfQ09ORklHVVJBVElPTl9GSUxFPSVTVE9STV9IT01FJVxsb2c0ajJcY2x1c3Rlci54bWwKKyAgc2V0IFNUT1JNX0xPRzRKMl9DT05GSUdVUkFUSU9OX0ZJTEU9ImZpbGU6Ly8lU1RPUk1fSE9NRSVcbG9nNGoyXGNsdXN0ZXIueG1sIgogKQogCiAiJUpBVkElIiAtY2xpZW50IC1Ec3Rvcm0ub3B0aW9ucz0gLURzdG9ybS5jb25mLmZpbGU9IC1jcCAiJUNMQVNTUEFUSCUiIGJhY2t0eXBlLnN0b3JtLmNvbW1hbmQuY29uZmlnX3ZhbHVlIGphdmEubGlicmFyeS5wYXRoID4gJUNNRF9URU1QX0ZJTEUlCmRpZmYgLS1naXQgYS9iaW4vc3Rvcm0ucHkgYi9iaW4vc3Rvcm0ucHkKaW5kZXggMDI0OTEyZi4uNDRkNTRkNSAxMDA3NTUKLS0tIGEvYmluL3N0b3JtLnB5CisrKyBiL2Jpbi9zdG9ybS5weQpAQCAtMjE4LDcgKzIxOCw3IEBACiAgICAgUnVucyB0aGUgbWFpbiBtZXRob2Qgb2YgY2xhc3Mgd2l0aCB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50cy4KICAgICBUaGUgc3Rvcm0gamFycyBhbmQgY29uZmlncyBpbiB+Ly5zdG9ybSBhcmUgcHV0IG9uIHRoZSBjbGFzc3BhdGguCiAgICAgVGhlIHByb2Nlc3MgaXMgY29uZmlndXJlZCBzbyB0aGF0IFN0b3JtU3VibWl0dGVyCi0gICAgKGh0dHA6Ly9zdG9ybS5pbmN1YmF0b3IuYXBhY2hlLm9yZy9hcGlkb2NzL2JhY2t0eXBlL3N0b3JtL1N0b3JtU3VibWl0dGVyLmh0bWwpCisgICAgKGh0dHA6Ly9zdG9ybS5hcGFjaGUub3JnL2FwaWRvY3MvYmFja3R5cGUvc3Rvcm0vU3Rvcm1TdWJtaXR0ZXIuaHRtbCkKICAgICB3aWxsIHVwbG9hZCB0aGUgamFyIGF0IHRvcG9sb2d5LWphci1wYXRoIHdoZW4gdGhlIHRvcG9sb2d5IGlzIHN1Ym1pdHRlZC4KICAgICAiIiIKICAgICBleGVjX3N0b3JtX2NsYXNzKApAQCAtMjYzLDYgKzI2MywxOCBAQAogICAgICAgICBqdm10eXBlPSItY2xpZW50IiwKICAgICAgICAgZXh0cmFqYXJzPVtVU0VSX0NPTkZfRElSLCBTVE9STV9CSU5fRElSXSkKIAorZGVmIGhlYXJ0YmVhdHMoKmFyZ3MpOgorICAgICIiIlN5bnRheDogW3N0b3JtIGhlYXJ0YmVhdHMgW2NtZF1dCisKKyAgICBsaXN0IFBBVEggLSBsaXN0cyBoZWFydGJlYXRzIG5vZGVzIHVuZGVyIFBBVEggY3VycmVudGx5IGluIHRoZSBDbHVzdGVyU3RhdGUuCisgICAgZ2V0ICBQQVRIIC0gR2V0IHRoZSBoZWFydGJlYXQgZGF0YSBhdCBQQVRICisgICAgIiIiCisgICAgZXhlY19zdG9ybV9jbGFzcygKKyAgICAgICAgImJhY2t0eXBlLnN0b3JtLmNvbW1hbmQuaGVhcnRiZWF0cyIsCisgICAgICAgIGFyZ3M9YXJncywKKyAgICAgICAganZtdHlwZT0iLWNsaWVudCIsCisgICAgICAgIGV4dHJhamFycz1bVVNFUl9DT05GX0RJUiwgU1RPUk1fQklOX0RJUl0pCisgICAgCiBkZWYgYWN0aXZhdGUoKmFyZ3MpOgogICAgICIiIlN5bnRheDogW3N0b3JtIGFjdGl2YXRlIHRvcG9sb2d5LW5hbWVdCiAKQEAgLTI3Nyw2ICsyODksMzkgQEAKICAgICAgICAganZtdHlwZT0iLWNsaWVudCIsCiAgICAgICAgIGV4dHJhamFycz1bVVNFUl9DT05GX0RJUiwgU1RPUk1fQklOX0RJUl0pCiAKK2RlZiBzZXRfbG9nX2xldmVsKCphcmdzKToKKyAgICAiIiIKKyAgICBEeW5hbWljYWxseSBjaGFuZ2UgdG9wb2xvZ3kgbG9nIGxldmVscworCisgICAgU3ludGF4OiBbc3Rvcm0gc2V0X2xvZ19sZXZlbCAtbCBbbG9nZ2VyIG5hbWVdPVtsb2cgbGV2ZWxdWzpvcHRpb25hbCB0aW1lb3V0XSAtciBbbG9nZ2VyIG5hbWVdCisgICAgd2hlcmUgbG9nIGxldmVsIGlzIG9uZSBvZjoKKyAgICAgICAgQUxMLCBUUkFDRSwgREVCVUcsIElORk8sIFdBUk4sIEVSUk9SLCBGQVRBTCwgT0ZGCisgICAgYW5kIHRpbWVvdXQgaXMgaW50ZWdlciBzZWNvbmRzLgorCisgICAgZS5nLgorICAgICAgICAuL2Jpbi9zdG9ybSBzZXRfbG9nX2xldmVsIC1sIFJPT1Q9REVCVUc6MzAKKworICAgICAgICBTZXQgdGhlIHJvb3QgbG9nZ2VyJ3MgbGV2ZWwgdG8gREVCVUcgZm9yIDMwIHNlY29uZHMKKworICAgICAgICAuL2Jpbi9zdG9ybSBzZXRfbG9nX2xldmVsIC1sIGNvbS5teWFwcD1XQVJOCisKKyAgICAgICAgU2V0IHRoZSBjb20ubXlhcHAgbG9nZ2VyJ3MgbGV2ZWwgdG8gV0FSTiBmb3IgMzAgc2Vjb25kcworCisgICAgICAgIC4vYmluL3N0b3JtIHNldF9sb2dfbGV2ZWwgLWwgY29tLm15YXBwPVdBUk4gLWwgY29tLm15T3RoZXJMb2dnZXI9RVJST1I6MTIzCisKKyAgICAgICAgU2V0IHRoZSBjb20ubXlhcHAgbG9nZ2VyJ3MgbGV2ZWwgdG8gV0FSTiBpbmRpZmluaXRlbHksIGFuZCBjb20ubXlPdGhlckxvZ2dlcgorICAgICAgICB0byBFUlJPUiBmb3IgMTIzIHNlY29uZHMKKworICAgICAgICAuL2Jpbi9zdG9ybSBzZXRfbG9nX2xldmVsIC1yIGNvbS5teU90aGVyTG9nZ2VyCisKKyAgICAgICAgQ2xlYXJzIHNldHRpbmdzLCByZXNldHRpbmcgYmFjayB0byB0aGUgb3JpZ2luYWwgbGV2ZWwKKyAgICAiIiIKKyAgICBleGVjX3N0b3JtX2NsYXNzKAorICAgICAgICAiYmFja3R5cGUuc3Rvcm0uY29tbWFuZC5zZXRfbG9nX2xldmVsIiwKKyAgICAgICAgYXJncz1hcmdzLAorICAgICAgICBqdm10eXBlPSItY2xpZW50IiwKKyAgICAgICAgZXh0cmFqYXJzPVtVU0VSX0NPTkZfRElSLCBTVE9STV9CSU5fRElSXSkKKwogZGVmIGxpc3R0b3BvcygqYXJncyk6CiAgICAgIiIiU3ludGF4OiBbc3Rvcm0gbGlzdF0KIApAQCAtMzQ4LDYgKzM5MywzMCBAQAogICAgICAgICBqdm10eXBlPSItY2xpZW50IiwKICAgICAgICAgZXh0cmFqYXJzPVtVU0VSX0NPTkZfRElSLCBvcy5wYXRoLmpvaW4oU1RPUk1fRElSLCAiYmluIildKQogCitkZWYgaGVhbHRoY2hlY2soKmFyZ3MpOgorICAgICIiIlN5bnRheDogW3N0b3JtIG5vZGUtaGVhbHRoLWNoZWNrXQorCisgICAgUnVuIGhlYWx0aCBjaGVja3Mgb24gdGhlIGxvY2FsIHN1cGVydmlzb3IuCisgICAgIiIiCisgICAgZXhlY19zdG9ybV9jbGFzcygKKyAgICAgICAgImJhY2t0eXBlLnN0b3JtLmNvbW1hbmQuaGVhbHRoY2hlY2siLAorICAgICAgICBhcmdzPWFyZ3MsCisgICAgICAgIGp2bXR5cGU9Ii1jbGllbnQiLAorICAgICAgICBleHRyYWphcnM9W1VTRVJfQ09ORl9ESVIsIG9zLnBhdGguam9pbihTVE9STV9ESVIsICJiaW4iKV0pCisKK2RlZiBraWxsX3dvcmtlcnMoKmFyZ3MpOgorICAgICIiIlN5bnRheDogW3N0b3JtIGtpbGxfd29ya2Vyc10KKworICAgIEtpbGwgdGhlIHdvcmtlcnMgcnVubmluZyBvbiB0aGlzIHN1cGVydmlzb3IuIFRoaXMgY29tbWFuZCBzaG91bGQgYmUgcnVuCisgICAgb24gYSBzdXBlcnZpc29yIG5vZGUuIElmIHRoZSBjbHVzdGVyIGlzIHJ1bm5pbmcgaW4gc2VjdXJlIG1vZGUsIHRoZW4gdXNlciBuZWVkcworICAgIHRvIGhhdmUgYWRtaW4gcmlnaHRzIG9uIHRoZSBub2RlIHRvIGJlIGFibGUgdG8gc3VjY2Vzc2Z1bGx5IGtpbGwgYWxsIHdvcmtlcnMuCisgICAgIiIiCisgICAgZXhlY19zdG9ybV9jbGFzcygKKyAgICAgICAgImJhY2t0eXBlLnN0b3JtLmNvbW1hbmQua2lsbF93b3JrZXJzIiwKKyAgICAgICAgYXJncz1hcmdzLAorICAgICAgICBqdm10eXBlPSItY2xpZW50IiwKKyAgICAgICAgZXh0cmFqYXJzPVtVU0VSX0NPTkZfRElSLCBvcy5wYXRoLmpvaW4oU1RPUk1fRElSLCAiYmluIildKQorCiBkZWYgc2hlbGwocmVzb3VyY2VzZGlyLCBjb21tYW5kLCAqYXJncyk6CiAgICAgdG1wamFycGF0aCA9ICJzdG9ybXNoZWxsIiArIHN0cihyYW5kb20ucmFuZGludCgwLCAxMDAwMDAwMCkpICsgIi5qYXIiCiAgICAgb3Muc3lzdGVtKCJqYXIgY2YgJXMgJXMiICUgKHRtcGphcnBhdGgsIHJlc291cmNlc2RpcikpCkBAIC0zNzUsNiArNDQ0LDggQEAKICAgICBzdG9ybV9sb2c0ajJfY29uZl9kaXIgPSBjb25mdmFsdWUoInN0b3JtLmxvZzRqMi5jb25mLmRpciIsIGNwcGF0aHMpCiAgICAgaWYoc3Rvcm1fbG9nNGoyX2NvbmZfZGlyID09IE5vbmUgb3Igc3Rvcm1fbG9nNGoyX2NvbmZfZGlyID09ICJuaWwiKToKICAgICAgICAgc3Rvcm1fbG9nNGoyX2NvbmZfZGlyID0gU1RPUk1fTE9HNEoyX0NPTkZfRElSCisgICAgZWxpZihub3Qgb3MucGF0aC5pc2FicyhzdG9ybV9sb2c0ajJfY29uZl9kaXIpKToKKyAgICAgICAgc3Rvcm1fbG9nNGoyX2NvbmZfZGlyID0gb3MucGF0aC5qb2luKFNUT1JNX0RJUiwgc3Rvcm1fbG9nNGoyX2NvbmZfZGlyKQogICAgIHJldHVybiBzdG9ybV9sb2c0ajJfY29uZl9kaXIKIAogZGVmIG5pbWJ1cyhrbGFzcz0iYmFja3R5cGUuc3Rvcm0uZGFlbW9uLm5pbWJ1cyIpOgpAQCAtMzg0LDExICs0NTUsMTIgQEAKICAgICBzdXBlcnZpc2lvbiB3aXRoIGEgdG9vbCBsaWtlIGRhZW1vbnRvb2xzIG9yIG1vbml0LgogCiAgICAgU2VlIFNldHRpbmcgdXAgYSBTdG9ybSBjbHVzdGVyIGZvciBtb3JlIGluZm9ybWF0aW9uLgotICAgIChodHRwOi8vc3Rvcm0uaW5jdWJhdG9yLmFwYWNoZS5vcmcvZG9jdW1lbnRhdGlvbi9TZXR0aW5nLXVwLWEtU3Rvcm0tY2x1c3RlcikKKyAgICAoaHR0cDovL3N0b3JtLmFwYWNoZS5vcmcvZG9jdW1lbnRhdGlvbi9TZXR0aW5nLXVwLWEtU3Rvcm0tY2x1c3RlcikKICAgICAiIiIKICAgICBjcHBhdGhzID0gW0NMVVNURVJfQ09ORl9ESVJdCiAgICAganZtb3B0cyA9IHBhcnNlX2FyZ3MoY29uZnZhbHVlKCJuaW1idXMuY2hpbGRvcHRzIiwgY3BwYXRocykpICsgWwogICAgICAgICAiLURsb2dmaWxlLm5hbWU9bmltYnVzLmxvZyIsCisgICAgICAgICItRExvZzRqQ29udGV4dFNlbGVjdG9yPW9yZy5hcGFjaGUubG9nZ2luZy5sb2c0ai5jb3JlLmFzeW5jLkFzeW5jTG9nZ2VyQ29udGV4dFNlbGVjdG9yIiwKICAgICAgICAgIi1EbG9nNGouY29uZmlndXJhdGlvbkZpbGU9IiArIG9zLnBhdGguam9pbihnZXRfbG9nNGoyX2NvbmZfZGlyKCksICJjbHVzdGVyLnhtbCIpLAogICAgIF0KICAgICBleGVjX3N0b3JtX2NsYXNzKApAQCAtMzk4LDYgKzQ3MCwyNyBAQAogICAgICAgICBleHRyYWphcnM9Y3BwYXRocywKICAgICAgICAganZtb3B0cz1qdm1vcHRzKQogCitkZWYgcGFjZW1ha2VyKGtsYXNzPSJvcmcuYXBhY2hlLnN0b3JtLnBhY2VtYWtlci5wYWNlbWFrZXIiKToKKyAgICAiIiJTeW50YXg6IFtzdG9ybSBwYWNlbWFrZXJdCisKKyAgICBMYXVuY2hlcyB0aGUgUGFjZW1ha2VyIGRhZW1vbi4gVGhpcyBjb21tYW5kIHNob3VsZCBiZSBydW4gdW5kZXIKKyAgICBzdXBlcnZpc2lvbiB3aXRoIGEgdG9vbCBsaWtlIGRhZW1vbnRvb2xzIG9yIG1vbml0LgorCisgICAgU2VlIFNldHRpbmcgdXAgYSBTdG9ybSBjbHVzdGVyIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICAgIChodHRwOi8vc3Rvcm0uYXBhY2hlLm9yZy9kb2N1bWVudGF0aW9uL1NldHRpbmctdXAtYS1TdG9ybS1jbHVzdGVyKQorICAgICIiIgorICAgIGNwcGF0aHMgPSBbQ0xVU1RFUl9DT05GX0RJUl0KKyAgICBqdm1vcHRzID0gcGFyc2VfYXJncyhjb25mdmFsdWUoInBhY2VtYWtlci5jaGlsZG9wdHMiLCBjcHBhdGhzKSkgKyBbCisgICAgICAgICItRGxvZ2ZpbGUubmFtZT1wYWNlbWFrZXIubG9nIiwKKyAgICAgICAgIi1EbG9nNGouY29uZmlndXJhdGlvbkZpbGU9IiArIG9zLnBhdGguam9pbihnZXRfbG9nNGoyX2NvbmZfZGlyKCksICJjbHVzdGVyLnhtbCIpLAorICAgIF0KKyAgICBleGVjX3N0b3JtX2NsYXNzKAorICAgICAgICBrbGFzcywKKyAgICAgICAganZtdHlwZT0iLXNlcnZlciIsCisgICAgICAgIGRhZW1vbk5hbWU9InBhY2VtYWtlciIsCisgICAgICAgIGV4dHJhamFycz1jcHBhdGhzLAorICAgICAgICBqdm1vcHRzPWp2bW9wdHMpCisKIGRlZiBzdXBlcnZpc29yKGtsYXNzPSJiYWNrdHlwZS5zdG9ybS5kYWVtb24uc3VwZXJ2aXNvciIpOgogICAgICIiIlN5bnRheDogW3N0b3JtIHN1cGVydmlzb3JdCiAKQEAgLTQwNSwxMSArNDk4LDEyIEBACiAgICAgdW5kZXIgc3VwZXJ2aXNpb24gd2l0aCBhIHRvb2wgbGlrZSBkYWVtb250b29scyBvciBtb25pdC4KIAogICAgIFNlZSBTZXR0aW5nIHVwIGEgU3Rvcm0gY2x1c3RlciBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAgICAoaHR0cDovL3N0b3JtLmluY3ViYXRvci5hcGFjaGUub3JnL2RvY3VtZW50YXRpb24vU2V0dGluZy11cC1hLVN0b3JtLWNsdXN0ZXIpCisgICAgKGh0dHA6Ly9zdG9ybS5hcGFjaGUub3JnL2RvY3VtZW50YXRpb24vU2V0dGluZy11cC1hLVN0b3JtLWNsdXN0ZXIpCiAgICAgIiIiCiAgICAgY3BwYXRocyA9IFtDTFVTVEVSX0NPTkZfRElSXQogICAgIGp2bW9wdHMgPSBwYXJzZV9hcmdzKGNvbmZ2YWx1ZSgic3VwZXJ2aXNvci5jaGlsZG9wdHMiLCBjcHBhdGhzKSkgKyBbCiAgICAgICAgICItRGxvZ2ZpbGUubmFtZT0iICsgU1RPUk1fU1VQRVJWSVNPUl9MT0dfRklMRSwKKyAgICAgICAgIi1ETG9nNGpDb250ZXh0U2VsZWN0b3I9b3JnLmFwYWNoZS5sb2dnaW5nLmxvZzRqLmNvcmUuYXN5bmMuQXN5bmNMb2dnZXJDb250ZXh0U2VsZWN0b3IiLAogICAgICAgICAiLURsb2c0ai5jb25maWd1cmF0aW9uRmlsZT0iICsgb3MucGF0aC5qb2luKGdldF9sb2c0ajJfY29uZl9kaXIoKSwgImNsdXN0ZXIueG1sIiksCiAgICAgXQogICAgIGV4ZWNfc3Rvcm1fY2xhc3MoCkBAIC00MjcsMTEgKzUyMSwxMiBAQAogICAgIHNob3VsZCBiZSBydW4gdW5kZXIgc3VwZXJ2aXNpb24gd2l0aCBhIHRvb2wgbGlrZSBkYWVtb250b29scyBvciBtb25pdC4KIAogICAgIFNlZSBTZXR0aW5nIHVwIGEgU3Rvcm0gY2x1c3RlciBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAgICAoaHR0cDovL3N0b3JtLmluY3ViYXRvci5hcGFjaGUub3JnL2RvY3VtZW50YXRpb24vU2V0dGluZy11cC1hLVN0b3JtLWNsdXN0ZXIpCisgICAgKGh0dHA6Ly9zdG9ybS5hcGFjaGUub3JnL2RvY3VtZW50YXRpb24vU2V0dGluZy11cC1hLVN0b3JtLWNsdXN0ZXIpCiAgICAgIiIiCiAgICAgY3BwYXRocyA9IFtDTFVTVEVSX0NPTkZfRElSXQogICAgIGp2bW9wdHMgPSBwYXJzZV9hcmdzKGNvbmZ2YWx1ZSgidWkuY2hpbGRvcHRzIiwgY3BwYXRocykpICsgWwogICAgICAgICAiLURsb2dmaWxlLm5hbWU9dWkubG9nIiwKKyAgICAgICAgIi1ETG9nNGpDb250ZXh0U2VsZWN0b3I9b3JnLmFwYWNoZS5sb2dnaW5nLmxvZzRqLmNvcmUuYXN5bmMuQXN5bmNMb2dnZXJDb250ZXh0U2VsZWN0b3IiLAogICAgICAgICAiLURsb2c0ai5jb25maWd1cmF0aW9uRmlsZT0iICsgb3MucGF0aC5qb2luKGdldF9sb2c0ajJfY29uZl9kaXIoKSwgImNsdXN0ZXIueG1sIikKICAgICBdCiAgICAgZXhlY19zdG9ybV9jbGFzcygKQEAgLTQ0OSwxMSArNTQ0LDEyIEBACiAgICAgdG9vbCBsaWtlIGRhZW1vbnRvb2xzIG9yIG1vbml0LgogCiAgICAgU2VlIFNldHRpbmcgdXAgYSBTdG9ybSBjbHVzdGVyIGZvciBtb3JlIGluZm9ybWF0aW9uLgotICAgIChodHRwOi8vc3Rvcm0uaW5jdWJhdG9yLmFwYWNoZS5vcmcvZG9jdW1lbnRhdGlvbi9TZXR0aW5nLXVwLWEtU3Rvcm0tY2x1c3RlcikKKyAgICAoaHR0cDovL3N0b3JtLmFwYWNoZS5vcmcvZG9jdW1lbnRhdGlvbi9TZXR0aW5nLXVwLWEtU3Rvcm0tY2x1c3RlcikKICAgICAiIiIKICAgICBjcHBhdGhzID0gW0NMVVNURVJfQ09ORl9ESVJdCiAgICAganZtb3B0cyA9IHBhcnNlX2FyZ3MoY29uZnZhbHVlKCJsb2d2aWV3ZXIuY2hpbGRvcHRzIiwgY3BwYXRocykpICsgWwogICAgICAgICAiLURsb2dmaWxlLm5hbWU9bG9ndmlld2VyLmxvZyIsCisgICAgICAgICItRExvZzRqQ29udGV4dFNlbGVjdG9yPW9yZy5hcGFjaGUubG9nZ2luZy5sb2c0ai5jb3JlLmFzeW5jLkFzeW5jTG9nZ2VyQ29udGV4dFNlbGVjdG9yIiwKICAgICAgICAgIi1EbG9nNGouY29uZmlndXJhdGlvbkZpbGU9IiArIG9zLnBhdGguam9pbihnZXRfbG9nNGoyX2NvbmZfZGlyKCksICJjbHVzdGVyLnhtbCIpCiAgICAgXQogICAgIGV4ZWNfc3Rvcm1fY2xhc3MoCkBAIC00NzAsMTEgKzU2NiwxMiBAQAogICAgIHdpdGggYSB0b29sIGxpa2UgZGFlbW9udG9vbHMgb3IgbW9uaXQuCiAKICAgICBTZWUgRGlzdHJpYnV0ZWQgUlBDIGZvciBtb3JlIGluZm9ybWF0aW9uLgotICAgIChodHRwOi8vc3Rvcm0uaW5jdWJhdG9yLmFwYWNoZS5vcmcvZG9jdW1lbnRhdGlvbi9EaXN0cmlidXRlZC1SUEMpCisgICAgKGh0dHA6Ly9zdG9ybS5hcGFjaGUub3JnL2RvY3VtZW50YXRpb24vRGlzdHJpYnV0ZWQtUlBDKQogICAgICIiIgogICAgIGNwcGF0aHMgPSBbQ0xVU1RFUl9DT05GX0RJUl0KICAgICBqdm1vcHRzID0gcGFyc2VfYXJncyhjb25mdmFsdWUoImRycGMuY2hpbGRvcHRzIiwgY3BwYXRocykpICsgWwogICAgICAgICAiLURsb2dmaWxlLm5hbWU9ZHJwYy5sb2ciLAorICAgICAgICAiLURMb2c0akNvbnRleHRTZWxlY3Rvcj1vcmcuYXBhY2hlLmxvZ2dpbmcubG9nNGouY29yZS5hc3luYy5Bc3luY0xvZ2dlckNvbnRleHRTZWxlY3RvciIsCiAgICAgICAgICItRGxvZzRqLmNvbmZpZ3VyYXRpb25GaWxlPSIgKyBvcy5wYXRoLmpvaW4oZ2V0X2xvZzRqMl9jb25mX2RpcigpLCAiY2x1c3Rlci54bWwiKQogICAgIF0KICAgICBleGVjX3N0b3JtX2NsYXNzKApAQCAtNTM3LDcgKzYzNCw3IEBACiAgICAgIiIiUHJpbnQgYWxsIGNsaWVudCBjb21tYW5kcyBhbmQgbGluayB0byBkb2N1bWVudGF0aW9uIiIiCiAgICAgcHJpbnQoIkNvbW1hbmRzOlxuXHQiICsgICJcblx0Ii5qb2luKHNvcnRlZChDT01NQU5EUy5rZXlzKCkpKSkKICAgICBwcmludCgiXG5IZWxwOiBcblx0aGVscCBcblx0aGVscCA8Y29tbWFuZD4iKQotICAgIHByaW50KCJcbkRvY3VtZW50YXRpb24gZm9yIHRoZSBzdG9ybSBjbGllbnQgY2FuIGJlIGZvdW5kIGF0IGh0dHA6Ly9zdG9ybS5pbmN1YmF0b3IuYXBhY2hlLm9yZy9kb2N1bWVudGF0aW9uL0NvbW1hbmQtbGluZS1jbGllbnQuaHRtbFxuIikKKyAgICBwcmludCgiXG5Eb2N1bWVudGF0aW9uIGZvciB0aGUgc3Rvcm0gY2xpZW50IGNhbiBiZSBmb3VuZCBhdCBodHRwOi8vc3Rvcm0uYXBhY2hlLm9yZy9kb2N1bWVudGF0aW9uL0NvbW1hbmQtbGluZS1jbGllbnQuaHRtbFxuIikKICAgICBwcmludCgiQ29uZmlncyBjYW4gYmUgb3ZlcnJpZGRlbiB1c2luZyBvbmUgb3IgbW9yZSAtYyBmbGFncywgZS5nLiBcInN0b3JtIGxpc3QgLWMgbmltYnVzLmhvc3Q9bmltYnVzLm15Y29tcGFueS5jb21cIlxuIikKIAogZGVmIHByaW50X3VzYWdlKGNvbW1hbmQ9Tm9uZSk6CkBAIC01NjEsNyArNjU4LDkgQEAKICAgICAgICAgICAgICJyZW1vdGVjb25mdmFsdWUiOiBwcmludF9yZW1vdGVjb25mdmFsdWUsICJyZXBsIjogcmVwbCwgImNsYXNzcGF0aCI6IHByaW50X2NsYXNzcGF0aCwKICAgICAgICAgICAgICJhY3RpdmF0ZSI6IGFjdGl2YXRlLCAiZGVhY3RpdmF0ZSI6IGRlYWN0aXZhdGUsICJyZWJhbGFuY2UiOiByZWJhbGFuY2UsICJoZWxwIjogcHJpbnRfdXNhZ2UsCiAgICAgICAgICAgICAibGlzdCI6IGxpc3R0b3BvcywgImRldi16b29rZWVwZXIiOiBkZXZfem9va2VlcGVyLCAidmVyc2lvbiI6IHZlcnNpb24sICJtb25pdG9yIjogbW9uaXRvciwKLSAgICAgICAgICAgICJ1cGxvYWQtY3JlZGVudGlhbHMiOiB1cGxvYWRfY3JlZGVudGlhbHMsICJnZXQtZXJyb3JzIjogZ2V0X2Vycm9ycyB9CisgICAgICAgICAgICAidXBsb2FkLWNyZWRlbnRpYWxzIjogdXBsb2FkX2NyZWRlbnRpYWxzLCAicGFjZW1ha2VyIjogcGFjZW1ha2VyLCAiaGVhcnRiZWF0cyI6IGhlYXJ0YmVhdHMsCisgICAgICAgICAgICAiZ2V0LWVycm9ycyI6IGdldF9lcnJvcnMsICJzZXRfbG9nX2xldmVsIjogc2V0X2xvZ19sZXZlbCwgImtpbGxfd29ya2VycyI6IGtpbGxfd29ya2VycywKKyAgICAgICAgICAgICJub2RlLWhlYWx0aC1jaGVjayI6IGhlYWx0aGNoZWNrfQogCiBkZWYgcGFyc2VfY29uZmlnKGNvbmZpZ19saXN0KToKICAgICBnbG9iYWwgQ09ORklHX09QVFMKZGlmZiAtLWdpdCBhL2NvbmYvZGVmYXVsdHMueWFtbCBiL2NvbmYvZGVmYXVsdHMueWFtbAppbmRleCA0M2VmOGY0Li4yOTVhYzdjIDEwMDY0NAotLS0gYS9jb25mL2RlZmF1bHRzLnlhbWwKKysrIGIvY29uZi9kZWZhdWx0cy55YW1sCkBAIC00OSw4ICs0OSwxMSBAQAogc3Rvcm0uYXV0aC5zaW1wbGUtYWNsLnVzZXJzOiBbXQogc3Rvcm0uYXV0aC5zaW1wbGUtYWNsLnVzZXJzLmNvbW1hbmRzOiBbXQogc3Rvcm0uYXV0aC5zaW1wbGUtYWNsLmFkbWluczogW10KK3N0b3JtLmNsdXN0ZXIuc3RhdGUuc3RvcmU6ICJiYWNrdHlwZS5zdG9ybS5jbHVzdGVyX3N0YXRlLnpvb2tlZXBlcl9zdGF0ZV9mYWN0b3J5Igogc3Rvcm0ubWV0YS5zZXJpYWxpemF0aW9uLmRlbGVnYXRlOiAiYmFja3R5cGUuc3Rvcm0uc2VyaWFsaXphdGlvbi5HemlwVGhyaWZ0U2VyaWFsaXphdGlvbkRlbGVnYXRlIgogc3Rvcm0uY29kZWRpc3RyaWJ1dG9yLmNsYXNzOiAiYmFja3R5cGUuc3Rvcm0uY29kZWRpc3RyaWJ1dG9yLkxvY2FsRmlsZVN5c3RlbUNvZGVEaXN0cmlidXRvciIKK3N0b3JtLmhlYWx0aC5jaGVjay5kaXI6ICJoZWFsdGhjaGVja3MiCitzdG9ybS5oZWFsdGguY2hlY2sudGltZW91dC5tczogNTAwMAogCiAjIyMgbmltYnVzLiogY29uZmlncyBhcmUgZm9yIHRoZSBtYXN0ZXIKIG5pbWJ1cy5zZWVkcyA6IFsibG9jYWxob3N0Il0KQEAgLTY1LDEyICs2OCwxNCBAQAogbmltYnVzLmluYm94Lmphci5leHBpcmF0aW9uLnNlY3M6IDM2MDAKIG5pbWJ1cy5jb2RlLnN5bmMuZnJlcS5zZWNzOiAzMDAKIG5pbWJ1cy50YXNrLmxhdW5jaC5zZWNzOiAxMjAKLW5pbWJ1cy5yZWFzc2lnbjogdHJ1ZQogbmltYnVzLmZpbGUuY29weS5leHBpcmF0aW9uLnNlY3M6IDYwMAogbmltYnVzLnRvcG9sb2d5LnZhbGlkYXRvcjogImJhY2t0eXBlLnN0b3JtLm5pbWJ1cy5EZWZhdWx0VG9wb2xvZ3lWYWxpZGF0b3IiCiB0b3BvbG9neS5taW4ucmVwbGljYXRpb24uY291bnQ6IDEKIHRvcG9sb2d5Lm1heC5yZXBsaWNhdGlvbi53YWl0LnRpbWUuc2VjOiA2MAogbmltYnVzLmNyZWRlbnRpYWwucmVuZXdlcnMuZnJlcS5zZWNzOiA2MDAKK25pbWJ1cy5pbXBlcnNvbmF0aW9uLmF1dGhvcml6ZXI6ICJiYWNrdHlwZS5zdG9ybS5zZWN1cml0eS5hdXRoLmF1dGhvcml6ZXIuSW1wZXJzb25hdGlvbkF1dGhvcml6ZXIiCisKK3NjaGVkdWxlci5kaXNwbGF5LnJlc291cmNlOiBmYWxzZQogCiAjIyMgdWkuKiBjb25maWdzIGFyZSBmb3IgdGhlIG1hc3RlcgogdWkuaG9zdDogMC4wLjAuMApAQCAtODcsNiArOTIsOCBAQAogbG9ndmlld2VyLmNoaWxkb3B0czogIi1YbXgxMjhtIgogbG9ndmlld2VyLmNsZWFudXAuYWdlLm1pbnM6IDEwMDgwCiBsb2d2aWV3ZXIuYXBwZW5kZXIubmFtZTogIkExIgorbG9ndmlld2VyLm1heC5zdW0ud29ya2VyLmxvZ3Muc2l6ZS5tYjogNDA5NgorbG9ndmlld2VyLm1heC5wZXIud29ya2VyLmxvZ3Muc2l6ZS5tYjogMjA0OAogCiBsb2dzLnVzZXJzOiBudWxsCiAKQEAgLTEzMiwxMiArMTM5LDI0IEBACiBzdXBlcnZpc29yLmVuYWJsZTogdHJ1ZQogc3VwZXJ2aXNvci5zdXBlcnZpc29yczogW10KIHN1cGVydmlzb3Iuc3VwZXJ2aXNvcnMuY29tbWFuZHM6IFtdCitzdXBlcnZpc29yLm1lbW9yeS5jYXBhY2l0eS5tYjogMzA3Mi4wCisjQnkgY29udmVudGlvbiAxIGNwdSBjb3JlIHNob3VsZCBiZSBhYm91dCAxMDAsIGJ1dCB0aGlzIGNhbiBiZSBhZGp1c3RlZCBpZiBuZWVkZWQKKyMgdXNpbmcgMTAwIG1ha2VzIGl0IHNpbXBsZSB0byBzZXQgdGhlIGRlc2lyZWQgdmFsdWUgdG8gdGhlIGNhcGFjaXR5IG1lYXN1cmVtZW50CisjIGZvciBzaW5nbGUgdGhyZWFkZWQgYm9sdHMKK3N1cGVydmlzb3IuY3B1LmNhcGFjaXR5OiA0MDAuMAogCiAjIyMgd29ya2VyLiogY29uZmlncyBhcmUgZm9yIHRhc2sgd29ya2Vycwotd29ya2VyLmNoaWxkb3B0czogIi1YbXg3NjhtIgord29ya2VyLmhlYXAubWVtb3J5Lm1iOiA3NjgKK3dvcmtlci5jaGlsZG9wdHM6ICItWG14JUhFQVAtTUVNJW0gLVhYOitQcmludEdDRGV0YWlscyAtWGxvZ2djOmFydGlmYWN0cy9nYy5sb2cgLVhYOitQcmludEdDRGF0ZVN0YW1wcyAtWFg6K1ByaW50R0NUaW1lU3RhbXBzIC1YWDorVXNlR0NMb2dGaWxlUm90YXRpb24gLVhYOk51bWJlck9mR0NMb2dGaWxlcz0xMCAtWFg6R0NMb2dGaWxlU2l6ZT0xTSAtWFg6K0hlYXBEdW1wT25PdXRPZk1lbW9yeUVycm9yIC1YWDpIZWFwRHVtcFBhdGg9YXJ0aWZhY3RzL2hlYXBkdW1wIgogd29ya2VyLmdjLmNoaWxkb3B0czogIiIKK3dvcmtlci5wcm9maWxlci5jaGlsZG9wdHM6ICItWFg6K1VubG9ja0NvbW1lcmNpYWxGZWF0dXJlcyAtWFg6K0ZsaWdodFJlY29yZGVyIgord29ya2VyLnByb2ZpbGVyLmVuYWJsZWQ6IHRydWUKK3dvcmtlci5wcm9maWxlci5jb21tYW5kOiAiZmxpZ2h0LmJhc2giCiB3b3JrZXIuaGVhcnRiZWF0LmZyZXF1ZW5jeS5zZWNzOiAxCiAKKyMgY2hlY2sgd2hldGhlciBkeW5hbWljIGxvZyBsZXZlbHMgY2FuIGJlIHJlc2V0IGZyb20gREVCVUcgdG8gSU5GTyBpbiB3b3JrZXJzCit3b3JrZXIubG9nLmxldmVsLnJlc2V0LnBvbGwuc2VjczogMzAKKwogIyBjb250cm9sIGhvdyBtYW55IHdvcmtlciByZWNlaXZlciB0aHJlYWRzIHdlIG5lZWQgcGVyIHdvcmtlcgogdG9wb2xvZ3kud29ya2VyLnJlY2VpdmVyLnRocmVhZC5jb3VudDogMQogCkBAIC0xNzEsNiArMTkwLDkgQEAKICMgQnkgZGVmYXVsdCwgdGhlIE5ldHR5IFNBU0wgYXV0aGVudGljYXRpb24gaXMgc2V0IHRvIGZhbHNlLiAgVXNlcnMgY2FuIG92ZXJyaWRlIGFuZCBzZXQgaXQgdHJ1ZSBmb3IgYSBzcGVjaWZpYyB0b3BvbG9neS4KIHN0b3JtLm1lc3NhZ2luZy5uZXR0eS5hdXRoZW50aWNhdGlvbjogZmFsc2UKIAorIyBEZWZhdWx0IHBsdWdpbiB0byB1c2UgZm9yIGF1dG9tYXRpYyBuZXR3b3JrIHRvcG9sb2d5IGRpc2NvdmVyeQorc3Rvcm0ubmV0d29yay50b3BvZ3JhcGh5LnBsdWdpbjogYmFja3R5cGUuc3Rvcm0ubmV0d29ya3RvcG9ncmFwaHkuRGVmYXVsdFJhY2tETlNUb1N3aXRjaE1hcHBpbmcKKwogIyBkZWZhdWx0IG51bWJlciBvZiBzZWNvbmRzIGdyb3VwIG1hcHBpbmcgc2VydmljZSB3aWxsIGNhY2hlIHVzZXIgZ3JvdXAKIHN0b3JtLmdyb3VwLm1hcHBpbmcuc2VydmljZS5jYWNoZS5kdXJhdGlvbi5zZWNzOiAxMjAKIApAQCAtMTk4LDcgKzIyMCw2IEBACiB0b3BvbG9neS50cmFuc2Zlci5idWZmZXIuc2l6ZTogMTAyNCAjIGJhdGNoZWQKIHRvcG9sb2d5LnRpY2sudHVwbGUuZnJlcS5zZWNzOiBudWxsCiB0b3BvbG9neS53b3JrZXIuc2hhcmVkLnRocmVhZC5wb29sLnNpemU6IDQKLXRvcG9sb2d5LmRpc3J1cHRvci53YWl0LnN0cmF0ZWd5OiAiY29tLmxtYXguZGlzcnVwdG9yLkJsb2NraW5nV2FpdFN0cmF0ZWd5IgogdG9wb2xvZ3kuc3BvdXQud2FpdC5zdHJhdGVneTogImJhY2t0eXBlLnN0b3JtLnNwb3V0LlNsZWVwU3BvdXRXYWl0U3RyYXRlZ3kiCiB0b3BvbG9neS5zbGVlcC5zcG91dC53YWl0LnN0cmF0ZWd5LnRpbWUubXM6IDEKIHRvcG9sb2d5LmVycm9yLnRocm90dGxlLmludGVydmFsLnNlY3M6IDEwCkBAIC0yMTEsNSArMjMyLDIzIEBACiB0b3BvbG9neS5lbnZpcm9ubWVudDogbnVsbAogdG9wb2xvZ3kuYm9sdHMub3V0Z29pbmcub3ZlcmZsb3cuYnVmZmVyLmVuYWJsZTogZmFsc2UKIHRvcG9sb2d5LmRpc3J1cHRvci53YWl0LnRpbWVvdXQubWlsbGlzOiAxMDAwCit0b3BvbG9neS5kaXNydXB0b3IuYmF0Y2guc2l6ZTogMTAwCit0b3BvbG9neS5kaXNydXB0b3IuYmF0Y2gudGltZW91dC5taWxsaXM6IDEKK3RvcG9sb2d5LmRpc2FibGUubG9hZGF3YXJlOiBmYWxzZQorCisjIENvbmZpZ3MgZm9yIFJlc291cmNlIEF3YXJlIFNjaGVkdWxlcgordG9wb2xvZ3kuY29tcG9uZW50LnJlc291cmNlcy5vbmhlYXAubWVtb3J5Lm1iOiAxMjguMAordG9wb2xvZ3kuY29tcG9uZW50LnJlc291cmNlcy5vZmZoZWFwLm1lbW9yeS5tYjogMC4wCit0b3BvbG9neS5jb21wb25lbnQuY3B1LnBjb3JlLnBlcmNlbnQ6IDEwLjAKK3RvcG9sb2d5Lndvcmtlci5tYXguaGVhcC5zaXplLm1iOiA3NjguMAogCiBkZXYuem9va2VlcGVyLnBhdGg6ICIvdG1wL2Rldi1zdG9ybS16b29rZWVwZXIiCisKK3BhY2VtYWtlci5ob3N0OiAibG9jYWxob3N0IgorcGFjZW1ha2VyLnBvcnQ6IDY2OTkKK3BhY2VtYWtlci5iYXNlLnRocmVhZHM6IDEwCitwYWNlbWFrZXIubWF4LnRocmVhZHM6IDUwCitwYWNlbWFrZXIudGhyZWFkLnRpbWVvdXQ6IDEwCitwYWNlbWFrZXIuY2hpbGRvcHRzOiAiLVhteDEwMjRtIgorcGFjZW1ha2VyLmF1dGgubWV0aG9kOiAiTk9ORSIKK3BhY2VtYWtlci5rZXJiZXJvcy51c2VyczogW10KZGlmZiAtLWdpdCBhL2NvbmYvc3Rvcm0ueWFtbC5leGFtcGxlIGIvY29uZi9zdG9ybS55YW1sLmV4YW1wbGUKaW5kZXggNWZkMzVmOC4uMTNjMmY4ZSAxMDA2NDQKLS0tIGEvY29uZi9zdG9ybS55YW1sLmV4YW1wbGUKKysrIGIvY29uZi9zdG9ybS55YW1sLmV4YW1wbGUKQEAgLTE5LDcgKzE5LDcgQEAKICMgICAgIC0gInNlcnZlcjEiCiAjICAgICAtICJzZXJ2ZXIyIgogIyAKLSMgbmltYnVzLmhvc3Q6ICJuaW1idXMiCisjIG5pbWJ1cy5zZWVkczogWyJob3N0MSIsICJob3N0MiIsICJob3N0MyJdCiAjIAogIyAKICMgIyMjIyMgVGhlc2UgbWF5IG9wdGlvbmFsbHkgYmUgZmlsbGVkIGluOgpkaWZmIC0tZ2l0IGEvZGV2LXRvb2xzL3N0b3JtLW1lcmdlLnB5IGIvZGV2LXRvb2xzL3N0b3JtLW1lcmdlLnB5CmluZGV4IGVkMDYyMTYuLjMzNjkwYzIgMTAwNzU1Ci0tLSBhL2Rldi10b29scy9zdG9ybS1tZXJnZS5weQorKysgYi9kZXYtdG9vbHMvc3Rvcm0tbWVyZ2UucHkKQEAgLTI0LDcgKzI0LDcgQEAKIAogICAgICAgICBmb3IgcHVsbE51bWJlciBpbiBhcmdzOgogCQlwdWxsID0gZ2l0aHViLnB1bGwoImFwYWNoZSIsICJzdG9ybSIsIHB1bGxOdW1iZXIpCi0JCXByaW50ICJnaXQgcHVsbCAiK3B1bGwuZnJvbV9yZXBvKCkrIiAiK3B1bGwuZnJvbV9icmFuY2goKQorCQlwcmludCAiZ2l0IHB1bGwgLS1uby1mZiAiK3B1bGwuZnJvbV9yZXBvKCkrIiAiK3B1bGwuZnJvbV9icmFuY2goKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogCW1haW4oKQpkaWZmIC0tZ2l0IGEvZGV2LXRvb2xzL3RyYXZpcy9yYXRwcmludC5weSBiL2Rldi10b29scy90cmF2aXMvcmF0cHJpbnQucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTAzMTA0NQotLS0gL2Rldi9udWxsCisrKyBiL2Rldi10b29scy90cmF2aXMvcmF0cHJpbnQucHkKQEAgLTAsMCArMSwyNiBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisjIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQorIyAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KK2ltcG9ydCBzeXMKK2ltcG9ydCByZQorCitwID0gcmUuY29tcGlsZSgnVW5hcHByb3ZlZCBsaWNlbnNlczpccyooW15cc1wqXSopLipcKlwqXConKQorCit3aXRoIG9wZW4gKHN5cy5hcmd2WzFdKSBhcyByYXRmaWxlOgorICByYXQgPSByYXRmaWxlLnJlYWQoKS5yZXBsYWNlKCdcbicsJycpCisKK21hdGNoZXMgPSBwLnNlYXJjaChyYXQpCitmYWlsZWQgPSAgbWF0Y2hlcy5ncm91cCgxKQorCitpZiByZS5zZWFyY2goJ1xTJywgZmFpbGVkKToKKyAgcHJpbnQgZmFpbGVkCmRpZmYgLS1naXQgYS9kZXYtdG9vbHMvdHJhdmlzL3RyYXZpcy1pbnN0YWxsLnNoIGIvZGV2LXRvb2xzL3RyYXZpcy90cmF2aXMtaW5zdGFsbC5zaAppbmRleCA2YWYyZjkwLi40Y2JlYmIxIDEwMDc1NQotLS0gYS9kZXYtdG9vbHMvdHJhdmlzL3RyYXZpcy1pbnN0YWxsLnNoCisrKyBiL2Rldi10b29scy90cmF2aXMvdHJhdmlzLWluc3RhbGwuc2gKQEAgLTE1LDEwICsxNSwxMiBAQAogUFlUSE9OX1ZFUlNJT049YGNhdCAvdG1wL3B5dGhvbl92ZXJzaW9uYAogUlVCWV9WRVJTSU9OPWBydWJ5IC12YAogTk9ERUpTX1ZFUlNJT049YG5vZGUgLXZgCitNVk5fVkVSU0lPTj1gbXZuIC12YAogCiBlY2hvICJQeXRob24gdmVyc2lvbiA6ICRQWVRIT05fVkVSU0lPTiIKIGVjaG8gIlJ1YnkgdmVyc2lvbiA6ICRSVUJZX1ZFUlNJT04iCiBlY2hvICJOb2RlSnMgdmVyc2lvbiA6ICROT0RFSlNfVkVSU0lPTiIKK2VjaG8gIm12biB2ZXJzaW9uIDogJE1WTl9WRVJTSU9OIgogCiBTVE9STV9TUkNfUk9PVF9ESVI9JDEKIApAQCAtMjYsMTIgKzI4LDE3IEBACiAKIGNkICR7U1RPUk1fU1JDX1JPT1RfRElSfQogCi1weXRob24gJHtUUkFWSVNfU0NSSVBUX0RJUn0vc2F2ZS1sb2dzLnB5ICJpbnN0YWxsLnR4dCIgbXZuIGNsZWFuIGluc3RhbGwgLS1iYXRjaC1tb2RlIC1Ec2tpcFRlc3RzIC1QbmF0aXZlCitweXRob24gJHtUUkFWSVNfU0NSSVBUX0RJUn0vc2F2ZS1sb2dzLnB5ICJpbnN0YWxsLnR4dCIgbXZuIGNsZWFuIGluc3RhbGwgLURza2lwVGVzdHMgLVBuYXRpdmUgLS1iYXRjaC1tb2RlCiBCVUlMRF9SRVRfVkFMPSQ/CiAKIGlmIFtbICIkQlVJTERfUkVUX1ZBTCIgIT0gIjAiIF1dOwogdGhlbgogICBjYXQgImluc3RhbGwudHh0IgorICBlY2hvICJMb29raW5nIGZvciB1bmFwcHJvdmVkIGxpY2Vuc2VzIgorICBmb3IgcmF0IGluIGBmaW5kIC4gLW5hbWUgcmF0LnR4dGA7CisgIGRvCisgICAgcHl0aG9uICR7VFJBVklTX1NDUklQVF9ESVJ9L3JhdHByaW50LnB5ICIke3JhdH0iCisgIGRvbmUKIGZpCiAKIGV4aXQgJHtCVUlMRF9SRVRfVkFMfQpkaWZmIC0tZ2l0IGEvZGV2LXRvb2xzL3RyYXZpcy90cmF2aXMtc2NyaXB0LnNoIGIvZGV2LXRvb2xzL3RyYXZpcy90cmF2aXMtc2NyaXB0LnNoCmluZGV4IDRjYWZmMTcuLmEzMDJlMjMgMTAwNzU1Ci0tLSBhL2Rldi10b29scy90cmF2aXMvdHJhdmlzLXNjcmlwdC5zaAorKysgYi9kZXYtdG9vbHMvdHJhdmlzL3RyYXZpcy1zY3JpcHQuc2gKQEAgLTE1LDExICsxNSwxMiBAQAogUFlUSE9OX1ZFUlNJT049YGNhdCAvdG1wL3B5dGhvbl92ZXJzaW9uYAogUlVCWV9WRVJTSU9OPWBydWJ5IC12YAogTk9ERUpTX1ZFUlNJT049YG5vZGUgLXZgCitNVk5fVkVSU0lPTj1gbXZuIC12YAogCiBlY2hvICJQeXRob24gdmVyc2lvbiA6ICRQWVRIT05fVkVSU0lPTiIKIGVjaG8gIlJ1YnkgdmVyc2lvbiA6ICRSVUJZX1ZFUlNJT04iCiBlY2hvICJOb2RlSnMgdmVyc2lvbiA6ICROT0RFSlNfVkVSU0lPTiIKLQorZWNobyAibXZuIHZlcnNpb24gOiAkTVZOX1ZFUlNJT04iCiAKIFNUT1JNX1NSQ19ST09UX0RJUj0kMQogCkBAIC0yNywxMSArMjgsMTEgQEAKIAogY2QgJHtTVE9STV9TUkNfUk9PVF9ESVJ9CiAKLSMgV2Ugc2hvdWxkIGNvbmNlcm4gdGhhdCBUcmF2aXMgQ0kgY291bGQgYmUgdmVyeSBzbG93IGNhdXNlIGl0IHVzZXMgVk0KLWV4cG9ydCBTVE9STV9URVNUX1RJTUVPVVRfTVM9MTAwMDAwCisjIFdlIHNob3VsZCBiZSBjb25jZXJuZWQgdGhhdCBUcmF2aXMgQ0kgY291bGQgYmUgdmVyeSBzbG93IGJlY2F1c2UgaXQgdXNlcyBWTQorZXhwb3J0IFNUT1JNX1RFU1RfVElNRU9VVF9NUz0xNTAwMDAKIAogIyBXZSBub3cgbGVhbiBvbiBUcmF2aXMgQ0kncyBpbXBsaWNpdCBiZWhhdmlvciwgYGBgbXZuIGNsZWFuIGluc3RhbGwgLURza2lwVGVzdHNgYGAgYmVmb3JlIHJ1bm5pbmcgc2NyaXB0Ci1tdm4gLS1iYXRjaC1tb2RlIHRlc3QgLWZhZSAtUG5hdGl2ZQorbXZuIC0tYmF0Y2gtbW9kZSB0ZXN0IC1mYWUgLVBuYXRpdmUgLXBsICQyCiBCVUlMRF9SRVRfVkFMPSQ/CiAKIGZvciBkaXIgaW4gYGZpbmQgLiAtdHlwZSBkIC1hbmQgLXdob2xlbmFtZSBcKi90YXJnZXQvXCotcmVwb3J0c2A7CkBAIC00MCw0ICs0MSwxMCBAQAogICBweXRob24gJHtUUkFWSVNfU0NSSVBUX0RJUn0vcHJpbnQtZXJyb3JzLWZyb20tdGVzdC1yZXBvcnRzLnB5ICIke2Rpcn0iCiBkb25lCiAKK2VjaG8gIkxvb2tpbmcgZm9yIHVuYXBwcm92ZWQgbGljZW5zZXMiCitmb3IgcmF0IGluIGBmaW5kIC4gLW5hbWUgcmF0LnR4dGA7CitkbworICBweXRob24gJHtUUkFWSVNfU0NSSVBUX0RJUn0vcmF0cHJpbnQucHkgIiR7cmF0fSIKK2RvbmUKKwogZXhpdCAke0JVSUxEX1JFVF9WQUx9CmRpZmYgLS1naXQgYS9kb2NzL2RvY3VtZW50YXRpb24vRG9jdW1lbnRhdGlvbi5tZCBiL2RvY3MvZG9jdW1lbnRhdGlvbi9Eb2N1bWVudGF0aW9uLm1kCmluZGV4IGYzMjI2OGMuLjcwNDQ2NjQgMTAwNjQ0Ci0tLSBhL2RvY3MvZG9jdW1lbnRhdGlvbi9Eb2N1bWVudGF0aW9uLm1kCisrKyBiL2RvY3MvZG9jdW1lbnRhdGlvbi9Eb2N1bWVudGF0aW9uLm1kCkBAIC00NCw2ICs0NCwxMCBAQAogKiBbSG9va3NdKEhvb2tzLmh0bWwpCiAqIFtNZXRyaWNzXShNZXRyaWNzLmh0bWwpCiAqIFtMaWZlY3ljbGUgb2YgYSB0cmlkZW50IHR1cGxlXSgpCisqIFtVSSBSRVNUIEFQSV0odWktcmVzdC1hcGkuaHRtbCkKKyogW0xvZyBTZWFyY2hdKExvZy1TZWFyY2guaHRtbCkKKyogW0R5bmFtaWMgTG9nIExldmVsIFNldHRpbmdzXShkeW5hbWljLWxvZy1sZXZlbC1zZXR0aW5ncy5odG1sKQorKiBbRHluYW1pYyBXb3JrZXIgUHJvZmlsaW5nXShkeW5hbWljLXdvcmtlci1wcm9maWxpbmcuaHRtbCkKIAogIyMjIEFkdmFuY2VkCiAKZGlmZiAtLWdpdCBhL2RvY3MvZG9jdW1lbnRhdGlvbi9GQVEubWQgYi9kb2NzL2RvY3VtZW50YXRpb24vRkFRLm1kCmluZGV4IGE2OTg2MmUuLjkwMjIyZDEgMTAwNjQ0Ci0tLSBhL2RvY3MvZG9jdW1lbnRhdGlvbi9GQVEubWQKKysrIGIvZG9jcy9kb2N1bWVudGF0aW9uL0ZBUS5tZApAQCAtMTEyLDcgKzExMiw3IEBACiAKICMjIyBIb3cgZG8gSSBhZ2dyZWdhdGUgZXZlbnRzIGJ5IHRpbWU/CiAKLUlmIGhhdmUgcmVjb3JkcyB3aXRoIGFuIGltbXV0YWJsZSB0aW1lc3RhbXAsIGFuZCB5b3Ugd291bGQgbGlrZSB0byBjb3VudCwgYXZlcmFnZSBvciBvdGhlcndpc2UgYWdncmVnYXRlIHRoZW0gaW50byBkaXNjcmV0ZSB0aW1lIGJ1Y2tldHMsIFRyaWRlbnQgaXMgYW4gZXhjZWxsZW50IGFuZCBzY2FsYWJsZSBzb2x1dGlvbi4KK0lmIHlvdSBoYXZlIHJlY29yZHMgd2l0aCBhbiBpbW11dGFibGUgdGltZXN0YW1wLCBhbmQgeW91IHdvdWxkIGxpa2UgdG8gY291bnQsIGF2ZXJhZ2Ugb3Igb3RoZXJ3aXNlIGFnZ3JlZ2F0ZSB0aGVtIGludG8gZGlzY3JldGUgdGltZSBidWNrZXRzLCBUcmlkZW50IGlzIGFuIGV4Y2VsbGVudCBhbmQgc2NhbGFibGUgc29sdXRpb24uCiAKIFdyaXRlIGFuIGBFYWNoYCBmdW5jdGlvbiB0aGF0IHR1cm5zIHRoZSB0aW1lc3RhbXAgaW50byBhIHRpbWUgYnVja2V0OiBpZiB0aGUgYnVja2V0IHNpemUgd2FzICJieSBob3VyIiwgdGhlbiB0aGUgdGltZXN0YW1wIGAyMDEzLTA4LTA4IDEyOjM0OjU2YCB3b3VsZCBiZSBtYXBwZWQgdG8gdGhlIGAyMDEzLTA4LTA4IDEyOjAwOjAwYCB0aW1lIGJ1Y2tldCwgYW5kIHNvIHdvdWxkIGV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgdHdlbHZlIG8nY2xvY2sgaG91ci4gVGhlbiBncm91cCBvbiB0aGF0IHRpbWVidWNrZXQgYW5kIHVzZSBhIGdyb3VwZWQgcGVyc2lzdGVudEFnZ3JlZ2F0ZS4gVGhlIHBlcnNpc3RlbnRBZ2dyZWdhdGUgdXNlcyBhIGxvY2FsIGNhY2hlTWFwIGJhY2tlZCBieSBhIGRhdGEgc3RvcmUuIEdyb3VwcyB3aXRoIG1hbnkgcmVjb3JkcyByZXF1aXJlIHZlcnkgZmV3IHJlYWRzIGZyb20gdGhlIGRhdGEgc3RvcmUsIGFuZCB1c2UgZWZmaWNpZW50IGJ1bGsgcmVhZHMgYW5kIHdyaXRlczsgYXMgbG9uZyBhcyB5b3VyIGRhdGEgZmVlZCBpcyByZWxhdGl2ZWx5IHByb21wdCBUcmlkZW50IHdpbGwgbWFrZSB2ZXJ5IGVmZmljaWVudCB1c2Ugb2YgbWVtb3J5IGFuZCBuZXR3b3JrLiBFdmVuIGlmIGEgc2VydmVyIGRyb3BzIG9mZiBsaW5lIGZvciBhIGRheSwgdGhlbiBkZWxpdmVycyB0aGF0IGZ1bGwgZGF5J3Mgd29ydGggb2YgZGF0YSBpbiBhIHJ1c2gsIHRoZSBvbGQgcmVzdWx0cyB3aWxsIGJlIGNhbG1seSByZXRyaWV2ZWQgYW5kIHVwZGF0ZWQgLS0gYW5kIHdpdGhvdXQgaW50ZXJmZXJpbmcgd2l0aCBjYWxjdWxhdGluZyB0aGUgY3VycmVudCByZXN1bHRzLgogCmRpZmYgLS1naXQgYS9kb2NzL2RvY3VtZW50YXRpb24vTG9nLVNlYXJjaC5tZCBiL2RvY3MvZG9jdW1lbnRhdGlvbi9Mb2ctU2VhcmNoLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMjk3YjcKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2RvY3VtZW50YXRpb24vTG9nLVNlYXJjaC5tZApAQCAtMCwwICsxLDE0IEBACitMb2cgU2VhcmNoCis9PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGlzIGZlYXR1cmUgaXMgYWltZWQgZm9yIGltcHJvdmluZyB0aGUgZGVidWdnaW5nIG9mIFN0b3JtLiBMb2cgU2VhcmNoIHN1cHBvcnRzIHNlYXJjaGluZyBpbiBhIGNlcnRhaW4gbG9nIGZpbGUgb3IgaW4gYSB0b3BvbG9neSdzIGFsbCBsb2cgZmlsZXM6CisKK1VzaW5nIHRoZSBTdG9ybSBVSQorLS0tLS0tLS0tLS0tLQorU3RyaW5nIHNlYXJjaCBpbiBhIGxvZyBmaWxlOiBJbiB0aGUgbG9nIHBhZ2UgZm9yIGEgd29ya2VyLCB1c2VyIGNhbiBzZWFyY2ggYSBjZXJ0YWluIHN0cmluZywgZS5nLiwgIkV4Y2VwdGlvbiIsIGluIGZvciBhIGNlcnRhaW4gd29ya2VyIGxvZy4gVGhpcyBzZWFyY2ggY2FuIGhhcHBlbiBmb3IgYm90aCBub3JtYWwgdGV4dCBsb2cgb3Igcm9sbGVkIHppcGxvZyBmaWxlcy4gSW4gdGhlIHJlc3VsdHMsIHRoZSBvZmZzZXQgYW5kIG1hdGNoZWQgbGluZXMgd2lsbCBiZSBkaXNwbGF5ZWQuCisKKyFbU2VhcmNoIGluIGEgbG9nXShpbWFnZXMvc2VhcmNoLWZvci1hLXNpbmdsZS13b3JrZXItbG9nLnBuZyAiU2VhY2ggaW4gYSBsb2ciKQorCitTZWFyY2ggaW4gYSB0b3BvbG9neTogVXNlciBjYW4gYWxzbyBzZWFyY2ggYSBzdHJpbmcgZm9yIGEgY2VydGFpbiB0b3BvbG9neSBieSBjbGlja2luZyB0aGUgaWNvbiBvZiBtYWduaWZ5aW5nIGxlbnMgYXQgdGhlIHRvcCByaWdodCBjb3JuZXIgb2YgdGhlIFVJIHBhZ2UuIFRoaXMgbWVhbnMgdGhlIFVJIHdpbGwgdHJ5IHRvIHNlYXJjaCBvbiBhbGwgdGhlIHN1cGVydmlzb3Igbm9kZXMgaW4gYSBkaXN0cmlidXRlZCB3YXkgdG8gZmluZCB0aGUgbWF0Y2hlZCBzdHJpbmcgaW4gYWxsIGxvZ3MgZm9yIHRoaXMgdG9wb2xvZ3kuIFRoZSBzZWFyY2ggY2FuIGhhcHBlbiBmb3IgYm90aCBub3JtYWwgdGV4dCBsb2cgb3Igcm9sbGVkIHppcCBsb2cgZmlsZXMgYnkgY2hlY2tpbmcvdW5jaGVja2luZyB0aGUgIlNlYXJjaCBhcmNoaXZlZCBsb2dzOiIgYm94LiBUaGVuIHRoZSBtYXRjaGVkIHJlc3VsdHMgY2FuIGJlIHNob3duIG9uIHRoZSBVSSB3aXRoIHVybCBsaW5rcywgZGlyZWN0aW5nIHVzZXIgdG8gdGhlIGNlcnRhaW4gbG9ncyBvbiBlYWNoIHN1cGVydmlzb3Igbm9kZS4gVGhpcyBwb3dlcmZ1bCBmZWF0dXJlIGlzIHZlcnkgaGVscGZ1bCBmb3IgdXNlcnMgdG8gZmluZCBjZXJ0YWluIHByb2JsZW1hdGljIHN1cGVydmlzb3Igbm9kZXMgcnVubmluZyB0aGlzIHRvcG9sb2d5LgorCishW1NlYWNoIGluIGEgdG9wb2xvZ3ldKGltYWdlcy9zZWFyY2gtYS10b3BvbG9neS5wbmcgIlNlYXJjaCBpbiBhIHRvcG9sb2d5IikKZGlmZiAtLWdpdCBhL2RvY3MvZG9jdW1lbnRhdGlvbi9NZXNzYWdlLXBhc3NpbmctaW1wbGVtZW50YXRpb24ubWQgYi9kb2NzL2RvY3VtZW50YXRpb24vTWVzc2FnZS1wYXNzaW5nLWltcGxlbWVudGF0aW9uLm1kCmluZGV4IGUxN2ZkM2YuLmExN2Y2NmEgMTAwNjQ0Ci0tLSBhL2RvY3MvZG9jdW1lbnRhdGlvbi9NZXNzYWdlLXBhc3NpbmctaW1wbGVtZW50YXRpb24ubWQKKysrIGIvZG9jcy9kb2N1bWVudGF0aW9uL01lc3NhZ2UtcGFzc2luZy1pbXBsZW1lbnRhdGlvbi5tZApAQCAtOCwyMyArOCwyMyBAQAogVGhpcyBwYWdlIHdhbGtzIHRocm91Z2ggaG93IGVtaXR0aW5nIGFuZCB0cmFuc2ZlcnJpbmcgdHVwbGVzIHdvcmtzIGluIFN0b3JtLgogCiAtIFdvcmtlciBpcyByZXNwb25zaWJsZSBmb3IgbWVzc2FnZSB0cmFuc2ZlcgotICAgLSBgcmVmcmVzaC1jb25uZWN0aW9uc2AgaXMgY2FsbGVkIGV2ZXJ5ICJ0YXNrLnJlZnJlc2gucG9sbC5zZWNzIiBvciB3aGVuZXZlciBhc3NpZ25tZW50IGluIFpLIGNoYW5nZXMuIEl0IG1hbmFnZXMgY29ubmVjdGlvbnMgdG8gb3RoZXIgd29ya2VycyBhbmQgbWFpbnRhaW5zIGEgbWFwcGluZyBmcm9tIHRhc2sgLT4gd29ya2VyIFtjb2RlXShodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2luY3ViYXRvci1zdG9ybS9ibG9iLzAuNy4xL3NyYy9jbGovYmFja3R5cGUvc3Rvcm0vZGFlbW9uL3dvcmtlci5jbGojTDEyMykKLSAgIC0gUHJvdmlkZXMgYSAidHJhbnNmZXIgZnVuY3Rpb24iIHRoYXQgaXMgdXNlZCBieSB0YXNrcyB0byBzZW5kIHR1cGxlcyB0byBvdGhlciB0YXNrcy4gVGhlIHRyYW5zZmVyIGZ1bmN0aW9uIHRha2VzIGluIGEgdGFzayBpZCBhbmQgYSB0dXBsZSwgYW5kIGl0IHNlcmlhbGl6ZXMgdGhlIHR1cGxlIGFuZCBwdXRzIGl0IG9udG8gYSAidHJhbnNmZXIgcXVldWUiLiBUaGVyZSBpcyBhIHNpbmdsZSB0cmFuc2ZlciBxdWV1ZSBmb3IgZWFjaCB3b3JrZXIuIFtjb2RlXShodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2luY3ViYXRvci1zdG9ybS9ibG9iLzAuNy4xL3NyYy9jbGovYmFja3R5cGUvc3Rvcm0vZGFlbW9uL3dvcmtlci5jbGojTDU2KQotICAgLSBUaGUgc2VyaWFsaXplciBpcyB0aHJlYWQtc2FmZSBbY29kZV0oaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9pbmN1YmF0b3Itc3Rvcm0vYmxvYi8wLjcuMS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NlcmlhbGl6YXRpb24vS3J5b1R1cGxlU2VyaWFsaXplci5qYXZhI0wyNikKLSAgIC0gVGhlIHdvcmtlciBoYXMgYSBzaW5nbGUgdGhyZWFkIHdoaWNoIGRyYWlucyB0aGUgdHJhbnNmZXIgcXVldWUgYW5kIHNlbmRzIHRoZSBtZXNzYWdlcyB0byBvdGhlciB3b3JrZXJzIFtjb2RlXShodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2luY3ViYXRvci1zdG9ybS9ibG9iLzAuNy4xL3NyYy9jbGovYmFja3R5cGUvc3Rvcm0vZGFlbW9uL3dvcmtlci5jbGojTDE4NSkKLSAgIC0gTWVzc2FnZSBzZW5kaW5nIGhhcHBlbnMgdGhyb3VnaCB0aGlzIHByb3RvY29sOiBbY29kZV0oaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9pbmN1YmF0b3Itc3Rvcm0vYmxvYi8wLjcuMS9zcmMvY2xqL2JhY2t0eXBlL3N0b3JtL21lc3NhZ2luZy9wcm90b2NvbC5jbGopCi0gICAtIFRoZSBpbXBsZW1lbnRhdGlvbiBmb3IgZGlzdHJpYnV0ZWQgbW9kZSB1c2VzIFplcm9NUSBbY29kZV0oaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9pbmN1YmF0b3Itc3Rvcm0vYmxvYi8wLjcuMS9zcmMvY2xqL2JhY2t0eXBlL3N0b3JtL21lc3NhZ2luZy96bXEuY2xqKQotICAgLSBUaGUgaW1wbGVtZW50YXRpb24gZm9yIGxvY2FsIG1vZGUgdXNlcyBpbiBtZW1vcnkgSmF2YSBxdWV1ZXMgKHNvIHRoYXQgaXQncyBlYXN5IHRvIHVzZSBTdG9ybSBsb2NhbGx5IHdpdGhvdXQgbmVlZGluZyB0byBnZXQgWmVyb01RIGluc3RhbGxlZCkgW2NvZGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvaW5jdWJhdG9yLXN0b3JtL2Jsb2IvMC43LjEvc3JjL2Nsai9iYWNrdHlwZS9zdG9ybS9tZXNzYWdpbmcvbG9jYWwuY2xqKQorICAgLSBgcmVmcmVzaC1jb25uZWN0aW9uc2AgaXMgY2FsbGVkIGV2ZXJ5ICJ0YXNrLnJlZnJlc2gucG9sbC5zZWNzIiBvciB3aGVuZXZlciBhc3NpZ25tZW50IGluIFpLIGNoYW5nZXMuIEl0IG1hbmFnZXMgY29ubmVjdGlvbnMgdG8gb3RoZXIgd29ya2VycyBhbmQgbWFpbnRhaW5zIGEgbWFwcGluZyBmcm9tIHRhc2sgLT4gd29ya2VyIFtjb2RlXShodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3N0b3JtL2Jsb2IvMC43LjEvc3JjL2Nsai9iYWNrdHlwZS9zdG9ybS9kYWVtb24vd29ya2VyLmNsaiNMMTIzKQorICAgLSBQcm92aWRlcyBhICJ0cmFuc2ZlciBmdW5jdGlvbiIgdGhhdCBpcyB1c2VkIGJ5IHRhc2tzIHRvIHNlbmQgdHVwbGVzIHRvIG90aGVyIHRhc2tzLiBUaGUgdHJhbnNmZXIgZnVuY3Rpb24gdGFrZXMgaW4gYSB0YXNrIGlkIGFuZCBhIHR1cGxlLCBhbmQgaXQgc2VyaWFsaXplcyB0aGUgdHVwbGUgYW5kIHB1dHMgaXQgb250byBhICJ0cmFuc2ZlciBxdWV1ZSIuIFRoZXJlIGlzIGEgc2luZ2xlIHRyYW5zZmVyIHF1ZXVlIGZvciBlYWNoIHdvcmtlci4gW2NvZGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvc3Rvcm0vYmxvYi8wLjcuMS9zcmMvY2xqL2JhY2t0eXBlL3N0b3JtL2RhZW1vbi93b3JrZXIuY2xqI0w1NikKKyAgIC0gVGhlIHNlcmlhbGl6ZXIgaXMgdGhyZWFkLXNhZmUgW2NvZGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvc3Rvcm0vYmxvYi8wLjcuMS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NlcmlhbGl6YXRpb24vS3J5b1R1cGxlU2VyaWFsaXplci5qYXZhI0wyNikKKyAgIC0gVGhlIHdvcmtlciBoYXMgYSBzaW5nbGUgdGhyZWFkIHdoaWNoIGRyYWlucyB0aGUgdHJhbnNmZXIgcXVldWUgYW5kIHNlbmRzIHRoZSBtZXNzYWdlcyB0byBvdGhlciB3b3JrZXJzIFtjb2RlXShodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3N0b3JtL2Jsb2IvMC43LjEvc3JjL2Nsai9iYWNrdHlwZS9zdG9ybS9kYWVtb24vd29ya2VyLmNsaiNMMTg1KQorICAgLSBNZXNzYWdlIHNlbmRpbmcgaGFwcGVucyB0aHJvdWdoIHRoaXMgcHJvdG9jb2w6IFtjb2RlXShodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3N0b3JtL2Jsb2IvMC43LjEvc3JjL2Nsai9iYWNrdHlwZS9zdG9ybS9tZXNzYWdpbmcvcHJvdG9jb2wuY2xqKQorICAgLSBUaGUgaW1wbGVtZW50YXRpb24gZm9yIGRpc3RyaWJ1dGVkIG1vZGUgdXNlcyBaZXJvTVEgW2NvZGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvc3Rvcm0vYmxvYi8wLjcuMS9zcmMvY2xqL2JhY2t0eXBlL3N0b3JtL21lc3NhZ2luZy96bXEuY2xqKQorICAgLSBUaGUgaW1wbGVtZW50YXRpb24gZm9yIGxvY2FsIG1vZGUgdXNlcyBpbiBtZW1vcnkgSmF2YSBxdWV1ZXMgKHNvIHRoYXQgaXQncyBlYXN5IHRvIHVzZSBTdG9ybSBsb2NhbGx5IHdpdGhvdXQgbmVlZGluZyB0byBnZXQgWmVyb01RIGluc3RhbGxlZCkgW2NvZGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvc3Rvcm0vYmxvYi8wLjcuMS9zcmMvY2xqL2JhY2t0eXBlL3N0b3JtL21lc3NhZ2luZy9sb2NhbC5jbGopCiAtIFJlY2VpdmluZyBtZXNzYWdlcyBpbiB0YXNrcyB3b3JrcyBkaWZmZXJlbnRseSBpbiBsb2NhbCBtb2RlIGFuZCBkaXN0cmlidXRlZCBtb2RlCi0gICAtIEluIGxvY2FsIG1vZGUsIHRoZSB0dXBsZSBpcyBzZW50IGRpcmVjdGx5IHRvIGFuIGluLW1lbW9yeSBxdWV1ZSBmb3IgdGhlIHJlY2VpdmluZyB0YXNrIFtjb2RlXShodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2luY3ViYXRvci1zdG9ybS9ibG9iL21hc3Rlci9zcmMvY2xqL2JhY2t0eXBlL3N0b3JtL21lc3NhZ2luZy9sb2NhbC5jbGojTDIxKQotICAgLSBJbiBkaXN0cmlidXRlZCBtb2RlLCBlYWNoIHdvcmtlciBsaXN0ZW5zIG9uIGEgc2luZ2xlIFRDUCBwb3J0IGZvciBpbmNvbWluZyBtZXNzYWdlcyBhbmQgdGhlbiByb3V0ZXMgdGhvc2UgbWVzc2FnZXMgaW4tbWVtb3J5IHRvIHRhc2tzLiBUaGUgVENQIHBvcnQgaXMgY2FsbGVkIGEgInZpcnR1YWwgcG9ydCIsIGJlY2F1c2UgaXQgcmVjZWl2ZXMgW3Rhc2sgaWQsIG1lc3NhZ2VdIGFuZCB0aGVuIHJvdXRlcyBpdCB0byB0aGUgYWN0dWFsIHRhc2suIFtjb2RlXShodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2luY3ViYXRvci1zdG9ybS9ibG9iL21hc3Rlci9zcmMvY2xqL2JhY2t0eXBlL3N0b3JtL2RhZW1vbi93b3JrZXIuY2xqI0wyMDQpCi0gICAgICAtIFRoZSB2aXJ0dWFsIHBvcnQgaW1wbGVtZW50YXRpb24gaXMgaGVyZTogW2NvZGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvaW5jdWJhdG9yLXN0b3JtL2Jsb2IvbWFzdGVyL3NyYy9jbGovemlsY2gvdmlydHVhbF9wb3J0LmNsaikKLSAgICAgIC0gVGFza3MgbGlzdGVuIG9uIGFuIGluLW1lbW9yeSBaZXJvTVEgcG9ydCBmb3IgbWVzc2FnZXMgZnJvbSB0aGUgdmlydHVhbCBwb3J0IFtjb2RlXShodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2luY3ViYXRvci1zdG9ybS9ibG9iL21hc3Rlci9zcmMvY2xqL2JhY2t0eXBlL3N0b3JtL2RhZW1vbi90YXNrLmNsaiNMMjAxKQotICAgICAgICAtIEJvbHRzIGxpc3RlbiBoZXJlOiBbY29kZV0oaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9pbmN1YmF0b3Itc3Rvcm0vYmxvYi9tYXN0ZXIvc3JjL2Nsai9iYWNrdHlwZS9zdG9ybS9kYWVtb24vdGFzay5jbGojTDQ4OSkKLSAgICAgICAgLSBTcG91dHMgbGlzdGVuIGhlcmU6IFtjb2RlXShodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2luY3ViYXRvci1zdG9ybS9ibG9iL21hc3Rlci9zcmMvY2xqL2JhY2t0eXBlL3N0b3JtL2RhZW1vbi90YXNrLmNsaiNMMzgyKQorICAgLSBJbiBsb2NhbCBtb2RlLCB0aGUgdHVwbGUgaXMgc2VudCBkaXJlY3RseSB0byBhbiBpbi1tZW1vcnkgcXVldWUgZm9yIHRoZSByZWNlaXZpbmcgdGFzayBbY29kZV0oaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9zdG9ybS9ibG9iLzAuNy4xL3NyYy9jbGovYmFja3R5cGUvc3Rvcm0vbWVzc2FnaW5nL2xvY2FsLmNsaiNMMjEpCisgICAtIEluIGRpc3RyaWJ1dGVkIG1vZGUsIGVhY2ggd29ya2VyIGxpc3RlbnMgb24gYSBzaW5nbGUgVENQIHBvcnQgZm9yIGluY29taW5nIG1lc3NhZ2VzIGFuZCB0aGVuIHJvdXRlcyB0aG9zZSBtZXNzYWdlcyBpbi1tZW1vcnkgdG8gdGFza3MuIFRoZSBUQ1AgcG9ydCBpcyBjYWxsZWQgYSAidmlydHVhbCBwb3J0IiwgYmVjYXVzZSBpdCByZWNlaXZlcyBbdGFzayBpZCwgbWVzc2FnZV0gYW5kIHRoZW4gcm91dGVzIGl0IHRvIHRoZSBhY3R1YWwgdGFzay4gW2NvZGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvc3Rvcm0vYmxvYi8wLjcuMS9zcmMvY2xqL2JhY2t0eXBlL3N0b3JtL2RhZW1vbi93b3JrZXIuY2xqI0wyMDQpCisgICAgICAtIFRoZSB2aXJ0dWFsIHBvcnQgaW1wbGVtZW50YXRpb24gaXMgaGVyZTogW2NvZGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvc3Rvcm0vYmxvYi8wLjcuMS9zcmMvY2xqL3ppbGNoL3ZpcnR1YWxfcG9ydC5jbGopCisgICAgICAtIFRhc2tzIGxpc3RlbiBvbiBhbiBpbi1tZW1vcnkgWmVyb01RIHBvcnQgZm9yIG1lc3NhZ2VzIGZyb20gdGhlIHZpcnR1YWwgcG9ydCBbY29kZV0oaHR0cHM6Ly9naXRodWIuY29tL2FwYWNoZS9zdG9ybS9ibG9iLzAuNy4xL3NyYy9jbGovYmFja3R5cGUvc3Rvcm0vZGFlbW9uL3Rhc2suY2xqI0wyMDEpCisgICAgICAgIC0gQm9sdHMgbGlzdGVuIGhlcmU6IFtjb2RlXShodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3N0b3JtL2Jsb2IvMC43LjEvc3JjL2Nsai9iYWNrdHlwZS9zdG9ybS9kYWVtb24vdGFzay5jbGojTDQ4OSkKKyAgICAgICAgLSBTcG91dHMgbGlzdGVuIGhlcmU6IFtjb2RlXShodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3N0b3JtL2Jsb2IvMC43LjEvc3JjL2Nsai9iYWNrdHlwZS9zdG9ybS9kYWVtb24vdGFzay5jbGojTDM4MikKIC0gVGFza3MgYXJlIHJlc3BvbnNpYmxlIGZvciBtZXNzYWdlIHJvdXRpbmcuIEEgdHVwbGUgaXMgZW1pdHRlZCBlaXRoZXIgdG8gYSBkaXJlY3Qgc3RyZWFtICh3aGVyZSB0aGUgdGFzayBpZCBpcyBzcGVjaWZpZWQpIG9yIGEgcmVndWxhciBzdHJlYW0uIEluIGRpcmVjdCBzdHJlYW1zLCB0aGUgbWVzc2FnZSBpcyBvbmx5IHNlbnQgaWYgdGhhdCBib2x0IHN1YnNjcmliZXMgdG8gdGhhdCBkaXJlY3Qgc3RyZWFtLiBJbiByZWd1bGFyIHN0cmVhbXMsIHRoZSBzdHJlYW0gZ3JvdXBpbmcgZnVuY3Rpb25zIGFyZSB1c2VkIHRvIGRldGVybWluZSB0aGUgdGFzayBpZHMgdG8gc2VuZCB0aGUgdHVwbGUgdG8uCi0gIC0gVGFza3MgaGF2ZSBhIHJvdXRpbmcgbWFwIGZyb20ge3N0cmVhbSBpZH0gLT4ge2NvbXBvbmVudCBpZH0gLT4ge3N0cmVhbSBncm91cGluZyBmdW5jdGlvbn0gW2NvZGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvaW5jdWJhdG9yLXN0b3JtL2Jsb2IvbWFzdGVyL3NyYy9jbGovYmFja3R5cGUvc3Rvcm0vZGFlbW9uL3Rhc2suY2xqI0wxOTgpCi0gIC0gVGhlICJ0YXNrcy1mbiIgcmV0dXJucyB0aGUgdGFzayBpZHMgdG8gc2VuZCB0aGUgdHVwbGVzIHRvIGZvciBlaXRoZXIgcmVndWxhciBzdHJlYW0gZW1pdCBvciBkaXJlY3Qgc3RyZWFtIGVtaXQgW2NvZGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvaW5jdWJhdG9yLXN0b3JtL2Jsb2IvbWFzdGVyL3NyYy9jbGovYmFja3R5cGUvc3Rvcm0vZGFlbW9uL3Rhc2suY2xqI0wyMDcpCisgIC0gVGFza3MgaGF2ZSBhIHJvdXRpbmcgbWFwIGZyb20ge3N0cmVhbSBpZH0gLT4ge2NvbXBvbmVudCBpZH0gLT4ge3N0cmVhbSBncm91cGluZyBmdW5jdGlvbn0gW2NvZGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvc3Rvcm0vYmxvYi8wLjcuMS9zcmMvY2xqL2JhY2t0eXBlL3N0b3JtL2RhZW1vbi90YXNrLmNsaiNMMTk4KQorICAtIFRoZSAidGFza3MtZm4iIHJldHVybnMgdGhlIHRhc2sgaWRzIHRvIHNlbmQgdGhlIHR1cGxlcyB0byBmb3IgZWl0aGVyIHJlZ3VsYXIgc3RyZWFtIGVtaXQgb3IgZGlyZWN0IHN0cmVhbSBlbWl0IFtjb2RlXShodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3N0b3JtL2Jsb2IvMC43LjEvc3JjL2Nsai9iYWNrdHlwZS9zdG9ybS9kYWVtb24vdGFzay5jbGojTDIwNykKICAgLSBBZnRlciBnZXR0aW5nIHRoZSBvdXRwdXQgdGFzayBpZHMsIGJvbHRzIGFuZCBzcG91dHMgdXNlIHRoZSB0cmFuc2Zlci1mbiBwcm92aWRlZCBieSB0aGUgd29ya2VyIHRvIGFjdHVhbGx5IHRyYW5zZmVyIHRoZSB0dXBsZXMKLSAgICAgIC0gQm9sdCB0cmFuc2ZlciBjb2RlIGhlcmU6IFtjb2RlXShodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2luY3ViYXRvci1zdG9ybS9ibG9iL21hc3Rlci9zcmMvY2xqL2JhY2t0eXBlL3N0b3JtL2RhZW1vbi90YXNrLmNsaiNMNDI5KQotICAgICAgLSBTcG91dCB0cmFuc2ZlciBjb2RlIGhlcmU6IFtjb2RlXShodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL2luY3ViYXRvci1zdG9ybS9ibG9iL21hc3Rlci9zcmMvY2xqL2JhY2t0eXBlL3N0b3JtL2RhZW1vbi90YXNrLmNsaiNMMzI5KQorICAgICAgLSBCb2x0IHRyYW5zZmVyIGNvZGUgaGVyZTogW2NvZGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9hcGFjaGUvc3Rvcm0vYmxvYi8wLjcuMS9zcmMvY2xqL2JhY2t0eXBlL3N0b3JtL2RhZW1vbi90YXNrLmNsaiNMNDI5KQorICAgICAgLSBTcG91dCB0cmFuc2ZlciBjb2RlIGhlcmU6IFtjb2RlXShodHRwczovL2dpdGh1Yi5jb20vYXBhY2hlL3N0b3JtL2Jsb2IvMC43LjEvc3JjL2Nsai9iYWNrdHlwZS9zdG9ybS9kYWVtb24vdGFzay5jbGojTDMyOSkKZGlmZiAtLWdpdCBhL2RvY3MvZG9jdW1lbnRhdGlvbi9QYWNlbWFrZXIubWQgYi9kb2NzL2RvY3VtZW50YXRpb24vUGFjZW1ha2VyLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ZTNlN2YKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2RvY3VtZW50YXRpb24vUGFjZW1ha2VyLm1kCkBAIC0wLDAgKzEsMTA4IEBACisjIFBhY2VtYWtlcgorCisjIyMgSW50cm9kdWN0aW9uCitQYWNlbWFrZXIgaXMgYSBzdG9ybSBkYWVtb24gZGVzaWduZWQgdG8gcHJvY2VzcyBoZWFydGJlYXRzIGZyb20gd29ya2Vycy4gQXMgU3Rvcm0gaXMgc2NhbGVkIHVwLCBab29LZWVwZXIgYmVnaW5zIHRvIGJlY29tZSBhIGJvdHRsZW5lY2sgZHVlIHRvIGhpZ2ggdm9sdW1lcyBvZiB3cml0ZXMgZnJvbSB3b3JrZXJzIGRvaW5nIGhlYXJ0YmVhdHMuIExvdHMgb2Ygd3JpdGVzIHRvIGRpc2sgYW5kIHRvbyBtdWNoIHRyYWZmaWMgYWNyb3NzIHRoZSBuZXR3b3JrIGlzIGdlbmVyYXRlZCBhcyBab29LZWVwZXIgdHJpZXMgdG8gbWFpbnRhaW4gY29uc2lzdGVuY3kuCisKK0JlY2F1c2UgaGVhcnRiZWF0cyBhcmUgb2YgYW4gZXBoZW1lcmFsIG5hdHVyZSwgdGhleSBkbyBub3QgbmVlZCB0byBiZSBwZXJzaXN0ZWQgdG8gZGlzayBvciBzeW5jZWQgYWNyb3NzIG5vZGVzOyBhbiBpbi1tZW1vcnkgc3RvcmUgd2lsbCBkby4gVGhpcyBpcyB0aGUgcm9sZSBvZiBQYWNlbWFrZXIuIFBhY2VtYWtlciBmdW5jdGlvbnMgYXMgYSBzaW1wbGUgaW4tbWVtb3J5IGtleS92YWx1ZSBzdG9yZSB3aXRoIFpvb0tlZXBlci1saWtlLCBkaXJlY3Rvcnktc3R5bGUga2V5cyBhbmQgYnl0ZSBhcnJheSB2YWx1ZXMuCisKK1RoZSBjb3JyZXNwb25kaW5nIFBhY2VtYWtlciBjbGllbnQgaXMgYSBwbHVnaW4gZm9yIHRoZSBgQ2x1c3RlclN0YXRlYCBpbnRlcmZhY2UsIGBvcmcuYXBhY2hlLnN0b3JtLnBhY2VtYWtlci5wYWNlbWFrZXJfc3RhdGVfZmFjdG9yeWAuIEhlYXJ0YmVhdCBjYWxscyBhcmUgZnVubmVsZWQgYnkgdGhlIGBDbHVzdGVyU3RhdGVgIHByb2R1Y2VkIGJ5IGBwYWNlbWFrZXJfc3RhdGVfZmFjdG9yeWAgaW50byB0aGUgUGFjZW1ha2VyIGRhZW1vbiwgd2hpbGUgb3RoZXIgc2V0L2dldCBvcGVyYXRpb25zIGFyZSBmb3J3YXJkZWQgdG8gWm9vS2VlcGVyLgorCistLS0tLS0KKworIyMjIENvbmZpZ3VyYXRpb24KKworIC0gYHBhY2VtYWtlci5ob3N0YCA6IFRoZSBob3N0IHRoYXQgdGhlIFBhY2VtYWtlciBkYWVtb24gaXMgcnVubmluZyBvbgorIC0gYHBhY2VtYWtlci5wb3J0YCA6IFRoZSBwb3J0IHRoYXQgUGFjZW1ha2VyIHdpbGwgbGlzdGVuIG9uCisgLSBgcGFjZW1ha2VyLm1heC50aHJlYWRzYCA6IE1heGltdW0gbnVtYmVyIG9mIHRocmVhZHMgUGFjZW1ha2VyIGRhZW1vbiB3aWxsIHVzZSB0byBoYW5kbGUgcmVxdWVzdHMuCisgLSBgcGFjZW1ha2VyLmNoaWxkb3B0c2AgOiBBbnkgSlZNIHBhcmFtZXRlcnMgdGhhdCBuZWVkIHRvIGdvIHRvIHRoZSBQYWNlbWFrZXIuICh1c2VkIGJ5IHN0b3JtLWRlcGxveSBwcm9qZWN0KQorIC0gYHBhY2VtYWtlci5hdXRoLm1ldGhvZGAgOiBUaGUgYXV0aGVudGljYXRpb24gbWV0aG9kIHRoYXQgaXMgdXNlZCAobW9yZSBpbmZvIGJlbG93KQorCisjIyMjIEV4YW1wbGUKKworVG8gZ2V0IFBhY2VtYWtlciB1cCBhbmQgcnVubmluZywgc2V0IHRoZSBmb2xsb3dpbmcgb3B0aW9uIGluIHRoZSBjbHVzdGVyIGNvbmZpZyBvbiBhbGwgbm9kZXM6CitgYGAKK3N0b3JtLmNsdXN0ZXIuc3RhdGUuc3RvcmU6ICJvcmcuYXBhY2hlLnN0b3JtLnBhY2VtYWtlci5wYWNlbWFrZXJfc3RhdGVfZmFjdG9yeSIKK2BgYAorCitUaGUgUGFjZW1ha2VyIGhvc3QgYWxzbyBuZWVkcyB0byBiZSBzZXQgb24gYWxsIG5vZGVzOgorYGBgCitwYWNlbWFrZXIuaG9zdDogc29tZWhvc3QubXljb21wYW55LmNvbQorYGBgCisKK0FuZCB0aGVuIHN0YXJ0IGFsbCBvZiB5b3VyIGRhZW1vbnMKKworKGluY2x1ZGluZyBQYWNlbWFrZXIpOgorYGBgCiskIHN0b3JtIHBhY2VtYWtlcgorYGBgCisKK1RoZSBTdG9ybSBjbHVzdGVyIHNob3VsZCBub3cgYmUgcHVzaGluZyBhbGwgd29ya2VyIGhlYXJ0YmVhdHMgdGhyb3VnaCBQYWNlbWFrZXIuCisKKyMjIyBTZWN1cml0eQorCitDdXJyZW50bHkgZGlnZXN0IChwYXNzd29yZC1iYXNlZCkgYW5kIEtlcmJlcm9zIHNlY3VyaXR5IGFyZSBzdXBwb3J0ZWQuIFNlY3VyaXR5IGlzIGN1cnJlbnRseSBvbmx5IGFyb3VuZCByZWFkcywgbm90IHdyaXRlcy4gV3JpdGVzIG1heSBiZSBwZXJmb3JtZWQgYnkgYW55b25lLCB3aGVyZWFzIHJlYWRzIG1heSBvbmx5IGJlIHBlcmZvcm1lZCBieSBhdXRob3JpemVkIGFuZCBhdXRoZW50aWNhdGVkIHVzZXJzLiBUaGlzIGlzIGFuIGFyZWEgZm9yIGZ1dHVyZSBkZXZlbG9wbWVudCwgYXMgaXQgbGVhdmVzIHRoZSBjbHVzdGVyIG9wZW4gdG8gRG9TIGF0dGFja3MsIGJ1dCBpdCBwcmV2ZW50cyBhbnkgc2Vuc2l0aXZlIGluZm9ybWF0aW9uIGZyb20gcmVhY2hpbmcgdW5hdXRob3JpemVkIGV5ZXMsIHdoaWNoIHdhcyB0aGUgbWFpbiBnb2FsLgorCisjIyMjIERpZ2VzdAorVG8gY29uZmlndXJlIGRpZ2VzdCBhdXRoZW50aWNhdGlvbiwgc2V0IGBwYWNlbWFrZXIuYXV0aC5tZXRob2Q6IERJR0VTVGAgaW4gdGhlIGNsdXN0ZXIgY29uZmlnIG9uIHRoZSBub2RlcyBob3N0aW5nIE5pbWJ1cyBhbmQgUGFjZW1ha2VyLgorVGhlIG5vZGVzIG11c3QgYWxzbyBoYXZlIGBqYXZhLnNlY3VyaXR5LmF1dGgubG9naW4uY29uZmlnYCBzZXQgdG8gcG9pbnQgdG8gYSBKQUFTIGNvbmZpZyBmaWxlIGNvbnRhaW5pbmcgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmU6CitgYGAKK1BhY2VtYWtlckRpZ2VzdCB7CisgICAgdXNlcm5hbWU9InNvbWUgdXNlcm5hbWUiCisgICAgcGFzc3dvcmQ9InNvbWUgcGFzc3dvcmQiOworfTsKK2BgYAorCitBbnkgbm9kZSB3aXRoIHRoZXNlIHNldHRpbmdzIGNvbmZpZ3VyZWQgd2lsbCBiZSBhYmxlIHRvIHJlYWQgZnJvbSBQYWNlbWFrZXIuCitXb3JrZXIgbm9kZXMgbmVlZCBub3QgaGF2ZSB0aGVzZSBjb25maWdzIHNldCwgYW5kIG1heSBrZWVwIGBwYWNlbWFrZXIuYXV0aC5tZXRob2Q6IE5PTkVgIHNldCwgc2luY2UgdGhleSBkbyBub3QgbmVlZCB0byByZWFkIGZyb20gdGhlIFBhY2VtYWtlciBkYWVtb24uCisKKyMjIyMgS2VyYmVyb3MKK1RvIGNvbmZpZ3VyZSBLZXJiZXJvcyBhdXRoZW50aWNhdGlvbiwgc2V0IGBwYWNlbWFrZXIuYXV0aC5tZXRob2Q6IEtFUkJFUk9TYCBpbiB0aGUgY2x1c3RlciBjb25maWcgb24gdGhlIG5vZGVzIGhvc3RpbmcgTmltYnVzIGFuZCBQYWNlbWFrZXIuCitUaGUgbm9kZXMgbXVzdCBhbHNvIGhhdmUgYGphdmEuc2VjdXJpdHkuYXV0aC5sb2dpbi5jb25maWdgIHNldCB0byBwb2ludCB0byBhIEpBQVMgY29uZmlnLgorCitUaGUgSkFBUyBjb25maWcgb24gTmltYnVzIG11c3QgbG9vayBzb21ldGhpbmcgbGlrZSB0aGlzOgorYGBgCitQYWNlbWFrZXJDbGllbnQgeworICAgIGNvbS5zdW4uc2VjdXJpdHkuYXV0aC5tb2R1bGUuS3JiNUxvZ2luTW9kdWxlIHJlcXVpcmVkCisgICAgdXNlS2V5VGFiPXRydWUKKyAgICBrZXlUYWI9Ii9ldGMva2V5dGFicy9uaW1idXMua2V5dGFiIgorICAgIHN0b3JlS2V5PXRydWUKKyAgICB1c2VUaWNrZXRDYWNoZT1mYWxzZQorICAgIHNlcnZpY2VOYW1lPSJwYWNlbWFrZXIiCisgICAgcHJpbmNpcGFsPSJuaW1idXNATVkuQ09NUEFOWS5DT00iOworfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAKK2BgYAorCitUaGUgSkFBUyBjb25maWcgb24gUGFjZW1ha2VyIG11c3QgbG9vayBzb21ldGhpbmcgbGlrZSB0aGlzOgorYGBgCitQYWNlbWFrZXJTZXJ2ZXIgeworICAgY29tLnN1bi5zZWN1cml0eS5hdXRoLm1vZHVsZS5LcmI1TG9naW5Nb2R1bGUgcmVxdWlyZWQKKyAgIHVzZUtleVRhYj10cnVlCisgICBrZXlUYWI9Ii9ldGMva2V5dGFicy9wYWNlbWFrZXIua2V5dGFiIgorICAgc3RvcmVLZXk9dHJ1ZQorICAgdXNlVGlja2V0Q2FjaGU9ZmFsc2UKKyAgIHByaW5jaXBhbD0icGFjZW1ha2VyQE1ZLkNPTVBBTlkuQ09NIjsKK307CitgYGAKKworIC0gVGhlIGNsaWVudCdzIHVzZXIgcHJpbmNpcGFsIGluIHRoZSBgUGFjZW1ha2VyQ2xpZW50YCBzZWN0aW9uIG9uIHRoZSBOaW1idXMgaG9zdCBtdXN0IG1hdGNoIHRoZSBgbmltYnVzLmRhZW1vbi51c2VyYCBzdG9ybSBjbHVzdGVyIGNvbmZpZyB2YWx1ZS4KKyAtIFRoZSBjbGllbnQncyBgc2VydmljZU5hbWVgIHZhbHVlIG11c3QgbWF0Y2ggdGhlIHNlcnZlcidzIHVzZXIgcHJpbmNpcGFsIGluIHRoZSBgUGFjZW1ha2VyU2VydmVyYCBzZWN0aW9uIG9uIHRoZSBQYWNlbWFrZXIgaG9zdC4KKworCisjIyMgRmF1bHQgVG9sZXJhbmNlCisKK1BhY2VtYWtlciBydW5zIGFzIGEgc2luZ2xlIGRhZW1vbiBpbnN0YW5jZSwgbWFraW5nIGl0IGEgcG90ZW50aWFsIFNpbmdsZSBQb2ludCBvZiBGYWlsdXJlLgorCitJZiBQYWNlbWFrZXIgYmVjb21lcyB1bnJlYWNoYWJsZSBieSBOaW1idXMsIHRocm91Z2ggY3Jhc2ggb3IgbmV0d29yayBwYXJ0aXRpb24sIHRoZSB3b3JrZXJzIHdpbGwgY29udGludWUgdG8gcnVuLCBhbmQgTmltYnVzIHdpbGwgcmVwZWF0ZWRseSBhdHRlbXB0IHRvIHJlY29ubmVjdC4gTmltYnVzIGZ1bmN0aW9uYWxpdHkgd2lsbCBiZSBkaXNydXB0ZWQsIGJ1dCB0aGUgdG9wb2xvZ2llcyB0aGVtc2VsdmVzIHdpbGwgY29udGludWUgdG8gcnVuLgorSW4gY2FzZSBvZiBwYXJ0aXRpb24gb2YgdGhlIGNsdXN0ZXIgd2hlcmUgTmltYnVzIGFuZCBQYWNlbWFrZXIgYXJlIG9uIHRoZSBzYW1lIHNpZGUgb2YgdGhlIHBhcnRpdGlvbiwgdGhlIHdvcmtlcnMgdGhhdCBhcmUgb24gdGhlIG90aGVyIHNpZGUgb2YgdGhlIHBhcnRpdGlvbiB3aWxsIG5vdCBiZSBhYmxlIHRvIGhlYXJ0YmVhdCwgYW5kIE5pbWJ1cyB3aWxsIHJlc2NoZWR1bGUgdGhlIHRhc2tzIGVsc2V3aGVyZS4gVGhpcyBpcyBwcm9iYWJseSB3aGF0IHdlIHdhbnQgdG8gaGFwcGVuIGFueXdheS4KKworCisjIyMgWm9vS2VlcGVyIENvbXBhcmlzb24KK0NvbXBhcmVkIHRvIFpvb0tlZXBlciwgUGFjZW1ha2VyIHVzZXMgbGVzcyBDUFUsIGxlc3MgbWVtb3J5LCBhbmQgb2YgY291cnNlIG5vIGRpc2sgZm9yIHRoZSBzYW1lIGxvYWQsIHRoYW5rcyB0byBsYWNrIG9mIG92ZXJoZWFkIGZyb20gbWFpbnRhaW5pbmcgY29uc2lzdGVuY3kgYmV0d2VlbiBub2Rlcy4KK09uIEdpZ2FiaXQgbmV0d29ya2luZywgdGhlcmUgaXMgYSB0aGVvcmV0aWNhbCBsaW1pdCBvZiBhYm91dCA2MDAwIG5vZGVzLiBIb3dldmVyLCB0aGUgcmVhbCBsaW1pdCBpcyBsaWtlbHkgYXJvdW5kIDIwMDAtMzAwMCBub2Rlcy4gVGhlc2UgbGltaXRzIGhhdmUgbm90IHlldCBiZWVuIHRlc3RlZC4KK09uIGEgMjcwIHN1cGVydmlzb3IgY2x1c3RlciwgZnVsbHkgc2NoZWR1bGVkIHdpdGggdG9wb2xvZ2llcywgUGFjZW1ha2VyIHJlc291cmNlIHV0aWxpemF0aW9uIHdhcyA3MCUgb2Ygb25lIGNvcmUgYW5kIG5lYXJseSAxR2lCIG9mIFJBTSBvbiBhIG1hY2hpbmUgd2l0aCA0IGBJbnRlbChSKSBYZW9uKFIpIENQVSBFNTUzMCBAIDIuNDBHSHpgIGFuZCAyNEdpQiBvZiBSQU0uCisKKworVGhlcmUgaXMgYW4gZWFzeSByb3V0ZSB0byBIQSBmb3IgUGFjZW1ha2VyLiBVbmxpa2UgWm9vS2VlcGVyLCBQYWNlbWFrZXIgc2hvdWxkIGJlIGFibGUgdG8gc2NhbGUgaG9yaXpvbnRhbGx5IHdpdGhvdXQgb3ZlcmhlYWQuIEJ5IGNvbnRyYXN0LCB3aXRoIFpvb0tlZXBlciwgdGhlcmUgYXJlIGRpbWluaXNoaW5nIHJldHVybnMgd2hlbiBhZGRpbmcgWksgbm9kZXMuCisKK0luIHNob3J0LCBhIHNpbmdsZSBQYWNlbWFrZXIgbm9kZSBzaG91bGQgYmUgYWJsZSB0byBoYW5kbGUgbWFueSB0aW1lcyB0aGUgbG9hZCB0aGF0IGEgWm9vS2VlcGVyIGNsdXN0ZXIgY2FuLCBhbmQgZnV0dXJlIEhBIHdvcmsgYWxsb3dpbmcgaG9yaXpvbnRhbCBzY2FsaW5nIHdpbGwgaW5jcmVhc2UgdGhhdCBldmVuIGZhcnRoZXIuCmRpZmYgLS1naXQgYS9kb2NzL2RvY3VtZW50YXRpb24vU2V0dGluZy11cC1hLVN0b3JtLWNsdXN0ZXIubWQgYi9kb2NzL2RvY3VtZW50YXRpb24vU2V0dGluZy11cC1hLVN0b3JtLWNsdXN0ZXIubWQKaW5kZXggOWZhYmIyNy4uZWU0YWQxNSAxMDA2NDQKLS0tIGEvZG9jcy9kb2N1bWVudGF0aW9uL1NldHRpbmctdXAtYS1TdG9ybS1jbHVzdGVyLm1kCisrKyBiL2RvY3MvZG9jdW1lbnRhdGlvbi9TZXR0aW5nLXVwLWEtU3Rvcm0tY2x1c3Rlci5tZApAQCAtODAsNiArODAsMjUgQEAKICAgICAtIDY3MDMKIGBgYAogCisjIyMgTW9uaXRvcmluZyBIZWFsdGggb2YgU3VwZXJ2aXNvcnMKKworU3Rvcm0gcHJvdmlkZXMgYSBtZWNoYW5pc20gYnkgd2hpY2ggYWRtaW5pc3RyYXRvcnMgY2FuIGNvbmZpZ3VyZSB0aGUgc3VwZXJ2aXNvciB0byBydW4gYWRtaW5pc3RyYXRvciBzdXBwbGllZCBzY3JpcHRzIHBlcmlvZGljYWxseSB0byBkZXRlcm1pbmUgaWYgYSBub2RlIGlzIGhlYWx0aHkgb3Igbm90LiBBZG1pbmlzdHJhdG9ycyBjYW4gaGF2ZSB0aGUgc3VwZXJ2aXNvciBkZXRlcm1pbmUgaWYgdGhlIG5vZGUgaXMgaW4gYSBoZWFsdGh5IHN0YXRlIGJ5IHBlcmZvcm1pbmcgYW55IGNoZWNrcyBvZiB0aGVpciBjaG9pY2UgaW4gc2NyaXB0cyBsb2NhdGVkIGluIHN0b3JtLmhlYWx0aC5jaGVjay5kaXIuIElmIGEgc2NyaXB0IGRldGVjdHMgdGhlIG5vZGUgdG8gYmUgaW4gYW4gdW5oZWFsdGh5IHN0YXRlLCBpdCBtdXN0IHByaW50IGEgbGluZSB0byBzdGFuZGFyZCBvdXRwdXQgYmVnaW5uaW5nIHdpdGggdGhlIHN0cmluZyBFUlJPUi4gVGhlIHN1cGVydmlzb3Igd2lsbCBwZXJpb2RpY2FsbHkgcnVuIHRoZSBzY3JpcHRzIGluIHRoZSBoZWFsdGggY2hlY2sgZGlyIGFuZCBjaGVjayB0aGUgb3V0cHV0LiBJZiB0aGUgc2NyaXB04oCZcyBvdXRwdXQgY29udGFpbnMgdGhlIHN0cmluZyBFUlJPUiwgYXMgZGVzY3JpYmVkIGFib3ZlLCB0aGUgc3VwZXJ2aXNvciB3aWxsIHNodXQgZG93biBhbnkgd29ya2VycyBhbmQgZXhpdC4gCisKK0lmIHRoZSBzdXBlcnZpc29yIGlzIHJ1bm5pbmcgd2l0aCBzdXBlcnZpc2lvbiAiL2Jpbi9zdG9ybSBub2RlLWhlYWx0aC1jaGVjayIgY2FuIGJlIGNhbGxlZCB0byBkZXRlcm1pbmUgaWYgdGhlIHN1cGVydmlzb3Igc2hvdWxkIGJlIGxhdW5jaGVkIG9yIGlmIHRoZSBub2RlIGlzIHVuaGVhbHRoeS4KKworVGhlIGhlYWx0aCBjaGVjayBkaXJlY3RvcnkgbG9jYXRpb24gY2FuIGJlIGNvbmZpZ3VyZWQgd2l0aDoKKworYGBgeWFtbAorc3Rvcm0uaGVhbHRoLmNoZWNrLmRpcjogImhlYWx0aGNoZWNrcyIKKworYGBgCitUaGUgc2NyaXB0cyBtdXN0IGhhdmUgZXhlY3V0ZSBwZXJtaXNzaW9ucy4KK1RoZSB0aW1lIHRvIGFsbG93IGFueSBnaXZlbiBoZWFsdGhjaGVjayBzY3JpcHQgdG8gcnVuIGJlZm9yZSBpdCBpcyBtYXJrZWQgZmFpbGVkIGR1ZSB0byB0aW1lb3V0IGNhbiBiZSBjb25maWd1cmVkIHdpdGg6CisKK2BgYHlhbWwKK3N0b3JtLmhlYWx0aC5jaGVjay50aW1lb3V0Lm1zOiA1MDAwCitgYGAKKwogIyMjIENvbmZpZ3VyZSBleHRlcm5hbCBsaWJyYXJpZXMgYW5kIGVudmlyb25tZW50YWwgdmFyaWFibGVzIChvcHRpb25hbCkKIAogSWYgeW91IG5lZWQgc3VwcG9ydCBmcm9tIGV4dGVybmFsIGxpYnJhcmllcyBvciBjdXN0b20gcGx1Z2lucywgeW91IGNhbiBwbGFjZSBzdWNoIGphcnMgaW50byB0aGUgZXh0bGliLyBhbmQgZXh0bGliLWRhZW1vbi8gZGlyZWN0b3JpZXMuIE5vdGUgdGhhdCB0aGUgZXh0bGliLWRhZW1vbi8gZGlyZWN0b3J5IHN0b3JlcyBqYXJzIHVzZWQgb25seSBieSBkYWVtb25zIChOaW1idXMsIFN1cGVydmlzb3IsIERSUEMsIFVJLCBMb2d2aWV3ZXIpLCBlLmcuLCBIREZTIGFuZCBjdXN0b21pemVkIHNjaGVkdWxpbmcgbGlicmFyaWVzLiBBY2NvcmRpbmdseSwgdHdvIGVudmlyb25tZW50YWwgdmFyaWFibGVzIFNUT1JNX0VYVF9DTEFTU1BBVEggYW5kIFNUT1JNX0VYVF9DTEFTU1BBVEhfREFFTU9OIGNhbiBiZSBjb25maWd1cmVkIGJ5IHVzZXJzIGZvciBpbmNsdWRpbmcgdGhlIGV4dGVybmFsIGNsYXNzcGF0aCBhbmQgZGFlbW9uLW9ubHkgZXh0ZXJuYWwgY2xhc3NwYXRoLgpkaWZmIC0tZ2l0IGEvZG9jcy9kb2N1bWVudGF0aW9uL1dpbmRvd2luZy5tZCBiL2RvY3MvZG9jdW1lbnRhdGlvbi9XaW5kb3dpbmcubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY5ZDc1OAotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvZG9jdW1lbnRhdGlvbi9XaW5kb3dpbmcubWQKQEAgLTAsMCArMSwxNDQgQEAKKyMgV2luZG93aW5nIHN1cHBvcnQgaW4gY29yZSBzdG9ybQorCitTdG9ybSBjb3JlIGhhcyBzdXBwb3J0IGZvciBwcm9jZXNzaW5nIGEgZ3JvdXAgb2YgdHVwbGVzIHRoYXQgZmFsbHMgd2l0aGluIGEgd2luZG93LiBXaW5kb3dzIGFyZSBzcGVjaWZpZWQgd2l0aCB0aGUgCitmb2xsb3dpbmcgdHdvIHBhcmFtZXRlcnMsCisKKzEuIFdpbmRvdyBsZW5ndGggLSB0aGUgbGVuZ3RoIG9yIGR1cmF0aW9uIG9mIHRoZSB3aW5kb3cKKzIuIFNsaWRpbmcgaW50ZXJ2YWwgLSB0aGUgaW50ZXJ2YWwgYXQgd2hpY2ggdGhlIHdpbmRvd2luZyBzbGlkZXMKKworIyMgU2xpZGluZyBXaW5kb3cKKworVHVwbGVzIGFyZSBncm91cGVkIGluIHdpbmRvd3MgYW5kIHdpbmRvdyBzbGlkZXMgZXZlcnkgc2xpZGluZyBpbnRlcnZhbC4gQSB0dXBsZSBjYW4gYmVsb25nIHRvIG1vcmUgdGhhbiBvbmUgd2luZG93LgorCitGb3IgZXhhbXBsZSBhIHRpbWUgZHVyYXRpb24gYmFzZWQgc2xpZGluZyB3aW5kb3cgd2l0aCBsZW5ndGggMTAgc2VjcyBhbmQgc2xpZGluZyBpbnRlcnZhbCBvZiA1IHNlY29uZHMuCisKK2BgYAorfCBlMSBlMiB8IGUzIGU0IGU1IGU2IHwgZTcgZTggZTkgfC4uLgorMCAgICAgICA1ICAgICAgICAgICAgIDEwICAgICAgICAgMTUgICAgLT4gdGltZQorCit8PC0tLS0tLS0gdzEgLS0tLS0tLS0+fAorICAgICAgICB8LS0tLS0tLS0tLS0tIHcyIC0tLS0tLS0+fAorYGBgCisKK1RoZSB3aW5kb3cgaXMgZXZhbHVhdGVkIGV2ZXJ5IDUgc2Vjb25kcyBhbmQgc29tZSBvZiB0aGUgdHVwbGVzIGluIHRoZSBmaXJzdCB3aW5kb3cgb3ZlcmxhcHMgd2l0aCB0aGUgc2Vjb25kIG9uZS4KKwkJCisKKyMjIFR1bWJsaW5nIFdpbmRvdworCitUdXBsZXMgYXJlIGdyb3VwZWQgaW4gYSBzaW5nbGUgd2luZG93IGJhc2VkIG9uIHRpbWUgb3IgY291bnQuIEFueSB0dXBsZSBiZWxvbmdzIHRvIG9ubHkgb25lIG9mIHRoZSB3aW5kb3dzLgorCitGb3IgZXhhbXBsZSBhIHRpbWUgZHVyYXRpb24gYmFzZWQgdHVtYmxpbmcgd2luZG93IHdpdGggbGVuZ3RoIDUgc2Vjcy4KKworYGBgCit8IGUxIGUyIHwgZTMgZTQgZTUgZTYgfCBlNyBlOCBlOSB8Li4uCiswICAgICAgIDUgICAgICAgICAgICAgMTAgICAgICAgICAxNSAgICAtPiB0aW1lCisgICB3MSAgICAgICAgIHcyICAgICAgICAgICAgdzMKK2BgYAorCitUaGUgd2luZG93IGlzIGV2YWx1YXRlZCBldmVyeSBmaXZlIHNlY29uZHMgYW5kIG5vbmUgb2YgdGhlIHdpbmRvd3Mgb3ZlcmxhcC4KKworU3Rvcm0gc3VwcG9ydHMgc3BlY2lmeWluZyB0aGUgd2luZG93IGxlbmd0aCBhbmQgc2xpZGluZyBpbnRlcnZhbHMgYXMgYSBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIHR1cGxlcyBvciBhcyBhIHRpbWUgZHVyYXRpb24uCisKK1RoZSBib2x0IGludGVyZmFjZSBgSVdpbmRvd2VkQm9sdGAgaXMgaW1wbGVtZW50ZWQgYnkgYm9sdHMgdGhhdCBuZWVkcyB3aW5kb3dpbmcgc3VwcG9ydC4KKworYGBgamF2YQorcHVibGljIGludGVyZmFjZSBJV2luZG93ZWRCb2x0IGV4dGVuZHMgSUNvbXBvbmVudCB7CisgICAgdm9pZCBwcmVwYXJlKE1hcCBzdG9ybUNvbmYsIFRvcG9sb2d5Q29udGV4dCBjb250ZXh0LCBPdXRwdXRDb2xsZWN0b3IgY29sbGVjdG9yKTsKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHR1cGxlcyBmYWxsaW5nIHdpdGhpbiB0aGUgd2luZG93IGFuZCBvcHRpb25hbGx5IGVtaXQgCisgICAgICogbmV3IHR1cGxlcyBiYXNlZCBvbiB0aGUgdHVwbGVzIGluIHRoZSBpbnB1dCB3aW5kb3cuCisgICAgICovCisgICAgdm9pZCBleGVjdXRlKFR1cGxlV2luZG93IGlucHV0V2luZG93KTsKKyAgICB2b2lkIGNsZWFudXAoKTsKK30KK2BgYAorCitFdmVyeSB0aW1lIHRoZSB3aW5kb3cgYWN0aXZhdGVzLCB0aGUgYGV4ZWN1dGVgIG1ldGhvZCBpcyBpbnZva2VkLiBUaGUgVHVwbGVXaW5kb3cgcGFyYW1ldGVyIGdpdmVzIGFjY2VzcyB0byB0aGUgY3VycmVudCB0dXBsZXMKK2luIHRoZSB3aW5kb3csIHRoZSB0dXBsZXMgdGhhdCBleHBpcmVkIGFuZCB0aGUgbmV3IHR1cGxlcyB0aGF0IGFyZSBhZGRlZCBzaW5jZSBsYXN0IHdpbmRvdyB3YXMgY29tcHV0ZWQgd2hpY2ggd2lsbCBiZSB1c2VmdWwgCitmb3IgZWZmaWNpZW50IHdpbmRvd2luZyBjb21wdXRhdGlvbnMuCisKK0JvbHRzIHRoYXQgbmVlZHMgd2luZG93aW5nIHN1cHBvcnQgdHlwaWNhbGx5IHdvdWxkIGV4dGVuZCBgQmFzZVdpbmRvd2VkQm9sdGAgd2hpY2ggaGFzIHRoZSBhcGlzIGZvciBzcGVjaWZ5aW5nIHRoZQord2luZG93IGxlbmd0aCBhbmQgc2xpZGluZyBpbnRlcnZhbHMuCisKK0UuZy4gCisKK2BgYGphdmEKK3B1YmxpYyBjbGFzcyBTbGlkaW5nV2luZG93Qm9sdCBleHRlbmRzIEJhc2VXaW5kb3dlZEJvbHQgeworCXByaXZhdGUgT3V0cHV0Q29sbGVjdG9yIGNvbGxlY3RvcjsKKwkKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBwcmVwYXJlKE1hcCBzdG9ybUNvbmYsIFRvcG9sb2d5Q29udGV4dCBjb250ZXh0LCBPdXRwdXRDb2xsZWN0b3IgY29sbGVjdG9yKSB7CisgICAgCXRoaXMuY29sbGVjdG9yID0gY29sbGVjdG9yOworICAgIH0KKwkKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKFR1cGxlV2luZG93IGlucHV0V2luZG93KSB7CisJICBmb3IoVHVwbGUgdHVwbGU6IGlucHV0V2luZG93LmdldCgpKSB7CisJICAgIC8vIGRvIHRoZSB3aW5kb3dpbmcgY29tcHV0YXRpb24KKwkJLi4uCisJICB9CisJICAvLyBlbWl0IHRoZSByZXN1bHRzCisJICBjb2xsZWN0b3IuZW1pdChuZXcgVmFsdWVzKGNvbXB1dGVkVmFsdWUpKTsKKyAgICB9Cit9CisKK3B1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICBUb3BvbG9neUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBUb3BvbG9neUJ1aWxkZXIoKTsKKyAgICAgYnVpbGRlci5zZXRTcG91dCgic3BvdXQiLCBuZXcgUmFuZG9tU2VudGVuY2VTcG91dCgpLCAxKTsKKyAgICAgYnVpbGRlci5zZXRCb2x0KCJzbGlkaW5nd2luZG93Ym9sdCIsIAorICAgICAgICAgICAgICAgICAgICAgbmV3IFNsaWRpbmdXaW5kb3dCb2x0KCkud2l0aFdpbmRvdyhuZXcgQ291bnQoMzApLCBuZXcgQ291bnQoMTApKSwKKyAgICAgICAgICAgICAgICAgICAgIDEpLnNodWZmbGVHcm91cGluZygic3BvdXQiKTsKKyAgICBDb25maWcgY29uZiA9IG5ldyBDb25maWcoKTsKKyAgICBjb25mLnNldERlYnVnKHRydWUpOworICAgIGNvbmYuc2V0TnVtV29ya2VycygxKTsKKworICAgIFN0b3JtU3VibWl0dGVyLnN1Ym1pdFRvcG9sb2d5V2l0aFByb2dyZXNzQmFyKGFyZ3NbMF0sIGNvbmYsIGJ1aWxkZXIuY3JlYXRlVG9wb2xvZ3koKSk7CisJCit9CitgYGAKKworVGhlIGZvbGxvd2luZyB3aW5kb3cgY29uZmlndXJhdGlvbnMgYXJlIHN1cHBvcnRlZC4KKworYGBgamF2YQord2l0aFdpbmRvdyhDb3VudCB3aW5kb3dMZW5ndGgsIENvdW50IHNsaWRpbmdJbnRlcnZhbCkKK1R1cGxlIGNvdW50IGJhc2VkIHNsaWRpbmcgd2luZG93IHRoYXQgc2xpZGVzIGFmdGVyIGBzbGlkaW5nSW50ZXJ2YWxgIG51bWJlciBvZiB0dXBsZXMuCisKK3dpdGhXaW5kb3coQ291bnQgd2luZG93TGVuZ3RoKQorVHVwbGUgY291bnQgYmFzZWQgd2luZG93IHRoYXQgc2xpZGVzIHdpdGggZXZlcnkgaW5jb21pbmcgdHVwbGUuCisKK3dpdGhXaW5kb3coQ291bnQgd2luZG93TGVuZ3RoLCBEdXJhdGlvbiBzbGlkaW5nSW50ZXJ2YWwpCitUdXBsZSBjb3VudCBiYXNlZCBzbGlkaW5nIHdpbmRvdyB0aGF0IHNsaWRlcyBhZnRlciBgc2xpZGluZ0ludGVydmFsYCB0aW1lIGR1cmF0aW9uLgorCit3aXRoV2luZG93KER1cmF0aW9uIHdpbmRvd0xlbmd0aCwgRHVyYXRpb24gc2xpZGluZ0ludGVydmFsKQorVGltZSBkdXJhdGlvbiBiYXNlZCBzbGlkaW5nIHdpbmRvdyB0aGF0IHNsaWRlcyBhZnRlciBgc2xpZGluZ0ludGVydmFsYCB0aW1lIGR1cmF0aW9uLgorCit3aXRoV2luZG93KER1cmF0aW9uIHdpbmRvd0xlbmd0aCkKK1RpbWUgZHVyYXRpb24gYmFzZWQgd2luZG93IHRoYXQgc2xpZGVzIHdpdGggZXZlcnkgaW5jb21pbmcgdHVwbGUuCisKK3dpdGhXaW5kb3coRHVyYXRpb24gd2luZG93TGVuZ3RoLCBDb3VudCBzbGlkaW5nSW50ZXJ2YWwpCitUaW1lIGR1cmF0aW9uIGJhc2VkIHNsaWRpbmcgd2luZG93IGNvbmZpZ3VyYXRpb24gdGhhdCBzbGlkZXMgYWZ0ZXIgYHNsaWRpbmdJbnRlcnZhbGAgbnVtYmVyIG9mIHR1cGxlcy4KKword2l0aFR1bWJsaW5nV2luZG93KEJhc2VXaW5kb3dlZEJvbHQuQ291bnQgY291bnQpCitDb3VudCBiYXNlZCB0dW1ibGluZyB3aW5kb3cgdGhhdCB0dW1ibGVzIGFmdGVyIHRoZSBzcGVjaWZpZWQgY291bnQgb2YgdHVwbGVzLgorCit3aXRoVHVtYmxpbmdXaW5kb3coQmFzZVdpbmRvd2VkQm9sdC5EdXJhdGlvbiBkdXJhdGlvbikKK1RpbWUgZHVyYXRpb24gYmFzZWQgdHVtYmxpbmcgd2luZG93IHRoYXQgdHVtYmxlcyBhZnRlciB0aGUgc3BlY2lmaWVkIHRpbWUgZHVyYXRpb24uCisKK2BgYAorCisjIyBHdWFyZW50ZWVzCitUaGUgd2luZG93aW5nIGZ1bmN0aW9uYWxpdHkgaW4gc3Rvcm0gY29yZSBjdXJyZW50bHkgcHJvdmlkZXMgYXQtbGVhc3Qgb25jZSBndWFyZW50ZWUuIFRoZSB2YWx1ZXMgZW1pdHRlZCBmcm9tIHRoZSBib2x0cworYGV4ZWN1dGUoVHVwbGVXaW5kb3cgaW5wdXRXaW5kb3cpYCBtZXRob2QgYXJlIGF1dG9tYXRpY2FsbHkgYW5jaG9yZWQgdG8gYWxsIHRoZSB0dXBsZXMgaW4gdGhlIGlucHV0V2luZG93LiBUaGUgZG93bnN0cmVhbQorYm9sdHMgYXJlIGV4cGVjdGVkIHRvIGFjayB0aGUgcmVjZWl2ZWQgdHVwbGUgKGkuZSB0aGUgdHVwbGUgZW1pdHRlZCBmcm9tIHRoZSB3aW5kb3dlZCBib2x0KSB0byBjb21wbGV0ZSB0aGUgdHVwbGUgdHJlZS4gCitJZiBub3QgdGhlIHR1cGxlcyB3aWxsIGJlIHJlcGxheWVkIGFuZCB0aGUgd2luZG93aW5nIGNvbXB1dGF0aW9uIHdpbGwgYmUgcmUtZXZhbHVhdGVkLiAKKworVGhlIHR1cGxlcyBpbiB0aGUgd2luZG93IGFyZSBhdXRvbWF0aWNhbGx5IGFja2VkIHdoZW4gdGhlIGV4cGlyZSwgaS5lLiB3aGVuIHRoZXkgZmFsbCBvdXQgb2YgdGhlIHdpbmRvdyBhZnRlciAKK2B3aW5kb3dMZW5ndGggKyBzbGlkaW5nSW50ZXJ2YWxgLiBOb3RlIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gYHRvcG9sb2d5Lm1lc3NhZ2UudGltZW91dC5zZWNzYCBzaG91bGQgYmUgc3VmZmljaWVudGx5IG1vcmUgCit0aGFuIGB3aW5kb3dMZW5ndGggKyBzbGlkaW5nSW50ZXJ2YWxgIGZvciB0aW1lIGJhc2VkIHdpbmRvd3M7IG90aGVyd2lzZSB0aGUgdHVwbGVzIHdpbGwgdGltZW91dCBhbmQgZ2V0IHJlcGxheWVkIGFuZCBjYW4gcmVzdWx0CitpbiBkdXBsaWNhdGUgZXZhbHVhdGlvbnMuIEZvciBjb3VudCBiYXNlZCB3aW5kb3dzLCB0aGUgY29uZmlndXJhdGlvbiBzaG91bGQgYmUgYWRqdXN0ZWQgc3VjaCB0aGF0IGB3aW5kb3dMZW5ndGggKyBzbGlkaW5nSW50ZXJ2YWxgCit0dXBsZXMgY2FuIGJlIHJlY2VpdmVkIHdpdGhpbiB0aGUgdGltZW91dCBwZXJpb2QuCisKKyMjIEV4YW1wbGUgdG9wb2xvZ3kKK0FuIGV4YW1wbGUgdG9wbG9neSBgU2xpZGluZ1dpbmRvd1RvcG9sb2d5YCBzaG93cyBob3cgdG8gdXNlIHRoZSBhcGlzIHRvIGNvbXB1dGUgYSBzbGlkaW5nIHdpbmRvdyBzdW0gYW5kIGEgdHVtYmxpbmcgd2luZG93IAorYXZlcmFnZS4KKwpkaWZmIC0tZ2l0IGEvZG9jcy9kb2N1bWVudGF0aW9uL2R5bmFtaWMtbG9nLWxldmVsLXNldHRpbmdzLm1kIGIvZG9jcy9kb2N1bWVudGF0aW9uL2R5bmFtaWMtbG9nLWxldmVsLXNldHRpbmdzLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzOGI3MDgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2RvY3VtZW50YXRpb24vZHluYW1pYy1sb2ctbGV2ZWwtc2V0dGluZ3MubWQKQEAgLTAsMCArMSw0MSBAQAorRHluYW1pYyBMb2cgTGV2ZWwgU2V0dGluZ3MKKz09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1dlIGhhdmUgYWRkZWQgdGhlIGFiaWxpdHkgdG8gc2V0IGxvZyBsZXZlbCBzZXR0aW5ncyBmb3IgYSBydW5uaW5nIHRvcG9sb2d5IHVzaW5nIHRoZSBTdG9ybSBVSSBhbmQgdGhlIFN0b3JtIENMSS4gCisKK1RoZSBsb2cgbGV2ZWwgc2V0dGluZ3MgYXBwbHkgdGhlIHNhbWUgd2F5IGFzIHlvdSdkIGV4cGVjdCBmcm9tIGxvZzRqLCBhcyBhbGwgd2UgYXJlIGRvaW5nIGlzIHRlbGxpbmcgbG9nNGogdG8gc2V0IHRoZSBsZXZlbCBvZiB0aGUgbG9nZ2VyIHlvdSBwcm92aWRlLiBJZiB5b3Ugc2V0IHRoZSBsb2cgbGV2ZWwgb2YgYSBwYXJlbnQgbG9nZ2VyLCB0aGUgY2hpbGRyZW4gbG9nZ2VycyBzdGFydCB1c2luZyB0aGF0IGxldmVsICh1bmxlc3MgdGhlIGNoaWxkcmVuIGhhdmUgYSBtb3JlIHJlc3RyaWN0aXZlIGxldmVsIGFscmVhZHkpLiBBIHRpbWVvdXQgY2FuIG9wdGlvbmFsbHkgYmUgcHJvdmlkZWQgKGV4Y2VwdCBmb3IgREVCVUcgbW9kZSwgd2hlcmUgaXTigJlzIHJlcXVpcmVkIGluIHRoZSBVSSksIGlmIHdvcmtlcnMgc2hvdWxkIHJlc2V0IGxvZyBsZXZlbHMgYXV0b21hdGljYWxseS4KKworVGhpcyByZXZlcnQgYWN0aW9uIGlzIHRyaWdnZXJlZCB1c2luZyBhIHBvbGxpbmcgbWVjaGFuaXNtIChldmVyeSAzMCBzZWNvbmRzLCBidXQgdGhpcyBpcyBjb25maWd1cmFibGUpLCBzbyB5b3Ugc2hvdWxkIGV4cGVjdCB5b3VyIHRpbWVvdXRzIHRvIGJlIHRoZSB2YWx1ZSB5b3UgcHJvdmlkZWQgcGx1cyBhbnl3aGVyZSBiZXR3ZWVuIDAgYW5kIHRoZSBzZXR0aW5nJ3MgdmFsdWUuCisKK1VzaW5nIHRoZSBTdG9ybSBVSQorLS0tLS0tLS0tLS0tLQorCitJbiBvcmRlciB0byBzZXQgYSBsZXZlbCwgY2xpY2sgb24gYSBydW5uaW5nIHRvcG9sb2d5LCBhbmQgdGhlbiBjbGljayBvbiDigJxDaGFuZ2UgTG9nIExldmVs4oCdIGluIHRoZSBUb3BvbG9neSBBY3Rpb25zIHNlY3Rpb24uCisKKyFbQ2hhbmdlIExvZyBMZXZlbCBkaWFsb2ddKGltYWdlcy9keW5hbWljX2xvZ19sZXZlbF9zZXR0aW5nc18xLnBuZyAiQ2hhbmdlIExvZyBMZXZlbCBkaWFsb2ciKQorCitOZXh0LCBwcm92aWRlIHRoZSBsb2dnZXIgbmFtZSwgc2VsZWN0IHRoZSBsZXZlbCB5b3UgZXhwZWN0IChlLmcuIFdBUk4pLCBhbmQgYSB0aW1lb3V0IGluIHNlY29uZHMgKG9yIDAgaWYgbm90IG5lZWRlZCkuIFRoZW4gY2xpY2sgb24g4oCcQWRk4oCdLgorCishW0FmdGVyIGFkZGluZyBhIGxvZyBsZXZlbCBzZXR0aW5nXShpbWFnZXMvZHluYW1pY19sb2dfbGV2ZWxfc2V0dGluZ3NfMi5wbmcgIkFmdGVyIGFkZGluZyBhIGxvZyBsZXZlbCBzZXR0aW5nIikKKworVG8gY2xlYXIgdGhlIGxvZyBsZXZlbCBjbGljayBvbiB0aGUg4oCcQ2xlYXLigJ0gYnV0dG9uLiBUaGlzIHJldmVydHMgdGhlIGxvZyBsZXZlbCBiYWNrIHRvIHdoYXQgaXQgd2FzIGJlZm9yZSB5b3UgYWRkZWQgdGhlIHNldHRpbmcuIFRoZSBsb2cgbGV2ZWwgbGluZSB3aWxsIGRpc2FwcGVhciBmcm9tIHRoZSBVSS4KKworV2hpbGUgdGhlcmUgaXMgYSBkZWxheSByZXNldHRpbmcgbG9nIGxldmVscyBiYWNrLCBzZXR0aW5nIHRoZSBsb2cgbGV2ZWwgaW4gdGhlIGZpcnN0IHBsYWNlIGlzIGltbWVkaWF0ZSAob3IgYXMgcXVpY2tseSBhcyB0aGUgbWVzc2FnZSBjYW4gdHJhdmVsIGZyb20gdGhlIFVJL0NMSSB0byB0aGUgd29ya2VycyBieSB3YXkgb2YgbmltYnVzIGFuZCB6b29rZWVwZXIpLgorCitVc2luZyB0aGUgQ0xJCistLS0tLS0tLS0tLS0tCisKK1VzaW5nIHRoZSBDTEksIGlzc3VlIHRoZSBjb21tYW5kOgorCitgLi9iaW4vc3Rvcm0gc2V0X2xvZ19sZXZlbCBbdG9wb2xvZ3kgbmFtZV0gLWwgW2xvZ2dlciBuYW1lXT1bTEVWRUxdOltUSU1FT1VUXWAKKworRm9yIGV4YW1wbGU6CisKK2AuL2Jpbi9zdG9ybSBzZXRfbG9nX2xldmVsIG15X3RvcG9sb2d5IC1sIFJPT1Q9REVCVUc6MzBgCisKK1NldHMgdGhlIFJPT1QgbG9nZ2VyIHRvIERFQlVHIGZvciAzMCBzZWNvbmRzLgorCitgLi9iaW4vc3Rvcm0gc2V0X2xvZ19sZXZlbCBteV90b3BvbG9neSAtciBST09UYAorCitDbGVhcnMgdGhlIFJPT1QgbG9nZ2VyIGR5bmFtaWMgbG9nIGxldmVsLCByZXNldHRpbmcgaXQgdG8gaXRzIG9yaWdpbmFsIHZhbHVlLgorCmRpZmYgLS1naXQgYS9kb2NzL2RvY3VtZW50YXRpb24vZHluYW1pYy13b3JrZXItcHJvZmlsaW5nLm1kIGIvZG9jcy9kb2N1bWVudGF0aW9uL2R5bmFtaWMtd29ya2VyLXByb2ZpbGluZy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmM4ZGEzCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9kb2N1bWVudGF0aW9uL2R5bmFtaWMtd29ya2VyLXByb2ZpbGluZy5tZApAQCAtMCwwICsxLDI5IEBACitEeW5hbWljIFdvcmtlciBQcm9maWxpbmcKKz09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0luIG11bHRpLXRlbmFudCBtb2RlLCBzdG9ybSBsYXVuY2hlcyBsb25nLXJ1bm5pbmcgSlZNcyBhY3Jvc3MgY2x1c3RlciB3aXRob3V0IHN1ZG8gYWNjZXNzIHRvIHVzZXIuIFNlbGYtc2VydmluZyBvZiBKYXZhIGhlYXAtZHVtcHMsIGpzdGFja3MgYW5kIGphdmEgcHJvZmlsaW5nIG9mIHRoZXNlIEpWTXMgd291bGQgaW1wcm92ZSB1c2VycycgYWJpbGl0eSB0byBhbmFseXplIGFuZCBkZWJ1ZyBpc3N1ZXMgd2hlbiBtb25pdG9yaW5nIGl0IGFjdGl2ZWx5LgorCitUaGUgc3Rvcm0gZHluYW1pYyBwcm9maWxlciBsZXRzIHlvdSBkeW5hbWljYWxseSB0YWtlIGhlYXAtZHVtcHMsIGpwcm9maWxlIG9yIGpzdGFjayBmb3IgYSB3b3JrZXIganZtIHJ1bm5pbmcgb24gc3RvY2sgY2x1c3Rlci4gSXQgbGV0IHVzZXIgZG93bmxvYWQgdGhlc2UgZHVtcHMgZnJvbSB0aGUgYnJvd3NlciBhbmQgdXNlIHlvdXIgZmF2b3JpdGUgdG9vbHMgdG8gYW5hbHl6ZSBpdCAgVGhlIFVJIGNvbXBvbmVudCBwYWdlIHByb3ZpZGVzIGxpc3Qgd29ya2VycyBmb3IgdGhlIGNvbXBvbmVudCBhbmQgYWN0aW9uIGJ1dHRvbnMuIFRoZSBsb2d2aWV3ZXIgbGV0cyB5b3UgZG93bmxvYWQgdGhlIGR1bXBzIGdlbmVyYXRlZCBieSB0aGVzZSBsb2dzLiBQbGVhc2Ugc2VlIHRoZSBzY3JlZW5zaG90cyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKworVXNpbmcgdGhlIFN0b3JtIFVJCistLS0tLS0tLS0tLS0tCisKK0luIG9yZGVyIHRvIHJlcXVlc3QgZm9yIGhlYXAtZHVtcCwganN0YWNrLCBzdGFydC9zdG9wL2R1bXAganByb2ZpbGUgb3IgcmVzdGFydCBhIHdvcmtlciwgY2xpY2sgb24gYSBydW5uaW5nIHRvcG9sb2d5LCB0aGVuIGNsaWNrIG9uIHNwZWNpZmljIGNvbXBvbmVudCwgdGhlbiB5b3UgY2FuIHNlbGVjdCB3b3JrZXIgZnJvbSB0aGUgZHJvcGRvd24gZm9yIHRoYXQgcGFydGljdWxhciBjb21wb25lbnQgYW5kIHRoZW4gY2xpY2sgb24g4oCcU3RhcnQiLCJIZWFwIiwgIkpzdGFjayIgb3IgIlJlc3RhcnQgV29ya2VyIiBpbiB0aGUgIlByb2ZpaW5nIGFuZCBEZWJ1Z2dpbmciIHNlY3Rpb24uCisKKyFbUHJvZmlsaW5nIGFuZCBEZWJ1Z2dpbmddKGltYWdlcy9keW5hbWljX3Byb2ZpbGluZ19kZWJ1Z2dpbmdfMS5wbmcgIlByb2ZpbGluZyBhbmQgRGVidWdnaW5nIikKKworRm9yIHN0YXJ0IGpwcm9maWxlLCBwcm92aWRlIGEgdGltZW91dCBpbiBtaW51dGVzIChvciAxMCBpZiBub3QgbmVlZGVkKS4gVGhlbiBjbGljayBvbiDigJxTdGFydOKAnS4KKworIVtBZnRlciBzdGFydGluZyBqcHJvZmlsZSBmb3Igd29ya2VyXShpbWFnZXMvZHluYW1pY19wcm9maWxpbmdfZGVidWdnaW5nXzIucG5nICJBZnRlciBqcHJvZmlsZSBmb3Igd29ya2VyICIpCisKK1RvIHN0b3AgdGhlIGpwcm9maWxlIGxvZ2dpbmcgY2xpY2sgb24gdGhlIOKAnFN0b3DigJ0gYnV0dG9uLiBUaGlzIGR1bXBzIHRoZSBqcHJvZmlsZSBzdGF0cyBhbmQgc3RvcHMgdGhlIHByb2ZpbGluZy4gUmVmcmVzaCB0aGUgcGFnZSBmb3IgdGhlIGxpbmUgdG8gZGlzYXBwZWFyIGZyb20gdGhlIFVJLgorCitDbGljayBvbiAiTXkgRHVtcCBGaWxlcyIgdG8gZ28gdGhlIGxvZ3ZpZXdlciBVSSBmb3IgbGlzdCBvZiB3b3JrZXIgc3BlY2lmaWMgZHVtcCBmaWxlcy4KKworIVtEdW1wIEZpbGVzIExpbmtzIGZvciB3b3JrZXJdKGltYWdlcy9keW5hbWljX3Byb2ZpbGluZ19kZWJ1Z2dpbmdfMy5wbmcgIkR1bXAgRmlsZXMgTGlua3MgZm9yIHdvcmtlciIpCisKK0NvbmZpZ3VyYXRpb24KKy0tLS0tLS0tLS0tLS0KKworVGhlICJ3b3JrZXIucHJvZmlsZXIuY29tbWFuZCIgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gcG9pbnQgdG8gc3BlY2lmaWMgcGx1Z2dhYmxlIHByb2ZpbGVyLCBoZWFwZHVtcCBjb21tYW5kcy4gVGhlICJ3b3JrZXIucHJvZmlsZXIuZW5hYmxlZCIgY2FuIGJlIGRpc2FibGVkIGlmIHBsdWdpbiBpcyBub3QgYXZhaWxhYmxlIG9yIGpkayBkb2VzIG5vdCBzdXBwb3J0IEpwcm9maWxlIGZsaWdodCByZWNvcmRpbmcgc28gdGhhdCB3b3JrZXIgSlZNIG9wdGlvbnMgd2lsbCBub3QgaGF2ZSAid29ya2VyLnByb2ZpbGVyLmNoaWxkb3B0cyIuIFRvIHVzZSBkaWZmZXJlbnQgcHJvZmlsZXIgcGx1Z2luLCB5b3UgY2FuIGNoYW5nZSB0aGVzZSBjb25maWd1cmF0aW9uLgorCmRpZmYgLS1naXQgYS9kb2NzL2RvY3VtZW50YXRpb24vaW1hZ2VzL2R5bmFtaWNfbG9nX2xldmVsX3NldHRpbmdzXzEucG5nIGIvZG9jcy9kb2N1bWVudGF0aW9uL2ltYWdlcy9keW5hbWljX2xvZ19sZXZlbF9zZXR0aW5nc18xLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWQ0MmU3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9kb2N1bWVudGF0aW9uL2ltYWdlcy9keW5hbWljX2xvZ19sZXZlbF9zZXR0aW5nc18xLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2RvY3VtZW50YXRpb24vaW1hZ2VzL2R5bmFtaWNfbG9nX2xldmVsX3NldHRpbmdzXzIucG5nIGIvZG9jcy9kb2N1bWVudGF0aW9uL2ltYWdlcy9keW5hbWljX2xvZ19sZXZlbF9zZXR0aW5nc18yLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGU2MWE3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9kb2N1bWVudGF0aW9uL2ltYWdlcy9keW5hbWljX2xvZ19sZXZlbF9zZXR0aW5nc18yLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2RvY3VtZW50YXRpb24vaW1hZ2VzL2R5bmFtaWNfcHJvZmlsaW5nX2RlYnVnZ2luZ18xLnBuZyBiL2RvY3MvZG9jdW1lbnRhdGlvbi9pbWFnZXMvZHluYW1pY19wcm9maWxpbmdfZGVidWdnaW5nXzEucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MTNlODYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2RvY3VtZW50YXRpb24vaW1hZ2VzL2R5bmFtaWNfcHJvZmlsaW5nX2RlYnVnZ2luZ18xLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2RvY3VtZW50YXRpb24vaW1hZ2VzL2R5bmFtaWNfcHJvZmlsaW5nX2RlYnVnZ2luZ18yLnBuZyBiL2RvY3MvZG9jdW1lbnRhdGlvbi9pbWFnZXMvZHluYW1pY19wcm9maWxpbmdfZGVidWdnaW5nXzIucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2YzAyMzYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2RvY3VtZW50YXRpb24vaW1hZ2VzL2R5bmFtaWNfcHJvZmlsaW5nX2RlYnVnZ2luZ18yLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2RvY3VtZW50YXRpb24vaW1hZ2VzL2R5bmFtaWNfcHJvZmlsaW5nX2RlYnVnZ2luZ18zLnBuZyBiL2RvY3MvZG9jdW1lbnRhdGlvbi9pbWFnZXMvZHluYW1pY19wcm9maWxpbmdfZGVidWdnaW5nXzMucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MDZkN2UKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2RvY3VtZW50YXRpb24vaW1hZ2VzL2R5bmFtaWNfcHJvZmlsaW5nX2RlYnVnZ2luZ18zLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2RvY3VtZW50YXRpb24vaW1hZ2VzL3NlYXJjaC1hLXRvcG9sb2d5LnBuZyBiL2RvY3MvZG9jdW1lbnRhdGlvbi9pbWFnZXMvc2VhcmNoLWEtdG9wb2xvZ3kucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkNjE1M2MKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2RvY3VtZW50YXRpb24vaW1hZ2VzL3NlYXJjaC1hLXRvcG9sb2d5LnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2RvY3VtZW50YXRpb24vaW1hZ2VzL3NlYXJjaC1mb3ItYS1zaW5nbGUtd29ya2VyLWxvZy5wbmcgYi9kb2NzL2RvY3VtZW50YXRpb24vaW1hZ2VzL3NlYXJjaC1mb3ItYS1zaW5nbGUtd29ya2VyLWxvZy5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM2ZjQyMwotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvZG9jdW1lbnRhdGlvbi9pbWFnZXMvc2VhcmNoLWZvci1hLXNpbmdsZS13b3JrZXItbG9nLnBuZwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9kb2NzL2RvY3VtZW50YXRpb24vc3Rvcm0tbWV0cmljcy1wcm9maWxpbmctaW50ZXJuYWwtYWN0aW9ucy5tZCBiL2RvY3MvZG9jdW1lbnRhdGlvbi9zdG9ybS1tZXRyaWNzLXByb2ZpbGluZy1pbnRlcm5hbC1hY3Rpb25zLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NDljMGMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2RvY3VtZW50YXRpb24vc3Rvcm0tbWV0cmljcy1wcm9maWxpbmctaW50ZXJuYWwtYWN0aW9ucy5tZApAQCAtMCwwICsxLDcwIEBACisjIFN0b3JtIE1ldHJpY3MgZm9yIFByb2ZpbGluZyBWYXJpb3VzIFN0b3JtIEludGVybmFsIEFjdGlvbnMKKworV2l0aCB0aGUgYWRkaXRpb24gb2YgdGhlc2UgbWV0cmljcywgU3Rvcm0gdXNlcnMgY2FuIGNvbGxlY3QsIHZpZXcsIGFuZCBhbmFseXplIHRoZSBwZXJmb3JtYW5jZSBvZiB2YXJpb3VzIGludGVybmFsIGFjdGlvbnMuICBUaGUgYWN0aW9ucyB0aGF0IGFyZSBwcm9maWxlZCBpbmNsdWRlIHRocmlmdCBycGMgY2FsbHMgYW5kIGh0dHAgcXVlc3RzIHdpdGhpbiB0aGUgc3Rvcm0gZGFlbW9ucy4gRm9yIGluc3RhbmNlLCBpbiB0aGUgU3Rvcm0gTmltYnVzIGRhZW1vbiwgdGhlIGZvbGxvd2luZyB0aHJpZnQgY2FsbHMgZGVmaW5lZCBpbiB0aGUgTmltYnVzJElmYWNlIGFyZSBwcm9maWxlZDoKKworLSBzdWJtaXRUb3BvbG9neQorLSBzdWJtaXRUb3BvbG9neVdpdGhPcHRzCistIGtpbGxUb3BvbG9neQorLSBraWxsVG9wb2xvZ3lXaXRoT3B0cworLSBhY3RpdmF0ZQorLSBkZWFjdGl2YXRlCistIHJlYmFsYW5jZQorLSBzZXRMb2dDb25maWcKKy0gZ2V0TG9nQ29uZmlnCisKK1ZhcmlvdXMgSFRUUCBHRVQgYW5kIFBPU1QgcmVxdWVzdHMgYXJlIG1hcmtlZCBmb3IgcHJvZmlsaW5nIGFzIHdlbGwgc3VjaCBhcyB0aGUgR0VUIGFuZCBQT1NUIHJlcXVlc3RzIGZvciB0aGUgU3Rvcm0gVUkgZGFlbW9uICh1aS9jb3JlLmNqKQorVG8gaW1wbGVtZW50IHRoZXNlIG1ldHJpY3MgdGhlIGZvbGxvd2luZyBwYWNrYWdlcyBhcmUgdXNlZDogCistIGlvLmRyb3B3aXphcmQubWV0cmljcworLSBtZXRyaWNzLWNsb2p1cmUKKworIyMgSG93IGl0IHdvcmtzCisKK0J5IHVzaW5nIHBhY2thZ2VzIGlvLmRyb3B3aXphcmQubWV0cmljcyBhbmQgbWV0cmljcy1jbG9qdXJlIChjbG9qdXJlIHdyYXBwZXIgZm9yIHRoZSBtZXRyaWNzIEphdmEgQVBJKSwgd2UgY2FuIG1hcmsgZnVuY3Rpb25zIHRvIHByb2ZpbGUgYnkgZGVjbGFyaW5nIChkZWZtZXRlciBudW0tc29tZS1mdW5jLWNhbGxzKSBhbmQgdGhlbiBhZGRpbmcgdGhlIChtYXJrISBudW0tc29tZS1mdW5jLWNhbGxzKSB0byB3aGVyZSB0aGUgZnVuY3Rpb24gaXMgaW52b2tlZC4gRm9yIGV4YW1wbGU6CisKKyAgICAoZGVmbWV0ZXIgbnVtLXNvbWUtZnVuYy1jYWxscykKKyAgICAoZGVmbiBzb21lLWZ1bmMgW2FyZ3NdCisgICAgICAgIChtYXJrISBudW0tc29tZS1mdW5jLWNhbGxzKQorICAgICAgICAoYm9keSkpCisgICAgICAgIAorV2hhdCBlc3NlbnRpYWxseSB0aGUgbWFyayEgQVBJIGNhbGwgZG9lcyBpcyBpbmNyZW1lbnQgYSBjb3VudGVyIHRoYXQgcmVwcmVzZW50cyBob3cgbWFueSB0aW1lcyBhIGNlcnRhaW4gYWN0aW9uIG9jY3VyZWQuICBGb3IgaW5zdGFudGFub3VzIG1lYXN1cmVtZW50cyB1c2VyIGNhbiB1c2UgZ2F1Z2VzLiAgRm9yIGV4YW1wbGU6IAorCisgICAgKGRlZmdhdWdlIG5pbWJ1czpudW0tc3VwZXJ2aXNvcnMKKyAgICAgICAgIChmbiBbXSAoLnNpemUgKC5zdXBlcnZpc29ycyAoOnN0b3JtLWNsdXN0ZXItc3RhdGUgbmltYnVzKSBuaWwpKSkpCisgICAgICAgICAKK1RoZSBhYm92ZSBleGFtcGxlIHdpbGwgZ2V0IHRoZSBudW1iZXIgb2Ygc3VwZXJ2aXNvcnMgaW4gdGhlIGNsdXN0ZXIuICBUaGlzIG1ldHJpYyBpcyBub3QgYWNjdW1sYXRpdmUgbGlrZSBvbmUgcHJldmlvdXNseSBkaXNjdXNzZWQuCisKK0EgbWV0cmljcyByZXBvcnRpbmcgc2VydmVyIG5lZWRzIHRvIGFsc28gYmUgYWN0aXZhdGVkIHRvIGNvbGxlY3QgdGhlIG1ldHJpY3MuIFlvdSBjYW4gZG8gdGhpcyBieSBjYWxsaW5nIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb246CisKKyAgICAoZGVmbiBzdGFydC1tZXRyaWNzLXJlcG9ydGVycyBbXQorICAgICAgICAoam14L3N0YXJ0IChqbXgvcmVwb3J0ZXIge30pKSkKKworIyMgSG93IHRvIGNvbGxlY3QgdGhlIG1ldHJpY3MKKworTWV0cmljcyBjYW4gYmUgcmVwb3J0ZWQgdmlhIEpNWCBvciBIVFRQLiAgQSB1c2VyIGNhbiB1c2UgSkNvbnNvbGUgb3IgVmlzdWFsVk0gdG8gY29ubmVjdCB0byB0aGUganZtIHByb2Nlc3MgYW5kIHZpZXcgdGhlIHN0YXRzLgorCitUbyB2aWV3IHRoZSBtZXRyaWNzIGluIGEgR1VJIHVzZSBWaXN1YWxWTSBvciBKQ29uc29sZS4gIFNjcmVlbnNob3Qgb2YgdXNpbmcgVmlzdWFsVm0gZm9yIG1ldHJpY3M6IAorCishW1ZpZXdpbmcgbWV0cmljcyB3aXRoIFZpc3VhbFZNXShpbWFnZXMvdmlld2luZ19tZXRyaWNzX3dpdGhfVmlzdWFsVk0ucG5nKQorCitGb3IgZGV0YWlsZWQgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGhvdyB0byBjb2xsZWN0IHRoZSBtZXRyaWNzIHBsZWFzZSByZWZlcmVuY2U6IAorCitodHRwczovL2Ryb3B3aXphcmQuZ2l0aHViLmlvL21ldHJpY3MvMy4xLjAvZ2V0dGluZy1zdGFydGVkLworCitJZiB5b3Ugd2FudCB1c2UgSk1YIGFuZCB2aWV3IG1ldHJpY3MgdGhyb3VnaCBKQ29uc29sZSBvciBWaXN1YWxWTSwgcmVtZW1iZXIgbGF1bmNoIEpWTSBwcm9jZXNzZXMgeW91ciB3YW50IHRvIHByb2ZpbGUgd2l0aCB0aGUgY29ycmVjdCBKTVggY29uZmlndXJhdGlvbnMuICBGb3IgZXhhbXBsZSBpbiBTdG9ybSB5b3Ugd291bGQgYWRkIHRoZSBmb2xsb3dpbmcgdG8gY29uZi9zdG9ybS55YW1sCisKKyAgICBuaW1idXMuY2hpbGRvcHRzOiAiLVhteDEwMjRtIC1EY29tLnN1bi5tYW5hZ2VtZW50LmpteHJlbW90ZS5sb2NhbC5vbmx5PWZhbHNlIC1EY29tLnN1bi5tYW5hZ2VtZW50LmpteHJlbW90ZSAtRGNvbS5zdW4ubWFuYWdlbWVudC5qbXhyZW1vdGUucG9ydD0zMzMzICAtRGNvbS5zdW4ubWFuYWdlbWVudC5qbXhyZW1vdGUuc3NsPWZhbHNlIC1EY29tLnN1bi5tYW5hZ2VtZW50LmpteHJlbW90ZS5hdXRoZW50aWNhdGU9ZmFsc2UiCisgICAgCisgICAgdWkuY2hpbGRvcHRzOiAiLVhteDc2OG0gLURjb20uc3VuLm1hbmFnZW1lbnQuam14cmVtb3RlLnBvcnQ9MzMzNCAtRGNvbS5zdW4ubWFuYWdlbWVudC5qbXhyZW1vdGUubG9jYWwub25seT1mYWxzZSAtRGNvbS5zdW4ubWFuYWdlbWVudC5qbXhyZW1vdGUgLURjb20uc3VuLm1hbmFnZW1lbnQuam14cmVtb3RlLnNzbD1mYWxzZSAtRGNvbS5zdW4ubWFuYWdlbWVudC5qbXhyZW1vdGUuYXV0aGVudGljYXRlPWZhbHNlIgorICAgIAorICAgIGxvZ3ZpZXdlci5jaGlsZG9wdHM6ICItWG14MTI4bSAtRGNvbS5zdW4ubWFuYWdlbWVudC5qbXhyZW1vdGUucG9ydD0zMzM1IC1EY29tLnN1bi5tYW5hZ2VtZW50LmpteHJlbW90ZS5sb2NhbC5vbmx5PWZhbHNlIC1EY29tLnN1bi5tYW5hZ2VtZW50LmpteHJlbW90ZSAtRGNvbS5zdW4ubWFuYWdlbWVudC5qbXhyZW1vdGUuc3NsPWZhbHNlIC1EY29tLnN1bi5tYW5hZ2VtZW50LmpteHJlbW90ZS5hdXRoZW50aWNhdGU9ZmFsc2UiCisgICAgCisgICAgZHJwYy5jaGlsZG9wdHM6ICItWG14NzY4bSAtRGNvbS5zdW4ubWFuYWdlbWVudC5qbXhyZW1vdGUucG9ydD0zMzM2IC1EY29tLnN1bi5tYW5hZ2VtZW50LmpteHJlbW90ZS5sb2NhbC5vbmx5PWZhbHNlIC1EY29tLnN1bi5tYW5hZ2VtZW50LmpteHJlbW90ZSAtRGNvbS5zdW4ubWFuYWdlbWVudC5qbXhyZW1vdGUuc3NsPWZhbHNlIC1EY29tLnN1bi5tYW5hZ2VtZW50LmpteHJlbW90ZS5hdXRoZW50aWNhdGU9ZmFsc2UiCisgICAKKyAgICBzdXBlcnZpc29yLmNoaWxkb3B0czogIi1YbXgyNTZtIC1EY29tLnN1bi5tYW5hZ2VtZW50LmpteHJlbW90ZS5wb3J0PTMzMzcgLURjb20uc3VuLm1hbmFnZW1lbnQuam14cmVtb3RlLmxvY2FsLm9ubHk9ZmFsc2UgLURjb20uc3VuLm1hbmFnZW1lbnQuam14cmVtb3RlIC1EY29tLnN1bi5tYW5hZ2VtZW50LmpteHJlbW90ZS5zc2w9ZmFsc2UgLURjb20uc3VuLm1hbmFnZW1lbnQuam14cmVtb3RlLmF1dGhlbnRpY2F0ZT1mYWxzZSIKKworIyMjIFBsZWFzZSBOb3RlOgorU2luY2Ugd2Ugc2hhZGUgYWxsIG9mIHRoZSBwYWNrYWdlcyB3ZSB1c2UsIGFkZGl0aW9uYWwgcGx1Z2lucyBmb3IgY29sbGVjdGluZyBtZXRyaWNzIG1pZ2h0IG5vdCB3b3JrIGF0IHRoaXMgdGltZS4gIEN1cnJlbnRseSBjb2xsZWN0aW5nIHRoZSBtZXRyaWNzIHZpYSBKTVggaXMgc3VwcG9ydGVkLgorICAgCitGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBpby5kcm9wd2l6YXJkLm1ldHJpY3MgYW5kIG1ldHJpY3MtY2xvanVyZSBwYWNrYWdlcyBwbGVhc2UgcmVmZXJlbmNlIHRoZWlyIG9yaWdpbmFsIGRvY3VtZW50YXRpb246CistIGh0dHBzOi8vZHJvcHdpemFyZC5naXRodWIuaW8vbWV0cmljcy8zLjEuMC8KKy0gaHR0cDovL21ldHJpY3MtY2xvanVyZS5yZWFkdGhlZG9jcy5vcmcvZW4vbGF0ZXN0LwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL1NUT1JNLVVJLVJFU1QtQVBJLm1kIGIvZG9jcy9kb2N1bWVudGF0aW9uL3VpLXJlc3QtYXBpLm1kCnNpbWlsYXJpdHkgaW5kZXggNzYlCnJlbmFtZSBmcm9tIFNUT1JNLVVJLVJFU1QtQVBJLm1kCnJlbmFtZSB0byBkb2NzL2RvY3VtZW50YXRpb24vdWktcmVzdC1hcGkubWQKaW5kZXggYThmMmJkMS4uN2RlMmJjYiAxMDA2NDQKLS0tIGEvU1RPUk0tVUktUkVTVC1BUEkubWQKKysrIGIvZG9jcy9kb2N1bWVudGF0aW9uL3VpLXJlc3QtYXBpLm1kCkBAIC04NCw3ICs4NCw2IEBACiB8RmllbGQgIHxWYWx1ZXxEZXNjcmlwdGlvbgogfC0tLQl8LS0tCXwtLS0KIHxzdG9ybVZlcnNpb258U3RyaW5nfCBTdG9ybSB2ZXJzaW9ufAotfG5pbWJ1c1VwdGltZXxTdHJpbmd8IFNob3dzIGhvdyBsb25nIHRoZSBjbHVzdGVyIGlzIHJ1bm5pbmd8CiB8c3VwZXJ2aXNvcnN8SW50ZWdlcnwgTnVtYmVyIG9mIHN1cGVydmlzb3JzIHJ1bm5pbmd8CiB8dG9wb2xvZ2llc3wgSW50ZWdlcnwgTnVtYmVyIG9mIHRvcG9sb2dpZXMgcnVubmluZ3wgCiB8c2xvdHNUb3RhbHwgSW50ZWdlcnxUb3RhbCBudW1iZXIgb2YgYXZhaWxhYmxlIHdvcmtlciBzbG90c3wKQEAgLTk4LDcgKzk3LDYgQEAKIGBgYGpzb24KICAgIHsKICAgICAic3Rvcm1WZXJzaW9uIjogIjAuOS4yLWluY3ViYXRpbmctU05BUFNIT1QiLAotICAgICJuaW1idXNVcHRpbWUiOiAiM20gNTNzIiwKICAgICAic3VwZXJ2aXNvcnMiOiAxLAogICAgICJzbG90c1RvdGFsIjogNCwKICAgICAic2xvdHNVc2VkIjogMywKQEAgLTExOSw4ICsxMTcsMTMgQEAKIHxpZHwgU3RyaW5nIHwgU3VwZXJ2aXNvcidzIGlkfAogfGhvc3R8IFN0cmluZ3wgU3VwZXJ2aXNvcidzIGhvc3QgbmFtZXwKIHx1cHRpbWV8IFN0cmluZ3wgU2hvd3MgaG93IGxvbmcgdGhlIHN1cGVydmlzb3IgaXMgcnVubmluZ3wKK3x1cHRpbWVTZWNvbmRzfCBJbnRlZ2VyfCBTaG93cyBob3cgbG9uZyB0aGUgc3VwZXJ2aXNvciBpcyBydW5uaW5nIGluIHNlY29uZHN8CiB8c2xvdHNUb3RhbHwgSW50ZWdlcnwgVG90YWwgbnVtYmVyIG9mIGF2YWlsYWJsZSB3b3JrZXIgc2xvdHMgZm9yIHRoaXMgc3VwZXJ2aXNvcnwKIHxzbG90c1VzZWR8IEludGVnZXJ8IE51bWJlciBvZiB3b3JrZXIgc2xvdHMgdXNlZCBvbiB0aGlzIHN1cGVydmlzb3J8Cit8dG90YWxNZW18IERvdWJsZXwgVG90YWwgbWVtb3J5IGNhcGFjaXR5IG9uIHRoaXMgc3VwZXJ2aXNvcnwKK3x0b3RhbENwdXwgRG91YmxlfCBUb3RhbCBDUFUgY2FwYWNpdHkgb24gdGhpcyBzdXBlcnZpc29yfAorfHVzZWRNZW18IERvdWJsZXwgVXNlZCBtZW1vcnkgY2FwYWNpdHkgb24gdGhpcyBzdXBlcnZpc29yfAorfHVzZWRDcHV8IERvdWJsZXwgVXNlZCBDUFUgY2FwYWNpdHkgb24gdGhpcyBzdXBlcnZpc29yfAogCiBTYW1wbGUgcmVzcG9uc2U6CiAKQEAgLTEzMSwxMCArMTM0LDE2IEBACiAgICAgICAgICAgICAiaWQiOiAiMGI4Nzk4MDgtMmEyNi00NDJiLThmN2QtMjMxMDFlMGMzNjk2IiwKICAgICAgICAgICAgICJob3N0IjogIjEwLjExLjEuNyIsCiAgICAgICAgICAgICAidXB0aW1lIjogIjVtIDU4cyIsCisgICAgICAgICAgICAidXB0aW1lU2Vjb25kcyI6IDM1OCwKICAgICAgICAgICAgICJzbG90c1RvdGFsIjogNCwKLSAgICAgICAgICAgICJzbG90c1VzZWQiOiAzCisgICAgICAgICAgICAic2xvdHNVc2VkIjogMywKKyAgICAgICAgICAgICJ0b3RhbE1lbSI6IDMwMDAsCisgICAgICAgICAgICAidG90YWxDcHUiOiA0MDAsCisgICAgICAgICAgICAidXNlZE1lbSI6IDEyODAsCisgICAgICAgICAgICAidXNlZENQVSI6IDE2MAogICAgICAgICB9Ci0gICAgXQorICAgIF0sCisgICAgInNjaGVkdWxlckRpc3BsYXlSZXNvdXJjZSI6IHRydWUKIH0KIGBgYAogCkBAIC0xNTAsNiArMTU5LDcgQEAKIHxwb3J0fCBpbnR8IE5pbWJ1cycgcG9ydCBudW1iZXJ8CiB8c3RhdHVzfCBTdHJpbmd8IFBvc3NpYmxlIHZhbHVlcyBhcmUgTGVhZGVyLCBOb3QgYSBMZWFkZXIsIERlYWR8CiB8bmltYnVzVXBUaW1lfCBTdHJpbmd8IFNob3dzIHNpbmNlIGhvdyBsb25nIHRoZSBuaW1idXMgaGFzIGJlZW4gcnVubmluZ3wKK3xuaW1idXNVcFRpbWVTZWNvbmRzfCBTdHJpbmd8IFNob3dzIHNpbmNlIGhvdyBsb25nIHRoZSBuaW1idXMgaGFzIGJlZW4gcnVubmluZyBpbiBzZWNvbmRzfAogfG5pbWJ1c0xvZ0xpbmt8IFN0cmluZ3wgTG9ndmlld2VyIHVybCB0byB2aWV3IHRoZSBuaW1idXMubG9nfAogfHZlcnNpb258IFN0cmluZ3wgVmVyc2lvbiBvZiBzdG9ybSB0aGlzIG5pbWJ1cyBob3N0IGlzIHJ1bm5pbmd8CiAKQEAgLTE2NCwxMiArMTc0LDM0IEBACiAgICAgICAgICAgICAibmltYnVzTG9nTGluayI6Imh0dHA6XC9cLzE5Mi4xNjguMjAyLjE6ODAwMFwvbG9nP2ZpbGU9bmltYnVzLmxvZyIsCiAgICAgICAgICAgICAic3RhdHVzIjpMZWFkZXIsCiAgICAgICAgICAgICAidmVyc2lvbiI6IjAuMTAuMC1TTkFQU0hPVCIsCi0gICAgICAgICAgICAibmltYnVzVXBUaW1lIjoiM20gMzNzIgorICAgICAgICAgICAgIm5pbWJ1c1VwVGltZSI6IjNtIDMzcyIsCisgICAgICAgICAgICAibmltYnVzVXBUaW1lU2Vjb25kcyI6IjIxMyIKICAgICAgICAgfQogICAgIF0KIH0KIGBgYAogCisjIyMgL2FwaS92MS9oaXN0b3J5L3N1bW1hcnkgKEdFVCkKKworUmV0dXJucyBhIGxpc3Qgb2YgYWxsIHJ1bm5pbmcgdG9wb2xvZ2llcycgSURzIHN1Ym1pdHRlZCBieSB0aGUgY3VycmVudCB1c2VyLgorCitSZXNwb25zZSBmaWVsZHM6CisKK3xGaWVsZCAgfFZhbHVlIHwgRGVzY3JpcHRpb258Cit8LS0tCXwtLS0JfC0tLQorfHRvcG8taGlzdG9yeXwgTGlzdHwgTGlzdCBvZiBUb3BvbG9naWVzJyBJRHN8CisKK1NhbXBsZSByZXNwb25zZToKKworYGBganNvbgoreworICAgICJ0b3BvLWhpc3RvcnkiOlsKKyAgICAgICAgIndjNi0xLTE0NDY1NzEwMDkiLAorICAgICAgICAid2M4LTItMTQ0NjU4NzE3OCIKKyAgICAgXQorfQorYGBgCisKICMjIyAvYXBpL3YxL3RvcG9sb2d5L3N1bW1hcnkgKEdFVCkKIAogUmV0dXJucyBzdW1tYXJ5IGluZm9ybWF0aW9uIGZvciBhbGwgdG9wb2xvZ2llcy4KQEAgLTE4MiwxMCArMjE0LDIwIEBACiB8bmFtZXwgU3RyaW5nfCBUb3BvbG9neSBOYW1lfAogfHN0YXR1c3wgU3RyaW5nfCBUb3BvbG9neSBTdGF0dXN8CiB8dXB0aW1lfCBTdHJpbmd8ICBTaG93cyBob3cgbG9uZyB0aGUgdG9wb2xvZ3kgaXMgcnVubmluZ3wKK3x1cHRpbWVTZWNvbmRzfCBJbnRlZ2VyfCAgU2hvd3MgaG93IGxvbmcgdGhlIHRvcG9sb2d5IGlzIHJ1bm5pbmcgaW4gc2Vjb25kc3wKIHx0YXNrc1RvdGFsfCBJbnRlZ2VyIHxUb3RhbCBudW1iZXIgb2YgdGFza3MgZm9yIHRoaXMgdG9wb2xvZ3l8CiB8d29ya2Vyc1RvdGFsfCBJbnRlZ2VyIHxOdW1iZXIgb2Ygd29ya2VycyB1c2VkIGZvciB0aGlzIHRvcG9sb2d5fAogfGV4ZWN1dG9yc1RvdGFsfCBJbnRlZ2VyIHxOdW1iZXIgb2YgZXhlY3V0b3JzIHVzZWQgZm9yIHRoaXMgdG9wb2xvZ3l8CiB8cmVwbGljYXRpb25Db3VudHwgSW50ZWdlciB8TnVtYmVyIG9mIG5pbWJ1cyBob3N0cyBvbiB3aGljaCB0aGlzIHRvcG9sb2d5IGNvZGUgaXMgcmVwbGljYXRlZHwKK3xyZXF1ZXN0ZWRNZW1PbkhlYXB8IERvdWJsZXxSZXF1ZXN0ZWQgT24tSGVhcCBNZW1vcnkgYnkgVXNlciAoTUIpCit8cmVxdWVzdGVkTWVtT2ZmSGVhcHwgRG91YmxlfFJlcXVlc3RlZCBPZmYtSGVhcCBNZW1vcnkgYnkgVXNlciAoTUIpfAorfHJlcXVlc3RlZFRvdGFsTWVtfCBEb3VibGV8UmVxdWVzdGVkIFRvdGFsIE1lbW9yeSBieSBVc2VyIChNQil8Cit8cmVxdWVzdGVkQ3B1fCBEb3VibGV8UmVxdWVzdGVkIENQVSBieSBVc2VyICglKXwKK3xhc3NpZ25lZE1lbU9uSGVhcHwgRG91YmxlfEFzc2lnbmVkIE9uLUhlYXAgTWVtb3J5IGJ5IFNjaGVkdWxlciAoTUIpfAorfGFzc2lnbmVkTWVtT2ZmSGVhcHwgRG91YmxlfEFzc2lnbmVkIE9mZi1IZWFwIE1lbW9yeSBieSBTY2hlZHVsZXIgKE1CKXwKK3xhc3NpZ25lZFRvdGFsTWVtfCBEb3VibGV8QXNzaWduZWQgVG90YWwgTWVtb3J5IGJ5IFNjaGVkdWxlciAoTUIpfAorfGFzc2lnbmVkQ3B1fCBEb3VibGV8QXNzaWduZWQgQ1BVIGJ5IFNjaGVkdWxlciAoJSl8CisKIFNhbXBsZSByZXNwb25zZToKIAogYGBganNvbgpAQCAtMTk2LDEyICsyMzgsNTUgQEAKICAgICAgICAgICAgICJuYW1lIjogIldvcmRDb3VudDMiLAogICAgICAgICAgICAgInN0YXR1cyI6ICJBQ1RJVkUiLAogICAgICAgICAgICAgInVwdGltZSI6ICI2bSA1cyIsCisgICAgICAgICAgICAidXB0aW1lU2Vjb25kcyI6IDM2NSwKICAgICAgICAgICAgICJ0YXNrc1RvdGFsIjogMjgsCiAgICAgICAgICAgICAid29ya2Vyc1RvdGFsIjogMywKICAgICAgICAgICAgICJleGVjdXRvcnNUb3RhbCI6IDI4LAotICAgICAgICAgICAgInJlcGxpY2F0aW9uQ291bnQiOiAxCisgICAgICAgICAgICAicmVwbGljYXRpb25Db3VudCI6IDEsCisgICAgICAgICAgICAicmVxdWVzdGVkTWVtT25IZWFwIjogNjQwLAorICAgICAgICAgICAgInJlcXVlc3RlZE1lbU9mZkhlYXAiOiAxMjgsCisgICAgICAgICAgICAicmVxdWVzdGVkVG90YWxNZW0iOiA3NjgsCisgICAgICAgICAgICAicmVxdWVzdGVkQ3B1IjogODAsCisgICAgICAgICAgICAiYXNzaWduZWRNZW1PbkhlYXAiOiA2NDAsCisgICAgICAgICAgICAiYXNzaWduZWRNZW1PZmZIZWFwIjogMTI4LAorICAgICAgICAgICAgImFzc2lnbmVkVG90YWxNZW0iOiA3NjgsCisgICAgICAgICAgICAiYXNzaWduZWRDcHUiOiA4MAogICAgICAgICB9CiAgICAgXQorICAgICJzY2hlZHVsZXJEaXNwbGF5UmVzb3VyY2UiOiB0cnVlCit9CitgYGAKKworIyMjIC9hcGkvdjEvdG9wb2xvZ3ktd29ya2Vycy86aWQgKEdFVCkKKworUmV0dXJucyB0aGUgd29ya2VyJyBpbmZvcm1hdGlvbiAoaG9zdCBhbmQgcG9ydCkgZm9yIGEgdG9wb2xvZ3kuCisKK1Jlc3BvbnNlIGZpZWxkczoKKworfEZpZWxkICB8VmFsdWUgfCBEZXNjcmlwdGlvbnwKK3wtLS0JfC0tLQl8LS0tCit8aG9zdFBvcnRMaXN0fCBMaXN0fCBXb3JrZXJzJyBpbmZvcm1hdGlvbiBmb3IgYSB0b3BvbG9neXwKK3xuYW1lfCBJbnRlZ2VyfCBMb2d2aWV3ZXIgUG9ydHwKKworU2FtcGxlIHJlc3BvbnNlOgorCitgYGBqc29uCit7CisgICAgImhvc3RQb3J0TGlzdCI6WworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICJob3N0IjoiMTkyLjE2OC4yMDIuMiIsCisgICAgICAgICAgICAgICAgInBvcnQiOjY3MDEKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgImhvc3QiOiIxOTIuMTY4LjIwMi4yIiwKKyAgICAgICAgICAgICAgICAicG9ydCI6NjcwMgorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAiaG9zdCI6IjE5Mi4xNjguMjAyLjMiLAorICAgICAgICAgICAgICAgICJwb3J0Ijo2NzAwCisgICAgICAgICAgICB9CisgICAgICAgIF0sCisgICAgImxvZ3ZpZXdlclBvcnQiOjgwMDAKIH0KIGBgYAogCkBAIC0yMjUsMTIgKzMxMCwxNCBAQAogfGlkfCBTdHJpbmd8IFRvcG9sb2d5IElkfAogfG5hbWV8IFN0cmluZyB8VG9wb2xvZ3kgTmFtZXwKIHx1cHRpbWV8IFN0cmluZyB8SG93IGxvbmcgdGhlIHRvcG9sb2d5IGhhcyBiZWVuIHJ1bm5pbmd8Cit8dXB0aW1lU2Vjb25kc3wgSW50ZWdlciB8SG93IGxvbmcgdGhlIHRvcG9sb2d5IGhhcyBiZWVuIHJ1bm5pbmcgaW4gc2Vjb25kc3wKIHxzdGF0dXN8IFN0cmluZyB8Q3VycmVudCBzdGF0dXMgb2YgdGhlIHRvcG9sb2d5LCBlLmcuICJBQ1RJVkUifAogfHRhc2tzVG90YWx8IEludGVnZXIgfFRvdGFsIG51bWJlciBvZiB0YXNrcyBmb3IgdGhpcyB0b3BvbG9neXwKIHx3b3JrZXJzVG90YWx8IEludGVnZXIgfE51bWJlciBvZiB3b3JrZXJzIHVzZWQgZm9yIHRoaXMgdG9wb2xvZ3l8CiB8ZXhlY3V0b3JzVG90YWx8IEludGVnZXIgfE51bWJlciBvZiBleGVjdXRvcnMgdXNlZCBmb3IgdGhpcyB0b3BvbG9neXwKIHxtc2dUaW1lb3V0fCBJbnRlZ2VyIHwgTnVtYmVyIG9mIHNlY29uZHMgYSB0dXBsZSBoYXMgYmVmb3JlIHRoZSBzcG91dCBjb25zaWRlcnMgaXQgZmFpbGVkIHwKIHx3aW5kb3dIaW50fCBTdHJpbmcgfCB3aW5kb3cgcGFyYW0gdmFsdWUgaW4gImhoIG1tIHNzIiBmb3JtYXQuIERlZmF1bHQgdmFsdWUgaXMgIkFsbCBUaW1lInwKK3xzY2hlZHVsZXJEaXNwbGF5UmVzb3VyY2V8IEJvb2xlYW4gfCBXaGV0aGVyIHRvIGRpc3BsYXkgc2NoZWR1bGVyIHJlc291cmNlIGluZm9ybWF0aW9ufAogfHRvcG9sb2d5U3RhdHN8IEFycmF5IHwgQXJyYXkgb2YgYWxsIHRoZSB0b3BvbG9neSByZWxhdGVkIHN0YXRzIHBlciB0aW1lIHdpbmRvd3wKIHx0b3BvbG9neVN0YXRzLndpbmRvd1ByZXR0eXwgU3RyaW5nIHxEdXJhdGlvbiBwYXNzZWQgaW4gSEg6TU06U1MgZm9ybWF0fAogfHRvcG9sb2d5U3RhdHMud2luZG93fCBTdHJpbmcgfFVzZXIgcmVxdWVzdGVkIHRpbWUgd2luZG93IGZvciBtZXRyaWNzfApAQCAtMjg2LDggKzM3MywxMCBAQAogICAgICJ0YXNrc1RvdGFsIjogMjgsCiAgICAgImV4ZWN1dG9yc1RvdGFsIjogMjgsCiAgICAgInVwdGltZSI6ICIyOW0gMTlzIiwKKyAgICAidXB0aW1lU2Vjb25kcyI6IDE3NTksCiAgICAgIm1zZ1RpbWVvdXQiOiAzMCwKICAgICAid2luZG93SGludCI6ICIxMG0gMHMiLAorICAgICJzY2hlZHVsZXJEaXNwbGF5UmVzb3VyY2UiOiB0cnVlLAogICAgICJ0b3BvbG9neVN0YXRzIjogWwogICAgICAgICB7CiAgICAgICAgICAgICAid2luZG93UHJldHR5IjogIjEwbSAwcyIsCkBAIC00MzYsNyArNTI1LDcgQEAKIHx3aW5kb3dIaW50fCBTdHJpbmcgfCB3aW5kb3cgcGFyYW0gdmFsdWUgaW4gImhoIG1tIHNzIiBmb3JtYXQuIERlZmF1bHQgdmFsdWUgaXMgIkFsbCBUaW1lInwKIHxleGVjdXRvcnN8IEludGVnZXIgfE51bWJlciBvZiBleGVjdXRvciB0YXNrcyBpbiB0aGUgY29tcG9uZW50fAogfGNvbXBvbmVudEVycm9yc3wgQXJyYXkgb2YgRXJyb3JzIHwgTGlzdCBvZiBjb21wb25lbnQgZXJyb3JzfAotfGNvbXBvbmVudEVycm9ycy50aW1lfCBMb25nIHwgVGltZXN0YW1wIHdoZW4gdGhlIGV4Y2VwdGlvbiBvY2N1cnJlZCB8Cit8Y29tcG9uZW50RXJyb3JzLmVycm9yVGltZXwgTG9uZyB8IFRpbWVzdGFtcCB3aGVuIHRoZSBleGNlcHRpb24gb2NjdXJyZWQgKFByaW9yIHRvIDAuMTEuMCwgdGhpcyBmaWVsZCB3YXMgbmFtZWQgJ3RpbWUnLil8CiB8Y29tcG9uZW50RXJyb3JzLmVycm9ySG9zdHwgU3RyaW5nIHwgaG9zdCBuYW1lIGZvciB0aGUgZXJyb3J8CiB8Y29tcG9uZW50RXJyb3JzLmVycm9yUG9ydHwgU3RyaW5nIHwgcG9ydCBmb3IgdGhlIGVycm9yfAogfGNvbXBvbmVudEVycm9ycy5lcnJvcnwgU3RyaW5nIHxTaG93cyB0aGUgZXJyb3IgaGFwcGVuZWQgaW4gYSBjb21wb25lbnR8CkBAIC00NzcsNyArNTY2LDcgQEAKICAgICAiY29tcG9uZW50VHlwZSI6ICJzcG91dCIsCiAgICAgIndpbmRvd0hpbnQiOiAiMTBtIDBzIiwKICAgICAiZXhlY3V0b3JzIjogNSwKLSAgICAiY29tcG9uZW50RXJyb3JzIjpbeyJ0aW1lIjogMTQwNjAwNjA3NDAwMCwKKyAgICAiY29tcG9uZW50RXJyb3JzIjpbeyJlcnJvclRpbWUiOiAxNDA2MDA2MDc0MDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgImVycm9ySG9zdCI6ICIxMC4xMS4xLjcwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICJlcnJvclBvcnQiOiA2NzAxLAogICAgICAgICAgICAgICAgICAgICAgICAgImVycm9yV29ya2VyTG9nTGluayI6ICJodHRwOi8vMTAuMTEuMS43OjgwMDAvbG9nP2ZpbGU9d29ya2VyLTY3MDEubG9nIiwKQEAgLTU1Myw2ICs2NDIsNyBAQAogICAgICAgICAgICAgImhvc3QiOiAiMTAuMTEuMS43IiwKICAgICAgICAgICAgICJhY2tlZCI6IDAsCiAgICAgICAgICAgICAidXB0aW1lIjogIjQzbSA0cyIsCisgICAgICAgICAgICAidXB0aW1lU2Vjb25kcyI6IDI1ODQsCiAgICAgICAgICAgICAiaWQiOiAiWzI0LTI0XSIsCiAgICAgICAgICAgICAiZmFpbGVkIjogMAogICAgICAgICB9LApAQCAtNTY1LDYgKzY1NSw3IEBACiAgICAgICAgICAgICAiaG9zdCI6ICIxMC4xMS4xLjciLAogICAgICAgICAgICAgImFja2VkIjogMCwKICAgICAgICAgICAgICJ1cHRpbWUiOiAiNDJtIDU3cyIsCisgICAgICAgICAgICAidXB0aW1lU2Vjb25kcyI6IDI1NzcsCiAgICAgICAgICAgICAiaWQiOiAiWzI1LTI1XSIsCiAgICAgICAgICAgICAiZmFpbGVkIjogMAogICAgICAgICB9LApAQCAtNTc3LDYgKzY2OCw3IEBACiAgICAgICAgICAgICAiaG9zdCI6ICIxMC4xMS4xLjciLAogICAgICAgICAgICAgImFja2VkIjogMCwKICAgICAgICAgICAgICJ1cHRpbWUiOiAiNDJtIDU3cyIsCisgICAgICAgICAgICAidXB0aW1lU2Vjb25kcyI6IDI1NzcsCiAgICAgICAgICAgICAiaWQiOiAiWzI2LTI2XSIsCiAgICAgICAgICAgICAiZmFpbGVkIjogMAogICAgICAgICB9LApAQCAtNTg5LDYgKzY4MSw3IEBACiAgICAgICAgICAgICAiaG9zdCI6ICIxMC4xMS4xLjciLAogICAgICAgICAgICAgImFja2VkIjogMCwKICAgICAgICAgICAgICJ1cHRpbWUiOiAiNDNtIDRzIiwKKyAgICAgICAgICAgICJ1cHRpbWVTZWNvbmRzIjogMjU4NCwKICAgICAgICAgICAgICJpZCI6ICJbMjctMjddIiwKICAgICAgICAgICAgICJmYWlsZWQiOiAwCiAgICAgICAgIH0sCkBAIC02MDEsNiArNjk0LDcgQEAKICAgICAgICAgICAgICJob3N0IjogIjEwLjExLjEuNyIsCiAgICAgICAgICAgICAiYWNrZWQiOiAwLAogICAgICAgICAgICAgInVwdGltZSI6ICI0Mm0gNTdzIiwKKyAgICAgICAgICAgICJ1cHRpbWVTZWNvbmRzIjogMjU3NywKICAgICAgICAgICAgICJpZCI6ICJbMjgtMjhdIiwKICAgICAgICAgICAgICJmYWlsZWQiOiAwCiAgICAgICAgIH0KQEAgLTYwOCw2ICs3MDIsMjAxIEBACiB9CiBgYGAKIAorIyMgUHJvZmlsaW5nIGFuZCBEZWJ1Z2dpbmcgR0VUIE9wZXJhdGlvbnMKKworIyMjICAvYXBpL3YxL3RvcG9sb2d5LzppZC9wcm9maWxpbmcvc3RhcnQvOmhvc3QtcG9ydC86dGltZW91dCAoR0VUKQorCitSZXF1ZXN0IHRvIHN0YXJ0IHByb2ZpbGVyIG9uIHdvcmtlciB3aXRoIHRpbWVvdXQuIFJldHVybnMgc3RhdHVzIGFuZCBsaW5rIHRvIHByb2ZpbGVyIGFydGlmYWN0cyBmb3Igd29ya2VyLgorCit8UGFyYW1ldGVyIHxWYWx1ZSAgIHxEZXNjcmlwdGlvbiAgfAorfC0tLS0tLS0tLS18LS0tLS0tLS18LS0tLS0tLS0tLS0tLXwKK3xpZCAgIAkgICB8U3RyaW5nIChyZXF1aXJlZCl8IFRvcG9sb2d5IElkICB8Cit8aG9zdC1wb3J0IHxTdHJpbmcgKHJlcXVpcmVkKXwgV29ya2VyIElkIHwKK3x0aW1lb3V0IHxTdHJpbmcgKHJlcXVpcmVkKXwgVGltZSBvdXQgZm9yIHByb2ZpbGVyIHRvIHN0b3AgaW4gbWludXRlcyB8CisKK1Jlc3BvbnNlIGZpZWxkczoKKworfEZpZWxkICB8VmFsdWUgfERlc2NyaXB0aW9ufAorfC0tLS0tCXwtLS0tLSB8LS0tLS0tLS0tLS18Cit8aWQgICB8IFN0cmluZyB8IFdvcmtlciBpZHwKK3xzdGF0dXMgfCBTdHJpbmcgfCBSZXNwb25zZSBTdGF0dXMgfAorfHRpbWVvdXQgfCBTdHJpbmcgfCBSZXF1ZXN0ZWQgdGltZW91dAorfGR1bXBsaW5rIHwgU3RyaW5nIHwgTGluayB0byBsb2d2aWV3ZXIgVVJMIGZvciB3b3JrZXIgcHJvZmlsZXIgZG9jdW1lbnRzLnwKKworRXhhbXBsZXM6CisKK2BgYG5vLWhpZ2hsaWdodAorMS4gaHR0cDovL3VpLWRhZW1vbi1ob3N0LW5hbWU6ODA4MC9hcGkvdjEvdG9wb2xvZ3kvd29yZGNvdW50LTEtMTQ0NjYxNDE1MC9wcm9maWxpbmcvc3RhcnQvMTAuMTEuMS43OjY3MDEvMTAKKzIuIGh0dHA6Ly91aS1kYWVtb24taG9zdC1uYW1lOjgwODAvYXBpL3YxL3RvcG9sb2d5L3dvcmRjb3VudC0xLTE0NDY2MTQxNTAvcHJvZmlsaW5nL3N0YXJ0LzEwLjExLjEuNzo2NzAxLzUKKzMuIGh0dHA6Ly91aS1kYWVtb24taG9zdC1uYW1lOjgwODAvYXBpL3YxL3RvcG9sb2d5L3dvcmRjb3VudC0xLTE0NDY2MTQxNTAvcHJvZmlsaW5nL3N0YXJ0LzEwLjExLjEuNzo2NzAxLzIwCitgYGAKKworU2FtcGxlIHJlc3BvbnNlOgorCitgYGBqc29uCit7CisgICAic3RhdHVzIjogIm9rIiwKKyAgICJpZCI6ICIxMC4xMS4xLjc6NjcwMSIsCisgICAidGltZW91dCI6ICIxMCIsCisgICAiZHVtcGxpbmsiOiAiaHR0cDpcL1wvMTAuMTEuMS43OjgwMDBcL2R1bXBzXC93b3JkY291bnQtMS0xNDQ2NjE0MTUwXC8xMC4xMS4xLjclM0E2NzAxIgorfQorYGBgCisKKyMjIyAgL2FwaS92MS90b3BvbG9neS86aWQvcHJvZmlsaW5nL2R1bXBwcm9maWxlLzpob3N0LXBvcnQgKEdFVCkKKworUmVxdWVzdCB0byBkdW1wIHByb2ZpbGVyIHJlY29yZGluZyBvbiB3b3JrZXIuIFJldHVybnMgc3RhdHVzIGFuZCB3b3JrZXIgaWQgZm9yIHRoZSByZXF1ZXN0LgorCit8UGFyYW1ldGVyIHxWYWx1ZSAgIHxEZXNjcmlwdGlvbiAgfAorfC0tLS0tLS0tLS18LS0tLS0tLS18LS0tLS0tLS0tLS0tLXwKK3xpZCAgIAkgICB8U3RyaW5nIChyZXF1aXJlZCl8IFRvcG9sb2d5IElkICB8Cit8aG9zdC1wb3J0IHxTdHJpbmcgKHJlcXVpcmVkKXwgV29ya2VyIElkIHwKKworUmVzcG9uc2UgZmllbGRzOgorCit8RmllbGQgIHxWYWx1ZSB8RGVzY3JpcHRpb258Cit8LS0tLS0JfC0tLS0tIHwtLS0tLS0tLS0tLXwKK3xpZCAgIHwgU3RyaW5nIHwgV29ya2VyIGlkfAorfHN0YXR1cyB8IFN0cmluZyB8IFJlc3BvbnNlIFN0YXR1cyB8CisKK0V4YW1wbGVzOgorCitgYGBuby1oaWdobGlnaHQKKzEuIGh0dHA6Ly91aS1kYWVtb24taG9zdC1uYW1lOjgwODAvYXBpL3YxL3RvcG9sb2d5L3dvcmRjb3VudC0xLTE0NDY2MTQxNTAvcHJvZmlsaW5nL2R1bXBwcm9maWxlLzEwLjExLjEuNzo2NzAxCitgYGAKKworU2FtcGxlIHJlc3BvbnNlOgorCitgYGBqc29uCit7CisgICAic3RhdHVzIjogIm9rIiwKKyAgICJpZCI6ICIxMC4xMS4xLjc6NjcwMSIsCit9CitgYGAKKworIyMjICAvYXBpL3YxL3RvcG9sb2d5LzppZC9wcm9maWxpbmcvc3RvcC86aG9zdC1wb3J0IChHRVQpCisKK1JlcXVlc3QgdG8gc3RvcCBwcm9maWxlciBvbiB3b3JrZXIuIFJldHVybnMgc3RhdHVzIGFuZCB3b3JrZXIgaWQgZm9yIHRoZSByZXF1ZXN0LgorCit8UGFyYW1ldGVyIHxWYWx1ZSAgIHxEZXNjcmlwdGlvbiAgfAorfC0tLS0tLS0tLS18LS0tLS0tLS18LS0tLS0tLS0tLS0tLXwKK3xpZCAgIAkgICB8U3RyaW5nIChyZXF1aXJlZCl8IFRvcG9sb2d5IElkICB8Cit8aG9zdC1wb3J0IHxTdHJpbmcgKHJlcXVpcmVkKXwgV29ya2VyIElkIHwKKworUmVzcG9uc2UgZmllbGRzOgorCit8RmllbGQgIHxWYWx1ZSB8RGVzY3JpcHRpb258Cit8LS0tLS0JfC0tLS0tIHwtLS0tLS0tLS0tLXwKK3xpZCAgIHwgU3RyaW5nIHwgV29ya2VyIGlkfAorfHN0YXR1cyB8IFN0cmluZyB8IFJlc3BvbnNlIFN0YXR1cyB8CisKK0V4YW1wbGVzOgorCitgYGBuby1oaWdobGlnaHQKKzEuIGh0dHA6Ly91aS1kYWVtb24taG9zdC1uYW1lOjgwODAvYXBpL3YxL3RvcG9sb2d5L3dvcmRjb3VudC0xLTE0NDY2MTQxNTAvcHJvZmlsaW5nL3N0b3AvMTAuMTEuMS43OjY3MDEKK2BgYAorCitTYW1wbGUgcmVzcG9uc2U6CisKK2BgYGpzb24KK3sKKyAgICJzdGF0dXMiOiAib2siLAorICAgImlkIjogIjEwLjExLjEuNzo2NzAxIiwKK30KK2BgYAorCisjIyMgIC9hcGkvdjEvdG9wb2xvZ3kvOmlkL3Byb2ZpbGluZy9kdW1wanN0YWNrLzpob3N0LXBvcnQgKEdFVCkKKworUmVxdWVzdCB0byBkdW1wIGpzdGFjayBvbiB3b3JrZXIuIFJldHVybnMgc3RhdHVzIGFuZCB3b3JrZXIgaWQgZm9yIHRoZSByZXF1ZXN0LgorCit8UGFyYW1ldGVyIHxWYWx1ZSAgIHxEZXNjcmlwdGlvbiAgfAorfC0tLS0tLS0tLS18LS0tLS0tLS18LS0tLS0tLS0tLS0tLXwKK3xpZCAgIAkgICB8U3RyaW5nIChyZXF1aXJlZCl8IFRvcG9sb2d5IElkICB8Cit8aG9zdC1wb3J0IHxTdHJpbmcgKHJlcXVpcmVkKXwgV29ya2VyIElkIHwKKworUmVzcG9uc2UgZmllbGRzOgorCit8RmllbGQgIHxWYWx1ZSB8RGVzY3JpcHRpb258Cit8LS0tLS0JfC0tLS0tIHwtLS0tLS0tLS0tLXwKK3xpZCAgIHwgU3RyaW5nIHwgV29ya2VyIGlkfAorfHN0YXR1cyB8IFN0cmluZyB8IFJlc3BvbnNlIFN0YXR1cyB8CisKK0V4YW1wbGVzOgorCitgYGBuby1oaWdobGlnaHQKKzEuIGh0dHA6Ly91aS1kYWVtb24taG9zdC1uYW1lOjgwODAvYXBpL3YxL3RvcG9sb2d5L3dvcmRjb3VudC0xLTE0NDY2MTQxNTAvcHJvZmlsaW5nL2R1bXBqc3RhY2svMTAuMTEuMS43OjY3MDEKK2BgYAorCitTYW1wbGUgcmVzcG9uc2U6CisKK2BgYGpzb24KK3sKKyAgICJzdGF0dXMiOiAib2siLAorICAgImlkIjogIjEwLjExLjEuNzo2NzAxIiwKK30KK2BgYAorCisjIyMgIC9hcGkvdjEvdG9wb2xvZ3kvOmlkL3Byb2ZpbGluZy9kdW1waGVhcC86aG9zdC1wb3J0IChHRVQpCisKK1JlcXVlc3QgdG8gZHVtcCBoZWFwIChqbWFwKSBvbiB3b3JrZXIuIFJldHVybnMgc3RhdHVzIGFuZCB3b3JrZXIgaWQgZm9yIHRoZSByZXF1ZXN0LgorCit8UGFyYW1ldGVyIHxWYWx1ZSAgIHxEZXNjcmlwdGlvbiAgfAorfC0tLS0tLS0tLS18LS0tLS0tLS18LS0tLS0tLS0tLS0tLXwKK3xpZCAgIAkgICB8U3RyaW5nIChyZXF1aXJlZCl8IFRvcG9sb2d5IElkICB8Cit8aG9zdC1wb3J0IHxTdHJpbmcgKHJlcXVpcmVkKXwgV29ya2VyIElkIHwKKworUmVzcG9uc2UgZmllbGRzOgorCit8RmllbGQgIHxWYWx1ZSB8RGVzY3JpcHRpb258Cit8LS0tLS0JfC0tLS0tIHwtLS0tLS0tLS0tLXwKK3xpZCAgIHwgU3RyaW5nIHwgV29ya2VyIGlkfAorfHN0YXR1cyB8IFN0cmluZyB8IFJlc3BvbnNlIFN0YXR1cyB8CisKK0V4YW1wbGVzOgorCitgYGBuby1oaWdobGlnaHQKKzEuIGh0dHA6Ly91aS1kYWVtb24taG9zdC1uYW1lOjgwODAvYXBpL3YxL3RvcG9sb2d5L3dvcmRjb3VudC0xLTE0NDY2MTQxNTAvcHJvZmlsaW5nL2R1bXBoZWFwLzEwLjExLjEuNzo2NzAxCitgYGAKKworU2FtcGxlIHJlc3BvbnNlOgorCitgYGBqc29uCit7CisgICAic3RhdHVzIjogIm9rIiwKKyAgICJpZCI6ICIxMC4xMS4xLjc6NjcwMSIsCit9CitgYGAKKworIyMjICAvYXBpL3YxL3RvcG9sb2d5LzppZC9wcm9maWxpbmcvcmVzdGFydHdvcmtlci86aG9zdC1wb3J0IChHRVQpCisKK1JlcXVlc3QgdG8gcmVxdWVzdCB0aGUgd29ya2VyLiBSZXR1cm5zIHN0YXR1cyBhbmQgd29ya2VyIGlkIGZvciB0aGUgcmVxdWVzdC4KKworfFBhcmFtZXRlciB8VmFsdWUgICB8RGVzY3JpcHRpb24gIHwKK3wtLS0tLS0tLS0tfC0tLS0tLS0tfC0tLS0tLS0tLS0tLS18Cit8aWQgICAJICAgfFN0cmluZyAocmVxdWlyZWQpfCBUb3BvbG9neSBJZCAgfAorfGhvc3QtcG9ydCB8U3RyaW5nIChyZXF1aXJlZCl8IFdvcmtlciBJZCB8CisKK1Jlc3BvbnNlIGZpZWxkczoKKworfEZpZWxkICB8VmFsdWUgfERlc2NyaXB0aW9ufAorfC0tLS0tCXwtLS0tLSB8LS0tLS0tLS0tLS18Cit8aWQgICB8IFN0cmluZyB8IFdvcmtlciBpZHwKK3xzdGF0dXMgfCBTdHJpbmcgfCBSZXNwb25zZSBTdGF0dXMgfAorCitFeGFtcGxlczoKKworYGBgbm8taGlnaGxpZ2h0CisxLiBodHRwOi8vdWktZGFlbW9uLWhvc3QtbmFtZTo4MDgwL2FwaS92MS90b3BvbG9neS93b3JkY291bnQtMS0xNDQ2NjE0MTUwL3Byb2ZpbGluZy9yZXN0YXJ0d29ya2VyLzEwLjExLjEuNzo2NzAxCitgYGAKKworU2FtcGxlIHJlc3BvbnNlOgorCitgYGBqc29uCit7CisgICAic3RhdHVzIjogIm9rIiwKKyAgICJpZCI6ICIxMC4xMS4xLjc6NjcwMSIsCit9CitgYGAKKwogIyMgUE9TVCBPcGVyYXRpb25zCiAKICMjIyAvYXBpL3YxL3RvcG9sb2d5LzppZC9hY3RpdmF0ZSAoUE9TVCkKZGlmZiAtLWdpdCBhL2RvY3MvaW1hZ2VzL3ZpZXdpbmdfbWV0cmljc193aXRoX1Zpc3VhbFZNLnBuZyBiL2RvY3MvaW1hZ2VzL3ZpZXdpbmdfbWV0cmljc193aXRoX1Zpc3VhbFZNLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2NkODFmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9pbWFnZXMvdmlld2luZ19tZXRyaWNzX3dpdGhfVmlzdWFsVk0ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3N0b3JtLXN0YXJ0ZXIvcG9tLnhtbCBiL2V4YW1wbGVzL3N0b3JtLXN0YXJ0ZXIvcG9tLnhtbAppbmRleCBiMjRjNDM2Li5hYzY0NzJlIDEwMDY0NAotLS0gYS9leGFtcGxlcy9zdG9ybS1zdGFydGVyL3BvbS54bWwKKysrIGIvZXhhbXBsZXMvc3Rvcm0tc3RhcnRlci9wb20ueG1sCkBAIC0zMyw2ICszMywxMCBAQAogCiAgIDxkZXBlbmRlbmNpZXM+CiAgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuaGRyaGlzdG9ncmFtPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+SGRySGlzdG9ncmFtPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KICAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgogICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+CiAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CkBAIC03NCw2ICs3OCwxMyBAQAogICAgIDwvZGVwZW5kZW5jeT4KICAgICAgIDxkZXBlbmRlbmN5PgogICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuc3Rvcm08L2dyb3VwSWQ+CisgICAgICAgICAgPGFydGlmYWN0SWQ+c3Rvcm0tY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgPHR5cGU+dGVzdC1qYXI8L3R5cGU+CisgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5zdG9ybTwvZ3JvdXBJZD4KICAgICAgICAgICA8YXJ0aWZhY3RJZD5tdWx0aWxhbmctamF2YXNjcmlwdDwvYXJ0aWZhY3RJZD4KICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CiAgICAgICA8L2RlcGVuZGVuY3k+CkBAIC05OCw2ICsxMDksMTEgQEAKICAgICA8L2RlcGVuZGVuY3k+CiAgICAgPGRlcGVuZGVuY3k+CiAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnN0b3JtPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+c3Rvcm0tbWV0cmljczwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnN0b3JtPC9ncm91cElkPgogICAgICAgPGFydGlmYWN0SWQ+c3Rvcm0ta2Fma2E8L2FydGlmYWN0SWQ+CiAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CiAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgpAQCAtMTQyLDcgKzE1OCw2IEBACiAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zaGFkZS1wbHVnaW48L2FydGlmYWN0SWQ+CiAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KICAgICAgICAgICAgICAgICA8Y3JlYXRlRGVwZW5kZW5jeVJlZHVjZWRQb20+dHJ1ZTwvY3JlYXRlRGVwZW5kZW5jeVJlZHVjZWRQb20+Ci0gICAgICAgICAgICAgICAgPG1pbmltaXplSmFyPnRydWU8L21pbmltaXplSmFyPgogICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgogICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CiAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3N0b3JtLXN0YXJ0ZXIvc3JjL2p2bS9zdG9ybS9zdGFydGVyL0Zhc3RXb3JkQ291bnRUb3BvbG9neS5qYXZhIGIvZXhhbXBsZXMvc3Rvcm0tc3RhcnRlci9zcmMvanZtL3N0b3JtL3N0YXJ0ZXIvRmFzdFdvcmRDb3VudFRvcG9sb2d5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY3OGFiZAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3N0b3JtLXN0YXJ0ZXIvc3JjL2p2bS9zdG9ybS9zdGFydGVyL0Zhc3RXb3JkQ291bnRUb3BvbG9neS5qYXZhCkBAIC0wLDAgKzEsMTk4IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBzdG9ybS5zdGFydGVyOworCitpbXBvcnQgYmFja3R5cGUuc3Rvcm0uQ29uZmlnOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLlN0b3JtU3VibWl0dGVyOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLmdlbmVyYXRlZC4qOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnNwb3V0LlNwb3V0T3V0cHV0Q29sbGVjdG9yOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnRhc2suVG9wb2xvZ3lDb250ZXh0OworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnRvcG9sb2d5LkJhc2ljT3V0cHV0Q29sbGVjdG9yOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnRvcG9sb2d5LklSaWNoQm9sdDsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS50b3BvbG9neS5PdXRwdXRGaWVsZHNEZWNsYXJlcjsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS50b3BvbG9neS5Ub3BvbG9neUJ1aWxkZXI7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0udG9wb2xvZ3kuYmFzZS5CYXNlQmFzaWNCb2x0OworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnRvcG9sb2d5LmJhc2UuQmFzZVJpY2hTcG91dDsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS50dXBsZS5GaWVsZHM7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0udHVwbGUuVHVwbGU7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0udHVwbGUuVmFsdWVzOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnV0aWxzLk5pbWJ1c0NsaWVudDsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS51dGlscy5VdGlsczsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRMb2NhbFJhbmRvbTsKKworLyoqCisgKiBXb3JkQ291bnQgYnV0IHRlaCBzcG91dCBkb2VzIG5vdCBzdG9wLCBhbmQgdGhlIGJvbHRzIGFyZSBpbXBsZW1lbnRlZCBpbgorICogamF2YS4gIFRoaXMgY2FuIHNob3cgaG93IGZhc3QgdGhlIHdvcmQgY291bnQgY2FuIHJ1bi4KKyAqLworcHVibGljIGNsYXNzIEZhc3RXb3JkQ291bnRUb3BvbG9neSB7CisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFzdFJhbmRvbVNlbnRlbmNlU3BvdXQgZXh0ZW5kcyBCYXNlUmljaFNwb3V0IHsKKyAgICBTcG91dE91dHB1dENvbGxlY3RvciBfY29sbGVjdG9yOworICAgIFJhbmRvbSBfcmFuZDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBDSE9JQ0VTID0geworICAgICAgICAibWFycnkgaGFkIGEgbGl0dGxlIGxhbWIgd2hvcyBmbGVlc2Ugd2FzIHdoaXRlIGFzIHNub3ciLAorICAgICAgICAiYW5kIGV2ZXJ5IHdoZXJlIHRoYXQgbWFycnkgd2VudCB0aGUgbGFtYiB3YXMgc3VyZSB0byBnbyIsCisgICAgICAgICJvbmUgdHdvIHRocmVlIGZvdXIgZml2ZSBzaXggc2V2ZW4gZWlnaHQgbmluZSB0ZW4iLAorICAgICAgICAidGhpcyBpcyBhIHRlc3Qgb2YgdGhlIGVtZXJnZW5jeSBicm9hZGNhc3Qgc3lzdGVtIHRoaXMgaXMgb25seSBhIHRlc3QiLAorICAgICAgICAicGV0ZXIgcGlwZXIgcGlja2VkIGEgcGVjayBvZiBwaWNrZWxlZCBwZXBwZXJzIgorICAgIH07CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvcGVuKE1hcCBjb25mLCBUb3BvbG9neUNvbnRleHQgY29udGV4dCwgU3BvdXRPdXRwdXRDb2xsZWN0b3IgY29sbGVjdG9yKSB7CisgICAgICBfY29sbGVjdG9yID0gY29sbGVjdG9yOworICAgICAgX3JhbmQgPSBUaHJlYWRMb2NhbFJhbmRvbS5jdXJyZW50KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgbmV4dFR1cGxlKCkgeworICAgICAgU3RyaW5nIHNlbnRlbmNlID0gQ0hPSUNFU1tfcmFuZC5uZXh0SW50KENIT0lDRVMubGVuZ3RoKV07CisgICAgICBfY29sbGVjdG9yLmVtaXQobmV3IFZhbHVlcyhzZW50ZW5jZSksIHNlbnRlbmNlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhY2soT2JqZWN0IGlkKSB7CisgICAgICAgIC8vSWdub3JlZAorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGZhaWwoT2JqZWN0IGlkKSB7CisgICAgICBfY29sbGVjdG9yLmVtaXQobmV3IFZhbHVlcyhpZCksIGlkKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkZWNsYXJlT3V0cHV0RmllbGRzKE91dHB1dEZpZWxkc0RlY2xhcmVyIGRlY2xhcmVyKSB7CisgICAgICBkZWNsYXJlci5kZWNsYXJlKG5ldyBGaWVsZHMoInNlbnRlbmNlIikpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU3BsaXRTZW50ZW5jZSBleHRlbmRzIEJhc2VCYXNpY0JvbHQgeworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoVHVwbGUgdHVwbGUsIEJhc2ljT3V0cHV0Q29sbGVjdG9yIGNvbGxlY3RvcikgeworICAgICAgU3RyaW5nIHNlbnRlbmNlID0gdHVwbGUuZ2V0U3RyaW5nKDApOworICAgICAgZm9yIChTdHJpbmcgd29yZDogc2VudGVuY2Uuc3BsaXQoIlxccysiKSkgeworICAgICAgICAgIGNvbGxlY3Rvci5lbWl0KG5ldyBWYWx1ZXMod29yZCwgMSkpOworICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRlY2xhcmVPdXRwdXRGaWVsZHMoT3V0cHV0RmllbGRzRGVjbGFyZXIgZGVjbGFyZXIpIHsKKyAgICAgIGRlY2xhcmVyLmRlY2xhcmUobmV3IEZpZWxkcygid29yZCIsICJjb3VudCIpKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgc3RhdGljIGNsYXNzIFdvcmRDb3VudCBleHRlbmRzIEJhc2VCYXNpY0JvbHQgeworICAgIE1hcDxTdHJpbmcsIEludGVnZXI+IGNvdW50cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoVHVwbGUgdHVwbGUsIEJhc2ljT3V0cHV0Q29sbGVjdG9yIGNvbGxlY3RvcikgeworICAgICAgU3RyaW5nIHdvcmQgPSB0dXBsZS5nZXRTdHJpbmcoMCk7CisgICAgICBJbnRlZ2VyIGNvdW50ID0gY291bnRzLmdldCh3b3JkKTsKKyAgICAgIGlmIChjb3VudCA9PSBudWxsKQorICAgICAgICBjb3VudCA9IDA7CisgICAgICBjb3VudCsrOworICAgICAgY291bnRzLnB1dCh3b3JkLCBjb3VudCk7CisgICAgICBjb2xsZWN0b3IuZW1pdChuZXcgVmFsdWVzKHdvcmQsIGNvdW50KSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZGVjbGFyZU91dHB1dEZpZWxkcyhPdXRwdXRGaWVsZHNEZWNsYXJlciBkZWNsYXJlcikgeworICAgICAgZGVjbGFyZXIuZGVjbGFyZShuZXcgRmllbGRzKCJ3b3JkIiwgImNvdW50IikpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBwcmludE1ldHJpY3MoTmltYnVzLkNsaWVudCBjbGllbnQsIFN0cmluZyBuYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBDbHVzdGVyU3VtbWFyeSBzdW1tYXJ5ID0gY2xpZW50LmdldENsdXN0ZXJJbmZvKCk7CisgICAgU3RyaW5nIGlkID0gbnVsbDsKKyAgICBmb3IgKFRvcG9sb2d5U3VtbWFyeSB0czogc3VtbWFyeS5nZXRfdG9wb2xvZ2llcygpKSB7CisgICAgICBpZiAobmFtZS5lcXVhbHModHMuZ2V0X25hbWUoKSkpIHsKKyAgICAgICAgaWQgPSB0cy5nZXRfaWQoKTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKGlkID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIkNvdWxkIG5vdCBmaW5kIGEgdG9wb2xvZ3kgbmFtZWQgIituYW1lKTsKKyAgICB9CisgICAgVG9wb2xvZ3lJbmZvIGluZm8gPSBjbGllbnQuZ2V0VG9wb2xvZ3lJbmZvKGlkKTsKKyAgICBpbnQgdXB0aW1lID0gaW5mby5nZXRfdXB0aW1lX3NlY3MoKTsKKyAgICBsb25nIGFja2VkID0gMDsKKyAgICBsb25nIGZhaWxlZCA9IDA7CisgICAgZG91YmxlIHdlaWdodGVkQXZnVG90YWwgPSAwLjA7CisgICAgZm9yIChFeGVjdXRvclN1bW1hcnkgZXhlYzogaW5mby5nZXRfZXhlY3V0b3JzKCkpIHsKKyAgICAgIGlmICgic3BvdXQiLmVxdWFscyhleGVjLmdldF9jb21wb25lbnRfaWQoKSkpIHsKKyAgICAgICAgU3BvdXRTdGF0cyBzdGF0cyA9IGV4ZWMuZ2V0X3N0YXRzKCkuZ2V0X3NwZWNpZmljKCkuZ2V0X3Nwb3V0KCk7CisgICAgICAgIE1hcDxTdHJpbmcsIExvbmc+IGZhaWxlZE1hcCA9IHN0YXRzLmdldF9mYWlsZWQoKS5nZXQoIjphbGwtdGltZSIpOworICAgICAgICBNYXA8U3RyaW5nLCBMb25nPiBhY2tlZE1hcCA9IHN0YXRzLmdldF9hY2tlZCgpLmdldCgiOmFsbC10aW1lIik7CisgICAgICAgIE1hcDxTdHJpbmcsIERvdWJsZT4gYXZnTGF0TWFwID0gc3RhdHMuZ2V0X2NvbXBsZXRlX21zX2F2ZygpLmdldCgiOmFsbC10aW1lIik7CisgICAgICAgIGZvciAoU3RyaW5nIGtleTogYWNrZWRNYXAua2V5U2V0KCkpIHsKKyAgICAgICAgICBpZiAoZmFpbGVkTWFwICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgTG9uZyB0bXAgPSBmYWlsZWRNYXAuZ2V0KGtleSk7CisgICAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgZmFpbGVkICs9IHRtcDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgICBsb25nIGFja1ZhbCA9IGFja2VkTWFwLmdldChrZXkpOworICAgICAgICAgIGRvdWJsZSBsYXRWYWwgPSBhdmdMYXRNYXAuZ2V0KGtleSkgKiBhY2tWYWw7CisgICAgICAgICAgYWNrZWQgKz0gYWNrVmFsOworICAgICAgICAgIHdlaWdodGVkQXZnVG90YWwgKz0gbGF0VmFsOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIGRvdWJsZSBhdmdMYXRlbmN5ID0gd2VpZ2h0ZWRBdmdUb3RhbC9hY2tlZDsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oInVwdGltZTogIit1cHRpbWUrIiBhY2tlZDogIithY2tlZCsiIGF2Z0xhdGVuY3k6ICIrYXZnTGF0ZW5jeSsiIGFja2VkL3NlYzogIisoKChkb3VibGUpYWNrZWQpL3VwdGltZSsiIGZhaWxlZDogIitmYWlsZWQpKTsKKyAgfSAKKworICBwdWJsaWMgc3RhdGljIHZvaWQga2lsbChOaW1idXMuQ2xpZW50IGNsaWVudCwgU3RyaW5nIG5hbWUpIHRocm93cyBFeGNlcHRpb24geworICAgIEtpbGxPcHRpb25zIG9wdHMgPSBuZXcgS2lsbE9wdGlvbnMoKTsKKyAgICBvcHRzLnNldF93YWl0X3NlY3MoMCk7CisgICAgY2xpZW50LmtpbGxUb3BvbG9neVdpdGhPcHRzKG5hbWUsIG9wdHMpOworICB9IAorCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworCisgICAgVG9wb2xvZ3lCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgVG9wb2xvZ3lCdWlsZGVyKCk7CisKKyAgICBidWlsZGVyLnNldFNwb3V0KCJzcG91dCIsIG5ldyBGYXN0UmFuZG9tU2VudGVuY2VTcG91dCgpLCA0KTsKKworICAgIGJ1aWxkZXIuc2V0Qm9sdCgic3BsaXQiLCBuZXcgU3BsaXRTZW50ZW5jZSgpLCA0KS5zaHVmZmxlR3JvdXBpbmcoInNwb3V0Iik7CisgICAgYnVpbGRlci5zZXRCb2x0KCJjb3VudCIsIG5ldyBXb3JkQ291bnQoKSwgNCkuZmllbGRzR3JvdXBpbmcoInNwbGl0IiwgbmV3IEZpZWxkcygid29yZCIpKTsKKworICAgIENvbmZpZyBjb25mID0gbmV3IENvbmZpZygpOworICAgIGNvbmYucmVnaXN0ZXJNZXRyaWNzQ29uc3VtZXIoYmFja3R5cGUuc3Rvcm0ubWV0cmljLkxvZ2dpbmdNZXRyaWNzQ29uc3VtZXIuY2xhc3MpOworCisgICAgU3RyaW5nIG5hbWUgPSAid2MtdGVzdCI7CisgICAgaWYgKGFyZ3MgIT0gbnVsbCAmJiBhcmdzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgbmFtZSA9IGFyZ3NbMF07CisgICAgfQorCisgICAgY29uZi5zZXROdW1Xb3JrZXJzKDEpOworICAgIFN0b3JtU3VibWl0dGVyLnN1Ym1pdFRvcG9sb2d5V2l0aFByb2dyZXNzQmFyKG5hbWUsIGNvbmYsIGJ1aWxkZXIuY3JlYXRlVG9wb2xvZ3koKSk7CisKKyAgICBNYXAgY2x1c3RlckNvbmYgPSBVdGlscy5yZWFkU3Rvcm1Db25maWcoKTsKKyAgICBjbHVzdGVyQ29uZi5wdXRBbGwoVXRpbHMucmVhZENvbW1hbmRMaW5lT3B0cygpKTsKKyAgICBOaW1idXMuQ2xpZW50IGNsaWVudCA9IE5pbWJ1c0NsaWVudC5nZXRDb25maWd1cmVkQ2xpZW50KGNsdXN0ZXJDb25mKS5nZXRDbGllbnQoKTsKKworICAgIC8vU2xlZXAgZm9yIDUgbWlucworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgICAgICBUaHJlYWQuc2xlZXAoMzAgKiAxMDAwKTsKKyAgICAgICAgcHJpbnRNZXRyaWNzKGNsaWVudCwgbmFtZSk7CisgICAgfQorICAgIGtpbGwoY2xpZW50LCBuYW1lKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvc3Rvcm0tc3RhcnRlci9zcmMvanZtL3N0b3JtL3N0YXJ0ZXIvSW5PcmRlckRlbGl2ZXJ5VGVzdC5qYXZhIGIvZXhhbXBsZXMvc3Rvcm0tc3RhcnRlci9zcmMvanZtL3N0b3JtL3N0YXJ0ZXIvSW5PcmRlckRlbGl2ZXJ5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkZjA2ODgKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9zdG9ybS1zdGFydGVyL3NyYy9qdm0vc3Rvcm0vc3RhcnRlci9Jbk9yZGVyRGVsaXZlcnlUZXN0LmphdmEKQEAgLTAsMCArMSwxNzUgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIHN0b3JtLnN0YXJ0ZXI7CisKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5Db25maWc7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0uU3Rvcm1TdWJtaXR0ZXI7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0uZ2VuZXJhdGVkLio7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0uc3BvdXQuU3BvdXRPdXRwdXRDb2xsZWN0b3I7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0udGFzay5Ub3BvbG9neUNvbnRleHQ7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0udG9wb2xvZ3kuQmFzaWNPdXRwdXRDb2xsZWN0b3I7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0udG9wb2xvZ3kuRmFpbGVkRXhjZXB0aW9uOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnRvcG9sb2d5LklSaWNoQm9sdDsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS50b3BvbG9neS5PdXRwdXRGaWVsZHNEZWNsYXJlcjsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS50b3BvbG9neS5Ub3BvbG9neUJ1aWxkZXI7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0udG9wb2xvZ3kuYmFzZS5CYXNlQmFzaWNCb2x0OworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnRvcG9sb2d5LmJhc2UuQmFzZVJpY2hTcG91dDsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS50dXBsZS5GaWVsZHM7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0udHVwbGUuVHVwbGU7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0udHVwbGUuVmFsdWVzOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnV0aWxzLk5pbWJ1c0NsaWVudDsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS51dGlscy5VdGlsczsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKKworcHVibGljIGNsYXNzIEluT3JkZXJEZWxpdmVyeVRlc3QgeworICBwdWJsaWMgc3RhdGljIGNsYXNzIEluT3JkZXJTcG91dCBleHRlbmRzIEJhc2VSaWNoU3BvdXQgeworICAgIFNwb3V0T3V0cHV0Q29sbGVjdG9yIF9jb2xsZWN0b3I7CisgICAgaW50IF9iYXNlID0gMDsKKyAgICBpbnQgX2kgPSAwOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb3BlbihNYXAgY29uZiwgVG9wb2xvZ3lDb250ZXh0IGNvbnRleHQsIFNwb3V0T3V0cHV0Q29sbGVjdG9yIGNvbGxlY3RvcikgeworICAgICAgX2NvbGxlY3RvciA9IGNvbGxlY3RvcjsKKyAgICAgIF9iYXNlID0gY29udGV4dC5nZXRUaGlzVGFza0luZGV4KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgbmV4dFR1cGxlKCkgeworICAgICAgVmFsdWVzIHYgPSBuZXcgVmFsdWVzKF9iYXNlLCBfaSk7CisgICAgICBfY29sbGVjdG9yLmVtaXQodiwgIkFDSyIpOworICAgICAgX2krKzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhY2soT2JqZWN0IGlkKSB7CisgICAgICAvL0lnbm9yZWQKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmYWlsKE9iamVjdCBpZCkgeworICAgICAgLy9JZ25vcmVkCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZGVjbGFyZU91dHB1dEZpZWxkcyhPdXRwdXRGaWVsZHNEZWNsYXJlciBkZWNsYXJlcikgeworICAgICAgZGVjbGFyZXIuZGVjbGFyZShuZXcgRmllbGRzKCJjMSIsICJjMiIpKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgc3RhdGljIGNsYXNzIENoZWNrIGV4dGVuZHMgQmFzZUJhc2ljQm9sdCB7CisgICAgTWFwPEludGVnZXIsIEludGVnZXI+IGV4cGVjdGVkID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgSW50ZWdlcj4oKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoVHVwbGUgdHVwbGUsIEJhc2ljT3V0cHV0Q29sbGVjdG9yIGNvbGxlY3RvcikgeworICAgICAgSW50ZWdlciBjMSA9IHR1cGxlLmdldEludGVnZXIoMCk7CisgICAgICBJbnRlZ2VyIGMyID0gdHVwbGUuZ2V0SW50ZWdlcigxKTsKKyAgICAgIEludGVnZXIgZXhwID0gZXhwZWN0ZWQuZ2V0KGMxKTsKKyAgICAgIGlmIChleHAgPT0gbnVsbCkgZXhwID0gMDsKKyAgICAgIGlmIChjMi5pbnRWYWx1ZSgpICE9IGV4cC5pbnRWYWx1ZSgpKSB7CisgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGMxKyIgIitjMisiICE9ICIrZXhwKTsKKyAgICAgICAgICB0aHJvdyBuZXcgRmFpbGVkRXhjZXB0aW9uKGMxKyIgIitjMisiICE9ICIrZXhwKTsKKyAgICAgIH0KKyAgICAgIGV4cCA9IGMyICsgMTsKKyAgICAgIGV4cGVjdGVkLnB1dChjMSwgZXhwKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkZWNsYXJlT3V0cHV0RmllbGRzKE91dHB1dEZpZWxkc0RlY2xhcmVyIGRlY2xhcmVyKSB7CisgICAgICAvL0VtcHR5CisgICAgfQorICB9CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIHByaW50TWV0cmljcyhOaW1idXMuQ2xpZW50IGNsaWVudCwgU3RyaW5nIG5hbWUpIHRocm93cyBFeGNlcHRpb24geworICAgIENsdXN0ZXJTdW1tYXJ5IHN1bW1hcnkgPSBjbGllbnQuZ2V0Q2x1c3RlckluZm8oKTsKKyAgICBTdHJpbmcgaWQgPSBudWxsOworICAgIGZvciAoVG9wb2xvZ3lTdW1tYXJ5IHRzOiBzdW1tYXJ5LmdldF90b3BvbG9naWVzKCkpIHsKKyAgICAgIGlmIChuYW1lLmVxdWFscyh0cy5nZXRfbmFtZSgpKSkgeworICAgICAgICBpZCA9IHRzLmdldF9pZCgpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoaWQgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiQ291bGQgbm90IGZpbmQgYSB0b3BvbG9neSBuYW1lZCAiK25hbWUpOworICAgIH0KKyAgICBUb3BvbG9neUluZm8gaW5mbyA9IGNsaWVudC5nZXRUb3BvbG9neUluZm8oaWQpOworICAgIGludCB1cHRpbWUgPSBpbmZvLmdldF91cHRpbWVfc2VjcygpOworICAgIGxvbmcgYWNrZWQgPSAwOworICAgIGxvbmcgZmFpbGVkID0gMDsKKyAgICBkb3VibGUgd2VpZ2h0ZWRBdmdUb3RhbCA9IDAuMDsKKyAgICBmb3IgKEV4ZWN1dG9yU3VtbWFyeSBleGVjOiBpbmZvLmdldF9leGVjdXRvcnMoKSkgeworICAgICAgaWYgKCJzcG91dCIuZXF1YWxzKGV4ZWMuZ2V0X2NvbXBvbmVudF9pZCgpKSkgeworICAgICAgICBTcG91dFN0YXRzIHN0YXRzID0gZXhlYy5nZXRfc3RhdHMoKS5nZXRfc3BlY2lmaWMoKS5nZXRfc3BvdXQoKTsKKyAgICAgICAgTWFwPFN0cmluZywgTG9uZz4gZmFpbGVkTWFwID0gc3RhdHMuZ2V0X2ZhaWxlZCgpLmdldCgiOmFsbC10aW1lIik7CisgICAgICAgIE1hcDxTdHJpbmcsIExvbmc+IGFja2VkTWFwID0gc3RhdHMuZ2V0X2Fja2VkKCkuZ2V0KCI6YWxsLXRpbWUiKTsKKyAgICAgICAgTWFwPFN0cmluZywgRG91YmxlPiBhdmdMYXRNYXAgPSBzdGF0cy5nZXRfY29tcGxldGVfbXNfYXZnKCkuZ2V0KCI6YWxsLXRpbWUiKTsKKyAgICAgICAgZm9yIChTdHJpbmcga2V5OiBhY2tlZE1hcC5rZXlTZXQoKSkgeworICAgICAgICAgIGlmIChmYWlsZWRNYXAgIT0gbnVsbCkgeworICAgICAgICAgICAgICBMb25nIHRtcCA9IGZhaWxlZE1hcC5nZXQoa2V5KTsKKyAgICAgICAgICAgICAgaWYgKHRtcCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICBmYWlsZWQgKz0gdG1wOworICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGxvbmcgYWNrVmFsID0gYWNrZWRNYXAuZ2V0KGtleSk7CisgICAgICAgICAgZG91YmxlIGxhdFZhbCA9IGF2Z0xhdE1hcC5nZXQoa2V5KSAqIGFja1ZhbDsKKyAgICAgICAgICBhY2tlZCArPSBhY2tWYWw7CisgICAgICAgICAgd2VpZ2h0ZWRBdmdUb3RhbCArPSBsYXRWYWw7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZG91YmxlIGF2Z0xhdGVuY3kgPSB3ZWlnaHRlZEF2Z1RvdGFsL2Fja2VkOworICAgIFN5c3RlbS5vdXQucHJpbnRsbigidXB0aW1lOiAiK3VwdGltZSsiIGFja2VkOiAiK2Fja2VkKyIgYXZnTGF0ZW5jeTogIithdmdMYXRlbmN5KyIgYWNrZWQvc2VjOiAiKygoKGRvdWJsZSlhY2tlZCkvdXB0aW1lKyIgZmFpbGVkOiAiK2ZhaWxlZCkpOworICB9IAorCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBraWxsKE5pbWJ1cy5DbGllbnQgY2xpZW50LCBTdHJpbmcgbmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgS2lsbE9wdGlvbnMgb3B0cyA9IG5ldyBLaWxsT3B0aW9ucygpOworICAgIG9wdHMuc2V0X3dhaXRfc2VjcygwKTsKKyAgICBjbGllbnQua2lsbFRvcG9sb2d5V2l0aE9wdHMobmFtZSwgb3B0cyk7CisgIH0gCisKKyAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICBUb3BvbG9neUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBUb3BvbG9neUJ1aWxkZXIoKTsKKworICAgIGJ1aWxkZXIuc2V0U3BvdXQoInNwb3V0IiwgbmV3IEluT3JkZXJTcG91dCgpLCA4KTsKKyAgICBidWlsZGVyLnNldEJvbHQoImNvdW50IiwgbmV3IENoZWNrKCksIDgpLmZpZWxkc0dyb3VwaW5nKCJzcG91dCIsIG5ldyBGaWVsZHMoImMxIikpOworCisgICAgQ29uZmlnIGNvbmYgPSBuZXcgQ29uZmlnKCk7CisgICAgY29uZi5yZWdpc3Rlck1ldHJpY3NDb25zdW1lcihiYWNrdHlwZS5zdG9ybS5tZXRyaWMuTG9nZ2luZ01ldHJpY3NDb25zdW1lci5jbGFzcyk7CisKKyAgICBTdHJpbmcgbmFtZSA9ICJpbi1vcmRlci10ZXN0IjsKKyAgICBpZiAoYXJncyAhPSBudWxsICYmIGFyZ3MubGVuZ3RoID4gMCkgeworICAgICAgICBuYW1lID0gYXJnc1swXTsKKyAgICB9CisKKyAgICBjb25mLnNldE51bVdvcmtlcnMoMSk7CisgICAgU3Rvcm1TdWJtaXR0ZXIuc3VibWl0VG9wb2xvZ3lXaXRoUHJvZ3Jlc3NCYXIobmFtZSwgY29uZiwgYnVpbGRlci5jcmVhdGVUb3BvbG9neSgpKTsKKworICAgIE1hcCBjbHVzdGVyQ29uZiA9IFV0aWxzLnJlYWRTdG9ybUNvbmZpZygpOworICAgIGNsdXN0ZXJDb25mLnB1dEFsbChVdGlscy5yZWFkQ29tbWFuZExpbmVPcHRzKCkpOworICAgIE5pbWJ1cy5DbGllbnQgY2xpZW50ID0gTmltYnVzQ2xpZW50LmdldENvbmZpZ3VyZWRDbGllbnQoY2x1c3RlckNvbmYpLmdldENsaWVudCgpOworCisgICAgLy9TbGVlcCBmb3IgNTAgbWlucworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTA7IGkrKykgeworICAgICAgICBUaHJlYWQuc2xlZXAoMzAgKiAxMDAwKTsKKyAgICAgICAgcHJpbnRNZXRyaWNzKGNsaWVudCwgbmFtZSk7CisgICAgfQorICAgIGtpbGwoY2xpZW50LCBuYW1lKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvc3Rvcm0tc3RhcnRlci9zcmMvanZtL3N0b3JtL3N0YXJ0ZXIvTXVsdGlwbGVMb2dnZXJUb3BvbG9neS5qYXZhIGIvZXhhbXBsZXMvc3Rvcm0tc3RhcnRlci9zcmMvanZtL3N0b3JtL3N0YXJ0ZXIvTXVsdGlwbGVMb2dnZXJUb3BvbG9neS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyODVmZjkKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9zdG9ybS1zdGFydGVyL3NyYy9qdm0vc3Rvcm0vc3RhcnRlci9NdWx0aXBsZUxvZ2dlclRvcG9sb2d5LmphdmEKQEAgLTAsMCArMSwxMDUgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIHN0b3JtLnN0YXJ0ZXI7CisKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5Db25maWc7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0uTG9jYWxDbHVzdGVyOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLlN0b3JtU3VibWl0dGVyOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnRhc2suT3V0cHV0Q29sbGVjdG9yOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnRhc2suVG9wb2xvZ3lDb250ZXh0OworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnRlc3RpbmcuVGVzdFdvcmRTcG91dDsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS50b3BvbG9neS5PdXRwdXRGaWVsZHNEZWNsYXJlcjsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS50b3BvbG9neS5Ub3BvbG9neUJ1aWxkZXI7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0udG9wb2xvZ3kuYmFzZS5CYXNlUmljaEJvbHQ7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0udHVwbGUuRmllbGRzOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnR1cGxlLlR1cGxlOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnR1cGxlLlZhbHVlczsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS51dGlscy5VdGlsczsKKworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIFRoaXMgaXMgYSBiYXNpYyBleGFtcGxlIG9mIGEgU3Rvcm0gdG9wb2xvZ3kuCisgKi8KK3B1YmxpYyBjbGFzcyBNdWx0aXBsZUxvZ2dlclRvcG9sb2d5IHsKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBFeGNsYW1hdGlvbkxvZ2dpbmdCb2x0IGV4dGVuZHMgQmFzZVJpY2hCb2x0IHsKKyAgICBPdXRwdXRDb2xsZWN0b3IgX2NvbGxlY3RvcjsKKyAgICBMb2dnZXIgX3Jvb3RMb2dnZXIgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlciAoTG9nZ2VyLlJPT1RfTE9HR0VSX05BTUUpOworICAgIC8vIGVuc3VyZSB0aGUgbG9nZ2VycyBhcmUgY29uZmlndXJlZCBpbiB0aGUgd29ya2VyLnhtbCBiZWZvcmUKKyAgICAvLyB0cnlpbmcgdG8gdXNlIHRoZW0gaGVyZQorICAgIExvZ2dlciBfbG9nZ2VyID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIgKCJjb20ubXlhcHAiKTsKKyAgICBMb2dnZXIgX3N1YkxvZ2dlciA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyICgiY29tLm15YXBwLnN1YiIpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcHJlcGFyZShNYXAgY29uZiwgVG9wb2xvZ3lDb250ZXh0IGNvbnRleHQsIE91dHB1dENvbGxlY3RvciBjb2xsZWN0b3IpIHsKKyAgICAgIF9jb2xsZWN0b3IgPSBjb2xsZWN0b3I7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZShUdXBsZSB0dXBsZSkgeworICAgICAgX3Jvb3RMb2dnZXIuZGVidWcgKCJyb290OiBUaGlzIGlzIGEgREVCVUcgbWVzc2FnZSIpOworICAgICAgX3Jvb3RMb2dnZXIuaW5mbyAoInJvb3Q6IFRoaXMgaXMgYW4gSU5GTyBtZXNzYWdlIik7CisgICAgICBfcm9vdExvZ2dlci53YXJuICgicm9vdDogVGhpcyBpcyBhIFdBUk4gbWVzc2FnZSIpOworICAgICAgX3Jvb3RMb2dnZXIuZXJyb3IgKCJyb290OiBUaGlzIGlzIGFuIEVSUk9SIG1lc3NhZ2UiKTsKKworICAgICAgX2xvZ2dlci5kZWJ1ZyAoIm15YXBwOiBUaGlzIGlzIGEgREVCVUcgbWVzc2FnZSIpOworICAgICAgX2xvZ2dlci5pbmZvICgibXlhcHA6IFRoaXMgaXMgYW4gSU5GTyBtZXNzYWdlIik7CisgICAgICBfbG9nZ2VyLndhcm4gKCJteWFwcDogVGhpcyBpcyBhIFdBUk4gbWVzc2FnZSIpOworICAgICAgX2xvZ2dlci5lcnJvciAoIm15YXBwOiBUaGlzIGlzIGFuIEVSUk9SIG1lc3NhZ2UiKTsKKworICAgICAgX3N1YkxvZ2dlci5kZWJ1ZyAoIm15YXBwLnN1YjogVGhpcyBpcyBhIERFQlVHIG1lc3NhZ2UiKTsKKyAgICAgIF9zdWJMb2dnZXIuaW5mbyAoIm15YXBwLnN1YjogVGhpcyBpcyBhbiBJTkZPIG1lc3NhZ2UiKTsKKyAgICAgIF9zdWJMb2dnZXIud2FybiAoIm15YXBwLnN1YjogVGhpcyBpcyBhIFdBUk4gbWVzc2FnZSIpOworICAgICAgX3N1YkxvZ2dlci5lcnJvciAoIm15YXBwLnN1YjogVGhpcyBpcyBhbiBFUlJPUiBtZXNzYWdlIik7CisKKyAgICAgIF9jb2xsZWN0b3IuZW1pdCh0dXBsZSwgbmV3IFZhbHVlcyh0dXBsZS5nZXRTdHJpbmcoMCkgKyAiISEhIikpOworICAgICAgX2NvbGxlY3Rvci5hY2sodHVwbGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRlY2xhcmVPdXRwdXRGaWVsZHMoT3V0cHV0RmllbGRzRGVjbGFyZXIgZGVjbGFyZXIpIHsKKyAgICAgIGRlY2xhcmVyLmRlY2xhcmUobmV3IEZpZWxkcygid29yZCIpKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUb3BvbG9neUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBUb3BvbG9neUJ1aWxkZXIoKTsKKworICAgIGJ1aWxkZXIuc2V0U3BvdXQoIndvcmQiLCBuZXcgVGVzdFdvcmRTcG91dCgpLCAxMCk7CisgICAgYnVpbGRlci5zZXRCb2x0KCJleGNsYWltMSIsIG5ldyBFeGNsYW1hdGlvbkxvZ2dpbmdCb2x0KCksIDMpLnNodWZmbGVHcm91cGluZygid29yZCIpOworICAgIGJ1aWxkZXIuc2V0Qm9sdCgiZXhjbGFpbTIiLCBuZXcgRXhjbGFtYXRpb25Mb2dnaW5nQm9sdCgpLCAyKS5zaHVmZmxlR3JvdXBpbmcoImV4Y2xhaW0xIik7CisKKyAgICBDb25maWcgY29uZiA9IG5ldyBDb25maWcoKTsKKyAgICBjb25mLnNldERlYnVnKHRydWUpOworCisgICAgaWYgKGFyZ3MgIT0gbnVsbCAmJiBhcmdzLmxlbmd0aCA+IDApIHsKKyAgICAgIGNvbmYuc2V0TnVtV29ya2VycygyKTsKKyAgICAgIFN0b3JtU3VibWl0dGVyLnN1Ym1pdFRvcG9sb2d5V2l0aFByb2dyZXNzQmFyKGFyZ3NbMF0sIGNvbmYsIGJ1aWxkZXIuY3JlYXRlVG9wb2xvZ3koKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIExvY2FsQ2x1c3RlciBjbHVzdGVyID0gbmV3IExvY2FsQ2x1c3RlcigpOworICAgICAgY2x1c3Rlci5zdWJtaXRUb3BvbG9neSgidGVzdCIsIGNvbmYsIGJ1aWxkZXIuY3JlYXRlVG9wb2xvZ3koKSk7CisgICAgICBVdGlscy5zbGVlcCgxMDAwMCk7CisgICAgICBjbHVzdGVyLmtpbGxUb3BvbG9neSgidGVzdCIpOworICAgICAgY2x1c3Rlci5zaHV0ZG93bigpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvc3Rvcm0tc3RhcnRlci9zcmMvanZtL3N0b3JtL3N0YXJ0ZXIvUmVzb3VyY2VBd2FyZUV4YW1wbGVUb3BvbG9neS5qYXZhIGIvZXhhbXBsZXMvc3Rvcm0tc3RhcnRlci9zcmMvanZtL3N0b3JtL3N0YXJ0ZXIvUmVzb3VyY2VBd2FyZUV4YW1wbGVUb3BvbG9neS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MjI1ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9zdG9ybS1zdGFydGVyL3NyYy9qdm0vc3Rvcm0vc3RhcnRlci9SZXNvdXJjZUF3YXJlRXhhbXBsZVRvcG9sb2d5LmphdmEKQEAgLTAsMCArMSwxMDEgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIHN0b3JtLnN0YXJ0ZXI7CisKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5Db25maWc7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0uTG9jYWxDbHVzdGVyOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLlN0b3JtU3VibWl0dGVyOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnRhc2suT3V0cHV0Q29sbGVjdG9yOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnRhc2suVG9wb2xvZ3lDb250ZXh0OworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnRlc3RpbmcuVGVzdFdvcmRTcG91dDsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS50b3BvbG9neS5Cb2x0RGVjbGFyZXI7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0udG9wb2xvZ3kuT3V0cHV0RmllbGRzRGVjbGFyZXI7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0udG9wb2xvZ3kuU3BvdXREZWNsYXJlcjsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS50b3BvbG9neS5Ub3BvbG9neUJ1aWxkZXI7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0udG9wb2xvZ3kuYmFzZS5CYXNlUmljaEJvbHQ7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0udHVwbGUuRmllbGRzOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnR1cGxlLlR1cGxlOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnR1cGxlLlZhbHVlczsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS51dGlscy5VdGlsczsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK3B1YmxpYyBjbGFzcyBSZXNvdXJjZUF3YXJlRXhhbXBsZVRvcG9sb2d5IHsKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBFeGNsYW1hdGlvbkJvbHQgZXh0ZW5kcyBCYXNlUmljaEJvbHQgeworICAgIE91dHB1dENvbGxlY3RvciBfY29sbGVjdG9yOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcHJlcGFyZShNYXAgY29uZiwgVG9wb2xvZ3lDb250ZXh0IGNvbnRleHQsIE91dHB1dENvbGxlY3RvciBjb2xsZWN0b3IpIHsKKyAgICAgIF9jb2xsZWN0b3IgPSBjb2xsZWN0b3I7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZShUdXBsZSB0dXBsZSkgeworICAgICAgX2NvbGxlY3Rvci5lbWl0KHR1cGxlLCBuZXcgVmFsdWVzKHR1cGxlLmdldFN0cmluZygwKSArICIhISEiKSk7CisgICAgICBfY29sbGVjdG9yLmFjayh0dXBsZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZGVjbGFyZU91dHB1dEZpZWxkcyhPdXRwdXRGaWVsZHNEZWNsYXJlciBkZWNsYXJlcikgeworICAgICAgZGVjbGFyZXIuZGVjbGFyZShuZXcgRmllbGRzKCJ3b3JkIikpOworICAgIH0KKworCisgIH0KKworICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBUb3BvbG9neUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBUb3BvbG9neUJ1aWxkZXIoKTsKKworICAgIFNwb3V0RGVjbGFyZXIgc3BvdXQgPSAgYnVpbGRlci5zZXRTcG91dCgid29yZCIsIG5ldyBUZXN0V29yZFNwb3V0KCksIDEwKTsKKyAgICAvL3NldCBjcHUgcmVxdWlyZW1lbnQKKyAgICBzcG91dC5zZXRDUFVMb2FkKDIwKTsKKyAgICAvL3NldCBvbmhlYXAgYW5kIG9mZmhlYXAgbWVtb3J5IHJlcXVpcmVtZW50CisgICAgc3BvdXQuc2V0TWVtb3J5TG9hZCg2NCwgMTYpOworCisgICAgQm9sdERlY2xhcmVyIGJvbHQxID0gYnVpbGRlci5zZXRCb2x0KCJleGNsYWltMSIsIG5ldyBFeGNsYW1hdGlvbkJvbHQoKSwgMykuc2h1ZmZsZUdyb3VwaW5nKCJ3b3JkIik7CisgICAgLy9zZXRzIGNwdSByZXF1aXJlbWVudC4gIE5vdCBuZWNjZXNzYXJ5IHRvIHNldCBib3RoIENQVSBhbmQgbWVtb3J5LgorICAgIC8vRm9yIHJlcXVpcmVtZW50cyBub3Qgc2V0LCBhIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSB1c2VkCisgICAgYm9sdDEuc2V0Q1BVTG9hZCgxNSk7CisKKyAgICBCb2x0RGVjbGFyZXIgYm9sdDIgPSBidWlsZGVyLnNldEJvbHQoImV4Y2xhaW0yIiwgbmV3IEV4Y2xhbWF0aW9uQm9sdCgpLCAyKS5zaHVmZmxlR3JvdXBpbmcoImV4Y2xhaW0xIik7CisgICAgYm9sdDIuc2V0TWVtb3J5TG9hZCgxMDApOworCisgICAgQ29uZmlnIGNvbmYgPSBuZXcgQ29uZmlnKCk7CisgICAgY29uZi5zZXREZWJ1Zyh0cnVlKTsKKworICAgIC8qKgorICAgICAqIFVzZSB0byBsaW1pdCB0aGUgbWF4aW11bSBhbW91bnQgb2YgbWVtb3J5IChpbiBNQikgYWxsb2NhdGVkIHRvIG9uZSB3b3JrZXIgcHJvY2Vzcy4KKyAgICAgKiBDYW4gYmUgdXNlZCB0byBzcHJlYWQgZXhlY3V0b3JzIHRvIHRvIG11bHRpcGxlIHdvcmtlcnMKKyAgICAgKi8KKyAgICBjb25mLnNldFRvcG9sb2d5V29ya2VyTWF4SGVhcFNpemUoMTAyNC4wKTsKKworICAgIGlmIChhcmdzICE9IG51bGwgJiYgYXJncy5sZW5ndGggPiAwKSB7CisgICAgICBjb25mLnNldE51bVdvcmtlcnMoMyk7CisKKyAgICAgIFN0b3JtU3VibWl0dGVyLnN1Ym1pdFRvcG9sb2d5V2l0aFByb2dyZXNzQmFyKGFyZ3NbMF0sIGNvbmYsIGJ1aWxkZXIuY3JlYXRlVG9wb2xvZ3koKSk7CisgICAgfQorICAgIGVsc2UgeworCisgICAgICBMb2NhbENsdXN0ZXIgY2x1c3RlciA9IG5ldyBMb2NhbENsdXN0ZXIoKTsKKyAgICAgIGNsdXN0ZXIuc3VibWl0VG9wb2xvZ3koInRlc3QiLCBjb25mLCBidWlsZGVyLmNyZWF0ZVRvcG9sb2d5KCkpOworICAgICAgVXRpbHMuc2xlZXAoMTAwMDApOworICAgICAgY2x1c3Rlci5raWxsVG9wb2xvZ3koInRlc3QiKTsKKyAgICAgIGNsdXN0ZXIuc2h1dGRvd24oKTsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3N0b3JtLXN0YXJ0ZXIvc3JjL2p2bS9zdG9ybS9zdGFydGVyL1NsaWRpbmdXaW5kb3dUb3BvbG9neS5qYXZhIGIvZXhhbXBsZXMvc3Rvcm0tc3RhcnRlci9zcmMvanZtL3N0b3JtL3N0YXJ0ZXIvU2xpZGluZ1dpbmRvd1RvcG9sb2d5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVlZThkZQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3N0b3JtLXN0YXJ0ZXIvc3JjL2p2bS9zdG9ybS9zdGFydGVyL1NsaWRpbmdXaW5kb3dUb3BvbG9neS5qYXZhCkBAIC0wLDAgKzEsMTg1IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBzdG9ybS5zdGFydGVyOworCitpbXBvcnQgYmFja3R5cGUuc3Rvcm0uQ29uZmlnOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLkxvY2FsQ2x1c3RlcjsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5TdG9ybVN1Ym1pdHRlcjsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5zcG91dC5TcG91dE91dHB1dENvbGxlY3RvcjsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS50YXNrLk91dHB1dENvbGxlY3RvcjsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS50YXNrLlRvcG9sb2d5Q29udGV4dDsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS50b3BvbG9neS5PdXRwdXRGaWVsZHNEZWNsYXJlcjsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS50b3BvbG9neS5Ub3BvbG9neUJ1aWxkZXI7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0udG9wb2xvZ3kuYmFzZS5CYXNlUmljaFNwb3V0OworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnRvcG9sb2d5LmJhc2UuQmFzZVdpbmRvd2VkQm9sdDsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS50dXBsZS5GaWVsZHM7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0udHVwbGUuVHVwbGU7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0udHVwbGUuVmFsdWVzOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnV0aWxzLlV0aWxzOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLndpbmRvd2luZy5UdXBsZVdpbmRvdzsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworaW1wb3J0IHN0b3JtLnN0YXJ0ZXIuYm9sdC5QcmludGVyQm9sdDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKKworaW1wb3J0IHN0YXRpYyBiYWNrdHlwZS5zdG9ybS50b3BvbG9neS5iYXNlLkJhc2VXaW5kb3dlZEJvbHQuQ291bnQ7CisKKy8qKgorICogQSBzYW1wbGUgdG9wb2xvZ3kgdGhhdCBkZW1vbnN0cmF0ZXMgdGhlIHVzYWdlIG9mIHtAbGluayBiYWNrdHlwZS5zdG9ybS50b3BvbG9neS5JV2luZG93ZWRCb2x0fQorICogdG8gY2FsY3VsYXRlIHNsaWRpbmcgd2luZG93IHN1bS4KKyAqLworcHVibGljIGNsYXNzIFNsaWRpbmdXaW5kb3dUb3BvbG9neSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoU2xpZGluZ1dpbmRvd1RvcG9sb2d5LmNsYXNzKTsKKworICAgIC8qCisgICAgICogZW1pdHMgYSByYW5kb20gaW50ZWdlciBldmVyeSAxMDAgbXMKKyAgICAgKi8KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFJhbmRvbUludGVnZXJTcG91dCBleHRlbmRzIEJhc2VSaWNoU3BvdXQgeworICAgICAgICBTcG91dE91dHB1dENvbGxlY3RvciBjb2xsZWN0b3I7CisgICAgICAgIFJhbmRvbSByYW5kOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBkZWNsYXJlT3V0cHV0RmllbGRzKE91dHB1dEZpZWxkc0RlY2xhcmVyIGRlY2xhcmVyKSB7CisgICAgICAgICAgICBkZWNsYXJlci5kZWNsYXJlKG5ldyBGaWVsZHMoInZhbHVlIikpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9wZW4oTWFwIGNvbmYsIFRvcG9sb2d5Q29udGV4dCBjb250ZXh0LCBTcG91dE91dHB1dENvbGxlY3RvciBjb2xsZWN0b3IpIHsKKyAgICAgICAgICAgIHRoaXMuY29sbGVjdG9yID0gY29sbGVjdG9yOworICAgICAgICAgICAgdGhpcy5yYW5kID0gbmV3IFJhbmRvbSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG5leHRUdXBsZSgpIHsKKyAgICAgICAgICAgIFV0aWxzLnNsZWVwKDEwMCk7CisgICAgICAgICAgICBjb2xsZWN0b3IuZW1pdChuZXcgVmFsdWVzKHJhbmQubmV4dEludCgxMDAwKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDb21wdXRlcyBzbGlkaW5nIHdpbmRvdyBzdW0KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTbGlkaW5nV2luZG93U3VtQm9sdCBleHRlbmRzIEJhc2VXaW5kb3dlZEJvbHQgeworICAgICAgICBwcml2YXRlIGludCBzdW0gPSAwOworICAgICAgICBwcml2YXRlIE91dHB1dENvbGxlY3RvciBjb2xsZWN0b3I7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHByZXBhcmUoTWFwIHN0b3JtQ29uZiwgVG9wb2xvZ3lDb250ZXh0IGNvbnRleHQsIE91dHB1dENvbGxlY3RvciBjb2xsZWN0b3IpIHsKKyAgICAgICAgICAgIHRoaXMuY29sbGVjdG9yID0gY29sbGVjdG9yOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoVHVwbGVXaW5kb3cgaW5wdXRXaW5kb3cpIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBUaGUgaW5wdXRXaW5kb3cgZ2l2ZXMgYSB2aWV3IG9mCisgICAgICAgICAgICAgKiAoYSkgYWxsIHRoZSBldmVudHMgaW4gdGhlIHdpbmRvdworICAgICAgICAgICAgICogKGIpIGV2ZW50cyB0aGF0IGV4cGlyZWQgc2luY2UgbGFzdCBhY3RpdmF0aW9uIG9mIHRoZSB3aW5kb3cKKyAgICAgICAgICAgICAqIChjKSBldmVudHMgdGhhdCBuZXdseSBhcnJpdmVkIHNpbmNlIGxhc3QgYWN0aXZhdGlvbiBvZiB0aGUgd2luZG93CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIExpc3Q8VHVwbGU+IHR1cGxlc0luV2luZG93ID0gaW5wdXRXaW5kb3cuZ2V0KCk7CisgICAgICAgICAgICBMaXN0PFR1cGxlPiBuZXdUdXBsZXMgPSBpbnB1dFdpbmRvdy5nZXROZXcoKTsKKyAgICAgICAgICAgIExpc3Q8VHVwbGU+IGV4cGlyZWRUdXBsZXMgPSBpbnB1dFdpbmRvdy5nZXRFeHBpcmVkKCk7CisKKyAgICAgICAgICAgIExPRy5kZWJ1ZygiRXZlbnRzIGluIGN1cnJlbnQgd2luZG93OiAiICsgdHVwbGVzSW5XaW5kb3cuc2l6ZSgpKTsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBJbnN0ZWFkIG9mIGl0ZXJhdGluZyBvdmVyIGFsbCB0aGUgdHVwbGVzIGluIHRoZSB3aW5kb3cgdG8gY29tcHV0ZQorICAgICAgICAgICAgICogdGhlIHN1bSwgdGhlIHZhbHVlcyBmb3IgdGhlIG5ldyBldmVudHMgYXJlIGFkZGVkIGFuZCBvbGQgZXZlbnRzIGFyZQorICAgICAgICAgICAgICogc3VidHJhY3RlZC4gU2ltaWxhciBvcHRpbWl6YXRpb25zIG1pZ2h0IGJlIHBvc3NpYmxlIGluIG90aGVyCisgICAgICAgICAgICAgKiB3aW5kb3dpbmcgY29tcHV0YXRpb25zLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBmb3IgKFR1cGxlIHR1cGxlIDogbmV3VHVwbGVzKSB7CisgICAgICAgICAgICAgICAgc3VtICs9IChpbnQpIHR1cGxlLmdldFZhbHVlKDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChUdXBsZSB0dXBsZSA6IGV4cGlyZWRUdXBsZXMpIHsKKyAgICAgICAgICAgICAgICBzdW0gLT0gKGludCkgdHVwbGUuZ2V0VmFsdWUoMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb2xsZWN0b3IuZW1pdChuZXcgVmFsdWVzKHN1bSkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGRlY2xhcmVPdXRwdXRGaWVsZHMoT3V0cHV0RmllbGRzRGVjbGFyZXIgZGVjbGFyZXIpIHsKKyAgICAgICAgICAgIGRlY2xhcmVyLmRlY2xhcmUobmV3IEZpZWxkcygic3VtIikpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKgorICAgICAqIENvbXB1dGVzIHR1bWJsaW5nIHdpbmRvdyBhdmVyYWdlCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVHVtYmxpbmdXaW5kb3dBdmdCb2x0IGV4dGVuZHMgQmFzZVdpbmRvd2VkQm9sdCB7CisgICAgICAgIHByaXZhdGUgT3V0cHV0Q29sbGVjdG9yIGNvbGxlY3RvcjsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgcHJlcGFyZShNYXAgc3Rvcm1Db25mLCBUb3BvbG9neUNvbnRleHQgY29udGV4dCwgT3V0cHV0Q29sbGVjdG9yIGNvbGxlY3RvcikgeworICAgICAgICAgICAgdGhpcy5jb2xsZWN0b3IgPSBjb2xsZWN0b3I7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZXhlY3V0ZShUdXBsZVdpbmRvdyBpbnB1dFdpbmRvdykgeworICAgICAgICAgICAgaW50IHN1bSA9IDA7CisgICAgICAgICAgICBMaXN0PFR1cGxlPiB0dXBsZXNJbldpbmRvdyA9IGlucHV0V2luZG93LmdldCgpOworICAgICAgICAgICAgTE9HLmRlYnVnKCJFdmVudHMgaW4gY3VycmVudCB3aW5kb3c6ICIgKyB0dXBsZXNJbldpbmRvdy5zaXplKCkpOworICAgICAgICAgICAgaWYgKHR1cGxlc0luV2luZG93LnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICogU2luY2UgdGhpcyBpcyBhIHR1bWJsaW5nIHdpbmRvdyBjYWxjdWxhdGlvbiwKKyAgICAgICAgICAgICAgICAqIHdlIHVzZSBhbGwgdGhlIHR1cGxlcyBpbiB0aGUgd2luZG93IHRvIGNvbXB1dGUgdGhlIGF2Zy4KKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGZvciAoVHVwbGUgdHVwbGUgOiB0dXBsZXNJbldpbmRvdykgeworICAgICAgICAgICAgICAgICAgICBzdW0gKz0gKGludCkgdHVwbGUuZ2V0VmFsdWUoMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbGxlY3Rvci5lbWl0KG5ldyBWYWx1ZXMoc3VtIC8gdHVwbGVzSW5XaW5kb3cuc2l6ZSgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZGVjbGFyZU91dHB1dEZpZWxkcyhPdXRwdXRGaWVsZHNEZWNsYXJlciBkZWNsYXJlcikgeworICAgICAgICAgICAgZGVjbGFyZXIuZGVjbGFyZShuZXcgRmllbGRzKCJhdmciKSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBUb3BvbG9neUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBUb3BvbG9neUJ1aWxkZXIoKTsKKyAgICAgICAgYnVpbGRlci5zZXRTcG91dCgiaW50ZWdlciIsIG5ldyBSYW5kb21JbnRlZ2VyU3BvdXQoKSwgMSk7CisgICAgICAgIGJ1aWxkZXIuc2V0Qm9sdCgic2xpZGluZ3N1bSIsIG5ldyBTbGlkaW5nV2luZG93U3VtQm9sdCgpLndpdGhXaW5kb3cobmV3IENvdW50KDMwKSwgbmV3IENvdW50KDEwKSksIDEpCisgICAgICAgICAgICAgICAgLnNodWZmbGVHcm91cGluZygiaW50ZWdlciIpOworICAgICAgICBidWlsZGVyLnNldEJvbHQoInR1bWJsaW5nYXZnIiwgbmV3IFR1bWJsaW5nV2luZG93QXZnQm9sdCgpLndpdGhUdW1ibGluZ1dpbmRvdyhuZXcgQ291bnQoMykpLCAxKQorICAgICAgICAgICAgICAgIC5zaHVmZmxlR3JvdXBpbmcoInNsaWRpbmdzdW0iKTsKKyAgICAgICAgYnVpbGRlci5zZXRCb2x0KCJwcmludGVyIiwgbmV3IFByaW50ZXJCb2x0KCksIDEpLnNodWZmbGVHcm91cGluZygidHVtYmxpbmdhdmciKTsKKyAgICAgICAgQ29uZmlnIGNvbmYgPSBuZXcgQ29uZmlnKCk7CisgICAgICAgIGNvbmYuc2V0RGVidWcodHJ1ZSk7CisKKyAgICAgICAgaWYgKGFyZ3MgIT0gbnVsbCAmJiBhcmdzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIGNvbmYuc2V0TnVtV29ya2VycygxKTsKKworICAgICAgICAgICAgU3Rvcm1TdWJtaXR0ZXIuc3VibWl0VG9wb2xvZ3lXaXRoUHJvZ3Jlc3NCYXIoYXJnc1swXSwgY29uZiwgYnVpbGRlci5jcmVhdGVUb3BvbG9neSgpKTsKKyAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgTG9jYWxDbHVzdGVyIGNsdXN0ZXIgPSBuZXcgTG9jYWxDbHVzdGVyKCk7CisgICAgICAgICAgICBjbHVzdGVyLnN1Ym1pdFRvcG9sb2d5KCJ0ZXN0IiwgY29uZiwgYnVpbGRlci5jcmVhdGVUb3BvbG9neSgpKTsKKyAgICAgICAgICAgIFV0aWxzLnNsZWVwKDQwMDAwKTsKKyAgICAgICAgICAgIGNsdXN0ZXIua2lsbFRvcG9sb2d5KCJ0ZXN0Iik7CisgICAgICAgICAgICBjbHVzdGVyLnNodXRkb3duKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9zdG9ybS1zdGFydGVyL3NyYy9qdm0vc3Rvcm0vc3RhcnRlci9UaHJvdWdocHV0VnNMYXRlbmN5LmphdmEgYi9leGFtcGxlcy9zdG9ybS1zdGFydGVyL3NyYy9qdm0vc3Rvcm0vc3RhcnRlci9UaHJvdWdocHV0VnNMYXRlbmN5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM2NjgwZQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3N0b3JtLXN0YXJ0ZXIvc3JjL2p2bS9zdG9ybS9zdGFydGVyL1Rocm91Z2hwdXRWc0xhdGVuY3kuamF2YQpAQCAtMCwwICsxLDQzMiBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugc3Rvcm0uc3RhcnRlcjsKKworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLkNvbmZpZzsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5Mb2NhbENsdXN0ZXI7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0uU3Rvcm1TdWJtaXR0ZXI7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0ubWV0cmljLkh0dHBGb3J3YXJkaW5nTWV0cmljc1NlcnZlcjsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5tZXRyaWMuSHR0cEZvcndhcmRpbmdNZXRyaWNzQ29uc3VtZXI7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0ubWV0cmljLmFwaS5JTWV0cmljOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLm1ldHJpYy5hcGkuSU1ldHJpY3NDb25zdW1lci5UYXNrSW5mbzsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5tZXRyaWMuYXBpLklNZXRyaWNzQ29uc3VtZXIuRGF0YVBvaW50OworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLmdlbmVyYXRlZC4qOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnNwb3V0LlNwb3V0T3V0cHV0Q29sbGVjdG9yOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnRhc2suVG9wb2xvZ3lDb250ZXh0OworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnRvcG9sb2d5LkJhc2ljT3V0cHV0Q29sbGVjdG9yOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnRvcG9sb2d5LklSaWNoQm9sdDsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS50b3BvbG9neS5PdXRwdXRGaWVsZHNEZWNsYXJlcjsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS50b3BvbG9neS5Ub3BvbG9neUJ1aWxkZXI7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0udG9wb2xvZ3kuYmFzZS5CYXNlQmFzaWNCb2x0OworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnRvcG9sb2d5LmJhc2UuQmFzZVJpY2hTcG91dDsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS50dXBsZS5GaWVsZHM7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0udHVwbGUuVHVwbGU7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0udHVwbGUuVmFsdWVzOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnV0aWxzLk5pbWJ1c0NsaWVudDsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS51dGlscy5VdGlsczsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5TdG9ybVN1Ym1pdHRlcjsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRMb2NhbFJhbmRvbTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljTG9uZzsKKworaW1wb3J0IG9yZy5hcGFjaGUuc3Rvcm0ubWV0cmljcy5oZHJoaXN0b2dyYW0uSGlzdG9ncmFtTWV0cmljOworaW1wb3J0IG9yZy5IZHJIaXN0b2dyYW0uSGlzdG9ncmFtOworCisvKioKKyAqIFdvcmRDb3VudCBidXQgdGhlIHNwb3V0IGdvZXMgYXQgYSBwcmVkZWZpbmVkIHJhdGUgYW5kIHdlIGNvbGxlY3QKKyAqIHByb3BlciBsYXRlbmN5IHN0YXRpc3RpY3MuCisgKi8KK3B1YmxpYyBjbGFzcyBUaHJvdWdocHV0VnNMYXRlbmN5IHsKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2VudFdpdGhUaW1lIHsKKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nIHNlbnRlbmNlOworICAgIHB1YmxpYyBmaW5hbCBsb25nIHRpbWU7CisKKyAgICBTZW50V2l0aFRpbWUoU3RyaW5nIHNlbnRlbmNlLCBsb25nIHRpbWUpIHsKKyAgICAgICAgdGhpcy5zZW50ZW5jZSA9IHNlbnRlbmNlOworICAgICAgICB0aGlzLnRpbWUgPSB0aW1lOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQyB7CisgICAgTG9jYWxDbHVzdGVyIF9sb2NhbCA9IG51bGw7CisgICAgTmltYnVzLkNsaWVudCBfY2xpZW50ID0gbnVsbDsKKworICAgIHB1YmxpYyBDKE1hcCBjb25mKSB7CisgICAgICBNYXAgY2x1c3RlckNvbmYgPSBVdGlscy5yZWFkU3Rvcm1Db25maWcoKTsKKyAgICAgIGlmIChjb25mICE9IG51bGwpIHsKKyAgICAgICAgY2x1c3RlckNvbmYucHV0QWxsKGNvbmYpOworICAgICAgfQorICAgICAgQm9vbGVhbiBpc0xvY2FsID0gKEJvb2xlYW4pY2x1c3RlckNvbmYuZ2V0KCJydW4ubG9jYWwiKTsKKyAgICAgIGlmIChpc0xvY2FsICE9IG51bGwgJiYgaXNMb2NhbCkgeworICAgICAgICBfbG9jYWwgPSBuZXcgTG9jYWxDbHVzdGVyKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBfY2xpZW50ID0gTmltYnVzQ2xpZW50LmdldENvbmZpZ3VyZWRDbGllbnQoY2x1c3RlckNvbmYpLmdldENsaWVudCgpOworICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBDbHVzdGVyU3VtbWFyeSBnZXRDbHVzdGVySW5mbygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgaWYgKF9sb2NhbCAhPSBudWxsKSB7CisgICAgICAgIHJldHVybiBfbG9jYWwuZ2V0Q2x1c3RlckluZm8oKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBfY2xpZW50LmdldENsdXN0ZXJJbmZvKCk7CisgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFRvcG9sb2d5SW5mbyBnZXRUb3BvbG9neUluZm8oU3RyaW5nIGlkKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIGlmIChfbG9jYWwgIT0gbnVsbCkgeworICAgICAgICByZXR1cm4gX2xvY2FsLmdldFRvcG9sb2d5SW5mbyhpZCk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gX2NsaWVudC5nZXRUb3BvbG9neUluZm8oaWQpOworICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGtpbGxUb3BvbG9neVdpdGhPcHRzKFN0cmluZyBuYW1lLCBLaWxsT3B0aW9ucyBvcHRzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIGlmIChfbG9jYWwgIT0gbnVsbCkgeworICAgICAgICBfbG9jYWwua2lsbFRvcG9sb2d5V2l0aE9wdHMobmFtZSwgb3B0cyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBfY2xpZW50LmtpbGxUb3BvbG9neVdpdGhPcHRzKG5hbWUsIG9wdHMpOworICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN1Ym1pdFRvcG9sb2d5KFN0cmluZyBuYW1lLCBNYXAgc3Rvcm1Db25mLCBTdG9ybVRvcG9sb2d5IHRvcG9sb2d5KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgIGlmIChfbG9jYWwgIT0gbnVsbCkgeworICAgICAgICBfbG9jYWwuc3VibWl0VG9wb2xvZ3kobmFtZSwgc3Rvcm1Db25mLCB0b3BvbG9neSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBTdG9ybVN1Ym1pdHRlci5zdWJtaXRUb3BvbG9neShuYW1lLCBzdG9ybUNvbmYsIHRvcG9sb2d5KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0xvY2FsKCkgeworICAgICAgcmV0dXJuIF9sb2NhbCAhPSBudWxsOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFzdFJhbmRvbVNlbnRlbmNlU3BvdXQgZXh0ZW5kcyBCYXNlUmljaFNwb3V0IHsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gU0VOVEVOQ0VTID0gbmV3IFN0cmluZ1tdeyAidGhlIGNvdyBqdW1wZWQgb3ZlciB0aGUgbW9vbiIsICJhbiBhcHBsZSBhIGRheSBrZWVwcyB0aGUgZG9jdG9yIGF3YXkiLAorICAgICAgICAgICJmb3VyIHNjb3JlIGFuZCBzZXZlbiB5ZWFycyBhZ28iLCAic25vdyB3aGl0ZSBhbmQgdGhlIHNldmVuIGR3YXJmcyIsICJpIGFtIGF0IHR3byB3aXRoIG5hdHVyZSIgfTsKKworICAgIFNwb3V0T3V0cHV0Q29sbGVjdG9yIF9jb2xsZWN0b3I7CisgICAgbG9uZyBfcGVyaW9kTmFubzsKKyAgICBsb25nIF9lbWl0QW1vdW50OworICAgIFJhbmRvbSBfcmFuZDsKKyAgICBsb25nIF9uZXh0RW1pdFRpbWU7CisgICAgbG9uZyBfZW1pdHNMZWZ0OworICAgIEhpc3RvZ3JhbU1ldHJpYyBfaGlzdG87CisKKyAgICBwdWJsaWMgRmFzdFJhbmRvbVNlbnRlbmNlU3BvdXQobG9uZyByYXRlUGVyU2Vjb25kKSB7CisgICAgICAgIGlmIChyYXRlUGVyU2Vjb25kID4gMCkgeworICAgICAgICAgICAgX3BlcmlvZE5hbm8gPSBNYXRoLm1heCgxLCAxMDAwMDAwMDAwL3JhdGVQZXJTZWNvbmQpOworICAgICAgICAgICAgX2VtaXRBbW91bnQgPSBNYXRoLm1heCgxLCAobG9uZykoKHJhdGVQZXJTZWNvbmQgLyAxMDAwMDAwMDAwLjApICogX3BlcmlvZE5hbm8pKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF9wZXJpb2ROYW5vID0gTG9uZy5NQVhfVkFMVUUgLSAxOworICAgICAgICAgICAgX2VtaXRBbW91bnQgPSAxOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb3BlbihNYXAgY29uZiwgVG9wb2xvZ3lDb250ZXh0IGNvbnRleHQsIFNwb3V0T3V0cHV0Q29sbGVjdG9yIGNvbGxlY3RvcikgeworICAgICAgX2NvbGxlY3RvciA9IGNvbGxlY3RvcjsKKyAgICAgIF9yYW5kID0gVGhyZWFkTG9jYWxSYW5kb20uY3VycmVudCgpOworICAgICAgX25leHRFbWl0VGltZSA9IFN5c3RlbS5uYW5vVGltZSgpOworICAgICAgX2VtaXRzTGVmdCA9IF9lbWl0QW1vdW50OworICAgICAgX2hpc3RvID0gbmV3IEhpc3RvZ3JhbU1ldHJpYygzNjAwMDAwMDAwMDAwTCwgMyk7CisgICAgICBjb250ZXh0LnJlZ2lzdGVyTWV0cmljKCJjb21wLWxhdC1oaXN0byIsIF9oaXN0bywgMTApOyAvL1VwZGF0ZSBldmVyeSAxMCBzZWNvbmRzLCBzbyB3ZSBhcmUgbm90IHRvbyBmYXIgYmVoaW5kCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgbmV4dFR1cGxlKCkgeworICAgICAgaWYgKF9lbWl0c0xlZnQgPD0gMCAmJiBfbmV4dEVtaXRUaW1lIDw9IFN5c3RlbS5uYW5vVGltZSgpKSB7CisgICAgICAgICAgX2VtaXRzTGVmdCA9IF9lbWl0QW1vdW50OworICAgICAgICAgIF9uZXh0RW1pdFRpbWUgPSBfbmV4dEVtaXRUaW1lICsgX3BlcmlvZE5hbm87CisgICAgICB9CisKKyAgICAgIGlmIChfZW1pdHNMZWZ0ID4gMCkgeworICAgICAgICAgIFN0cmluZyBzZW50ZW5jZSA9IFNFTlRFTkNFU1tfcmFuZC5uZXh0SW50KFNFTlRFTkNFUy5sZW5ndGgpXTsKKyAgICAgICAgICBfY29sbGVjdG9yLmVtaXQobmV3IFZhbHVlcyhzZW50ZW5jZSksIG5ldyBTZW50V2l0aFRpbWUoc2VudGVuY2UsIF9uZXh0RW1pdFRpbWUgLSBfcGVyaW9kTmFubykpOworICAgICAgICAgIF9lbWl0c0xlZnQtLTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhY2soT2JqZWN0IGlkKSB7CisgICAgICBsb25nIGVuZCA9IFN5c3RlbS5uYW5vVGltZSgpOworICAgICAgU2VudFdpdGhUaW1lIHN0ID0gKFNlbnRXaXRoVGltZSlpZDsKKyAgICAgIF9oaXN0by5yZWNvcmRWYWx1ZShlbmQtc3QudGltZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZmFpbChPYmplY3QgaWQpIHsKKyAgICAgIFNlbnRXaXRoVGltZSBzdCA9IChTZW50V2l0aFRpbWUpaWQ7CisgICAgICBfY29sbGVjdG9yLmVtaXQobmV3IFZhbHVlcyhzdC5zZW50ZW5jZSksIGlkKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkZWNsYXJlT3V0cHV0RmllbGRzKE91dHB1dEZpZWxkc0RlY2xhcmVyIGRlY2xhcmVyKSB7CisgICAgICBkZWNsYXJlci5kZWNsYXJlKG5ldyBGaWVsZHMoInNlbnRlbmNlIikpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU3BsaXRTZW50ZW5jZSBleHRlbmRzIEJhc2VCYXNpY0JvbHQgeworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoVHVwbGUgdHVwbGUsIEJhc2ljT3V0cHV0Q29sbGVjdG9yIGNvbGxlY3RvcikgeworICAgICAgU3RyaW5nIHNlbnRlbmNlID0gdHVwbGUuZ2V0U3RyaW5nKDApOworICAgICAgZm9yIChTdHJpbmcgd29yZDogc2VudGVuY2Uuc3BsaXQoIlxccysiKSkgeworICAgICAgICAgIGNvbGxlY3Rvci5lbWl0KG5ldyBWYWx1ZXMod29yZCwgMSkpOworICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRlY2xhcmVPdXRwdXRGaWVsZHMoT3V0cHV0RmllbGRzRGVjbGFyZXIgZGVjbGFyZXIpIHsKKyAgICAgIGRlY2xhcmVyLmRlY2xhcmUobmV3IEZpZWxkcygid29yZCIsICJjb3VudCIpKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgc3RhdGljIGNsYXNzIFdvcmRDb3VudCBleHRlbmRzIEJhc2VCYXNpY0JvbHQgeworICAgIE1hcDxTdHJpbmcsIEludGVnZXI+IGNvdW50cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoVHVwbGUgdHVwbGUsIEJhc2ljT3V0cHV0Q29sbGVjdG9yIGNvbGxlY3RvcikgeworICAgICAgU3RyaW5nIHdvcmQgPSB0dXBsZS5nZXRTdHJpbmcoMCk7CisgICAgICBJbnRlZ2VyIGNvdW50ID0gY291bnRzLmdldCh3b3JkKTsKKyAgICAgIGlmIChjb3VudCA9PSBudWxsKQorICAgICAgICBjb3VudCA9IDA7CisgICAgICBjb3VudCsrOworICAgICAgY291bnRzLnB1dCh3b3JkLCBjb3VudCk7CisgICAgICBjb2xsZWN0b3IuZW1pdChuZXcgVmFsdWVzKHdvcmQsIGNvdW50KSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZGVjbGFyZU91dHB1dEZpZWxkcyhPdXRwdXRGaWVsZHNEZWNsYXJlciBkZWNsYXJlcikgeworICAgICAgZGVjbGFyZXIuZGVjbGFyZShuZXcgRmllbGRzKCJ3b3JkIiwgImNvdW50IikpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIE1lbU1lYXN1cmUgeworICAgIHByaXZhdGUgbG9uZyBfbWVtID0gMDsKKyAgICBwcml2YXRlIGxvbmcgX3RpbWUgPSAwOworCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHVwZGF0ZShsb25nIG1lbSkgeworICAgICAgICBfbWVtID0gbWVtOworICAgICAgICBfdGltZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgbG9uZyBnZXQoKSB7CisgICAgICAgIHJldHVybiBpc0V4cGlyZWQoKSA/IDBsIDogX21lbTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGJvb2xlYW4gaXNFeHBpcmVkKCkgeworICAgICAgICByZXR1cm4gKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gX3RpbWUpID49IDIwMDAwOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIEhpc3RvZ3JhbSBfaGlzdG8gPSBuZXcgSGlzdG9ncmFtKDM2MDAwMDAwMDAwMDBMLCAzKTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXRvbWljTG9uZyBfc3lzdGVtQ1BVID0gbmV3IEF0b21pY0xvbmcoMCk7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIEF0b21pY0xvbmcgX3VzZXJDUFUgPSBuZXcgQXRvbWljTG9uZygwKTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXRvbWljTG9uZyBfZ2NDb3VudCA9IG5ldyBBdG9taWNMb25nKDApOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBdG9taWNMb25nIF9nY01zID0gbmV3IEF0b21pY0xvbmcoMCk7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbmN1cnJlbnRIYXNoTWFwPFN0cmluZywgTWVtTWVhc3VyZT4gX21lbW9yeUJ5dGVzID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPFN0cmluZywgTWVtTWVhc3VyZT4oKTsKKworICBwcml2YXRlIHN0YXRpYyBsb25nIHJlYWRNZW1vcnkoKSB7CisgICAgbG9uZyB0b3RhbCA9IDA7CisgICAgZm9yIChNZW1NZWFzdXJlIG1lbTogX21lbW9yeUJ5dGVzLnZhbHVlcygpKSB7CisgICAgICB0b3RhbCArPSBtZW0uZ2V0KCk7CisgICAgfQorICAgIHJldHVybiB0b3RhbDsKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGxvbmcgX3ByZXZfYWNrZWQgPSAwOworICBwcml2YXRlIHN0YXRpYyBsb25nIF9wcmV2X3VwdGltZSA9IDA7CisKKyAgcHVibGljIHN0YXRpYyB2b2lkIHByaW50TWV0cmljcyhDIGNsaWVudCwgU3RyaW5nIG5hbWUpIHRocm93cyBFeGNlcHRpb24geworICAgIENsdXN0ZXJTdW1tYXJ5IHN1bW1hcnkgPSBjbGllbnQuZ2V0Q2x1c3RlckluZm8oKTsKKyAgICBTdHJpbmcgaWQgPSBudWxsOworICAgIGZvciAoVG9wb2xvZ3lTdW1tYXJ5IHRzOiBzdW1tYXJ5LmdldF90b3BvbG9naWVzKCkpIHsKKyAgICAgIGlmIChuYW1lLmVxdWFscyh0cy5nZXRfbmFtZSgpKSkgeworICAgICAgICBpZCA9IHRzLmdldF9pZCgpOworICAgICAgfQorICAgIH0KKyAgICBpZiAoaWQgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiQ291bGQgbm90IGZpbmQgYSB0b3BvbG9neSBuYW1lZCAiK25hbWUpOworICAgIH0KKyAgICBUb3BvbG9neUluZm8gaW5mbyA9IGNsaWVudC5nZXRUb3BvbG9neUluZm8oaWQpOworICAgIGludCB1cHRpbWUgPSBpbmZvLmdldF91cHRpbWVfc2VjcygpOworICAgIGxvbmcgYWNrZWQgPSAwOworICAgIGxvbmcgZmFpbGVkID0gMDsKKyAgICBmb3IgKEV4ZWN1dG9yU3VtbWFyeSBleGVjOiBpbmZvLmdldF9leGVjdXRvcnMoKSkgeworICAgICAgaWYgKCJzcG91dCIuZXF1YWxzKGV4ZWMuZ2V0X2NvbXBvbmVudF9pZCgpKSkgeworICAgICAgICBTcG91dFN0YXRzIHN0YXRzID0gZXhlYy5nZXRfc3RhdHMoKS5nZXRfc3BlY2lmaWMoKS5nZXRfc3BvdXQoKTsKKyAgICAgICAgTWFwPFN0cmluZywgTG9uZz4gZmFpbGVkTWFwID0gc3RhdHMuZ2V0X2ZhaWxlZCgpLmdldCgiOmFsbC10aW1lIik7CisgICAgICAgIE1hcDxTdHJpbmcsIExvbmc+IGFja2VkTWFwID0gc3RhdHMuZ2V0X2Fja2VkKCkuZ2V0KCI6YWxsLXRpbWUiKTsKKyAgICAgICAgaWYgKGFja2VkTWFwICE9IG51bGwpIHsKKyAgICAgICAgICBmb3IgKFN0cmluZyBrZXk6IGFja2VkTWFwLmtleVNldCgpKSB7CisgICAgICAgICAgICBpZiAoZmFpbGVkTWFwICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgTG9uZyB0bXAgPSBmYWlsZWRNYXAuZ2V0KGtleSk7CisgICAgICAgICAgICAgIGlmICh0bXAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgZmFpbGVkICs9IHRtcDsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9uZyBhY2tWYWwgPSBhY2tlZE1hcC5nZXQoa2V5KTsKKyAgICAgICAgICAgIGFja2VkICs9IGFja1ZhbDsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgbG9uZyBhY2tlZFRoaXNUaW1lID0gYWNrZWQgLSBfcHJldl9hY2tlZDsKKyAgICBsb25nIHRoaXNUaW1lID0gdXB0aW1lIC0gX3ByZXZfdXB0aW1lOworICAgIGxvbmcgbm5wY3QsIG5ubnBjdCwgbWluLCBtYXg7CisgICAgZG91YmxlIG1lYW4sIHN0ZGRldjsKKyAgICBzeW5jaHJvbml6ZWQoX2hpc3RvKSB7CisgICAgICBubnBjdCA9IF9oaXN0by5nZXRWYWx1ZUF0UGVyY2VudGlsZSg5OS4wKTsKKyAgICAgIG5ubnBjdCA9IF9oaXN0by5nZXRWYWx1ZUF0UGVyY2VudGlsZSg5OS45KTsKKyAgICAgIG1pbiA9IF9oaXN0by5nZXRNaW5WYWx1ZSgpOworICAgICAgbWF4ID0gX2hpc3RvLmdldE1heFZhbHVlKCk7CisgICAgICBtZWFuID0gX2hpc3RvLmdldE1lYW4oKTsKKyAgICAgIHN0ZGRldiA9IF9oaXN0by5nZXRTdGREZXZpYXRpb24oKTsKKyAgICAgIF9oaXN0by5yZXNldCgpOworICAgIH0KKyAgICBsb25nIHVzZXIgPSBfdXNlckNQVS5nZXRBbmRTZXQoMCk7CisgICAgbG9uZyBzeXMgPSBfc3lzdGVtQ1BVLmdldEFuZFNldCgwKTsKKyAgICBsb25nIGdjID0gX2djTXMuZ2V0QW5kU2V0KDApOworICAgIGRvdWJsZSBtZW1NQiA9IHJlYWRNZW1vcnkoKSAvICgxMDI0LjAgKiAxMDI0LjApOworICAgIFN5c3RlbS5vdXQucHJpbnRmKCJ1cHRpbWU6ICUsNGQgYWNrZWQ6ICUsOWQgYWNrZWQvc2VjOiAlLDEwLjJmIGZhaWxlZDogJSw4ZCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAiOTklJTogJSwxNWQgOTkuOSUlOiAlLDE1ZCBtaW46ICUsMTVkIG1heDogJSwxNWQgbWVhbjogJSwxNS4yZiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAic3RkZGV2OiAlLDE1LjJmIHVzZXI6ICUsMTBkIHN5czogJSwxMGQgZ2M6ICUsMTBkIG1lbTogJSwxMC4yZlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgdXB0aW1lLCBhY2tlZFRoaXNUaW1lLCAoKChkb3VibGUpYWNrZWRUaGlzVGltZSkvdGhpc1RpbWUpLCBmYWlsZWQsIG5ucGN0LCBubm5wY3QsCisgICAgICAgICAgICAgICAgICAgICAgIG1pbiwgbWF4LCBtZWFuLCBzdGRkZXYsIHVzZXIsIHN5cywgZ2MsIG1lbU1CKTsKKyAgICBfcHJldl91cHRpbWUgPSB1cHRpbWU7CisgICAgX3ByZXZfYWNrZWQgPSBhY2tlZDsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgdm9pZCBraWxsKEMgY2xpZW50LCBTdHJpbmcgbmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgS2lsbE9wdGlvbnMgb3B0cyA9IG5ldyBLaWxsT3B0aW9ucygpOworICAgIG9wdHMuc2V0X3dhaXRfc2VjcygwKTsKKyAgICBjbGllbnQua2lsbFRvcG9sb2d5V2l0aE9wdHMobmFtZSwgb3B0cyk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBsb25nIHJhdGVQZXJTZWNvbmQgPSA1MDA7CisgICAgaWYgKGFyZ3MgIT0gbnVsbCAmJiBhcmdzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgcmF0ZVBlclNlY29uZCA9IExvbmcudmFsdWVPZihhcmdzWzBdKTsKKyAgICB9CisKKyAgICBpbnQgcGFyYWxsZWxpc20gPSA0OworICAgIGlmIChhcmdzICE9IG51bGwgJiYgYXJncy5sZW5ndGggPiAxKSB7CisgICAgICAgIHBhcmFsbGVsaXNtID0gSW50ZWdlci52YWx1ZU9mKGFyZ3NbMV0pOworICAgIH0KKworICAgIGludCBudW1NaW5zID0gNTsKKyAgICBpZiAoYXJncyAhPSBudWxsICYmIGFyZ3MubGVuZ3RoID4gMikgeworICAgICAgICBudW1NaW5zID0gSW50ZWdlci52YWx1ZU9mKGFyZ3NbMl0pOworICAgIH0KKworICAgIFN0cmluZyBuYW1lID0gIndjLXRlc3QiOworICAgIGlmIChhcmdzICE9IG51bGwgJiYgYXJncy5sZW5ndGggPiAzKSB7CisgICAgICAgIG5hbWUgPSBhcmdzWzNdOworICAgIH0KKworICAgIENvbmZpZyBjb25mID0gbmV3IENvbmZpZygpOworICAgIEh0dHBGb3J3YXJkaW5nTWV0cmljc1NlcnZlciBtZXRyaWNTZXJ2ZXIgPSBuZXcgSHR0cEZvcndhcmRpbmdNZXRyaWNzU2VydmVyKGNvbmYpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZShUYXNrSW5mbyB0YXNrSW5mbywgQ29sbGVjdGlvbjxEYXRhUG9pbnQ+IGRhdGFQb2ludHMpIHsKKyAgICAgICAgICAgIFN0cmluZyB3b3JrZXIgPSB0YXNrSW5mby5zcmNXb3JrZXJIb3N0ICsgIjoiICsgdGFza0luZm8uc3JjV29ya2VyUG9ydDsKKyAgICAgICAgICAgIGZvciAoRGF0YVBvaW50IGRwOiBkYXRhUG9pbnRzKSB7CisgICAgICAgICAgICAgICAgaWYgKCJjb21wLWxhdC1oaXN0byIuZXF1YWxzKGRwLm5hbWUpICYmIGRwLnZhbHVlIGluc3RhbmNlb2YgSGlzdG9ncmFtKSB7CisgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZChfaGlzdG8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9oaXN0by5hZGQoKEhpc3RvZ3JhbSlkcC52YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJDUFUiLmVxdWFscyhkcC5uYW1lKSAmJiBkcC52YWx1ZSBpbnN0YW5jZW9mIE1hcCkgeworICAgICAgICAgICAgICAgICAgIE1hcDxPYmplY3QsIE9iamVjdD4gbSA9IChNYXA8T2JqZWN0LCBPYmplY3Q+KWRwLnZhbHVlOworICAgICAgICAgICAgICAgICAgIE9iamVjdCBzeXMgPSBtLmdldCgic3lzLW1zIik7CisgICAgICAgICAgICAgICAgICAgaWYgKHN5cyBpbnN0YW5jZW9mIE51bWJlcikgeworICAgICAgICAgICAgICAgICAgICAgICBfc3lzdGVtQ1BVLmdldEFuZEFkZCgoKE51bWJlcilzeXMpLmxvbmdWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgT2JqZWN0IHVzZXIgPSBtLmdldCgidXNlci1tcyIpOworICAgICAgICAgICAgICAgICAgIGlmICh1c2VyIGluc3RhbmNlb2YgTnVtYmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgIF91c2VyQ1BVLmdldEFuZEFkZCgoKE51bWJlcil1c2VyKS5sb25nVmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZHAubmFtZS5zdGFydHNXaXRoKCJHQy8iKSAmJiBkcC52YWx1ZSBpbnN0YW5jZW9mIE1hcCkgeworICAgICAgICAgICAgICAgICAgIE1hcDxPYmplY3QsIE9iamVjdD4gbSA9IChNYXA8T2JqZWN0LCBPYmplY3Q+KWRwLnZhbHVlOworICAgICAgICAgICAgICAgICAgIE9iamVjdCBjb3VudCA9IG0uZ2V0KCJjb3VudCIpOworICAgICAgICAgICAgICAgICAgIGlmIChjb3VudCBpbnN0YW5jZW9mIE51bWJlcikgeworICAgICAgICAgICAgICAgICAgICAgICBfZ2NDb3VudC5nZXRBbmRBZGQoKChOdW1iZXIpY291bnQpLmxvbmdWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgT2JqZWN0IHRpbWUgPSBtLmdldCgidGltZU1zIik7CisgICAgICAgICAgICAgICAgICAgaWYgKHRpbWUgaW5zdGFuY2VvZiBOdW1iZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgX2djTXMuZ2V0QW5kQWRkKCgoTnVtYmVyKXRpbWUpLmxvbmdWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkcC5uYW1lLnN0YXJ0c1dpdGgoIm1lbW9yeS8iKSAmJiBkcC52YWx1ZSBpbnN0YW5jZW9mIE1hcCkgeworICAgICAgICAgICAgICAgICAgIE1hcDxPYmplY3QsIE9iamVjdD4gbSA9IChNYXA8T2JqZWN0LCBPYmplY3Q+KWRwLnZhbHVlOworICAgICAgICAgICAgICAgICAgIE9iamVjdCB2YWwgPSBtLmdldCgidXNlZEJ5dGVzIik7CisgICAgICAgICAgICAgICAgICAgaWYgKHZhbCBpbnN0YW5jZW9mIE51bWJlcikgeworICAgICAgICAgICAgICAgICAgICAgICBNZW1NZWFzdXJlIG1tID0gX21lbW9yeUJ5dGVzLmdldCh3b3JrZXIpOworICAgICAgICAgICAgICAgICAgICAgICBpZiAobW0gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgIG1tID0gbmV3IE1lbU1lYXN1cmUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBNZW1NZWFzdXJlIHRtcCA9IF9tZW1vcnlCeXRlcy5wdXRJZkFic2VudCh3b3JrZXIsIG1tKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBtbSA9IHRtcCA9PSBudWxsID8gbW0gOiB0bXA7IAorICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgIG1tLnVwZGF0ZSgoKE51bWJlcil2YWwpLmxvbmdWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIG1ldHJpY1NlcnZlci5zZXJ2ZSgpOworICAgIFN0cmluZyB1cmwgPSBtZXRyaWNTZXJ2ZXIuZ2V0VXJsKCk7CisKKyAgICBDIGNsdXN0ZXIgPSBuZXcgQyhjb25mKTsKKyAgICBjb25mLnNldE51bVdvcmtlcnMocGFyYWxsZWxpc20pOworICAgIGNvbmYucmVnaXN0ZXJNZXRyaWNzQ29uc3VtZXIoYmFja3R5cGUuc3Rvcm0ubWV0cmljLkxvZ2dpbmdNZXRyaWNzQ29uc3VtZXIuY2xhc3MpOworICAgIGNvbmYucmVnaXN0ZXJNZXRyaWNzQ29uc3VtZXIoYmFja3R5cGUuc3Rvcm0ubWV0cmljLkh0dHBGb3J3YXJkaW5nTWV0cmljc0NvbnN1bWVyLmNsYXNzLCB1cmwsIDEpOworICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gd29ya2VyTWV0cmljcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworICAgIGlmICghY2x1c3Rlci5pc0xvY2FsKCkpIHsKKyAgICAgIC8vc2lnYXIgdXNlcyBKTkkgYW5kIGRvZXMgbm90IHdvcmsgaW4gbG9jYWwgbW9kZQorICAgICAgd29ya2VyTWV0cmljcy5wdXQoIkNQVSIsICJvcmcuYXBhY2hlLnN0b3JtLm1ldHJpY3Muc2lnYXIuQ1BVTWV0cmljIik7CisgICAgfQorICAgIGNvbmYucHV0KENvbmZpZy5UT1BPTE9HWV9XT1JLRVJfTUVUUklDUywgd29ya2VyTWV0cmljcyk7CisgICAgY29uZi5wdXQoQ29uZmlnLlRPUE9MT0dZX0JVSUxUSU5fTUVUUklDU19CVUNLRVRfU0laRV9TRUNTLCAxMCk7CisgICAgY29uZi5wdXQoQ29uZmlnLlRPUE9MT0dZX1dPUktFUl9HQ19DSElMRE9QVFMsCisgICAgICAiLVhYOitVc2VDb25jTWFya1N3ZWVwR0MgLVhYOitVc2VQYXJOZXdHQyAtWFg6K1VzZUNvbmNNYXJrU3dlZXBHQyAtWFg6TmV3U2l6ZT0xMjhtIC1YWDpDTVNJbml0aWF0aW5nT2NjdXBhbmN5RnJhY3Rpb249NzAgLVhYOi1DTVNDb25jdXJyZW50TVRFbmFibGVkIik7CisgICAgY29uZi5wdXQoQ29uZmlnLlRPUE9MT0dZX1dPUktFUl9DSElMRE9QVFMsICItWG14MmciKTsKKworICAgIFRvcG9sb2d5QnVpbGRlciBidWlsZGVyID0gbmV3IFRvcG9sb2d5QnVpbGRlcigpOworCisgICAgaW50IG51bUVhY2ggPSA0ICogcGFyYWxsZWxpc207CisgICAgYnVpbGRlci5zZXRTcG91dCgic3BvdXQiLCBuZXcgRmFzdFJhbmRvbVNlbnRlbmNlU3BvdXQocmF0ZVBlclNlY29uZC9udW1FYWNoKSwgbnVtRWFjaCk7CisKKyAgICBidWlsZGVyLnNldEJvbHQoInNwbGl0IiwgbmV3IFNwbGl0U2VudGVuY2UoKSwgbnVtRWFjaCkuc2h1ZmZsZUdyb3VwaW5nKCJzcG91dCIpOworICAgIGJ1aWxkZXIuc2V0Qm9sdCgiY291bnQiLCBuZXcgV29yZENvdW50KCksIG51bUVhY2gpLmZpZWxkc0dyb3VwaW5nKCJzcGxpdCIsIG5ldyBGaWVsZHMoIndvcmQiKSk7CisKKyAgICB0cnkgeworICAgICAgICBjbHVzdGVyLnN1Ym1pdFRvcG9sb2d5KG5hbWUsIGNvbmYsIGJ1aWxkZXIuY3JlYXRlVG9wb2xvZ3koKSk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1NaW5zICogMjsgaSsrKSB7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMzAgKiAxMDAwKTsKKyAgICAgICAgICAgIHByaW50TWV0cmljcyhjbHVzdGVyLCBuYW1lKTsKKyAgICAgICAgfQorICAgIH0gZmluYWxseSB7CisgICAgICAgIGtpbGwoY2x1c3RlciwgbmFtZSk7CisgICAgfQorICAgIFN5c3RlbS5leGl0KDApOworICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9zdG9ybS1zdGFydGVyL3NyYy9qdm0vc3Rvcm0vc3RhcnRlci90cmlkZW50L1RyaWRlbnRLYWZrYVdvcmRDb3VudC5qYXZhIGIvZXhhbXBsZXMvc3Rvcm0tc3RhcnRlci9zcmMvanZtL3N0b3JtL3N0YXJ0ZXIvdHJpZGVudC9UcmlkZW50S2Fma2FXb3JkQ291bnQuamF2YQppbmRleCA4MTM4NDFhLi5iZDhlY2JhIDEwMDY0NAotLS0gYS9leGFtcGxlcy9zdG9ybS1zdGFydGVyL3NyYy9qdm0vc3Rvcm0vc3RhcnRlci90cmlkZW50L1RyaWRlbnRLYWZrYVdvcmRDb3VudC5qYXZhCisrKyBiL2V4YW1wbGVzL3N0b3JtLXN0YXJ0ZXIvc3JjL2p2bS9zdG9ybS9zdGFydGVyL3RyaWRlbnQvVHJpZGVudEthZmthV29yZENvdW50LmphdmEKQEAgLTE0OSwxNCArMTQ5LDE0IEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuIHRoZSBzdG9ybSB0b3BvbG9neQogICAgICAqLwotICAgIHB1YmxpYyBTdG9ybVRvcG9sb2d5IGJ1aWxkUHJvZHVjZXJUb3BvbG9neSgpIHsKKyAgICBwdWJsaWMgU3Rvcm1Ub3BvbG9neSBidWlsZFByb2R1Y2VyVG9wb2xvZ3koUHJvcGVydGllcyBwcm9wKSB7CiAgICAgICAgIFRvcG9sb2d5QnVpbGRlciBidWlsZGVyID0gbmV3IFRvcG9sb2d5QnVpbGRlcigpOwogICAgICAgICBidWlsZGVyLnNldFNwb3V0KCJzcG91dCIsIG5ldyBSYW5kb21TZW50ZW5jZVNwb3V0KCksIDIpOwogICAgICAgICAvKioKICAgICAgICAgICogVGhlIG91dHB1dCBmaWVsZCBvZiB0aGUgUmFuZG9tU2VudGVuY2VTcG91dCAoIndvcmQiKSBpcyBwcm92aWRlZCBhcyB0aGUgYm9sdE1lc3NhZ2VGaWVsZAogICAgICAgICAgKiBzbyB0aGF0IHRoaXMgZ2V0cyB3cml0dGVuIG91dCBhcyB0aGUgbWVzc2FnZSBpbiB0aGUga2Fma2EgdG9waWMuCiAgICAgICAgICAqLwotICAgICAgICBLYWZrYUJvbHQgYm9sdCA9IG5ldyBLYWZrYUJvbHQoKQorICAgICAgICBLYWZrYUJvbHQgYm9sdCA9IG5ldyBLYWZrYUJvbHQoKS53aXRoUHJvZHVjZXJQcm9wZXJ0aWVzKHByb3ApCiAgICAgICAgICAgICAgICAgLndpdGhUb3BpY1NlbGVjdG9yKG5ldyBEZWZhdWx0VG9waWNTZWxlY3RvcigidGVzdCIpKQogICAgICAgICAgICAgICAgIC53aXRoVHVwbGVUb0thZmthTWFwcGVyKG5ldyBGaWVsZE5hbWVCYXNlZFR1cGxlVG9LYWZrYU1hcHBlcigia2V5IiwgIndvcmQiKSk7CiAgICAgICAgIGJ1aWxkZXIuc2V0Qm9sdCgiZm9yd2FyZFRvS2Fma2EiLCBib2x0LCAxKS5zaHVmZmxlR3JvdXBpbmcoInNwb3V0Iik7CkBAIC0xNjksMTYgKzE2OSwxMyBAQAogICAgICAqCiAgICAgICogQHJldHVybiB0aGUgdG9wb2xvZ3kgY29uZmlnCiAgICAgICovCi0gICAgcHVibGljIENvbmZpZyBnZXRQcm9kdWNlckNvbmZpZygpIHsKLSAgICAgICAgQ29uZmlnIGNvbmYgPSBuZXcgQ29uZmlnKCk7Ci0gICAgICAgIGNvbmYuc2V0TWF4U3BvdXRQZW5kaW5nKDIwKTsKKyAgICBwdWJsaWMgUHJvcGVydGllcyBnZXRQcm9kdWNlckNvbmZpZygpIHsKICAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CiAgICAgICAgIHByb3BzLnB1dChQcm9kdWNlckNvbmZpZy5CT09UU1RSQVBfU0VSVkVSU19DT05GSUcsIGJyb2tlclVybCk7CiAgICAgICAgIHByb3BzLnB1dChQcm9kdWNlckNvbmZpZy5LRVlfU0VSSUFMSVpFUl9DTEFTU19DT05GSUcsICJvcmcuYXBhY2hlLmthZmthLmNvbW1vbi5zZXJpYWxpemF0aW9uLlN0cmluZ1NlcmlhbGl6ZXIiKTsKICAgICAgICAgcHJvcHMucHV0KFByb2R1Y2VyQ29uZmlnLlZBTFVFX1NFUklBTElaRVJfQ0xBU1NfQ09ORklHLCAib3JnLmFwYWNoZS5rYWZrYS5jb21tb24uc2VyaWFsaXphdGlvbi5TdHJpbmdTZXJpYWxpemVyIik7CiAgICAgICAgIHByb3BzLnB1dChQcm9kdWNlckNvbmZpZy5DTElFTlRfSURfQ09ORklHLCAic3Rvcm0ta2Fma2EtcHJvZHVjZXIiKTsKLSAgICAgICAgY29uZi5wdXQoS2Fma2FCb2x0LktBRktBX0JST0tFUl9QUk9QRVJUSUVTLCBwcm9wcyk7Ci0gICAgICAgIHJldHVybiBjb25mOworICAgICAgICByZXR1cm4gcHJvcHM7CiAgICAgfQogCiAgICAgLyoqCkBAIC0yMTQsOCArMjExLDEwIEBACiAgICAgICAgIC8vIHN1Ym1pdCB0aGUgY29uc3VtZXIgdG9wb2xvZ3kuCiAgICAgICAgIGNsdXN0ZXIuc3VibWl0VG9wb2xvZ3koIndvcmRDb3VudGVyIiwgd29yZENvdW50LmdldENvbnN1bWVyQ29uZmlnKCksIHdvcmRDb3VudC5idWlsZENvbnN1bWVyVG9wb2xvZ3koZHJwYykpOwogCisgICAgICAgIENvbmZpZyBjb25mID0gbmV3IENvbmZpZygpOworICAgICAgICBjb25mLnNldE1heFNwb3V0UGVuZGluZygyMCk7CiAgICAgICAgIC8vIHN1Ym1pdCB0aGUgcHJvZHVjZXIgdG9wb2xvZ3kuCi0gICAgICAgIGNsdXN0ZXIuc3VibWl0VG9wb2xvZ3koImthZmthQm9sdCIsIHdvcmRDb3VudC5nZXRQcm9kdWNlckNvbmZpZygpLCB3b3JkQ291bnQuYnVpbGRQcm9kdWNlclRvcG9sb2d5KCkpOworICAgICAgICBjbHVzdGVyLnN1Ym1pdFRvcG9sb2d5KCJrYWZrYUJvbHQiLCBjb25mLCB3b3JkQ291bnQuYnVpbGRQcm9kdWNlclRvcG9sb2d5KHdvcmRDb3VudC5nZXRQcm9kdWNlckNvbmZpZygpKSk7CiAKICAgICAgICAgLy8ga2VlcCBxdWVyeWluZyB0aGUgd29yZCBjb3VudHMgZm9yIGEgbWludXRlLgogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDYwOyBpKyspIHsKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3N0b3JtLXN0YXJ0ZXIvdGVzdC9qdm0vc3Rvcm0vc3RhcnRlci9ib2x0L0ludGVybWVkaWF0ZVJhbmtpbmdzQm9sdFRlc3QuamF2YSBiL2V4YW1wbGVzL3N0b3JtLXN0YXJ0ZXIvdGVzdC9qdm0vc3Rvcm0vc3RhcnRlci9ib2x0L0ludGVybWVkaWF0ZVJhbmtpbmdzQm9sdFRlc3QuamF2YQppbmRleCBjMjk2YTg5Li4yNzhhNTEzIDEwMDY0NAotLS0gYS9leGFtcGxlcy9zdG9ybS1zdGFydGVyL3Rlc3QvanZtL3N0b3JtL3N0YXJ0ZXIvYm9sdC9JbnRlcm1lZGlhdGVSYW5raW5nc0JvbHRUZXN0LmphdmEKKysrIGIvZXhhbXBsZXMvc3Rvcm0tc3RhcnRlci90ZXN0L2p2bS9zdG9ybS9zdGFydGVyL2JvbHQvSW50ZXJtZWRpYXRlUmFua2luZ3NCb2x0VGVzdC5qYXZhCkBAIC0yMywxMCArMjMsMTAgQEAKIGltcG9ydCBiYWNrdHlwZS5zdG9ybS50dXBsZS5GaWVsZHM7CiBpbXBvcnQgYmFja3R5cGUuc3Rvcm0udHVwbGUuVHVwbGU7CiBpbXBvcnQgYmFja3R5cGUuc3Rvcm0udHVwbGUuVmFsdWVzOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnV0aWxzLk1vY2tUdXBsZUhlbHBlcnM7CiBpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKIGltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkRhdGFQcm92aWRlcjsKIGltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLlRlc3Q7Ci1pbXBvcnQgc3Rvcm0uc3RhcnRlci50b29scy5Nb2NrVHVwbGVIZWxwZXJzOwogCiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvc3Rvcm0tc3RhcnRlci90ZXN0L2p2bS9zdG9ybS9zdGFydGVyL2JvbHQvUm9sbGluZ0NvdW50Qm9sdFRlc3QuamF2YSBiL2V4YW1wbGVzL3N0b3JtLXN0YXJ0ZXIvdGVzdC9qdm0vc3Rvcm0vc3RhcnRlci9ib2x0L1JvbGxpbmdDb3VudEJvbHRUZXN0LmphdmEKaW5kZXggYmMzMWJhMC4uZWNiMTIxNiAxMDA2NDQKLS0tIGEvZXhhbXBsZXMvc3Rvcm0tc3RhcnRlci90ZXN0L2p2bS9zdG9ybS9zdGFydGVyL2JvbHQvUm9sbGluZ0NvdW50Qm9sdFRlc3QuamF2YQorKysgYi9leGFtcGxlcy9zdG9ybS1zdGFydGVyL3Rlc3QvanZtL3N0b3JtL3N0YXJ0ZXIvYm9sdC9Sb2xsaW5nQ291bnRCb2x0VGVzdC5qYXZhCkBAIC0yNCw4ICsyNCw4IEBACiBpbXBvcnQgYmFja3R5cGUuc3Rvcm0udHVwbGUuRmllbGRzOwogaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnR1cGxlLlR1cGxlOwogaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnR1cGxlLlZhbHVlczsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS51dGlscy5Nb2NrVHVwbGVIZWxwZXJzOwogaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKLWltcG9ydCBzdG9ybS5zdGFydGVyLnRvb2xzLk1vY2tUdXBsZUhlbHBlcnM7CiAKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCmRpZmYgLS1naXQgYS9leGFtcGxlcy9zdG9ybS1zdGFydGVyL3Rlc3QvanZtL3N0b3JtL3N0YXJ0ZXIvYm9sdC9Ub3RhbFJhbmtpbmdzQm9sdFRlc3QuamF2YSBiL2V4YW1wbGVzL3N0b3JtLXN0YXJ0ZXIvdGVzdC9qdm0vc3Rvcm0vc3RhcnRlci9ib2x0L1RvdGFsUmFua2luZ3NCb2x0VGVzdC5qYXZhCmluZGV4IDQ5ZTNkNjcuLmE2YWY5MzEgMTAwNjQ0Ci0tLSBhL2V4YW1wbGVzL3N0b3JtLXN0YXJ0ZXIvdGVzdC9qdm0vc3Rvcm0vc3RhcnRlci9ib2x0L1RvdGFsUmFua2luZ3NCb2x0VGVzdC5qYXZhCisrKyBiL2V4YW1wbGVzL3N0b3JtLXN0YXJ0ZXIvdGVzdC9qdm0vc3Rvcm0vc3RhcnRlci9ib2x0L1RvdGFsUmFua2luZ3NCb2x0VGVzdC5qYXZhCkBAIC0yMyw5ICsyMyw5IEBACiBpbXBvcnQgYmFja3R5cGUuc3Rvcm0udHVwbGUuRmllbGRzOwogaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnR1cGxlLlR1cGxlOwogaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnR1cGxlLlZhbHVlczsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS51dGlscy5Nb2NrVHVwbGVIZWxwZXJzOwogaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuRGF0YVByb3ZpZGVyOwogaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKLWltcG9ydCBzdG9ybS5zdGFydGVyLnRvb2xzLk1vY2tUdXBsZUhlbHBlcnM7CiBpbXBvcnQgc3Rvcm0uc3RhcnRlci50b29scy5SYW5raW5nczsKIAogaW1wb3J0IGphdmEudXRpbC5NYXA7CmRpZmYgLS1naXQgYS9leHRlcm5hbC9mbHV4L1JFQURNRS5tZCBiL2V4dGVybmFsL2ZsdXgvUkVBRE1FLm1kCmluZGV4IDJjNTEyN2UuLmM0ZWYxNDUgMTAwNjQ0Ci0tLSBhL2V4dGVybmFsL2ZsdXgvUkVBRE1FLm1kCisrKyBiL2V4dGVybmFsL2ZsdXgvUkVBRE1FLm1kCkBAIC0zNjUsNiArMzY1LDcgQEAKICAgICBjbGFzc05hbWU6ICJzdG9ybS5rYWZrYS5aa0hvc3RzIgogICAgIGNvbnN0cnVjdG9yQXJnczoKICAgICAgIC0gImxvY2FsaG9zdDoyMTgxIgorICAgICAgLSB0cnVlCiBgYGAKIAogIyMjI1JlZmVyZW5jZXMKQEAgLTQzMiw2ICs0MzMsOCBAQAogICAgICAgLSBuYW1lOiAid2l0aEZvbyIKICAgICAgICAgYXJnczoKICAgICAgICAgICAtICJmb28iCisgICAgICAtIG5hbWU6ICJ3aXRoTm9uZSIKKyAgICAgICMgbm8gYXJncyBuZWVkZWQsIHNvIG5vICJhcmdzIiBsaW5lCiAgICAgICAtIG5hbWU6ICJ3aXRoQmFyIgogICAgICAgICBhcmdzOgogICAgICAgICAgIC0gImJhciIKQEAgLTQ0NSw2ICs0NDgsNyBAQAogCiBgYGBqYXZhCiAgICAgcHVibGljIHZvaWQgd2l0aEZvbyhTdHJpbmcgZm9vKTsKKyAgICBwdWJsaWMgdm9pZCB3aXRoTm9uZSgpOyAvLyBtZXRob2Qgd2l0aCB6ZXJvIGFyZ3VtZW50cwogICAgIHB1YmxpYyB2b2lkIHdpdGhCYXIoU3RyaW5nIGJhcik7CiAgICAgcHVibGljIHZvaWQgd2l0aEZvb0JhcihTdHJpbmcgZm9vLCBTdHJpbmcgYmFyKTsKIGBgYApkaWZmIC0tZ2l0IGEvZXh0ZXJuYWwvZmx1eC9mbHV4LWNvcmUvcG9tLnhtbCBiL2V4dGVybmFsL2ZsdXgvZmx1eC1jb3JlL3BvbS54bWwKaW5kZXggOGQwYzFmMi4uYmQ1YTE4ZiAxMDA2NDQKLS0tIGEvZXh0ZXJuYWwvZmx1eC9mbHV4LWNvcmUvcG9tLnhtbAorKysgYi9leHRlcm5hbC9mbHV4L2ZsdXgtY29yZS9wb20ueG1sCkBAIC03Miw3ICs3Miw2IEBACiAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zaGFkZS1wbHVnaW48L2FydGlmYWN0SWQ+CiAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KICAgICAgICAgICAgICAgICA8Y3JlYXRlRGVwZW5kZW5jeVJlZHVjZWRQb20+dHJ1ZTwvY3JlYXRlRGVwZW5kZW5jeVJlZHVjZWRQb20+Ci0gICAgICAgICAgICAgICAgPG1pbmltaXplSmFyPnRydWU8L21pbmltaXplSmFyPgogICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgogICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CiAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KZGlmZiAtLWdpdCBhL2V4dGVybmFsL2ZsdXgvZmx1eC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdG9ybS9mbHV4L0ZsdXguamF2YSBiL2V4dGVybmFsL2ZsdXgvZmx1eC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdG9ybS9mbHV4L0ZsdXguamF2YQppbmRleCA2MzAwNjMxLi43MWMyMGE3IDEwMDY0NAotLS0gYS9leHRlcm5hbC9mbHV4L2ZsdXgtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3Rvcm0vZmx1eC9GbHV4LmphdmEKKysrIGIvZXh0ZXJuYWwvZmx1eC9mbHV4LWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0b3JtL2ZsdXgvRmx1eC5qYXZhCkBAIC0yNTMsNyArMjUzLDggQEAKICAgICAgICAgLy8gYmFubmVyCiAgICAgICAgIElucHV0U3RyZWFtIGlzID0gRmx1eC5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKCIvc3BsYXNoLnR4dCIpOwogICAgICAgICBpZihpcyAhPSBudWxsKXsKLSAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpcykpOworICAgICAgICAgICAgSW5wdXRTdHJlYW1SZWFkZXIgaXNyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGlzLCAiVVRGLTgiKTsKKyAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKGlzcik7CiAgICAgICAgICAgICBTdHJpbmcgbGluZSA9IG51bGw7CiAgICAgICAgICAgICB3aGlsZSgobGluZSA9IGJyLnJlYWRMaW5lKCkpICE9IG51bGwpewogICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihsaW5lKTsKZGlmZiAtLWdpdCBhL2V4dGVybmFsL2ZsdXgvZmx1eC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdG9ybS9mbHV4L0ZsdXhCdWlsZGVyLmphdmEgYi9leHRlcm5hbC9mbHV4L2ZsdXgtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3Rvcm0vZmx1eC9GbHV4QnVpbGRlci5qYXZhCmluZGV4IDlmMTVlNmIuLjAxNDExNmQgMTAwNjQ0Ci0tLSBhL2V4dGVybmFsL2ZsdXgvZmx1eC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdG9ybS9mbHV4L0ZsdXhCdWlsZGVyLmphdmEKKysrIGIvZXh0ZXJuYWwvZmx1eC9mbHV4LWNvcmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0b3JtL2ZsdXgvRmx1eEJ1aWxkZXIuamF2YQpAQCAtMTY3LDYgKzE2NywxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcG9sb2d5RGVmLnBhcmFsbGVsaXNtRm9yQm9sdChzdHJlYW0uZ2V0VG8oKSkpOwogICAgICAgICAgICAgICAgICAgICBkZWNsYXJlcnMucHV0KHN0cmVhbS5nZXRUbygpLCBkZWNsYXJlcik7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChib2x0T2JqIGluc3RhbmNlb2YgSVdpbmRvd2VkQm9sdCkgeworICAgICAgICAgICAgICAgIGlmKGRlY2xhcmVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVjbGFyZXIgPSBidWlsZGVyLnNldEJvbHQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLmdldFRvKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElXaW5kb3dlZEJvbHQpIGJvbHRPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wb2xvZ3lEZWYucGFyYWxsZWxpc21Gb3JCb2x0KHN0cmVhbS5nZXRUbygpKSk7CisgICAgICAgICAgICAgICAgICAgIGRlY2xhcmVycy5wdXQoc3RyZWFtLmdldFRvKCksIGRlY2xhcmVyKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNsYXNzIGRvZXMgbm90IGFwcGVhciB0byBiZSBhIGJvbHQ6ICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgYm9sdE9iai5nZXRDbGFzcygpLmdldE5hbWUoKSk7CkBAIC00MTcsNiArNDI1LDkgQEAKICAgICAgICAgQ2xhc3MgY2xhenogPSBpbnN0YW5jZS5nZXRDbGFzcygpOwogICAgICAgICBmb3IoQ29uZmlnTWV0aG9kRGVmIG1ldGhvZERlZiA6IG1ldGhvZERlZnMpewogICAgICAgICAgICAgTGlzdDxPYmplY3Q+IGFyZ3MgPSBtZXRob2REZWYuZ2V0QXJncygpOworICAgICAgICAgICAgaWYgKGFyZ3MgPT0gbnVsbCl7CisgICAgICAgICAgICAgICAgYXJncyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmKG1ldGhvZERlZi5oYXNSZWZlcmVuY2VzKCkpewogICAgICAgICAgICAgICAgIGFyZ3MgPSByZXNvbHZlUmVmZXJlbmNlcyhhcmdzLCBjb250ZXh0KTsKICAgICAgICAgICAgIH0KQEAgLTQ0NCw3ICs0NTUsMTMgQEAKICAgICAgICAgICAgIENsYXNzW10gcGFyYW1DbGFzc2VzID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7CiAgICAgICAgICAgICBpZiAocGFyYW1DbGFzc2VzLmxlbmd0aCA9PSBhcmdzLnNpemUoKSAmJiBtZXRob2QuZ2V0TmFtZSgpLmVxdWFscyhtZXRob2ROYW1lKSkgewogICAgICAgICAgICAgICAgIExPRy5kZWJ1ZygiZm91bmQgY29uc3RydWN0b3Igd2l0aCBzYW1lIG51bWJlciBvZiBhcmdzLi4iKTsKLSAgICAgICAgICAgICAgICBib29sZWFuIGludm9rYWJsZSA9IGNhbkludm9rZVdpdGhBcmdzKGFyZ3MsIG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpKTsKKyAgICAgICAgICAgICAgICBib29sZWFuIGludm9rYWJsZSA9IGZhbHNlOworICAgICAgICAgICAgICAgIGlmIChhcmdzLnNpemUoKSA9PSAwKXsKKyAgICAgICAgICAgICAgICAgICAgLy8gaXQncyBhIG1ldGhvZCB3aXRoIHplcm8gYXJncworICAgICAgICAgICAgICAgICAgICBpbnZva2FibGUgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGludm9rYWJsZSA9IGNhbkludm9rZVdpdGhBcmdzKGFyZ3MsIG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKGludm9rYWJsZSkgewogICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBtZXRob2Q7CiAgICAgICAgICAgICAgICAgICAgIGVsaWdpYmxlQ291bnQrKzsKQEAgLTQ5Miw2ICs1MDksMTIgQEAKICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvclBhcmFtc1tpXSA9IGFyZ3MuZ2V0KGkpOwogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGlzUHJpbWl0aXZlQm9vbGVhbihwYXJhbVR5cGUpICYmIEJvb2xlYW4uY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShvYmplY3RUeXBlKSl7CisgICAgICAgICAgICAgICAgTE9HLmRlYnVnKCJJdHMgYSBwcmltaXRpdmUgYm9vbGVhbi4iKTsKKyAgICAgICAgICAgICAgICBCb29sZWFuIGJvb2wgPSAoQm9vbGVhbilhcmdzLmdldChpKTsKKyAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvclBhcmFtc1tpXSA9IGJvb2wuYm9vbGVhblZhbHVlKCk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZihpc1ByaW1pdGl2ZU51bWJlcihwYXJhbVR5cGUpICYmIE51bWJlci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKG9iamVjdFR5cGUpKXsKICAgICAgICAgICAgICAgICBMT0cuZGVidWcoIkl0cyBhIHByaW1pdGl2ZSBudW1iZXIuIik7CiAgICAgICAgICAgICAgICAgTnVtYmVyIG51bSA9IChOdW1iZXIpYXJncy5nZXQoaSk7CkBAIC01NjMsMzMgKzU4NiwzMSBAQAogICAgICAgICAgICAgICAgICAgICBwYXJhbVR5cGUsIG9iamVjdFR5cGUpOwogICAgICAgICAgICAgaWYgKHBhcmFtVHlwZS5lcXVhbHMob2JqZWN0VHlwZSkpIHsKICAgICAgICAgICAgICAgICBMT0cuZGVidWcoIlllcywgdGhleSBhcmUgdGhlIHNhbWUgY2xhc3MuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocGFyYW1UeXBlLmlzQXNzaWduYWJsZUZyb20ob2JqZWN0VHlwZSkpIHsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW1UeXBlLmlzQXNzaWduYWJsZUZyb20ob2JqZWN0VHlwZSkpIHsKICAgICAgICAgICAgICAgICBMT0cuZGVidWcoIlllcywgYXNzaWdubWVudCBpcyBwb3NzaWJsZS4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKGlzUHJpbWl0aXZlTnVtYmVyKHBhcmFtVHlwZSkgJiYgTnVtYmVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20ob2JqZWN0VHlwZSkpewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYocGFyYW1UeXBlLmlzRW51bSgpICYmIG9iamVjdFR5cGUuZXF1YWxzKFN0cmluZy5jbGFzcykpeworICAgICAgICAgICAgfSBlbHNlIGlmIChpc1ByaW1pdGl2ZUJvb2xlYW4ocGFyYW1UeXBlKSAmJiBCb29sZWFuLmNsYXNzLmlzQXNzaWduYWJsZUZyb20ob2JqZWN0VHlwZSkpeworICAgICAgICAgICAgICAgIExPRy5kZWJ1ZygiWWVzLCBhc3NpZ25tZW50IGlzIHBvc3NpYmxlLiIpOworICAgICAgICAgICAgfSBlbHNlIGlmKGlzUHJpbWl0aXZlTnVtYmVyKHBhcmFtVHlwZSkgJiYgTnVtYmVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20ob2JqZWN0VHlwZSkpeworICAgICAgICAgICAgICAgIExPRy5kZWJ1ZygiWWVzLCBhc3NpZ25tZW50IGlzIHBvc3NpYmxlLiIpOworICAgICAgICAgICAgfSBlbHNlIGlmKHBhcmFtVHlwZS5pc0VudW0oKSAmJiBvYmplY3RUeXBlLmVxdWFscyhTdHJpbmcuY2xhc3MpKXsKICAgICAgICAgICAgICAgICBMT0cuZGVidWcoIlllcywgd2lsbCBjb252ZXJ0IGEgU3RyaW5nIHRvIGVudW0iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwYXJhbVR5cGUuaXNBcnJheSgpICYmIExpc3QuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShvYmplY3RUeXBlKSkgeworICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbVR5cGUuaXNBcnJheSgpICYmIExpc3QuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShvYmplY3RUeXBlKSkgewogICAgICAgICAgICAgICAgIC8vIFRPRE8gbW9yZSBjb2xsZWN0aW9uIGNvbnRlbnQgdHlwZSBjaGVja2luZwogICAgICAgICAgICAgICAgIExPRy5kZWJ1ZygiQXNzaWdubWVudCBpcyBwb3NzaWJsZSBpZiB3ZSBjb252ZXJ0IGEgTGlzdCB0byBhbiBhcnJheS4iKTsKICAgICAgICAgICAgICAgICBMT0cuZGVidWcoIkFycmF5IFR5cGU6IHt9LCBMaXN0IHR5cGU6IHt9IiwgcGFyYW1UeXBlLmdldENvbXBvbmVudFR5cGUoKSwgKChMaXN0KSBvYmopLmdldCgwKS5nZXRDbGFzcygpKTsKLQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQcmltaXRpdmVOdW1iZXIoQ2xhc3MgY2xhenopewogICAgICAgICByZXR1cm4gY2xhenouaXNQcmltaXRpdmUoKSAmJiAhY2xhenouZXF1YWxzKGJvb2xlYW4uY2xhc3MpOwogICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ByaW1pdGl2ZUJvb2xlYW4oQ2xhc3MgY2xhenopeworICAgICAgICByZXR1cm4gY2xhenouaXNQcmltaXRpdmUoKSAmJiBjbGF6ei5lcXVhbHMoYm9vbGVhbi5jbGFzcyk7CisgICAgfQogfQogCmRpZmYgLS1naXQgYS9leHRlcm5hbC9mbHV4L2ZsdXgtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3Rvcm0vZmx1eC9tb2RlbC9PYmplY3REZWYuamF2YSBiL2V4dGVybmFsL2ZsdXgvZmx1eC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdG9ybS9mbHV4L21vZGVsL09iamVjdERlZi5qYXZhCmluZGV4IDczODY5MDAuLmRjOWU2Y2IgMTAwNjQ0Ci0tLSBhL2V4dGVybmFsL2ZsdXgvZmx1eC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdG9ybS9mbHV4L21vZGVsL09iamVjdERlZi5qYXZhCisrKyBiL2V4dGVybmFsL2ZsdXgvZmx1eC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdG9ybS9mbHV4L21vZGVsL09iamVjdERlZi5qYXZhCkBAIC01Niw2ICs1Niw4IEBACiAgICAgICAgICAgICAgICAgaWYobWFwLmNvbnRhaW5zS2V5KCJyZWYiKSAmJiBtYXAuc2l6ZSgpID09IDEpewogICAgICAgICAgICAgICAgICAgICBuZXdWYWwuYWRkKG5ldyBCZWFuUmVmZXJlbmNlKChTdHJpbmcpbWFwLmdldCgicmVmIikpKTsKICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYXNSZWZlcmVuY2VzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBuZXdWYWwuYWRkKG9iaik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBuZXdWYWwuYWRkKG9iaik7CmRpZmYgLS1naXQgYS9leHRlcm5hbC9mbHV4L2ZsdXgtY29yZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvc3Rvcm0vZmx1eC90ZXN0L1Rlc3RCb2x0LmphdmEgYi9leHRlcm5hbC9mbHV4L2ZsdXgtY29yZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvc3Rvcm0vZmx1eC90ZXN0L1Rlc3RCb2x0LmphdmEKaW5kZXggN2YxMTQ2MC4uZjlmMjhjNSAxMDA2NDQKLS0tIGEvZXh0ZXJuYWwvZmx1eC9mbHV4LWNvcmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3N0b3JtL2ZsdXgvdGVzdC9UZXN0Qm9sdC5qYXZhCisrKyBiL2V4dGVybmFsL2ZsdXgvZmx1eC1jb3JlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9zdG9ybS9mbHV4L3Rlc3QvVGVzdEJvbHQuamF2YQpAQCAtMzEsNiArMzEsNyBAQAogICAgIHByaXZhdGUgU3RyaW5nIGZvbzsKICAgICBwcml2YXRlIFN0cmluZyBiYXI7CiAgICAgcHJpdmF0ZSBTdHJpbmcgZm9vQmFyOworICAgIHByaXZhdGUgU3RyaW5nIG5vbmU7CiAKICAgICBwdWJsaWMgc3RhdGljIGVudW0gVGVzdEVudW0gewogICAgICAgICBGT08sCkBAIC00NSw2ICs0NiwxMCBAQAogCiAgICAgfQogCisgICAgcHVibGljIFRlc3RCb2x0KFRlc3RFbnVtIHRlLCBmbG9hdCBmLCBib29sZWFuIGIpeworCisgICAgfQorCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZShUdXBsZSB0dXBsZSwgQmFzaWNPdXRwdXRDb2xsZWN0b3IgYmFzaWNPdXRwdXRDb2xsZWN0b3IpIHsKICAgICAgICAgTE9HLmluZm8oInt9IiwgdHVwbGUpOwpAQCAtNTksNiArNjQsOSBAQAogICAgIHB1YmxpYyB2b2lkIHdpdGhGb28oU3RyaW5nIGZvbyl7CiAgICAgICAgIHRoaXMuZm9vID0gZm9vOwogICAgIH0KKyAgICBwdWJsaWMgdm9pZCB3aXRoTm9uZSgpeworICAgICAgICB0aGlzLm5vbmUgPSAiaGl0IjsKKyAgICB9CiAgICAgcHVibGljIHZvaWQgd2l0aEJhcihTdHJpbmcgYmFyKXsKICAgICAgICAgdGhpcy5iYXIgPSBiYXI7CiAgICAgfQpkaWZmIC0tZ2l0IGEvZXh0ZXJuYWwvZmx1eC9mbHV4LWNvcmUvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZpZ3MvY29uZmlnLW1ldGhvZHMtdGVzdC55YW1sIGIvZXh0ZXJuYWwvZmx1eC9mbHV4LWNvcmUvc3JjL3Rlc3QvcmVzb3VyY2VzL2NvbmZpZ3MvY29uZmlnLW1ldGhvZHMtdGVzdC55YW1sCmluZGV4IDY1MjExZmYuLmNkYTE1MWUgMTAwNjQ0Ci0tLSBhL2V4dGVybmFsL2ZsdXgvZmx1eC1jb3JlL3NyYy90ZXN0L3Jlc291cmNlcy9jb25maWdzL2NvbmZpZy1tZXRob2RzLXRlc3QueWFtbAorKysgYi9leHRlcm5hbC9mbHV4L2ZsdXgtY29yZS9zcmMvdGVzdC9yZXNvdXJjZXMvY29uZmlncy9jb25maWctbWV0aG9kcy10ZXN0LnlhbWwKQEAgLTM2LDEwICszNiwxMiBAQAogICAgIGNvbnN0cnVjdG9yQXJnczoKICAgICAgIC0gRk9PICMgZW51bSBjbGFzcwogICAgICAgLSAxLjAKKyAgICAgIC0gdHJ1ZQogICAgIGNvbmZpZ01ldGhvZHM6CiAgICAgICAtIG5hbWU6ICJ3aXRoRm9vIgogICAgICAgICBhcmdzOgogICAgICAgICAgIC0gImZvbyIKKyAgICAgIC0gbmFtZTogIndpdGhOb25lIgogICAgICAgLSBuYW1lOiAid2l0aEJhciIKICAgICAgICAgYXJnczoKICAgICAgICAgICAtICJiYXIiCmRpZmYgLS1naXQgYS9leHRlcm5hbC9mbHV4L2ZsdXgtZXhhbXBsZXMvUkVBRE1FLm1kIGIvZXh0ZXJuYWwvZmx1eC9mbHV4LWV4YW1wbGVzL1JFQURNRS5tZAppbmRleCAwYTcwODVlLi5hNmFmZWMyIDEwMDY0NAotLS0gYS9leHRlcm5hbC9mbHV4L2ZsdXgtZXhhbXBsZXMvUkVBRE1FLm1kCisrKyBiL2V4dGVybmFsL2ZsdXgvZmx1eC1leGFtcGxlcy9SRUFETUUubWQKQEAgLTY0LDMgKzY0LDEyIEBACiBgYGBiYXNoCiBzdG9ybSBqYXIgLi90YXJnZXQvZmx1eC1leGFtcGxlcy0qLmphciBvcmcuYXBhY2hlLnN0b3JtLmZsdXguRmx1eCAtLWxvY2FsIC4vc3JjL21haW4vcmVzb3VyY2VzL3NpbXBsZV9oYmFzZS55YW1sIC0tZmlsdGVyIG15X2hiYXNlX2JvbHQucHJvcGVydGllcwogYGBgCisjIyMgW3NpbXBsZV93aW5kb3dpbmcueWFtbF0oc3JjL21haW4vcmVzb3VyY2VzL3NpbXBsZV93aW5kb3dpbmcueWFtbCkKKworVGhpcyBleGFtcGxlIGlsbHVzdHJhdGVzIGhvdyB0byB1c2UgRmx1eCB0byBzZXQgdXAgYSBzdG9ybSB0b3BvbG9neSB0aGF0IGNvbnRhaW5zIHdpbmRvd2luZyBvcGVyYXRpb25zLgorCitUbyBydW4sCisKK2BgYGJhc2gKK3N0b3JtIGphciAuL3RhcmdldC9mbHV4LWV4YW1wbGVzLSouamFyIG9yZy5hcGFjaGUuc3Rvcm0uZmx1eC5GbHV4IC0tbG9jYWwgLi9zcmMvbWFpbi9yZXNvdXJjZXMvc2ltcGxlX3dpbmRvd2luZy55YW1sCitgYGAKZGlmZiAtLWdpdCBhL2V4dGVybmFsL2ZsdXgvZmx1eC1leGFtcGxlcy9wb20ueG1sIGIvZXh0ZXJuYWwvZmx1eC9mbHV4LWV4YW1wbGVzL3BvbS54bWwKaW5kZXggZmU0MzY2My4uNTM3YjRlMCAxMDA2NDQKLS0tIGEvZXh0ZXJuYWwvZmx1eC9mbHV4LWV4YW1wbGVzL3BvbS54bWwKKysrIGIvZXh0ZXJuYWwvZmx1eC9mbHV4LWV4YW1wbGVzL3BvbS54bWwKQEAgLTExNyw3ICsxMTcsNiBAQAogICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNoYWRlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KICAgICAgICAgICAgICAgICAgICAgPGNyZWF0ZURlcGVuZGVuY3lSZWR1Y2VkUG9tPnRydWU8L2NyZWF0ZURlcGVuZGVuY3lSZWR1Y2VkUG9tPgotICAgICAgICAgICAgICAgICAgICA8bWluaW1pemVKYXI+dHJ1ZTwvbWluaW1pemVKYXI+CiAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgogICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgogICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgpkaWZmIC0tZ2l0IGEvZXh0ZXJuYWwvZmx1eC9mbHV4LWV4YW1wbGVzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdG9ybS9mbHV4L2V4YW1wbGVzL1Rlc3RQcmludEJvbHQuamF2YSBiL2V4dGVybmFsL2ZsdXgvZmx1eC1leGFtcGxlcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3Rvcm0vZmx1eC9leGFtcGxlcy9UZXN0UHJpbnRCb2x0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U4NDQ0MQotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVybmFsL2ZsdXgvZmx1eC1leGFtcGxlcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3Rvcm0vZmx1eC9leGFtcGxlcy9UZXN0UHJpbnRCb2x0LmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5zdG9ybS5mbHV4LmV4YW1wbGVzOworCitpbXBvcnQgYmFja3R5cGUuc3Rvcm0udG9wb2xvZ3kuQmFzaWNPdXRwdXRDb2xsZWN0b3I7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0udG9wb2xvZ3kuT3V0cHV0RmllbGRzRGVjbGFyZXI7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0udG9wb2xvZ3kuYmFzZS5CYXNlQmFzaWNCb2x0OworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnR1cGxlLlR1cGxlOworCisvKioKKyAqIFByaW50cyB0aGUgdHVwbGVzIHRvIHN0ZG91dAorICovCitwdWJsaWMgY2xhc3MgVGVzdFByaW50Qm9sdCBleHRlbmRzIEJhc2VCYXNpY0JvbHQgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZShUdXBsZSB0dXBsZSwgQmFzaWNPdXRwdXRDb2xsZWN0b3IgY29sbGVjdG9yKSB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbih0dXBsZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZGVjbGFyZU91dHB1dEZpZWxkcyhPdXRwdXRGaWVsZHNEZWNsYXJlciBvZmQpIHsKKyAgICB9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leHRlcm5hbC9mbHV4L2ZsdXgtZXhhbXBsZXMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0b3JtL2ZsdXgvZXhhbXBsZXMvVGVzdFdpbmRvd0JvbHQuamF2YSBiL2V4dGVybmFsL2ZsdXgvZmx1eC1leGFtcGxlcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3Rvcm0vZmx1eC9leGFtcGxlcy9UZXN0V2luZG93Qm9sdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhYWI5YjYKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlcm5hbC9mbHV4L2ZsdXgtZXhhbXBsZXMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0b3JtL2ZsdXgvZXhhbXBsZXMvVGVzdFdpbmRvd0JvbHQuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuc3Rvcm0uZmx1eC5leGFtcGxlczsKKworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnRhc2suT3V0cHV0Q29sbGVjdG9yOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnRhc2suVG9wb2xvZ3lDb250ZXh0OworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnRvcG9sb2d5Lk91dHB1dEZpZWxkc0RlY2xhcmVyOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnRvcG9sb2d5LmJhc2UuQmFzZVdpbmRvd2VkQm9sdDsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS50dXBsZS5GaWVsZHM7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0udHVwbGUuVmFsdWVzOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLndpbmRvd2luZy5UdXBsZVdpbmRvdzsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK3B1YmxpYyBjbGFzcyBUZXN0V2luZG93Qm9sdCBleHRlbmRzIEJhc2VXaW5kb3dlZEJvbHQgeworICAgIHByaXZhdGUgT3V0cHV0Q29sbGVjdG9yIGNvbGxlY3RvcjsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHByZXBhcmUoTWFwIHN0b3JtQ29uZiwgVG9wb2xvZ3lDb250ZXh0IGNvbnRleHQsIE91dHB1dENvbGxlY3RvciBjb2xsZWN0b3IpIHsKKyAgICAgICAgdGhpcy5jb2xsZWN0b3IgPSBjb2xsZWN0b3I7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZShUdXBsZVdpbmRvdyBpbnB1dFdpbmRvdykgeworICAgICAgICBjb2xsZWN0b3IuZW1pdChuZXcgVmFsdWVzKGlucHV0V2luZG93LmdldCgpLnNpemUoKSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRlY2xhcmVPdXRwdXRGaWVsZHMoT3V0cHV0RmllbGRzRGVjbGFyZXIgZGVjbGFyZXIpIHsKKyAgICAgICAgZGVjbGFyZXIuZGVjbGFyZShuZXcgRmllbGRzKCJjb3VudCIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leHRlcm5hbC9mbHV4L2ZsdXgtZXhhbXBsZXMvc3JjL21haW4vcmVzb3VyY2VzL3NpbXBsZV93aW5kb3dpbmcueWFtbCBiL2V4dGVybmFsL2ZsdXgvZmx1eC1leGFtcGxlcy9zcmMvbWFpbi9yZXNvdXJjZXMvc2ltcGxlX3dpbmRvd2luZy55YW1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjMxYmUxMDkKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlcm5hbC9mbHV4L2ZsdXgtZXhhbXBsZXMvc3JjL21haW4vcmVzb3VyY2VzL3NpbXBsZV93aW5kb3dpbmcueWFtbApAQCAtMCwwICsxLDY5IEBACisjIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisjIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisjIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisjIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy0tLQorCituYW1lOiAic2xpZGluZy13aW5kb3ctdG9wb2xvZ3kiCisKK2NvbXBvbmVudHM6CisgIC0gaWQ6ICJ3aW5kb3dMZW5ndGgiCisgICAgY2xhc3NOYW1lOiAiYmFja3R5cGUuc3Rvcm0udG9wb2xvZ3kuYmFzZS5CYXNlV2luZG93ZWRCb2x0JENvdW50IgorICAgIGNvbnN0cnVjdG9yQXJnczoKKyAgICAgIC0gNQorICAtIGlkOiAic2xpZGluZ0ludGVydmFsIgorICAgIGNsYXNzTmFtZTogImJhY2t0eXBlLnN0b3JtLnRvcG9sb2d5LmJhc2UuQmFzZVdpbmRvd2VkQm9sdCRDb3VudCIKKyAgICBjb25zdHJ1Y3RvckFyZ3M6CisgICAgICAtIDMKKworY29uZmlnOgorICB0b3BvbG9neS53b3JrZXJzOiAxCisKKyMgc3BvdXQgZGVmaW5pdGlvbnMKK3Nwb3V0czoKKyAgLSBpZDogInNwb3V0LTEiCisgICAgY2xhc3NOYW1lOiAiYmFja3R5cGUuc3Rvcm0udGVzdGluZy5UZXN0V29yZFNwb3V0IgorICAgIHBhcmFsbGVsaXNtOiAxCisKKyMgYm9sdCBkZWZpbml0aW9ucworYm9sdHM6CisgIC0gaWQ6ICJib2x0LTEiCisgICAgY2xhc3NOYW1lOiAib3JnLmFwYWNoZS5zdG9ybS5mbHV4LmV4YW1wbGVzLlRlc3RXaW5kb3dCb2x0IgorICAgIGNvbmZpZ01ldGhvZHM6CisgICAgICAtIG5hbWU6ICJ3aXRoV2luZG93IgorICAgICAgICBhcmdzOiBbcmVmOiAid2luZG93TGVuZ3RoIiwgcmVmOiAic2xpZGluZ0ludGVydmFsIl0KKyAgICBwYXJhbGxlbGlzbTogMQorICAtIGlkOiAiYm9sdC0yIgorICAgIGNsYXNzTmFtZTogIm9yZy5hcGFjaGUuc3Rvcm0uZmx1eC5leGFtcGxlcy5UZXN0UHJpbnRCb2x0IgorICAgIHBhcmFsbGVsaXNtOiAxCisKKworI3N0cmVhbSBkZWZpbml0aW9ucworIyBzdHJlYW0gZGVmaW5pdGlvbnMgZGVmaW5lIGNvbm5lY3Rpb25zIGJldHdlZW4gc3BvdXRzIGFuZCBib2x0cy4KKyMgbm90ZSB0aGF0IHN1Y2ggY29ubmVjdGlvbnMgY2FuIGJlIGN5Y2xpY2FsCitzdHJlYW1zOgorICAtIG5hbWU6ICJzcG91dC0xIC0tPiBib2x0LTEiICMgbmFtZSBpc24ndCB1c2VkIChwbGFjZWhvbGRlciBmb3IgbG9nZ2luZywgVUksIGV0Yy4pCisjICAgIGlkOiAiY29ubmVjdGlvbi0xIgorICAgIGZyb206ICJzcG91dC0xIgorICAgIHRvOiAiYm9sdC0xIgorICAgIGdyb3VwaW5nOgorICAgICAgdHlwZTogRklFTERTCisgICAgICBhcmdzOiBbIndvcmQiXQorICAtIG5hbWU6ICJib2x0LTEgLS0+IGJvbHQtMiIgIyBuYW1lIGlzbid0IHVzZWQgKHBsYWNlaG9sZGVyIGZvciBsb2dnaW5nLCBVSSwgZXRjLikKKyMgICAgaWQ6ICJjb25uZWN0aW9uLTEiCisgICAgZnJvbTogImJvbHQtMSIKKyAgICB0bzogImJvbHQtMiIKKyAgICBncm91cGluZzoKKyAgICAgIHR5cGU6IFNIVUZGTEUKZGlmZiAtLWdpdCBhL2V4dGVybmFsL3NxbC9zdG9ybS1zcWwtY29yZS9zcmMvdGVzdC9vcmcvYXBhY2hlL3N0b3JtL3NxbC9jb21waWxlci9UZXN0Q29tcGlsZXJVdGlscy5qYXZhIGIvZXh0ZXJuYWwvc3FsL3N0b3JtLXNxbC1jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc3Rvcm0vc3FsL2NvbXBpbGVyL1Rlc3RDb21waWxlclV0aWxzLmphdmEKaW5kZXggMGU1ZmEwYi4uMDkyMjMwZiAxMDA2NDQKLS0tIGEvZXh0ZXJuYWwvc3FsL3N0b3JtLXNxbC1jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc3Rvcm0vc3FsL2NvbXBpbGVyL1Rlc3RDb21waWxlclV0aWxzLmphdmEKKysrIGIvZXh0ZXJuYWwvc3FsL3N0b3JtLXNxbC1jb3JlL3NyYy90ZXN0L29yZy9hcGFjaGUvc3Rvcm0vc3FsL2NvbXBpbGVyL1Rlc3RDb21waWxlclV0aWxzLmphdmEKQEAgLTEsMyArMSwyMCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiA8cD4KKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogPHA+CisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnN0b3JtLnNxbC5jb21waWxlcjsKIAogaW1wb3J0IG9yZy5hcGFjaGUuY2FsY2l0ZS5hZGFwdGVyLmphdmEuSmF2YVR5cGVGYWN0b3J5OwpkaWZmIC0tZ2l0IGEvZXh0ZXJuYWwvc3FsL3N0b3JtLXNxbC1rYWZrYS9zcmMvanZtL29yZy9hcGFjaGUvc3Rvcm0vc3FsL2thZmthL0pzb25TY2hlbWUuamF2YSBiL2V4dGVybmFsL3NxbC9zdG9ybS1zcWwta2Fma2Evc3JjL2p2bS9vcmcvYXBhY2hlL3N0b3JtL3NxbC9rYWZrYS9Kc29uU2NoZW1lLmphdmEKaW5kZXggODAwMzdjNi4uMWI0NWIzMCAxMDA2NDQKLS0tIGEvZXh0ZXJuYWwvc3FsL3N0b3JtLXNxbC1rYWZrYS9zcmMvanZtL29yZy9hcGFjaGUvc3Rvcm0vc3FsL2thZmthL0pzb25TY2hlbWUuamF2YQorKysgYi9leHRlcm5hbC9zcWwvc3Rvcm0tc3FsLWthZmthL3NyYy9qdm0vb3JnL2FwYWNoZS9zdG9ybS9zcWwva2Fma2EvSnNvblNjaGVtZS5qYXZhCkBAIC0xOSw5ICsxOSwxMSBAQAogCiBpbXBvcnQgYmFja3R5cGUuc3Rvcm0uc3BvdXQuU2NoZW1lOwogaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnR1cGxlLkZpZWxkczsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS51dGlscy5VdGlsczsKIGltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQuT2JqZWN0TWFwcGVyOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CkBAIC0zNCwxMSArMzYsMTEgQEAKICAgfQogCiAgIEBPdmVycmlkZQotICBwdWJsaWMgTGlzdDxPYmplY3Q+IGRlc2VyaWFsaXplKGJ5dGVbXSBzZXIpIHsKKyAgcHVibGljIExpc3Q8T2JqZWN0PiBkZXNlcmlhbGl6ZShCeXRlQnVmZmVyIHNlcikgewogICAgIE9iamVjdE1hcHBlciBtYXBwZXIgPSBuZXcgT2JqZWN0TWFwcGVyKCk7CiAgICAgdHJ5IHsKICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgICAgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gbWFwID0gbWFwcGVyLnJlYWRWYWx1ZShzZXIsIEhhc2hNYXAuY2xhc3MpOworICAgICAgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gbWFwID0gbWFwcGVyLnJlYWRWYWx1ZShVdGlscy50b0J5dGVBcnJheShzZXIpLCBIYXNoTWFwLmNsYXNzKTsKICAgICAgIEFycmF5TGlzdDxPYmplY3Q+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgIGZvciAoU3RyaW5nIGYgOiBmaWVsZHMpIHsKICAgICAgICAgbGlzdC5hZGQobWFwLmdldChmKSk7CmRpZmYgLS1naXQgYS9leHRlcm5hbC9zcWwvc3Rvcm0tc3FsLWthZmthL3NyYy90ZXN0L29yZy9hcGFjaGUvc3Rvcm0vc3FsL2thZmthL1Rlc3RKc29uUmVwcmVzZW50YXRpb24uamF2YSBiL2V4dGVybmFsL3NxbC9zdG9ybS1zcWwta2Fma2Evc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zdG9ybS9zcWwva2Fma2EvVGVzdEpzb25SZXByZXNlbnRhdGlvbi5qYXZhCmluZGV4IGQyODk4ZTguLjU5NzM2NzIgMTAwNjQ0Ci0tLSBhL2V4dGVybmFsL3NxbC9zdG9ybS1zcWwta2Fma2Evc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zdG9ybS9zcWwva2Fma2EvVGVzdEpzb25SZXByZXNlbnRhdGlvbi5qYXZhCisrKyBiL2V4dGVybmFsL3NxbC9zdG9ybS1zcWwta2Fma2Evc3JjL3Rlc3Qvb3JnL2FwYWNoZS9zdG9ybS9zcWwva2Fma2EvVGVzdEpzb25SZXByZXNlbnRhdGlvbi5qYXZhCkBAIC0zNCw3ICszNCw3IEBACiAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGZpZWxkcyA9IExpc3RzLm5ld0FycmF5TGlzdCgiSUQiLCAidmFsIik7CiAgICAgZmluYWwgU3RyaW5nIHMgPSAie1wiSURcIjogMSwgXCJ2YWxcIjogXCIyXCJ9IjsKICAgICBKc29uU2NoZW1lIHNjaGVtZSA9IG5ldyBKc29uU2NoZW1lKGZpZWxkcyk7Ci0gICAgTGlzdDxPYmplY3Q+IG8gPSBzY2hlbWUuZGVzZXJpYWxpemUocy5nZXRCeXRlcyhDaGFyc2V0LmRlZmF1bHRDaGFyc2V0KCkpKTsKKyAgICBMaXN0PE9iamVjdD4gbyA9IHNjaGVtZS5kZXNlcmlhbGl6ZShCeXRlQnVmZmVyLndyYXAocy5nZXRCeXRlcyhDaGFyc2V0LmRlZmF1bHRDaGFyc2V0KCkpKSk7CiAgICAgYXNzZXJ0QXJyYXlFcXVhbHMobmV3IE9iamVjdFtdIHsxLCAiMiJ9LCBvLnRvQXJyYXkoKSk7CiAgIH0KIApkaWZmIC0tZ2l0IGEvZXh0ZXJuYWwvc3FsL3N0b3JtLXNxbC1rYWZrYS9zcmMvdGVzdC9vcmcvYXBhY2hlL3N0b3JtL3NxbC9rYWZrYS9UZXN0S2Fma2FEYXRhU291cmNlc1Byb3ZpZGVyLmphdmEgYi9leHRlcm5hbC9zcWwvc3Rvcm0tc3FsLWthZmthL3NyYy90ZXN0L29yZy9hcGFjaGUvc3Rvcm0vc3FsL2thZmthL1Rlc3RLYWZrYURhdGFTb3VyY2VzUHJvdmlkZXIuamF2YQppbmRleCA1MzFmNzY0Li40MThiYzY4IDEwMDY0NAotLS0gYS9leHRlcm5hbC9zcWwvc3Rvcm0tc3FsLWthZmthL3NyYy90ZXN0L29yZy9hcGFjaGUvc3Rvcm0vc3FsL2thZmthL1Rlc3RLYWZrYURhdGFTb3VyY2VzUHJvdmlkZXIuamF2YQorKysgYi9leHRlcm5hbC9zcWwvc3Rvcm0tc3FsLWthZmthL3NyYy90ZXN0L29yZy9hcGFjaGUvc3Rvcm0vc3FsL2thZmthL1Rlc3RLYWZrYURhdGFTb3VyY2VzUHJvdmlkZXIuamF2YQpAQCAtMjEsNiArMjEsOCBAQAogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CiBpbXBvcnQga2Fma2EuamF2YWFwaS5wcm9kdWNlci5Qcm9kdWNlcjsKIGltcG9ydCBrYWZrYS5wcm9kdWNlci5LZXllZE1lc3NhZ2U7CitpbXBvcnQgb3JnLmFwYWNoZS5rYWZrYS5jbGllbnRzLnByb2R1Y2VyLkthZmthUHJvZHVjZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5rYWZrYS5jbGllbnRzLnByb2R1Y2VyLlByb2R1Y2VyUmVjb3JkOwogaW1wb3J0IG9yZy5hcGFjaGUuc3Rvcm0uc3FsLmthZmthLkthZmthRGF0YVNvdXJjZXNQcm92aWRlci5LYWZrYVRyaWRlbnRTaW5rOwogaW1wb3J0IG9yZy5hcGFjaGUuc3Rvcm0uc3FsLnJ1bnRpbWUuRGF0YVNvdXJjZXNSZWdpc3RyeTsKIGltcG9ydCBvcmcuYXBhY2hlLnN0b3JtLnNxbC5ydW50aW1lLkZpZWxkSW5mbzsKQEAgLTM3LDYgKzM5LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7CiAKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by4qOwogCkBAIC01Niw3ICs1OSw4IEBACiAgICAgS2Fma2FUcmlkZW50U2luayBzaW5rID0gKEthZmthVHJpZGVudFNpbmspIGRzLmdldENvbnN1bWVyKCk7CiAgICAgc2luay5wcmVwYXJlKG51bGwsIG51bGwpOwogICAgIFRyaWRlbnRLYWZrYVN0YXRlIHN0YXRlID0gKFRyaWRlbnRLYWZrYVN0YXRlKSBXaGl0ZWJveC5nZXRJbnRlcm5hbFN0YXRlKHNpbmssICJzdGF0ZSIpOwotICAgIFByb2R1Y2VyIHByb2R1Y2VyID0gbW9jayhQcm9kdWNlci5jbGFzcyk7CisgICAgS2Fma2FQcm9kdWNlciBwcm9kdWNlciA9IG1vY2soS2Fma2FQcm9kdWNlci5jbGFzcyk7CisgICAgZG9SZXR1cm4obW9jayhGdXR1cmUuY2xhc3MpKS53aGVuKHByb2R1Y2VyKS5zZW5kKGFueShQcm9kdWNlclJlY29yZC5jbGFzcykpOwogICAgIFdoaXRlYm94LnNldEludGVybmFsU3RhdGUoc3RhdGUsICJwcm9kdWNlciIsIHByb2R1Y2VyKTsKICAgICBMaXN0PFRyaWRlbnRUdXBsZT4gdHVwbGVMaXN0ID0gbW9ja1R1cGxlTGlzdCgpOwogICAgIGZvciAoVHJpZGVudFR1cGxlIHQgOiB0dXBsZUxpc3QpIHsKQEAgLTc5LDcgKzgzLDcgQEAKICAgICByZXR1cm4gdHVwbGVMaXN0OwogICB9CiAKLSAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgS2Fma2FNZXNzYWdlTWF0Y2hlciBleHRlbmRzIEFyZ3VtZW50TWF0Y2hlcjxLZXllZE1lc3NhZ2U+IHsKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgS2Fma2FNZXNzYWdlTWF0Y2hlciBleHRlbmRzIEFyZ3VtZW50TWF0Y2hlcjxQcm9kdWNlclJlY29yZD4gewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQUklNQVJZX0lOREVYID0gMDsKICAgICBwcml2YXRlIGZpbmFsIFRyaWRlbnRUdXBsZSB0dXBsZTsKIApAQCAtOTAsMTEgKzk0LDExIEBACiAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhPYmplY3QgbykgewotICAgICAgS2V5ZWRNZXNzYWdlPE9iamVjdCwgQnl0ZUJ1ZmZlcj4gbSA9IChLZXllZE1lc3NhZ2U8T2JqZWN0LEJ5dGVCdWZmZXI+KW87CisgICAgICBQcm9kdWNlclJlY29yZDxPYmplY3QsIEJ5dGVCdWZmZXI+IG0gPSAoUHJvZHVjZXJSZWNvcmQ8T2JqZWN0LEJ5dGVCdWZmZXI+KW87CiAgICAgICBpZiAobS5rZXkoKSAhPSB0dXBsZS5nZXQoUFJJTUFSWV9JTkRFWCkpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgfQotICAgICAgQnl0ZUJ1ZmZlciBidWYgPSBtLm1lc3NhZ2UoKTsKKyAgICAgIEJ5dGVCdWZmZXIgYnVmID0gbS52YWx1ZSgpOwogICAgICAgQnl0ZUJ1ZmZlciBiID0gU0VSSUFMSVpFUi53cml0ZSh0dXBsZS5nZXRWYWx1ZXMoKSwgbnVsbCk7CiAgICAgICByZXR1cm4gYi5lcXVhbHMoYnVmKTsKICAgICB9CmRpZmYgLS1naXQgYS9leHRlcm5hbC9zdG9ybS1lbGFzdGljc2VhcmNoL3BvbS54bWwgYi9leHRlcm5hbC9zdG9ybS1lbGFzdGljc2VhcmNoL3BvbS54bWwKaW5kZXggNzc3NzU0OS4uZmQyNjNlNiAxMDA2NDQKLS0tIGEvZXh0ZXJuYWwvc3Rvcm0tZWxhc3RpY3NlYXJjaC9wb20ueG1sCisrKyBiL2V4dGVybmFsL3N0b3JtLWVsYXN0aWNzZWFyY2gvcG9tLnhtbApAQCAtNDEsNiArNDEsMTEgQEAKIAogICAgIDxkZXBlbmRlbmNpZXM+CiAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1pbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtaW88L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CiAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnN0b3JtPC9ncm91cElkPgogICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3Rvcm0tY29yZTwvYXJ0aWZhY3RJZD4KICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KZGlmZiAtLWdpdCBhL2V4dGVybmFsL3N0b3JtLWV2ZW50aHVicy9wb20ueG1sIGIvZXh0ZXJuYWwvc3Rvcm0tZXZlbnRodWJzL3BvbS54bWwKaW5kZXggMDMzOGUxZS4uYjIyN2YyNCAxMDA3NTUKLS0tIGEvZXh0ZXJuYWwvc3Rvcm0tZXZlbnRodWJzL3BvbS54bWwKKysrIGIvZXh0ZXJuYWwvc3Rvcm0tZXZlbnRodWJzL3BvbS54bWwKQEAgLTQ5LDcgKzQ5LDYgQEAKICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+DQogICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4NCiAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICA8bWluaW1pemVKYXI+dHJ1ZTwvbWluaW1pemVKYXI+DQogICAgICAgICAgICAgICAgICAgICA8dHJhbnNmb3JtZXJzPg0KICAgICAgICAgICAgICAgICAgICAgICAgIDx0cmFuc2Zvcm1lciBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zLnNoYWRlLnJlc291cmNlLkFwYWNoZUxpY2Vuc2VSZXNvdXJjZVRyYW5zZm9ybWVyIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyYW5zZm9ybWVyPg0KZGlmZiAtLWdpdCBhL2V4dGVybmFsL3N0b3JtLWhiYXNlL1JFQURNRS5tZCBiL2V4dGVybmFsL3N0b3JtLWhiYXNlL1JFQURNRS5tZAppbmRleCA4MWQzNTFhLi5mZDRkMGFkIDEwMDY0NAotLS0gYS9leHRlcm5hbC9zdG9ybS1oYmFzZS9SRUFETUUubWQKKysrIGIvZXh0ZXJuYWwvc3Rvcm0taGJhc2UvUkVBRE1FLm1kCkBAIC0xMDcsNiArMTA3LDE2IEBACiAgYGBgamF2YQogSEJhc2VCb2x0IGhiYXNlID0gbmV3IEhCYXNlQm9sdCgiV29yZENvdW50IiwgbWFwcGVyKTsKICBgYGAKKyAKKyBIQmFzZUJvbHQgcGFyYW1zCisKK3xBcmcgIHxEZXNjcmlwdGlvbiB8IFR5cGUgfCBEZWZhdWx0IHwKK3wtLS0JfC0tLSB8LS0tCit8d3JpdGVUb1dBTCB8IFRvIHR1cm4gRHVyYWJpbGl0eSBTWU5DX1dBTCBvciBTS0lQX1dBTCB8IEJvb2xlYW4gKE9wdGlvbmFsKSB8IFRydWUgfAorfGNvbmZpZ0tleSB8IEFueSBIYmFzZSByZWxhdGVkIGNvbmZpZ3MgfCBNYXAgKE9wdGlvbmFsKSB8IHwKK3xiYXRjaFNpemUgfCBNYXggbm8ub2YgVHVwbGVzIGJhdGNoZWQgdG9nZXRoZXIgdG8gd3JpdGUgdG8gSEJhc2UgfCBJbnQgKE9wdGlvbmFsKSB8IDE1MDAwIHwKK3xmbHVzaEludGVydmFsU2Vjc3wgKEluIHNlY29uZHMpICBJZiA+IDAgSEJhc2UgQm9sdCB3aWxsIHBlcmlvZGljYWxseSBmbHVzaCB0cmFuc2FjdGlvbiBiYXRjaGVzLiBFbmFibGluZyB0aGlzIGlzIHJlY29tbWVuZGVkIHRvIGF2b2lkIHR1cGxlIHRpbWVvdXRzIHdoaWxlIHdhaXRpbmcgZm9yIGEgYmF0Y2ggdG8gZmlsbCB1cC4gfCBJbnQgKE9wdGlvbmFsKSB8IDAgfAorCiAKIFRoZSBgSEJhc2VCb2x0YCB3aWxsIGRlbGVnYXRlIHRvIHRoZSBgbWFwcGVyYCBpbnN0YW5jZSB0byBmaWd1cmUgb3V0IGhvdyB0byBwZXJzaXN0IHR1cGxlIGRhdGEgdG8gSEJhc2UuCiAKZGlmZiAtLWdpdCBhL2V4dGVybmFsL3N0b3JtLWhiYXNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdG9ybS9oYmFzZS9ib2x0L0Fic3RyYWN0SEJhc2VCb2x0LmphdmEgYi9leHRlcm5hbC9zdG9ybS1oYmFzZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3Rvcm0vaGJhc2UvYm9sdC9BYnN0cmFjdEhCYXNlQm9sdC5qYXZhCmluZGV4IGQ4MTQxMTcuLjQwNGFhN2EgMTAwNjQ0Ci0tLSBhL2V4dGVybmFsL3N0b3JtLWhiYXNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdG9ybS9oYmFzZS9ib2x0L0Fic3RyYWN0SEJhc2VCb2x0LmphdmEKKysrIGIvZXh0ZXJuYWwvc3Rvcm0taGJhc2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0b3JtL2hiYXNlL2JvbHQvQWJzdHJhY3RIQmFzZUJvbHQuamF2YQpAQCAtNDIsNiArNDIsOCBAQAogICAgIHByb3RlY3RlZCBTdHJpbmcgdGFibGVOYW1lOwogICAgIHByb3RlY3RlZCBIQmFzZU1hcHBlciBtYXBwZXI7CiAgICAgcHJvdGVjdGVkIFN0cmluZyBjb25maWdLZXk7CisgICAgcHJvdGVjdGVkIGludCBiYXRjaFNpemUgPSAxNTAwMDsKKyAgICBwcm90ZWN0ZWQgaW50IGZsdXNoSW50ZXJ2YWxTZWNzID0gMDsKIAogICAgIHB1YmxpYyBBYnN0cmFjdEhCYXNlQm9sdChTdHJpbmcgdGFibGVOYW1lLCBIQmFzZU1hcHBlciBtYXBwZXIpIHsKICAgICAgICAgVmFsaWRhdGUubm90RW1wdHkodGFibGVOYW1lLCAiVGFibGUgbmFtZSBjYW4gbm90IGJlIGJsYW5rIG9yIG51bGwiKTsKZGlmZiAtLWdpdCBhL2V4dGVybmFsL3N0b3JtLWhiYXNlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdG9ybS9oYmFzZS9ib2x0L0hCYXNlQm9sdC5qYXZhIGIvZXh0ZXJuYWwvc3Rvcm0taGJhc2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0b3JtL2hiYXNlL2JvbHQvSEJhc2VCb2x0LmphdmEKaW5kZXggY2YyOWFhNS4uZWExN2IyYyAxMDA2NDQKLS0tIGEvZXh0ZXJuYWwvc3Rvcm0taGJhc2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0b3JtL2hiYXNlL2JvbHQvSEJhc2VCb2x0LmphdmEKKysrIGIvZXh0ZXJuYWwvc3Rvcm0taGJhc2Uvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0b3JtL2hiYXNlL2JvbHQvSEJhc2VCb2x0LmphdmEKQEAgLTE5LDYgKzE5LDggQEAKIAogaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnRvcG9sb2d5Lk91dHB1dEZpZWxkc0RlY2xhcmVyOwogaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnR1cGxlLlR1cGxlOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnV0aWxzLlR1cGxlVXRpbHM7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0uQ29uZmlnOwogaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmhiYXNlLmNsaWVudC5EdXJhYmlsaXR5OwogaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmhiYXNlLmNsaWVudC5NdXRhdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnN0b3JtLmhiYXNlLmJvbHQubWFwcGVyLkhCYXNlTWFwcGVyOwpAQCAtMjYsNyArMjgsOSBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwogCiAvKioKICAqIEJhc2ljIGJvbHQgZm9yIHdyaXRpbmcgdG8gSEJhc2UuCkBAIC0zOCw5ICs0MiwxMyBAQAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihIQmFzZUJvbHQuY2xhc3MpOwogCiAgICAgYm9vbGVhbiB3cml0ZVRvV0FMID0gdHJ1ZTsKKyAgICBMaXN0PE11dGF0aW9uPiBiYXRjaE11dGF0aW9uczsKKyAgICBMaXN0PFR1cGxlPiB0dXBsZUJhdGNoOwogCiAgICAgcHVibGljIEhCYXNlQm9sdChTdHJpbmcgdGFibGVOYW1lLCBIQmFzZU1hcHBlciBtYXBwZXIpIHsKICAgICAgICAgc3VwZXIodGFibGVOYW1lLCBtYXBwZXIpOworICAgICAgICB0aGlzLmJhdGNoTXV0YXRpb25zID0gbmV3IExpbmtlZExpc3Q8PigpOworICAgICAgICB0aGlzLnR1cGxlQmF0Y2ggPSBuZXcgTGlua2VkTGlzdDw+KCk7CiAgICAgfQogCiAgICAgcHVibGljIEhCYXNlQm9sdCB3cml0ZVRvV0FMKGJvb2xlYW4gd3JpdGVUb1dBTCkgewpAQCAtNTMsMjEgKzYxLDcwIEBACiAgICAgICAgIHJldHVybiB0aGlzOwogICAgIH0KIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoVHVwbGUgdHVwbGUpIHsKLSAgICAgICAgYnl0ZVtdIHJvd0tleSA9IHRoaXMubWFwcGVyLnJvd0tleSh0dXBsZSk7Ci0gICAgICAgIENvbHVtbkxpc3QgY29scyA9IHRoaXMubWFwcGVyLmNvbHVtbnModHVwbGUpOwotICAgICAgICBMaXN0PE11dGF0aW9uPiBtdXRhdGlvbnMgPSBoQmFzZUNsaWVudC5jb25zdHJ1Y3RNdXRhdGlvblJlcShyb3dLZXksIGNvbHMsIHdyaXRlVG9XQUw/IER1cmFiaWxpdHkuU1lOQ19XQUwgOiBEdXJhYmlsaXR5LlNLSVBfV0FMKTsKKyAgICBwdWJsaWMgSEJhc2VCb2x0IHdpdGhCYXRjaFNpemUoaW50IGJhdGNoU2l6ZSkgeworICAgICAgICB0aGlzLmJhdGNoU2l6ZSA9IGJhdGNoU2l6ZTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQogCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0aGlzLmhCYXNlQ2xpZW50LmJhdGNoTXV0YXRlKG11dGF0aW9ucyk7Ci0gICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpewotICAgICAgICAgICAgdGhpcy5jb2xsZWN0b3IucmVwb3J0RXJyb3IoZSk7Ci0gICAgICAgICAgICB0aGlzLmNvbGxlY3Rvci5mYWlsKHR1cGxlKTsKLSAgICAgICAgICAgIHJldHVybjsKKyAgICBwdWJsaWMgSEJhc2VCb2x0IHdpdGhGbHVzaEludGVydmFsU2VjcyhpbnQgZmx1c2hJbnRlcnZhbFNlY3MpIHsKKyAgICAgICAgdGhpcy5mbHVzaEludGVydmFsU2VjcyA9IGZsdXNoSW50ZXJ2YWxTZWNzOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRDb21wb25lbnRDb25maWd1cmF0aW9uKCkgeworICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbmYgPSBzdXBlci5nZXRDb21wb25lbnRDb25maWd1cmF0aW9uKCk7CisgICAgICAgIGlmIChjb25mID09IG51bGwpIHsKKyAgICAgICAgICAgIGNvbmYgPSBuZXcgQ29uZmlnKCk7CiAgICAgICAgIH0KIAotICAgICAgICB0aGlzLmNvbGxlY3Rvci5hY2sodHVwbGUpOworICAgICAgICBpZiAoY29uZi5jb250YWluc0tleSgidG9wb2xvZ3kubWVzc2FnZS50aW1lb3V0LnNlY3MiKSAmJiBmbHVzaEludGVydmFsU2VjcyA9PSAwKSB7CisgICAgICAgICAgICBJbnRlZ2VyIHRvcG9sb2d5VGltZW91dCA9IEludGVnZXIucGFyc2VJbnQoY29uZi5nZXQoInRvcG9sb2d5Lm1lc3NhZ2UudGltZW91dC5zZWNzIikudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBmbHVzaEludGVydmFsU2VjcyA9IChpbnQpKE1hdGguZmxvb3IodG9wb2xvZ3lUaW1lb3V0IC8gMikpOworICAgICAgICAgICAgTE9HLmRlYnVnKCJTZXR0aW5nIGZsdXNoIGludGVydmFsIHRvIFt7fV0gYmFzZWQgb24gdG9wb2xvZ3kubWVzc2FnZS50aW1lb3V0LnNlY3MiLCBmbHVzaEludGVydmFsU2Vjcyk7CisgICAgICAgIH0KKworICAgICAgICBMT0cuaW5mbygiRW5hYmxpbmcgdGljayB0dXBsZSB3aXRoIGludGVydmFsIFt7fV0iLCBmbHVzaEludGVydmFsU2Vjcyk7CisgICAgICAgIGNvbmYucHV0KENvbmZpZy5UT1BPTE9HWV9USUNLX1RVUExFX0ZSRVFfU0VDUywgZmx1c2hJbnRlcnZhbFNlY3MpOworICAgICAgICByZXR1cm4gY29uZjsKKyAgICB9CisKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoVHVwbGUgdHVwbGUpIHsKKyAgICAgICAgYm9vbGVhbiBmbHVzaCA9IGZhbHNlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKFR1cGxlVXRpbHMuaXNUaWNrKHR1cGxlKSkgeworICAgICAgICAgICAgICAgIExPRy5kZWJ1ZygiVElDSyByZWNlaXZlZCEgY3VycmVudCBiYXRjaCBzdGF0dXMgWyIgKyB0dXBsZUJhdGNoLnNpemUoKSArICIvIiArIGJhdGNoU2l6ZSArICJdIik7CisgICAgICAgICAgICAgICAgZmx1c2ggPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBieXRlW10gcm93S2V5ID0gdGhpcy5tYXBwZXIucm93S2V5KHR1cGxlKTsKKyAgICAgICAgICAgICAgICBDb2x1bW5MaXN0IGNvbHMgPSB0aGlzLm1hcHBlci5jb2x1bW5zKHR1cGxlKTsKKyAgICAgICAgICAgICAgICBMaXN0PE11dGF0aW9uPiBtdXRhdGlvbnMgPSBoQmFzZUNsaWVudC5jb25zdHJ1Y3RNdXRhdGlvblJlcShyb3dLZXksIGNvbHMsIHdyaXRlVG9XQUw/IER1cmFiaWxpdHkuU1lOQ19XQUwgOiBEdXJhYmlsaXR5LlNLSVBfV0FMKTsKKyAgICAgICAgICAgICAgICBiYXRjaE11dGF0aW9ucy5hZGRBbGwobXV0YXRpb25zKTsKKyAgICAgICAgICAgICAgICB0dXBsZUJhdGNoLmFkZCh0dXBsZSk7CisgICAgICAgICAgICAgICAgaWYgKHR1cGxlQmF0Y2guc2l6ZSgpID49IGJhdGNoU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICBmbHVzaCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZmx1c2ggJiYgIXR1cGxlQmF0Y2guaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgdGhpcy5oQmFzZUNsaWVudC5iYXRjaE11dGF0ZShiYXRjaE11dGF0aW9ucyk7CisgICAgICAgICAgICAgICAgTE9HLmRlYnVnKCJhY2tub3dsZWRnaW5nIHR1cGxlcyBhZnRlciBiYXRjaE11dGF0ZSIpOworICAgICAgICAgICAgICAgIGZvcihUdXBsZSB0IDogdHVwbGVCYXRjaCkgeworICAgICAgICAgICAgICAgICAgICBjb2xsZWN0b3IuYWNrKHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0dXBsZUJhdGNoLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgYmF0Y2hNdXRhdGlvbnMuY2xlYXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSl7CisgICAgICAgICAgICB0aGlzLmNvbGxlY3Rvci5yZXBvcnRFcnJvcihlKTsKKyAgICAgICAgICAgIGZvciAoVHVwbGUgdCA6IHR1cGxlQmF0Y2gpIHsKKyAgICAgICAgICAgICAgICBjb2xsZWN0b3IuZmFpbCh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHR1cGxlQmF0Y2guY2xlYXIoKTsKKyAgICAgICAgICAgIGJhdGNoTXV0YXRpb25zLmNsZWFyKCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL2V4dGVybmFsL3N0b3JtLWhkZnMvUkVBRE1FLm1kIGIvZXh0ZXJuYWwvc3Rvcm0taGRmcy9SRUFETUUubWQKaW5kZXggZTFmMmIyOC4uNzgxOWY4MSAxMDA2NDQKLS0tIGEvZXh0ZXJuYWwvc3Rvcm0taGRmcy9SRUFETUUubWQKKysrIGIvZXh0ZXJuYWwvc3Rvcm0taGRmcy9SRUFETUUubWQKQEAgLTI3Nyw2ICsyNzcsMzkgQEAKIH0KIGBgYAogCisjIyBTdXBwb3J0IGZvciBBdnJvIEZpbGVzCisKK1RoZSBgb3JnLmFwYWNoZS5zdG9ybS5oZGZzLmJvbHQuQXZyb0dlbmVyaWNSZWNvcmRCb2x0YCBjbGFzcyBhbGxvd3MgeW91IHRvIHdyaXRlIEF2cm8gb2JqZWN0cyBkaXJlY3RseSB0byBIREZTOgorIAorYGBgamF2YQorICAgICAgICAvLyBzeW5jIHRoZSBmaWxlc3lzdGVtIGFmdGVyIGV2ZXJ5IDFrIHR1cGxlcworICAgICAgICBTeW5jUG9saWN5IHN5bmNQb2xpY3kgPSBuZXcgQ291bnRTeW5jUG9saWN5KDEwMDApOworCisgICAgICAgIC8vIHJvdGF0ZSBmaWxlcyB3aGVuIHRoZXkgcmVhY2ggNU1CCisgICAgICAgIEZpbGVSb3RhdGlvblBvbGljeSByb3RhdGlvblBvbGljeSA9IG5ldyBGaWxlU2l6ZVJvdGF0aW9uUG9saWN5KDUuMGYsIFVuaXRzLk1CKTsKKworICAgICAgICBGaWxlTmFtZUZvcm1hdCBmaWxlTmFtZUZvcm1hdCA9IG5ldyBEZWZhdWx0RmlsZU5hbWVGb3JtYXQoKQorICAgICAgICAgICAgICAgIC53aXRoRXh0ZW5zaW9uKCIuYXZybyIpCisgICAgICAgICAgICAgICAgLndpdGhQYXRoKCIvZGF0YS8iKTsKKworICAgICAgICAvLyBjcmVhdGUgc2VxdWVuY2UgZm9ybWF0IGluc3RhbmNlLgorICAgICAgICBEZWZhdWx0U2VxdWVuY2VGb3JtYXQgZm9ybWF0ID0gbmV3IERlZmF1bHRTZXF1ZW5jZUZvcm1hdCgidGltZXN0YW1wIiwgInNlbnRlbmNlIik7CisKKyAgICAgICAgU2VxdWVuY2VGaWxlQm9sdCBib2x0ID0gbmV3IFNlcXVlbmNlRmlsZUJvbHQoKQorICAgICAgICAgICAgICAgIC53aXRoRnNVcmwoImhkZnM6Ly9sb2NhbGhvc3Q6NTQzMTAiKQorICAgICAgICAgICAgICAgIC53aXRoRmlsZU5hbWVGb3JtYXQoZmlsZU5hbWVGb3JtYXQpCisgICAgICAgICAgICAgICAgLndpdGhTY2hlbWFBc1N0cmluZyhzY2hlbWEpCisgICAgICAgICAgICAgICAgLndpdGhSb3RhdGlvblBvbGljeShyb3RhdGlvblBvbGljeSkKKyAgICAgICAgICAgICAgICAud2l0aFN5bmNQb2xpY3koc3luY1BvbGljeSk7CitgYGAKKworVGhlIHNldHVwIGlzIHZlcnkgc2ltaWxhciB0byB0aGUgYFNlcXVlbmNlRmlsZUJvbHRgIGV4YW1wbGUgYWJvdmUuICBUaGUga2V5IGRpZmZlcmVuY2UgaXMgdGhhdCBpbnN0ZWFkIG9mIHNwZWNpZnlpbmcgYQorYFNlcXVlbmNlRm9ybWF0YCB5b3UgbXVzdCBwcm92aWRlIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGFuIEF2cm8gc2NoZW1hIHRocm91Z2ggdGhlIGB3aXRoU2NoZW1hQXNTdHJpbmcoKWAgbWV0aG9kLgorQW4gYG9yZy5hcGFjaGUuYXZyby5TY2hlbWFgIG9iamVjdCBjYW5ub3QgYmUgZGlyZWN0bHkgcHJvdmlkZWQgc2luY2UgaXQgZG9lcyBub3QgaW1wbGVtZW50IGBTZXJpYWxpemFibGVgLgorCitUaGUgQXZyb0dlbmVyaWNSZWNvcmRCb2x0IGV4cGVjdHMgdG8gcmVjZWl2ZSB0dXBsZXMgY29udGFpbmluZyBhbiBBdnJvIEdlbmVyaWNSZWNvcmQgdGhhdCBjb25mb3JtcyB0byB0aGUgcHJvdmlkZWQKK3NjaGVtYS4KKwogIyMgVHJpZGVudCBBUEkKIHN0b3JtLWhkZnMgYWxzbyBpbmNsdWRlcyBhIFRyaWRlbnQgYHN0YXRlYCBpbXBsZW1lbnRhdGlvbiBmb3Igd3JpdGluZyBkYXRhIHRvIEhERlMsIHdpdGggYW4gQVBJIHRoYXQgY2xvc2VseSBtaXJyb3JzCiB0aGF0IG9mIHRoZSBib2x0cy4KZGlmZiAtLWdpdCBhL2V4dGVybmFsL3N0b3JtLWhkZnMvcG9tLnhtbCBiL2V4dGVybmFsL3N0b3JtLWhkZnMvcG9tLnhtbAppbmRleCAwOWI5ZjY1Li4xNzY1YmU5IDEwMDY0NAotLS0gYS9leHRlcm5hbC9zdG9ybS1oZGZzL3BvbS54bWwKKysrIGIvZXh0ZXJuYWwvc3Rvcm0taGRmcy9wb20ueG1sCkBAIC00MSw2ICs0MSwyOSBAQAogICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3Rvcm0tY29yZTwvYXJ0aWZhY3RJZD4KICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KICAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgICAgICA8ZXhjbHVzaW9ucz4KKyAgICAgICAgICAgICAgICA8IS0tbG9nNGotb3Zlci1zbGY0aiBtdXN0IGJlIGV4Y2x1ZGVkIGZvciBoYWRvb3AtbWluaWNsdXN0ZXIKKyAgICAgICAgICAgICAgICAgICAgc2VlOiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcS8yMDQ2OTAyNi8zNTQyMDkxIC0tPgorICAgICAgICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5zbGY0ajwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bG9nNGotb3Zlci1zbGY0ajwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuc3Rvcm08L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zdG9ybS1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHR5cGU+dGVzdC1qYXI8L3R5cGU+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgICAgICA8ZXhjbHVzaW9ucz4KKyAgICAgICAgICAgICAgICA8IS0tbG9nNGotb3Zlci1zbGY0aiBtdXN0IGJlIGV4Y2x1ZGVkIGZvciBoYWRvb3AtbWluaWNsdXN0ZXIKKyAgICAgICAgICAgICAgICAgICAgc2VlOiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcS8yMDQ2OTAyNi8zNTQyMDkxIC0tPgorICAgICAgICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5zbGY0ajwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bG9nNGotb3Zlci1zbGY0ajwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KICAgICAgICAgPC9kZXBlbmRlbmN5PgogICAgICAgICA8ZGVwZW5kZW5jeT4KICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuaGFkb29wPC9ncm91cElkPgpAQCAtNjksNiArOTIsMTcgQEAKICAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KICAgICAgICAgPC9kZXBlbmRlbmN5PgogICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuaGFkb29wPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+aGFkb29wLW1pbmljbHVzdGVyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtoYWRvb3AudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8ZXhjbHVzaW9ucz4KKyAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc2xmNGo8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnNsZjRqLWxvZzRqMTI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgICAgICA8L2V4Y2x1c2lvbnM+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CiAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ja2l0bzwvZ3JvdXBJZD4KICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1vY2tpdG8tYWxsPC9hcnRpZmFjdElkPgogICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgpAQCAtODEsMTkgKzExNSwyOCBAQAogICAgICAgICA8L2RlcGVuZGVuY3k+CiAgICAgPC9kZXBlbmRlbmNpZXM+CiAgICAgPGJ1aWxkPgotICAgICAgPHBsdWdpbnM+Ci0gICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgPHZlcnNpb24+Mi4yPC92ZXJzaW9uPgotICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgIDxnb2FsPnRlc3QtamFyPC9nb2FsPgotICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICA8L3BsdWdpbj4KLSAgICAgIDwvcGx1Z2lucz4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD50ZXN0LWphcjwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuNS4xPC92ZXJzaW9uPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8c291cmNlPjEuNzwvc291cmNlPgorICAgICAgICAgICAgICAgICAgICA8dGFyZ2V0PjEuNzwvdGFyZ2V0PgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CiAgICAgPC9idWlsZD4KIDwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2V4dGVybmFsL3N0b3JtLWhkZnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0b3JtL2hkZnMvYm9sdC9BYnN0cmFjdEhkZnNCb2x0LmphdmEgYi9leHRlcm5hbC9zdG9ybS1oZGZzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdG9ybS9oZGZzL2JvbHQvQWJzdHJhY3RIZGZzQm9sdC5qYXZhCmluZGV4IGYyNjA1OTguLjExMDhmYmIgMTAwNjQ0Ci0tLSBhL2V4dGVybmFsL3N0b3JtLWhkZnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0b3JtL2hkZnMvYm9sdC9BYnN0cmFjdEhkZnNCb2x0LmphdmEKKysrIGIvZXh0ZXJuYWwvc3Rvcm0taGRmcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3Rvcm0vaGRmcy9ib2x0L0Fic3RyYWN0SGRmc0JvbHQuamF2YQpAQCAtMTcsMTAgKzE3LDE0IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5zdG9ybS5oZGZzLmJvbHQ7CiAKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5Db25maWc7CiBpbXBvcnQgYmFja3R5cGUuc3Rvcm0udGFzay5PdXRwdXRDb2xsZWN0b3I7CiBpbXBvcnQgYmFja3R5cGUuc3Rvcm0udGFzay5Ub3BvbG9neUNvbnRleHQ7CiBpbXBvcnQgYmFja3R5cGUuc3Rvcm0udG9wb2xvZ3kuT3V0cHV0RmllbGRzRGVjbGFyZXI7CiBpbXBvcnQgYmFja3R5cGUuc3Rvcm0udG9wb2xvZ3kuYmFzZS5CYXNlUmljaEJvbHQ7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0udHVwbGUuVHVwbGU7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0udXRpbHMuVHVwbGVVdGlsczsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS51dGlscy5VdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5jb25mLkNvbmZpZ3VyYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuZnMuRmlsZVN5c3RlbTsKIGltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5mcy5QYXRoOwpAQCAtMzUsMTIgKzM5LDE1IEBACiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuVGltZXI7CiBpbXBvcnQgamF2YS51dGlsLlRpbWVyVGFzazsKIAogcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SGRmc0JvbHQgZXh0ZW5kcyBCYXNlUmljaEJvbHQgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihBYnN0cmFjdEhkZnNCb2x0LmNsYXNzKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBJbnRlZ2VyIERFRkFVTFRfUkVUUllfQ09VTlQgPSAzOwogCiAgICAgcHJvdGVjdGVkIEFycmF5TGlzdDxSb3RhdGlvbkFjdGlvbj4gcm90YXRpb25BY3Rpb25zID0gbmV3IEFycmF5TGlzdDxSb3RhdGlvbkFjdGlvbj4oKTsKICAgICBwcml2YXRlIFBhdGggY3VycmVudEZpbGU7CkBAIC01NCw2ICs2MSwxMCBAQAogICAgIHByb3RlY3RlZCBTdHJpbmcgY29uZmlnS2V5OwogICAgIHByb3RlY3RlZCB0cmFuc2llbnQgT2JqZWN0IHdyaXRlTG9jazsKICAgICBwcm90ZWN0ZWQgdHJhbnNpZW50IFRpbWVyIHJvdGF0aW9uVGltZXI7IC8vIG9ubHkgdXNlZCBmb3IgVGltZWRSb3RhdGlvblBvbGljeQorICAgIHByaXZhdGUgTGlzdDxUdXBsZT4gdHVwbGVCYXRjaCA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKyAgICBwcm90ZWN0ZWQgbG9uZyBvZmZzZXQgPSAwOworICAgIHByb3RlY3RlZCBJbnRlZ2VyIGZpbGVSZXRyeUNvdW50ID0gREVGQVVMVF9SRVRSWV9DT1VOVDsKKyAgICBwcm90ZWN0ZWQgSW50ZWdlciB0aWNrVHVwbGVJbnRlcnZhbCA9IDA7CiAKICAgICBwcm90ZWN0ZWQgdHJhbnNpZW50IENvbmZpZ3VyYXRpb24gaGRmc0NvbmZpZzsKIApAQCAtOTksNiArMTEwLDEzIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICAvLyBJZiBpbnRlcnZhbCBpcyBub24temVybyB0aGVuIGl0IGhhcyBhbHJlYWR5IGJlZW4gZXhwbGljaXRseSBzZXQgYW5kIHdlIHNob3VsZCBub3QgZGVmYXVsdCBpdAorICAgICAgICBpZiAoY29uZi5jb250YWluc0tleSgidG9wb2xvZ3kubWVzc2FnZS50aW1lb3V0LnNlY3MiKSAmJiB0aWNrVHVwbGVJbnRlcnZhbCA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICBJbnRlZ2VyIHRvcG9sb2d5VGltZW91dCA9IFV0aWxzLmdldEludChjb25mLmdldChDb25maWcuVE9QT0xPR1lfTUVTU0FHRV9USU1FT1VUX1NFQ1MpKTsKKyAgICAgICAgICAgIHRpY2tUdXBsZUludGVydmFsID0gKGludCkoTWF0aC5mbG9vcih0b3BvbG9neVRpbWVvdXQgLyAyKSk7CisgICAgICAgICAgICBMT0cuZGVidWcoIlNldHRpbmcgdGljayB0dXBsZSBpbnRlcnZhbCB0byBbe31dIGJhc2VkIG9uIHRvcG9sb2d5IHRpbWVvdXQiLCB0aWNrVHVwbGVJbnRlcnZhbCk7CisgICAgICAgIH0KIAogICAgICAgICB0cnl7CiAgICAgICAgICAgICBIZGZzU2VjdXJpdHlVdGlsLmxvZ2luKGNvbmYsIGhkZnNDb25maWcpOwpAQCAtMTI3LDkgKzE0NSwxMTUgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBleGVjdXRlKFR1cGxlIHR1cGxlKSB7CisKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzLndyaXRlTG9jaykgeworICAgICAgICAgICAgYm9vbGVhbiBmb3JjZVN5bmMgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChUdXBsZVV0aWxzLmlzVGljayh0dXBsZSkpIHsKKyAgICAgICAgICAgICAgICBMT0cuZGVidWcoIlRJQ0shIGZvcmNpbmcgYSBmaWxlIHN5c3RlbSBmbHVzaCIpOworICAgICAgICAgICAgICAgIGZvcmNlU3luYyA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlVHVwbGUodHVwbGUpOworICAgICAgICAgICAgICAgICAgICB0dXBsZUJhdGNoLmFkZCh0dXBsZSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvL0lmIHRoZSB3cml0ZSBmYWlsZWQsIHRyeSB0byBzeW5jIGFueXRoaW5nIGFscmVhZHkgd3JpdHRlbgorICAgICAgICAgICAgICAgICAgICBMT0cuaW5mbygiVHVwbGUgZmFpbGVkIHRvIHdyaXRlLCBmb3JjaW5nIGEgZmx1c2ggb2YgZXhpc3RpbmcgZGF0YS4iKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5jb2xsZWN0b3IucmVwb3J0RXJyb3IoZSk7CisgICAgICAgICAgICAgICAgICAgIGZvcmNlU3luYyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuY29sbGVjdG9yLmZhaWwodHVwbGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHRoaXMuc3luY1BvbGljeS5tYXJrKHR1cGxlLCB0aGlzLm9mZnNldCkgfHwgKGZvcmNlU3luYyAmJiB0dXBsZUJhdGNoLnNpemUoKSA+IDApKSB7CisgICAgICAgICAgICAgICAgaW50IGF0dGVtcHRzID0gMDsKKyAgICAgICAgICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBJT0V4Y2VwdGlvbiBsYXN0RXhjZXB0aW9uID0gbnVsbDsKKyAgICAgICAgICAgICAgICAvLyBNYWtlIGV2ZXJ5IGF0dGVtcHQgdG8gc3luYyB0aGUgZGF0YSB3ZSBoYXZlLiAgSWYgaXQgY2FuJ3QgYmUgZG9uZSB0aGVuIGtpbGwgdGhlIGJvbHQgd2l0aAorICAgICAgICAgICAgICAgIC8vIGEgcnVudGltZSBleGNlcHRpb24uICBUaGUgZmlsZXN5c3RlbSBpcyBwcmVzdW1hYmx5IGluIGEgdmVyeSBiYWQgc3RhdGUuCisgICAgICAgICAgICAgICAgd2hpbGUgKHN1Y2Nlc3MgPT0gZmFsc2UgJiYgYXR0ZW1wdHMgPCBmaWxlUmV0cnlDb3VudCkgeworICAgICAgICAgICAgICAgICAgICBhdHRlbXB0cyArPSAxOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3luY1R1cGxlcygpOworICAgICAgICAgICAgICAgICAgICAgICAgTE9HLmRlYnVnKCJEYXRhIHN5bmNlZCB0byBmaWxlc3lzdGVtLiBBY2snaW5nIFt7fV0gdHVwbGVzIiwgdHVwbGVCYXRjaC5zaXplKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChUdXBsZSB0IDogdHVwbGVCYXRjaCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29sbGVjdG9yLmFjayh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHR1cGxlQmF0Y2guY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNQb2xpY3kucmVzZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0cud2FybigiRGF0YSBjb3VsZCBub3QgYmUgc3luY2VkIHRvIGZpbGVzeXN0ZW0gb24gYXR0ZW1wdCBbe31dIiwgYXR0ZW1wdHMpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb2xsZWN0b3IucmVwb3J0RXJyb3IoZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0RXhjZXB0aW9uID0gZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIElmIHVuc3VjY2VzZnVsIGZhaWwgdGhlIHBlbmRpbmcgdHVwbGVzCisgICAgICAgICAgICAgICAgaWYgKHN1Y2Nlc3MgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HLndhcm4oIkRhdGEgY291bGQgbm90IGJlIHN5bmNlZCB0byBmaWxlc3lzdGVtLCBmYWlsaW5nIHRoaXMgYmF0Y2ggb2YgdHVwbGVzIik7CisgICAgICAgICAgICAgICAgICAgIGZvciAoVHVwbGUgdCA6IHR1cGxlQmF0Y2gpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29sbGVjdG9yLmZhaWwodCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdHVwbGVCYXRjaC5jbGVhcigpOworCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJTeW5jIGZhaWxlZCBbIiArIGF0dGVtcHRzICsgIl0gdGltZXMuIiwgbGFzdEV4Y2VwdGlvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZih0aGlzLnJvdGF0aW9uUG9saWN5Lm1hcmsodHVwbGUsIHRoaXMub2Zmc2V0KSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJvdGF0ZU91dHB1dEZpbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3RhdGlvblBvbGljeS5yZXNldCgpOworICAgICAgICAgICAgICAgICAgICB0aGlzLm9mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbGxlY3Rvci5yZXBvcnRFcnJvcihlKTsKKyAgICAgICAgICAgICAgICAgICAgTE9HLndhcm4oIkZpbGUgY291bGQgbm90IGJlIHJvdGF0ZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgLy9BdCB0aGlzIHBvaW50IHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8uICBJbiBhbGwgbGlrZWxpaG9vZCBhbnkgZmlsZXN5c3RlbSBvcGVyYXRpb25zIHdpbGwgZmFpbC4KKyAgICAgICAgICAgICAgICAgICAgLy9UaGUgbmV4dCB0dXBsZSB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgZmFpbCB0byB3cml0ZSBhbmQvb3Igc3luYywgd2hpY2ggZm9yY2UgYSByb3RhdGlvbi4gIFRoYXQKKyAgICAgICAgICAgICAgICAgICAgLy93aWxsIGdpdmUgcm90YXRlQW5kUmVzZXQoKSBhIGNoYW5jZSB0byB3b3JrIHdoaWNoIGluY2x1ZGVzIGNyZWF0aW5nIGEgZnJlc2ggZmlsZSBoYW5kbGUuCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gZ2V0Q29tcG9uZW50Q29uZmlndXJhdGlvbigpIHsKKyAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBjb25mID0gc3VwZXIuZ2V0Q29tcG9uZW50Q29uZmlndXJhdGlvbigpOworICAgICAgICBpZiAoY29uZiA9PSBudWxsKQorICAgICAgICAgICAgY29uZiA9IG5ldyBDb25maWcoKTsKKworICAgICAgICBpZiAodGlja1R1cGxlSW50ZXJ2YWwgPiAwKSB7CisgICAgICAgICAgICBMT0cuaW5mbygiRW5hYmxpbmcgdGljayB0dXBsZSB3aXRoIGludGVydmFsIFt7fV0iLCB0aWNrVHVwbGVJbnRlcnZhbCk7CisgICAgICAgICAgICBjb25mLnB1dChDb25maWcuVE9QT0xPR1lfVElDS19UVVBMRV9GUkVRX1NFQ1MsIHRpY2tUdXBsZUludGVydmFsKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjb25mOworICAgIH0KKworICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGRlY2xhcmVPdXRwdXRGaWVsZHMoT3V0cHV0RmllbGRzRGVjbGFyZXIgb3V0cHV0RmllbGRzRGVjbGFyZXIpIHsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiB3cml0ZXMgYSB0dXBsZSB0byB0aGUgdW5kZXJseWluZyBmaWxlc3lzdGVtIGJ1dCBtYWtlcyBubyBndWFyYW50ZWVzIGFib3V0IHN5bmNpbmcgZGF0YS4KKyAgICAgKgorICAgICAqIHRoaXMub2Zmc2V0IGlzIGFsc28gdXBkYXRlZCB0byByZWZsZWN0IGFkZGl0aW9uYWwgZGF0YSB3cml0dGVuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHVwbGUKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICovCisgICAgYWJzdHJhY3Qgdm9pZCB3cml0ZVR1cGxlKFR1cGxlIHR1cGxlKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBNYWtlIHRoZSBiZXN0IGVmZm9ydCB0byBzeW5jIHdyaXR0ZW4gZGF0YSB0byB0aGUgdW5kZXJseWluZyBmaWxlIHN5c3RlbS4gIENvbmNyZXRlIGNsYXNzZXMgc2hvdWxkIHZlcnkgY2xlYXJseQorICAgICAqIHN0YXRlIHRoZSBmaWxlIHN0YXRlIHRoYXQgc3luYyBndWFyYW50ZWVzLiAgRm9yIGV4YW1wbGUsIEhkZnNCb2x0IGNhbiBtYWtlIGEgbXVjaCBzdHJvbmdlciBndWFyYW50ZWUgdGhhbgorICAgICAqIFNlcXVlbmNlRmlsZUJvbHQuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICovCisgICAgYWJzdHJhY3Qgdm9pZCBzeW5jVHVwbGVzKCkgdGhyb3dzIElPRXhjZXB0aW9uOworCiAgICAgYWJzdHJhY3Qgdm9pZCBjbG9zZU91dHB1dEZpbGUoKSB0aHJvd3MgSU9FeGNlcHRpb247CiAKICAgICBhYnN0cmFjdCBQYXRoIGNyZWF0ZU91dHB1dEZpbGUoKSB0aHJvd3MgSU9FeGNlcHRpb247CmRpZmYgLS1naXQgYS9leHRlcm5hbC9zdG9ybS1oZGZzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdG9ybS9oZGZzL2JvbHQvQXZyb0dlbmVyaWNSZWNvcmRCb2x0LmphdmEgYi9leHRlcm5hbC9zdG9ybS1oZGZzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdG9ybS9oZGZzL2JvbHQvQXZyb0dlbmVyaWNSZWNvcmRCb2x0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJiZmJhOAotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVybmFsL3N0b3JtLWhkZnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0b3JtL2hkZnMvYm9sdC9BdnJvR2VuZXJpY1JlY29yZEJvbHQuamF2YQpAQCAtMCwwICsxLDE0NSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5zdG9ybS5oZGZzLmJvbHQ7CisKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5Db25maWc7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0uQ29uc3RhbnRzOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnRhc2suT3V0cHV0Q29sbGVjdG9yOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnRhc2suVG9wb2xvZ3lDb250ZXh0OworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnR1cGxlLlR1cGxlOworaW1wb3J0IG9yZy5hcGFjaGUuYXZyby5TY2hlbWE7CitpbXBvcnQgb3JnLmFwYWNoZS5hdnJvLmZpbGUuRGF0YUZpbGVXcml0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5hdnJvLmlvLkRhdHVtV3JpdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuYXZyby5nZW5lcmljLkdlbmVyaWNSZWNvcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5hdnJvLmdlbmVyaWMuR2VuZXJpY0RhdHVtV3JpdGVyOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmZzLkZTRGF0YU91dHB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5mcy5GaWxlU3lzdGVtOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmZzLlBhdGg7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaGRmcy5jbGllbnQuSGRmc0RhdGFPdXRwdXRTdHJlYW07CisKK2ltcG9ydCBvcmcuYXBhY2hlLnN0b3JtLmhkZnMuYm9sdC5mb3JtYXQuRmlsZU5hbWVGb3JtYXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdG9ybS5oZGZzLmJvbHQucm90YXRpb24uRmlsZVJvdGF0aW9uUG9saWN5OworaW1wb3J0IG9yZy5hcGFjaGUuc3Rvcm0uaGRmcy5ib2x0LnN5bmMuU3luY1BvbGljeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0b3JtLmhkZnMuY29tbW9uLnJvdGF0aW9uLlJvdGF0aW9uQWN0aW9uOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworcHVibGljIGNsYXNzIEF2cm9HZW5lcmljUmVjb3JkQm9sdCBleHRlbmRzIEFic3RyYWN0SGRmc0JvbHR7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQXZyb0dlbmVyaWNSZWNvcmRCb2x0LmNsYXNzKTsKKworICAgIHByaXZhdGUgdHJhbnNpZW50IEZTRGF0YU91dHB1dFN0cmVhbSBvdXQ7CisgICAgcHJpdmF0ZSBTY2hlbWEgc2NoZW1hOworICAgIHByaXZhdGUgU3RyaW5nIHNjaGVtYUFzU3RyaW5nOworICAgIHByaXZhdGUgRGF0YUZpbGVXcml0ZXI8R2VuZXJpY1JlY29yZD4gYXZyb1dyaXRlcjsKKworICAgIHB1YmxpYyBBdnJvR2VuZXJpY1JlY29yZEJvbHQgd2l0aFNjaGVtYUFzU3RyaW5nKFN0cmluZyBzY2hlbWFBc1N0cmluZykKKyAgICB7CisgICAgICAgIHRoaXMuc2NoZW1hQXNTdHJpbmcgPSBzY2hlbWFBc1N0cmluZzsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIEF2cm9HZW5lcmljUmVjb3JkQm9sdCB3aXRoRnNVcmwoU3RyaW5nIGZzVXJsKXsKKyAgICAgICAgdGhpcy5mc1VybCA9IGZzVXJsOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgQXZyb0dlbmVyaWNSZWNvcmRCb2x0IHdpdGhDb25maWdLZXkoU3RyaW5nIGNvbmZpZ0tleSl7CisgICAgICAgIHRoaXMuY29uZmlnS2V5ID0gY29uZmlnS2V5OworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgQXZyb0dlbmVyaWNSZWNvcmRCb2x0IHdpdGhGaWxlTmFtZUZvcm1hdChGaWxlTmFtZUZvcm1hdCBmaWxlTmFtZUZvcm1hdCl7CisgICAgICAgIHRoaXMuZmlsZU5hbWVGb3JtYXQgPSBmaWxlTmFtZUZvcm1hdDsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIEF2cm9HZW5lcmljUmVjb3JkQm9sdCB3aXRoU3luY1BvbGljeShTeW5jUG9saWN5IHN5bmNQb2xpY3kpeworICAgICAgICB0aGlzLnN5bmNQb2xpY3kgPSBzeW5jUG9saWN5OworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgQXZyb0dlbmVyaWNSZWNvcmRCb2x0IHdpdGhSb3RhdGlvblBvbGljeShGaWxlUm90YXRpb25Qb2xpY3kgcm90YXRpb25Qb2xpY3kpeworICAgICAgICB0aGlzLnJvdGF0aW9uUG9saWN5ID0gcm90YXRpb25Qb2xpY3k7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBBdnJvR2VuZXJpY1JlY29yZEJvbHQgYWRkUm90YXRpb25BY3Rpb24oUm90YXRpb25BY3Rpb24gYWN0aW9uKXsKKyAgICAgICAgdGhpcy5yb3RhdGlvbkFjdGlvbnMuYWRkKGFjdGlvbik7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBBdnJvR2VuZXJpY1JlY29yZEJvbHQgd2l0aFRpY2tUdXBsZUludGVydmFsU2Vjb25kcyhpbnQgaW50ZXJ2YWwpIHsKKyAgICAgICAgdGhpcy50aWNrVHVwbGVJbnRlcnZhbCA9IGludGVydmFsOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICB2b2lkIGRvUHJlcGFyZShNYXAgY29uZiwgVG9wb2xvZ3lDb250ZXh0IHRvcG9sb2d5Q29udGV4dCwgT3V0cHV0Q29sbGVjdG9yIGNvbGxlY3RvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgTE9HLmluZm8oIlByZXBhcmluZyBBdnJvR2VuZXJpY1JlY29yZCBCb2x0Li4uIik7CisgICAgICAgIHRoaXMuZnMgPSBGaWxlU3lzdGVtLmdldChVUkkuY3JlYXRlKHRoaXMuZnNVcmwpLCBoZGZzQ29uZmlnKTsKKyAgICAgICAgU2NoZW1hLlBhcnNlciBwYXJzZXIgPSBuZXcgU2NoZW1hLlBhcnNlcigpOworICAgICAgICB0aGlzLnNjaGVtYSA9IHBhcnNlci5wYXJzZSh0aGlzLnNjaGVtYUFzU3RyaW5nKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICB2b2lkIHdyaXRlVHVwbGUoVHVwbGUgdHVwbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEdlbmVyaWNSZWNvcmQgYXZyb1JlY29yZCA9IChHZW5lcmljUmVjb3JkKSB0dXBsZS5nZXRWYWx1ZSgwKTsKKyAgICAgICAgYXZyb1dyaXRlci5hcHBlbmQoYXZyb1JlY29yZCk7CisgICAgICAgIG9mZnNldCA9IHRoaXMub3V0LmdldFBvcygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHZvaWQgc3luY1R1cGxlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGF2cm9Xcml0ZXIuZmx1c2goKTsKKworICAgICAgICBMT0cuZGVidWcoIkF0dGVtcHRpbmcgdG8gc3luYyBhbGwgZGF0YSB0byBmaWxlc3lzdGVtIik7CisgICAgICAgIGlmICh0aGlzLm91dCBpbnN0YW5jZW9mIEhkZnNEYXRhT3V0cHV0U3RyZWFtKSB7CisgICAgICAgICAgICAoKEhkZnNEYXRhT3V0cHV0U3RyZWFtKSB0aGlzLm91dCkuaHN5bmMoRW51bVNldC5vZihIZGZzRGF0YU91dHB1dFN0cmVhbS5TeW5jRmxhZy5VUERBVEVfTEVOR1RIKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aGlzLm91dC5oc3luYygpOworICAgICAgICB9CisgICAgICAgIHRoaXMuc3luY1BvbGljeS5yZXNldCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNsb3NlT3V0cHV0RmlsZSgpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgYXZyb1dyaXRlci5jbG9zZSgpOworICAgICAgICB0aGlzLm91dC5jbG9zZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIFBhdGggY3JlYXRlT3V0cHV0RmlsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFBhdGggcGF0aCA9IG5ldyBQYXRoKHRoaXMuZmlsZU5hbWVGb3JtYXQuZ2V0UGF0aCgpLCB0aGlzLmZpbGVOYW1lRm9ybWF0LmdldE5hbWUodGhpcy5yb3RhdGlvbiwgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpKTsKKyAgICAgICAgdGhpcy5vdXQgPSB0aGlzLmZzLmNyZWF0ZShwYXRoKTsKKworICAgICAgICAvL0luaXRpYWxpemUgd3JpdGVyCisgICAgICAgIERhdHVtV3JpdGVyPEdlbmVyaWNSZWNvcmQ+IGRhdHVtV3JpdGVyID0gbmV3IEdlbmVyaWNEYXR1bVdyaXRlcjw+KHNjaGVtYSk7CisgICAgICAgIGF2cm9Xcml0ZXIgPSBuZXcgRGF0YUZpbGVXcml0ZXI8PihkYXR1bVdyaXRlcik7CisgICAgICAgIGF2cm9Xcml0ZXIuY3JlYXRlKHRoaXMuc2NoZW1hLCB0aGlzLm91dCk7CisKKyAgICAgICAgcmV0dXJuIHBhdGg7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXh0ZXJuYWwvc3Rvcm0taGRmcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3Rvcm0vaGRmcy9ib2x0L0hkZnNCb2x0LmphdmEgYi9leHRlcm5hbC9zdG9ybS1oZGZzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdG9ybS9oZGZzL2JvbHQvSGRmc0JvbHQuamF2YQppbmRleCBkY2IwOWU3Li4xMDFhYTU3IDEwMDY0NAotLS0gYS9leHRlcm5hbC9zdG9ybS1oZGZzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdG9ybS9oZGZzL2JvbHQvSGRmc0JvbHQuamF2YQorKysgYi9leHRlcm5hbC9zdG9ybS1oZGZzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdG9ybS9oZGZzL2JvbHQvSGRmc0JvbHQuamF2YQpAQCAtNDMsNyArNDMsNiBAQAogCiAgICAgcHJpdmF0ZSB0cmFuc2llbnQgRlNEYXRhT3V0cHV0U3RyZWFtIG91dDsKICAgICBwcml2YXRlIFJlY29yZEZvcm1hdCBmb3JtYXQ7Ci0gICAgcHJpdmF0ZSBsb25nIG9mZnNldCA9IDA7CiAKICAgICBwdWJsaWMgSGRmc0JvbHQgd2l0aEZzVXJsKFN0cmluZyBmc1VybCl7CiAgICAgICAgIHRoaXMuZnNVcmwgPSBmc1VybDsKQEAgLTgwLDYgKzc5LDE2IEBACiAgICAgICAgIHJldHVybiB0aGlzOwogICAgIH0KIAorICAgIHB1YmxpYyBIZGZzQm9sdCB3aXRoVGlja1R1cGxlSW50ZXJ2YWxTZWNvbmRzKGludCBpbnRlcnZhbCkgeworICAgICAgICB0aGlzLnRpY2tUdXBsZUludGVydmFsID0gaW50ZXJ2YWw7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBIZGZzQm9sdCB3aXRoUmV0cnlDb3VudChpbnQgZmlsZVJldHJ5Q291bnQpIHsKKyAgICAgICAgdGhpcy5maWxlUmV0cnlDb3VudCA9IGZpbGVSZXRyeUNvdW50OworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBkb1ByZXBhcmUoTWFwIGNvbmYsIFRvcG9sb2d5Q29udGV4dCB0b3BvbG9neUNvbnRleHQsIE91dHB1dENvbGxlY3RvciBjb2xsZWN0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIExPRy5pbmZvKCJQcmVwYXJpbmcgSERGUyBCb2x0Li4uIik7CkBAIC04NywzNyArOTYsMjMgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKFR1cGxlIHR1cGxlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBieXRlW10gYnl0ZXMgPSB0aGlzLmZvcm1hdC5mb3JtYXQodHVwbGUpOwotICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzLndyaXRlTG9jaykgewotICAgICAgICAgICAgICAgIG91dC53cml0ZShieXRlcyk7Ci0gICAgICAgICAgICAgICAgdGhpcy5vZmZzZXQgKz0gYnl0ZXMubGVuZ3RoOwotCi0gICAgICAgICAgICAgICAgaWYgKHRoaXMuc3luY1BvbGljeS5tYXJrKHR1cGxlLCB0aGlzLm9mZnNldCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub3V0IGluc3RhbmNlb2YgSGRmc0RhdGFPdXRwdXRTdHJlYW0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICgoSGRmc0RhdGFPdXRwdXRTdHJlYW0pIHRoaXMub3V0KS5oc3luYyhFbnVtU2V0Lm9mKFN5bmNGbGFnLlVQREFURV9MRU5HVEgpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3V0LmhzeW5jKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdGhpcy5zeW5jUG9saWN5LnJlc2V0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0aGlzLmNvbGxlY3Rvci5hY2sodHVwbGUpOwotCi0gICAgICAgICAgICBpZih0aGlzLnJvdGF0aW9uUG9saWN5Lm1hcmsodHVwbGUsIHRoaXMub2Zmc2V0KSl7Ci0gICAgICAgICAgICAgICAgcm90YXRlT3V0cHV0RmlsZSgpOyAvLyBzeW5jaHJvbml6ZWQKLSAgICAgICAgICAgICAgICB0aGlzLm9mZnNldCA9IDA7Ci0gICAgICAgICAgICAgICAgdGhpcy5yb3RhdGlvblBvbGljeS5yZXNldCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aGlzLmNvbGxlY3Rvci5yZXBvcnRFcnJvcihlKTsKLSAgICAgICAgICAgIHRoaXMuY29sbGVjdG9yLmZhaWwodHVwbGUpOworICAgIHZvaWQgc3luY1R1cGxlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIExPRy5kZWJ1ZygiQXR0ZW1wdGluZyB0byBzeW5jIGFsbCBkYXRhIHRvIGZpbGVzeXN0ZW0iKTsKKyAgICAgICAgaWYgKHRoaXMub3V0IGluc3RhbmNlb2YgSGRmc0RhdGFPdXRwdXRTdHJlYW0pIHsKKyAgICAgICAgICAgICgoSGRmc0RhdGFPdXRwdXRTdHJlYW0pIHRoaXMub3V0KS5oc3luYyhFbnVtU2V0Lm9mKFN5bmNGbGFnLlVQREFURV9MRU5HVEgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRoaXMub3V0LmhzeW5jKCk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBAT3ZlcnJpZGUKKyAgICB2b2lkIHdyaXRlVHVwbGUoVHVwbGUgdHVwbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGJ5dGVbXSBieXRlcyA9IHRoaXMuZm9ybWF0LmZvcm1hdCh0dXBsZSk7CisgICAgICAgIG91dC53cml0ZShieXRlcyk7CisgICAgICAgIHRoaXMub2Zmc2V0ICs9IGJ5dGVzLmxlbmd0aDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICB2b2lkIGNsb3NlT3V0cHV0RmlsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIHRoaXMub3V0LmNsb3NlKCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvZXh0ZXJuYWwvc3Rvcm0taGRmcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3Rvcm0vaGRmcy9ib2x0L1NlcXVlbmNlRmlsZUJvbHQuamF2YSBiL2V4dGVybmFsL3N0b3JtLWhkZnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0b3JtL2hkZnMvYm9sdC9TZXF1ZW5jZUZpbGVCb2x0LmphdmEKaW5kZXggYmFmNGRmMC4uZmNkMGQyOSAxMDA2NDQKLS0tIGEvZXh0ZXJuYWwvc3Rvcm0taGRmcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3Rvcm0vaGRmcy9ib2x0L1NlcXVlbmNlRmlsZUJvbHQuamF2YQorKysgYi9leHRlcm5hbC9zdG9ybS1oZGZzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdG9ybS9oZGZzL2JvbHQvU2VxdWVuY2VGaWxlQm9sdC5qYXZhCkBAIC04OSwxMSArODksMjEgQEAKICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgfQogCisgICAgcHVibGljIFNlcXVlbmNlRmlsZUJvbHQgd2l0aFRpY2tUdXBsZUludGVydmFsU2Vjb25kcyhpbnQgaW50ZXJ2YWwpIHsKKyAgICAgICAgdGhpcy50aWNrVHVwbGVJbnRlcnZhbCA9IGludGVydmFsOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKICAgICBwdWJsaWMgU2VxdWVuY2VGaWxlQm9sdCBhZGRSb3RhdGlvbkFjdGlvbihSb3RhdGlvbkFjdGlvbiBhY3Rpb24pewogICAgICAgICB0aGlzLnJvdGF0aW9uQWN0aW9ucy5hZGQoYWN0aW9uKTsKICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgfQogCisgICAgcHVibGljIFNlcXVlbmNlRmlsZUJvbHQgd2l0aFJldHJ5Q291bnQoaW50IGZpbGVSZXRyeUNvdW50KSB7CisgICAgICAgIHRoaXMuZmlsZVJldHJ5Q291bnQgPSBmaWxlUmV0cnlDb3VudDsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZG9QcmVwYXJlKE1hcCBjb25mLCBUb3BvbG9neUNvbnRleHQgdG9wb2xvZ3lDb250ZXh0LCBPdXRwdXRDb2xsZWN0b3IgY29sbGVjdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBMT0cuaW5mbygiUHJlcGFyaW5nIFNlcXVlbmNlIEZpbGUgQm9sdC4uLiIpOwpAQCAtMTA0LDI5ICsxMTQsMTUgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKFR1cGxlIHR1cGxlKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBsb25nIG9mZnNldDsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcy53cml0ZUxvY2spIHsKLSAgICAgICAgICAgICAgICB0aGlzLndyaXRlci5hcHBlbmQodGhpcy5mb3JtYXQua2V5KHR1cGxlKSwgdGhpcy5mb3JtYXQudmFsdWUodHVwbGUpKTsKLSAgICAgICAgICAgICAgICBvZmZzZXQgPSB0aGlzLndyaXRlci5nZXRMZW5ndGgoKTsKKyAgICB2b2lkIHN5bmNUdXBsZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBMT0cuZGVidWcoIkF0dGVtcHRpbmcgdG8gc3luYyBhbGwgZGF0YSB0byBmaWxlc3lzdGVtIik7CisgICAgICAgIHRoaXMud3JpdGVyLmhzeW5jKCk7CisgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKHRoaXMuc3luY1BvbGljeS5tYXJrKHR1cGxlLCBvZmZzZXQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMud3JpdGVyLmhzeW5jKCk7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMuc3luY1BvbGljeS5yZXNldCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdGhpcy5jb2xsZWN0b3IuYWNrKHR1cGxlKTsKLSAgICAgICAgICAgIGlmICh0aGlzLnJvdGF0aW9uUG9saWN5Lm1hcmsodHVwbGUsIG9mZnNldCkpIHsKLSAgICAgICAgICAgICAgICByb3RhdGVPdXRwdXRGaWxlKCk7IC8vIHN5bmNocm9uaXplZAotICAgICAgICAgICAgICAgIHRoaXMucm90YXRpb25Qb2xpY3kucmVzZXQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhpcy5jb2xsZWN0b3IucmVwb3J0RXJyb3IoZSk7Ci0gICAgICAgICAgICB0aGlzLmNvbGxlY3Rvci5mYWlsKHR1cGxlKTsKLSAgICAgICAgfQotCisgICAgQE92ZXJyaWRlCisgICAgdm9pZCB3cml0ZVR1cGxlKFR1cGxlIHR1cGxlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0aGlzLndyaXRlci5hcHBlbmQodGhpcy5mb3JtYXQua2V5KHR1cGxlKSwgdGhpcy5mb3JtYXQudmFsdWUodHVwbGUpKTsKKyAgICAgICAgdGhpcy5vZmZzZXQgPSB0aGlzLndyaXRlci5nZXRMZW5ndGgoKTsKICAgICB9CiAKICAgICBQYXRoIGNyZWF0ZU91dHB1dEZpbGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewpAQCAtMTQ0LDYgKzE0MCw0IEBACiAgICAgdm9pZCBjbG9zZU91dHB1dEZpbGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICB0aGlzLndyaXRlci5jbG9zZSgpOwogICAgIH0KLQotCiB9CmRpZmYgLS1naXQgYS9leHRlcm5hbC9zdG9ybS1oZGZzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdG9ybS9oZGZzL2hhL2NvZGVkaXN0cmlidXRvci9IREZTQ29kZURpc3RyaWJ1dG9yLmphdmEgYi9leHRlcm5hbC9zdG9ybS1oZGZzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdG9ybS9oZGZzL2hhL2NvZGVkaXN0cmlidXRvci9IREZTQ29kZURpc3RyaWJ1dG9yLmphdmEKaW5kZXggZjY3MzZiZC4uMWUzODA1MSAxMDA2NDQKLS0tIGEvZXh0ZXJuYWwvc3Rvcm0taGRmcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3Rvcm0vaGRmcy9oYS9jb2RlZGlzdHJpYnV0b3IvSERGU0NvZGVEaXN0cmlidXRvci5qYXZhCisrKyBiL2V4dGVybmFsL3N0b3JtLWhkZnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0b3JtL2hkZnMvaGEvY29kZWRpc3RyaWJ1dG9yL0hERlNDb2RlRGlzdHJpYnV0b3IuamF2YQpAQCAtMSwzICsxLDIwIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLwogcGFja2FnZSBvcmcuYXBhY2hlLnN0b3JtLmhkZnMuaGEuY29kZWRpc3RyaWJ1dG9yOwogCiBpbXBvcnQgYmFja3R5cGUuc3Rvcm0uY29kZWRpc3RyaWJ1dG9yLklDb2RlRGlzdHJpYnV0b3I7CmRpZmYgLS1naXQgYS9leHRlcm5hbC9zdG9ybS1oZGZzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9zdG9ybS9oZGZzL2JvbHQvQXZyb0dlbmVyaWNSZWNvcmRCb2x0VGVzdC5qYXZhIGIvZXh0ZXJuYWwvc3Rvcm0taGRmcy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvc3Rvcm0vaGRmcy9ib2x0L0F2cm9HZW5lcmljUmVjb3JkQm9sdFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2JhMjdhCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZXJuYWwvc3Rvcm0taGRmcy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvc3Rvcm0vaGRmcy9ib2x0L0F2cm9HZW5lcmljUmVjb3JkQm9sdFRlc3QuamF2YQpAQCAtMCwwICsxLDIyMCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5zdG9ybS5oZGZzLmJvbHQ7CisKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5Db25maWc7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0udGFzay5HZW5lcmFsVG9wb2xvZ3lDb250ZXh0OworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnRhc2suT3V0cHV0Q29sbGVjdG9yOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnRhc2suVG9wb2xvZ3lDb250ZXh0OworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnRvcG9sb2d5LlRvcG9sb2d5QnVpbGRlcjsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS50dXBsZS5GaWVsZHM7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0udHVwbGUuVHVwbGU7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0udHVwbGUuVHVwbGVJbXBsOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnR1cGxlLlZhbHVlczsKK2ltcG9ydCBvcmcuYXBhY2hlLmF2cm8uU2NoZW1hOworaW1wb3J0IG9yZy5hcGFjaGUuYXZyby5nZW5lcmljLkdlbmVyaWNEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUuYXZyby5nZW5lcmljLkdlbmVyaWNEYXR1bVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmF2cm8uZ2VuZXJpYy5HZW5lcmljUmVjb3JkOworaW1wb3J0IG9yZy5hcGFjaGUuYXZyby5pby5EYXR1bVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmF2cm8uZmlsZS5EYXRhRmlsZVJlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0b3JtLmhkZnMuYm9sdC5mb3JtYXQuRGVmYXVsdEZpbGVOYW1lRm9ybWF0OworaW1wb3J0IG9yZy5hcGFjaGUuc3Rvcm0uaGRmcy5ib2x0LmZvcm1hdC5GaWxlTmFtZUZvcm1hdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0b3JtLmhkZnMuYm9sdC5yb3RhdGlvbi5GaWxlUm90YXRpb25Qb2xpY3k7CitpbXBvcnQgb3JnLmFwYWNoZS5zdG9ybS5oZGZzLmJvbHQucm90YXRpb24uRmlsZVNpemVSb3RhdGlvblBvbGljeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0b3JtLmhkZnMuYm9sdC5zeW5jLkNvdW50U3luY1BvbGljeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0b3JtLmhkZnMuYm9sdC5zeW5jLlN5bmNQb2xpY3k7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKKworaW1wb3J0IG9yZy5tb2NraXRvLk1vY2s7CitpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0b0Fubm90YXRpb25zOworCitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuY29uZi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmhkZnMuTWluaURGU0NsdXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuZnMuRmlsZVN0YXR1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5mcy5GaWxlVXRpbDsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5mcy5QYXRoOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmhkZnMuRGlzdHJpYnV0ZWRGaWxlU3lzdGVtOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmZzLkZTRGF0YUlucHV0U3RyZWFtOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCitwdWJsaWMgY2xhc3MgQXZyb0dlbmVyaWNSZWNvcmRCb2x0VGVzdCB7CisKKyAgICBwcml2YXRlIFN0cmluZyBoZGZzVVJJOworICAgIHByaXZhdGUgRGlzdHJpYnV0ZWRGaWxlU3lzdGVtIGZzOworICAgIHByaXZhdGUgTWluaURGU0NsdXN0ZXIgaGRmc0NsdXN0ZXI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHRlc3RSb290ID0gIi91bml0dGVzdCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2NoZW1hIHNjaGVtYTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUdXBsZSB0dXBsZTE7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHVwbGUgdHVwbGUyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyB1c2VyU2NoZW1hID0gIntcInR5cGVcIjpcInJlY29yZFwiLCIgKworICAgICAgICAgICAgIlwibmFtZVwiOlwibXlyZWNvcmRcIiwiICsKKyAgICAgICAgICAgICJcImZpZWxkc1wiOlt7XCJuYW1lXCI6XCJmb28xXCIsXCJ0eXBlXCI6XCJzdHJpbmdcIn0sIiArCisgICAgICAgICAgICAieyBcIm5hbWVcIjpcImludDFcIiwgXCJ0eXBlXCI6XCJpbnRcIiB9XX0iOworCisgICAgc3RhdGljIHsKKworICAgICAgICBTY2hlbWEuUGFyc2VyIHBhcnNlciA9IG5ldyBTY2hlbWEuUGFyc2VyKCk7CisgICAgICAgIHNjaGVtYSA9IHBhcnNlci5wYXJzZSh1c2VyU2NoZW1hKTsKKworICAgICAgICBHZW5lcmljUmVjb3JkIHJlY29yZDEgPSBuZXcgR2VuZXJpY0RhdGEuUmVjb3JkKHNjaGVtYSk7CisgICAgICAgIHJlY29yZDEucHV0KCJmb28xIiwgImJhcjEiKTsKKyAgICAgICAgcmVjb3JkMS5wdXQoImludDEiLCAxKTsKKyAgICAgICAgdHVwbGUxID0gZ2VuZXJhdGVUZXN0VHVwbGUocmVjb3JkMSk7CisKKyAgICAgICAgR2VuZXJpY1JlY29yZCByZWNvcmQyID0gbmV3IEdlbmVyaWNEYXRhLlJlY29yZChzY2hlbWEpOworICAgICAgICByZWNvcmQyLnB1dCgiZm9vMSIsICJiYXIyIik7CisgICAgICAgIHJlY29yZDIucHV0KCJpbnQxIiwgMik7CisgICAgICAgIHR1cGxlMiA9IGdlbmVyYXRlVGVzdFR1cGxlKHJlY29yZDIpOworICAgIH0KKworICAgIEBNb2NrIHByaXZhdGUgT3V0cHV0Q29sbGVjdG9yIGNvbGxlY3RvcjsKKyAgICBATW9jayBwcml2YXRlIFRvcG9sb2d5Q29udGV4dCB0b3BvbG9neUNvbnRleHQ7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0dXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTW9ja2l0b0Fubm90YXRpb25zLmluaXRNb2Nrcyh0aGlzKTsKKyAgICAgICAgQ29uZmlndXJhdGlvbiBjb25mID0gbmV3IENvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgY29uZi5zZXQoImZzLnRyYXNoLmludGVydmFsIiwgIjEwIik7CisgICAgICAgIGNvbmYuc2V0Qm9vbGVhbigiZGZzLnBlcm1pc3Npb25zIiwgdHJ1ZSk7CisgICAgICAgIEZpbGUgYmFzZURpciA9IG5ldyBGaWxlKCIuL3RhcmdldC9oZGZzLyIpLmdldEFic29sdXRlRmlsZSgpOworICAgICAgICBGaWxlVXRpbC5mdWxseURlbGV0ZShiYXNlRGlyKTsKKyAgICAgICAgY29uZi5zZXQoTWluaURGU0NsdXN0ZXIuSERGU19NSU5JREZTX0JBU0VESVIsIGJhc2VEaXIuZ2V0QWJzb2x1dGVQYXRoKCkpOworCisgICAgICAgIE1pbmlERlNDbHVzdGVyLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBNaW5pREZTQ2x1c3Rlci5CdWlsZGVyKGNvbmYpOworICAgICAgICBoZGZzQ2x1c3RlciA9IGJ1aWxkZXIuYnVpbGQoKTsKKyAgICAgICAgZnMgPSBoZGZzQ2x1c3Rlci5nZXRGaWxlU3lzdGVtKCk7CisgICAgICAgIGhkZnNVUkkgPSBmcy5nZXRVcmkoKSArICIvIjsKKyAgICB9CisKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCBzaHV0RG93bigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZzLmNsb3NlKCk7CisgICAgICAgIGhkZnNDbHVzdGVyLnNodXRkb3duKCk7CisgICAgfQorCisgICAgQFRlc3QgcHVibGljIHZvaWQgbXVsdGlwbGVUdXBsZXNPbmVGaWxlKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBBdnJvR2VuZXJpY1JlY29yZEJvbHQgYm9sdCA9IG1ha2VBdnJvQm9sdChoZGZzVVJJLCAxLCAxZiwgdXNlclNjaGVtYSk7CisKKyAgICAgICAgYm9sdC5wcmVwYXJlKG5ldyBDb25maWcoKSwgdG9wb2xvZ3lDb250ZXh0LCBjb2xsZWN0b3IpOworICAgICAgICBib2x0LmV4ZWN1dGUodHVwbGUxKTsKKyAgICAgICAgYm9sdC5leGVjdXRlKHR1cGxlMik7CisgICAgICAgIGJvbHQuZXhlY3V0ZSh0dXBsZTEpOworICAgICAgICBib2x0LmV4ZWN1dGUodHVwbGUyKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIGNvdW50Tm9uWmVyb0xlbmd0aEZpbGVzKHRlc3RSb290KSk7CisgICAgICAgIHZlcmlmeUFsbEF2cm9GaWxlcyh0ZXN0Um9vdCwgc2NoZW1hKTsKKyAgICB9CisKKyAgICBAVGVzdCBwdWJsaWMgdm9pZCBtdWx0aXBsZVR1cGxlc011dGxpcGxlc0ZpbGVzKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBBdnJvR2VuZXJpY1JlY29yZEJvbHQgYm9sdCA9IG1ha2VBdnJvQm9sdChoZGZzVVJJLCAxLCAuMDAwMWYsIHVzZXJTY2hlbWEpOworCisgICAgICAgIGJvbHQucHJlcGFyZShuZXcgQ29uZmlnKCksIHRvcG9sb2d5Q29udGV4dCwgY29sbGVjdG9yKTsKKyAgICAgICAgYm9sdC5leGVjdXRlKHR1cGxlMSk7CisgICAgICAgIGJvbHQuZXhlY3V0ZSh0dXBsZTIpOworICAgICAgICBib2x0LmV4ZWN1dGUodHVwbGUxKTsKKyAgICAgICAgYm9sdC5leGVjdXRlKHR1cGxlMik7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg0LCBjb3VudE5vblplcm9MZW5ndGhGaWxlcyh0ZXN0Um9vdCkpOworICAgICAgICB2ZXJpZnlBbGxBdnJvRmlsZXModGVzdFJvb3QsIHNjaGVtYSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBBdnJvR2VuZXJpY1JlY29yZEJvbHQgbWFrZUF2cm9Cb2x0KFN0cmluZyBuYW1lTm9kZUFkZHIsIGludCBjb3VudFN5bmMsIGZsb2F0IHJvdGF0aW9uU2l6ZU1CLCBTdHJpbmcgc2NoZW1hQXNTdHJpbmcpIHsKKworICAgICAgICBTeW5jUG9saWN5IGZpZWxkc1N5bmNQb2xpY3kgPSBuZXcgQ291bnRTeW5jUG9saWN5KGNvdW50U3luYyk7CisKKyAgICAgICAgRmlsZU5hbWVGb3JtYXQgZmllbGRzRmlsZU5hbWVGb3JtYXQgPSBuZXcgRGVmYXVsdEZpbGVOYW1lRm9ybWF0KCkud2l0aFBhdGgodGVzdFJvb3QpOworCisgICAgICAgIEZpbGVSb3RhdGlvblBvbGljeSByb3RhdGlvblBvbGljeSA9CisgICAgICAgICAgICAgICAgbmV3IEZpbGVTaXplUm90YXRpb25Qb2xpY3kocm90YXRpb25TaXplTUIsIEZpbGVTaXplUm90YXRpb25Qb2xpY3kuVW5pdHMuTUIpOworCisgICAgICAgIHJldHVybiBuZXcgQXZyb0dlbmVyaWNSZWNvcmRCb2x0KCkKKyAgICAgICAgICAgICAgICAud2l0aEZzVXJsKG5hbWVOb2RlQWRkcikKKyAgICAgICAgICAgICAgICAud2l0aEZpbGVOYW1lRm9ybWF0KGZpZWxkc0ZpbGVOYW1lRm9ybWF0KQorICAgICAgICAgICAgICAgIC53aXRoU2NoZW1hQXNTdHJpbmcoc2NoZW1hQXNTdHJpbmcpCisgICAgICAgICAgICAgICAgLndpdGhSb3RhdGlvblBvbGljeShyb3RhdGlvblBvbGljeSkKKyAgICAgICAgICAgICAgICAud2l0aFN5bmNQb2xpY3koZmllbGRzU3luY1BvbGljeSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgVHVwbGUgZ2VuZXJhdGVUZXN0VHVwbGUoR2VuZXJpY1JlY29yZCByZWNvcmQpIHsKKyAgICAgICAgVG9wb2xvZ3lCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgVG9wb2xvZ3lCdWlsZGVyKCk7CisgICAgICAgIEdlbmVyYWxUb3BvbG9neUNvbnRleHQgdG9wb2xvZ3lDb250ZXh0ID0gbmV3IEdlbmVyYWxUb3BvbG9neUNvbnRleHQoYnVpbGRlci5jcmVhdGVUb3BvbG9neSgpLAorICAgICAgICAgICAgICAgIG5ldyBDb25maWcoKSwgbmV3IEhhc2hNYXAoKSwgbmV3IEhhc2hNYXAoKSwgbmV3IEhhc2hNYXAoKSwgIiIpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIEZpZWxkcyBnZXRDb21wb25lbnRPdXRwdXRGaWVsZHMoU3RyaW5nIGNvbXBvbmVudElkLCBTdHJpbmcgc3RyZWFtSWQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZpZWxkcygicmVjb3JkIik7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHJldHVybiBuZXcgVHVwbGVJbXBsKHRvcG9sb2d5Q29udGV4dCwgbmV3IFZhbHVlcyhyZWNvcmQpLCAxLCAiIik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZlcmlmeUFsbEF2cm9GaWxlcyhTdHJpbmcgcGF0aCwgU2NoZW1hIHNjaGVtYSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgUGF0aCBwID0gbmV3IFBhdGgocGF0aCk7CisKKyAgICAgICAgZm9yIChGaWxlU3RhdHVzIGZpbGUgOiBmcy5saXN0U3RhdHVzKHApKSB7CisgICAgICAgICAgICBpZiAoZmlsZS5nZXRMZW4oKSA+IDApIHsKKyAgICAgICAgICAgICAgICBmaWxlSXNHb29kQXZybyhmaWxlLmdldFBhdGgoKSwgc2NoZW1hKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgaW50IGNvdW50Tm9uWmVyb0xlbmd0aEZpbGVzKFN0cmluZyBwYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBQYXRoIHAgPSBuZXcgUGF0aChwYXRoKTsKKyAgICAgICAgaW50IG5vblplcm8gPSAwOworCisgICAgICAgIGZvciAoRmlsZVN0YXR1cyBmaWxlIDogZnMubGlzdFN0YXR1cyhwKSkgeworICAgICAgICAgICAgaWYgKGZpbGUuZ2V0TGVuKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgbm9uWmVybysrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5vblplcm87CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGZpbGVJc0dvb2RBdnJvIChQYXRoIHBhdGgsIFNjaGVtYSBzY2hlbWEpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIERhdHVtUmVhZGVyPEdlbmVyaWNSZWNvcmQ+IGRhdHVtUmVhZGVyID0gbmV3IEdlbmVyaWNEYXR1bVJlYWRlcjw+KHNjaGVtYSk7CisgICAgICAgIEZTRGF0YUlucHV0U3RyZWFtIGluID0gZnMub3BlbihwYXRoLCAwKTsKKyAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSgidGFyZ2V0L0ZPTy5hdnJvIik7CisKKyAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzEwMF07CisgICAgICAgIGludCBieXRlc1JlYWQ7CisgICAgICAgIHdoaWxlICgoYnl0ZXNSZWFkID0gaW4ucmVhZChidWZmZXIpKSA+IDApIHsKKyAgICAgICAgICAgIG91dC53cml0ZShidWZmZXIsIDAsIGJ5dGVzUmVhZCk7CisgICAgICAgIH0KKyAgICAgICAgb3V0LmNsb3NlKCk7CisKKyAgICAgICAgamF2YS5pby5GaWxlIGZpbGUgPSBuZXcgRmlsZSgidGFyZ2V0L0ZPTy5hdnJvIik7CisKKyAgICAgICAgRGF0YUZpbGVSZWFkZXI8R2VuZXJpY1JlY29yZD4gZGF0YUZpbGVSZWFkZXIgPSBuZXcgRGF0YUZpbGVSZWFkZXI8PihmaWxlLCBkYXR1bVJlYWRlcik7CisgICAgICAgIEdlbmVyaWNSZWNvcmQgdXNlciA9IG51bGw7CisgICAgICAgIHdoaWxlIChkYXRhRmlsZVJlYWRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIHVzZXIgPSBkYXRhRmlsZVJlYWRlci5uZXh0KHVzZXIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHVzZXIpOworICAgICAgICB9CisKKyAgICAgICAgZmlsZS5kZWxldGUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leHRlcm5hbC9zdG9ybS1oZGZzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9zdG9ybS9oZGZzL2JvbHQvVGVzdEhkZnNCb2x0LmphdmEgYi9leHRlcm5hbC9zdG9ybS1oZGZzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9zdG9ybS9oZGZzL2JvbHQvVGVzdEhkZnNCb2x0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYyMDE0YwotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVybmFsL3N0b3JtLWhkZnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3N0b3JtL2hkZnMvYm9sdC9UZXN0SGRmc0JvbHQuamF2YQpAQCAtMCwwICsxLDI1OCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5zdG9ybS5oZGZzLmJvbHQ7CisKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5Db25maWc7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0udGFzay5HZW5lcmFsVG9wb2xvZ3lDb250ZXh0OworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnRhc2suT3V0cHV0Q29sbGVjdG9yOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnRhc2suVG9wb2xvZ3lDb250ZXh0OworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnRvcG9sb2d5LlRvcG9sb2d5QnVpbGRlcjsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS50dXBsZS5GaWVsZHM7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0udHVwbGUuVHVwbGU7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0udHVwbGUuVHVwbGVJbXBsOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnR1cGxlLlZhbHVlczsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS51dGlscy5Nb2NrVHVwbGVIZWxwZXJzOworaW1wb3J0IG9yZy5hcGFjaGUuc3Rvcm0uaGRmcy5ib2x0LmZvcm1hdC5EZWZhdWx0RmlsZU5hbWVGb3JtYXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdG9ybS5oZGZzLmJvbHQuZm9ybWF0LkRlbGltaXRlZFJlY29yZEZvcm1hdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0b3JtLmhkZnMuYm9sdC5mb3JtYXQuRmlsZU5hbWVGb3JtYXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdG9ybS5oZGZzLmJvbHQuZm9ybWF0LlJlY29yZEZvcm1hdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0b3JtLmhkZnMuYm9sdC5yb3RhdGlvbi5GaWxlUm90YXRpb25Qb2xpY3k7CitpbXBvcnQgb3JnLmFwYWNoZS5zdG9ybS5oZGZzLmJvbHQucm90YXRpb24uRmlsZVNpemVSb3RhdGlvblBvbGljeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0b3JtLmhkZnMuYm9sdC5zeW5jLkNvdW50U3luY1BvbGljeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0b3JtLmhkZnMuYm9sdC5zeW5jLlN5bmNQb2xpY3k7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKKworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5FeHBlY3RlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcubW9ja2l0by5Nb2NrOworaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG9Bbm5vdGF0aW9uczsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by4qOworCitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuY29uZi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmhkZnMuTWluaURGU0NsdXN0ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuZnMuRmlsZVN0YXR1czsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5mcy5GaWxlU3lzdGVtOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmZzLkZpbGVVdGlsOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmZzLlBhdGg7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaGRmcy5EaXN0cmlidXRlZEZpbGVTeXN0ZW07CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaGRmcy5wcm90b2NvbC5IZGZzQ29uc3RhbnRzLlNhZmVNb2RlQWN0aW9uOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKK3B1YmxpYyBjbGFzcyBUZXN0SGRmc0JvbHQgeworCisgICAgcHJpdmF0ZSBTdHJpbmcgaGRmc1VSSTsKKyAgICBwcml2YXRlIERpc3RyaWJ1dGVkRmlsZVN5c3RlbSBmczsKKyAgICBwcml2YXRlIE1pbmlERlNDbHVzdGVyIGhkZnNDbHVzdGVyOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyB0ZXN0Um9vdCA9ICIvdW5pdHRlc3QiOworICAgIFR1cGxlIHR1cGxlMSA9IGdlbmVyYXRlVGVzdFR1cGxlKDEsICJGaXJzdCBUdXBsZSIsICJTRk8iLCAiQ0EiKTsKKyAgICBUdXBsZSB0dXBsZTIgPSBnZW5lcmF0ZVRlc3RUdXBsZSgxLCAiU2Vjb25kIFR1cGxlIiwgIlNKTyIsICJDQSIpOworCisgICAgQE1vY2sgcHJpdmF0ZSBPdXRwdXRDb2xsZWN0b3IgY29sbGVjdG9yOworICAgIEBNb2NrIHByaXZhdGUgVG9wb2xvZ3lDb250ZXh0IHRvcG9sb2d5Q29udGV4dDsKKyAgICBAUnVsZSBwdWJsaWMgRXhwZWN0ZWRFeGNlcHRpb24gdGhyb3duID0gRXhwZWN0ZWRFeGNlcHRpb24ubm9uZSgpOworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldHVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIE1vY2tpdG9Bbm5vdGF0aW9ucy5pbml0TW9ja3ModGhpcyk7CisgICAgICAgIENvbmZpZ3VyYXRpb24gY29uZiA9IG5ldyBDb25maWd1cmF0aW9uKCk7CisgICAgICAgIGNvbmYuc2V0KCJmcy50cmFzaC5pbnRlcnZhbCIsICIxMCIpOworICAgICAgICBjb25mLnNldEJvb2xlYW4oImRmcy5wZXJtaXNzaW9ucyIsIHRydWUpOworICAgICAgICBGaWxlIGJhc2VEaXIgPSBuZXcgRmlsZSgiLi90YXJnZXQvaGRmcy8iKS5nZXRBYnNvbHV0ZUZpbGUoKTsKKyAgICAgICAgRmlsZVV0aWwuZnVsbHlEZWxldGUoYmFzZURpcik7CisgICAgICAgIGNvbmYuc2V0KE1pbmlERlNDbHVzdGVyLkhERlNfTUlOSURGU19CQVNFRElSLCBiYXNlRGlyLmdldEFic29sdXRlUGF0aCgpKTsKKworICAgICAgICBNaW5pREZTQ2x1c3Rlci5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgTWluaURGU0NsdXN0ZXIuQnVpbGRlcihjb25mKTsKKyAgICAgICAgaGRmc0NsdXN0ZXIgPSBidWlsZGVyLmJ1aWxkKCk7CisgICAgICAgIGZzID0gaGRmc0NsdXN0ZXIuZ2V0RmlsZVN5c3RlbSgpOworICAgICAgICBoZGZzVVJJID0gImhkZnM6Ly9sb2NhbGhvc3Q6IiArIGhkZnNDbHVzdGVyLmdldE5hbWVOb2RlUG9ydCgpICsgIi8iOworICAgIH0KKworICAgIEBBZnRlcgorICAgIHB1YmxpYyB2b2lkIHNodXREb3duKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZnMuY2xvc2UoKTsKKyAgICAgICAgaGRmc0NsdXN0ZXIuc2h1dGRvd24oKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUd29UdXBsZXNUd29GaWxlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEhkZnNCb2x0IGJvbHQgPSBtYWtlSGRmc0JvbHQoaGRmc1VSSSwgMSwgLjAwMDAxZik7CisKKyAgICAgICAgYm9sdC5wcmVwYXJlKG5ldyBDb25maWcoKSwgdG9wb2xvZ3lDb250ZXh0LCBjb2xsZWN0b3IpOworICAgICAgICBib2x0LmV4ZWN1dGUodHVwbGUxKTsKKyAgICAgICAgYm9sdC5leGVjdXRlKHR1cGxlMik7CisKKyAgICAgICAgdmVyaWZ5KGNvbGxlY3RvcikuYWNrKHR1cGxlMSk7CisgICAgICAgIHZlcmlmeShjb2xsZWN0b3IpLmFjayh0dXBsZTIpOworCisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgY291bnROb25aZXJvTGVuZ3RoRmlsZXModGVzdFJvb3QpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUd29UdXBsZXNPbmVGaWxlKCkgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBIZGZzQm9sdCBib2x0ID0gbWFrZUhkZnNCb2x0KGhkZnNVUkksIDIsIDEwMDAwZik7CisgICAgICAgIGJvbHQucHJlcGFyZShuZXcgQ29uZmlnKCksIHRvcG9sb2d5Q29udGV4dCwgY29sbGVjdG9yKTsKKyAgICAgICAgYm9sdC5leGVjdXRlKHR1cGxlMSk7CisKKyAgICAgICAgdmVyaWZ5WmVyb0ludGVyYWN0aW9ucyhjb2xsZWN0b3IpOworCisgICAgICAgIGJvbHQuZXhlY3V0ZSh0dXBsZTIpOworICAgICAgICB2ZXJpZnkoY29sbGVjdG9yKS5hY2sodHVwbGUxKTsKKyAgICAgICAgdmVyaWZ5KGNvbGxlY3RvcikuYWNrKHR1cGxlMik7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBjb3VudE5vblplcm9MZW5ndGhGaWxlcyh0ZXN0Um9vdCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZhaWxlZFN5bmMoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIEhkZnNCb2x0IGJvbHQgPSBtYWtlSGRmc0JvbHQoaGRmc1VSSSwgMSwgLjAwMDAxZik7CisgICAgICAgIGJvbHQucHJlcGFyZShuZXcgQ29uZmlnKCksIHRvcG9sb2d5Q29udGV4dCwgY29sbGVjdG9yKTsKKworICAgICAgICBmcy5zZXRTYWZlTW9kZShTYWZlTW9kZUFjdGlvbi5TQUZFTU9ERV9FTlRFUik7CisKKyAgICAgICAgLy8gQWxsIHdyaXRlcy9zeW5jcyB3aWxsIGZhaWwgc28gdGhpcyBzaG91bGQgY2F1c2UgYSBSdW50aW1lRXhjZXB0aW9uCisgICAgICAgIHRocm93bi5leHBlY3QoUnVudGltZUV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIGJvbHQuZXhlY3V0ZSh0dXBsZTEpOworCisgICAgfQorCisgICAgLy8gT25lIHR1cGxlIGFuZCBvbmUgcm90YXRpb24gc2hvdWxkIHlpZWxkIG9uZSBmaWxlIHdpdGggZGF0YSBhbmQgb25lIHplcm8gbGVuZ3RoIGZpbGUKKyAgICAvLyBUaGUgZmFpbGVkIGV4ZWN1dGlvbnMgc2hvdWxkIG5vdCBjYXVzZSByb3RhdGlvbnMgYW5kIG5ldyB6ZXJvIGxlbmd0aCBmaWxlcworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZhaWx1cmVGaWxlY291bnQoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCisgICAgeworICAgICAgICBIZGZzQm9sdCBib2x0ID0gbWFrZUhkZnNCb2x0KGhkZnNVUkksIDEsIC4wMDAwMDFmKTsKKyAgICAgICAgYm9sdC5wcmVwYXJlKG5ldyBDb25maWcoKSwgdG9wb2xvZ3lDb250ZXh0LCBjb2xsZWN0b3IpOworCisgICAgICAgIGJvbHQuZXhlY3V0ZSh0dXBsZTEpOworICAgICAgICBmcy5zZXRTYWZlTW9kZShTYWZlTW9kZUFjdGlvbi5TQUZFTU9ERV9FTlRFUik7CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBib2x0LmV4ZWN1dGUodHVwbGUyKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLworICAgICAgICB9CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBib2x0LmV4ZWN1dGUodHVwbGUyKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLworICAgICAgICB9CisgICAgICAgIHRyeQorICAgICAgICB7CisgICAgICAgICAgICBib2x0LmV4ZWN1dGUodHVwbGUyKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLworICAgICAgICB9CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBjb3VudE5vblplcm9MZW5ndGhGaWxlcyh0ZXN0Um9vdCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIGNvdW50WmVyb0xlbmd0aEZpbGVzKHRlc3RSb290KSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGlja1R1cGxlcygpIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgSGRmc0JvbHQgYm9sdCA9IG1ha2VIZGZzQm9sdChoZGZzVVJJLCAxMCwgMTAwMDBmKTsKKyAgICAgICAgYm9sdC5wcmVwYXJlKG5ldyBDb25maWcoKSwgdG9wb2xvZ3lDb250ZXh0LCBjb2xsZWN0b3IpOworCisgICAgICAgIGJvbHQuZXhlY3V0ZSh0dXBsZTEpOworCisgICAgICAgIC8vU2hvdWxkIG5vdCBoYXZlIGZsdXNoZWQgdG8gZmlsZSBzeXN0ZW0geWV0CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgY291bnROb25aZXJvTGVuZ3RoRmlsZXModGVzdFJvb3QpKTsKKworICAgICAgICBib2x0LmV4ZWN1dGUoTW9ja1R1cGxlSGVscGVycy5tb2NrVGlja1R1cGxlKCkpOworCisgICAgICAgIC8vVGljayBzaG91bGQgaGF2ZSBmbHVzaGVkIGl0CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgY291bnROb25aZXJvTGVuZ3RoRmlsZXModGVzdFJvb3QpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjcmVhdGVCYXNlRGlyZWN0b3J5KEZpbGVTeXN0ZW0gcGFzc2VkRnMsIFN0cmluZyBwYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBQYXRoIHAgPSBuZXcgUGF0aChwYXRoKTsKKyAgICAgICAgcGFzc2VkRnMubWtkaXJzKHApOworICAgIH0KKworICAgIHByaXZhdGUgSGRmc0JvbHQgbWFrZUhkZnNCb2x0KFN0cmluZyBuYW1lTm9kZUFkZHIsIGludCBjb3VudFN5bmMsIGZsb2F0IHJvdGF0aW9uU2l6ZU1CKSB7CisKKyAgICAgICAgUmVjb3JkRm9ybWF0IGZpZWxkc0Zvcm1hdCA9IG5ldyBEZWxpbWl0ZWRSZWNvcmRGb3JtYXQoKS53aXRoRmllbGREZWxpbWl0ZXIoInwiKTsKKworICAgICAgICBTeW5jUG9saWN5IGZpZWxkc1N5bmNQb2xpY3kgPSBuZXcgQ291bnRTeW5jUG9saWN5KGNvdW50U3luYyk7CisKKyAgICAgICAgRmlsZVJvdGF0aW9uUG9saWN5IGZpZWxkc1JvdGF0aW9uUG9saWN5ID0KKyAgICAgICAgICAgICAgICBuZXcgRmlsZVNpemVSb3RhdGlvblBvbGljeShyb3RhdGlvblNpemVNQiwgRmlsZVNpemVSb3RhdGlvblBvbGljeS5Vbml0cy5NQik7CisKKyAgICAgICAgRmlsZU5hbWVGb3JtYXQgZmllbGRzRmlsZU5hbWVGb3JtYXQgPSBuZXcgRGVmYXVsdEZpbGVOYW1lRm9ybWF0KCkud2l0aFBhdGgodGVzdFJvb3QpOworCisgICAgICAgIHJldHVybiBuZXcgSGRmc0JvbHQoKQorICAgICAgICAgICAgICAgIC53aXRoRnNVcmwobmFtZU5vZGVBZGRyKQorICAgICAgICAgICAgICAgIC53aXRoRmlsZU5hbWVGb3JtYXQoZmllbGRzRmlsZU5hbWVGb3JtYXQpCisgICAgICAgICAgICAgICAgLndpdGhSZWNvcmRGb3JtYXQoZmllbGRzRm9ybWF0KQorICAgICAgICAgICAgICAgIC53aXRoUm90YXRpb25Qb2xpY3koZmllbGRzUm90YXRpb25Qb2xpY3kpCisgICAgICAgICAgICAgICAgLndpdGhTeW5jUG9saWN5KGZpZWxkc1N5bmNQb2xpY3kpOworICAgIH0KKworICAgIHByaXZhdGUgVHVwbGUgZ2VuZXJhdGVUZXN0VHVwbGUoT2JqZWN0IGlkLCBPYmplY3QgbXNnLE9iamVjdCBjaXR5LE9iamVjdCBzdGF0ZSkgeworICAgICAgICBUb3BvbG9neUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBUb3BvbG9neUJ1aWxkZXIoKTsKKyAgICAgICAgR2VuZXJhbFRvcG9sb2d5Q29udGV4dCB0b3BvbG9neUNvbnRleHQgPSBuZXcgR2VuZXJhbFRvcG9sb2d5Q29udGV4dChidWlsZGVyLmNyZWF0ZVRvcG9sb2d5KCksCisgICAgICAgICAgICAgICAgbmV3IENvbmZpZygpLCBuZXcgSGFzaE1hcCgpLCBuZXcgSGFzaE1hcCgpLCBuZXcgSGFzaE1hcCgpLCAiIikgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgRmllbGRzIGdldENvbXBvbmVudE91dHB1dEZpZWxkcyhTdHJpbmcgY29tcG9uZW50SWQsIFN0cmluZyBzdHJlYW1JZCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRmllbGRzKCJpZCIsICJtc2ciLCJjaXR5Iiwic3RhdGUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgcmV0dXJuIG5ldyBUdXBsZUltcGwodG9wb2xvZ3lDb250ZXh0LCBuZXcgVmFsdWVzKGlkLCBtc2csY2l0eSxzdGF0ZSksIDEsICIiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcHJpbnRGaWxlcyhTdHJpbmcgcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgUGF0aCBwID0gbmV3IFBhdGgocGF0aCk7CisgICAgICAgIEZpbGVTdGF0dXNbXSBmaWxlU3RhdHVzZXMgPSBmcy5saXN0U3RhdHVzKHApOworICAgICAgICBmb3IgKEZpbGVTdGF0dXMgZmlsZSA6IGZpbGVTdGF0dXNlcykgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJAQEAgIiArIGZpbGUuZ2V0UGF0aCgpICsgIiBbIiArIGZpbGUuZ2V0TGVuKCkgKyAiXSIpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gR2VuZXJhbGx5IHVzZWQgdG8gY29tcGFyZSBob3cgZmlsZXMgd2VyZSBhY3R1YWxseSB3cml0dGVuIGFuZCBjb21wYXJlIHRvIGV4cGVjdGF0aW9ucyBiYXNlZCBvbiB0b3RhbAorICAgIC8vIGFtb3VudCBvZiBkYXRhIHdyaXR0ZW4gYW5kIHJvdGF0aW9uIHBvbGljaWVzCisgICAgcHJpdmF0ZSBpbnQgY291bnROb25aZXJvTGVuZ3RoRmlsZXMoU3RyaW5nIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFBhdGggcCA9IG5ldyBQYXRoKHBhdGgpOworICAgICAgICBpbnQgbm9uWmVybyA9IDA7CisKKyAgICAgICAgZm9yIChGaWxlU3RhdHVzIGZpbGUgOiBmcy5saXN0U3RhdHVzKHApKQorICAgICAgICAgICAgaWYgKGZpbGUuZ2V0TGVuKCkgPiAwKQorICAgICAgICAgICAgICAgIG5vblplcm8rKzsKKworICAgICAgICByZXR1cm4gbm9uWmVybzsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBjb3VudFplcm9MZW5ndGhGaWxlcyhTdHJpbmcgcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgUGF0aCBwID0gbmV3IFBhdGgocGF0aCk7CisgICAgICAgIGludCB6ZXJvTGVuZ3RoID0gMDsKKworICAgICAgICBmb3IgKEZpbGVTdGF0dXMgZmlsZSA6IGZzLmxpc3RTdGF0dXMocCkpCisgICAgICAgICAgICBpZiAoZmlsZS5nZXRMZW4oKSA9PSAwKQorICAgICAgICAgICAgICAgIHplcm9MZW5ndGgrKzsKKworICAgICAgICByZXR1cm4gemVyb0xlbmd0aDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leHRlcm5hbC9zdG9ybS1oZGZzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9zdG9ybS9oZGZzL2JvbHQvVGVzdFNlcXVlbmNlRmlsZUJvbHQuamF2YSBiL2V4dGVybmFsL3N0b3JtLWhkZnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3N0b3JtL2hkZnMvYm9sdC9UZXN0U2VxdWVuY2VGaWxlQm9sdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNzYwZWYKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlcm5hbC9zdG9ybS1oZGZzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9zdG9ybS9oZGZzL2JvbHQvVGVzdFNlcXVlbmNlRmlsZUJvbHQuamF2YQpAQCAtMCwwICsxLDE4NiBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5zdG9ybS5oZGZzLmJvbHQ7CisKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5Db25maWc7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0uQ29uc3RhbnRzOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnRhc2suR2VuZXJhbFRvcG9sb2d5Q29udGV4dDsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS50YXNrLk91dHB1dENvbGxlY3RvcjsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS50YXNrLlRvcG9sb2d5Q29udGV4dDsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS50b3BvbG9neS5Ub3BvbG9neUJ1aWxkZXI7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0udHVwbGUuRmllbGRzOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnR1cGxlLlR1cGxlOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnR1cGxlLlR1cGxlSW1wbDsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS50dXBsZS5WYWx1ZXM7CitpbXBvcnQgb3JnLmFwYWNoZS5zdG9ybS5oZGZzLmJvbHQuZm9ybWF0LkRlZmF1bHRGaWxlTmFtZUZvcm1hdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0b3JtLmhkZnMuYm9sdC5mb3JtYXQuRmlsZU5hbWVGb3JtYXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdG9ybS5oZGZzLmJvbHQuZm9ybWF0LlNlcXVlbmNlRm9ybWF0OworaW1wb3J0IG9yZy5hcGFjaGUuc3Rvcm0uaGRmcy5ib2x0LmZvcm1hdC5EZWZhdWx0U2VxdWVuY2VGb3JtYXQ7CitpbXBvcnQgb3JnLmFwYWNoZS5zdG9ybS5oZGZzLmJvbHQucm90YXRpb24uRmlsZVJvdGF0aW9uUG9saWN5OworaW1wb3J0IG9yZy5hcGFjaGUuc3Rvcm0uaGRmcy5ib2x0LnJvdGF0aW9uLkZpbGVTaXplUm90YXRpb25Qb2xpY3k7CitpbXBvcnQgb3JnLmFwYWNoZS5zdG9ybS5oZGZzLmJvbHQuc3luYy5Db3VudFN5bmNQb2xpY3k7CitpbXBvcnQgb3JnLmFwYWNoZS5zdG9ybS5oZGZzLmJvbHQuc3luYy5TeW5jUG9saWN5OworaW1wb3J0IG9yZy5qdW5pdC4qOworCitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLkV4cGVjdGVkRXhjZXB0aW9uOworaW1wb3J0IG9yZy5tb2NraXRvLk1vY2s7CitpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0b0Fubm90YXRpb25zOworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLio7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5jb25mLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuaGRmcy5NaW5pREZTQ2x1c3RlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5mcy5GaWxlU3RhdHVzOworaW1wb3J0IG9yZy5hcGFjaGUuaGFkb29wLmZzLkZpbGVTeXN0ZW07CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuZnMuRmlsZVV0aWw7CitpbXBvcnQgb3JnLmFwYWNoZS5oYWRvb3AuZnMuUGF0aDsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5oZGZzLkRpc3RyaWJ1dGVkRmlsZVN5c3RlbTsKK2ltcG9ydCBvcmcuYXBhY2hlLmhhZG9vcC5oZGZzLnByb3RvY29sLkhkZnNDb25zdGFudHMuU2FmZU1vZGVBY3Rpb247CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCitwdWJsaWMgY2xhc3MgVGVzdFNlcXVlbmNlRmlsZUJvbHQgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFRlc3RTZXF1ZW5jZUZpbGVCb2x0LmNsYXNzKTsKKworICAgIHByaXZhdGUgU3RyaW5nIGhkZnNVUkk7CisgICAgcHJpdmF0ZSBEaXN0cmlidXRlZEZpbGVTeXN0ZW0gZnM7CisgICAgcHJpdmF0ZSBNaW5pREZTQ2x1c3RlciBoZGZzQ2x1c3RlcjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgdGVzdFJvb3QgPSAiL3VuaXR0ZXN0IjsKKyAgICBUdXBsZSB0dXBsZTEgPSBnZW5lcmF0ZVRlc3RUdXBsZSgxbCwgImZpcnN0IHR1cGxlIik7CisgICAgVHVwbGUgdHVwbGUyID0gZ2VuZXJhdGVUZXN0VHVwbGUoMmwsICJzZWNvbmQgdHVwbGUiKTsKKworICAgIEBNb2NrIHByaXZhdGUgT3V0cHV0Q29sbGVjdG9yIGNvbGxlY3RvcjsKKyAgICBATW9jayBwcml2YXRlIFRvcG9sb2d5Q29udGV4dCB0b3BvbG9neUNvbnRleHQ7CisgICAgQFJ1bGUgcHVibGljIEV4cGVjdGVkRXhjZXB0aW9uIHRocm93biA9IEV4cGVjdGVkRXhjZXB0aW9uLm5vbmUoKTsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXR1cCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBNb2NraXRvQW5ub3RhdGlvbnMuaW5pdE1vY2tzKHRoaXMpOworICAgICAgICBDb25maWd1cmF0aW9uIGNvbmYgPSBuZXcgQ29uZmlndXJhdGlvbigpOworICAgICAgICBjb25mLnNldCgiZnMudHJhc2guaW50ZXJ2YWwiLCAiMTAiKTsKKyAgICAgICAgY29uZi5zZXRCb29sZWFuKCJkZnMucGVybWlzc2lvbnMiLCB0cnVlKTsKKyAgICAgICAgRmlsZSBiYXNlRGlyID0gbmV3IEZpbGUoIi4vdGFyZ2V0L2hkZnMvIikuZ2V0QWJzb2x1dGVGaWxlKCk7CisgICAgICAgIEZpbGVVdGlsLmZ1bGx5RGVsZXRlKGJhc2VEaXIpOworICAgICAgICBjb25mLnNldChNaW5pREZTQ2x1c3Rlci5IREZTX01JTklERlNfQkFTRURJUiwgYmFzZURpci5nZXRBYnNvbHV0ZVBhdGgoKSk7CisKKyAgICAgICAgTWluaURGU0NsdXN0ZXIuQnVpbGRlciBidWlsZGVyID0gbmV3IE1pbmlERlNDbHVzdGVyLkJ1aWxkZXIoY29uZik7CisgICAgICAgIGhkZnNDbHVzdGVyID0gYnVpbGRlci5idWlsZCgpOworICAgICAgICBmcyA9IGhkZnNDbHVzdGVyLmdldEZpbGVTeXN0ZW0oKTsKKyAgICAgICAgaGRmc1VSSSA9ICJoZGZzOi8vbG9jYWxob3N0OiIgKyBoZGZzQ2x1c3Rlci5nZXROYW1lTm9kZVBvcnQoKSArICIvIjsKKyAgICB9CisKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCBzaHV0RG93bigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZzLmNsb3NlKCk7CisgICAgICAgIGhkZnNDbHVzdGVyLnNodXRkb3duKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHdvVHVwbGVzVHdvRmlsZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTZXF1ZW5jZUZpbGVCb2x0IGJvbHQgPSBtYWtlU2VxQm9sdChoZGZzVVJJLCAxLCAuMDAwMDFmKTsKKworICAgICAgICBib2x0LnByZXBhcmUobmV3IENvbmZpZygpLCB0b3BvbG9neUNvbnRleHQsIGNvbGxlY3Rvcik7CisgICAgICAgIGJvbHQuZXhlY3V0ZSh0dXBsZTEpOworICAgICAgICBib2x0LmV4ZWN1dGUodHVwbGUyKTsKKworICAgICAgICB2ZXJpZnkoY29sbGVjdG9yKS5hY2sodHVwbGUxKTsKKyAgICAgICAgdmVyaWZ5KGNvbGxlY3RvcikuYWNrKHR1cGxlMik7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBjb3VudE5vblplcm9MZW5ndGhGaWxlcyh0ZXN0Um9vdCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFR3b1R1cGxlc09uZUZpbGUoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIFNlcXVlbmNlRmlsZUJvbHQgYm9sdCA9IG1ha2VTZXFCb2x0KGhkZnNVUkksIDIsIDEwMDAwZik7CisgICAgICAgIGJvbHQucHJlcGFyZShuZXcgQ29uZmlnKCksIHRvcG9sb2d5Q29udGV4dCwgY29sbGVjdG9yKTsKKyAgICAgICAgYm9sdC5leGVjdXRlKHR1cGxlMSk7CisKKyAgICAgICAgdmVyaWZ5WmVyb0ludGVyYWN0aW9ucyhjb2xsZWN0b3IpOworCisgICAgICAgIGJvbHQuZXhlY3V0ZSh0dXBsZTIpOworICAgICAgICB2ZXJpZnkoY29sbGVjdG9yKS5hY2sodHVwbGUxKTsKKyAgICAgICAgdmVyaWZ5KGNvbGxlY3RvcikuYWNrKHR1cGxlMik7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBjb3VudE5vblplcm9MZW5ndGhGaWxlcyh0ZXN0Um9vdCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZhaWxlZFN5bmMoKSB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIFNlcXVlbmNlRmlsZUJvbHQgYm9sdCA9IG1ha2VTZXFCb2x0KGhkZnNVUkksIDEsIC4wMDAwMWYpOworICAgICAgICBib2x0LnByZXBhcmUobmV3IENvbmZpZygpLCB0b3BvbG9neUNvbnRleHQsIGNvbGxlY3Rvcik7CisKKyAgICAgICAgZnMuc2V0U2FmZU1vZGUoU2FmZU1vZGVBY3Rpb24uU0FGRU1PREVfRU5URVIpOworICAgICAgICAvLyBBbGwgd3JpdGVzL3N5bmNzIHdpbGwgZmFpbCBzbyB0aGlzIHNob3VsZCBjYXVzZSBhIFJ1bnRpbWVFeGNlcHRpb24KKyAgICAgICAgdGhyb3duLmV4cGVjdChSdW50aW1lRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgYm9sdC5leGVjdXRlKHR1cGxlMSk7CisKKyAgICB9CisKKyAgICBwcml2YXRlIFNlcXVlbmNlRmlsZUJvbHQgbWFrZVNlcUJvbHQoU3RyaW5nIG5hbWVOb2RlQWRkciwgaW50IGNvdW50U3luYywgZmxvYXQgcm90YXRpb25TaXplTUIpIHsKKworICAgICAgICBTeW5jUG9saWN5IGZpZWxkc1N5bmNQb2xpY3kgPSBuZXcgQ291bnRTeW5jUG9saWN5KGNvdW50U3luYyk7CisKKyAgICAgICAgRmlsZVJvdGF0aW9uUG9saWN5IGZpZWxkc1JvdGF0aW9uUG9saWN5ID0KKyAgICAgICAgICAgICAgICBuZXcgRmlsZVNpemVSb3RhdGlvblBvbGljeShyb3RhdGlvblNpemVNQiwgRmlsZVNpemVSb3RhdGlvblBvbGljeS5Vbml0cy5NQik7CisKKyAgICAgICAgRmlsZU5hbWVGb3JtYXQgZmllbGRzRmlsZU5hbWVGb3JtYXQgPSBuZXcgRGVmYXVsdEZpbGVOYW1lRm9ybWF0KCkud2l0aFBhdGgodGVzdFJvb3QpOworCisgICAgICAgIFNlcXVlbmNlRm9ybWF0IHNlcUZvcm1hdCA9IG5ldyBEZWZhdWx0U2VxdWVuY2VGb3JtYXQoImtleSIsICJ2YWx1ZSIpOworCisgICAgICAgIHJldHVybiBuZXcgU2VxdWVuY2VGaWxlQm9sdCgpCisgICAgICAgICAgICAgICAgLndpdGhGc1VybChuYW1lTm9kZUFkZHIpCisgICAgICAgICAgICAgICAgLndpdGhGaWxlTmFtZUZvcm1hdChmaWVsZHNGaWxlTmFtZUZvcm1hdCkKKyAgICAgICAgICAgICAgICAud2l0aFJvdGF0aW9uUG9saWN5KGZpZWxkc1JvdGF0aW9uUG9saWN5KQorICAgICAgICAgICAgICAgIC53aXRoU2VxdWVuY2VGb3JtYXQoc2VxRm9ybWF0KQorICAgICAgICAgICAgICAgIC53aXRoU3luY1BvbGljeShmaWVsZHNTeW5jUG9saWN5KTsKKyAgICB9CisKKyAgICBwcml2YXRlIFR1cGxlIGdlbmVyYXRlVGVzdFR1cGxlKExvbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgVG9wb2xvZ3lCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgVG9wb2xvZ3lCdWlsZGVyKCk7CisgICAgICAgIEdlbmVyYWxUb3BvbG9neUNvbnRleHQgdG9wb2xvZ3lDb250ZXh0ID0gbmV3IEdlbmVyYWxUb3BvbG9neUNvbnRleHQoYnVpbGRlci5jcmVhdGVUb3BvbG9neSgpLAorICAgICAgICAgICAgICAgIG5ldyBDb25maWcoKSwgbmV3IEhhc2hNYXAoKSwgbmV3IEhhc2hNYXAoKSwgbmV3IEhhc2hNYXAoKSwgIiIpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIEZpZWxkcyBnZXRDb21wb25lbnRPdXRwdXRGaWVsZHMoU3RyaW5nIGNvbXBvbmVudElkLCBTdHJpbmcgc3RyZWFtSWQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZpZWxkcygia2V5IiwgInZhbHVlIik7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHJldHVybiBuZXcgVHVwbGVJbXBsKHRvcG9sb2d5Q29udGV4dCwgbmV3IFZhbHVlcyhrZXksIHZhbHVlKSwgMSwgIiIpOworICAgIH0KKworICAgIC8vIEdlbmVyYWxseSB1c2VkIHRvIGNvbXBhcmUgaG93IGZpbGVzIHdlcmUgYWN0dWFsbHkgd3JpdHRlbiBhbmQgY29tcGFyZSB0byBleHBlY3RhdGlvbnMgYmFzZWQgb24gdG90YWwKKyAgICAvLyBhbW91bnQgb2YgZGF0YSB3cml0dGVuIGFuZCByb3RhdGlvbiBwb2xpY2llcworICAgIHByaXZhdGUgaW50IGNvdW50Tm9uWmVyb0xlbmd0aEZpbGVzKFN0cmluZyBwYXRoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBQYXRoIHAgPSBuZXcgUGF0aChwYXRoKTsKKyAgICAgICAgaW50IG5vblplcm8gPSAwOworCisgICAgICAgIGZvciAoRmlsZVN0YXR1cyBmaWxlIDogZnMubGlzdFN0YXR1cyhwKSkgeworICAgICAgICAgICAgaWYgKGZpbGUuZ2V0TGVuKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgbm9uWmVybysrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5vblplcm87CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9leHRlcm5hbC9zdG9ybS1oZGZzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9zdG9ybS9oZGZzL3RyaWRlbnQvSGRmc1N0YXRlVGVzdC5qYXZhIGIvZXh0ZXJuYWwvc3Rvcm0taGRmcy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvc3Rvcm0vaGRmcy90cmlkZW50L0hkZnNTdGF0ZVRlc3QuamF2YQppbmRleCBlMWY0NWRmLi41MTg2OWQyIDEwMDY0NAotLS0gYS9leHRlcm5hbC9zdG9ybS1oZGZzL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9zdG9ybS9oZGZzL3RyaWRlbnQvSGRmc1N0YXRlVGVzdC5qYXZhCisrKyBiL2V4dGVybmFsL3N0b3JtLWhkZnMvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3N0b3JtL2hkZnMvdHJpZGVudC9IZGZzU3RhdGVUZXN0LmphdmEKQEAgLTEsMyArMSwyMCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5zdG9ybS5oZGZzLnRyaWRlbnQ7CiAKIGltcG9ydCBiYWNrdHlwZS5zdG9ybS5Db25maWc7CmRpZmYgLS1naXQgYS9leHRlcm5hbC9zdG9ybS1oaXZlL3BvbS54bWwgYi9leHRlcm5hbC9zdG9ybS1oaXZlL3BvbS54bWwKaW5kZXggNmZhNGZhOS4uZjg0MmMyNSAxMDA2NDQKLS0tIGEvZXh0ZXJuYWwvc3Rvcm0taGl2ZS9wb20ueG1sCisrKyBiL2V4dGVybmFsL3N0b3JtLWhpdmUvcG9tLnhtbApAQCAtNDUsNiArNDUsMTMgQEAKICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CiAgICAgPC9kZXBlbmRlbmN5PgogICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5zdG9ybTwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPnN0b3JtLWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICA8dHlwZT50ZXN0LWphcjwvdHlwZT4KKyAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgPGRlcGVuZGVuY3k+CiAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmhpdmUuaGNhdGFsb2c8L2dyb3VwSWQ+CiAgICAgICA8YXJ0aWZhY3RJZD5oaXZlLWhjYXRhbG9nLXN0cmVhbWluZzwvYXJ0aWZhY3RJZD4KICAgICAgIDx2ZXJzaW9uPiR7aGl2ZS52ZXJzaW9ufTwvdmVyc2lvbj4KZGlmZiAtLWdpdCBhL2V4dGVybmFsL3N0b3JtLWhpdmUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0b3JtL2hpdmUvYm9sdC9IaXZlQm9sdC5qYXZhIGIvZXh0ZXJuYWwvc3Rvcm0taGl2ZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3Rvcm0vaGl2ZS9ib2x0L0hpdmVCb2x0LmphdmEKaW5kZXggZTIwZDMxZi4uZDg2ODViMCAxMDA2NDQKLS0tIGEvZXh0ZXJuYWwvc3Rvcm0taGl2ZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3Rvcm0vaGl2ZS9ib2x0L0hpdmVCb2x0LmphdmEKKysrIGIvZXh0ZXJuYWwvc3Rvcm0taGl2ZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3Rvcm0vaGl2ZS9ib2x0L0hpdmVCb2x0LmphdmEKQEAgLTkzLDYgKzkzLDE1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUaHJlYWRGYWN0b3J5QnVpbGRlcigpLnNldE5hbWVGb3JtYXQodGltZW91dE5hbWUpLmJ1aWxkKCkpOwogICAgICAgICAgICAgaGVhcnRCZWF0VGltZXIgPSBuZXcgVGltZXIoKTsKICAgICAgICAgICAgIHNldHVwSGVhcnRCZWF0VGltZXIoKTsKKworICAgICAgICAgICAgLy8gSWYgaW50ZXJ2YWwgaXMgbm9uLXplcm8gdGhlbiBpdCBoYXMgYWxyZWFkeSBiZWVuIGV4cGxpY2l0bHkgc2V0IGFuZCB3ZSBzaG91bGQgbm90IGRlZmF1bHQgaXQKKyAgICAgICAgICAgIGlmIChjb25mLmNvbnRhaW5zS2V5KCJ0b3BvbG9neS5tZXNzYWdlLnRpbWVvdXQuc2VjcyIpICYmIG9wdGlvbnMuZ2V0VGlja1R1cGxlSW50ZXJ2YWwoKSA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEludGVnZXIgdG9wb2xvZ3lUaW1lb3V0ID0gSW50ZWdlci5wYXJzZUludChjb25mLmdldCgidG9wb2xvZ3kubWVzc2FnZS50aW1lb3V0LnNlY3MiKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICBpbnQgdGlja1R1cGxlSW50ZXJ2YWwgPSAoaW50KSAoTWF0aC5mbG9vcih0b3BvbG9neVRpbWVvdXQgLyAyKSk7CisgICAgICAgICAgICAgICAgb3B0aW9ucy53aXRoVGlja1R1cGxlSW50ZXJ2YWwodGlja1R1cGxlSW50ZXJ2YWwpOworICAgICAgICAgICAgICAgIExPRy5kZWJ1ZygiU2V0dGluZyB0aWNrIHR1cGxlIGludGVydmFsIHRvIFsiICsgdGlja1R1cGxlSW50ZXJ2YWwgKyAiXSBiYXNlZCBvbiB0b3BvbG9neSB0aW1lb3V0Iik7CisgICAgICAgICAgICB9CiAgICAgICAgIH0gY2F0Y2goRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIExPRy53YXJuKCJ1bmFibGUgdG8gbWFrZSBjb25uZWN0aW9uIHRvIGhpdmUgIiwgZSk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2V4dGVybmFsL3N0b3JtLWhpdmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3N0b3JtL2hpdmUvYm9sdC9UZXN0SGl2ZUJvbHQuamF2YSBiL2V4dGVybmFsL3N0b3JtLWhpdmUvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3N0b3JtL2hpdmUvYm9sdC9UZXN0SGl2ZUJvbHQuamF2YQppbmRleCAwMzUwYzZlLi44ZTc5YzhjIDEwMDY0NAotLS0gYS9leHRlcm5hbC9zdG9ybS1oaXZlL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9zdG9ybS9oaXZlL2JvbHQvVGVzdEhpdmVCb2x0LmphdmEKKysrIGIvZXh0ZXJuYWwvc3Rvcm0taGl2ZS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvc3Rvcm0vaGl2ZS9ib2x0L1Rlc3RIaXZlQm9sdC5qYXZhCkBAIC0yNiw2ICsyNiw3IEBACiBpbXBvcnQgYmFja3R5cGUuc3Rvcm0udHVwbGUuVHVwbGU7CiBpbXBvcnQgYmFja3R5cGUuc3Rvcm0udHVwbGUuVHVwbGVJbXBsOwogaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnR1cGxlLlZhbHVlczsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS51dGlscy5Nb2NrVHVwbGVIZWxwZXJzOwogCiBpbXBvcnQgb3JnLmFwYWNoZS5zdG9ybS5oaXZlLmNvbW1vbi5IaXZlT3B0aW9uczsKIGltcG9ydCBvcmcuYXBhY2hlLnN0b3JtLmhpdmUuYm9sdC5tYXBwZXIuRGVsaW1pdGVkUmVjb3JkSGl2ZU1hcHBlcjsKQEAgLTQ1LDcgKzQ2LDYgQEAKIGltcG9ydCBvcmcuanVuaXQucnVsZXMuVGVtcG9yYXJ5Rm9sZGVyOwogaW1wb3J0IG9yZy5tb2NraXRvLk1vY2s7CiBpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0bzsKLWltcG9ydCBvcmcubW9ja2l0by5TcHk7CiBpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0b0Fubm90YXRpb25zOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by4qOwpAQCAtMjQ4LDcgKzI0OCw2IEBACiAgICAgICAgIGJvbHQgPSBuZXcgSGl2ZUJvbHQoaGl2ZU9wdGlvbnMpOwogICAgICAgICBib2x0LnByZXBhcmUoY29uZmlnLCBudWxsLCBuZXcgT3V0cHV0Q29sbGVjdG9yKGNvbGxlY3RvcikpOwogICAgICAgICBUdXBsZSB0dXBsZTEgPSBnZW5lcmF0ZVRlc3RUdXBsZSgxLCAiU0pDIiwgIlN1bm55dmFsZSIsICJDQSIpOwotCiAgICAgICAgIC8vVHVwbGUgdHVwbGUyID0gZ2VuZXJhdGVUZXN0VHVwbGUoMiwiU0ZPIiwiU2FuIEpvc2UiLCJDQSIpOwogICAgICAgICBib2x0LmV4ZWN1dGUodHVwbGUxKTsKICAgICAgICAgdmVyaWZ5KGNvbGxlY3RvcikuYWNrKHR1cGxlMSk7CkBAIC0zMzcsNiArMzM2LDU5IEBACiAgICAgfQogCiAgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGlja1R1cGxlKCkKKyAgICB7CisgICAgICAgIEpzb25SZWNvcmRIaXZlTWFwcGVyIG1hcHBlciA9IG5ldyBKc29uUmVjb3JkSGl2ZU1hcHBlcigpCisgICAgICAgICAgICAgICAgLndpdGhDb2x1bW5GaWVsZHMobmV3IEZpZWxkcyhjb2xOYW1lczEpKQorICAgICAgICAgICAgICAgIC53aXRoUGFydGl0aW9uRmllbGRzKG5ldyBGaWVsZHMocGFydE5hbWVzKSk7CisgICAgICAgIEhpdmVPcHRpb25zIGhpdmVPcHRpb25zID0gbmV3IEhpdmVPcHRpb25zKG1ldGFTdG9yZVVSSSxkYk5hbWUsdGJsTmFtZSxtYXBwZXIpCisgICAgICAgICAgICAgICAgLndpdGhUeG5zUGVyQmF0Y2goMikKKyAgICAgICAgICAgICAgICAud2l0aEJhdGNoU2l6ZSgyKTsKKworICAgICAgICBib2x0ID0gbmV3IEhpdmVCb2x0KGhpdmVPcHRpb25zKTsKKyAgICAgICAgYm9sdC5wcmVwYXJlKGNvbmZpZywgbnVsbCwgbmV3IE91dHB1dENvbGxlY3Rvcihjb2xsZWN0b3IpKTsKKworICAgICAgICBUdXBsZSB0dXBsZTEgPSBnZW5lcmF0ZVRlc3RUdXBsZSgxLCAiU0pDIiwgIlN1bm55dmFsZSIsICJDQSIpOworICAgICAgICBUdXBsZSB0dXBsZTIgPSBnZW5lcmF0ZVRlc3RUdXBsZSgyLCAiU0ZPIiwgIlNhbiBKb3NlIiwgIkNBIik7CisKKworICAgICAgICBib2x0LmV4ZWN1dGUodHVwbGUxKTsKKworICAgICAgICAvL1RoZSB0aWNrIHNob3VsZCBjYXVzZSB0dXBsZTEgdG8gYmUgYWNrJ2QKKyAgICAgICAgVHVwbGUgbW9ja1RpY2sgPSBNb2NrVHVwbGVIZWxwZXJzLm1vY2tUaWNrVHVwbGUoKTsKKyAgICAgICAgYm9sdC5leGVjdXRlKG1vY2tUaWNrKTsKKyAgICAgICAgdmVyaWZ5KGNvbGxlY3RvcikuYWNrKHR1cGxlMSk7CisKKyAgICAgICAgLy9UaGUgc2Vjb25kIHR1cGxlIHNob3VsZCBOT1QgYmUgYWNrJ2QgYmVjYXVzZSB0aGUgYmF0Y2ggc2hvdWxkIGJlIGNsZWFyZWQgYW5kIHRoaXMgd2lsbCBiZQorICAgICAgICAvL3RoZSBmaXJzdCB0cmFuc2FjdGlvbiBpbiB0aGUgbmV3IGJhdGNoCisgICAgICAgIGJvbHQuZXhlY3V0ZSh0dXBsZTIpOworICAgICAgICB2ZXJpZnkoY29sbGVjdG9yLCBuZXZlcigpKS5hY2sodHVwbGUyKTsKKworICAgICAgICBib2x0LmNsZWFudXAoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb1RpY2tFbXB0eUJhdGNoZXMoKSB0aHJvd3MgRXhjZXB0aW9uCisgICAgeworICAgICAgICBKc29uUmVjb3JkSGl2ZU1hcHBlciBtYXBwZXIgPSBuZXcgSnNvblJlY29yZEhpdmVNYXBwZXIoKQorICAgICAgICAgICAgICAgIC53aXRoQ29sdW1uRmllbGRzKG5ldyBGaWVsZHMoY29sTmFtZXMxKSkKKyAgICAgICAgICAgICAgICAud2l0aFBhcnRpdGlvbkZpZWxkcyhuZXcgRmllbGRzKHBhcnROYW1lcykpOworICAgICAgICBIaXZlT3B0aW9ucyBoaXZlT3B0aW9ucyA9IG5ldyBIaXZlT3B0aW9ucyhtZXRhU3RvcmVVUkksZGJOYW1lLHRibE5hbWUsbWFwcGVyKQorICAgICAgICAgICAgICAgIC53aXRoVHhuc1BlckJhdGNoKDIpCisgICAgICAgICAgICAgICAgLndpdGhCYXRjaFNpemUoMik7CisKKyAgICAgICAgYm9sdCA9IG5ldyBIaXZlQm9sdChoaXZlT3B0aW9ucyk7CisgICAgICAgIGJvbHQucHJlcGFyZShjb25maWcsIG51bGwsIG5ldyBPdXRwdXRDb2xsZWN0b3IoY29sbGVjdG9yKSk7CisKKyAgICAgICAgLy9UaGUgdGljayBzaG91bGQgTk9UIGNhdXNlIGFueSBhY2tzIHNpbmNlIHRoZSBiYXRjaCB3YXMgZW1wdHkKKyAgICAgICAgVHVwbGUgbW9ja1RpY2sgPSBNb2NrVHVwbGVIZWxwZXJzLm1vY2tUaWNrVHVwbGUoKTsKKyAgICAgICAgYm9sdC5leGVjdXRlKG1vY2tUaWNrKTsKKyAgICAgICAgdmVyaWZ5WmVyb0ludGVyYWN0aW9ucyhjb2xsZWN0b3IpOworCisgICAgICAgIGJvbHQuY2xlYW51cCgpOworICAgIH0KKworICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE11bHRpUGFydGl0aW9uVHVwbGVzKCkKICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIERlbGltaXRlZFJlY29yZEhpdmVNYXBwZXIgbWFwcGVyID0gbmV3IERlbGltaXRlZFJlY29yZEhpdmVNYXBwZXIoKQpkaWZmIC0tZ2l0IGEvZXh0ZXJuYWwvc3Rvcm0tamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3Rvcm0vamRiYy9ib2x0L0Fic3RyYWN0SmRiY0JvbHQuamF2YSBiL2V4dGVybmFsL3N0b3JtLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0b3JtL2pkYmMvYm9sdC9BYnN0cmFjdEpkYmNCb2x0LmphdmEKaW5kZXggMTVhMjM0NS4uMGMwY2NhNiAxMDA2NDQKLS0tIGEvZXh0ZXJuYWwvc3Rvcm0tamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3Rvcm0vamRiYy9ib2x0L0Fic3RyYWN0SmRiY0JvbHQuamF2YQorKysgYi9leHRlcm5hbC9zdG9ybS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdG9ybS9qZGJjL2JvbHQvQWJzdHJhY3RKZGJjQm9sdC5qYXZhCkBAIC0yMSw2ICsyMSw3IEBACiBpbXBvcnQgYmFja3R5cGUuc3Rvcm0udGFzay5PdXRwdXRDb2xsZWN0b3I7CiBpbXBvcnQgYmFja3R5cGUuc3Rvcm0udGFzay5Ub3BvbG9neUNvbnRleHQ7CiBpbXBvcnQgYmFja3R5cGUuc3Rvcm0udG9wb2xvZ3kuYmFzZS5CYXNlUmljaEJvbHQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuVmFsaWRhdGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5zdG9ybS5qZGJjLmNvbW1vbi5Db25uZWN0aW9uUHJvdmlkZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS5zdG9ybS5qZGJjLmNvbW1vbi5KZGJjQ2xpZW50OwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CkBAIC01Miw2ICs1Myw3IEBACiAgICAgfQogCiAgICAgcHVibGljIEFic3RyYWN0SmRiY0JvbHQoQ29ubmVjdGlvblByb3ZpZGVyIGNvbm5lY3Rpb25Qcm92aWRlcikgeworICAgICAgICBWYWxpZGF0ZS5ub3ROdWxsKGNvbm5lY3Rpb25Qcm92aWRlcik7CiAgICAgICAgIHRoaXMuY29ubmVjdGlvblByb3ZpZGVyID0gY29ubmVjdGlvblByb3ZpZGVyOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvZXh0ZXJuYWwvc3Rvcm0tamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3Rvcm0vamRiYy9ib2x0L0pkYmNJbnNlcnRCb2x0LmphdmEgYi9leHRlcm5hbC9zdG9ybS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdG9ybS9qZGJjL2JvbHQvSmRiY0luc2VydEJvbHQuamF2YQppbmRleCAyZjI5MDAwLi5jMzMyOGYxIDEwMDY0NAotLS0gYS9leHRlcm5hbC9zdG9ybS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdG9ybS9qZGJjL2JvbHQvSmRiY0luc2VydEJvbHQuamF2YQorKysgYi9leHRlcm5hbC9zdG9ybS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdG9ybS9qZGJjL2JvbHQvSmRiY0luc2VydEJvbHQuamF2YQpAQCAtMjAsNiArMjAsNyBAQAogaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnRhc2suVG9wb2xvZ3lDb250ZXh0OwogaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnRvcG9sb2d5Lk91dHB1dEZpZWxkc0RlY2xhcmVyOwogaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnR1cGxlLlR1cGxlOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlZhbGlkYXRlOwogaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nMy5TdHJpbmdVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLnN0b3JtLmpkYmMuY29tbW9uLkNvbHVtbjsKIGltcG9ydCBvcmcuYXBhY2hlLnN0b3JtLmpkYmMuY29tbW9uLkNvbm5lY3Rpb25Qcm92aWRlcjsKQEAgLTQ1LDE1ICs0NiwyMyBAQAogCiAgICAgcHVibGljIEpkYmNJbnNlcnRCb2x0KENvbm5lY3Rpb25Qcm92aWRlciBjb25uZWN0aW9uUHJvdmlkZXIsICBKZGJjTWFwcGVyIGpkYmNNYXBwZXIpIHsKICAgICAgICAgc3VwZXIoY29ubmVjdGlvblByb3ZpZGVyKTsKKworICAgICAgICBWYWxpZGF0ZS5ub3ROdWxsKGpkYmNNYXBwZXIpOwogICAgICAgICB0aGlzLmpkYmNNYXBwZXIgPSBqZGJjTWFwcGVyOwogICAgIH0KIAogICAgIHB1YmxpYyBKZGJjSW5zZXJ0Qm9sdCB3aXRoVGFibGVOYW1lKFN0cmluZyB0YWJsZU5hbWUpIHsKKyAgICAgICAgaWYgKGluc2VydFF1ZXJ5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIllvdSBjYW4gbm90IHNwZWNpZnkgYm90aCBpbnNlcnRRdWVyeSBhbmQgdGFibGVOYW1lLiIpOworICAgICAgICB9CiAgICAgICAgIHRoaXMudGFibGVOYW1lID0gdGFibGVOYW1lOwogICAgICAgICByZXR1cm4gdGhpczsKICAgICB9CiAKICAgICBwdWJsaWMgSmRiY0luc2VydEJvbHQgd2l0aEluc2VydFF1ZXJ5KFN0cmluZyBpbnNlcnRRdWVyeSkgeworICAgICAgICBpZiAodGhpcy50YWJsZU5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiWW91IGNhbiBub3Qgc3BlY2lmeSBib3RoIGluc2VydFF1ZXJ5IGFuZCB0YWJsZU5hbWUuIik7CisgICAgICAgIH0KICAgICAgICAgdGhpcy5pbnNlcnRRdWVyeSA9IGluc2VydFF1ZXJ5OwogICAgICAgICByZXR1cm4gdGhpczsKICAgICB9CmRpZmYgLS1naXQgYS9leHRlcm5hbC9zdG9ybS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdG9ybS9qZGJjL2JvbHQvSmRiY0xvb2t1cEJvbHQuamF2YSBiL2V4dGVybmFsL3N0b3JtLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0b3JtL2pkYmMvYm9sdC9KZGJjTG9va3VwQm9sdC5qYXZhCmluZGV4IDI1MTIyZTIuLmIxZGFkYjcgMTAwNjQ0Ci0tLSBhL2V4dGVybmFsL3N0b3JtLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0b3JtL2pkYmMvYm9sdC9KZGJjTG9va3VwQm9sdC5qYXZhCisrKyBiL2V4dGVybmFsL3N0b3JtLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0b3JtL2pkYmMvYm9sdC9KZGJjTG9va3VwQm9sdC5qYXZhCkBAIC0yMCw2ICsyMCw3IEBACiBpbXBvcnQgYmFja3R5cGUuc3Rvcm0udG9wb2xvZ3kuT3V0cHV0RmllbGRzRGVjbGFyZXI7CiBpbXBvcnQgYmFja3R5cGUuc3Rvcm0udHVwbGUuVHVwbGU7CiBpbXBvcnQgYmFja3R5cGUuc3Rvcm0udHVwbGUuVmFsdWVzOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlZhbGlkYXRlOwogaW1wb3J0IG9yZy5hcGFjaGUuc3Rvcm0uamRiYy5jb21tb24uQ29sdW1uOwogaW1wb3J0IG9yZy5hcGFjaGUuc3Rvcm0uamRiYy5jb21tb24uQ29ubmVjdGlvblByb3ZpZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuc3Rvcm0uamRiYy5tYXBwZXIuSmRiY0xvb2t1cE1hcHBlcjsKQEAgLTQwLDYgKzQxLDEwIEBACiAKICAgICBwdWJsaWMgSmRiY0xvb2t1cEJvbHQoQ29ubmVjdGlvblByb3ZpZGVyIGNvbm5lY3Rpb25Qcm92aWRlciwgU3RyaW5nIHNlbGVjdFF1ZXJ5LCBKZGJjTG9va3VwTWFwcGVyIGpkYmNMb29rdXBNYXBwZXIpIHsKICAgICAgICAgc3VwZXIoY29ubmVjdGlvblByb3ZpZGVyKTsKKworICAgICAgICBWYWxpZGF0ZS5ub3ROdWxsKHNlbGVjdFF1ZXJ5KTsKKyAgICAgICAgVmFsaWRhdGUubm90TnVsbChqZGJjTG9va3VwTWFwcGVyKTsKKwogICAgICAgICB0aGlzLnNlbGVjdFF1ZXJ5ID0gc2VsZWN0UXVlcnk7CiAgICAgICAgIHRoaXMuamRiY0xvb2t1cE1hcHBlciA9IGpkYmNMb29rdXBNYXBwZXI7CiAgICAgfQpkaWZmIC0tZ2l0IGEvZXh0ZXJuYWwvc3Rvcm0tamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3Rvcm0vamRiYy9tYXBwZXIvU2ltcGxlSmRiY0xvb2t1cE1hcHBlci5qYXZhIGIvZXh0ZXJuYWwvc3Rvcm0tamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3Rvcm0vamRiYy9tYXBwZXIvU2ltcGxlSmRiY0xvb2t1cE1hcHBlci5qYXZhCmluZGV4IDVhMjI1NTIuLmIyNjdiZDEgMTAwNjQ0Ci0tLSBhL2V4dGVybmFsL3N0b3JtLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0b3JtL2pkYmMvbWFwcGVyL1NpbXBsZUpkYmNMb29rdXBNYXBwZXIuamF2YQorKysgYi9leHRlcm5hbC9zdG9ybS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdG9ybS9qZGJjL21hcHBlci9TaW1wbGVKZGJjTG9va3VwTWFwcGVyLmphdmEKQEAgLTIyLDYgKzIyLDcgQEAKIGltcG9ydCBiYWNrdHlwZS5zdG9ybS50dXBsZS5GaWVsZHM7CiBpbXBvcnQgYmFja3R5cGUuc3Rvcm0udHVwbGUuSVR1cGxlOwogaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnR1cGxlLlZhbHVlczsKK2ltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5WYWxpZGF0ZTsKIGltcG9ydCBvcmcuYXBhY2hlLnN0b3JtLmpkYmMuY29tbW9uLkNvbHVtbjsKIAogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CkBAIC0zMyw2ICszNCw4IEBACiAKICAgICBwdWJsaWMgU2ltcGxlSmRiY0xvb2t1cE1hcHBlcihGaWVsZHMgb3V0cHV0RmllbGRzLCBMaXN0PENvbHVtbj4gcXVlcnlDb2x1bW5zKSB7CiAgICAgICAgIHN1cGVyKHF1ZXJ5Q29sdW1ucyk7CisKKyAgICAgICAgVmFsaWRhdGUubm90RW1wdHkob3V0cHV0RmllbGRzLnRvTGlzdCgpKTsKICAgICAgICAgdGhpcy5vdXRwdXRGaWVsZHMgPSBvdXRwdXRGaWVsZHM7CiAgICAgfQogCmRpZmYgLS1naXQgYS9leHRlcm5hbC9zdG9ybS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdG9ybS9qZGJjL21hcHBlci9TaW1wbGVKZGJjTWFwcGVyLmphdmEgYi9leHRlcm5hbC9zdG9ybS1qZGJjL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdG9ybS9qZGJjL21hcHBlci9TaW1wbGVKZGJjTWFwcGVyLmphdmEKaW5kZXggYzQwMDVlMy4uOWJlZmIxZSAxMDA2NDQKLS0tIGEvZXh0ZXJuYWwvc3Rvcm0tamRiYy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3Rvcm0vamRiYy9tYXBwZXIvU2ltcGxlSmRiY01hcHBlci5qYXZhCisrKyBiL2V4dGVybmFsL3N0b3JtLWpkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0b3JtL2pkYmMvbWFwcGVyL1NpbXBsZUpkYmNNYXBwZXIuamF2YQpAQCAtMTgsNiArMTgsNyBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnN0b3JtLmpkYmMubWFwcGVyOwogCiBpbXBvcnQgYmFja3R5cGUuc3Rvcm0udHVwbGUuSVR1cGxlOworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5sYW5nLlZhbGlkYXRlOwogaW1wb3J0IG9yZy5hcGFjaGUuc3Rvcm0uamRiYy5jb21tb24uQ29sdW1uOwogaW1wb3J0IG9yZy5hcGFjaGUuc3Rvcm0uamRiYy5jb21tb24uQ29ubmVjdGlvblByb3ZpZGVyOwogaW1wb3J0IG9yZy5hcGFjaGUuc3Rvcm0uamRiYy5jb21tb24uSmRiY0NsaWVudDsKQEAgLTM1LDYgKzM2LDkgQEAKICAgICBwcml2YXRlIExpc3Q8Q29sdW1uPiBzY2hlbWFDb2x1bW5zOwogCiAgICAgcHVibGljIFNpbXBsZUpkYmNNYXBwZXIoU3RyaW5nIHRhYmxlTmFtZSwgQ29ubmVjdGlvblByb3ZpZGVyIGNvbm5lY3Rpb25Qcm92aWRlcikgeworICAgICAgICBWYWxpZGF0ZS5ub3RFbXB0eSh0YWJsZU5hbWUpOworICAgICAgICBWYWxpZGF0ZS5ub3ROdWxsKGNvbm5lY3Rpb25Qcm92aWRlcik7CisKICAgICAgICAgaW50IHF1ZXJ5VGltZW91dFNlY3MgPSAzMDsKICAgICAgICAgY29ubmVjdGlvblByb3ZpZGVyLnByZXBhcmUoKTsKICAgICAgICAgSmRiY0NsaWVudCBjbGllbnQgPSBuZXcgSmRiY0NsaWVudChjb25uZWN0aW9uUHJvdmlkZXIsIHF1ZXJ5VGltZW91dFNlY3MpOwpAQCAtNDIsNiArNDYsNyBAQAogICAgIH0KIAogICAgIHB1YmxpYyBTaW1wbGVKZGJjTWFwcGVyKExpc3Q8Q29sdW1uPiBzY2hlbWFDb2x1bW5zKSB7CisgICAgICAgIFZhbGlkYXRlLm5vdEVtcHR5KHNjaGVtYUNvbHVtbnMpOwogICAgICAgICB0aGlzLnNjaGVtYUNvbHVtbnMgPSBzY2hlbWFDb2x1bW5zOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvZXh0ZXJuYWwvc3Rvcm0tamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvc3Rvcm0vamRiYy9ib2x0L0pkYmNJbnNlcnRCb2x0VGVzdC5qYXZhIGIvZXh0ZXJuYWwvc3Rvcm0tamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvc3Rvcm0vamRiYy9ib2x0L0pkYmNJbnNlcnRCb2x0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiMzkzZTkKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlcm5hbC9zdG9ybS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9zdG9ybS9qZGJjL2JvbHQvSmRiY0luc2VydEJvbHRUZXN0LmphdmEKQEAgLTAsMCArMSw3MSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5zdG9ybS5qZGJjLmJvbHQ7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworaW1wb3J0IG9yZy5hcGFjaGUuc3Rvcm0uamRiYy5jb21tb24uQ29sdW1uOworaW1wb3J0IG9yZy5hcGFjaGUuc3Rvcm0uamRiYy5jb21tb24uQ29ubmVjdGlvblByb3ZpZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuc3Rvcm0uamRiYy5jb21tb24uSGlrYXJpQ1BDb25uZWN0aW9uUHJvdmlkZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5zdG9ybS5qZGJjLm1hcHBlci5KZGJjTWFwcGVyOworaW1wb3J0IG9yZy5hcGFjaGUuc3Rvcm0uamRiYy5tYXBwZXIuU2ltcGxlSmRiY01hcHBlcjsKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKKy8qKgorICogQ3JlYXRlZCBieSBwYnJhaG1iaGF0dCBvbiAxMC8yOS8xNS4KKyAqLworcHVibGljIGNsYXNzIEpkYmNJbnNlcnRCb2x0VGVzdCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0aW9uKCkgeworICAgICAgICBDb25uZWN0aW9uUHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgSGlrYXJpQ1BDb25uZWN0aW9uUHJvdmlkZXIobmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCkpOworICAgICAgICBKZGJjTWFwcGVyIG1hcHBlciA9IG5ldyBTaW1wbGVKZGJjTWFwcGVyKExpc3RzLm5ld0FycmF5TGlzdChuZXcgQ29sdW1uKCJ0ZXN0IiwgMCkpKTsKKyAgICAgICAgZXhwZWN0SWxsZWdhQXJncyhudWxsLCBtYXBwZXIpOworICAgICAgICBleHBlY3RJbGxlZ2FBcmdzKHByb3ZpZGVyLCBudWxsKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgSmRiY0luc2VydEJvbHQgYm9sdCA9IG5ldyBKZGJjSW5zZXJ0Qm9sdChwcm92aWRlciwgbWFwcGVyKTsKKyAgICAgICAgICAgIGJvbHQud2l0aEluc2VydFF1ZXJ5KCJ0ZXN0Iik7CisgICAgICAgICAgICBib2x0LndpdGhUYWJsZU5hbWUoInRlc3QiKTsKKyAgICAgICAgICAgIEFzc2VydC5mYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLiIpOworICAgICAgICB9IGNhdGNoKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBuZSkgeworICAgICAgICAgICAgLy9leHBlY3RlZAorICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEpkYmNJbnNlcnRCb2x0IGJvbHQgPSBuZXcgSmRiY0luc2VydEJvbHQocHJvdmlkZXIsIG1hcHBlcik7CisgICAgICAgICAgICBib2x0LndpdGhUYWJsZU5hbWUoInRlc3QiKTsKKyAgICAgICAgICAgIGJvbHQud2l0aEluc2VydFF1ZXJ5KCJ0ZXN0Iik7CisgICAgICAgICAgICBBc3NlcnQuZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi4iKTsKKyAgICAgICAgfSBjYXRjaChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gbmUpIHsKKyAgICAgICAgICAgIC8vZXhwZWN0ZWQKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBleHBlY3RJbGxlZ2FBcmdzKENvbm5lY3Rpb25Qcm92aWRlciBwcm92aWRlciwgSmRiY01hcHBlciBtYXBwZXIpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEpkYmNJbnNlcnRCb2x0IGJvbHQgPSBuZXcgSmRiY0luc2VydEJvbHQocHJvdmlkZXIsIG1hcHBlcik7CisgICAgICAgICAgICBBc3NlcnQuZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi4iKTsKKyAgICAgICAgfSBjYXRjaChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gbmUpIHsKKyAgICAgICAgICAgIC8vZXhwZWN0ZWQKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZXh0ZXJuYWwvc3Rvcm0tamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvc3Rvcm0vamRiYy9ib2x0L0pkYmNMb29rdXBCb2x0VGVzdC5qYXZhIGIvZXh0ZXJuYWwvc3Rvcm0tamRiYy9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvc3Rvcm0vamRiYy9ib2x0L0pkYmNMb29rdXBCb2x0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmZGEzYjEKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlcm5hbC9zdG9ybS1qZGJjL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9zdG9ybS9qZGJjL2JvbHQvSmRiY0xvb2t1cEJvbHRUZXN0LmphdmEKQEAgLTAsMCArMSw1OSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5zdG9ybS5qZGJjLmJvbHQ7CisKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS50dXBsZS5GaWVsZHM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5MaXN0czsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0b3JtLmpkYmMuY29tbW9uLkNvbHVtbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0b3JtLmpkYmMuY29tbW9uLkNvbm5lY3Rpb25Qcm92aWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0b3JtLmpkYmMuY29tbW9uLkhpa2FyaUNQQ29ubmVjdGlvblByb3ZpZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuc3Rvcm0uamRiYy5tYXBwZXIuSmRiY0xvb2t1cE1hcHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnN0b3JtLmpkYmMubWFwcGVyLkpkYmNNYXBwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5zdG9ybS5qZGJjLm1hcHBlci5TaW1wbGVKZGJjTG9va3VwTWFwcGVyOworaW1wb3J0IG9yZy5hcGFjaGUuc3Rvcm0uamRiYy5tYXBwZXIuU2ltcGxlSmRiY01hcHBlcjsKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworLyoqCisgKiBDcmVhdGVkIGJ5IHBicmFobWJoYXR0IG9uIDEwLzI5LzE1LgorICovCitwdWJsaWMgY2xhc3MgSmRiY0xvb2t1cEJvbHRUZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRpb24oKSB7CisgICAgICAgIENvbm5lY3Rpb25Qcm92aWRlciBwcm92aWRlciA9IG5ldyBIaWthcmlDUENvbm5lY3Rpb25Qcm92aWRlcihuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKSk7CisgICAgICAgIEpkYmNMb29rdXBNYXBwZXIgbWFwcGVyID0gbmV3IFNpbXBsZUpkYmNMb29rdXBNYXBwZXIobmV3IEZpZWxkcygidGVzdCIpLCBMaXN0cy5uZXdBcnJheUxpc3QobmV3IENvbHVtbigidGVzdCIsIDApKSk7CisgICAgICAgIFN0cmluZyBzZWxlY3RRdWVyeSA9ICJzZWxlY3QgKiBmcm9tIGR1YWwiOworICAgICAgICBleHBlY3RJbGxlZ2FBcmdzKG51bGwsIHNlbGVjdFF1ZXJ5LCBtYXBwZXIpOworICAgICAgICBleHBlY3RJbGxlZ2FBcmdzKHByb3ZpZGVyLCBudWxsLCBtYXBwZXIpOworICAgICAgICBleHBlY3RJbGxlZ2FBcmdzKHByb3ZpZGVyLCBzZWxlY3RRdWVyeSwgbnVsbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGV4cGVjdElsbGVnYUFyZ3MoQ29ubmVjdGlvblByb3ZpZGVyIHByb3ZpZGVyLCBTdHJpbmcgc2VsZWN0UXVlcnksIEpkYmNMb29rdXBNYXBwZXIgbWFwcGVyKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBKZGJjTG9va3VwQm9sdCBib2x0ID0gbmV3IEpkYmNMb29rdXBCb2x0KHByb3ZpZGVyLCBzZWxlY3RRdWVyeSwgbWFwcGVyKTsKKyAgICAgICAgICAgIEFzc2VydC5mYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLiIpOworICAgICAgICB9IGNhdGNoKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBuZSkgeworICAgICAgICAgICAgLy9leHBlY3RlZAorICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9leHRlcm5hbC9zdG9ybS1rYWZrYS9SRUFETUUubWQgYi9leHRlcm5hbC9zdG9ybS1rYWZrYS9SRUFETUUubWQKaW5kZXggOTFjNjRiZi4uMmZlOTMwZSAxMDA2NDQKLS0tIGEvZXh0ZXJuYWwvc3Rvcm0ta2Fma2EvUkVBRE1FLm1kCisrKyBiL2V4dGVybmFsL3N0b3JtLWthZmthL1JFQURNRS5tZApAQCAtNiwxNiArNiwxNiBAQAogIyNTcG91dHMKIFdlIHN1cHBvcnQgYm90aCBUcmlkZW50IGFuZCBjb3JlIFN0b3JtIHNwb3V0cy4gRm9yIGJvdGggc3BvdXQgaW1wbGVtZW50YXRpb25zLCB3ZSB1c2UgYSBCcm9rZXJIb3N0IGludGVyZmFjZSB0aGF0CiB0cmFja3MgS2Fma2EgYnJva2VyIGhvc3QgdG8gcGFydGl0aW9uIG1hcHBpbmcgYW5kIGthZmthQ29uZmlnIHRoYXQgY29udHJvbHMgc29tZSBLYWZrYSByZWxhdGVkIHBhcmFtZXRlcnMuCi0gCisKICMjI0Jyb2tlckhvc3RzCi1JbiBvcmRlciB0byBpbml0aWFsaXplIHlvdXIgS2Fma2Egc3BvdXQvZW1pdHRlciB5b3UgbmVlZCB0byBjb25zdHJ1Y3QgYW4gaW5zdGFuY2Ugb2YgdGhlIG1hcmtlciBpbnRlcmZhY2UgQnJva2VySG9zdHMuIAorSW4gb3JkZXIgdG8gaW5pdGlhbGl6ZSB5b3VyIEthZmthIHNwb3V0L2VtaXR0ZXIgeW91IG5lZWQgdG8gY29uc3RydWN0IGFuIGluc3RhbmNlIG9mIHRoZSBtYXJrZXIgaW50ZXJmYWNlIEJyb2tlckhvc3RzLgogQ3VycmVudGx5LCB3ZSBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgdHdvIGltcGxlbWVudGF0aW9uczoKIAogIyMjI1prSG9zdHMKLVprSG9zdHMgaXMgd2hhdCB5b3Ugc2hvdWxkIHVzZSBpZiB5b3Ugd2FudCB0byBkeW5hbWljYWxseSB0cmFjayBLYWZrYSBicm9rZXIgdG8gcGFydGl0aW9uIG1hcHBpbmcuIFRoaXMgY2xhc3MgdXNlcyAKK1prSG9zdHMgaXMgd2hhdCB5b3Ugc2hvdWxkIHVzZSBpZiB5b3Ugd2FudCB0byBkeW5hbWljYWxseSB0cmFjayBLYWZrYSBicm9rZXIgdG8gcGFydGl0aW9uIG1hcHBpbmcuIFRoaXMgY2xhc3MgdXNlcwogS2Fma2EncyBab29LZWVwZXIgZW50cmllcyB0byB0cmFjayBicm9rZXJIb3N0IC0+IHBhcnRpdGlvbiBtYXBwaW5nLiBZb3UgY2FuIGluc3RhbnRpYXRlIGFuIG9iamVjdCBieSBjYWxsaW5nCiBgYGBqYXZhCi0gICAgcHVibGljIFprSG9zdHMoU3RyaW5nIGJyb2tlclprU3RyLCBTdHJpbmcgYnJva2VyWmtQYXRoKSAKKyAgICBwdWJsaWMgWmtIb3N0cyhTdHJpbmcgYnJva2VyWmtTdHIsIFN0cmluZyBicm9rZXJaa1BhdGgpCiAgICAgcHVibGljIFprSG9zdHMoU3RyaW5nIGJyb2tlclprU3RyKQogYGBgCiBXaGVyZSBicm9rZXJaa1N0ciBpcyBqdXN0IGlwOnBvcnQgKGUuZy4gbG9jYWxob3N0OjIxODEpLiBicm9rZXJaa1BhdGggaXMgdGhlIHJvb3QgZGlyZWN0b3J5IHVuZGVyIHdoaWNoIGFsbCB0aGUgdG9waWNzIGFuZApAQCAtNDAsNyArNDAsNyBAQAogYGBgCiAKICMjI0thZmthQ29uZmlnCi1UaGUgc2Vjb25kIHRoaW5nIG5lZWRlZCBmb3IgY29uc3RydWN0aW5nIGEga2Fma2FTcG91dCBpcyBhbiBpbnN0YW5jZSBvZiBLYWZrYUNvbmZpZy4gCitUaGUgc2Vjb25kIHRoaW5nIG5lZWRlZCBmb3IgY29uc3RydWN0aW5nIGEga2Fma2FTcG91dCBpcyBhbiBpbnN0YW5jZSBvZiBLYWZrYUNvbmZpZy4KIGBgYGphdmEKICAgICBwdWJsaWMgS2Fma2FDb25maWcoQnJva2VySG9zdHMgaG9zdHMsIFN0cmluZyB0b3BpYykKICAgICBwdWJsaWMgS2Fma2FDb25maWcoQnJva2VySG9zdHMgaG9zdHMsIFN0cmluZyB0b3BpYywgU3RyaW5nIGNsaWVudElkKQpAQCAtMTAzLDkgKzEwMywxNyBAQAogICBwdWJsaWMgRmllbGRzIGdldE91dHB1dEZpZWxkcygpOwogYGBgCiAKLVRoZSBkZWZhdWx0IGBSYXdNdWx0aVNjaGVtZWAganVzdCB0YWtlcyB0aGUgYGJ5dGVbXWAgYW5kIHJldHVybnMgYSB0dXBsZSB3aXRoIGBieXRlW11gIGFzIGlzLiBUaGUgbmFtZSBvZiB0aGUKLW91dHB1dEZpZWxkIGlzICJieXRlcyIuICBUaGVyZSBhcmUgYWx0ZXJuYXRpdmUgaW1wbGVtZW50YXRpb24gbGlrZSBgU2NoZW1lQXNNdWx0aVNjaGVtZWAgYW5kCi1gS2V5VmFsdWVTY2hlbWVBc011bHRpU2NoZW1lYCB3aGljaCBjYW4gY29udmVydCB0aGUgYGJ5dGVbXWAgdG8gYFN0cmluZ2AuCitUaGUgZGVmYXVsdCBgUmF3TXVsdGlTY2hlbWVgIGp1c3QgdGFrZXMgdGhlIGBieXRlW11gIGFuZCByZXR1cm5zIGEgdHVwbGUgd2l0aCBgYnl0ZVtdYCBhcyBpcy4gVGhlIG5hbWUgb2YgdGhlIG91dHB1dEZpZWxkIGlzICJieXRlcyIuIFRoZXJlIGFyZSBhbHRlcm5hdGl2ZSBpbXBsZW1lbnRhdGlvbnMgbGlrZSBgU2NoZW1lQXNNdWx0aVNjaGVtZWAgYW5kIGBLZXlWYWx1ZVNjaGVtZUFzTXVsdGlTY2hlbWVgIHdoaWNoIGNhbiBjb252ZXJ0IHRoZSBgYnl0ZVtdYCB0byBgU3RyaW5nYC4KKworVGhlcmUgaXMgYWxzbyBhbiBleHRlbnNpb24gb2YgYFNjaGVtZUFzTXVsdGlTY2hlbWVgLCBgTWVzc2FnZU1ldGFkYXRhU2NoZW1lQXNNdWx0aVNjaGVtZWAsCit3aGljaCBoYXMgYW4gYWRkaXRpb25hbCBkZXNlcmlhbGl6ZSBtZXRob2QgdGhhdCBhY2NlcHRzIHRoZSBtZXNzYWdlIGBieXRlW11gIGluIGFkZGl0aW9uIHRvIHRoZSBgUGFydGl0aW9uYCBhbmQgYG9mZnNldGAgYXNzb2NpYXRlZCB3aXRoIHRoZSBtZXNzYWdlLgorCitgYGBqYXZhCitwdWJsaWMgSXRlcmFibGU8TGlzdDxPYmplY3Q+PiBkZXNlcmlhbGl6ZU1lc3NhZ2VXaXRoTWV0YWRhdGEoYnl0ZVtdIG1lc3NhZ2UsIFBhcnRpdGlvbiBwYXJ0aXRpb24sIGxvbmcgb2Zmc2V0KQorCitgYGAKKworVGhpcyBpcyB1c2VmdWwgZm9yIGF1ZGl0aW5nL3JlcGxheWluZyBtZXNzYWdlcyBmcm9tIGFyYml0cmFyeSBwb2ludHMgb24gYSBLYWZrYSB0b3BpYywgc2F2aW5nIHRoZSBwYXJ0aXRpb24gYW5kIG9mZnNldCBvZiBlYWNoIG1lc3NhZ2Ugb2YgYSBkaXNjcmV0ZSBzdHJlYW0gaW5zdGVhZCBvZiBwZXJzaXN0aW5nIHRoZSBlbnRpcmUgbWVzc2FnZS4KIAogCiAjIyMgRXhhbXBsZXMKQEAgLTE4NCw3ICsxOTIsNyBAQAogTm90ZSB0aGF0IHRoZSBab29LZWVwZXIgYW5kIGxvZzRqIGRlcGVuZGVuY2llcyBhcmUgZXhjbHVkZWQgdG8gcHJldmVudCB2ZXJzaW9uIGNvbmZsaWN0cyB3aXRoIFN0b3JtJ3MgZGVwZW5kZW5jaWVzLgogCiAjI1dyaXRpbmcgdG8gS2Fma2EgYXMgcGFydCBvZiB5b3VyIHRvcG9sb2d5Ci1Zb3UgY2FuIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiBzdG9ybS5rYWZrYS5ib2x0LkthZmthQm9sdCBhbmQgYXR0YWNoIGl0IGFzIGEgY29tcG9uZW50IHRvIHlvdXIgdG9wb2xvZ3kgb3IgaWYgeW91IAorWW91IGNhbiBjcmVhdGUgYW4gaW5zdGFuY2Ugb2Ygc3Rvcm0ua2Fma2EuYm9sdC5LYWZrYUJvbHQgYW5kIGF0dGFjaCBpdCBhcyBhIGNvbXBvbmVudCB0byB5b3VyIHRvcG9sb2d5IG9yIGlmIHlvdQogYXJlIHVzaW5nIHRyaWRlbnQgeW91IGNhbiB1c2Ugc3Rvcm0ua2Fma2EudHJpZGVudC5UcmlkZW50U3RhdGUsIHN0b3JtLmthZmthLnRyaWRlbnQuVHJpZGVudFN0YXRlRmFjdG9yeSBhbmQKIHN0b3JtLmthZmthLnRyaWRlbnQuVHJpZGVudEthZmthVXBkYXRlci4KIApAQCAtMTk5LDkgKzIwNyw5IEBACiBgYGAKIAogQXMgdGhlIG5hbWUgc3VnZ2VzdHMsIHRoZXNlIG1ldGhvZHMgYXJlIGNhbGxlZCB0byBtYXAgYSB0dXBsZSB0byBLYWZrYSBrZXkgYW5kIEthZmthIG1lc3NhZ2UuIElmIHlvdSBqdXN0IHdhbnQgb25lIGZpZWxkCi1hcyBrZXkgYW5kIG9uZSBmaWVsZCBhcyB2YWx1ZSwgdGhlbiB5b3UgY2FuIHVzZSB0aGUgcHJvdmlkZWQgRmllbGROYW1lQmFzZWRUdXBsZVRvS2Fma2FNYXBwZXIuamF2YSAKLWltcGxlbWVudGF0aW9uLiBJbiB0aGUgS2Fma2FCb2x0LCB0aGUgaW1wbGVtZW50YXRpb24gYWx3YXlzIGxvb2tzIGZvciBhIGZpZWxkIHdpdGggZmllbGQgbmFtZSAia2V5IiBhbmQgIm1lc3NhZ2UiIGlmIHlvdSAKLXVzZSB0aGUgZGVmYXVsdCBjb25zdHJ1Y3RvciB0byBjb25zdHJ1Y3QgRmllbGROYW1lQmFzZWRUdXBsZVRvS2Fma2FNYXBwZXIgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgCithcyBrZXkgYW5kIG9uZSBmaWVsZCBhcyB2YWx1ZSwgdGhlbiB5b3UgY2FuIHVzZSB0aGUgcHJvdmlkZWQgRmllbGROYW1lQmFzZWRUdXBsZVRvS2Fma2FNYXBwZXIuamF2YQoraW1wbGVtZW50YXRpb24uIEluIHRoZSBLYWZrYUJvbHQsIHRoZSBpbXBsZW1lbnRhdGlvbiBhbHdheXMgbG9va3MgZm9yIGEgZmllbGQgd2l0aCBmaWVsZCBuYW1lICJrZXkiIGFuZCAibWVzc2FnZSIgaWYgeW91Cit1c2UgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IgdG8gY29uc3RydWN0IEZpZWxkTmFtZUJhc2VkVHVwbGVUb0thZmthTWFwcGVyIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CiByZWFzb25zLiBBbHRlcm5hdGl2ZWx5IHlvdSBjb3VsZCBhbHNvIHNwZWNpZnkgYSBkaWZmZXJlbnQga2V5IGFuZCBtZXNzYWdlIGZpZWxkIGJ5IHVzaW5nIHRoZSBub24gZGVmYXVsdCBjb25zdHJ1Y3Rvci4KIEluIHRoZSBUcmlkZW50S2Fma2FTdGF0ZSB5b3UgbXVzdCBzcGVjaWZ5IHdoYXQgaXMgdGhlIGZpZWxkIG5hbWUgZm9yIGtleSBhbmQgbWVzc2FnZSBhcyB0aGVyZSBpcyBubyBkZWZhdWx0IGNvbnN0cnVjdG9yLgogVGhlc2Ugc2hvdWxkIGJlIHNwZWNpZmllZCB3aGlsZSBjb25zdHJ1Y3RpbmcgYW5kIGluc3RhbmNlIG9mIEZpZWxkTmFtZUJhc2VkVHVwbGVUb0thZmthTWFwcGVyLgpAQCAtMjEzLDIxICsyMjEsMzEgQEAKICAgICBTdHJpbmcgZ2V0VG9waWNzKFR1cGxlL1RyaWRlbnRUdXBsZSB0dXBsZSk7CiB9CiBgYGAKLVRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGludGVyZmFjZSBzaG91bGQgcmV0dXJuIHRoZSB0b3BpYyB0byB3aGljaCB0aGUgdHVwbGUncyBrZXkvbWVzc2FnZSBtYXBwaW5nIG5lZWRzIHRvIGJlIHB1Ymxpc2hlZCAKLVlvdSBjYW4gcmV0dXJuIGEgbnVsbCBhbmQgdGhlIG1lc3NhZ2Ugd2lsbCBiZSBpZ25vcmVkLiBJZiB5b3UgaGF2ZSBvbmUgc3RhdGljIHRvcGljIG5hbWUgdGhlbiB5b3UgY2FuIHVzZSAKK1RoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGludGVyZmFjZSBzaG91bGQgcmV0dXJuIHRoZSB0b3BpYyB0byB3aGljaCB0aGUgdHVwbGUncyBrZXkvbWVzc2FnZSBtYXBwaW5nIG5lZWRzIHRvIGJlIHB1Ymxpc2hlZAorWW91IGNhbiByZXR1cm4gYSBudWxsIGFuZCB0aGUgbWVzc2FnZSB3aWxsIGJlIGlnbm9yZWQuIElmIHlvdSBoYXZlIG9uZSBzdGF0aWMgdG9waWMgbmFtZSB0aGVuIHlvdSBjYW4gdXNlCiBEZWZhdWx0VG9waWNTZWxlY3Rvci5qYXZhIGFuZCBzZXQgdGhlIG5hbWUgb2YgdGhlIHRvcGljIGluIHRoZSBjb25zdHJ1Y3Rvci4KIAogIyMjIFNwZWNpZnlpbmcgS2Fma2EgcHJvZHVjZXIgcHJvcGVydGllcwotWW91IGNhbiBwcm92aWRlIGFsbCB0aGUgcHJvZHVjZSBwcm9wZXJ0aWVzICwgc2VlIGh0dHA6Ly9rYWZrYS5hcGFjaGUub3JnL2RvY3VtZW50YXRpb24uaHRtbCNwcm9kdWNlcmNvbmZpZ3MgCi1zZWN0aW9uICJJbXBvcnRhbnQgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIGZvciB0aGUgcHJvZHVjZXIiLCBpbiB5b3VyIFN0b3JtIHRvcG9sb2d5IGNvbmZpZyBieSBzZXR0aW5nIHRoZSBwcm9wZXJ0aWVzCi1tYXAgd2l0aCBrZXkga2Fma2EuYnJva2VyLnByb3BlcnRpZXMuCitZb3UgY2FuIHByb3ZpZGUgYWxsIHRoZSBwcm9kdWNlIHByb3BlcnRpZXMgaW4geW91ciBTdG9ybSB0b3BvbG9neSBieSBjYWxsaW5nIGBLYWZrYUJvbHQud2l0aFByb2R1Y2VyUHJvcGVydGllcygpYCBhbmQgYFRyaWRlbnRLYWZrYVN0YXRlRmFjdG9yeS53aXRoUHJvZHVjZXJQcm9wZXJ0aWVzKClgLiBQbGVhc2Ugc2VlICBodHRwOi8va2Fma2EuYXBhY2hlLm9yZy9kb2N1bWVudGF0aW9uLmh0bWwjbmV3cHJvZHVjZXJjb25maWdzCitTZWN0aW9uICJJbXBvcnRhbnQgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIGZvciB0aGUgcHJvZHVjZXIiIGZvciBtb3JlIGRldGFpbHMuCisKKyMjI1VzaW5nIHdpbGRjYXJkIGthZmthIHRvcGljIG1hdGNoCitZb3UgY2FuIGRvIGEgd2lsZGNhcmQgdG9waWMgbWF0Y2ggYnkgYWRkaW5nIHRoZSBmb2xsb3dpbmcgY29uZmlnCitgYGAKKyAgICAgQ29uZmlnIGNvbmZpZyA9IG5ldyBDb25maWcoKTsKKyAgICAgY29uZmlnLnB1dCgia2Fma2EudG9waWMud2lsZGNhcmQubWF0Y2giLHRydWUpOworCitgYGAKKworQWZ0ZXIgdGhpcyB5b3UgY2FuIHNwZWNpZnkgYSB3aWxkY2FyZCB0b3BpYyBmb3IgbWF0Y2hpbmcgZS5nLiBjbGlja3N0cmVhbS4qLmxvZy4gIFRoaXMgd2lsbCBtYXRjaCBhbGwgc3RyZWFtcyBtYXRjaGluZyBjbGlja3N0cmVhbS5teS5sb2csIGNsaWNrc3RyZWFtLmNhcnQubG9nIGV0YworCiAKICMjI1B1dHRpbmcgaXQgYWxsIHRvZ2V0aGVyCiAKIEZvciB0aGUgYm9sdCA6CiBgYGBqYXZhCiAgICAgICAgIFRvcG9sb2d5QnVpbGRlciBidWlsZGVyID0gbmV3IFRvcG9sb2d5QnVpbGRlcigpOwotICAgIAorCiAgICAgICAgIEZpZWxkcyBmaWVsZHMgPSBuZXcgRmllbGRzKCJrZXkiLCAibWVzc2FnZSIpOwogICAgICAgICBGaXhlZEJhdGNoU3BvdXQgc3BvdXQgPSBuZXcgRml4ZWRCYXRjaFNwb3V0KGZpZWxkcywgNCwKICAgICAgICAgICAgICAgICAgICAgbmV3IFZhbHVlcygic3Rvcm0iLCAiMSIpLApAQCAtMjM3LDE5ICsyNTUsMjEgQEAKICAgICAgICAgKTsKICAgICAgICAgc3BvdXQuc2V0Q3ljbGUodHJ1ZSk7CiAgICAgICAgIGJ1aWxkZXIuc2V0U3BvdXQoInNwb3V0Iiwgc3BvdXQsIDUpOworICAgICAgICAvL3NldCBwcm9kdWNlciBwcm9wZXJ0aWVzLgorICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgcHJvcHMucHV0KCJib290c3RyYXAuc2VydmVycyIsICJsb2NhbGhvc3Q6OTA5MiIpOworICAgICAgICBwcm9wcy5wdXQoImFja3MiLCAiMSIpOworICAgICAgICBwcm9wcy5wdXQoImtleS5zZXJpYWxpemVyIiwgIm9yZy5hcGFjaGUua2Fma2EuY29tbW9uLnNlcmlhbGl6YXRpb24uU3RyaW5nU2VyaWFsaXplciIpOworICAgICAgICBwcm9wcy5wdXQoInZhbHVlLnNlcmlhbGl6ZXIiLCAib3JnLmFwYWNoZS5rYWZrYS5jb21tb24uc2VyaWFsaXphdGlvbi5TdHJpbmdTZXJpYWxpemVyIik7CisKICAgICAgICAgS2Fma2FCb2x0IGJvbHQgPSBuZXcgS2Fma2FCb2x0KCkKKyAgICAgICAgICAgICAgICAud2l0aFByb2R1Y2VyUHJvcGVydGllcyhwcm9wcykKICAgICAgICAgICAgICAgICAud2l0aFRvcGljU2VsZWN0b3IobmV3IERlZmF1bHRUb3BpY1NlbGVjdG9yKCJ0ZXN0IikpCiAgICAgICAgICAgICAgICAgLndpdGhUdXBsZVRvS2Fma2FNYXBwZXIobmV3IEZpZWxkTmFtZUJhc2VkVHVwbGVUb0thZmthTWFwcGVyKCkpOwogICAgICAgICBidWlsZGVyLnNldEJvbHQoImZvcndhcmRUb0thZmthIiwgYm9sdCwgOCkuc2h1ZmZsZUdyb3VwaW5nKCJzcG91dCIpOwotICAgICAgICAKKwogICAgICAgICBDb25maWcgY29uZiA9IG5ldyBDb25maWcoKTsKLSAgICAgICAgLy9zZXQgcHJvZHVjZXIgcHJvcGVydGllcy4KLSAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIHByb3BzLnB1dCgibWV0YWRhdGEuYnJva2VyLmxpc3QiLCAibG9jYWxob3N0OjkwOTIiKTsKLSAgICAgICAgcHJvcHMucHV0KCJyZXF1ZXN0LnJlcXVpcmVkLmFja3MiLCAiMSIpOwotICAgICAgICBwcm9wcy5wdXQoInNlcmlhbGl6ZXIuY2xhc3MiLCAia2Fma2Euc2VyaWFsaXplci5TdHJpbmdFbmNvZGVyIik7Ci0gICAgICAgIGNvbmYucHV0KEthZmthQm9sdC5LQUZLQV9CUk9LRVJfUFJPUEVSVElFUywgcHJvcHMpOwotICAgICAgICAKKwogICAgICAgICBTdG9ybVN1Ym1pdHRlci5zdWJtaXRUb3BvbG9neSgia2Fma2Fib2x0VGVzdCIsIGNvbmYsIGJ1aWxkZXIuY3JlYXRlVG9wb2xvZ3koKSk7CiBgYGAKIApAQCAtMjY4LDE4ICsyODgsMjAgQEAKICAgICAgICAgVHJpZGVudFRvcG9sb2d5IHRvcG9sb2d5ID0gbmV3IFRyaWRlbnRUb3BvbG9neSgpOwogICAgICAgICBTdHJlYW0gc3RyZWFtID0gdG9wb2xvZ3kubmV3U3RyZWFtKCJzcG91dDEiLCBzcG91dCk7CiAKKyAgICAgICAgLy9zZXQgcHJvZHVjZXIgcHJvcGVydGllcy4KKyAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIHByb3BzLnB1dCgiYm9vdHN0cmFwLnNlcnZlcnMiLCAibG9jYWxob3N0OjkwOTIiKTsKKyAgICAgICAgcHJvcHMucHV0KCJhY2tzIiwgIjEiKTsKKyAgICAgICAgcHJvcHMucHV0KCJrZXkuc2VyaWFsaXplciIsICJvcmcuYXBhY2hlLmthZmthLmNvbW1vbi5zZXJpYWxpemF0aW9uLlN0cmluZ1NlcmlhbGl6ZXIiKTsKKyAgICAgICAgcHJvcHMucHV0KCJ2YWx1ZS5zZXJpYWxpemVyIiwgIm9yZy5hcGFjaGUua2Fma2EuY29tbW9uLnNlcmlhbGl6YXRpb24uU3RyaW5nU2VyaWFsaXplciIpOworCiAgICAgICAgIFRyaWRlbnRLYWZrYVN0YXRlRmFjdG9yeSBzdGF0ZUZhY3RvcnkgPSBuZXcgVHJpZGVudEthZmthU3RhdGVGYWN0b3J5KCkKKyAgICAgICAgICAgICAgICAud2l0aFByb2R1Y2VyUHJvcGVydGllcyhwcm9wcykKICAgICAgICAgICAgICAgICAud2l0aEthZmthVG9waWNTZWxlY3RvcihuZXcgRGVmYXVsdFRvcGljU2VsZWN0b3IoInRlc3QiKSkKICAgICAgICAgICAgICAgICAud2l0aFRyaWRlbnRUdXBsZVRvS2Fma2FNYXBwZXIobmV3IEZpZWxkTmFtZUJhc2VkVHVwbGVUb0thZmthTWFwcGVyKCJ3b3JkIiwgImNvdW50IikpOwogICAgICAgICBzdHJlYW0ucGFydGl0aW9uUGVyc2lzdChzdGF0ZUZhY3RvcnksIGZpZWxkcywgbmV3IFRyaWRlbnRLYWZrYVVwZGF0ZXIoKSwgbmV3IEZpZWxkcygpKTsKIAogICAgICAgICBDb25maWcgY29uZiA9IG5ldyBDb25maWcoKTsKLSAgICAgICAgLy9zZXQgcHJvZHVjZXIgcHJvcGVydGllcy4KLSAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIHByb3BzLnB1dCgibWV0YWRhdGEuYnJva2VyLmxpc3QiLCAibG9jYWxob3N0OjkwOTIiKTsKLSAgICAgICAgcHJvcHMucHV0KCJyZXF1ZXN0LnJlcXVpcmVkLmFja3MiLCAiMSIpOwotICAgICAgICBwcm9wcy5wdXQoInNlcmlhbGl6ZXIuY2xhc3MiLCAia2Fma2Euc2VyaWFsaXplci5TdHJpbmdFbmNvZGVyIik7Ci0gICAgICAgIGNvbmYucHV0KFRyaWRlbnRLYWZrYVN0YXRlLktBRktBX0JST0tFUl9QUk9QRVJUSUVTLCBwcm9wcyk7CiAgICAgICAgIFN0b3JtU3VibWl0dGVyLnN1Ym1pdFRvcG9sb2d5KCJrYWZrYVRyaWRlbnRUZXN0IiwgY29uZiwgdG9wb2xvZ3kuYnVpbGQoKSk7CiBgYGAKIApkaWZmIC0tZ2l0IGEvZXh0ZXJuYWwvc3Rvcm0ta2Fma2EvcG9tLnhtbCBiL2V4dGVybmFsL3N0b3JtLWthZmthL3BvbS54bWwKaW5kZXggYzczMWEwZi4uOGYyODY3YiAxMDA2NDQKLS0tIGEvZXh0ZXJuYWwvc3Rvcm0ta2Fma2EvcG9tLnhtbAorKysgYi9leHRlcm5hbC9zdG9ybS1rYWZrYS9wb20ueG1sCkBAIC01Nyw2ICs1NywxMSBAQAogICAgIDwvYnVpbGQ+CiAgICAgPGRlcGVuZGVuY2llcz4KICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWlvPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1pbzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb2NraXRvPC9ncm91cElkPgogICAgICAgICAgICAgPGFydGlmYWN0SWQ+bW9ja2l0by1hbGw8L2FydGlmYWN0SWQ+CiAgICAgICAgICAgICA8dmVyc2lvbj4xLjkuMDwvdmVyc2lvbj4KZGlmZiAtLWdpdCBhL2V4dGVybmFsL3N0b3JtLWthZmthL3NyYy9qdm0vc3Rvcm0va2Fma2EvRHluYW1pY0Jyb2tlcnNSZWFkZXIuamF2YSBiL2V4dGVybmFsL3N0b3JtLWthZmthL3NyYy9qdm0vc3Rvcm0va2Fma2EvRHluYW1pY0Jyb2tlcnNSZWFkZXIuamF2YQppbmRleCBkMzc5MDYxLi5kMGY2NzI0IDEwMDY0NAotLS0gYS9leHRlcm5hbC9zdG9ybS1rYWZrYS9zcmMvanZtL3N0b3JtL2thZmthL0R5bmFtaWNCcm9rZXJzUmVhZGVyLmphdmEKKysrIGIvZXh0ZXJuYWwvc3Rvcm0ta2Fma2Evc3JjL2p2bS9zdG9ybS9rYWZrYS9EeW5hbWljQnJva2Vyc1JlYWRlci5qYXZhCkBAIC0zMCw5ICszMCwxMSBAQAogCiBpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwogaW1wb3J0IGphdmEubmV0LlNvY2tldFRpbWVvdXRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCisKIHB1YmxpYyBjbGFzcyBEeW5hbWljQnJva2Vyc1JlYWRlciB7CiAKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihEeW5hbWljQnJva2Vyc1JlYWRlci5jbGFzcyk7CkBAIC00MCw2ICs0Miw3IEBACiAgICAgcHJpdmF0ZSBDdXJhdG9yRnJhbWV3b3JrIF9jdXJhdG9yOwogICAgIHByaXZhdGUgU3RyaW5nIF96a1BhdGg7CiAgICAgcHJpdmF0ZSBTdHJpbmcgX3RvcGljOworICAgIHByaXZhdGUgQm9vbGVhbiBfaXNXaWxkY2FyZFRvcGljOwogCiAgICAgcHVibGljIER5bmFtaWNCcm9rZXJzUmVhZGVyKE1hcCBjb25mLCBTdHJpbmcgemtTdHIsIFN0cmluZyB6a1BhdGgsIFN0cmluZyB0b3BpYykgewogICAgICAgICAvLyBDaGVjayByZXF1aXJlZCBwYXJhbWV0ZXJzCkBAIC01Myw2ICs1Niw3IEBACiAKICAgICAgICAgX3prUGF0aCA9IHprUGF0aDsKICAgICAgICAgX3RvcGljID0gdG9waWM7CisgICAgICAgIF9pc1dpbGRjYXJkVG9waWMgPSBVdGlscy5nZXRCb29sZWFuKGNvbmYuZ2V0KCJrYWZrYS50b3BpYy53aWxkY2FyZC5tYXRjaCIpLCBmYWxzZSk7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBfY3VyYXRvciA9IEN1cmF0b3JGcmFtZXdvcmtGYWN0b3J5Lm5ld0NsaWVudCgKICAgICAgICAgICAgICAgICAgICAgemtTdHIsCkBAIC03MCwzNSArNzQsNDAgQEAKICAgICAvKioKICAgICAgKiBHZXQgYWxsIHBhcnRpdGlvbnMgd2l0aCB0aGVpciBjdXJyZW50IGxlYWRlcnMKICAgICAgKi8KLSAgICBwdWJsaWMgR2xvYmFsUGFydGl0aW9uSW5mb3JtYXRpb24gZ2V0QnJva2VySW5mbygpIHRocm93cyBTb2NrZXRUaW1lb3V0RXhjZXB0aW9uIHsKLSAgICAgIEdsb2JhbFBhcnRpdGlvbkluZm9ybWF0aW9uIGdsb2JhbFBhcnRpdGlvbkluZm9ybWF0aW9uID0gbmV3IEdsb2JhbFBhcnRpdGlvbkluZm9ybWF0aW9uKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpbnQgbnVtUGFydGl0aW9uc0ZvclRvcGljID0gZ2V0TnVtUGFydGl0aW9ucygpOwotICAgICAgICAgICAgU3RyaW5nIGJyb2tlckluZm9QYXRoID0gYnJva2VyUGF0aCgpOwotICAgICAgICAgICAgZm9yIChpbnQgcGFydGl0aW9uID0gMDsgcGFydGl0aW9uIDwgbnVtUGFydGl0aW9uc0ZvclRvcGljOyBwYXJ0aXRpb24rKykgewotICAgICAgICAgICAgICAgIGludCBsZWFkZXIgPSBnZXRMZWFkZXJGb3IocGFydGl0aW9uKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IGJyb2tlckluZm9QYXRoICsgIi8iICsgbGVhZGVyOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBicm9rZXJEYXRhID0gX2N1cmF0b3IuZ2V0RGF0YSgpLmZvclBhdGgocGF0aCk7Ci0gICAgICAgICAgICAgICAgICAgIEJyb2tlciBocCA9IGdldEJyb2tlckhvc3QoYnJva2VyRGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgIGdsb2JhbFBhcnRpdGlvbkluZm9ybWF0aW9uLmFkZFBhcnRpdGlvbihwYXJ0aXRpb24sIGhwKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChvcmcuYXBhY2hlLnpvb2tlZXBlci5LZWVwZXJFeGNlcHRpb24uTm9Ob2RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgTE9HLmVycm9yKCJOb2RlIHt9IGRvZXMgbm90IGV4aXN0ICIsIHBhdGgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoU29ja2V0VGltZW91dEV4Y2VwdGlvbiBlKSB7Ci0JCQkJCXRocm93IGU7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICBMT0cuaW5mbygiUmVhZCBwYXJ0aXRpb24gaW5mbyBmcm9tIHpvb2tlZXBlcjogIiArIGdsb2JhbFBhcnRpdGlvbkluZm9ybWF0aW9uKTsKLSAgICAgICAgcmV0dXJuIGdsb2JhbFBhcnRpdGlvbkluZm9ybWF0aW9uOworICAgIHB1YmxpYyBMaXN0PEdsb2JhbFBhcnRpdGlvbkluZm9ybWF0aW9uPiBnZXRCcm9rZXJJbmZvKCkgdGhyb3dzIFNvY2tldFRpbWVvdXRFeGNlcHRpb24geworICAgICAgTGlzdDxTdHJpbmc+IHRvcGljcyA9ICBnZXRUb3BpY3MoKTsKKyAgICAgIExpc3Q8R2xvYmFsUGFydGl0aW9uSW5mb3JtYXRpb24+IHBhcnRpdGlvbnMgPSAgbmV3IEFycmF5TGlzdDxHbG9iYWxQYXJ0aXRpb25JbmZvcm1hdGlvbj4oKTsKKworICAgICAgZm9yIChTdHJpbmcgdG9waWMgOiB0b3BpY3MpIHsKKyAgICAgICAgICBHbG9iYWxQYXJ0aXRpb25JbmZvcm1hdGlvbiBnbG9iYWxQYXJ0aXRpb25JbmZvcm1hdGlvbiA9IG5ldyBHbG9iYWxQYXJ0aXRpb25JbmZvcm1hdGlvbih0b3BpYywgdGhpcy5faXNXaWxkY2FyZFRvcGljKTsKKyAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICBpbnQgbnVtUGFydGl0aW9uc0ZvclRvcGljID0gZ2V0TnVtUGFydGl0aW9ucyh0b3BpYyk7CisgICAgICAgICAgICAgIFN0cmluZyBicm9rZXJJbmZvUGF0aCA9IGJyb2tlclBhdGgoKTsKKyAgICAgICAgICAgICAgZm9yIChpbnQgcGFydGl0aW9uID0gMDsgcGFydGl0aW9uIDwgbnVtUGFydGl0aW9uc0ZvclRvcGljOyBwYXJ0aXRpb24rKykgeworICAgICAgICAgICAgICAgICAgaW50IGxlYWRlciA9IGdldExlYWRlckZvcih0b3BpYyxwYXJ0aXRpb24pOworICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhdGggPSBicm9rZXJJbmZvUGF0aCArICIvIiArIGxlYWRlcjsKKyAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGJyb2tlckRhdGEgPSBfY3VyYXRvci5nZXREYXRhKCkuZm9yUGF0aChwYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgICBCcm9rZXIgaHAgPSBnZXRCcm9rZXJIb3N0KGJyb2tlckRhdGEpOworICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbFBhcnRpdGlvbkluZm9ybWF0aW9uLmFkZFBhcnRpdGlvbihwYXJ0aXRpb24sIGhwKTsKKyAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKG9yZy5hcGFjaGUuem9va2VlcGVyLktlZXBlckV4Y2VwdGlvbi5Ob05vZGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgIExPRy5lcnJvcigiTm9kZSB7fSBkb2VzIG5vdCBleGlzdCAiLCBwYXRoKTsKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0gY2F0Y2ggKFNvY2tldFRpbWVvdXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICAgIH0KKyAgICAgICAgICBMT0cuaW5mbygiUmVhZCBwYXJ0aXRpb24gaW5mbyBmcm9tIHpvb2tlZXBlcjogIiArIGdsb2JhbFBhcnRpdGlvbkluZm9ybWF0aW9uKTsKKyAgICAgICAgICBwYXJ0aXRpb25zLmFkZChnbG9iYWxQYXJ0aXRpb25JbmZvcm1hdGlvbik7CisgICAgICB9CisgICAgICAgIHJldHVybiBwYXJ0aXRpb25zOwogICAgIH0KIAotCi0gICAgcHJpdmF0ZSBpbnQgZ2V0TnVtUGFydGl0aW9ucygpIHsKKyAgICBwcml2YXRlIGludCBnZXROdW1QYXJ0aXRpb25zKFN0cmluZyB0b3BpYykgewogICAgICAgICB0cnkgewotICAgICAgICAgICAgU3RyaW5nIHRvcGljQnJva2Vyc1BhdGggPSBwYXJ0aXRpb25QYXRoKCk7CisgICAgICAgICAgICBTdHJpbmcgdG9waWNCcm9rZXJzUGF0aCA9IHBhcnRpdGlvblBhdGgodG9waWMpOwogICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGNoaWxkcmVuID0gX2N1cmF0b3IuZ2V0Q2hpbGRyZW4oKS5mb3JQYXRoKHRvcGljQnJva2Vyc1BhdGgpOwogICAgICAgICAgICAgcmV0dXJuIGNoaWxkcmVuLnNpemUoKTsKICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKQEAgLTEwNiwyNCArMTE1LDUwIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgU3RyaW5nIHBhcnRpdGlvblBhdGgoKSB7Ci0gICAgICAgIHJldHVybiBfemtQYXRoICsgIi90b3BpY3MvIiArIF90b3BpYyArICIvcGFydGl0aW9ucyI7CisgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gZ2V0VG9waWNzKCkgeworICAgICAgICBMaXN0PFN0cmluZz4gdG9waWNzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgICAgIGlmICghX2lzV2lsZGNhcmRUb3BpYykgeworICAgICAgICAgICAgdG9waWNzLmFkZChfdG9waWMpOworICAgICAgICAgICAgcmV0dXJuIHRvcGljczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGNoaWxkcmVuID0gX2N1cmF0b3IuZ2V0Q2hpbGRyZW4oKS5mb3JQYXRoKHRvcGljc1BhdGgoKSk7CisgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgdCA6IGNoaWxkcmVuKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0Lm1hdGNoZXMoX3RvcGljKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HLmluZm8oU3RyaW5nLmZvcm1hdCgiRm91bmQgbWF0Y2hpbmcgdG9waWMgJXMiLCB0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0b3BpY3MuYWRkKHQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiB0b3BpY3M7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0b3BpY3NQYXRoICgpIHsKKyAgICAgICAgcmV0dXJuIF96a1BhdGggKyAiL3RvcGljcyI7CisgICAgfQorICAgIHB1YmxpYyBTdHJpbmcgcGFydGl0aW9uUGF0aChTdHJpbmcgdG9waWMpIHsKKyAgICAgICAgcmV0dXJuIHRvcGljc1BhdGgoKSArICIvIiArIHRvcGljICsgIi9wYXJ0aXRpb25zIjsKICAgICB9CiAKICAgICBwdWJsaWMgU3RyaW5nIGJyb2tlclBhdGgoKSB7CiAgICAgICAgIHJldHVybiBfemtQYXRoICsgIi9pZHMiOwogICAgIH0KIAorCisKICAgICAvKioKICAgICAgKiBnZXQgL2Jyb2tlcnMvdG9waWNzL2Rpc3RyaWJ1dGVkVG9waWMvcGFydGl0aW9ucy8xL3N0YXRlCiAgICAgICogeyAiY29udHJvbGxlcl9lcG9jaCI6NCwgImlzciI6WyAxLCAwIF0sICJsZWFkZXIiOjEsICJsZWFkZXJfZXBvY2giOjEsICJ2ZXJzaW9uIjoxIH0KLSAgICAgKgorICAgICAqIEBwYXJhbSB0b3BpYwogICAgICAqIEBwYXJhbSBwYXJ0aXRpb24KICAgICAgKiBAcmV0dXJuCiAgICAgICovCi0gICAgcHJpdmF0ZSBpbnQgZ2V0TGVhZGVyRm9yKGxvbmcgcGFydGl0aW9uKSB7CisgICAgcHJpdmF0ZSBpbnQgZ2V0TGVhZGVyRm9yKFN0cmluZyB0b3BpYywgbG9uZyBwYXJ0aXRpb24pIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFN0cmluZyB0b3BpY0Jyb2tlcnNQYXRoID0gcGFydGl0aW9uUGF0aCgpOworICAgICAgICAgICAgU3RyaW5nIHRvcGljQnJva2Vyc1BhdGggPSBwYXJ0aXRpb25QYXRoKHRvcGljKTsKICAgICAgICAgICAgIGJ5dGVbXSBob3N0UG9ydERhdGEgPSBfY3VyYXRvci5nZXREYXRhKCkuZm9yUGF0aCh0b3BpY0Jyb2tlcnNQYXRoICsgIi8iICsgcGFydGl0aW9uICsgIi9zdGF0ZSIpOwogICAgICAgICAgICAgTWFwPE9iamVjdCwgT2JqZWN0PiB2YWx1ZSA9IChNYXA8T2JqZWN0LCBPYmplY3Q+KSBKU09OVmFsdWUucGFyc2UobmV3IFN0cmluZyhob3N0UG9ydERhdGEsICJVVEYtOCIpKTsKICAgICAgICAgICAgIEludGVnZXIgbGVhZGVyID0gKChOdW1iZXIpIHZhbHVlLmdldCgibGVhZGVyIikpLmludFZhbHVlKCk7CmRpZmYgLS1naXQgYS9leHRlcm5hbC9zdG9ybS1rYWZrYS9zcmMvanZtL3N0b3JtL2thZmthL0R5bmFtaWNQYXJ0aXRpb25Db25uZWN0aW9ucy5qYXZhIGIvZXh0ZXJuYWwvc3Rvcm0ta2Fma2Evc3JjL2p2bS9zdG9ybS9rYWZrYS9EeW5hbWljUGFydGl0aW9uQ29ubmVjdGlvbnMuamF2YQppbmRleCBmNTUwODU4Li5lMjM3YTdhIDEwMDY0NAotLS0gYS9leHRlcm5hbC9zdG9ybS1rYWZrYS9zcmMvanZtL3N0b3JtL2thZmthL0R5bmFtaWNQYXJ0aXRpb25Db25uZWN0aW9ucy5qYXZhCisrKyBiL2V4dGVybmFsL3N0b3JtLWthZmthL3NyYy9qdm0vc3Rvcm0va2Fma2EvRHluYW1pY1BhcnRpdGlvbkNvbm5lY3Rpb25zLmphdmEKQEAgLTM0LDcgKzM0LDcgQEAKIAogICAgIHN0YXRpYyBjbGFzcyBDb25uZWN0aW9uSW5mbyB7CiAgICAgICAgIFNpbXBsZUNvbnN1bWVyIGNvbnN1bWVyOwotICAgICAgICBTZXQ8SW50ZWdlcj4gcGFydGl0aW9ucyA9IG5ldyBIYXNoU2V0KCk7CisgICAgICAgIFNldDxTdHJpbmc+IHBhcnRpdGlvbnMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CiAKICAgICAgICAgcHVibGljIENvbm5lY3Rpb25JbmZvKFNpbXBsZUNvbnN1bWVyIGNvbnN1bWVyKSB7CiAgICAgICAgICAgICB0aGlzLmNvbnN1bWVyID0gY29uc3VtZXI7CkBAIC01MSwxNiArNTEsMTYgQEAKICAgICB9CiAKICAgICBwdWJsaWMgU2ltcGxlQ29uc3VtZXIgcmVnaXN0ZXIoUGFydGl0aW9uIHBhcnRpdGlvbikgewotICAgICAgICBCcm9rZXIgYnJva2VyID0gX3JlYWRlci5nZXRDdXJyZW50QnJva2VycygpLmdldEJyb2tlckZvcihwYXJ0aXRpb24ucGFydGl0aW9uKTsKLSAgICAgICAgcmV0dXJuIHJlZ2lzdGVyKGJyb2tlciwgcGFydGl0aW9uLnBhcnRpdGlvbik7CisgICAgICAgIEJyb2tlciBicm9rZXIgPSBfcmVhZGVyLmdldEJyb2tlckZvclRvcGljKHBhcnRpdGlvbi50b3BpYykuZ2V0QnJva2VyRm9yKHBhcnRpdGlvbi5wYXJ0aXRpb24pOworICAgICAgICByZXR1cm4gcmVnaXN0ZXIoYnJva2VyLCBwYXJ0aXRpb24udG9waWMsIHBhcnRpdGlvbi5wYXJ0aXRpb24pOwogICAgIH0KIAotICAgIHB1YmxpYyBTaW1wbGVDb25zdW1lciByZWdpc3RlcihCcm9rZXIgaG9zdCwgaW50IHBhcnRpdGlvbikgeworICAgIHB1YmxpYyBTaW1wbGVDb25zdW1lciByZWdpc3RlcihCcm9rZXIgaG9zdCwgU3RyaW5nIHRvcGljLCBpbnQgcGFydGl0aW9uKSB7CiAgICAgICAgIGlmICghX2Nvbm5lY3Rpb25zLmNvbnRhaW5zS2V5KGhvc3QpKSB7CiAgICAgICAgICAgICBfY29ubmVjdGlvbnMucHV0KGhvc3QsIG5ldyBDb25uZWN0aW9uSW5mbyhuZXcgU2ltcGxlQ29uc3VtZXIoaG9zdC5ob3N0LCBob3N0LnBvcnQsIF9jb25maWcuc29ja2V0VGltZW91dE1zLCBfY29uZmlnLmJ1ZmZlclNpemVCeXRlcywgX2NvbmZpZy5jbGllbnRJZCkpKTsKICAgICAgICAgfQogICAgICAgICBDb25uZWN0aW9uSW5mbyBpbmZvID0gX2Nvbm5lY3Rpb25zLmdldChob3N0KTsKLSAgICAgICAgaW5mby5wYXJ0aXRpb25zLmFkZChwYXJ0aXRpb24pOworICAgICAgICBpbmZvLnBhcnRpdGlvbnMuYWRkKGdldEhhc2hLZXkodG9waWMscGFydGl0aW9uKSk7CiAgICAgICAgIHJldHVybiBpbmZvLmNvbnN1bWVyOwogICAgIH0KIApAQCAtNzIsOSArNzIsOSBAQAogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyKEJyb2tlciBwb3J0LCBpbnQgcGFydGl0aW9uKSB7CisgICAgcHVibGljIHZvaWQgdW5yZWdpc3RlcihCcm9rZXIgcG9ydCwgU3RyaW5nIHRvcGljLCBpbnQgcGFydGl0aW9uKSB7CiAgICAgICAgIENvbm5lY3Rpb25JbmZvIGluZm8gPSBfY29ubmVjdGlvbnMuZ2V0KHBvcnQpOwotICAgICAgICBpbmZvLnBhcnRpdGlvbnMucmVtb3ZlKHBhcnRpdGlvbik7CisgICAgICAgIGluZm8ucGFydGl0aW9ucy5yZW1vdmUoZ2V0SGFzaEtleSh0b3BpYyxwYXJ0aXRpb24pKTsKICAgICAgICAgaWYgKGluZm8ucGFydGl0aW9ucy5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIGluZm8uY29uc3VtZXIuY2xvc2UoKTsKICAgICAgICAgICAgIF9jb25uZWN0aW9ucy5yZW1vdmUocG9ydCk7CkBAIC04Miw3ICs4Miw3IEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdW5yZWdpc3RlcihQYXJ0aXRpb24gcGFydGl0aW9uKSB7Ci0gICAgICAgIHVucmVnaXN0ZXIocGFydGl0aW9uLmhvc3QsIHBhcnRpdGlvbi5wYXJ0aXRpb24pOworICAgICAgICB1bnJlZ2lzdGVyKHBhcnRpdGlvbi5ob3N0LCBwYXJ0aXRpb24udG9waWMsIHBhcnRpdGlvbi5wYXJ0aXRpb24pOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewpAQCAtOTEsNCArOTEsOCBAQAogICAgICAgICB9CiAgICAgICAgIF9jb25uZWN0aW9ucy5jbGVhcigpOwogICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdldEhhc2hLZXkoU3RyaW5nIHRvcGljLCBpbnQgcGFydGl0aW9uKSB7CisgICAgICAgIHJldHVybiB0b3BpYyArICJfIiArIHBhcnRpdGlvbjsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9leHRlcm5hbC9zdG9ybS1rYWZrYS9zcmMvanZtL3N0b3JtL2thZmthL0thZmthQ29uZmlnLmphdmEgYi9leHRlcm5hbC9zdG9ybS1rYWZrYS9zcmMvanZtL3N0b3JtL2thZmthL0thZmthQ29uZmlnLmphdmEKaW5kZXggZGQ3MWI1YS4uNDljNzUyNiAxMDA2NDQKLS0tIGEvZXh0ZXJuYWwvc3Rvcm0ta2Fma2Evc3JjL2p2bS9zdG9ybS9rYWZrYS9LYWZrYUNvbmZpZy5qYXZhCisrKyBiL2V4dGVybmFsL3N0b3JtLWthZmthL3NyYy9qdm0vc3Rvcm0va2Fma2EvS2Fma2FDb25maWcuamF2YQpAQCAtMjMsNyArMjMsOCBAQAogaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwogCiBwdWJsaWMgY2xhc3MgS2Fma2FDb25maWcgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNTI3NjcxODczNDU3MTYyMzg1NUw7CisgICAgCiAgICAgcHVibGljIGZpbmFsIEJyb2tlckhvc3RzIGhvc3RzOwogICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgdG9waWM7CiAgICAgcHVibGljIGZpbmFsIFN0cmluZyBjbGllbnRJZDsKZGlmZiAtLWdpdCBhL2V4dGVybmFsL3N0b3JtLWthZmthL3NyYy9qdm0vc3Rvcm0va2Fma2EvS2Fma2FTcG91dC5qYXZhIGIvZXh0ZXJuYWwvc3Rvcm0ta2Fma2Evc3JjL2p2bS9zdG9ybS9rYWZrYS9LYWZrYVNwb3V0LmphdmEKaW5kZXggMzI2MGFkMS4uZDE2NjU5ZiAxMDA2NDQKLS0tIGEvZXh0ZXJuYWwvc3Rvcm0ta2Fma2Evc3JjL2p2bS9zdG9ybS9rYWZrYS9LYWZrYVNwb3V0LmphdmEKKysrIGIvZXh0ZXJuYWwvc3Rvcm0ta2Fma2Evc3JjL2p2bS9zdG9ybS9rYWZrYS9LYWZrYVNwb3V0LmphdmEKQEAgLTYsOSArNiw5IEBACiAgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCiAgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCiAgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgorICogPHAvPgogICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgorICogPHAvPgogICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgpAQCAtNTEsNyArNTEsNiBAQAogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoS2Fma2FTcG91dC5jbGFzcyk7CiAKLSAgICBTdHJpbmcgX3V1aWQgPSBVVUlELnJhbmRvbVVVSUQoKS50b1N0cmluZygpOwogICAgIFNwb3V0Q29uZmlnIF9zcG91dENvbmZpZzsKICAgICBTcG91dE91dHB1dENvbGxlY3RvciBfY29sbGVjdG9yOwogICAgIFBhcnRpdGlvbkNvb3JkaW5hdG9yIF9jb29yZGluYXRvcjsKQEAgLTY5LDcgKzY4LDcgQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBvcGVuKE1hcCBjb25mLCBmaW5hbCBUb3BvbG9neUNvbnRleHQgY29udGV4dCwgZmluYWwgU3BvdXRPdXRwdXRDb2xsZWN0b3IgY29sbGVjdG9yKSB7CiAgICAgICAgIF9jb2xsZWN0b3IgPSBjb2xsZWN0b3I7Ci0KKyAgICAgICAgU3RyaW5nIHRvcG9sb2d5SW5zdGFuY2VJZCA9IGNvbnRleHQuZ2V0U3Rvcm1JZCgpOwogICAgICAgICBNYXAgc3RhdGVDb25mID0gbmV3IEhhc2hNYXAoY29uZik7CiAgICAgICAgIExpc3Q8U3RyaW5nPiB6a1NlcnZlcnMgPSBfc3BvdXRDb25maWcuemtTZXJ2ZXJzOwogICAgICAgICBpZiAoemtTZXJ2ZXJzID09IG51bGwpIHsKQEAgLTg5LDEzICs4OCwxNyBAQAogICAgICAgICAvLyB1c2luZyBUcmFuc2FjdGlvbmFsU3RhdGUgbGlrZSB0aGlzIGlzIGEgaGFjawogICAgICAgICBpbnQgdG90YWxUYXNrcyA9IGNvbnRleHQuZ2V0Q29tcG9uZW50VGFza3MoY29udGV4dC5nZXRUaGlzQ29tcG9uZW50SWQoKSkuc2l6ZSgpOwogICAgICAgICBpZiAoX3Nwb3V0Q29uZmlnLmhvc3RzIGluc3RhbmNlb2YgU3RhdGljSG9zdHMpIHsKLSAgICAgICAgICAgIF9jb29yZGluYXRvciA9IG5ldyBTdGF0aWNDb29yZGluYXRvcihfY29ubmVjdGlvbnMsIGNvbmYsIF9zcG91dENvbmZpZywgX3N0YXRlLCBjb250ZXh0LmdldFRoaXNUYXNrSW5kZXgoKSwgdG90YWxUYXNrcywgX3V1aWQpOworICAgICAgICAgICAgX2Nvb3JkaW5hdG9yID0gbmV3IFN0YXRpY0Nvb3JkaW5hdG9yKF9jb25uZWN0aW9ucywgY29uZiwKKyAgICAgICAgICAgICAgICAgICAgX3Nwb3V0Q29uZmlnLCBfc3RhdGUsIGNvbnRleHQuZ2V0VGhpc1Rhc2tJbmRleCgpLAorICAgICAgICAgICAgICAgICAgICB0b3RhbFRhc2tzLCB0b3BvbG9neUluc3RhbmNlSWQpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgX2Nvb3JkaW5hdG9yID0gbmV3IFprQ29vcmRpbmF0b3IoX2Nvbm5lY3Rpb25zLCBjb25mLCBfc3BvdXRDb25maWcsIF9zdGF0ZSwgY29udGV4dC5nZXRUaGlzVGFza0luZGV4KCksIHRvdGFsVGFza3MsIF91dWlkKTsKKyAgICAgICAgICAgIF9jb29yZGluYXRvciA9IG5ldyBaa0Nvb3JkaW5hdG9yKF9jb25uZWN0aW9ucywgY29uZiwKKyAgICAgICAgICAgICAgICAgICAgX3Nwb3V0Q29uZmlnLCBfc3RhdGUsIGNvbnRleHQuZ2V0VGhpc1Rhc2tJbmRleCgpLAorICAgICAgICAgICAgICAgICAgICB0b3RhbFRhc2tzLCB0b3BvbG9neUluc3RhbmNlSWQpOwogICAgICAgICB9CiAKICAgICAgICAgY29udGV4dC5yZWdpc3Rlck1ldHJpYygia2Fma2FPZmZzZXQiLCBuZXcgSU1ldHJpYygpIHsKLSAgICAgICAgICAgIEthZmthVXRpbHMuS2Fma2FPZmZzZXRNZXRyaWMgX2thZmthT2Zmc2V0TWV0cmljID0gbmV3IEthZmthVXRpbHMuS2Fma2FPZmZzZXRNZXRyaWMoX3Nwb3V0Q29uZmlnLnRvcGljLCBfY29ubmVjdGlvbnMpOworICAgICAgICAgICAgS2Fma2FVdGlscy5LYWZrYU9mZnNldE1ldHJpYyBfa2Fma2FPZmZzZXRNZXRyaWMgPSBuZXcgS2Fma2FVdGlscy5LYWZrYU9mZnNldE1ldHJpYyhfY29ubmVjdGlvbnMpOwogCiAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWVBbmRSZXNldCgpIHsKQEAgLTE1MSw4ICsxNTQsMTMgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGxvbmcgbm93ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIGlmICgobm93IC0gX2xhc3RVcGRhdGVNcykgPiBfc3BvdXRDb25maWcuc3RhdGVVcGRhdGVJbnRlcnZhbE1zKSB7CisgICAgICAgIGxvbmcgZGlmZldpdGhOb3cgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIF9sYXN0VXBkYXRlTXM7CisKKyAgICAgICAgLyoKKyAgICAgICAgICAgICBBcyBmYXIgYXMgdGhlIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIGlzIGRlcGVuZGVudCBvbiBTeXN0ZW0gY2xvY2ssCisgICAgICAgICAgICAgYWRkaXRpb25hbCBjaGVjayBvbiBuZWdhdGl2ZSB2YWx1ZSBvZiBkaWZmV2l0aE5vdyBpbiBjYXNlIG9mIGV4dGVybmFsIGNoYW5nZXMuCisgICAgICAgICAqLworICAgICAgICBpZiAoZGlmZldpdGhOb3cgPiBfc3BvdXRDb25maWcuc3RhdGVVcGRhdGVJbnRlcnZhbE1zIHx8IGRpZmZXaXRoTm93IDwgMCkgewogICAgICAgICAgICAgY29tbWl0KCk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xODIsMTEgKzE5MCwxMSBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgZGVjbGFyZU91dHB1dEZpZWxkcyhPdXRwdXRGaWVsZHNEZWNsYXJlciBkZWNsYXJlcikgewotCWlmIChfc3BvdXRDb25maWcudG9waWNBc1N0cmVhbUlkKSB7Ci0JICAgIGRlY2xhcmVyLmRlY2xhcmVTdHJlYW0oX3Nwb3V0Q29uZmlnLnRvcGljLCBfc3BvdXRDb25maWcuc2NoZW1lLmdldE91dHB1dEZpZWxkcygpKTsKLQl9IGVsc2UgeworICAgICAgICBpZiAoX3Nwb3V0Q29uZmlnLnRvcGljQXNTdHJlYW1JZCkgeworICAgICAgICAgICAgZGVjbGFyZXIuZGVjbGFyZVN0cmVhbShfc3BvdXRDb25maWcudG9waWMsIF9zcG91dENvbmZpZy5zY2hlbWUuZ2V0T3V0cHV0RmllbGRzKCkpOworICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgZGVjbGFyZXIuZGVjbGFyZShfc3BvdXRDb25maWcuc2NoZW1lLmdldE91dHB1dEZpZWxkcygpKTsKLQl9CisgICAgICAgIH0KICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgY29tbWl0KCkgewpkaWZmIC0tZ2l0IGEvZXh0ZXJuYWwvc3Rvcm0ta2Fma2Evc3JjL2p2bS9zdG9ybS9rYWZrYS9LYWZrYVV0aWxzLmphdmEgYi9leHRlcm5hbC9zdG9ybS1rYWZrYS9zcmMvanZtL3N0b3JtL2thZmthL0thZmthVXRpbHMuamF2YQppbmRleCBiMzI0ZDc5Li41MmNkZGU4IDEwMDY0NAotLS0gYS9leHRlcm5hbC9zdG9ybS1rYWZrYS9zcmMvanZtL3N0b3JtL2thZmthL0thZmthVXRpbHMuamF2YQorKysgYi9leHRlcm5hbC9zdG9ybS1rYWZrYS9zcmMvanZtL3N0b3JtL2thZmthL0thZmthVXRpbHMuamF2YQpAQCAtNTIsNyArNTIsNyBAQAogCiAgICAgcHVibGljIHN0YXRpYyBJQnJva2VyUmVhZGVyIG1ha2VCcm9rZXJSZWFkZXIoTWFwIHN0b3JtQ29uZiwgS2Fma2FDb25maWcgY29uZikgewogICAgICAgICBpZiAoY29uZi5ob3N0cyBpbnN0YW5jZW9mIFN0YXRpY0hvc3RzKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFN0YXRpY0Jyb2tlclJlYWRlcigoKFN0YXRpY0hvc3RzKSBjb25mLmhvc3RzKS5nZXRQYXJ0aXRpb25JbmZvcm1hdGlvbigpKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RhdGljQnJva2VyUmVhZGVyKGNvbmYudG9waWMsICgoU3RhdGljSG9zdHMpIGNvbmYuaG9zdHMpLmdldFBhcnRpdGlvbkluZm9ybWF0aW9uKCkpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcmV0dXJuIG5ldyBaa0Jyb2tlclJlYWRlcihzdG9ybUNvbmYsIGNvbmYudG9waWMsIChaa0hvc3RzKSBjb25mLmhvc3RzKTsKICAgICAgICAgfQpAQCAtODIsMTEgKzgyLDkgQEAKICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEthZmthT2Zmc2V0TWV0cmljIGltcGxlbWVudHMgSU1ldHJpYyB7CiAgICAgICAgIE1hcDxQYXJ0aXRpb24sIExvbmc+IF9wYXJ0aXRpb25Ub09mZnNldCA9IG5ldyBIYXNoTWFwPFBhcnRpdGlvbiwgTG9uZz4oKTsKICAgICAgICAgU2V0PFBhcnRpdGlvbj4gX3BhcnRpdGlvbnM7Ci0gICAgICAgIFN0cmluZyBfdG9waWM7CiAgICAgICAgIER5bmFtaWNQYXJ0aXRpb25Db25uZWN0aW9ucyBfY29ubmVjdGlvbnM7CiAKLSAgICAgICAgcHVibGljIEthZmthT2Zmc2V0TWV0cmljKFN0cmluZyB0b3BpYywgRHluYW1pY1BhcnRpdGlvbkNvbm5lY3Rpb25zIGNvbm5lY3Rpb25zKSB7Ci0gICAgICAgICAgICBfdG9waWMgPSB0b3BpYzsKKyAgICAgICAgcHVibGljIEthZmthT2Zmc2V0TWV0cmljKER5bmFtaWNQYXJ0aXRpb25Db25uZWN0aW9ucyBjb25uZWN0aW9ucykgewogICAgICAgICAgICAgX2Nvbm5lY3Rpb25zID0gY29ubmVjdGlvbnM7CiAgICAgICAgIH0KIApAQCAtOTQsMTUgKzkyLDE5IEBACiAgICAgICAgICAgICBfcGFydGl0aW9uVG9PZmZzZXQucHV0KHBhcnRpdGlvbiwgb2Zmc2V0KTsKICAgICAgICAgfQogCisgICAgICAgIHByaXZhdGUgY2xhc3MgVG9waWNNZXRyaWNzIHsKKyAgICAgICAgICAgIGxvbmcgdG90YWxTcG91dExhZyA9IDA7CisgICAgICAgICAgICBsb25nIHRvdGFsRWFybGllc3RUaW1lT2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIGxvbmcgdG90YWxMYXRlc3RUaW1lT2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIGxvbmcgdG90YWxMYXRlc3RFbWl0dGVkT2Zmc2V0ID0gMDsKKyAgICAgICAgfQorCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlQW5kUmVzZXQoKSB7CiAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGxvbmcgdG90YWxTcG91dExhZyA9IDA7Ci0gICAgICAgICAgICAgICAgbG9uZyB0b3RhbEVhcmxpZXN0VGltZU9mZnNldCA9IDA7Ci0gICAgICAgICAgICAgICAgbG9uZyB0b3RhbExhdGVzdFRpbWVPZmZzZXQgPSAwOwotICAgICAgICAgICAgICAgIGxvbmcgdG90YWxMYXRlc3RFbWl0dGVkT2Zmc2V0ID0gMDsKICAgICAgICAgICAgICAgICBIYXNoTWFwIHJldCA9IG5ldyBIYXNoTWFwKCk7CiAgICAgICAgICAgICAgICAgaWYgKF9wYXJ0aXRpb25zICE9IG51bGwgJiYgX3BhcnRpdGlvbnMuc2l6ZSgpID09IF9wYXJ0aXRpb25Ub09mZnNldC5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZyxUb3BpY01ldHJpY3M+IHRvcGljTWV0cmljc01hcCA9IG5ldyBUcmVlTWFwPFN0cmluZywgVG9waWNNZXRyaWNzPigpOwogICAgICAgICAgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxQYXJ0aXRpb24sIExvbmc+IGUgOiBfcGFydGl0aW9uVG9PZmZzZXQuZW50cnlTZXQoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgUGFydGl0aW9uIHBhcnRpdGlvbiA9IGUuZ2V0S2V5KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBTaW1wbGVDb25zdW1lciBjb25zdW1lciA9IF9jb25uZWN0aW9ucy5nZXRDb25uZWN0aW9uKHBhcnRpdGlvbik7CkBAIC0xMTAsMjcgKzExMiw0NSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPRy53YXJuKCJwYXJ0aXRpb25Ub09mZnNldCBjb250YWlucyBwYXJ0aXRpb24gbm90IGZvdW5kIGluIF9jb25uZWN0aW9ucy4gU3RhbGUgcGFydGl0aW9uIGRhdGE/Iik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb25nIGxhdGVzdFRpbWVPZmZzZXQgPSBnZXRPZmZzZXQoY29uc3VtZXIsIF90b3BpYywgcGFydGl0aW9uLnBhcnRpdGlvbiwga2Fma2EuYXBpLk9mZnNldFJlcXVlc3QuTGF0ZXN0VGltZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgZWFybGllc3RUaW1lT2Zmc2V0ID0gZ2V0T2Zmc2V0KGNvbnN1bWVyLCBfdG9waWMsIHBhcnRpdGlvbi5wYXJ0aXRpb24sIGthZmthLmFwaS5PZmZzZXRSZXF1ZXN0LkVhcmxpZXN0VGltZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgbGF0ZXN0VGltZU9mZnNldCA9IGdldE9mZnNldChjb25zdW1lciwgcGFydGl0aW9uLnRvcGljLCBwYXJ0aXRpb24ucGFydGl0aW9uLCBrYWZrYS5hcGkuT2Zmc2V0UmVxdWVzdC5MYXRlc3RUaW1lKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBlYXJsaWVzdFRpbWVPZmZzZXQgPSBnZXRPZmZzZXQoY29uc3VtZXIsIHBhcnRpdGlvbi50b3BpYywgcGFydGl0aW9uLnBhcnRpdGlvbiwga2Fma2EuYXBpLk9mZnNldFJlcXVlc3QuRWFybGllc3RUaW1lKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhdGVzdFRpbWVPZmZzZXQgPT0gS2Fma2FVdGlscy5OT19PRkZTRVQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0cud2FybigiTm8gZGF0YSBmb3VuZCBpbiBLYWZrYSBQYXJ0aXRpb24gIiArIHBhcnRpdGlvbi5nZXRJZCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgbGF0ZXN0RW1pdHRlZE9mZnNldCA9IGUuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgc3BvdXRMYWcgPSBsYXRlc3RUaW1lT2Zmc2V0IC0gbGF0ZXN0RW1pdHRlZE9mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldC5wdXQoX3RvcGljICsgIi8iICsgcGFydGl0aW9uLmdldElkKCkgKyAiLyIgKyAic3BvdXRMYWciLCBzcG91dExhZyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXQucHV0KF90b3BpYyArICIvIiArIHBhcnRpdGlvbi5nZXRJZCgpICsgIi8iICsgImVhcmxpZXN0VGltZU9mZnNldCIsIGVhcmxpZXN0VGltZU9mZnNldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXQucHV0KF90b3BpYyArICIvIiArIHBhcnRpdGlvbi5nZXRJZCgpICsgIi8iICsgImxhdGVzdFRpbWVPZmZzZXQiLCBsYXRlc3RUaW1lT2Zmc2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldC5wdXQoX3RvcGljICsgIi8iICsgcGFydGl0aW9uLmdldElkKCkgKyAiLyIgKyAibGF0ZXN0RW1pdHRlZE9mZnNldCIsIGxhdGVzdEVtaXR0ZWRPZmZzZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTcG91dExhZyArPSBzcG91dExhZzsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsRWFybGllc3RUaW1lT2Zmc2V0ICs9IGVhcmxpZXN0VGltZU9mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsTGF0ZXN0VGltZU9mZnNldCArPSBsYXRlc3RUaW1lT2Zmc2V0OwotICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxMYXRlc3RFbWl0dGVkT2Zmc2V0ICs9IGxhdGVzdEVtaXR0ZWRPZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdG9waWMgPSBwYXJ0aXRpb24udG9waWM7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWV0cmljUGF0aCA9IHBhcnRpdGlvbi5nZXRJZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgLy9IYW5kbGUgdGhlIGNhc2Ugd2hlcmUgUGFydGl0aW9uIFBhdGggSWQgZG9lcyBub3QgY29udGFpbiB0b3BpYyBuYW1lIFBhcnRpdGlvbi5nZXRJZCgpID09ICJwYXJ0aXRpb25fIiArIHBhcnRpdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtZXRyaWNQYXRoLnN0YXJ0c1dpdGgodG9waWMgKyAiLyIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0cmljUGF0aCA9IHRvcGljICsgIi8iICsgbWV0cmljUGF0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldC5wdXQobWV0cmljUGF0aCArICIvIiArICJzcG91dExhZyIsIHNwb3V0TGFnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldC5wdXQobWV0cmljUGF0aCArICIvIiArICJlYXJsaWVzdFRpbWVPZmZzZXQiLCBlYXJsaWVzdFRpbWVPZmZzZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnB1dChtZXRyaWNQYXRoICsgIi8iICsgImxhdGVzdFRpbWVPZmZzZXQiLCBsYXRlc3RUaW1lT2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldC5wdXQobWV0cmljUGF0aCArICIvIiArICJsYXRlc3RFbWl0dGVkT2Zmc2V0IiwgbGF0ZXN0RW1pdHRlZE9mZnNldCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdG9waWNNZXRyaWNzTWFwLmNvbnRhaW5zS2V5KHBhcnRpdGlvbi50b3BpYykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BpY01ldHJpY3NNYXAucHV0KHBhcnRpdGlvbi50b3BpYyxuZXcgVG9waWNNZXRyaWNzKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBUb3BpY01ldHJpY3MgdG9waWNNZXRyaWNzID0gdG9waWNNZXRyaWNzTWFwLmdldChwYXJ0aXRpb24udG9waWMpOworICAgICAgICAgICAgICAgICAgICAgICAgdG9waWNNZXRyaWNzLnRvdGFsU3BvdXRMYWcgKz0gc3BvdXRMYWc7CisgICAgICAgICAgICAgICAgICAgICAgICB0b3BpY01ldHJpY3MudG90YWxFYXJsaWVzdFRpbWVPZmZzZXQgKz0gZWFybGllc3RUaW1lT2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgICAgdG9waWNNZXRyaWNzLnRvdGFsTGF0ZXN0VGltZU9mZnNldCArPSBsYXRlc3RUaW1lT2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgICAgdG9waWNNZXRyaWNzLnRvdGFsTGF0ZXN0RW1pdHRlZE9mZnNldCArPSBsYXRlc3RFbWl0dGVkT2Zmc2V0OwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldC5wdXQoX3RvcGljICsgIi8iICsgInRvdGFsU3BvdXRMYWciLCB0b3RhbFNwb3V0TGFnKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0LnB1dChfdG9waWMgKyAiLyIgKyAidG90YWxFYXJsaWVzdFRpbWVPZmZzZXQiLCB0b3RhbEVhcmxpZXN0VGltZU9mZnNldCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldC5wdXQoX3RvcGljICsgIi8iICsgInRvdGFsTGF0ZXN0VGltZU9mZnNldCIsIHRvdGFsTGF0ZXN0VGltZU9mZnNldCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldC5wdXQoX3RvcGljICsgIi8iICsgInRvdGFsTGF0ZXN0RW1pdHRlZE9mZnNldCIsIHRvdGFsTGF0ZXN0RW1pdHRlZE9mZnNldCk7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yKE1hcC5FbnRyeTxTdHJpbmcsIFRvcGljTWV0cmljcz4gZSA6IHRvcGljTWV0cmljc01hcC5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdG9waWMgPSBlLmdldEtleSgpOworICAgICAgICAgICAgICAgICAgICAgICAgVG9waWNNZXRyaWNzIHRvcGljTWV0cmljcyA9IGUuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldC5wdXQodG9waWMgKyAiLyIgKyAidG90YWxTcG91dExhZyIsIHRvcGljTWV0cmljcy50b3RhbFNwb3V0TGFnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldC5wdXQodG9waWMgKyAiLyIgKyAidG90YWxFYXJsaWVzdFRpbWVPZmZzZXQiLCB0b3BpY01ldHJpY3MudG90YWxFYXJsaWVzdFRpbWVPZmZzZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0LnB1dCh0b3BpYyArICIvIiArICJ0b3RhbExhdGVzdFRpbWVPZmZzZXQiLCB0b3BpY01ldHJpY3MudG90YWxMYXRlc3RUaW1lT2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldC5wdXQodG9waWMgKyAiLyIgKyAidG90YWxMYXRlc3RFbWl0dGVkT2Zmc2V0IiwgdG9waWNNZXRyaWNzLnRvdGFsTGF0ZXN0RW1pdHRlZE9mZnNldCk7CisgICAgICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIExPRy5pbmZvKCJNZXRyaWNzIFRpY2s6IE5vdCBlbm91Z2ggZGF0YSB0byBjYWxjdWxhdGUgc3BvdXQgbGFnLiIpOwpAQCAtMTU1LDcgKzE3NSw3IEBACiAgICAgcHVibGljIHN0YXRpYyBCeXRlQnVmZmVyTWVzc2FnZVNldCBmZXRjaE1lc3NhZ2VzKEthZmthQ29uZmlnIGNvbmZpZywgU2ltcGxlQ29uc3VtZXIgY29uc3VtZXIsIFBhcnRpdGlvbiBwYXJ0aXRpb24sIGxvbmcgb2Zmc2V0KQogICAgICAgICAgICAgdGhyb3dzIFRvcGljT2Zmc2V0T3V0T2ZSYW5nZUV4Y2VwdGlvbiwgRmFpbGVkRmV0Y2hFeGNlcHRpb24sUnVudGltZUV4Y2VwdGlvbiB7CiAgICAgICAgIEJ5dGVCdWZmZXJNZXNzYWdlU2V0IG1zZ3MgPSBudWxsOwotICAgICAgICBTdHJpbmcgdG9waWMgPSBjb25maWcudG9waWM7CisgICAgICAgIFN0cmluZyB0b3BpYyA9IHBhcnRpdGlvbi50b3BpYzsKICAgICAgICAgaW50IHBhcnRpdGlvbklkID0gcGFydGl0aW9uLnBhcnRpdGlvbjsKICAgICAgICAgRmV0Y2hSZXF1ZXN0QnVpbGRlciBidWlsZGVyID0gbmV3IEZldGNoUmVxdWVzdEJ1aWxkZXIoKTsKICAgICAgICAgRmV0Y2hSZXF1ZXN0IGZldGNoUmVxdWVzdCA9IGJ1aWxkZXIuYWRkRmV0Y2godG9waWMsIHBhcnRpdGlvbklkLCBvZmZzZXQsIGNvbmZpZy5mZXRjaFNpemVCeXRlcykuCkBAIC0xNzgsNyArMTk4LDcgQEAKICAgICAgICAgaWYgKGZldGNoUmVzcG9uc2UuaGFzRXJyb3IoKSkgewogICAgICAgICAgICAgS2Fma2FFcnJvciBlcnJvciA9IEthZmthRXJyb3IuZ2V0RXJyb3IoZmV0Y2hSZXNwb25zZS5lcnJvckNvZGUodG9waWMsIHBhcnRpdGlvbklkKSk7CiAgICAgICAgICAgICBpZiAoZXJyb3IuZXF1YWxzKEthZmthRXJyb3IuT0ZGU0VUX09VVF9PRl9SQU5HRSkgJiYgY29uZmlnLnVzZVN0YXJ0T2Zmc2V0VGltZUlmT2Zmc2V0T3V0T2ZSYW5nZSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiR290IGZldGNoIHJlcXVlc3Qgd2l0aCBvZmZzZXQgb3V0IG9mIHJhbmdlOiBbIiArIG9mZnNldCArICJdIjsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbXNnID0gcGFydGl0aW9uICsgIiBHb3QgZmV0Y2ggcmVxdWVzdCB3aXRoIG9mZnNldCBvdXQgb2YgcmFuZ2U6IFsiICsgb2Zmc2V0ICsgIl0iOwogICAgICAgICAgICAgICAgIExPRy53YXJuKG1zZyk7CiAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRvcGljT2Zmc2V0T3V0T2ZSYW5nZUV4Y2VwdGlvbihtc2cpOwogICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTE5Myw3ICsyMTMsNyBAQAogICAgIH0KIAogCi0gICAgcHVibGljIHN0YXRpYyBJdGVyYWJsZTxMaXN0PE9iamVjdD4+IGdlbmVyYXRlVHVwbGVzKEthZmthQ29uZmlnIGthZmthQ29uZmlnLCBNZXNzYWdlIG1zZykgeworICAgIHB1YmxpYyBzdGF0aWMgSXRlcmFibGU8TGlzdDxPYmplY3Q+PiBnZW5lcmF0ZVR1cGxlcyhLYWZrYUNvbmZpZyBrYWZrYUNvbmZpZywgTWVzc2FnZSBtc2csIFN0cmluZyB0b3BpYykgewogICAgICAgICBJdGVyYWJsZTxMaXN0PE9iamVjdD4+IHR1cHM7CiAgICAgICAgIEJ5dGVCdWZmZXIgcGF5bG9hZCA9IG1zZy5wYXlsb2FkKCk7CiAgICAgICAgIGlmIChwYXlsb2FkID09IG51bGwpIHsKQEAgLTIwMSwyMiArMjIxLDM3IEBACiAgICAgICAgIH0KICAgICAgICAgQnl0ZUJ1ZmZlciBrZXkgPSBtc2cua2V5KCk7CiAgICAgICAgIGlmIChrZXkgIT0gbnVsbCAmJiBrYWZrYUNvbmZpZy5zY2hlbWUgaW5zdGFuY2VvZiBLZXlWYWx1ZVNjaGVtZUFzTXVsdGlTY2hlbWUpIHsKLSAgICAgICAgICAgIHR1cHMgPSAoKEtleVZhbHVlU2NoZW1lQXNNdWx0aVNjaGVtZSkga2Fma2FDb25maWcuc2NoZW1lKS5kZXNlcmlhbGl6ZUtleUFuZFZhbHVlKFV0aWxzLnRvQnl0ZUFycmF5KGtleSksIFV0aWxzLnRvQnl0ZUFycmF5KHBheWxvYWQpKTsKKyAgICAgICAgICAgIHR1cHMgPSAoKEtleVZhbHVlU2NoZW1lQXNNdWx0aVNjaGVtZSkga2Fma2FDb25maWcuc2NoZW1lKS5kZXNlcmlhbGl6ZUtleUFuZFZhbHVlKGtleSwgcGF5bG9hZCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0dXBzID0ga2Fma2FDb25maWcuc2NoZW1lLmRlc2VyaWFsaXplKFV0aWxzLnRvQnl0ZUFycmF5KHBheWxvYWQpKTsKKyAgICAgICAgICAgIGlmIChrYWZrYUNvbmZpZy5zY2hlbWUgaW5zdGFuY2VvZiBTdHJpbmdNdWx0aVNjaGVtZVdpdGhUb3BpYykgeworICAgICAgICAgICAgICAgIHR1cHMgPSAoKFN0cmluZ011bHRpU2NoZW1lV2l0aFRvcGljKWthZmthQ29uZmlnLnNjaGVtZSkuZGVzZXJpYWxpemVXaXRoVG9waWModG9waWMsIHBheWxvYWQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0dXBzID0ga2Fma2FDb25maWcuc2NoZW1lLmRlc2VyaWFsaXplKHBheWxvYWQpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiB0dXBzOwogICAgIH0KKyAgICAKKyAgICBwdWJsaWMgc3RhdGljIEl0ZXJhYmxlPExpc3Q8T2JqZWN0Pj4gZ2VuZXJhdGVUdXBsZXMoTWVzc2FnZU1ldGFkYXRhU2NoZW1lQXNNdWx0aVNjaGVtZSBzY2hlbWUsIE1lc3NhZ2UgbXNnLCBQYXJ0aXRpb24gcGFydGl0aW9uLCBsb25nIG9mZnNldCkgeworICAgICAgICBCeXRlQnVmZmVyIHBheWxvYWQgPSBtc2cucGF5bG9hZCgpOworICAgICAgICBpZiAocGF5bG9hZCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2NoZW1lLmRlc2VyaWFsaXplTWVzc2FnZVdpdGhNZXRhZGF0YShwYXlsb2FkLCBwYXJ0aXRpb24sIG9mZnNldCk7CisgICAgfQogCiAKLSAgICBwdWJsaWMgc3RhdGljIExpc3Q8UGFydGl0aW9uPiBjYWxjdWxhdGVQYXJ0aXRpb25zRm9yVGFzayhHbG9iYWxQYXJ0aXRpb25JbmZvcm1hdGlvbiBwYXJ0aXRpb25JbmZvcm1hdGlvbiwgaW50IHRvdGFsVGFza3MsIGludCB0YXNrSW5kZXgpIHsKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8UGFydGl0aW9uPiBjYWxjdWxhdGVQYXJ0aXRpb25zRm9yVGFzayhMaXN0PEdsb2JhbFBhcnRpdGlvbkluZm9ybWF0aW9uPiBwYXJ0aXRvbnMsIGludCB0b3RhbFRhc2tzLCBpbnQgdGFza0luZGV4KSB7CiAgICAgICAgIFByZWNvbmRpdGlvbnMuY2hlY2tBcmd1bWVudCh0YXNrSW5kZXggPCB0b3RhbFRhc2tzLCAidGFzayBpbmRleCBtdXN0IGJlIGxlc3MgdGhhdCB0b3RhbCB0YXNrcyIpOwotICAgICAgICBMaXN0PFBhcnRpdGlvbj4gcGFydGl0aW9ucyA9IHBhcnRpdGlvbkluZm9ybWF0aW9uLmdldE9yZGVyZWRQYXJ0aXRpb25zKCk7CisgICAgICAgIExpc3Q8UGFydGl0aW9uPiB0YXNrUGFydGl0aW9ucyA9IG5ldyBBcnJheUxpc3Q8UGFydGl0aW9uPigpOworICAgICAgICBMaXN0PFBhcnRpdGlvbj4gcGFydGl0aW9ucyA9IG5ldyBBcnJheUxpc3Q8UGFydGl0aW9uPigpOworICAgICAgICBmb3IoR2xvYmFsUGFydGl0aW9uSW5mb3JtYXRpb24gcGFydGl0aW9uSW5mb3JtYXRpb24gOiBwYXJ0aXRvbnMpIHsKKyAgICAgICAgICAgIHBhcnRpdGlvbnMuYWRkQWxsKHBhcnRpdGlvbkluZm9ybWF0aW9uLmdldE9yZGVyZWRQYXJ0aXRpb25zKCkpOworICAgICAgICB9CiAgICAgICAgIGludCBudW1QYXJ0aXRpb25zID0gcGFydGl0aW9ucy5zaXplKCk7CiAgICAgICAgIGlmIChudW1QYXJ0aXRpb25zIDwgdG90YWxUYXNrcykgewogICAgICAgICAgICAgTE9HLndhcm4oInRoZXJlIGFyZSBtb3JlIHRhc2tzIHRoYW4gcGFydGl0aW9ucyAodGFza3M6ICIgKyB0b3RhbFRhc2tzICsgIjsgcGFydGl0aW9uczogIiArIG51bVBhcnRpdGlvbnMgKyAiKSwgc29tZSB0YXNrcyB3aWxsIGJlIGlkbGUiKTsKICAgICAgICAgfQotICAgICAgICBMaXN0PFBhcnRpdGlvbj4gdGFza1BhcnRpdGlvbnMgPSBuZXcgQXJyYXlMaXN0PFBhcnRpdGlvbj4oKTsKICAgICAgICAgZm9yIChpbnQgaSA9IHRhc2tJbmRleDsgaSA8IG51bVBhcnRpdGlvbnM7IGkgKz0gdG90YWxUYXNrcykgewogICAgICAgICAgICAgUGFydGl0aW9uIHRhc2tQYXJ0aXRpb24gPSBwYXJ0aXRpb25zLmdldChpKTsKICAgICAgICAgICAgIHRhc2tQYXJ0aXRpb25zLmFkZCh0YXNrUGFydGl0aW9uKTsKZGlmZiAtLWdpdCBhL2V4dGVybmFsL3N0b3JtLWthZmthL3NyYy9qdm0vc3Rvcm0va2Fma2EvS2V5VmFsdWVTY2hlbWUuamF2YSBiL2V4dGVybmFsL3N0b3JtLWthZmthL3NyYy9qdm0vc3Rvcm0va2Fma2EvS2V5VmFsdWVTY2hlbWUuamF2YQppbmRleCBmNDJmN2M4Li43YzBkYzZjIDEwMDY0NAotLS0gYS9leHRlcm5hbC9zdG9ybS1rYWZrYS9zcmMvanZtL3N0b3JtL2thZmthL0tleVZhbHVlU2NoZW1lLmphdmEKKysrIGIvZXh0ZXJuYWwvc3Rvcm0ta2Fma2Evc3JjL2p2bS9zdG9ybS9rYWZrYS9LZXlWYWx1ZVNjaGVtZS5qYXZhCkBAIC0xOSwxMCArMTksOSBAQAogCiBpbXBvcnQgYmFja3R5cGUuc3Rvcm0uc3BvdXQuU2NoZW1lOwogCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogcHVibGljIGludGVyZmFjZSBLZXlWYWx1ZVNjaGVtZSBleHRlbmRzIFNjaGVtZSB7Ci0KLSAgICBwdWJsaWMgTGlzdDxPYmplY3Q+IGRlc2VyaWFsaXplS2V5QW5kVmFsdWUoYnl0ZVtdIGtleSwgYnl0ZVtdIHZhbHVlKTsKLQorICAgIExpc3Q8T2JqZWN0PiBkZXNlcmlhbGl6ZUtleUFuZFZhbHVlKEJ5dGVCdWZmZXIga2V5LCBCeXRlQnVmZmVyIHZhbHVlKTsKIH0KZGlmZiAtLWdpdCBhL2V4dGVybmFsL3N0b3JtLWthZmthL3NyYy9qdm0vc3Rvcm0va2Fma2EvS2V5VmFsdWVTY2hlbWVBc011bHRpU2NoZW1lLmphdmEgYi9leHRlcm5hbC9zdG9ybS1rYWZrYS9zcmMvanZtL3N0b3JtL2thZmthL0tleVZhbHVlU2NoZW1lQXNNdWx0aVNjaGVtZS5qYXZhCmluZGV4IDdkZWY2YWMuLmQyN2FlN2UgMTAwNjQ0Ci0tLSBhL2V4dGVybmFsL3N0b3JtLWthZmthL3NyYy9qdm0vc3Rvcm0va2Fma2EvS2V5VmFsdWVTY2hlbWVBc011bHRpU2NoZW1lLmphdmEKKysrIGIvZXh0ZXJuYWwvc3Rvcm0ta2Fma2Evc3JjL2p2bS9zdG9ybS9rYWZrYS9LZXlWYWx1ZVNjaGVtZUFzTXVsdGlTY2hlbWUuamF2YQpAQCAtMTksMTYgKzE5LDE3IEBACiAKIGltcG9ydCBiYWNrdHlwZS5zdG9ybS5zcG91dC5TY2hlbWVBc011bHRpU2NoZW1lOwogCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCi1wdWJsaWMgY2xhc3MgS2V5VmFsdWVTY2hlbWVBc011bHRpU2NoZW1lIGV4dGVuZHMgU2NoZW1lQXNNdWx0aVNjaGVtZXsKK3B1YmxpYyBjbGFzcyBLZXlWYWx1ZVNjaGVtZUFzTXVsdGlTY2hlbWUgZXh0ZW5kcyBTY2hlbWVBc011bHRpU2NoZW1lIHsKIAogICAgIHB1YmxpYyBLZXlWYWx1ZVNjaGVtZUFzTXVsdGlTY2hlbWUoS2V5VmFsdWVTY2hlbWUgc2NoZW1lKSB7CiAgICAgICAgIHN1cGVyKHNjaGVtZSk7CiAgICAgfQogCi0gICAgcHVibGljIEl0ZXJhYmxlPExpc3Q8T2JqZWN0Pj4gZGVzZXJpYWxpemVLZXlBbmRWYWx1ZShmaW5hbCBieXRlW10ga2V5LCBmaW5hbCBieXRlW10gdmFsdWUpIHsKKyAgICBwdWJsaWMgSXRlcmFibGU8TGlzdDxPYmplY3Q+PiBkZXNlcmlhbGl6ZUtleUFuZFZhbHVlKGZpbmFsIEJ5dGVCdWZmZXIga2V5LCBmaW5hbCBCeXRlQnVmZmVyIHZhbHVlKSB7CiAgICAgICAgIExpc3Q8T2JqZWN0PiBvID0gKChLZXlWYWx1ZVNjaGVtZSlzY2hlbWUpLmRlc2VyaWFsaXplS2V5QW5kVmFsdWUoa2V5LCB2YWx1ZSk7CiAgICAgICAgIGlmKG8gPT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgICAgICAgIGVsc2UgcmV0dXJuIEFycmF5cy5hc0xpc3Qobyk7CmRpZmYgLS1naXQgYS9leHRlcm5hbC9zdG9ybS1rYWZrYS9zcmMvanZtL3N0b3JtL2thZmthL01lc3NhZ2VNZXRhZGF0YVNjaGVtZS5qYXZhIGIvZXh0ZXJuYWwvc3Rvcm0ta2Fma2Evc3JjL2p2bS9zdG9ybS9rYWZrYS9NZXNzYWdlTWV0YWRhdGFTY2hlbWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmY2NTJmCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZXJuYWwvc3Rvcm0ta2Fma2Evc3JjL2p2bS9zdG9ybS9rYWZrYS9NZXNzYWdlTWV0YWRhdGFTY2hlbWUuamF2YQpAQCAtMCwwICsxLDI3IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBzdG9ybS5rYWZrYTsKKworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnNwb3V0LlNjaGVtZTsKKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBpbnRlcmZhY2UgTWVzc2FnZU1ldGFkYXRhU2NoZW1lIGV4dGVuZHMgU2NoZW1lIHsKKyAgICBMaXN0PE9iamVjdD4gZGVzZXJpYWxpemVNZXNzYWdlV2l0aE1ldGFkYXRhKEJ5dGVCdWZmZXIgbWVzc2FnZSwgUGFydGl0aW9uIHBhcnRpdGlvbiwgbG9uZyBvZmZzZXQpOworfQpkaWZmIC0tZ2l0IGEvZXh0ZXJuYWwvc3Rvcm0ta2Fma2Evc3JjL2p2bS9zdG9ybS9rYWZrYS9NZXNzYWdlTWV0YWRhdGFTY2hlbWVBc011bHRpU2NoZW1lLmphdmEgYi9leHRlcm5hbC9zdG9ybS1rYWZrYS9zcmMvanZtL3N0b3JtL2thZmthL01lc3NhZ2VNZXRhZGF0YVNjaGVtZUFzTXVsdGlTY2hlbWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjNhMTAxCi0tLSAvZGV2L251bGwKKysrIGIvZXh0ZXJuYWwvc3Rvcm0ta2Fma2Evc3JjL2p2bS9zdG9ybS9rYWZrYS9NZXNzYWdlTWV0YWRhdGFTY2hlbWVBc011bHRpU2NoZW1lLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugc3Rvcm0ua2Fma2E7CisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5zcG91dC5TY2hlbWVBc011bHRpU2NoZW1lOworCitwdWJsaWMgY2xhc3MgTWVzc2FnZU1ldGFkYXRhU2NoZW1lQXNNdWx0aVNjaGVtZSBleHRlbmRzIFNjaGVtZUFzTXVsdGlTY2hlbWUgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC03MTcyNDAzNzAzODEzNjI1MTE2TDsKKworICAgIHB1YmxpYyBNZXNzYWdlTWV0YWRhdGFTY2hlbWVBc011bHRpU2NoZW1lKE1lc3NhZ2VNZXRhZGF0YVNjaGVtZSBzY2hlbWUpIHsKKyAgICAgICAgc3VwZXIoc2NoZW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSXRlcmFibGU8TGlzdDxPYmplY3Q+PiBkZXNlcmlhbGl6ZU1lc3NhZ2VXaXRoTWV0YWRhdGEoQnl0ZUJ1ZmZlciBtZXNzYWdlLCBQYXJ0aXRpb24gcGFydGl0aW9uLCBsb25nIG9mZnNldCkgeworICAgICAgICBMaXN0PE9iamVjdD4gbyA9ICgoTWVzc2FnZU1ldGFkYXRhU2NoZW1lKSBzY2hlbWUpLmRlc2VyaWFsaXplTWVzc2FnZVdpdGhNZXRhZGF0YShtZXNzYWdlLCBwYXJ0aXRpb24sIG9mZnNldCk7CisgICAgICAgIGlmIChvID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3Qobyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leHRlcm5hbC9zdG9ybS1rYWZrYS9zcmMvanZtL3N0b3JtL2thZmthL1BhcnRpdGlvbi5qYXZhIGIvZXh0ZXJuYWwvc3Rvcm0ta2Fma2Evc3JjL2p2bS9zdG9ybS9rYWZrYS9QYXJ0aXRpb24uamF2YQppbmRleCAyNGQ2YTQxLi41ZjY4M2VmIDEwMDY0NAotLS0gYS9leHRlcm5hbC9zdG9ybS1rYWZrYS9zcmMvanZtL3N0b3JtL2thZmthL1BhcnRpdGlvbi5qYXZhCisrKyBiL2V4dGVybmFsL3N0b3JtLWthZmthL3NyYy9qdm0vc3Rvcm0va2Fma2EvUGFydGl0aW9uLmphdmEKQEAgLTI1LDIwICsyNSwzMiBAQAogCiAgICAgcHVibGljIEJyb2tlciBob3N0OwogICAgIHB1YmxpYyBpbnQgcGFydGl0aW9uOworICAgIHB1YmxpYyBTdHJpbmcgdG9waWM7CisKKyAgICAvL0ZsYWcgdG8ga2VlcCB0aGUgUGFydGl0aW9uIFBhdGggSWQgYmFja3dhcmQgY29tcGF0aWJsZSB3aXRoIE9sZCBpbXBsZW1lbnRhdGlvbiBvZiBQYXJ0aXRpb24uZ2V0SWQoKSA9PSAicGFydGl0aW9uXyIgKyBwYXJ0aXRpb24KKyAgICBwcml2YXRlIEJvb2xlYW4gYlVzZVRvcGljTmFtZUZvclBhcnRpdGlvblBhdGhJZDsKIAogICAgIC8vIGZvciBrcnlvIGNvbXBhdGliaWxpdHkKICAgICBwcml2YXRlIFBhcnRpdGlvbigpIHsKIAkKICAgICB9Ci0gICAgCi0gICAgcHVibGljIFBhcnRpdGlvbihCcm9rZXIgaG9zdCwgaW50IHBhcnRpdGlvbikgeworICAgIHB1YmxpYyBQYXJ0aXRpb24oQnJva2VyIGhvc3QsIFN0cmluZyB0b3BpYywgaW50IHBhcnRpdGlvbikgeworICAgICAgICB0aGlzLnRvcGljID0gdG9waWM7CiAgICAgICAgIHRoaXMuaG9zdCA9IGhvc3Q7CiAgICAgICAgIHRoaXMucGFydGl0aW9uID0gcGFydGl0aW9uOworICAgICAgICB0aGlzLmJVc2VUb3BpY05hbWVGb3JQYXJ0aXRpb25QYXRoSWQgPSBmYWxzZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIFBhcnRpdGlvbihCcm9rZXIgaG9zdCwgU3RyaW5nIHRvcGljLCBpbnQgcGFydGl0aW9uLEJvb2xlYW4gYlVzZVRvcGljTmFtZUZvclBhcnRpdGlvblBhdGhJZCkgeworICAgICAgICB0aGlzLnRvcGljID0gdG9waWM7CisgICAgICAgIHRoaXMuaG9zdCA9IGhvc3Q7CisgICAgICAgIHRoaXMucGFydGl0aW9uID0gcGFydGl0aW9uOworICAgICAgICB0aGlzLmJVc2VUb3BpY05hbWVGb3JQYXJ0aXRpb25QYXRoSWQgPSBiVXNlVG9waWNOYW1lRm9yUGFydGl0aW9uUGF0aElkOwogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIHJldHVybiBPYmplY3RzLmhhc2hDb2RlKGhvc3QsIHBhcnRpdGlvbik7CisgICAgICAgIHJldHVybiBPYmplY3RzLmhhc2hDb2RlKGhvc3QsIHRvcGljLCBwYXJ0aXRpb24pOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtNTAsMjAgKzYyLDI2IEBACiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgZmluYWwgUGFydGl0aW9uIG90aGVyID0gKFBhcnRpdGlvbikgb2JqOwotICAgICAgICByZXR1cm4gT2JqZWN0cy5lcXVhbCh0aGlzLmhvc3QsIG90aGVyLmhvc3QpICYmIE9iamVjdHMuZXF1YWwodGhpcy5wYXJ0aXRpb24sIG90aGVyLnBhcnRpdGlvbik7CisgICAgICAgIHJldHVybiBPYmplY3RzLmVxdWFsKHRoaXMuaG9zdCwgb3RoZXIuaG9zdCkgJiYgT2JqZWN0cy5lcXVhbCh0aGlzLnRvcGljLCBvdGhlci50b3BpYykgJiYgT2JqZWN0cy5lcXVhbCh0aGlzLnBhcnRpdGlvbiwgb3RoZXIucGFydGl0aW9uKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICByZXR1cm4gIlBhcnRpdGlvbnsiICsKICAgICAgICAgICAgICAgICAiaG9zdD0iICsgaG9zdCArCisgICAgICAgICAgICAgICAgIiwgdG9waWM9IiArIHRvcGljICsKICAgICAgICAgICAgICAgICAiLCBwYXJ0aXRpb249IiArIHBhcnRpdGlvbiArCiAgICAgICAgICAgICAgICAgJ30nOwogICAgIH0KIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0gICAgICAgIHJldHVybiAicGFydGl0aW9uXyIgKyBwYXJ0aXRpb247CisgICAgICAgIGlmIChiVXNlVG9waWNOYW1lRm9yUGFydGl0aW9uUGF0aElkKSB7CisgICAgICAgICAgICByZXR1cm4gIHRvcGljICArICIvcGFydGl0aW9uXyIgKyBwYXJ0aXRpb247CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvL0tlZXAgdGhlIFBhcnRpdGlvbiBJZCBiYWNrd2FyZCBjb21wYXRpYmxlIHdpdGggT2xkIGltcGxlbWVudGF0aW9uIG9mIFBhcnRpdGlvbi5nZXRJZCgpID09ICJwYXJ0aXRpb25fIiArIHBhcnRpdGlvbgorICAgICAgICAgICAgcmV0dXJuICJwYXJ0aXRpb25fIiArIHBhcnRpdGlvbjsKKyAgICAgICAgfQogICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvZXh0ZXJuYWwvc3Rvcm0ta2Fma2Evc3JjL2p2bS9zdG9ybS9rYWZrYS9QYXJ0aXRpb25NYW5hZ2VyLmphdmEgYi9leHRlcm5hbC9zdG9ybS1rYWZrYS9zcmMvanZtL3N0b3JtL2thZmthL1BhcnRpdGlvbk1hbmFnZXIuamF2YQppbmRleCAwNTJkNTI1Li5kMWI5ZjQ4IDEwMDY0NAotLS0gYS9leHRlcm5hbC9zdG9ybS1rYWZrYS9zcmMvanZtL3N0b3JtL2thZmthL1BhcnRpdGlvbk1hbmFnZXIuamF2YQorKysgYi9leHRlcm5hbC9zdG9ybS1rYWZrYS9zcmMvanZtL3N0b3JtL2thZmthL1BhcnRpdGlvbk1hbmFnZXIuamF2YQpAQCAtMjMsMTIgKzIzLDE2IEBACiBpbXBvcnQgYmFja3R5cGUuc3Rvcm0ubWV0cmljLmFwaS5NZWFuUmVkdWNlcjsKIGltcG9ydCBiYWNrdHlwZS5zdG9ybS5tZXRyaWMuYXBpLlJlZHVjZWRNZXRyaWM7CiBpbXBvcnQgYmFja3R5cGUuc3Rvcm0uc3BvdXQuU3BvdXRPdXRwdXRDb2xsZWN0b3I7CisKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKKwogaW1wb3J0IGthZmthLmphdmFhcGkuY29uc3VtZXIuU2ltcGxlQ29uc3VtZXI7CiBpbXBvcnQga2Fma2EuamF2YWFwaS5tZXNzYWdlLkJ5dGVCdWZmZXJNZXNzYWdlU2V0OwogaW1wb3J0IGthZmthLm1lc3NhZ2UuTWVzc2FnZUFuZE9mZnNldDsKKwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKIGltcG9ydCBzdG9ybS5rYWZrYS5LYWZrYVNwb3V0LkVtaXRTdGF0ZTsKIGltcG9ydCBzdG9ybS5rYWZrYS5LYWZrYVNwb3V0Lk1lc3NhZ2VBbmRSZWFsT2Zmc2V0OwogaW1wb3J0IHN0b3JtLmthZmthLnRyaWRlbnQuTWF4TWV0cmljOwpAQCAtNjMsNyArNjcsNyBAQAogICAgICAgICBfY29ubmVjdGlvbnMgPSBjb25uZWN0aW9uczsKICAgICAgICAgX3Nwb3V0Q29uZmlnID0gc3BvdXRDb25maWc7CiAgICAgICAgIF90b3BvbG9neUluc3RhbmNlSWQgPSB0b3BvbG9neUluc3RhbmNlSWQ7Ci0gICAgICAgIF9jb25zdW1lciA9IGNvbm5lY3Rpb25zLnJlZ2lzdGVyKGlkLmhvc3QsIGlkLnBhcnRpdGlvbik7CisgICAgICAgIF9jb25zdW1lciA9IGNvbm5lY3Rpb25zLnJlZ2lzdGVyKGlkLmhvc3QsIGlkLnRvcGljLCBpZC5wYXJ0aXRpb24pOwogICAgICAgICBfc3RhdGUgPSBzdGF0ZTsKICAgICAgICAgX3N0b3JtQ29uZiA9IHN0b3JtQ29uZjsKICAgICAgICAgbnVtYmVyQWNrZWQgPSBudW1iZXJGYWlsZWQgPSAwOwpAQCAtODYsMTMgKzkwLDE0IEBACiAgICAgICAgICAgICBMT0cud2FybigiRXJyb3IgcmVhZGluZyBhbmQvb3IgcGFyc2luZyBhdCBaa05vZGU6ICIgKyBwYXRoLCBlKTsKICAgICAgICAgfQogCi0gICAgICAgIExvbmcgY3VycmVudE9mZnNldCA9IEthZmthVXRpbHMuZ2V0T2Zmc2V0KF9jb25zdW1lciwgc3BvdXRDb25maWcudG9waWMsIGlkLnBhcnRpdGlvbiwgc3BvdXRDb25maWcpOworICAgICAgICBTdHJpbmcgdG9waWMgPSBfcGFydGl0aW9uLnRvcGljOworICAgICAgICBMb25nIGN1cnJlbnRPZmZzZXQgPSBLYWZrYVV0aWxzLmdldE9mZnNldChfY29uc3VtZXIsIHRvcGljLCBpZC5wYXJ0aXRpb24sIHNwb3V0Q29uZmlnKTsKIAogICAgICAgICBpZiAoanNvblRvcG9sb2d5SWQgPT0gbnVsbCB8fCBqc29uT2Zmc2V0ID09IG51bGwpIHsgLy8gZmFpbGVkIHRvIHBhcnNlIEpTT04/CiAgICAgICAgICAgICBfY29tbWl0dGVkVG8gPSBjdXJyZW50T2Zmc2V0OwogICAgICAgICAgICAgTE9HLmluZm8oIk5vIHBhcnRpdGlvbiBpbmZvcm1hdGlvbiBmb3VuZCwgdXNpbmcgY29uZmlndXJhdGlvbiB0byBkZXRlcm1pbmUgb2Zmc2V0Iik7CiAgICAgICAgIH0gZWxzZSBpZiAoIXRvcG9sb2d5SW5zdGFuY2VJZC5lcXVhbHMoanNvblRvcG9sb2d5SWQpICYmIHNwb3V0Q29uZmlnLmlnbm9yZVprT2Zmc2V0cykgewotICAgICAgICAgICAgX2NvbW1pdHRlZFRvID0gS2Fma2FVdGlscy5nZXRPZmZzZXQoX2NvbnN1bWVyLCBzcG91dENvbmZpZy50b3BpYywgaWQucGFydGl0aW9uLCBzcG91dENvbmZpZy5zdGFydE9mZnNldFRpbWUpOworICAgICAgICAgICAgX2NvbW1pdHRlZFRvID0gS2Fma2FVdGlscy5nZXRPZmZzZXQoX2NvbnN1bWVyLCB0b3BpYywgaWQucGFydGl0aW9uLCBzcG91dENvbmZpZy5zdGFydE9mZnNldFRpbWUpOwogICAgICAgICAgICAgTE9HLmluZm8oIlRvcG9sb2d5IGNoYW5nZSBkZXRlY3RlZCBhbmQgaWdub3JlIHpvb2tlZXBlciBvZmZzZXRzIHNldCB0byB0cnVlLCB1c2luZyBjb25maWd1cmF0aW9uIHRvIGRldGVybWluZSBvZmZzZXQiKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIF9jb21taXR0ZWRUbyA9IGpzb25PZmZzZXQ7CkBAIC0xMzUsMTYgKzE0MCwyMyBAQAogICAgICAgICAgICAgaWYgKHRvRW1pdCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEVtaXRTdGF0ZS5OT19FTUlUVEVEOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgSXRlcmFibGU8TGlzdDxPYmplY3Q+PiB0dXBzID0gS2Fma2FVdGlscy5nZW5lcmF0ZVR1cGxlcyhfc3BvdXRDb25maWcsIHRvRW1pdC5tc2cpOwotICAgICAgICAgICAgaWYgKHR1cHMgIT0gbnVsbCkgewotCQlpZihfc3BvdXRDb25maWcudG9waWNBc1N0cmVhbUlkKSB7Ci0JICAgICAgICAgICAgZm9yIChMaXN0PE9iamVjdD4gdHVwIDogdHVwcykgewotCQkJY29sbGVjdG9yLmVtaXQoX3Nwb3V0Q29uZmlnLnRvcGljLCB0dXAsIG5ldyBLYWZrYU1lc3NhZ2VJZChfcGFydGl0aW9uLCB0b0VtaXQub2Zmc2V0KSk7Ci0JCSAgICB9Ci0JCX0gZWxzZSB7Ci0JCSAgICBmb3IgKExpc3Q8T2JqZWN0PiB0dXAgOiB0dXBzKSB7Ci0JCQljb2xsZWN0b3IuZW1pdCh0dXAsIG5ldyBLYWZrYU1lc3NhZ2VJZChfcGFydGl0aW9uLCB0b0VtaXQub2Zmc2V0KSk7Ci0JCSAgICB9CisKKyAgICAgICAgICAgIEl0ZXJhYmxlPExpc3Q8T2JqZWN0Pj4gdHVwczsKKyAgICAgICAgICAgIGlmIChfc3BvdXRDb25maWcuc2NoZW1lIGluc3RhbmNlb2YgTWVzc2FnZU1ldGFkYXRhU2NoZW1lQXNNdWx0aVNjaGVtZSkgeworICAgICAgICAgICAgICAgIHR1cHMgPSBLYWZrYVV0aWxzLmdlbmVyYXRlVHVwbGVzKChNZXNzYWdlTWV0YWRhdGFTY2hlbWVBc011bHRpU2NoZW1lKSBfc3BvdXRDb25maWcuc2NoZW1lLCB0b0VtaXQubXNnLCBfcGFydGl0aW9uLCB0b0VtaXQub2Zmc2V0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdHVwcyA9IEthZmthVXRpbHMuZ2VuZXJhdGVUdXBsZXMoX3Nwb3V0Q29uZmlnLCB0b0VtaXQubXNnLCBfcGFydGl0aW9uLnRvcGljKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKCh0dXBzICE9IG51bGwpICYmIHR1cHMuaXRlcmF0b3IoKS5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBpZihfc3BvdXRDb25maWcudG9waWNBc1N0cmVhbUlkKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoTGlzdDxPYmplY3Q+IHR1cCA6IHR1cHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxlY3Rvci5lbWl0KF9zcG91dENvbmZpZy50b3BpYywgdHVwLCBuZXcgS2Fma2FNZXNzYWdlSWQoX3BhcnRpdGlvbiwgdG9FbWl0Lm9mZnNldCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChMaXN0PE9iamVjdD4gdHVwIDogdHVwcykgeworICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdG9yLmVtaXQodHVwLCBuZXcgS2Fma2FNZXNzYWdlSWQoX3BhcnRpdGlvbiwgdG9FbWl0Lm9mZnNldCkpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTE3NCw4ICsxODYsOCBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgbXNncyA9IEthZmthVXRpbHMuZmV0Y2hNZXNzYWdlcyhfc3BvdXRDb25maWcsIF9jb25zdW1lciwgX3BhcnRpdGlvbiwgb2Zmc2V0KTsKICAgICAgICAgfSBjYXRjaCAoVG9waWNPZmZzZXRPdXRPZlJhbmdlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIF9lbWl0dGVkVG9PZmZzZXQgPSBLYWZrYVV0aWxzLmdldE9mZnNldChfY29uc3VtZXIsIF9zcG91dENvbmZpZy50b3BpYywgX3BhcnRpdGlvbi5wYXJ0aXRpb24sIGthZmthLmFwaS5PZmZzZXRSZXF1ZXN0LkVhcmxpZXN0VGltZSgpKTsKLSAgICAgICAgICAgIExPRy53YXJuKCJVc2luZyBuZXcgb2Zmc2V0OiB7fSIsIF9lbWl0dGVkVG9PZmZzZXQpOworICAgICAgICAgICAgX2VtaXR0ZWRUb09mZnNldCA9IEthZmthVXRpbHMuZ2V0T2Zmc2V0KF9jb25zdW1lciwgX3BhcnRpdGlvbi50b3BpYywgX3BhcnRpdGlvbi5wYXJ0aXRpb24sIGthZmthLmFwaS5PZmZzZXRSZXF1ZXN0LkVhcmxpZXN0VGltZSgpKTsKKyAgICAgICAgICAgIExPRy53YXJuKCJ7fSBVc2luZyBuZXcgb2Zmc2V0OiB7fSIsIF9wYXJ0aXRpb24ucGFydGl0aW9uLCBfZW1pdHRlZFRvT2Zmc2V0KTsKICAgICAgICAgICAgIC8vIGZldGNoIGZhaWxlZCwgc28gZG9uJ3QgdXBkYXRlIHRoZSBtZXRyaWNzCiAgICAgICAgICAgICAKICAgICAgICAgICAgIC8vZml4IGJ1ZyBbU1RPUk0tNjQzXSA6IHJlbW92ZSBvdXRkYXRlZCBmYWlsZWQgb2Zmc2V0cwpAQCAtMjYwLDcgKzI3Miw3IEBACiAgICAgICAgICAgICAgICAgICAgIC5wdXQoInBhcnRpdGlvbiIsIF9wYXJ0aXRpb24ucGFydGl0aW9uKQogICAgICAgICAgICAgICAgICAgICAucHV0KCJicm9rZXIiLCBJbW11dGFibGVNYXAub2YoImhvc3QiLCBfcGFydGl0aW9uLmhvc3QuaG9zdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicG9ydCIsIF9wYXJ0aXRpb24uaG9zdC5wb3J0KSkKLSAgICAgICAgICAgICAgICAgICAgLnB1dCgidG9waWMiLCBfc3BvdXRDb25maWcudG9waWMpLmJ1aWxkKCk7CisgICAgICAgICAgICAgICAgICAgIC5wdXQoInRvcGljIiwgX3BhcnRpdGlvbi50b3BpYykuYnVpbGQoKTsKICAgICAgICAgICAgIF9zdGF0ZS53cml0ZUpTT04oY29tbWl0dGVkUGF0aCgpLCBkYXRhKTsKIAogICAgICAgICAgICAgX2NvbW1pdHRlZFRvID0gbGFzdENvbXBsZXRlZE9mZnNldDsKQEAgLTI4OCwxMyArMzAwLDE0IEBACiAKICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKICAgICAgICAgY29tbWl0KCk7Ci0gICAgICAgIF9jb25uZWN0aW9ucy51bnJlZ2lzdGVyKF9wYXJ0aXRpb24uaG9zdCwgX3BhcnRpdGlvbi5wYXJ0aXRpb24pOworICAgICAgICBfY29ubmVjdGlvbnMudW5yZWdpc3RlcihfcGFydGl0aW9uLmhvc3QsIF9wYXJ0aXRpb24udG9waWMgLCBfcGFydGl0aW9uLnBhcnRpdGlvbik7CiAgICAgfQogCiAgICAgc3RhdGljIGNsYXNzIEthZmthTWVzc2FnZUlkIHsKICAgICAgICAgcHVibGljIFBhcnRpdGlvbiBwYXJ0aXRpb247CiAgICAgICAgIHB1YmxpYyBsb25nIG9mZnNldDsKIAorCiAgICAgICAgIHB1YmxpYyBLYWZrYU1lc3NhZ2VJZChQYXJ0aXRpb24gcGFydGl0aW9uLCBsb25nIG9mZnNldCkgewogICAgICAgICAgICAgdGhpcy5wYXJ0aXRpb24gPSBwYXJ0aXRpb247CiAgICAgICAgICAgICB0aGlzLm9mZnNldCA9IG9mZnNldDsKZGlmZiAtLWdpdCBhL2V4dGVybmFsL3N0b3JtLWthZmthL3NyYy9qdm0vc3Rvcm0va2Fma2EvU3RhdGljQ29vcmRpbmF0b3IuamF2YSBiL2V4dGVybmFsL3N0b3JtLWthZmthL3NyYy9qdm0vc3Rvcm0va2Fma2EvU3RhdGljQ29vcmRpbmF0b3IuamF2YQppbmRleCBkZTRkMGZkLi40YjIwZDg0IDEwMDY0NAotLS0gYS9leHRlcm5hbC9zdG9ybS1rYWZrYS9zcmMvanZtL3N0b3JtL2thZmthL1N0YXRpY0Nvb3JkaW5hdG9yLmphdmEKKysrIGIvZXh0ZXJuYWwvc3Rvcm0ta2Fma2Evc3JjL2p2bS9zdG9ybS9rYWZrYS9TdGF0aWNDb29yZGluYXRvci5qYXZhCkBAIC0xNywxMCArMTcsOSBAQAogICovCiBwYWNrYWdlIHN0b3JtLmthZmthOwogCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IHN0b3JtLmthZmthLnRyaWRlbnQuR2xvYmFsUGFydGl0aW9uSW5mb3JtYXRpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuKjsKIAogCiBwdWJsaWMgY2xhc3MgU3RhdGljQ29vcmRpbmF0b3IgaW1wbGVtZW50cyBQYXJ0aXRpb25Db29yZGluYXRvciB7CkBAIC0yOSw3ICsyOCw5IEBACiAKICAgICBwdWJsaWMgU3RhdGljQ29vcmRpbmF0b3IoRHluYW1pY1BhcnRpdGlvbkNvbm5lY3Rpb25zIGNvbm5lY3Rpb25zLCBNYXAgc3Rvcm1Db25mLCBTcG91dENvbmZpZyBjb25maWcsIFprU3RhdGUgc3RhdGUsIGludCB0YXNrSW5kZXgsIGludCB0b3RhbFRhc2tzLCBTdHJpbmcgdG9wb2xvZ3lJbnN0YW5jZUlkKSB7CiAgICAgICAgIFN0YXRpY0hvc3RzIGhvc3RzID0gKFN0YXRpY0hvc3RzKSBjb25maWcuaG9zdHM7Ci0gICAgICAgIExpc3Q8UGFydGl0aW9uPiBteVBhcnRpdGlvbnMgPSBLYWZrYVV0aWxzLmNhbGN1bGF0ZVBhcnRpdGlvbnNGb3JUYXNrKGhvc3RzLmdldFBhcnRpdGlvbkluZm9ybWF0aW9uKCksIHRvdGFsVGFza3MsIHRhc2tJbmRleCk7CisgICAgICAgIExpc3Q8R2xvYmFsUGFydGl0aW9uSW5mb3JtYXRpb24+IHBhcnRpdGlvbnMgPSBuZXcgQXJyYXlMaXN0PEdsb2JhbFBhcnRpdGlvbkluZm9ybWF0aW9uPigpOworICAgICAgICBwYXJ0aXRpb25zLmFkZChob3N0cy5nZXRQYXJ0aXRpb25JbmZvcm1hdGlvbigpKTsKKyAgICAgICAgTGlzdDxQYXJ0aXRpb24+IG15UGFydGl0aW9ucyA9IEthZmthVXRpbHMuY2FsY3VsYXRlUGFydGl0aW9uc0ZvclRhc2socGFydGl0aW9ucywgdG90YWxUYXNrcywgdGFza0luZGV4KTsKICAgICAgICAgZm9yIChQYXJ0aXRpb24gbXlQYXJ0aXRpb24gOiBteVBhcnRpdGlvbnMpIHsKICAgICAgICAgICAgIF9tYW5hZ2Vycy5wdXQobXlQYXJ0aXRpb24sIG5ldyBQYXJ0aXRpb25NYW5hZ2VyKGNvbm5lY3Rpb25zLCB0b3BvbG9neUluc3RhbmNlSWQsIHN0YXRlLCBzdG9ybUNvbmYsIGNvbmZpZywgbXlQYXJ0aXRpb24pKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvZXh0ZXJuYWwvc3Rvcm0ta2Fma2Evc3JjL2p2bS9zdG9ybS9rYWZrYS9TdHJpbmdLZXlWYWx1ZVNjaGVtZS5qYXZhIGIvZXh0ZXJuYWwvc3Rvcm0ta2Fma2Evc3JjL2p2bS9zdG9ybS9rYWZrYS9TdHJpbmdLZXlWYWx1ZVNjaGVtZS5qYXZhCmluZGV4IDQxY2FjYjYuLjZmNmQzMzkgMTAwNjQ0Ci0tLSBhL2V4dGVybmFsL3N0b3JtLWthZmthL3NyYy9qdm0vc3Rvcm0va2Fma2EvU3RyaW5nS2V5VmFsdWVTY2hlbWUuamF2YQorKysgYi9leHRlcm5hbC9zdG9ybS1rYWZrYS9zcmMvanZtL3N0b3JtL2thZmthL1N0cmluZ0tleVZhbHVlU2NoZW1lLmphdmEKQEAgLTIwLDEyICsyMCwxMyBAQAogaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnR1cGxlLlZhbHVlczsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKIAoraW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIHB1YmxpYyBjbGFzcyBTdHJpbmdLZXlWYWx1ZVNjaGVtZSBleHRlbmRzIFN0cmluZ1NjaGVtZSBpbXBsZW1lbnRzIEtleVZhbHVlU2NoZW1lIHsKIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBMaXN0PE9iamVjdD4gZGVzZXJpYWxpemVLZXlBbmRWYWx1ZShieXRlW10ga2V5LCBieXRlW10gdmFsdWUpIHsKKyAgICBwdWJsaWMgTGlzdDxPYmplY3Q+IGRlc2VyaWFsaXplS2V5QW5kVmFsdWUoQnl0ZUJ1ZmZlciBrZXksIEJ5dGVCdWZmZXIgdmFsdWUpIHsKICAgICAgICAgaWYgKCBrZXkgPT0gbnVsbCApIHsKICAgICAgICAgICAgIHJldHVybiBkZXNlcmlhbGl6ZSh2YWx1ZSk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2V4dGVybmFsL3N0b3JtLWthZmthL3NyYy9qdm0vc3Rvcm0va2Fma2EvU3RyaW5nTWVzc2FnZUFuZE1ldGFkYXRhU2NoZW1lLmphdmEgYi9leHRlcm5hbC9zdG9ybS1rYWZrYS9zcmMvanZtL3N0b3JtL2thZmthL1N0cmluZ01lc3NhZ2VBbmRNZXRhZGF0YVNjaGVtZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3MDhiOTcKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlcm5hbC9zdG9ybS1rYWZrYS9zcmMvanZtL3N0b3JtL2thZmthL1N0cmluZ01lc3NhZ2VBbmRNZXRhZGF0YVNjaGVtZS5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIHN0b3JtLmthZmthOworCitpbXBvcnQgYmFja3R5cGUuc3Rvcm0udHVwbGUuRmllbGRzOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnR1cGxlLlZhbHVlczsKKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK3B1YmxpYyBjbGFzcyBTdHJpbmdNZXNzYWdlQW5kTWV0YWRhdGFTY2hlbWUgZXh0ZW5kcyBTdHJpbmdTY2hlbWUgaW1wbGVtZW50cyBNZXNzYWdlTWV0YWRhdGFTY2hlbWUgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC01NDQxODQxOTIwNDQ3OTQ3Mzc0TDsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUklOR19TQ0hFTUVfUEFSVElUSU9OX0tFWSA9ICJwYXJ0aXRpb24iOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUklOR19TQ0hFTUVfT0ZGU0VUID0gIm9mZnNldCI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxPYmplY3Q+IGRlc2VyaWFsaXplTWVzc2FnZVdpdGhNZXRhZGF0YShCeXRlQnVmZmVyIG1lc3NhZ2UsIFBhcnRpdGlvbiBwYXJ0aXRpb24sIGxvbmcgb2Zmc2V0KSB7CisgICAgICAgIFN0cmluZyBzdHJpbmdNZXNzYWdlID0gU3RyaW5nU2NoZW1lLmRlc2VyaWFsaXplU3RyaW5nKG1lc3NhZ2UpOworICAgICAgICByZXR1cm4gbmV3IFZhbHVlcyhzdHJpbmdNZXNzYWdlLCBwYXJ0aXRpb24ucGFydGl0aW9uLCBvZmZzZXQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBGaWVsZHMgZ2V0T3V0cHV0RmllbGRzKCkgeworICAgICAgICByZXR1cm4gbmV3IEZpZWxkcyhTVFJJTkdfU0NIRU1FX0tFWSwgU1RSSU5HX1NDSEVNRV9QQVJUSVRJT05fS0VZLCBTVFJJTkdfU0NIRU1FX09GRlNFVCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9leHRlcm5hbC9zdG9ybS1rYWZrYS9zcmMvanZtL3N0b3JtL2thZmthL1N0cmluZ011bHRpU2NoZW1lV2l0aFRvcGljLmphdmEgYi9leHRlcm5hbC9zdG9ybS1rYWZrYS9zcmMvanZtL3N0b3JtL2thZmthL1N0cmluZ011bHRpU2NoZW1lV2l0aFRvcGljLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU3ZjIxNgotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVybmFsL3N0b3JtLWthZmthL3NyYy9qdm0vc3Rvcm0va2Fma2EvU3RyaW5nTXVsdGlTY2hlbWVXaXRoVG9waWMuamF2YQpAQCAtMCwwICsxLDQ4IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBzdG9ybS5rYWZrYTsKKworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnNwb3V0Lk11bHRpU2NoZW1lOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnR1cGxlLkZpZWxkczsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS50dXBsZS5WYWx1ZXM7CitpbXBvcnQgc3VuLnJlZmxlY3QuZ2VuZXJpY3MucmVmbGVjdGl2ZU9iamVjdHMuTm90SW1wbGVtZW50ZWRFeGNlcHRpb247CisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGNsYXNzIFN0cmluZ011bHRpU2NoZW1lV2l0aFRvcGljCisgICAgICAgIGltcGxlbWVudHMgTXVsdGlTY2hlbWUgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUklOR19TQ0hFTUVfS0VZID0gInN0ciI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BJQ19LRVkgPSAidG9waWMiOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEl0ZXJhYmxlPExpc3Q8T2JqZWN0Pj4gZGVzZXJpYWxpemUoQnl0ZUJ1ZmZlciBieXRlcykgeworICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSXRlcmFibGU8TGlzdDxPYmplY3Q+PiBkZXNlcmlhbGl6ZVdpdGhUb3BpYyhTdHJpbmcgdG9waWMsIEJ5dGVCdWZmZXIgYnl0ZXMpIHsKKyAgICAgICAgTGlzdDxPYmplY3Q+IGl0ZW1zID0gbmV3IFZhbHVlcyhTdHJpbmdTY2hlbWUuZGVzZXJpYWxpemVTdHJpbmcoYnl0ZXMpLCB0b3BpYyk7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGl0ZW1zKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRmllbGRzIGdldE91dHB1dEZpZWxkcygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGaWVsZHMoU1RSSU5HX1NDSEVNRV9LRVksIFRPUElDX0tFWSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXh0ZXJuYWwvc3Rvcm0ta2Fma2Evc3JjL2p2bS9zdG9ybS9rYWZrYS9TdHJpbmdTY2hlbWUuamF2YSBiL2V4dGVybmFsL3N0b3JtLWthZmthL3NyYy9qdm0vc3Rvcm0va2Fma2EvU3RyaW5nU2NoZW1lLmphdmEKaW5kZXggMjg2ZGM5Yi4uMTA3MWU2MCAxMDA2NDQKLS0tIGEvZXh0ZXJuYWwvc3Rvcm0ta2Fma2Evc3JjL2p2bS9zdG9ybS9rYWZrYS9TdHJpbmdTY2hlbWUuamF2YQorKysgYi9leHRlcm5hbC9zdG9ybS1rYWZrYS9zcmMvanZtL3N0b3JtL2thZmthL1N0cmluZ1NjaGVtZS5qYXZhCkBAIC0yMCwyMyArMjAsMjcgQEAKIGltcG9ydCBiYWNrdHlwZS5zdG9ybS5zcG91dC5TY2hlbWU7CiBpbXBvcnQgYmFja3R5cGUuc3Rvcm0udHVwbGUuRmllbGRzOwogaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnR1cGxlLlZhbHVlczsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS51dGlscy5VdGlsczsKIAotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIHB1YmxpYyBjbGFzcyBTdHJpbmdTY2hlbWUgaW1wbGVtZW50cyBTY2hlbWUgewotCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2hhcnNldCBVVEY4X0NIQVJTRVQgPSBTdGFuZGFyZENoYXJzZXRzLlVURl84OwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUklOR19TQ0hFTUVfS0VZID0gInN0ciI7CiAKLSAgICBwdWJsaWMgTGlzdDxPYmplY3Q+IGRlc2VyaWFsaXplKGJ5dGVbXSBieXRlcykgeworICAgIHB1YmxpYyBMaXN0PE9iamVjdD4gZGVzZXJpYWxpemUoQnl0ZUJ1ZmZlciBieXRlcykgewogICAgICAgICByZXR1cm4gbmV3IFZhbHVlcyhkZXNlcmlhbGl6ZVN0cmluZyhieXRlcykpOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlc2VyaWFsaXplU3RyaW5nKGJ5dGVbXSBzdHJpbmcpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKHN0cmluZywgIlVURi04Iik7Ci0gICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZGVzZXJpYWxpemVTdHJpbmcoQnl0ZUJ1ZmZlciBzdHJpbmcpIHsKKyAgICAgICAgaWYgKHN0cmluZy5oYXNBcnJheSgpKSB7CisgICAgICAgICAgICBpbnQgYmFzZSA9IHN0cmluZy5hcnJheU9mZnNldCgpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoc3RyaW5nLmFycmF5KCksIGJhc2UgKyBzdHJpbmcucG9zaXRpb24oKSwgc3RyaW5nLnJlbWFpbmluZygpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKFV0aWxzLnRvQnl0ZUFycmF5KHN0cmluZyksIFVURjhfQ0hBUlNFVCk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL2V4dGVybmFsL3N0b3JtLWthZmthL3NyYy9qdm0vc3Rvcm0va2Fma2EvWmtDb29yZGluYXRvci5qYXZhIGIvZXh0ZXJuYWwvc3Rvcm0ta2Fma2Evc3JjL2p2bS9zdG9ybS9rYWZrYS9aa0Nvb3JkaW5hdG9yLmphdmEKaW5kZXggM2FmNjQ4Yy4uODY1MGU2ZiAxMDA2NDQKLS0tIGEvZXh0ZXJuYWwvc3Rvcm0ta2Fma2Evc3JjL2p2bS9zdG9ybS9rYWZrYS9aa0Nvb3JkaW5hdG9yLmphdmEKKysrIGIvZXh0ZXJuYWwvc3Rvcm0ta2Fma2Evc3JjL2p2bS9zdG9ybS9rYWZrYS9aa0Nvb3JkaW5hdG9yLmphdmEKQEAgLTc2LDcgKzc2LDcgQEAKICAgICBwdWJsaWMgdm9pZCByZWZyZXNoKCkgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgTE9HLmluZm8odGFza0lkKF90YXNrSW5kZXgsIF90b3RhbFRhc2tzKSArICJSZWZyZXNoaW5nIHBhcnRpdGlvbiBtYW5hZ2VyIGNvbm5lY3Rpb25zIik7Ci0gICAgICAgICAgICBHbG9iYWxQYXJ0aXRpb25JbmZvcm1hdGlvbiBicm9rZXJJbmZvID0gX3JlYWRlci5nZXRCcm9rZXJJbmZvKCk7CisgICAgICAgICAgICBMaXN0PEdsb2JhbFBhcnRpdGlvbkluZm9ybWF0aW9uPiBicm9rZXJJbmZvID0gX3JlYWRlci5nZXRCcm9rZXJJbmZvKCk7CiAgICAgICAgICAgICBMaXN0PFBhcnRpdGlvbj4gbWluZSA9IEthZmthVXRpbHMuY2FsY3VsYXRlUGFydGl0aW9uc0ZvclRhc2soYnJva2VySW5mbywgX3RvdGFsVGFza3MsIF90YXNrSW5kZXgpOwogCiAgICAgICAgICAgICBTZXQ8UGFydGl0aW9uPiBjdXJyID0gX21hbmFnZXJzLmtleVNldCgpOwpkaWZmIC0tZ2l0IGEvZXh0ZXJuYWwvc3Rvcm0ta2Fma2Evc3JjL2p2bS9zdG9ybS9rYWZrYS9ib2x0L0thZmthQm9sdC5qYXZhIGIvZXh0ZXJuYWwvc3Rvcm0ta2Fma2Evc3JjL2p2bS9zdG9ybS9rYWZrYS9ib2x0L0thZmthQm9sdC5qYXZhCmluZGV4IDJjY2E4MjYuLjFlYmUxNDIgMTAwNjQ0Ci0tLSBhL2V4dGVybmFsL3N0b3JtLWthZmthL3NyYy9qdm0vc3Rvcm0va2Fma2EvYm9sdC9LYWZrYUJvbHQuamF2YQorKysgYi9leHRlcm5hbC9zdG9ybS1rYWZrYS9zcmMvanZtL3N0b3JtL2thZmthL2JvbHQvS2Fma2FCb2x0LmphdmEKQEAgLTU3LDcgKzU3LDYgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoS2Fma2FCb2x0LmNsYXNzKTsKIAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUElDID0gInRvcGljIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLQUZLQV9CUk9LRVJfUFJPUEVSVElFUyA9ICJrYWZrYS5icm9rZXIucHJvcGVydGllcyI7CiAKICAgICBwcml2YXRlIEthZmthUHJvZHVjZXI8SywgVj4gcHJvZHVjZXI7CiAgICAgcHJpdmF0ZSBPdXRwdXRDb2xsZWN0b3IgY29sbGVjdG9yOwpAQCAtNzMsOCArNzIsNyBAQAogICAgIHByaXZhdGUgYm9vbGVhbiBmaXJlQW5kRm9yZ2V0ID0gZmFsc2U7CiAgICAgcHJpdmF0ZSBib29sZWFuIGFzeW5jID0gdHJ1ZTsKIAotICAgIHB1YmxpYyBLYWZrYUJvbHQoKSB7Ci0gICAgfQorICAgIHB1YmxpYyBLYWZrYUJvbHQoKSB7fQogCiAgICAgcHVibGljIEthZmthQm9sdDxLLFY+IHdpdGhUdXBsZVRvS2Fma2FNYXBwZXIoVHVwbGVUb0thZmthTWFwcGVyPEssVj4gbWFwcGVyKSB7CiAgICAgICAgIHRoaXMubWFwcGVyID0gbWFwcGVyOwpAQCAtMTAzLDE0ICsxMDEsNyBAQAogICAgICAgICAgICAgdGhpcy50b3BpY1NlbGVjdG9yID0gbmV3IERlZmF1bHRUb3BpY1NlbGVjdG9yKChTdHJpbmcpIHN0b3JtQ29uZi5nZXQoVE9QSUMpKTsKICAgICAgICAgfQogCi0gICAgICAgIE1hcCBjb25maWdNYXAgPSAoTWFwKSBzdG9ybUNvbmYuZ2V0KEtBRktBX0JST0tFUl9QUk9QRVJUSUVTKTsKLSAgICAgICAgUHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICAgICAgaWYoY29uZmlnTWFwIT0gbnVsbCkKLSAgICAgICAgICAgIHByb3BlcnRpZXMucHV0QWxsKGNvbmZpZ01hcCk7Ci0gICAgICAgIGlmKGJvbHRTcGVjZmllZFByb3BlcnRpZXMgIT0gbnVsbCkKLSAgICAgICAgICAgIHByb3BlcnRpZXMucHV0QWxsKGJvbHRTcGVjZmllZFByb3BlcnRpZXMpOwotCi0gICAgICAgIHByb2R1Y2VyID0gbmV3IEthZmthUHJvZHVjZXI8SywgVj4ocHJvcGVydGllcyk7CisgICAgICAgIHByb2R1Y2VyID0gbmV3IEthZmthUHJvZHVjZXI8Pihib2x0U3BlY2ZpZWRQcm9wZXJ0aWVzKTsKICAgICAgICAgdGhpcy5jb2xsZWN0b3IgPSBjb2xsZWN0b3I7CiAgICAgfQogCmRpZmYgLS1naXQgYS9leHRlcm5hbC9zdG9ybS1rYWZrYS9zcmMvanZtL3N0b3JtL2thZmthL3RyaWRlbnQvQ29vcmRpbmF0b3IuamF2YSBiL2V4dGVybmFsL3N0b3JtLWthZmthL3NyYy9qdm0vc3Rvcm0va2Fma2EvdHJpZGVudC9Db29yZGluYXRvci5qYXZhCmluZGV4IGMzOTVmOGMuLmJkNzg2YjMgMTAwNjQ0Ci0tLSBhL2V4dGVybmFsL3N0b3JtLWthZmthL3NyYy9qdm0vc3Rvcm0va2Fma2EvdHJpZGVudC9Db29yZGluYXRvci5qYXZhCisrKyBiL2V4dGVybmFsL3N0b3JtLWthZmthL3NyYy9qdm0vc3Rvcm0va2Fma2EvdHJpZGVudC9Db29yZGluYXRvci5qYXZhCkBAIC0yMSw5ICsyMSwxMCBAQAogaW1wb3J0IHN0b3JtLnRyaWRlbnQuc3BvdXQuSU9wYXF1ZVBhcnRpdGlvbmVkVHJpZGVudFNwb3V0OwogaW1wb3J0IHN0b3JtLnRyaWRlbnQuc3BvdXQuSVBhcnRpdGlvbmVkVHJpZGVudFNwb3V0OwogCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIAotY2xhc3MgQ29vcmRpbmF0b3IgaW1wbGVtZW50cyBJUGFydGl0aW9uZWRUcmlkZW50U3BvdXQuQ29vcmRpbmF0b3I8R2xvYmFsUGFydGl0aW9uSW5mb3JtYXRpb24+LCBJT3BhcXVlUGFydGl0aW9uZWRUcmlkZW50U3BvdXQuQ29vcmRpbmF0b3I8R2xvYmFsUGFydGl0aW9uSW5mb3JtYXRpb24+IHsKK2NsYXNzIENvb3JkaW5hdG9yIGltcGxlbWVudHMgSVBhcnRpdGlvbmVkVHJpZGVudFNwb3V0LkNvb3JkaW5hdG9yPExpc3Q8R2xvYmFsUGFydGl0aW9uSW5mb3JtYXRpb24+PiwgSU9wYXF1ZVBhcnRpdGlvbmVkVHJpZGVudFNwb3V0LkNvb3JkaW5hdG9yPExpc3Q8R2xvYmFsUGFydGl0aW9uSW5mb3JtYXRpb24+PiB7CiAKICAgICBwcml2YXRlIElCcm9rZXJSZWFkZXIgcmVhZGVyOwogICAgIHByaXZhdGUgVHJpZGVudEthZmthQ29uZmlnIGNvbmZpZzsKQEAgLTQ0LDcgKzQ1LDcgQEAKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgR2xvYmFsUGFydGl0aW9uSW5mb3JtYXRpb24gZ2V0UGFydGl0aW9uc0ZvckJhdGNoKCkgewotICAgICAgICByZXR1cm4gcmVhZGVyLmdldEN1cnJlbnRCcm9rZXJzKCk7CisgICAgcHVibGljIExpc3Q8R2xvYmFsUGFydGl0aW9uSW5mb3JtYXRpb24+IGdldFBhcnRpdGlvbnNGb3JCYXRjaCgpIHsKKyAgICAgICAgcmV0dXJuIHJlYWRlci5nZXRBbGxCcm9rZXJzKCk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvZXh0ZXJuYWwvc3Rvcm0ta2Fma2Evc3JjL2p2bS9zdG9ybS9rYWZrYS90cmlkZW50L0dsb2JhbFBhcnRpdGlvbkluZm9ybWF0aW9uLmphdmEgYi9leHRlcm5hbC9zdG9ybS1rYWZrYS9zcmMvanZtL3N0b3JtL2thZmthL3RyaWRlbnQvR2xvYmFsUGFydGl0aW9uSW5mb3JtYXRpb24uamF2YQppbmRleCA3NmJlYzllLi5iMGQ5N2ZjIDEwMDY0NAotLS0gYS9leHRlcm5hbC9zdG9ybS1rYWZrYS9zcmMvanZtL3N0b3JtL2thZmthL3RyaWRlbnQvR2xvYmFsUGFydGl0aW9uSW5mb3JtYXRpb24uamF2YQorKysgYi9leHRlcm5hbC9zdG9ybS1rYWZrYS9zcmMvanZtL3N0b3JtL2thZmthL3RyaWRlbnQvR2xvYmFsUGFydGl0aW9uSW5mb3JtYXRpb24uamF2YQpAQCAtMjgsOSArMjgsMjEgQEAKIHB1YmxpYyBjbGFzcyBHbG9iYWxQYXJ0aXRpb25JbmZvcm1hdGlvbiBpbXBsZW1lbnRzIEl0ZXJhYmxlPFBhcnRpdGlvbj4sIFNlcmlhbGl6YWJsZSB7CiAKICAgICBwcml2YXRlIE1hcDxJbnRlZ2VyLCBCcm9rZXI+IHBhcnRpdGlvbk1hcDsKKyAgICBwdWJsaWMgU3RyaW5nIHRvcGljOwogCi0gICAgcHVibGljIEdsb2JhbFBhcnRpdGlvbkluZm9ybWF0aW9uKCkgewotICAgICAgICBwYXJ0aXRpb25NYXAgPSBuZXcgVHJlZU1hcDxJbnRlZ2VyLCBCcm9rZXI+KCk7CisgICAgLy9GbGFnIHRvIGtlZXAgdGhlIFBhcnRpdGlvbiBQYXRoIElkIGJhY2t3YXJkIGNvbXBhdGlibGUgd2l0aCBPbGQgaW1wbGVtZW50YXRpb24gb2YgUGFydGl0aW9uLmdldElkKCkgPT0gInBhcnRpdGlvbl8iICsgcGFydGl0aW9uCisgICAgcHJpdmF0ZSBCb29sZWFuIGJVc2VUb3BpY05hbWVGb3JQYXJ0aXRpb25QYXRoSWQ7CisKKyAgICBwdWJsaWMgR2xvYmFsUGFydGl0aW9uSW5mb3JtYXRpb24oU3RyaW5nIHRvcGljLCBCb29sZWFuIGJVc2VUb3BpY05hbWVGb3JQYXJ0aXRpb25QYXRoSWQpIHsKKyAgICAgICAgdGhpcy50b3BpYyA9IHRvcGljOworICAgICAgICB0aGlzLnBhcnRpdGlvbk1hcCA9IG5ldyBUcmVlTWFwPEludGVnZXIsIEJyb2tlcj4oKTsKKyAgICAgICAgdGhpcy5iVXNlVG9waWNOYW1lRm9yUGFydGl0aW9uUGF0aElkID0gYlVzZVRvcGljTmFtZUZvclBhcnRpdGlvblBhdGhJZDsKKyAgICB9CisKKyAgICBwdWJsaWMgR2xvYmFsUGFydGl0aW9uSW5mb3JtYXRpb24oU3RyaW5nIHRvcGljKSB7CisgICAgICAgIHRoaXMudG9waWMgPSB0b3BpYzsKKyAgICAgICAgdGhpcy5wYXJ0aXRpb25NYXAgPSBuZXcgVHJlZU1hcDxJbnRlZ2VyLCBCcm9rZXI+KCk7CisgICAgICAgIHRoaXMuYlVzZVRvcGljTmFtZUZvclBhcnRpdGlvblBhdGhJZCA9IGZhbHNlOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGFkZFBhcnRpdGlvbihpbnQgcGFydGl0aW9uSWQsIEJyb2tlciBicm9rZXIpIHsKQEAgLTQwLDcgKzUyLDggQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewogICAgICAgICByZXR1cm4gIkdsb2JhbFBhcnRpdGlvbkluZm9ybWF0aW9ueyIgKwotICAgICAgICAgICAgICAgICJwYXJ0aXRpb25NYXA9IiArIHBhcnRpdGlvbk1hcCArCisgICAgICAgICAgICAgICAgInRvcGljPSIgKyB0b3BpYyArCisgICAgICAgICAgICAgICAgIiwgcGFydGl0aW9uTWFwPSIgKyBwYXJ0aXRpb25NYXAgKwogICAgICAgICAgICAgICAgICd9JzsKICAgICB9CiAKQEAgLTUxLDcgKzY0LDcgQEAKICAgICBwdWJsaWMgTGlzdDxQYXJ0aXRpb24+IGdldE9yZGVyZWRQYXJ0aXRpb25zKCkgewogICAgICAgICBMaXN0PFBhcnRpdGlvbj4gcGFydGl0aW9ucyA9IG5ldyBMaW5rZWRMaXN0PFBhcnRpdGlvbj4oKTsKICAgICAgICAgZm9yIChNYXAuRW50cnk8SW50ZWdlciwgQnJva2VyPiBwYXJ0aXRpb24gOiBwYXJ0aXRpb25NYXAuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgcGFydGl0aW9ucy5hZGQobmV3IFBhcnRpdGlvbihwYXJ0aXRpb24uZ2V0VmFsdWUoKSwgcGFydGl0aW9uLmdldEtleSgpKSk7CisgICAgICAgICAgICBwYXJ0aXRpb25zLmFkZChuZXcgUGFydGl0aW9uKHBhcnRpdGlvbi5nZXRWYWx1ZSgpLCB0aGlzLnRvcGljLCBwYXJ0aXRpb24uZ2V0S2V5KCksIHRoaXMuYlVzZVRvcGljTmFtZUZvclBhcnRpdGlvblBhdGhJZCkpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBwYXJ0aXRpb25zOwogICAgIH0KQEAgLTU5LDcgKzcyLDggQEAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgSXRlcmF0b3I8UGFydGl0aW9uPiBpdGVyYXRvcigpIHsKICAgICAgICAgZmluYWwgSXRlcmF0b3I8TWFwLkVudHJ5PEludGVnZXIsIEJyb2tlcj4+IGl0ZXJhdG9yID0gcGFydGl0aW9uTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLQorICAgICAgICBmaW5hbCBTdHJpbmcgdG9waWMgPSB0aGlzLnRvcGljOworICAgICAgICBmaW5hbCBCb29sZWFuIGJVc2VUb3BpY05hbWVGb3JQYXJ0aXRpb25QYXRoSWQgPSB0aGlzLmJVc2VUb3BpY05hbWVGb3JQYXJ0aXRpb25QYXRoSWQ7CiAgICAgICAgIHJldHVybiBuZXcgSXRlcmF0b3I8UGFydGl0aW9uPigpIHsKICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKQEAgLTY5LDcgKzgzLDcgQEAKICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIFBhcnRpdGlvbiBuZXh0KCkgewogICAgICAgICAgICAgICAgIE1hcC5FbnRyeTxJbnRlZ2VyLCBCcm9rZXI+IG5leHQgPSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQYXJ0aXRpb24obmV4dC5nZXRWYWx1ZSgpLCBuZXh0LmdldEtleSgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBhcnRpdGlvbihuZXh0LmdldFZhbHVlKCksIHRvcGljICwgbmV4dC5nZXRLZXkoKSwgYlVzZVRvcGljTmFtZUZvclBhcnRpdGlvblBhdGhJZCk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvZXh0ZXJuYWwvc3Rvcm0ta2Fma2Evc3JjL2p2bS9zdG9ybS9rYWZrYS90cmlkZW50L0lCcm9rZXJSZWFkZXIuamF2YSBiL2V4dGVybmFsL3N0b3JtLWthZmthL3NyYy9qdm0vc3Rvcm0va2Fma2EvdHJpZGVudC9JQnJva2VyUmVhZGVyLmphdmEKaW5kZXggM2UwMThkOS4uYWZiYTY1OSAxMDA2NDQKLS0tIGEvZXh0ZXJuYWwvc3Rvcm0ta2Fma2Evc3JjL2p2bS9zdG9ybS9rYWZrYS90cmlkZW50L0lCcm9rZXJSZWFkZXIuamF2YQorKysgYi9leHRlcm5hbC9zdG9ybS1rYWZrYS9zcmMvanZtL3N0b3JtL2thZmthL3RyaWRlbnQvSUJyb2tlclJlYWRlci5qYXZhCkBAIC0xNyw5ICsxNywxNCBAQAogICovCiBwYWNrYWdlIHN0b3JtLmthZmthLnRyaWRlbnQ7CiAKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCiBwdWJsaWMgaW50ZXJmYWNlIElCcm9rZXJSZWFkZXIgewogCi0gICAgR2xvYmFsUGFydGl0aW9uSW5mb3JtYXRpb24gZ2V0Q3VycmVudEJyb2tlcnMoKTsKKyAgICBHbG9iYWxQYXJ0aXRpb25JbmZvcm1hdGlvbiBnZXRCcm9rZXJGb3JUb3BpYyhTdHJpbmcgdG9waWMpOworCisgICAgTGlzdDxHbG9iYWxQYXJ0aXRpb25JbmZvcm1hdGlvbj4gZ2V0QWxsQnJva2VycygpOwogCiAgICAgdm9pZCBjbG9zZSgpOwogfQpkaWZmIC0tZ2l0IGEvZXh0ZXJuYWwvc3Rvcm0ta2Fma2Evc3JjL2p2bS9zdG9ybS9rYWZrYS90cmlkZW50L09wYXF1ZVRyaWRlbnRLYWZrYVNwb3V0LmphdmEgYi9leHRlcm5hbC9zdG9ybS1rYWZrYS9zcmMvanZtL3N0b3JtL2thZmthL3RyaWRlbnQvT3BhcXVlVHJpZGVudEthZmthU3BvdXQuamF2YQppbmRleCAxMzZlN2QyLi5mYmQxZDdhIDEwMDY0NAotLS0gYS9leHRlcm5hbC9zdG9ybS1rYWZrYS9zcmMvanZtL3N0b3JtL2thZmthL3RyaWRlbnQvT3BhcXVlVHJpZGVudEthZmthU3BvdXQuamF2YQorKysgYi9leHRlcm5hbC9zdG9ybS1rYWZrYS9zcmMvanZtL3N0b3JtL2thZmthL3RyaWRlbnQvT3BhcXVlVHJpZGVudEthZmthU3BvdXQuamF2YQpAQCAtMjIsMjMgKzIyLDI0IEBACiBpbXBvcnQgc3Rvcm0ua2Fma2EuUGFydGl0aW9uOwogaW1wb3J0IHN0b3JtLnRyaWRlbnQuc3BvdXQuSU9wYXF1ZVBhcnRpdGlvbmVkVHJpZGVudFNwb3V0OwogCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuVVVJRDsKIAogCi1wdWJsaWMgY2xhc3MgT3BhcXVlVHJpZGVudEthZmthU3BvdXQgaW1wbGVtZW50cyBJT3BhcXVlUGFydGl0aW9uZWRUcmlkZW50U3BvdXQ8R2xvYmFsUGFydGl0aW9uSW5mb3JtYXRpb24sIFBhcnRpdGlvbiwgTWFwPiB7CitwdWJsaWMgY2xhc3MgT3BhcXVlVHJpZGVudEthZmthU3BvdXQgaW1wbGVtZW50cyBJT3BhcXVlUGFydGl0aW9uZWRUcmlkZW50U3BvdXQ8TGlzdDxHbG9iYWxQYXJ0aXRpb25JbmZvcm1hdGlvbj4sIFBhcnRpdGlvbiwgTWFwPiB7CiAKIAogICAgIFRyaWRlbnRLYWZrYUNvbmZpZyBfY29uZmlnOwotICAgIFN0cmluZyBfdG9wb2xvZ3lJbnN0YW5jZUlkID0gVVVJRC5yYW5kb21VVUlEKCkudG9TdHJpbmcoKTsKIAogICAgIHB1YmxpYyBPcGFxdWVUcmlkZW50S2Fma2FTcG91dChUcmlkZW50S2Fma2FDb25maWcgY29uZmlnKSB7CiAgICAgICAgIF9jb25maWcgPSBjb25maWc7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIElPcGFxdWVQYXJ0aXRpb25lZFRyaWRlbnRTcG91dC5FbWl0dGVyPEdsb2JhbFBhcnRpdGlvbkluZm9ybWF0aW9uLCBQYXJ0aXRpb24sIE1hcD4gZ2V0RW1pdHRlcihNYXAgY29uZiwgVG9wb2xvZ3lDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUcmlkZW50S2Fma2FFbWl0dGVyKGNvbmYsIGNvbnRleHQsIF9jb25maWcsIF90b3BvbG9neUluc3RhbmNlSWQpLmFzT3BhcXVlRW1pdHRlcigpOworICAgIHB1YmxpYyBJT3BhcXVlUGFydGl0aW9uZWRUcmlkZW50U3BvdXQuRW1pdHRlcjxMaXN0PEdsb2JhbFBhcnRpdGlvbkluZm9ybWF0aW9uPiwgUGFydGl0aW9uLCBNYXA+IGdldEVtaXR0ZXIoTWFwIGNvbmYsIFRvcG9sb2d5Q29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiBuZXcgVHJpZGVudEthZmthRW1pdHRlcihjb25mLCBjb250ZXh0LCBfY29uZmlnLCBjb250ZXh0CisgICAgICAgICAgICAgICAgLmdldFN0b3JtSWQoKSkuYXNPcGFxdWVFbWl0dGVyKCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9leHRlcm5hbC9zdG9ybS1rYWZrYS9zcmMvanZtL3N0b3JtL2thZmthL3RyaWRlbnQvU3RhdGljQnJva2VyUmVhZGVyLmphdmEgYi9leHRlcm5hbC9zdG9ybS1rYWZrYS9zcmMvanZtL3N0b3JtL2thZmthL3RyaWRlbnQvU3RhdGljQnJva2VyUmVhZGVyLmphdmEKaW5kZXggZDE2NzNmMS4uY2E4M2MwNiAxMDA2NDQKLS0tIGEvZXh0ZXJuYWwvc3Rvcm0ta2Fma2Evc3JjL2p2bS9zdG9ybS9rYWZrYS90cmlkZW50L1N0YXRpY0Jyb2tlclJlYWRlci5qYXZhCisrKyBiL2V4dGVybmFsL3N0b3JtLWthZmthL3NyYy9qdm0vc3Rvcm0va2Fma2EvdHJpZGVudC9TdGF0aWNCcm9rZXJSZWFkZXIuamF2YQpAQCAtMTcsMTcgKzE3LDMwIEBACiAgKi8KIHBhY2thZ2Ugc3Rvcm0ua2Fma2EudHJpZGVudDsKIAoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKKwogcHVibGljIGNsYXNzIFN0YXRpY0Jyb2tlclJlYWRlciBpbXBsZW1lbnRzIElCcm9rZXJSZWFkZXIgewogCi0gICAgcHJpdmF0ZSBHbG9iYWxQYXJ0aXRpb25JbmZvcm1hdGlvbiBicm9rZXJzID0gbmV3IEdsb2JhbFBhcnRpdGlvbkluZm9ybWF0aW9uKCk7CisgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLEdsb2JhbFBhcnRpdGlvbkluZm9ybWF0aW9uPiBicm9rZXJzID0gbmV3IFRyZWVNYXA8U3RyaW5nLEdsb2JhbFBhcnRpdGlvbkluZm9ybWF0aW9uPigpOwogCi0gICAgcHVibGljIFN0YXRpY0Jyb2tlclJlYWRlcihHbG9iYWxQYXJ0aXRpb25JbmZvcm1hdGlvbiBwYXJ0aXRpb25JbmZvcm1hdGlvbikgewotICAgICAgICB0aGlzLmJyb2tlcnMgPSBwYXJ0aXRpb25JbmZvcm1hdGlvbjsKKyAgICBwdWJsaWMgU3RhdGljQnJva2VyUmVhZGVyKFN0cmluZyB0b3BpYywgR2xvYmFsUGFydGl0aW9uSW5mb3JtYXRpb24gcGFydGl0aW9uSW5mb3JtYXRpb24pIHsKKyAgICAgICAgdGhpcy5icm9rZXJzLnB1dCh0b3BpYywgcGFydGl0aW9uSW5mb3JtYXRpb24pOwogICAgIH0KIAogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBHbG9iYWxQYXJ0aXRpb25JbmZvcm1hdGlvbiBnZXRDdXJyZW50QnJva2VycygpIHsKLSAgICAgICAgcmV0dXJuIGJyb2tlcnM7CisgICAgcHVibGljIEdsb2JhbFBhcnRpdGlvbkluZm9ybWF0aW9uIGdldEJyb2tlckZvclRvcGljKFN0cmluZyB0b3BpYykgeworICAgICAgICBpZiAoYnJva2Vycy5jb250YWluc0tleSh0b3BpYykpIHJldHVybiBicm9rZXJzLmdldCh0b3BpYyk7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PEdsb2JhbFBhcnRpdGlvbkluZm9ybWF0aW9uPiBnZXRBbGxCcm9rZXJzICgpIHsKKyAgICAgICAgTGlzdDxHbG9iYWxQYXJ0aXRpb25JbmZvcm1hdGlvbj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8R2xvYmFsUGFydGl0aW9uSW5mb3JtYXRpb24+KCk7CisgICAgICAgIGxpc3QuYWRkQWxsKGJyb2tlcnMudmFsdWVzKCkpOworICAgICAgICByZXR1cm4gbGlzdDsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL2V4dGVybmFsL3N0b3JtLWthZmthL3NyYy9qdm0vc3Rvcm0va2Fma2EvdHJpZGVudC9UcmFuc2FjdGlvbmFsVHJpZGVudEthZmthU3BvdXQuamF2YSBiL2V4dGVybmFsL3N0b3JtLWthZmthL3NyYy9qdm0vc3Rvcm0va2Fma2EvdHJpZGVudC9UcmFuc2FjdGlvbmFsVHJpZGVudEthZmthU3BvdXQuamF2YQppbmRleCA4YzEwYmVkLi45ZmVmZmM4IDEwMDY0NAotLS0gYS9leHRlcm5hbC9zdG9ybS1rYWZrYS9zcmMvanZtL3N0b3JtL2thZmthL3RyaWRlbnQvVHJhbnNhY3Rpb25hbFRyaWRlbnRLYWZrYVNwb3V0LmphdmEKKysrIGIvZXh0ZXJuYWwvc3Rvcm0ta2Fma2Evc3JjL2p2bS9zdG9ybS9rYWZrYS90cmlkZW50L1RyYW5zYWN0aW9uYWxUcmlkZW50S2Fma2FTcG91dC5qYXZhCkBAIC0yOSw3ICsyOSw2IEBACiBwdWJsaWMgY2xhc3MgVHJhbnNhY3Rpb25hbFRyaWRlbnRLYWZrYVNwb3V0IGltcGxlbWVudHMgSVBhcnRpdGlvbmVkVHJpZGVudFNwb3V0PEdsb2JhbFBhcnRpdGlvbkluZm9ybWF0aW9uLCBQYXJ0aXRpb24sIE1hcD4gewogCiAgICAgVHJpZGVudEthZmthQ29uZmlnIF9jb25maWc7Ci0gICAgU3RyaW5nIF90b3BvbG9neUluc3RhbmNlSWQgPSBVVUlELnJhbmRvbVVVSUQoKS50b1N0cmluZygpOwogCiAgICAgcHVibGljIFRyYW5zYWN0aW9uYWxUcmlkZW50S2Fma2FTcG91dChUcmlkZW50S2Fma2FDb25maWcgY29uZmlnKSB7CiAgICAgICAgIF9jb25maWcgPSBjb25maWc7CkBAIC00Myw3ICs0Miw4IEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgSVBhcnRpdGlvbmVkVHJpZGVudFNwb3V0LkVtaXR0ZXIgZ2V0RW1pdHRlcihNYXAgY29uZiwgVG9wb2xvZ3lDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUcmlkZW50S2Fma2FFbWl0dGVyKGNvbmYsIGNvbnRleHQsIF9jb25maWcsIF90b3BvbG9neUluc3RhbmNlSWQpLmFzVHJhbnNhY3Rpb25hbEVtaXR0ZXIoKTsKKyAgICAgICAgcmV0dXJuIG5ldyBUcmlkZW50S2Fma2FFbWl0dGVyKGNvbmYsIGNvbnRleHQsIF9jb25maWcsIGNvbnRleHQKKyAgICAgICAgICAgICAgICAuZ2V0U3Rvcm1JZCgpKS5hc1RyYW5zYWN0aW9uYWxFbWl0dGVyKCk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9leHRlcm5hbC9zdG9ybS1rYWZrYS9zcmMvanZtL3N0b3JtL2thZmthL3RyaWRlbnQvVHJpZGVudEthZmthRW1pdHRlci5qYXZhIGIvZXh0ZXJuYWwvc3Rvcm0ta2Fma2Evc3JjL2p2bS9zdG9ybS9rYWZrYS90cmlkZW50L1RyaWRlbnRLYWZrYUVtaXR0ZXIuamF2YQppbmRleCA2MWM3OWE1Li5hOTdkMmNiIDEwMDY0NAotLS0gYS9leHRlcm5hbC9zdG9ybS1rYWZrYS9zcmMvanZtL3N0b3JtL2thZmthL3RyaWRlbnQvVHJpZGVudEthZmthRW1pdHRlci5qYXZhCisrKyBiL2V4dGVybmFsL3N0b3JtLWthZmthL3NyYy9qdm0vc3Rvcm0va2Fma2EvdHJpZGVudC9UcmlkZW50S2Fma2FFbWl0dGVyLmphdmEKQEAgLTM2LDEwICszNiw3IEBACiBpbXBvcnQgc3Rvcm0udHJpZGVudC5zcG91dC5JUGFydGl0aW9uZWRUcmlkZW50U3BvdXQ7CiBpbXBvcnQgc3Rvcm0udHJpZGVudC50b3BvbG9neS5UcmFuc2FjdGlvbkF0dGVtcHQ7CiAKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC4qOwogCiBwdWJsaWMgY2xhc3MgVHJpZGVudEthZmthRW1pdHRlciB7CiAKQEAgLTU4LDcgKzU1LDcgQEAKICAgICAgICAgX3RvcG9sb2d5SW5zdGFuY2VJZCA9IHRvcG9sb2d5SW5zdGFuY2VJZDsKICAgICAgICAgX2Nvbm5lY3Rpb25zID0gbmV3IER5bmFtaWNQYXJ0aXRpb25Db25uZWN0aW9ucyhfY29uZmlnLCBLYWZrYVV0aWxzLm1ha2VCcm9rZXJSZWFkZXIoY29uZiwgX2NvbmZpZykpOwogICAgICAgICBfdG9wb2xvZ3lOYW1lID0gKFN0cmluZykgY29uZi5nZXQoQ29uZmlnLlRPUE9MT0dZX05BTUUpOwotICAgICAgICBfa2Fma2FPZmZzZXRNZXRyaWMgPSBuZXcgS2Fma2FVdGlscy5LYWZrYU9mZnNldE1ldHJpYyhfY29uZmlnLnRvcGljLCBfY29ubmVjdGlvbnMpOworICAgICAgICBfa2Fma2FPZmZzZXRNZXRyaWMgPSBuZXcgS2Fma2FVdGlscy5LYWZrYU9mZnNldE1ldHJpYyhfY29ubmVjdGlvbnMpOwogICAgICAgICBjb250ZXh0LnJlZ2lzdGVyTWV0cmljKCJrYWZrYU9mZnNldCIsIF9rYWZrYU9mZnNldE1ldHJpYywgX2NvbmZpZy5tZXRyaWNzVGltZUJ1Y2tldFNpemVJblNlY3MpOwogICAgICAgICBfa2Fma2FNZWFuRmV0Y2hMYXRlbmN5TWV0cmljID0gY29udGV4dC5yZWdpc3Rlck1ldHJpYygia2Fma2FGZXRjaEF2ZyIsIG5ldyBNZWFuUmVkdWNlcigpLCBfY29uZmlnLm1ldHJpY3NUaW1lQnVja2V0U2l6ZUluU2Vjcyk7CiAgICAgICAgIF9rYWZrYU1heEZldGNoTGF0ZW5jeU1ldHJpYyA9IGNvbnRleHQucmVnaXN0ZXJNZXRyaWMoImthZmthRmV0Y2hNYXgiLCBuZXcgTWF4TWV0cmljKCksIF9jb25maWcubWV0cmljc1RpbWVCdWNrZXRTaXplSW5TZWNzKTsKQEAgLTg1LDcgKzgyLDcgQEAKICAgICAgICAgICAgICAgICByZXQucHV0KCJuZXh0T2Zmc2V0IiwgbGFzdE1ldGEuZ2V0KCJuZXh0T2Zmc2V0IikpOwogICAgICAgICAgICAgICAgIHJldC5wdXQoInBhcnRpdGlvbiIsIHBhcnRpdGlvbi5wYXJ0aXRpb24pOwogICAgICAgICAgICAgICAgIHJldC5wdXQoImJyb2tlciIsIEltbXV0YWJsZU1hcC5vZigiaG9zdCIsIHBhcnRpdGlvbi5ob3N0Lmhvc3QsICJwb3J0IiwgcGFydGl0aW9uLmhvc3QucG9ydCkpOwotICAgICAgICAgICAgICAgIHJldC5wdXQoInRvcGljIiwgX2NvbmZpZy50b3BpYyk7CisgICAgICAgICAgICAgICAgcmV0LnB1dCgidG9waWMiLCBwYXJ0aXRpb24udG9waWMpOwogICAgICAgICAgICAgICAgIHJldC5wdXQoInRvcG9sb2d5IiwgSW1tdXRhYmxlTWFwLm9mKCJuYW1lIiwgX3RvcG9sb2d5TmFtZSwgImlkIiwgX3RvcG9sb2d5SW5zdGFuY2VJZCkpOwogICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgICB9CkBAIC0xMDEsMTkgKzk4LDE5IEBACiAgICAgICAgICAgICAgICAgbGFzdEluc3RhbmNlSWQgPSAoU3RyaW5nKSBsYXN0VG9wb01ldGEuZ2V0KCJpZCIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKF9jb25maWcuaWdub3JlWmtPZmZzZXRzICYmICFfdG9wb2xvZ3lJbnN0YW5jZUlkLmVxdWFscyhsYXN0SW5zdGFuY2VJZCkpIHsKLSAgICAgICAgICAgICAgICBvZmZzZXQgPSBLYWZrYVV0aWxzLmdldE9mZnNldChjb25zdW1lciwgX2NvbmZpZy50b3BpYywgcGFydGl0aW9uLnBhcnRpdGlvbiwgX2NvbmZpZy5zdGFydE9mZnNldFRpbWUpOworICAgICAgICAgICAgICAgIG9mZnNldCA9IEthZmthVXRpbHMuZ2V0T2Zmc2V0KGNvbnN1bWVyLCBwYXJ0aXRpb24udG9waWMsIHBhcnRpdGlvbi5wYXJ0aXRpb24sIF9jb25maWcuc3RhcnRPZmZzZXRUaW1lKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gKExvbmcpIGxhc3RNZXRhLmdldCgibmV4dE9mZnNldCIpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgb2Zmc2V0ID0gS2Fma2FVdGlscy5nZXRPZmZzZXQoY29uc3VtZXIsIF9jb25maWcudG9waWMsIHBhcnRpdGlvbi5wYXJ0aXRpb24sIF9jb25maWcpOworICAgICAgICAgICAgb2Zmc2V0ID0gS2Fma2FVdGlscy5nZXRPZmZzZXQoY29uc3VtZXIsIHBhcnRpdGlvbi50b3BpYywgcGFydGl0aW9uLnBhcnRpdGlvbiwgX2NvbmZpZyk7CiAgICAgICAgIH0KIAogICAgICAgICBCeXRlQnVmZmVyTWVzc2FnZVNldCBtc2dzID0gbnVsbDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIG1zZ3MgPSBmZXRjaE1lc3NhZ2VzKGNvbnN1bWVyLCBwYXJ0aXRpb24sIG9mZnNldCk7CiAgICAgICAgIH0gY2F0Y2ggKFRvcGljT2Zmc2V0T3V0T2ZSYW5nZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBsb25nIG5ld09mZnNldCA9IEthZmthVXRpbHMuZ2V0T2Zmc2V0KGNvbnN1bWVyLCBfY29uZmlnLnRvcGljLCBwYXJ0aXRpb24ucGFydGl0aW9uLCBrYWZrYS5hcGkuT2Zmc2V0UmVxdWVzdC5FYXJsaWVzdFRpbWUoKSk7CisgICAgICAgICAgICBsb25nIG5ld09mZnNldCA9IEthZmthVXRpbHMuZ2V0T2Zmc2V0KGNvbnN1bWVyLCBwYXJ0aXRpb24udG9waWMsIHBhcnRpdGlvbi5wYXJ0aXRpb24sIGthZmthLmFwaS5PZmZzZXRSZXF1ZXN0LkVhcmxpZXN0VGltZSgpKTsKICAgICAgICAgICAgIExPRy53YXJuKCJPZmZzZXRPdXRPZlJhbmdlOiBVcGRhdGluZyBvZmZzZXQgZnJvbSBvZmZzZXQgPSAiICsgb2Zmc2V0ICsgIiB0byBvZmZzZXQgPSAiICsgbmV3T2Zmc2V0KTsKICAgICAgICAgICAgIG9mZnNldCA9IG5ld09mZnNldDsKICAgICAgICAgICAgIG1zZ3MgPSBLYWZrYVV0aWxzLmZldGNoTWVzc2FnZXMoX2NvbmZpZywgY29uc3VtZXIsIHBhcnRpdGlvbiwgb2Zmc2V0KTsKQEAgLTEyMSw3ICsxMTgsNyBAQAogCiAgICAgICAgIGxvbmcgZW5kb2Zmc2V0ID0gb2Zmc2V0OwogICAgICAgICBmb3IgKE1lc3NhZ2VBbmRPZmZzZXQgbXNnIDogbXNncykgewotICAgICAgICAgICAgZW1pdChjb2xsZWN0b3IsIG1zZy5tZXNzYWdlKCkpOworICAgICAgICAgICAgZW1pdChjb2xsZWN0b3IsIG1zZy5tZXNzYWdlKCksIHBhcnRpdGlvbiwgbXNnLm9mZnNldCgpKTsKICAgICAgICAgICAgIGVuZG9mZnNldCA9IG1zZy5uZXh0T2Zmc2V0KCk7CiAgICAgICAgIH0KICAgICAgICAgTWFwIG5ld01ldGEgPSBuZXcgSGFzaE1hcCgpOwpAQCAtMTMwLDcgKzEyNyw3IEBACiAgICAgICAgIG5ld01ldGEucHV0KCJpbnN0YW5jZUlkIiwgX3RvcG9sb2d5SW5zdGFuY2VJZCk7CiAgICAgICAgIG5ld01ldGEucHV0KCJwYXJ0aXRpb24iLCBwYXJ0aXRpb24ucGFydGl0aW9uKTsKICAgICAgICAgbmV3TWV0YS5wdXQoImJyb2tlciIsIEltbXV0YWJsZU1hcC5vZigiaG9zdCIsIHBhcnRpdGlvbi5ob3N0Lmhvc3QsICJwb3J0IiwgcGFydGl0aW9uLmhvc3QucG9ydCkpOwotICAgICAgICBuZXdNZXRhLnB1dCgidG9waWMiLCBfY29uZmlnLnRvcGljKTsKKyAgICAgICAgbmV3TWV0YS5wdXQoInRvcGljIiwgcGFydGl0aW9uLnRvcGljKTsKICAgICAgICAgbmV3TWV0YS5wdXQoInRvcG9sb2d5IiwgSW1tdXRhYmxlTWFwLm9mKCJuYW1lIiwgX3RvcG9sb2d5TmFtZSwgImlkIiwgX3RvcG9sb2d5SW5zdGFuY2VJZCkpOwogICAgICAgICByZXR1cm4gbmV3TWV0YTsKICAgICB9CkBAIC0xNzIsMTUgKzE2OSwyMSBAQAogICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID4gbmV4dE9mZnNldCkgewogICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkVycm9yIHdoZW4gcmUtZW1pdHRpbmcgYmF0Y2guIG92ZXJzaG90IHRoZSBlbmQgb2Zmc2V0Iik7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZW1pdChjb2xsZWN0b3IsIG1zZy5tZXNzYWdlKCkpOworICAgICAgICAgICAgICAgICAgICBlbWl0KGNvbGxlY3RvciwgbXNnLm1lc3NhZ2UoKSwgcGFydGl0aW9uLCBtc2cub2Zmc2V0KCkpOwogICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSBtc2cubmV4dE9mZnNldCgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAotICAgIHByaXZhdGUgdm9pZCBlbWl0KFRyaWRlbnRDb2xsZWN0b3IgY29sbGVjdG9yLCBNZXNzYWdlIG1zZykgewotICAgICAgICBJdGVyYWJsZTxMaXN0PE9iamVjdD4+IHZhbHVlcyA9IEthZmthVXRpbHMuZ2VuZXJhdGVUdXBsZXMoX2NvbmZpZywgbXNnKTsKKyAgICBwcml2YXRlIHZvaWQgZW1pdChUcmlkZW50Q29sbGVjdG9yIGNvbGxlY3RvciwgTWVzc2FnZSBtc2csIFBhcnRpdGlvbiBwYXJ0aXRpb24sIGxvbmcgb2Zmc2V0KSB7CisgICAgICAgIEl0ZXJhYmxlPExpc3Q8T2JqZWN0Pj4gdmFsdWVzOworICAgICAgICBpZiAoX2NvbmZpZy5zY2hlbWUgaW5zdGFuY2VvZiBNZXNzYWdlTWV0YWRhdGFTY2hlbWVBc011bHRpU2NoZW1lKSB7CisgICAgICAgICAgICB2YWx1ZXMgPSBLYWZrYVV0aWxzLmdlbmVyYXRlVHVwbGVzKChNZXNzYWdlTWV0YWRhdGFTY2hlbWVBc011bHRpU2NoZW1lKSBfY29uZmlnLnNjaGVtZSwgbXNnLCBwYXJ0aXRpb24sIG9mZnNldCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2YWx1ZXMgPSBLYWZrYVV0aWxzLmdlbmVyYXRlVHVwbGVzKF9jb25maWcsIG1zZywgcGFydGl0aW9uLnRvcGljKTsKKyAgICAgICAgfQorCiAgICAgICAgIGlmICh2YWx1ZXMgIT0gbnVsbCkgewogICAgICAgICAgICAgZm9yIChMaXN0PE9iamVjdD4gdmFsdWUgOiB2YWx1ZXMpIHsKICAgICAgICAgICAgICAgICBjb2xsZWN0b3IuZW1pdCh2YWx1ZSk7CkBAIC0xOTIsOCArMTk1LDExIEBACiAgICAgICAgIF9jb25uZWN0aW9ucy5jbGVhcigpOwogICAgIH0KIAotICAgIHByaXZhdGUgTGlzdDxQYXJ0aXRpb24+IG9yZGVyUGFydGl0aW9ucyhHbG9iYWxQYXJ0aXRpb25JbmZvcm1hdGlvbiBwYXJ0aXRpb25zKSB7Ci0gICAgICAgIHJldHVybiBwYXJ0aXRpb25zLmdldE9yZGVyZWRQYXJ0aXRpb25zKCk7CisgICAgcHJpdmF0ZSBMaXN0PFBhcnRpdGlvbj4gb3JkZXJQYXJ0aXRpb25zKExpc3Q8R2xvYmFsUGFydGl0aW9uSW5mb3JtYXRpb24+IHBhcnRpdGlvbnMpIHsKKyAgICAgICAgTGlzdDxQYXJ0aXRpb24+IHBhcnQgPSBuZXcgQXJyYXlMaXN0PFBhcnRpdGlvbj4oKTsKKyAgICAgICAgZm9yIChHbG9iYWxQYXJ0aXRpb25JbmZvcm1hdGlvbiBnbG9iYWxQYXJ0aXRpb25JbmZvcm1hdGlvbiA6IHBhcnRpdGlvbnMpCisgICAgICAgICAgICBwYXJ0LmFkZEFsbChnbG9iYWxQYXJ0aXRpb25JbmZvcm1hdGlvbi5nZXRPcmRlcmVkUGFydGl0aW9ucygpKTsKKyAgICAgICAgcmV0dXJuIHBhcnQ7CiAgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHJlZnJlc2goTGlzdDxQYXJ0aXRpb24+IGxpc3QpIHsKQEAgLTIwMiw5ICsyMDgsOSBAQAogICAgIH0KIAogCi0gICAgcHVibGljIElPcGFxdWVQYXJ0aXRpb25lZFRyaWRlbnRTcG91dC5FbWl0dGVyPEdsb2JhbFBhcnRpdGlvbkluZm9ybWF0aW9uLCBQYXJ0aXRpb24sIE1hcD4gYXNPcGFxdWVFbWl0dGVyKCkgeworICAgIHB1YmxpYyBJT3BhcXVlUGFydGl0aW9uZWRUcmlkZW50U3BvdXQuRW1pdHRlcjxMaXN0PEdsb2JhbFBhcnRpdGlvbkluZm9ybWF0aW9uPiwgUGFydGl0aW9uLCBNYXA+IGFzT3BhcXVlRW1pdHRlcigpIHsKIAotICAgICAgICByZXR1cm4gbmV3IElPcGFxdWVQYXJ0aXRpb25lZFRyaWRlbnRTcG91dC5FbWl0dGVyPEdsb2JhbFBhcnRpdGlvbkluZm9ybWF0aW9uLCBQYXJ0aXRpb24sIE1hcD4oKSB7CisgICAgICAgIHJldHVybiBuZXcgSU9wYXF1ZVBhcnRpdGlvbmVkVHJpZGVudFNwb3V0LkVtaXR0ZXI8TGlzdDxHbG9iYWxQYXJ0aXRpb25JbmZvcm1hdGlvbj4sIFBhcnRpdGlvbiwgTWFwPigpIHsKIAogICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgKiBFbWl0IGEgYmF0Y2ggb2YgdHVwbGVzIGZvciBhIHBhcnRpdGlvbi90cmFuc2FjdGlvbi4KQEAgLTIyMyw3ICsyMjksNyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBMaXN0PFBhcnRpdGlvbj4gZ2V0T3JkZXJlZFBhcnRpdGlvbnMoR2xvYmFsUGFydGl0aW9uSW5mb3JtYXRpb24gcGFydGl0aW9uSW5mb3JtYXRpb24pIHsKKyAgICAgICAgICAgIHB1YmxpYyBMaXN0PFBhcnRpdGlvbj4gZ2V0T3JkZXJlZFBhcnRpdGlvbnMoTGlzdDxHbG9iYWxQYXJ0aXRpb25JbmZvcm1hdGlvbj4gcGFydGl0aW9uSW5mb3JtYXRpb24pIHsKICAgICAgICAgICAgICAgICByZXR1cm4gb3JkZXJQYXJ0aXRpb25zKHBhcnRpdGlvbkluZm9ybWF0aW9uKTsKICAgICAgICAgICAgIH0KIApAQCAtMjM1LDcgKzI0MSw3IEBACiAgICAgfQogCiAgICAgcHVibGljIElQYXJ0aXRpb25lZFRyaWRlbnRTcG91dC5FbWl0dGVyIGFzVHJhbnNhY3Rpb25hbEVtaXR0ZXIoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgSVBhcnRpdGlvbmVkVHJpZGVudFNwb3V0LkVtaXR0ZXI8R2xvYmFsUGFydGl0aW9uSW5mb3JtYXRpb24sIFBhcnRpdGlvbiwgTWFwPigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBJUGFydGl0aW9uZWRUcmlkZW50U3BvdXQuRW1pdHRlcjxMaXN0PEdsb2JhbFBhcnRpdGlvbkluZm9ybWF0aW9uPiwgUGFydGl0aW9uLCBNYXA+KCkgewogCiAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAqIEVtaXQgYSBiYXRjaCBvZiB0dXBsZXMgZm9yIGEgcGFydGl0aW9uL3RyYW5zYWN0aW9uIHRoYXQncyBuZXZlciBiZWVuIGVtaXR0ZWQgYmVmb3JlLgpAQCAtMjY1LDcgKzI3MSw3IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIExpc3Q8UGFydGl0aW9uPiBnZXRPcmRlcmVkUGFydGl0aW9ucyhHbG9iYWxQYXJ0aXRpb25JbmZvcm1hdGlvbiBwYXJ0aXRpb25JbmZvcm1hdGlvbikgeworICAgICAgICAgICAgcHVibGljIExpc3Q8UGFydGl0aW9uPiBnZXRPcmRlcmVkUGFydGl0aW9ucyhMaXN0PEdsb2JhbFBhcnRpdGlvbkluZm9ybWF0aW9uPiBwYXJ0aXRpb25JbmZvcm1hdGlvbikgewogICAgICAgICAgICAgICAgIHJldHVybiBvcmRlclBhcnRpdGlvbnMocGFydGl0aW9uSW5mb3JtYXRpb24pOwogICAgICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9leHRlcm5hbC9zdG9ybS1rYWZrYS9zcmMvanZtL3N0b3JtL2thZmthL3RyaWRlbnQvVHJpZGVudEthZmthU3RhdGUuamF2YSBiL2V4dGVybmFsL3N0b3JtLWthZmthL3NyYy9qdm0vc3Rvcm0va2Fma2EvdHJpZGVudC9UcmlkZW50S2Fma2FTdGF0ZS5qYXZhCmluZGV4IDQwMmZmYjEuLjg0YjZhNmEgMTAwNjQ0Ci0tLSBhL2V4dGVybmFsL3N0b3JtLWthZmthL3NyYy9qdm0vc3Rvcm0va2Fma2EvdHJpZGVudC9UcmlkZW50S2Fma2FTdGF0ZS5qYXZhCisrKyBiL2V4dGVybmFsL3N0b3JtLWthZmthL3NyYy9qdm0vc3Rvcm0va2Fma2EvdHJpZGVudC9UcmlkZW50S2Fma2FTdGF0ZS5qYXZhCkBAIC0xOSwxMCArMTksMTAgQEAKIAogaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnRhc2suT3V0cHV0Q29sbGVjdG9yOwogaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnRvcG9sb2d5LkZhaWxlZEV4Y2VwdGlvbjsKLWltcG9ydCBrYWZrYS5qYXZhYXBpLnByb2R1Y2VyLlByb2R1Y2VyOwotaW1wb3J0IGthZmthLnByb2R1Y2VyLktleWVkTWVzc2FnZTsKLWltcG9ydCBrYWZrYS5wcm9kdWNlci5Qcm9kdWNlckNvbmZpZzsKIGltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubGFuZy5WYWxpZGF0ZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmthZmthLmNsaWVudHMucHJvZHVjZXIuS2Fma2FQcm9kdWNlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmthZmthLmNsaWVudHMucHJvZHVjZXIuUHJvZHVjZXJSZWNvcmQ7CitpbXBvcnQgb3JnLmFwYWNoZS5rYWZrYS5jbGllbnRzLnByb2R1Y2VyLlJlY29yZE1ldGFkYXRhOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiBpbXBvcnQgc3Rvcm0ua2Fma2EudHJpZGVudC5tYXBwZXIuVHJpZGVudFR1cGxlVG9LYWZrYU1hcHBlcjsKQEAgLTMyLDE1ICszMiwxNCBAQAogaW1wb3J0IHN0b3JtLnRyaWRlbnQudHVwbGUuVHJpZGVudFR1cGxlOwogCiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOwogCiBwdWJsaWMgY2xhc3MgVHJpZGVudEthZmthU3RhdGUgaW1wbGVtZW50cyBTdGF0ZSB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFRyaWRlbnRLYWZrYVN0YXRlLmNsYXNzKTsKIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtBRktBX0JST0tFUl9QUk9QRVJUSUVTID0gImthZmthLmJyb2tlci5wcm9wZXJ0aWVzIjsKLQotICAgIHByaXZhdGUgUHJvZHVjZXIgcHJvZHVjZXI7CisgICAgcHJpdmF0ZSBLYWZrYVByb2R1Y2VyIHByb2R1Y2VyOwogICAgIHByaXZhdGUgT3V0cHV0Q29sbGVjdG9yIGNvbGxlY3RvcjsKIAogICAgIHByaXZhdGUgVHJpZGVudFR1cGxlVG9LYWZrYU1hcHBlciBtYXBwZXI7CkBAIC02NiwxNCArNjUsMTAgQEAKICAgICAgICAgTE9HLmRlYnVnKCJjb21taXQgaXMgTm9vcC4iKTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBwcmVwYXJlKE1hcCBzdG9ybUNvbmYpIHsKKyAgICBwdWJsaWMgdm9pZCBwcmVwYXJlKFByb3BlcnRpZXMgb3B0aW9ucykgewogICAgICAgICBWYWxpZGF0ZS5ub3ROdWxsKG1hcHBlciwgIm1hcHBlciBjYW4gbm90IGJlIG51bGwiKTsKICAgICAgICAgVmFsaWRhdGUubm90TnVsbCh0b3BpY1NlbGVjdG9yLCAidG9waWNTZWxlY3RvciBjYW4gbm90IGJlIG51bGwiKTsKLSAgICAgICAgTWFwIGNvbmZpZ01hcCA9IChNYXApIHN0b3JtQ29uZi5nZXQoS0FGS0FfQlJPS0VSX1BST1BFUlRJRVMpOwotICAgICAgICBQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOwotICAgICAgICBwcm9wZXJ0aWVzLnB1dEFsbChjb25maWdNYXApOwotICAgICAgICBQcm9kdWNlckNvbmZpZyBjb25maWcgPSBuZXcgUHJvZHVjZXJDb25maWcocHJvcGVydGllcyk7Ci0gICAgICAgIHByb2R1Y2VyID0gbmV3IFByb2R1Y2VyKGNvbmZpZyk7CisgICAgICAgIHByb2R1Y2VyID0gbmV3IEthZmthUHJvZHVjZXIob3B0aW9ucyk7CiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgdXBkYXRlU3RhdGUoTGlzdDxUcmlkZW50VHVwbGU+IHR1cGxlcywgVHJpZGVudENvbGxlY3RvciBjb2xsZWN0b3IpIHsKQEAgLTgzLDggKzc4LDE2IEBACiAgICAgICAgICAgICAgICAgdG9waWMgPSB0b3BpY1NlbGVjdG9yLmdldFRvcGljKHR1cGxlKTsKIAogICAgICAgICAgICAgICAgIGlmKHRvcGljICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvZHVjZXIuc2VuZChuZXcgS2V5ZWRNZXNzYWdlKHRvcGljLCBtYXBwZXIuZ2V0S2V5RnJvbVR1cGxlKHR1cGxlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwZXIuZ2V0TWVzc2FnZUZyb21UdXBsZSh0dXBsZSkpKTsKKyAgICAgICAgICAgICAgICAgICAgRnV0dXJlPFJlY29yZE1ldGFkYXRhPiByZXN1bHQgPSBwcm9kdWNlci5zZW5kKG5ldyBQcm9kdWNlclJlY29yZCh0b3BpYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwZXIuZ2V0S2V5RnJvbVR1cGxlKHR1cGxlKSwgbWFwcGVyLmdldE1lc3NhZ2VGcm9tVHVwbGUodHVwbGUpKSk7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZXJyb3JNc2cgPSAiQ291bGQgbm90IHJldHJpZXZlIHJlc3VsdCBmb3IgbWVzc2FnZSB3aXRoIGtleSA9ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtYXBwZXIuZ2V0S2V5RnJvbVR1cGxlKHR1cGxlKSArICIgZnJvbSB0b3BpYyA9ICIgKyB0b3BpYzsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPRy5lcnJvcihlcnJvck1zZywgZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmFpbGVkRXhjZXB0aW9uKGVycm9yTXNnLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIExPRy53YXJuKCJza2lwcGluZyBrZXkgPSAiICsgbWFwcGVyLmdldEtleUZyb21UdXBsZSh0dXBsZSkgKyAiLCB0b3BpYyBzZWxlY3RvciByZXR1cm5lZCBudWxsLiIpOwogICAgICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2V4dGVybmFsL3N0b3JtLWthZmthL3NyYy9qdm0vc3Rvcm0va2Fma2EvdHJpZGVudC9UcmlkZW50S2Fma2FTdGF0ZUZhY3RvcnkuamF2YSBiL2V4dGVybmFsL3N0b3JtLWthZmthL3NyYy9qdm0vc3Rvcm0va2Fma2EvdHJpZGVudC9UcmlkZW50S2Fma2FTdGF0ZUZhY3RvcnkuamF2YQppbmRleCBhZGNhNjllLi5hNWQ5ZDQyIDEwMDY0NAotLS0gYS9leHRlcm5hbC9zdG9ybS1rYWZrYS9zcmMvanZtL3N0b3JtL2thZmthL3RyaWRlbnQvVHJpZGVudEthZmthU3RhdGVGYWN0b3J5LmphdmEKKysrIGIvZXh0ZXJuYWwvc3Rvcm0ta2Fma2Evc3JjL2p2bS9zdG9ybS9rYWZrYS90cmlkZW50L1RyaWRlbnRLYWZrYVN0YXRlRmFjdG9yeS5qYXZhCkBAIC0yNiw2ICsyNiw3IEBACiBpbXBvcnQgc3Rvcm0udHJpZGVudC5zdGF0ZS5TdGF0ZUZhY3Rvcnk7CiAKIGltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwogCiBwdWJsaWMgY2xhc3MgVHJpZGVudEthZmthU3RhdGVGYWN0b3J5IGltcGxlbWVudHMgU3RhdGVGYWN0b3J5IHsKIApAQCAtMzMsNyArMzQsNyBAQAogCiAgICAgcHJpdmF0ZSBUcmlkZW50VHVwbGVUb0thZmthTWFwcGVyIG1hcHBlcjsKICAgICBwcml2YXRlIEthZmthVG9waWNTZWxlY3RvciB0b3BpY1NlbGVjdG9yOwotCisgICAgcHJpdmF0ZSBQcm9wZXJ0aWVzIHByb2R1Y2VyUHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CiAKICAgICBwdWJsaWMgVHJpZGVudEthZmthU3RhdGVGYWN0b3J5IHdpdGhUcmlkZW50VHVwbGVUb0thZmthTWFwcGVyKFRyaWRlbnRUdXBsZVRvS2Fma2FNYXBwZXIgbWFwcGVyKSB7CiAgICAgICAgIHRoaXMubWFwcGVyID0gbWFwcGVyOwpAQCAtNDUsMTMgKzQ2LDE4IEBACiAgICAgICAgIHJldHVybiB0aGlzOwogICAgIH0KIAorICAgIHB1YmxpYyBUcmlkZW50S2Fma2FTdGF0ZUZhY3Rvcnkgd2l0aFByb2R1Y2VyUHJvcGVydGllcyhQcm9wZXJ0aWVzIHByb3BzKSB7CisgICAgICAgIHRoaXMucHJvZHVjZXJQcm9wZXJ0aWVzID0gcHJvcHM7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBTdGF0ZSBtYWtlU3RhdGUoTWFwIGNvbmYsIElNZXRyaWNzQ29udGV4dCBtZXRyaWNzLCBpbnQgcGFydGl0aW9uSW5kZXgsIGludCBudW1QYXJ0aXRpb25zKSB7CiAgICAgICAgIExPRy5pbmZvKCJtYWtlU3RhdGUocGFydGl0b25JbmRleD17fSwgbnVtcGFydGl0aW9ucz17fSIsIHBhcnRpdGlvbkluZGV4LCBudW1QYXJ0aXRpb25zKTsKICAgICAgICAgVHJpZGVudEthZmthU3RhdGUgc3RhdGUgPSBuZXcgVHJpZGVudEthZmthU3RhdGUoKQogICAgICAgICAgICAgICAgIC53aXRoS2Fma2FUb3BpY1NlbGVjdG9yKHRoaXMudG9waWNTZWxlY3RvcikKICAgICAgICAgICAgICAgICAud2l0aFRyaWRlbnRUdXBsZVRvS2Fma2FNYXBwZXIodGhpcy5tYXBwZXIpOwotICAgICAgICBzdGF0ZS5wcmVwYXJlKGNvbmYpOworICAgICAgICBzdGF0ZS5wcmVwYXJlKHByb2R1Y2VyUHJvcGVydGllcyk7CiAgICAgICAgIHJldHVybiBzdGF0ZTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9leHRlcm5hbC9zdG9ybS1rYWZrYS9zcmMvanZtL3N0b3JtL2thZmthL3RyaWRlbnQvWmtCcm9rZXJSZWFkZXIuamF2YSBiL2V4dGVybmFsL3N0b3JtLWthZmthL3NyYy9qdm0vc3Rvcm0va2Fma2EvdHJpZGVudC9aa0Jyb2tlclJlYWRlci5qYXZhCmluZGV4IDFhMjY3MDUuLmI0ODBiZGQgMTAwNjQ0Ci0tLSBhL2V4dGVybmFsL3N0b3JtLWthZmthL3NyYy9qdm0vc3Rvcm0va2Fma2EvdHJpZGVudC9aa0Jyb2tlclJlYWRlci5qYXZhCisrKyBiL2V4dGVybmFsL3N0b3JtLWthZmthL3NyYy9qdm0vc3Rvcm0va2Fma2EvdHJpZGVudC9aa0Jyb2tlclJlYWRlci5qYXZhCkBAIC0yMiw2ICsyMiw4IEBACiBpbXBvcnQgc3Rvcm0ua2Fma2EuRHluYW1pY0Jyb2tlcnNSZWFkZXI7CiBpbXBvcnQgc3Rvcm0ua2Fma2EuWmtIb3N0czsKIAoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIAogCkBAIC0yOSw3ICszMSw3IEBACiAKIAlwdWJsaWMgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihaa0Jyb2tlclJlYWRlci5jbGFzcyk7CiAKLQlHbG9iYWxQYXJ0aXRpb25JbmZvcm1hdGlvbiBjYWNoZWRCcm9rZXJzOworCUxpc3Q8R2xvYmFsUGFydGl0aW9uSW5mb3JtYXRpb24+IGNhY2hlZEJyb2tlcnMgPSBuZXcgQXJyYXlMaXN0PEdsb2JhbFBhcnRpdGlvbkluZm9ybWF0aW9uPigpOwogCUR5bmFtaWNCcm9rZXJzUmVhZGVyIHJlYWRlcjsKIAlsb25nIGxhc3RSZWZyZXNoVGltZU1zOwogCkBAIC00OCw4ICs1MCw3IEBACiAKIAl9CiAKLQlAT3ZlcnJpZGUKLQlwdWJsaWMgR2xvYmFsUGFydGl0aW9uSW5mb3JtYXRpb24gZ2V0Q3VycmVudEJyb2tlcnMoKSB7CisJcHJpdmF0ZSB2b2lkIHJlZnJlc2goKSB7CiAJCWxvbmcgY3VyclRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKIAkJaWYgKGN1cnJUaW1lID4gbGFzdFJlZnJlc2hUaW1lTXMgKyByZWZyZXNoTWlsbGlzKSB7CiAJCQl0cnkgewpAQCAtNjAsNiArNjEsMTkgQEAKIAkJCQlMT0cud2FybigiRmFpbGVkIHRvIHVwZGF0ZSBicm9rZXJzIiwgZSk7CiAJCQl9CiAJCX0KKwl9CisJQE92ZXJyaWRlCisJcHVibGljIEdsb2JhbFBhcnRpdGlvbkluZm9ybWF0aW9uIGdldEJyb2tlckZvclRvcGljKFN0cmluZyB0b3BpYykgeworCQlyZWZyZXNoKCk7CisgICAgICAgIGZvcihHbG9iYWxQYXJ0aXRpb25JbmZvcm1hdGlvbiBwYXJ0aXRpb25JbmZvcm1hdGlvbiA6IGNhY2hlZEJyb2tlcnMpIHsKKyAgICAgICAgICAgIGlmIChwYXJ0aXRpb25JbmZvcm1hdGlvbi50b3BpYy5lcXVhbHModG9waWMpKSByZXR1cm4gcGFydGl0aW9uSW5mb3JtYXRpb247CisgICAgICAgIH0KKwkJcmV0dXJuIG51bGw7CisJfQorCisJQE92ZXJyaWRlCisJcHVibGljIExpc3Q8R2xvYmFsUGFydGl0aW9uSW5mb3JtYXRpb24+IGdldEFsbEJyb2tlcnMoKSB7CisJCXJlZnJlc2goKTsKIAkJcmV0dXJuIGNhY2hlZEJyb2tlcnM7CiAJfQogCmRpZmYgLS1naXQgYS9leHRlcm5hbC9zdG9ybS1rYWZrYS9zcmMvdGVzdC9zdG9ybS9rYWZrYS9EeW5hbWljQnJva2Vyc1JlYWRlclRlc3QuamF2YSBiL2V4dGVybmFsL3N0b3JtLWthZmthL3NyYy90ZXN0L3N0b3JtL2thZmthL0R5bmFtaWNCcm9rZXJzUmVhZGVyVGVzdC5qYXZhCmluZGV4IDk0MWFjOWUuLmQ4NzE5MjQgMTAwNjQ0Ci0tLSBhL2V4dGVybmFsL3N0b3JtLWthZmthL3NyYy90ZXN0L3N0b3JtL2thZmthL0R5bmFtaWNCcm9rZXJzUmVhZGVyVGVzdC5qYXZhCisrKyBiL2V4dGVybmFsL3N0b3JtLWthZmthL3NyYy90ZXN0L3N0b3JtL2thZmthL0R5bmFtaWNCcm9rZXJzUmVhZGVyVGVzdC5qYXZhCkBAIC0yOSwxOCArMjksMjQgQEAKIGltcG9ydCBzdG9ybS5rYWZrYS50cmlkZW50Lkdsb2JhbFBhcnRpdGlvbkluZm9ybWF0aW9uOwogCiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiAKIC8qKgogICogRGF0ZTogMTYvMDUvMjAxMwogICogVGltZTogMjA6MzUKICAqLwogcHVibGljIGNsYXNzIER5bmFtaWNCcm9rZXJzUmVhZGVyVGVzdCB7Ci0gICAgcHJpdmF0ZSBEeW5hbWljQnJva2Vyc1JlYWRlciBkeW5hbWljQnJva2Vyc1JlYWRlcjsKKyAgICBwcml2YXRlIER5bmFtaWNCcm9rZXJzUmVhZGVyIGR5bmFtaWNCcm9rZXJzUmVhZGVyLCB3aWxkQ2FyZEJyb2tlclJlYWRlcjsKICAgICBwcml2YXRlIFN0cmluZyBtYXN0ZXJQYXRoID0gIi9icm9rZXJzIjsKLSAgICBwcml2YXRlIFN0cmluZyB0b3BpYyA9ICJ0ZXN0aW5nIjsKKyAgICBwcml2YXRlIFN0cmluZyB0b3BpYyA9ICJ0ZXN0aW5nMSI7CisgICAgcHJpdmF0ZSBTdHJpbmcgc2Vjb25kVG9waWMgPSAidGVzdGluZzIiOworICAgIHByaXZhdGUgU3RyaW5nIHRoaXJkVG9waWMgPSAidGVzdGluZzMiOworCiAgICAgcHJpdmF0ZSBDdXJhdG9yRnJhbWV3b3JrIHpvb2tlZXBlcjsKICAgICBwcml2YXRlIFRlc3RpbmdTZXJ2ZXIgc2VydmVyOwogCkBAIC01Myw5ICs1OSwxNiBAQAogICAgICAgICBjb25mLnB1dChDb25maWcuU1RPUk1fWk9PS0VFUEVSX0NPTk5FQ1RJT05fVElNRU9VVCwgMTAwMCk7CiAgICAgICAgIGNvbmYucHV0KENvbmZpZy5TVE9STV9aT09LRUVQRVJfUkVUUllfVElNRVMsIDQpOwogICAgICAgICBjb25mLnB1dChDb25maWcuU1RPUk1fWk9PS0VFUEVSX1JFVFJZX0lOVEVSVkFMLCA1KTsKKwogICAgICAgICBFeHBvbmVudGlhbEJhY2tvZmZSZXRyeSByZXRyeVBvbGljeSA9IG5ldyBFeHBvbmVudGlhbEJhY2tvZmZSZXRyeSgxMDAwLCAzKTsKICAgICAgICAgem9va2VlcGVyID0gQ3VyYXRvckZyYW1ld29ya0ZhY3RvcnkubmV3Q2xpZW50KGNvbm5lY3Rpb25TdHJpbmcsIHJldHJ5UG9saWN5KTsKICAgICAgICAgZHluYW1pY0Jyb2tlcnNSZWFkZXIgPSBuZXcgRHluYW1pY0Jyb2tlcnNSZWFkZXIoY29uZiwgY29ubmVjdGlvblN0cmluZywgbWFzdGVyUGF0aCwgdG9waWMpOworCisgICAgICAgIE1hcCBjb25mMiA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgIGNvbmYyLnB1dEFsbChjb25mKTsKKyAgICAgICAgY29uZjIucHV0KCJrYWZrYS50b3BpYy53aWxkY2FyZC5tYXRjaCIsdHJ1ZSk7CisKKyAgICAgICAgd2lsZENhcmRCcm9rZXJSZWFkZXIgPSBuZXcgRHluYW1pY0Jyb2tlcnNSZWFkZXIoY29uZjIsIGNvbm5lY3Rpb25TdHJpbmcsIG1hc3RlclBhdGgsICJedGVzdC4qJCIpOwogICAgICAgICB6b29rZWVwZXIuc3RhcnQoKTsKICAgICB9CiAKQEAgLTY2LDIwICs3OSwyMCBAQAogICAgICAgICBzZXJ2ZXIuY2xvc2UoKTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgYWRkUGFydGl0aW9uKGludCBpZCwgU3RyaW5nIGhvc3QsIGludCBwb3J0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgd3JpdGVQYXJ0aXRpb25JZChpZCk7Ci0gICAgICAgIHdyaXRlTGVhZGVyKGlkLCAwKTsKKyAgICBwcml2YXRlIHZvaWQgYWRkUGFydGl0aW9uKGludCBpZCwgU3RyaW5nIGhvc3QsIGludCBwb3J0LCBTdHJpbmcgdG9waWMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB3cml0ZVBhcnRpdGlvbklkKGlkLCB0b3BpYyk7CisgICAgICAgIHdyaXRlTGVhZGVyKGlkLCAwLCB0b3BpYyk7CiAgICAgICAgIHdyaXRlTGVhZGVyRGV0YWlscygwLCBob3N0LCBwb3J0KTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgYWRkUGFydGl0aW9uKGludCBpZCwgaW50IGxlYWRlciwgU3RyaW5nIGhvc3QsIGludCBwb3J0KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgd3JpdGVQYXJ0aXRpb25JZChpZCk7Ci0gICAgICAgIHdyaXRlTGVhZGVyKGlkLCBsZWFkZXIpOworICAgIHByaXZhdGUgdm9pZCBhZGRQYXJ0aXRpb24oaW50IGlkLCBpbnQgbGVhZGVyLCBTdHJpbmcgaG9zdCwgaW50IHBvcnQsIFN0cmluZyB0b3BpYykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHdyaXRlUGFydGl0aW9uSWQoaWQsIHRvcGljKTsKKyAgICAgICAgd3JpdGVMZWFkZXIoaWQsIGxlYWRlciwgdG9waWMpOwogICAgICAgICB3cml0ZUxlYWRlckRldGFpbHMobGVhZGVyLCBob3N0LCBwb3J0KTsKICAgICB9CiAKLSAgICBwcml2YXRlIHZvaWQgd3JpdGVQYXJ0aXRpb25JZChpbnQgaWQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgcGF0aCA9IGR5bmFtaWNCcm9rZXJzUmVhZGVyLnBhcnRpdGlvblBhdGgoKTsKKyAgICBwcml2YXRlIHZvaWQgd3JpdGVQYXJ0aXRpb25JZChpbnQgaWQsIFN0cmluZyB0b3BpYykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBwYXRoID0gZHluYW1pY0Jyb2tlcnNSZWFkZXIucGFydGl0aW9uUGF0aCh0b3BpYyk7CiAgICAgICAgIHdyaXRlRGF0YVRvUGF0aChwYXRoLCAoIiIgKyBpZCkpOwogICAgIH0KIApAQCAtODgsOCArMTAxLDggQEAKICAgICAgICAgem9va2VlcGVyLnNldERhdGEoKS5mb3JQYXRoKHBhdGgsIGRhdGEuZ2V0Qnl0ZXMoKSk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlTGVhZGVyKGludCBpZCwgaW50IGxlYWRlcklkKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgU3RyaW5nIHBhdGggPSBkeW5hbWljQnJva2Vyc1JlYWRlci5wYXJ0aXRpb25QYXRoKCkgKyAiLyIgKyBpZCArICIvc3RhdGUiOworICAgIHByaXZhdGUgdm9pZCB3cml0ZUxlYWRlcihpbnQgaWQsIGludCBsZWFkZXJJZCwgU3RyaW5nIHRvcGljKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHBhdGggPSBkeW5hbWljQnJva2Vyc1JlYWRlci5wYXJ0aXRpb25QYXRoKHRvcGljKSArICIvIiArIGlkICsgIi9zdGF0ZSI7CiAgICAgICAgIFN0cmluZyB2YWx1ZSA9ICIgeyBcImNvbnRyb2xsZXJfZXBvY2hcIjo0LCBcImlzclwiOlsgMSwgMCBdLCBcImxlYWRlclwiOiIgKyBsZWFkZXJJZCArICIsIFwibGVhZGVyX2Vwb2NoXCI6MSwgXCJ2ZXJzaW9uXCI6MSB9IjsKICAgICAgICAgd3JpdGVEYXRhVG9QYXRoKHBhdGgsIHZhbHVlKTsKICAgICB9CkBAIC0xMDAsMTggKzExMyw1OSBAQAogICAgICAgICB3cml0ZURhdGFUb1BhdGgocGF0aCwgdmFsdWUpOwogICAgIH0KIAorCisgICAgcHJpdmF0ZSBHbG9iYWxQYXJ0aXRpb25JbmZvcm1hdGlvbiBnZXRCeVRvcGljKExpc3Q8R2xvYmFsUGFydGl0aW9uSW5mb3JtYXRpb24+IHBhcnRpdGlvbnMsIFN0cmluZyB0b3BpYyl7CisgICAgICAgIGZvcihHbG9iYWxQYXJ0aXRpb25JbmZvcm1hdGlvbiBwYXJ0aXRpb25JbmZvcm1hdGlvbiA6IHBhcnRpdGlvbnMpIHsKKyAgICAgICAgICAgIGlmIChwYXJ0aXRpb25JbmZvcm1hdGlvbi50b3BpYy5lcXVhbHModG9waWMpKSByZXR1cm4gcGFydGl0aW9uSW5mb3JtYXRpb247CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QnJva2VySW5mbygpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBTdHJpbmcgaG9zdCA9ICJsb2NhbGhvc3QiOwogICAgICAgICBpbnQgcG9ydCA9IDkwOTI7CiAgICAgICAgIGludCBwYXJ0aXRpb24gPSAwOwotICAgICAgICBhZGRQYXJ0aXRpb24ocGFydGl0aW9uLCBob3N0LCBwb3J0KTsKLSAgICAgICAgR2xvYmFsUGFydGl0aW9uSW5mb3JtYXRpb24gYnJva2VySW5mbyA9IGR5bmFtaWNCcm9rZXJzUmVhZGVyLmdldEJyb2tlckluZm8oKTsKKyAgICAgICAgYWRkUGFydGl0aW9uKHBhcnRpdGlvbiwgaG9zdCwgcG9ydCwgdG9waWMpOworICAgICAgICBMaXN0PEdsb2JhbFBhcnRpdGlvbkluZm9ybWF0aW9uPiBwYXJ0aXRpb25zID0gZHluYW1pY0Jyb2tlcnNSZWFkZXIuZ2V0QnJva2VySW5mbygpOworCisgICAgICAgIEdsb2JhbFBhcnRpdGlvbkluZm9ybWF0aW9uIGJyb2tlckluZm8gPSBnZXRCeVRvcGljKHBhcnRpdGlvbnMsIHRvcGljKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChicm9rZXJJbmZvKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGJyb2tlckluZm8uZ2V0T3JkZXJlZFBhcnRpdGlvbnMoKS5zaXplKCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMocG9ydCwgYnJva2VySW5mby5nZXRCcm9rZXJGb3IocGFydGl0aW9uKS5wb3J0KTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKGhvc3QsIGJyb2tlckluZm8uZ2V0QnJva2VyRm9yKHBhcnRpdGlvbikuaG9zdCk7CiAgICAgfQogCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QnJva2VySW5mb1dpbGRjYXJkTWF0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGhvc3QgPSAibG9jYWxob3N0IjsKKyAgICAgICAgaW50IHBvcnQgPSA5MDkyOworICAgICAgICBpbnQgcGFydGl0aW9uID0gMDsKKyAgICAgICAgYWRkUGFydGl0aW9uKHBhcnRpdGlvbiwgaG9zdCwgcG9ydCwgdG9waWMpOworICAgICAgICBhZGRQYXJ0aXRpb24ocGFydGl0aW9uLCBob3N0LCBwb3J0LCBzZWNvbmRUb3BpYyk7CisKKyAgICAgICAgTGlzdDxHbG9iYWxQYXJ0aXRpb25JbmZvcm1hdGlvbj4gcGFydGl0aW9ucyA9IHdpbGRDYXJkQnJva2VyUmVhZGVyLmdldEJyb2tlckluZm8oKTsKKworICAgICAgICBHbG9iYWxQYXJ0aXRpb25JbmZvcm1hdGlvbiBicm9rZXJJbmZvID0gZ2V0QnlUb3BpYyhwYXJ0aXRpb25zLCB0b3BpYyk7CisgICAgICAgIGFzc2VydE5vdE51bGwoYnJva2VySW5mbyk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBicm9rZXJJbmZvLmdldE9yZGVyZWRQYXJ0aXRpb25zKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHBvcnQsIGJyb2tlckluZm8uZ2V0QnJva2VyRm9yKHBhcnRpdGlvbikucG9ydCk7CisgICAgICAgIGFzc2VydEVxdWFscyhob3N0LCBicm9rZXJJbmZvLmdldEJyb2tlckZvcihwYXJ0aXRpb24pLmhvc3QpOworCisgICAgICAgIGJyb2tlckluZm8gPSBnZXRCeVRvcGljKHBhcnRpdGlvbnMsIHNlY29uZFRvcGljKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChicm9rZXJJbmZvKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGJyb2tlckluZm8uZ2V0T3JkZXJlZFBhcnRpdGlvbnMoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMocG9ydCwgYnJva2VySW5mby5nZXRCcm9rZXJGb3IocGFydGl0aW9uKS5wb3J0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGhvc3QsIGJyb2tlckluZm8uZ2V0QnJva2VyRm9yKHBhcnRpdGlvbikuaG9zdCk7CisKKyAgICAgICAgYWRkUGFydGl0aW9uKHBhcnRpdGlvbiwgaG9zdCwgcG9ydCwgdGhpcmRUb3BpYyk7CisgICAgICAgIC8vRGlzY292ZXIgbmV3bHkgYWRkZWQgdG9waWMKKyAgICAgICAgcGFydGl0aW9ucyA9IHdpbGRDYXJkQnJva2VyUmVhZGVyLmdldEJyb2tlckluZm8oKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChnZXRCeVRvcGljKHBhcnRpdGlvbnMsIHRvcGljKSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoZ2V0QnlUb3BpYyhwYXJ0aXRpb25zLCBzZWNvbmRUb3BpYykpOworICAgICAgICBhc3NlcnROb3ROdWxsKGdldEJ5VG9waWMocGFydGl0aW9ucywgc2Vjb25kVG9waWMpKTsKKyAgICB9CisKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlUGFydGl0aW9uc09uRGlmZmVyZW50SG9zdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTEyMCwxMCArMTc0LDEzIEBACiAgICAgICAgIGludCBzZWNvbmRQb3J0ID0gOTA5MzsKICAgICAgICAgaW50IHBhcnRpdGlvbiA9IDA7CiAgICAgICAgIGludCBzZWNvbmRQYXJ0aXRpb24gPSBwYXJ0aXRpb24gKyAxOwotICAgICAgICBhZGRQYXJ0aXRpb24ocGFydGl0aW9uLCAwLCBob3N0LCBwb3J0KTsKLSAgICAgICAgYWRkUGFydGl0aW9uKHNlY29uZFBhcnRpdGlvbiwgMSwgaG9zdCwgc2Vjb25kUG9ydCk7CisgICAgICAgIGFkZFBhcnRpdGlvbihwYXJ0aXRpb24sIDAsIGhvc3QsIHBvcnQsIHRvcGljKTsKKyAgICAgICAgYWRkUGFydGl0aW9uKHNlY29uZFBhcnRpdGlvbiwgMSwgaG9zdCwgc2Vjb25kUG9ydCwgdG9waWMpOwogCi0gICAgICAgIEdsb2JhbFBhcnRpdGlvbkluZm9ybWF0aW9uIGJyb2tlckluZm8gPSBkeW5hbWljQnJva2Vyc1JlYWRlci5nZXRCcm9rZXJJbmZvKCk7CisgICAgICAgIExpc3Q8R2xvYmFsUGFydGl0aW9uSW5mb3JtYXRpb24+IHBhcnRpdGlvbnMgPSBkeW5hbWljQnJva2Vyc1JlYWRlci5nZXRCcm9rZXJJbmZvKCk7CisKKyAgICAgICAgR2xvYmFsUGFydGl0aW9uSW5mb3JtYXRpb24gYnJva2VySW5mbyA9IGdldEJ5VG9waWMocGFydGl0aW9ucywgdG9waWMpOworICAgICAgICBhc3NlcnROb3ROdWxsKGJyb2tlckluZm8pOwogICAgICAgICBhc3NlcnRFcXVhbHMoMiwgYnJva2VySW5mby5nZXRPcmRlcmVkUGFydGl0aW9ucygpLnNpemUoKSk7CiAKICAgICAgICAgYXNzZXJ0RXF1YWxzKHBvcnQsIGJyb2tlckluZm8uZ2V0QnJva2VyRm9yKHBhcnRpdGlvbikucG9ydCk7CkBAIC0xNDAsMTAgKzE5NywxMyBAQAogICAgICAgICBpbnQgcG9ydCA9IDkwOTI7CiAgICAgICAgIGludCBwYXJ0aXRpb24gPSAwOwogICAgICAgICBpbnQgc2Vjb25kUGFydGl0aW9uID0gcGFydGl0aW9uICsgMTsKLSAgICAgICAgYWRkUGFydGl0aW9uKHBhcnRpdGlvbiwgMCwgaG9zdCwgcG9ydCk7Ci0gICAgICAgIGFkZFBhcnRpdGlvbihzZWNvbmRQYXJ0aXRpb24sIDAsIGhvc3QsIHBvcnQpOworICAgICAgICBhZGRQYXJ0aXRpb24ocGFydGl0aW9uLCAwLCBob3N0LCBwb3J0LCB0b3BpYyk7CisgICAgICAgIGFkZFBhcnRpdGlvbihzZWNvbmRQYXJ0aXRpb24sIDAsIGhvc3QsIHBvcnQsIHRvcGljKTsKIAotICAgICAgICBHbG9iYWxQYXJ0aXRpb25JbmZvcm1hdGlvbiBicm9rZXJJbmZvID0gZHluYW1pY0Jyb2tlcnNSZWFkZXIuZ2V0QnJva2VySW5mbygpOworICAgICAgICBMaXN0PEdsb2JhbFBhcnRpdGlvbkluZm9ybWF0aW9uPiBwYXJ0aXRpb25zID0gZHluYW1pY0Jyb2tlcnNSZWFkZXIuZ2V0QnJva2VySW5mbygpOworCisgICAgICAgIEdsb2JhbFBhcnRpdGlvbkluZm9ybWF0aW9uIGJyb2tlckluZm8gPSBnZXRCeVRvcGljKHBhcnRpdGlvbnMsIHRvcGljKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChicm9rZXJJbmZvKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGJyb2tlckluZm8uZ2V0T3JkZXJlZFBhcnRpdGlvbnMoKS5zaXplKCkpOwogCiAgICAgICAgIGFzc2VydEVxdWFscyhwb3J0LCBicm9rZXJJbmZvLmdldEJyb2tlckZvcihwYXJ0aXRpb24pLnBvcnQpOwpAQCAtMTU4LDE1ICsyMTgsMjEgQEAKICAgICAgICAgU3RyaW5nIGhvc3QgPSAibG9jYWxob3N0IjsKICAgICAgICAgaW50IHBvcnQgPSA5MDkyOwogICAgICAgICBpbnQgcGFydGl0aW9uID0gMDsKLSAgICAgICAgYWRkUGFydGl0aW9uKHBhcnRpdGlvbiwgaG9zdCwgcG9ydCk7Ci0gICAgICAgIEdsb2JhbFBhcnRpdGlvbkluZm9ybWF0aW9uIGJyb2tlckluZm8gPSBkeW5hbWljQnJva2Vyc1JlYWRlci5nZXRCcm9rZXJJbmZvKCk7CisgICAgICAgIGFkZFBhcnRpdGlvbihwYXJ0aXRpb24sIGhvc3QsIHBvcnQsIHRvcGljKTsKKyAgICAgICAgTGlzdDxHbG9iYWxQYXJ0aXRpb25JbmZvcm1hdGlvbj4gcGFydGl0aW9ucyA9IGR5bmFtaWNCcm9rZXJzUmVhZGVyLmdldEJyb2tlckluZm8oKTsKKworICAgICAgICBHbG9iYWxQYXJ0aXRpb25JbmZvcm1hdGlvbiBicm9rZXJJbmZvID0gZ2V0QnlUb3BpYyhwYXJ0aXRpb25zLCB0b3BpYyk7CisgICAgICAgIGFzc2VydE5vdE51bGwoYnJva2VySW5mbyk7CiAgICAgICAgIGFzc2VydEVxdWFscyhwb3J0LCBicm9rZXJJbmZvLmdldEJyb2tlckZvcihwYXJ0aXRpb24pLnBvcnQpOwogICAgICAgICBhc3NlcnRFcXVhbHMoaG9zdCwgYnJva2VySW5mby5nZXRCcm9rZXJGb3IocGFydGl0aW9uKS5ob3N0KTsKIAogICAgICAgICBTdHJpbmcgbmV3SG9zdCA9IGhvc3QgKyAic3dpdGNoIjsKICAgICAgICAgaW50IG5ld1BvcnQgPSBwb3J0ICsgMTsKLSAgICAgICAgYWRkUGFydGl0aW9uKHBhcnRpdGlvbiwgbmV3SG9zdCwgbmV3UG9ydCk7Ci0gICAgICAgIGJyb2tlckluZm8gPSBkeW5hbWljQnJva2Vyc1JlYWRlci5nZXRCcm9rZXJJbmZvKCk7CisgICAgICAgIGFkZFBhcnRpdGlvbihwYXJ0aXRpb24sIG5ld0hvc3QsIG5ld1BvcnQsIHRvcGljKTsKKyAgICAgICAgcGFydGl0aW9ucyA9IGR5bmFtaWNCcm9rZXJzUmVhZGVyLmdldEJyb2tlckluZm8oKTsKKworICAgICAgICBicm9rZXJJbmZvID0gZ2V0QnlUb3BpYyhwYXJ0aXRpb25zLCB0b3BpYyk7CisgICAgICAgIGFzc2VydE5vdE51bGwoYnJva2VySW5mbyk7CiAgICAgICAgIGFzc2VydEVxdWFscyhuZXdQb3J0LCBicm9rZXJJbmZvLmdldEJyb2tlckZvcihwYXJ0aXRpb24pLnBvcnQpOwogICAgICAgICBhc3NlcnRFcXVhbHMobmV3SG9zdCwgYnJva2VySW5mby5nZXRCcm9rZXJGb3IocGFydGl0aW9uKS5ob3N0KTsKICAgICB9CmRpZmYgLS1naXQgYS9leHRlcm5hbC9zdG9ybS1rYWZrYS9zcmMvdGVzdC9zdG9ybS9rYWZrYS9LYWZrYVV0aWxzVGVzdC5qYXZhIGIvZXh0ZXJuYWwvc3Rvcm0ta2Fma2Evc3JjL3Rlc3Qvc3Rvcm0va2Fma2EvS2Fma2FVdGlsc1Rlc3QuamF2YQppbmRleCBhMmQyYWY4Li5lYjY5NGJiIDEwMDY0NAotLS0gYS9leHRlcm5hbC9zdG9ybS1rYWZrYS9zcmMvdGVzdC9zdG9ybS9rYWZrYS9LYWZrYVV0aWxzVGVzdC5qYXZhCisrKyBiL2V4dGVybmFsL3N0b3JtLWthZmthL3NyYy90ZXN0L3N0b3JtL2thZmthL0thZmthVXRpbHNUZXN0LmphdmEKQEAgLTE3LDMzICsxNywzNyBAQAogICovCiBwYWNrYWdlIHN0b3JtLmthZmthOwogCi1pbXBvcnQgYmFja3R5cGUuc3Rvcm0uc3BvdXQuU2NoZW1lQXNNdWx0aVNjaGVtZTsKLWltcG9ydCBiYWNrdHlwZS5zdG9ybS51dGlscy5VdGlsczsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKLWltcG9ydCBrYWZrYS5hcGkuT2Zmc2V0UmVxdWVzdDsKLWltcG9ydCBrYWZrYS5qYXZhYXBpLmNvbnN1bWVyLlNpbXBsZUNvbnN1bWVyOwotaW1wb3J0IGthZmthLmphdmFhcGkubWVzc2FnZS5CeXRlQnVmZmVyTWVzc2FnZVNldDsKLWltcG9ydCBrYWZrYS5tZXNzYWdlLk1lc3NhZ2VBbmRPZmZzZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5rYWZrYS5jbGllbnRzLnByb2R1Y2VyLkthZmthUHJvZHVjZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5rYWZrYS5jbGllbnRzLnByb2R1Y2VyLlByb2R1Y2VyUmVjb3JkOwotaW1wb3J0IG9yZy5hcGFjaGUua2Fma2EuY2xpZW50cy5wcm9kdWNlci5SZWNvcmRNZXRhZGF0YTsKLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLWltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OwotaW1wb3J0IHN0b3JtLmthZmthLnRyaWRlbnQuR2xvYmFsUGFydGl0aW9uSW5mb3JtYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQogaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmVxdWFsVG87CiBpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaXM7CiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworCitpbXBvcnQga2Fma2EuYXBpLk9mZnNldFJlcXVlc3Q7CitpbXBvcnQga2Fma2EuamF2YWFwaS5jb25zdW1lci5TaW1wbGVDb25zdW1lcjsKK2ltcG9ydCBrYWZrYS5qYXZhYXBpLm1lc3NhZ2UuQnl0ZUJ1ZmZlck1lc3NhZ2VTZXQ7CitpbXBvcnQga2Fma2EubWVzc2FnZS5NZXNzYWdlQW5kT2Zmc2V0OworCitpbXBvcnQgb3JnLmFwYWNoZS5rYWZrYS5jbGllbnRzLnByb2R1Y2VyLkthZmthUHJvZHVjZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5rYWZrYS5jbGllbnRzLnByb2R1Y2VyLlByb2R1Y2VyUmVjb3JkOworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0bzsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwotcHVibGljIGNsYXNzIEthZmthVXRpbHNUZXN0IHsKIAoraW1wb3J0IHN0b3JtLmthZmthLnRyaWRlbnQuR2xvYmFsUGFydGl0aW9uSW5mb3JtYXRpb247CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0uc3BvdXQuU2NoZW1lQXNNdWx0aVNjaGVtZTsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS51dGlscy5VdGlsczsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTWFwOworcHVibGljIGNsYXNzIEthZmthVXRpbHNUZXN0IHsKKyAgICBwcml2YXRlIFN0cmluZyBURVNUX1RPUElDID0gInRlc3RUb3BpYyI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEthZmthVXRpbHNUZXN0LmNsYXNzKTsKICAgICBwcml2YXRlIEthZmthVGVzdEJyb2tlciBicm9rZXI7CiAgICAgcHJpdmF0ZSBTaW1wbGVDb25zdW1lciBzaW1wbGVDb25zdW1lcjsKQEAgLTUzLDEwICs1NywxMCBAQAogICAgIEBCZWZvcmUKICAgICBwdWJsaWMgdm9pZCBzZXR1cCgpIHsKICAgICAgICAgYnJva2VyID0gbmV3IEthZmthVGVzdEJyb2tlcigpOwotICAgICAgICBHbG9iYWxQYXJ0aXRpb25JbmZvcm1hdGlvbiBnbG9iYWxQYXJ0aXRpb25JbmZvcm1hdGlvbiA9IG5ldyBHbG9iYWxQYXJ0aXRpb25JbmZvcm1hdGlvbigpOworICAgICAgICBHbG9iYWxQYXJ0aXRpb25JbmZvcm1hdGlvbiBnbG9iYWxQYXJ0aXRpb25JbmZvcm1hdGlvbiA9IG5ldyBHbG9iYWxQYXJ0aXRpb25JbmZvcm1hdGlvbihURVNUX1RPUElDKTsKICAgICAgICAgZ2xvYmFsUGFydGl0aW9uSW5mb3JtYXRpb24uYWRkUGFydGl0aW9uKDAsIEJyb2tlci5mcm9tU3RyaW5nKGJyb2tlci5nZXRCcm9rZXJDb25uZWN0aW9uU3RyaW5nKCkpKTsKICAgICAgICAgYnJva2VySG9zdHMgPSBuZXcgU3RhdGljSG9zdHMoZ2xvYmFsUGFydGl0aW9uSW5mb3JtYXRpb24pOwotICAgICAgICBjb25maWcgPSBuZXcgS2Fma2FDb25maWcoYnJva2VySG9zdHMsICJ0ZXN0VG9waWMiKTsKKyAgICAgICAgY29uZmlnID0gbmV3IEthZmthQ29uZmlnKGJyb2tlckhvc3RzLCBURVNUX1RPUElDKTsKICAgICAgICAgc2ltcGxlQ29uc3VtZXIgPSBuZXcgU2ltcGxlQ29uc3VtZXIoImxvY2FsaG9zdCIsIGJyb2tlci5nZXRQb3J0KCksIDYwMDAwLCAxMDI0LCAidGVzdENsaWVudCIpOwogICAgIH0KIApAQCAtNjksNyArNzMsNyBAQAogCiAgICAgQFRlc3QoZXhwZWN0ZWQgPSBGYWlsZWRGZXRjaEV4Y2VwdGlvbi5jbGFzcykKICAgICBwdWJsaWMgdm9pZCB0b3BpY0RvZXNOb3RFeGlzdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBLYWZrYVV0aWxzLmZldGNoTWVzc2FnZXMoY29uZmlnLCBzaW1wbGVDb25zdW1lciwgbmV3IFBhcnRpdGlvbihCcm9rZXIuZnJvbVN0cmluZyhicm9rZXIuZ2V0QnJva2VyQ29ubmVjdGlvblN0cmluZygpKSwgMCksIDApOworICAgICAgICBLYWZrYVV0aWxzLmZldGNoTWVzc2FnZXMoY29uZmlnLCBzaW1wbGVDb25zdW1lciwgbmV3IFBhcnRpdGlvbihCcm9rZXIuZnJvbVN0cmluZyhicm9rZXIuZ2V0QnJva2VyQ29ubmVjdGlvblN0cmluZygpKSwgVEVTVF9UT1BJQywgMCksIDApOwogICAgIH0KIAogICAgIEBUZXN0KGV4cGVjdGVkID0gRmFpbGVkRmV0Y2hFeGNlcHRpb24uY2xhc3MpCkBAIC03OCw3ICs4Miw3IEBACiAgICAgICAgIGJyb2tlci5zaHV0ZG93bigpOwogICAgICAgICBTaW1wbGVDb25zdW1lciBzaW1wbGVDb25zdW1lciA9IG5ldyBTaW1wbGVDb25zdW1lcigibG9jYWxob3N0IiwgcG9ydCwgMTAwLCAxMDI0LCAidGVzdENsaWVudCIpOwogICAgICAgICB0cnkgewotICAgICAgICAgICAgS2Fma2FVdGlscy5mZXRjaE1lc3NhZ2VzKGNvbmZpZywgc2ltcGxlQ29uc3VtZXIsIG5ldyBQYXJ0aXRpb24oQnJva2VyLmZyb21TdHJpbmcoYnJva2VyLmdldEJyb2tlckNvbm5lY3Rpb25TdHJpbmcoKSksIDApLCBPZmZzZXRSZXF1ZXN0LkxhdGVzdFRpbWUoKSk7CisgICAgICAgICAgICBLYWZrYVV0aWxzLmZldGNoTWVzc2FnZXMoY29uZmlnLCBzaW1wbGVDb25zdW1lciwgbmV3IFBhcnRpdGlvbihCcm9rZXIuZnJvbVN0cmluZyhicm9rZXIuZ2V0QnJva2VyQ29ubmVjdGlvblN0cmluZygpKSwgVEVTVF9UT1BJQywgMCksIE9mZnNldFJlcXVlc3QuTGF0ZXN0VGltZSgpKTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIHNpbXBsZUNvbnN1bWVyLmNsb3NlKCk7CiAgICAgICAgIH0KQEAgLTkwLDcgKzk0LDcgQEAKICAgICAgICAgY3JlYXRlVG9waWNBbmRTZW5kTWVzc2FnZSh2YWx1ZSk7CiAgICAgICAgIGxvbmcgb2Zmc2V0ID0gS2Fma2FVdGlscy5nZXRPZmZzZXQoc2ltcGxlQ29uc3VtZXIsIGNvbmZpZy50b3BpYywgMCwgT2Zmc2V0UmVxdWVzdC5MYXRlc3RUaW1lKCkpIC0gMTsKICAgICAgICAgQnl0ZUJ1ZmZlck1lc3NhZ2VTZXQgbWVzc2FnZUFuZE9mZnNldHMgPSBLYWZrYVV0aWxzLmZldGNoTWVzc2FnZXMoY29uZmlnLCBzaW1wbGVDb25zdW1lciwKLSAgICAgICAgICAgICAgICBuZXcgUGFydGl0aW9uKEJyb2tlci5mcm9tU3RyaW5nKGJyb2tlci5nZXRCcm9rZXJDb25uZWN0aW9uU3RyaW5nKCkpLCAwKSwgb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBuZXcgUGFydGl0aW9uKEJyb2tlci5mcm9tU3RyaW5nKGJyb2tlci5nZXRCcm9rZXJDb25uZWN0aW9uU3RyaW5nKCkpLCBURVNUX1RPUElDLCAwKSwgb2Zmc2V0KTsKICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBuZXcgU3RyaW5nKFV0aWxzLnRvQnl0ZUFycmF5KG1lc3NhZ2VBbmRPZmZzZXRzLml0ZXJhdG9yKCkubmV4dCgpLm1lc3NhZ2UoKS5wYXlsb2FkKCkpKTsKICAgICAgICAgYXNzZXJ0VGhhdChtZXNzYWdlLCBpcyhlcXVhbFRvKHZhbHVlKSkpOwogICAgIH0KQEAgLTk5LDcgKzEwMyw3IEBACiAgICAgcHVibGljIHZvaWQgZmV0Y2hNZXNzYWdlc1dpdGhJbnZhbGlkT2Zmc2V0QW5kRGVmYXVsdEhhbmRsaW5nRGlzYWJsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgY29uZmlnLnVzZVN0YXJ0T2Zmc2V0VGltZUlmT2Zmc2V0T3V0T2ZSYW5nZSA9IGZhbHNlOwogICAgICAgICBLYWZrYVV0aWxzLmZldGNoTWVzc2FnZXMoY29uZmlnLCBzaW1wbGVDb25zdW1lciwKLSAgICAgICAgICAgICAgICBuZXcgUGFydGl0aW9uKEJyb2tlci5mcm9tU3RyaW5nKGJyb2tlci5nZXRCcm9rZXJDb25uZWN0aW9uU3RyaW5nKCkpLCAwKSwgLTk5KTsKKyAgICAgICAgICAgICAgICBuZXcgUGFydGl0aW9uKEJyb2tlci5mcm9tU3RyaW5nKGJyb2tlci5nZXRCcm9rZXJDb25uZWN0aW9uU3RyaW5nKCkpLCBURVNUX1RPUElDLCAwKSwgLTk5KTsKICAgICB9CiAKICAgICBAVGVzdChleHBlY3RlZCA9IFRvcGljT2Zmc2V0T3V0T2ZSYW5nZUV4Y2VwdGlvbi5jbGFzcykKQEAgLTEwOCw3ICsxMTIsNyBAQAogICAgICAgICBTdHJpbmcgdmFsdWUgPSAidGVzdCI7CiAgICAgICAgIGNyZWF0ZVRvcGljQW5kU2VuZE1lc3NhZ2UodmFsdWUpOwogICAgICAgICBLYWZrYVV0aWxzLmZldGNoTWVzc2FnZXMoY29uZmlnLCBzaW1wbGVDb25zdW1lciwKLSAgICAgICAgICAgICAgICBuZXcgUGFydGl0aW9uKEJyb2tlci5mcm9tU3RyaW5nKGJyb2tlci5nZXRCcm9rZXJDb25uZWN0aW9uU3RyaW5nKCkpLCAwKSwgLTk5KTsKKyAgICAgICAgICAgICAgICBuZXcgUGFydGl0aW9uKEJyb2tlci5mcm9tU3RyaW5nKGJyb2tlci5nZXRCcm9rZXJDb25uZWN0aW9uU3RyaW5nKCkpLCAibmV3VG9waWMiLCAwKSwgLTk5KTsKICAgICB9CiAKICAgICBAVGVzdApAQCAtMTQ2LDcgKzE1MCw3IEBACiAgICAgICAgIGNyZWF0ZVRvcGljQW5kU2VuZE1lc3NhZ2Uoa2V5LCB2YWx1ZSk7CiAgICAgICAgIEJ5dGVCdWZmZXJNZXNzYWdlU2V0IG1lc3NhZ2VBbmRPZmZzZXRzID0gZ2V0TGFzdE1lc3NhZ2UoKTsKICAgICAgICAgZm9yIChNZXNzYWdlQW5kT2Zmc2V0IG1zZyA6IG1lc3NhZ2VBbmRPZmZzZXRzKSB7Ci0gICAgICAgICAgICBJdGVyYWJsZTxMaXN0PE9iamVjdD4+IGxpc3RzID0gS2Fma2FVdGlscy5nZW5lcmF0ZVR1cGxlcyhjb25maWcsIG1zZy5tZXNzYWdlKCkpOworICAgICAgICAgICAgSXRlcmFibGU8TGlzdDxPYmplY3Q+PiBsaXN0cyA9IEthZmthVXRpbHMuZ2VuZXJhdGVUdXBsZXMoY29uZmlnLCBtc2cubWVzc2FnZSgpLCBjb25maWcudG9waWMpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEltbXV0YWJsZU1hcC5vZihrZXksIHZhbHVlKSwgbGlzdHMuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0KDApKTsKICAgICAgICAgfQogICAgIH0KQEAgLTE1OCw2ICsxNjIsMjAgQEAKICAgICB9CiAKICAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlVHVwbGVzV2l0aFZhbHVlQW5kU3RyaW5nTXVsdGlTY2hlbWVXaXRoVG9waWMoKSB7CisgICAgICAgIGNvbmZpZy5zY2hlbWUgPSBuZXcgU3RyaW5nTXVsdGlTY2hlbWVXaXRoVG9waWMoKTsKKyAgICAgICAgU3RyaW5nIHZhbHVlID0gInZhbHVlIjsKKyAgICAgICAgY3JlYXRlVG9waWNBbmRTZW5kTWVzc2FnZSh2YWx1ZSk7CisgICAgICAgIEJ5dGVCdWZmZXJNZXNzYWdlU2V0IG1lc3NhZ2VBbmRPZmZzZXRzID0gZ2V0TGFzdE1lc3NhZ2UoKTsKKyAgICAgICAgZm9yIChNZXNzYWdlQW5kT2Zmc2V0IG1zZyA6IG1lc3NhZ2VBbmRPZmZzZXRzKSB7CisgICAgICAgICAgICBJdGVyYWJsZTxMaXN0PE9iamVjdD4+IGxpc3RzID0gS2Fma2FVdGlscy5nZW5lcmF0ZVR1cGxlcyhjb25maWcsIG1zZy5tZXNzYWdlKCksIGNvbmZpZy50b3BpYyk7CisgICAgICAgICAgICBMaXN0PE9iamVjdD4gbGlzdCA9IGxpc3RzLml0ZXJhdG9yKCkubmV4dCgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlLCBsaXN0LmdldCgwKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY29uZmlnLnRvcGljLCBsaXN0LmdldCgxKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlVHVwbGVzV2l0aFZhbHVlU2NoZW1lQW5kS2V5VmFsdWVNZXNzYWdlKCkgewogICAgICAgICBjb25maWcuc2NoZW1lID0gbmV3IFNjaGVtZUFzTXVsdGlTY2hlbWUobmV3IFN0cmluZ1NjaGVtZSgpKTsKICAgICAgICAgU3RyaW5nIHZhbHVlID0gInZhbHVlIjsKQEAgLTE2NSwyMiArMTgzLDQzIEBACiAgICAgICAgIGNyZWF0ZVRvcGljQW5kU2VuZE1lc3NhZ2Uoa2V5LCB2YWx1ZSk7CiAgICAgICAgIEJ5dGVCdWZmZXJNZXNzYWdlU2V0IG1lc3NhZ2VBbmRPZmZzZXRzID0gZ2V0TGFzdE1lc3NhZ2UoKTsKICAgICAgICAgZm9yIChNZXNzYWdlQW5kT2Zmc2V0IG1zZyA6IG1lc3NhZ2VBbmRPZmZzZXRzKSB7Ci0gICAgICAgICAgICBJdGVyYWJsZTxMaXN0PE9iamVjdD4+IGxpc3RzID0gS2Fma2FVdGlscy5nZW5lcmF0ZVR1cGxlcyhjb25maWcsIG1zZy5tZXNzYWdlKCkpOworICAgICAgICAgICAgSXRlcmFibGU8TGlzdDxPYmplY3Q+PiBsaXN0cyA9IEthZmthVXRpbHMuZ2VuZXJhdGVUdXBsZXMoY29uZmlnLCBtc2cubWVzc2FnZSgpLCBjb25maWcudG9waWMpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlLCBsaXN0cy5pdGVyYXRvcigpLm5leHQoKS5nZXQoMCkpOwogICAgICAgICB9CiAgICAgfQorICAgIAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZ2VuZXJhdGVUdXBsZXNXaXRoTWVzc2FnZUFuZE1ldGFkYXRhU2NoZW1lKCkgeworICAgICAgICBTdHJpbmcgdmFsdWUgPSAidmFsdWUiOworICAgICAgICBQYXJ0aXRpb24gbW9ja1BhcnRpdGlvbiA9IE1vY2tpdG8ubW9jayhQYXJ0aXRpb24uY2xhc3MpOworICAgICAgICBtb2NrUGFydGl0aW9uLnBhcnRpdGlvbiA9IDA7CisgICAgICAgIGxvbmcgb2Zmc2V0ID0gMEw7CisgICAgICAgIAorICAgICAgICBNZXNzYWdlTWV0YWRhdGFTY2hlbWVBc011bHRpU2NoZW1lIHNjaGVtZSA9IG5ldyBNZXNzYWdlTWV0YWRhdGFTY2hlbWVBc011bHRpU2NoZW1lKG5ldyBTdHJpbmdNZXNzYWdlQW5kTWV0YWRhdGFTY2hlbWUoKSk7CisgICAgICAgIAorICAgICAgICBjcmVhdGVUb3BpY0FuZFNlbmRNZXNzYWdlKG51bGwsIHZhbHVlKTsKKyAgICAgICAgQnl0ZUJ1ZmZlck1lc3NhZ2VTZXQgbWVzc2FnZUFuZE9mZnNldHMgPSBnZXRMYXN0TWVzc2FnZSgpOworICAgICAgICBmb3IgKE1lc3NhZ2VBbmRPZmZzZXQgbXNnIDogbWVzc2FnZUFuZE9mZnNldHMpIHsKKyAgICAgICAgICAgIEl0ZXJhYmxlPExpc3Q8T2JqZWN0Pj4gbGlzdHMgPSBLYWZrYVV0aWxzLmdlbmVyYXRlVHVwbGVzKHNjaGVtZSwgbXNnLm1lc3NhZ2UoKSwgbW9ja1BhcnRpdGlvbiwgb2Zmc2V0KTsKKyAgICAgICAgICAgIExpc3Q8T2JqZWN0PiB2YWx1ZXMgPSBsaXN0cy5pdGVyYXRvcigpLm5leHQoKTsgCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIk1lc3NhZ2UgaXMgaW5jb3JyZWN0IiwgdmFsdWUsIHZhbHVlcy5nZXQoMCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJQYXJ0aXRpb24gaXMgaW5jb3JyZWN0IiwgbW9ja1BhcnRpdGlvbi5wYXJ0aXRpb24sIHZhbHVlcy5nZXQoMSkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJPZmZzZXQgaXMgaW5jb3JyZWN0Iiwgb2Zmc2V0LCB2YWx1ZXMuZ2V0KDIpKTsKKyAgICAgICAgfQorICAgIH0KIAogICAgIHByaXZhdGUgQnl0ZUJ1ZmZlck1lc3NhZ2VTZXQgZ2V0TGFzdE1lc3NhZ2UoKSB7CiAgICAgICAgIGxvbmcgb2Zmc2V0T2ZMYXN0TWVzc2FnZSA9IEthZmthVXRpbHMuZ2V0T2Zmc2V0KHNpbXBsZUNvbnN1bWVyLCBjb25maWcudG9waWMsIDAsIE9mZnNldFJlcXVlc3QuTGF0ZXN0VGltZSgpKSAtIDE7Ci0gICAgICAgIHJldHVybiBLYWZrYVV0aWxzLmZldGNoTWVzc2FnZXMoY29uZmlnLCBzaW1wbGVDb25zdW1lciwgbmV3IFBhcnRpdGlvbihCcm9rZXIuZnJvbVN0cmluZyhicm9rZXIuZ2V0QnJva2VyQ29ubmVjdGlvblN0cmluZygpKSwgMCksIG9mZnNldE9mTGFzdE1lc3NhZ2UpOworICAgICAgICByZXR1cm4gS2Fma2FVdGlscy5mZXRjaE1lc3NhZ2VzKGNvbmZpZywgc2ltcGxlQ29uc3VtZXIsIG5ldyBQYXJ0aXRpb24oQnJva2VyLmZyb21TdHJpbmcoYnJva2VyLmdldEJyb2tlckNvbm5lY3Rpb25TdHJpbmcoKSksIFRFU1RfVE9QSUMsIDApLCBvZmZzZXRPZkxhc3RNZXNzYWdlKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgcnVuR2V0VmFsdWVPbmx5VHVwbGVzVGVzdCgpIHsKICAgICAgICAgU3RyaW5nIHZhbHVlID0gInZhbHVlIjsKKyAgICAgICAgCiAgICAgICAgIGNyZWF0ZVRvcGljQW5kU2VuZE1lc3NhZ2UobnVsbCwgdmFsdWUpOwogICAgICAgICBCeXRlQnVmZmVyTWVzc2FnZVNldCBtZXNzYWdlQW5kT2Zmc2V0cyA9IGdldExhc3RNZXNzYWdlKCk7CiAgICAgICAgIGZvciAoTWVzc2FnZUFuZE9mZnNldCBtc2cgOiBtZXNzYWdlQW5kT2Zmc2V0cykgewotICAgICAgICAgICAgSXRlcmFibGU8TGlzdDxPYmplY3Q+PiBsaXN0cyA9IEthZmthVXRpbHMuZ2VuZXJhdGVUdXBsZXMoY29uZmlnLCBtc2cubWVzc2FnZSgpKTsKKyAgICAgICAgICAgIEl0ZXJhYmxlPExpc3Q8T2JqZWN0Pj4gbGlzdHMgPSBLYWZrYVV0aWxzLmdlbmVyYXRlVHVwbGVzKGNvbmZpZywgbXNnLm1lc3NhZ2UoKSwgY29uZmlnLnRvcGljKTsKICAgICAgICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZSwgbGlzdHMuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0KDApKTsKICAgICAgICAgfQogICAgIH0KQEAgLTE5NSw3ICsyMzQsNyBAQAogCiAgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVRvcGljQW5kU2VuZE1lc3NhZ2UoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7CiAgICAgICAgIFByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIHAucHV0KCJzZXJpYWxpemVyLmNsYXNzIiwgImthZmthLnNlcmlhbGl6ZXIuU3RyaW5nRW5jb2RlciIpOworICAgICAgICBwLnB1dCgiYWNrcyIsICIxIik7CiAgICAgICAgIHAucHV0KCJib290c3RyYXAuc2VydmVycyIsIGJyb2tlci5nZXRCcm9rZXJDb25uZWN0aW9uU3RyaW5nKCkpOwogICAgICAgICBwLnB1dCgia2V5LnNlcmlhbGl6ZXIiLCAib3JnLmFwYWNoZS5rYWZrYS5jb21tb24uc2VyaWFsaXphdGlvbi5TdHJpbmdTZXJpYWxpemVyIik7CiAgICAgICAgIHAucHV0KCJ2YWx1ZS5zZXJpYWxpemVyIiwgIm9yZy5hcGFjaGUua2Fma2EuY29tbW9uLnNlcmlhbGl6YXRpb24uU3RyaW5nU2VyaWFsaXplciIpOwpAQCAtMjI1LDI3ICsyNjQsMzIgQEAKICAgICBwdWJsaWMgdm9pZCBhc3NpZ25BbGxQYXJ0aXRpb25zVG9PbmVUYXNrKCkgewogICAgICAgICBydW5QYXJ0aXRpb25Ub1Rhc2tNYXBwaW5nVGVzdCgzMiwgMzIpOwogICAgIH0KLQotCisgICAgCiAgICAgcHVibGljIHZvaWQgcnVuUGFydGl0aW9uVG9UYXNrTWFwcGluZ1Rlc3QoaW50IG51bVBhcnRpdGlvbnMsIGludCBwYXJ0aXRpb25zUGVyVGFzaykgewogICAgICAgICBHbG9iYWxQYXJ0aXRpb25JbmZvcm1hdGlvbiBnbG9iYWxQYXJ0aXRpb25JbmZvcm1hdGlvbiA9IFRlc3RVdGlscy5idWlsZFBhcnRpdGlvbkluZm8obnVtUGFydGl0aW9ucyk7CisgICAgICAgIExpc3Q8R2xvYmFsUGFydGl0aW9uSW5mb3JtYXRpb24+IHBhcnRpdGlvbnMgPSBuZXcgQXJyYXlMaXN0PEdsb2JhbFBhcnRpdGlvbkluZm9ybWF0aW9uPigpOworICAgICAgICBwYXJ0aXRpb25zLmFkZChnbG9iYWxQYXJ0aXRpb25JbmZvcm1hdGlvbik7CiAgICAgICAgIGludCBudW1UYXNrcyA9IG51bVBhcnRpdGlvbnMgLyBwYXJ0aXRpb25zUGVyVGFzazsKICAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgbnVtVGFza3MgOyBpKyspIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhwYXJ0aXRpb25zUGVyVGFzaywgS2Fma2FVdGlscy5jYWxjdWxhdGVQYXJ0aXRpb25zRm9yVGFzayhnbG9iYWxQYXJ0aXRpb25JbmZvcm1hdGlvbiwgbnVtVGFza3MsIGkpLnNpemUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMocGFydGl0aW9uc1BlclRhc2ssIEthZmthVXRpbHMuY2FsY3VsYXRlUGFydGl0aW9uc0ZvclRhc2socGFydGl0aW9ucywgbnVtVGFza3MsIGkpLnNpemUoKSk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIG1vcmVUYXNrc1RoYW5QYXJ0aXRpb25zKCkgewogICAgICAgICBHbG9iYWxQYXJ0aXRpb25JbmZvcm1hdGlvbiBnbG9iYWxQYXJ0aXRpb25JbmZvcm1hdGlvbiA9IFRlc3RVdGlscy5idWlsZFBhcnRpdGlvbkluZm8oMSk7CisgICAgICAgIExpc3Q8R2xvYmFsUGFydGl0aW9uSW5mb3JtYXRpb24+IHBhcnRpdGlvbnMgPSBuZXcgQXJyYXlMaXN0PEdsb2JhbFBhcnRpdGlvbkluZm9ybWF0aW9uPigpOworICAgICAgICBwYXJ0aXRpb25zLmFkZChnbG9iYWxQYXJ0aXRpb25JbmZvcm1hdGlvbik7CiAgICAgICAgIGludCBudW1UYXNrcyA9IDI7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBLYWZrYVV0aWxzLmNhbGN1bGF0ZVBhcnRpdGlvbnNGb3JUYXNrKGdsb2JhbFBhcnRpdGlvbkluZm9ybWF0aW9uLCBudW1UYXNrcywgMCkuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIEthZmthVXRpbHMuY2FsY3VsYXRlUGFydGl0aW9uc0ZvclRhc2soZ2xvYmFsUGFydGl0aW9uSW5mb3JtYXRpb24sIG51bVRhc2tzLCAxKS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgS2Fma2FVdGlscy5jYWxjdWxhdGVQYXJ0aXRpb25zRm9yVGFzayhwYXJ0aXRpb25zLCBudW1UYXNrcywgMCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIEthZmthVXRpbHMuY2FsY3VsYXRlUGFydGl0aW9uc0ZvclRhc2socGFydGl0aW9ucywgbnVtVGFza3MsIDEpLnNpemUoKSk7CiAgICAgfQogCiAgICAgQFRlc3QgKGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzICkKICAgICBwdWJsaWMgdm9pZCBhc3NpZ25JbnZhbGlkVGFzaygpIHsKLSAgICAgICAgR2xvYmFsUGFydGl0aW9uSW5mb3JtYXRpb24gZ2xvYmFsUGFydGl0aW9uSW5mb3JtYXRpb24gPSBuZXcgR2xvYmFsUGFydGl0aW9uSW5mb3JtYXRpb24oKTsKLSAgICAgICAgS2Fma2FVdGlscy5jYWxjdWxhdGVQYXJ0aXRpb25zRm9yVGFzayhnbG9iYWxQYXJ0aXRpb25JbmZvcm1hdGlvbiwgMSwgMSk7CisgICAgICAgIEdsb2JhbFBhcnRpdGlvbkluZm9ybWF0aW9uIGdsb2JhbFBhcnRpdGlvbkluZm9ybWF0aW9uID0gbmV3IEdsb2JhbFBhcnRpdGlvbkluZm9ybWF0aW9uKFRFU1RfVE9QSUMpOworICAgICAgICBMaXN0PEdsb2JhbFBhcnRpdGlvbkluZm9ybWF0aW9uPiBwYXJ0aXRpb25zID0gbmV3IEFycmF5TGlzdDxHbG9iYWxQYXJ0aXRpb25JbmZvcm1hdGlvbj4oKTsKKyAgICAgICAgcGFydGl0aW9ucy5hZGQoZ2xvYmFsUGFydGl0aW9uSW5mb3JtYXRpb24pOworICAgICAgICBLYWZrYVV0aWxzLmNhbGN1bGF0ZVBhcnRpdGlvbnNGb3JUYXNrKHBhcnRpdGlvbnMsIDEsIDEpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2V4dGVybmFsL3N0b3JtLWthZmthL3NyYy90ZXN0L3N0b3JtL2thZmthL1N0cmluZ0tleVZhbHVlU2NoZW1lVGVzdC5qYXZhIGIvZXh0ZXJuYWwvc3Rvcm0ta2Fma2Evc3JjL3Rlc3Qvc3Rvcm0va2Fma2EvU3RyaW5nS2V5VmFsdWVTY2hlbWVUZXN0LmphdmEKaW5kZXggMGI3ODZiYS4uZWRkYjkwMCAxMDA2NDQKLS0tIGEvZXh0ZXJuYWwvc3Rvcm0ta2Fma2Evc3JjL3Rlc3Qvc3Rvcm0va2Fma2EvU3RyaW5nS2V5VmFsdWVTY2hlbWVUZXN0LmphdmEKKysrIGIvZXh0ZXJuYWwvc3Rvcm0ta2Fma2Evc3JjL3Rlc3Qvc3Rvcm0va2Fma2EvU3RyaW5nS2V5VmFsdWVTY2hlbWVUZXN0LmphdmEKQEAgLTIxLDcgKzIxLDkgQEAKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIAotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwogCiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CkBAIC0zMiw3ICszNCw3IEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3REZXNlcmlhbGl6ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLmFzTGlzdCgidGVzdCIpLCBzY2hlbWUuZGVzZXJpYWxpemUoInRlc3QiLmdldEJ5dGVzKCkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoInRlc3QiKSwgc2NoZW1lLmRlc2VyaWFsaXplKHdyYXBTdHJpbmcoInRlc3QiKSkpOwogICAgIH0KIAogICAgIEBUZXN0CkBAIC00NCwxMiArNDYsMTcgQEAKIAogICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdERlc2VyaWFsaXplV2l0aE51bGxLZXlBbmRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLmFzTGlzdCgidGVzdCIpLCBzY2hlbWUuZGVzZXJpYWxpemVLZXlBbmRWYWx1ZShudWxsLCAidGVzdCIuZ2V0Qnl0ZXMoKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCgidGVzdCIpLAorICAgICAgICAgICAgc2NoZW1lLmRlc2VyaWFsaXplS2V5QW5kVmFsdWUobnVsbCwgd3JhcFN0cmluZygidGVzdCIpKSk7CiAgICAgfQogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RGVzZXJpYWxpemVXaXRoS2V5QW5kVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QoSW1tdXRhYmxlTWFwLm9mKCJrZXkiLCAidGVzdCIpKSwKLSAgICAgICAgICAgICAgICBzY2hlbWUuZGVzZXJpYWxpemVLZXlBbmRWYWx1ZSgia2V5Ii5nZXRCeXRlcygpLCAidGVzdCIuZ2V0Qnl0ZXMoKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChJbW11dGFibGVNYXAub2YoImtleSIsICJ0ZXN0IikpLAorICAgICAgICAgICAgICAgIHNjaGVtZS5kZXNlcmlhbGl6ZUtleUFuZFZhbHVlKHdyYXBTdHJpbmcoImtleSIpLCB3cmFwU3RyaW5nKCJ0ZXN0IikpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBCeXRlQnVmZmVyIHdyYXBTdHJpbmcoU3RyaW5nIHMpIHsKKyAgICAgICAgcmV0dXJuIEJ5dGVCdWZmZXIud3JhcChzLmdldEJ5dGVzKENoYXJzZXQuZGVmYXVsdENoYXJzZXQoKSkpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2V4dGVybmFsL3N0b3JtLWthZmthL3NyYy90ZXN0L3N0b3JtL2thZmthL1Rlc3RTdHJpbmdTY2hlbWUuamF2YSBiL2V4dGVybmFsL3N0b3JtLWthZmthL3NyYy90ZXN0L3N0b3JtL2thZmthL1Rlc3RTdHJpbmdTY2hlbWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTM2NDA5Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0ZXJuYWwvc3Rvcm0ta2Fma2Evc3JjL3Rlc3Qvc3Rvcm0va2Fma2EvVGVzdFN0cmluZ1NjaGVtZS5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiA8cD4KKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogPHA+CisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBzdG9ybS5rYWZrYTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK3B1YmxpYyBjbGFzcyBUZXN0U3RyaW5nU2NoZW1lIHsKKyAgQFRlc3QKKyAgcHVibGljIHZvaWQgdGVzdERlc2VyaWFsaXplU3RyaW5nKCkgeworICAgIFN0cmluZyBzID0gImZvbyI7CisgICAgYnl0ZVtdIGJ5dGVzID0gcy5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKKyAgICBCeXRlQnVmZmVyIGRpcmVjdCA9IEJ5dGVCdWZmZXIuYWxsb2NhdGVEaXJlY3QoYnl0ZXMubGVuZ3RoKTsKKyAgICBkaXJlY3QucHV0KGJ5dGVzKTsKKyAgICBkaXJlY3QuZmxpcCgpOworICAgIFN0cmluZyBzMSA9IFN0cmluZ1NjaGVtZS5kZXNlcmlhbGl6ZVN0cmluZyhCeXRlQnVmZmVyLndyYXAoYnl0ZXMpKTsKKyAgICBTdHJpbmcgczIgPSBTdHJpbmdTY2hlbWUuZGVzZXJpYWxpemVTdHJpbmcoZGlyZWN0KTsKKyAgICBhc3NlcnRFcXVhbHMocywgczEpOworICAgIGFzc2VydEVxdWFscyhzLCBzMik7CisgIH0KK30KZGlmZiAtLWdpdCBhL2V4dGVybmFsL3N0b3JtLWthZmthL3NyYy90ZXN0L3N0b3JtL2thZmthL1Rlc3RVdGlscy5qYXZhIGIvZXh0ZXJuYWwvc3Rvcm0ta2Fma2Evc3JjL3Rlc3Qvc3Rvcm0va2Fma2EvVGVzdFV0aWxzLmphdmEKaW5kZXggZmEyOTk5Mi4uM2U2OTE2MCAxMDA2NDQKLS0tIGEvZXh0ZXJuYWwvc3Rvcm0ta2Fma2Evc3JjL3Rlc3Qvc3Rvcm0va2Fma2EvVGVzdFV0aWxzLmphdmEKKysrIGIvZXh0ZXJuYWwvc3Rvcm0ta2Fma2Evc3JjL3Rlc3Qvc3Rvcm0va2Fma2EvVGVzdFV0aWxzLmphdmEKQEAgLTI4LDcgKzI4LDcgQEAKIGltcG9ydCBzdG9ybS5rYWZrYS50cmlkZW50Lkdsb2JhbFBhcnRpdGlvbkluZm9ybWF0aW9uOwogCiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKIAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIApAQCAtNDAsOSArNDAsMTQgQEAKICAgICAgICAgcmV0dXJuIGJ1aWxkUGFydGl0aW9uSW5mbyhudW1QYXJ0aXRpb25zLCA5MDkyKTsKICAgICB9CiAKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8R2xvYmFsUGFydGl0aW9uSW5mb3JtYXRpb24+IGJ1aWxkUGFydGl0aW9uSW5mb0xpc3QoR2xvYmFsUGFydGl0aW9uSW5mb3JtYXRpb24gcGFydGl0aW9uSW5mb3JtYXRpb24pIHsKKyAgICAgICAgTGlzdDxHbG9iYWxQYXJ0aXRpb25JbmZvcm1hdGlvbj4gbWFwID0gbmV3IEFycmF5TGlzdDxHbG9iYWxQYXJ0aXRpb25JbmZvcm1hdGlvbj4oKTsKKyAgICAgICAgbWFwLmFkZChwYXJ0aXRpb25JbmZvcm1hdGlvbik7CisgICAgICAgIHJldHVybiBtYXA7CisgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBHbG9iYWxQYXJ0aXRpb25JbmZvcm1hdGlvbiBidWlsZFBhcnRpdGlvbkluZm8oaW50IG51bVBhcnRpdGlvbnMsIGludCBicm9rZXJQb3J0KSB7Ci0gICAgICAgIEdsb2JhbFBhcnRpdGlvbkluZm9ybWF0aW9uIGdsb2JhbFBhcnRpdGlvbkluZm9ybWF0aW9uID0gbmV3IEdsb2JhbFBhcnRpdGlvbkluZm9ybWF0aW9uKCk7CisgICAgICAgIEdsb2JhbFBhcnRpdGlvbkluZm9ybWF0aW9uIGdsb2JhbFBhcnRpdGlvbkluZm9ybWF0aW9uID0gbmV3IEdsb2JhbFBhcnRpdGlvbkluZm9ybWF0aW9uKFRPUElDKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1QYXJ0aXRpb25zOyBpKyspIHsKICAgICAgICAgICAgIGdsb2JhbFBhcnRpdGlvbkluZm9ybWF0aW9uLmFkZFBhcnRpdGlvbihpLCBCcm9rZXIuZnJvbVN0cmluZygiYnJva2VyLSIgKyBpICsgIiA6IiArIGJyb2tlclBvcnQpKTsKICAgICAgICAgfQpAQCAtNjMsMjcgKzY4LDI0IEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgQnJva2VySG9zdHMgZ2V0QnJva2VySG9zdHMoS2Fma2FUZXN0QnJva2VyIGJyb2tlcikgewotICAgICAgICBHbG9iYWxQYXJ0aXRpb25JbmZvcm1hdGlvbiBnbG9iYWxQYXJ0aXRpb25JbmZvcm1hdGlvbiA9IG5ldyBHbG9iYWxQYXJ0aXRpb25JbmZvcm1hdGlvbigpOworICAgICAgICBHbG9iYWxQYXJ0aXRpb25JbmZvcm1hdGlvbiBnbG9iYWxQYXJ0aXRpb25JbmZvcm1hdGlvbiA9IG5ldyBHbG9iYWxQYXJ0aXRpb25JbmZvcm1hdGlvbihUT1BJQyk7CiAgICAgICAgIGdsb2JhbFBhcnRpdGlvbkluZm9ybWF0aW9uLmFkZFBhcnRpdGlvbigwLCBCcm9rZXIuZnJvbVN0cmluZyhicm9rZXIuZ2V0QnJva2VyQ29ubmVjdGlvblN0cmluZygpKSk7CiAgICAgICAgIHJldHVybiBuZXcgU3RhdGljSG9zdHMoZ2xvYmFsUGFydGl0aW9uSW5mb3JtYXRpb24pOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgQ29uZmlnIGdldENvbmZpZyhTdHJpbmcgYnJva2VyQ29ubmVjdGlvblN0cmluZykgewotICAgICAgICBDb25maWcgY29uZmlnID0gbmV3IENvbmZpZygpOworICAgIHB1YmxpYyBzdGF0aWMgUHJvcGVydGllcyBnZXRQcm9kdWNlclByb3BlcnRpZXMoU3RyaW5nIGJyb2tlckNvbm5lY3Rpb25TdHJpbmcpIHsKICAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIHByb3BzLnB1dCgibWV0YWRhdGEuYnJva2VyLmxpc3QiLCBicm9rZXJDb25uZWN0aW9uU3RyaW5nKTsKLSAgICAgICAgcHJvcHMucHV0KCJyZXF1ZXN0LnJlcXVpcmVkLmFja3MiLCAiMSIpOwotICAgICAgICBwcm9wcy5wdXQoInNlcmlhbGl6ZXIuY2xhc3MiLCAia2Fma2Euc2VyaWFsaXplci5TdHJpbmdFbmNvZGVyIik7Ci0gICAgICAgIGNvbmZpZy5wdXQoS2Fma2FCb2x0LktBRktBX0JST0tFUl9QUk9QRVJUSUVTLCBwcm9wcyk7Ci0gICAgICAgIGNvbmZpZy5wdXQoS2Fma2FCb2x0LlRPUElDLCBUT1BJQyk7Ci0KLSAgICAgICAgcmV0dXJuIGNvbmZpZzsKKyAgICAgICAgcHJvcHMucHV0KCJib290c3RyYXAuc2VydmVycyIsIGJyb2tlckNvbm5lY3Rpb25TdHJpbmcpOworICAgICAgICBwcm9wcy5wdXQoImFja3MiLCAiMSIpOworICAgICAgICBwcm9wcy5wdXQoImtleS5zZXJpYWxpemVyIiwgIm9yZy5hcGFjaGUua2Fma2EuY29tbW9uLnNlcmlhbGl6YXRpb24uU3RyaW5nU2VyaWFsaXplciIpOworICAgICAgICBwcm9wcy5wdXQoInZhbHVlLnNlcmlhbGl6ZXIiLCAib3JnLmFwYWNoZS5rYWZrYS5jb21tb24uc2VyaWFsaXphdGlvbi5TdHJpbmdTZXJpYWxpemVyIik7CisgICAgICAgIHJldHVybiBwcm9wczsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmVyaWZ5TWVzc2FnZShTdHJpbmcga2V5LCBTdHJpbmcgbWVzc2FnZSwgS2Fma2FUZXN0QnJva2VyIGJyb2tlciwgU2ltcGxlQ29uc3VtZXIgc2ltcGxlQ29uc3VtZXIpIHsKICAgICAgICAgbG9uZyBsYXN0TWVzc2FnZU9mZnNldCA9IEthZmthVXRpbHMuZ2V0T2Zmc2V0KHNpbXBsZUNvbnN1bWVyLCBUZXN0VXRpbHMuVE9QSUMsIDAsIE9mZnNldFJlcXVlc3QuTGF0ZXN0VGltZSgpKSAtIDE7CiAgICAgICAgIEJ5dGVCdWZmZXJNZXNzYWdlU2V0IG1lc3NhZ2VBbmRPZmZzZXRzID0gS2Fma2FVdGlscy5mZXRjaE1lc3NhZ2VzKFRlc3RVdGlscy5nZXRLYWZrYUNvbmZpZyhicm9rZXIpLCBzaW1wbGVDb25zdW1lciwKLSAgICAgICAgICAgICAgICBuZXcgUGFydGl0aW9uKEJyb2tlci5mcm9tU3RyaW5nKGJyb2tlci5nZXRCcm9rZXJDb25uZWN0aW9uU3RyaW5nKCkpLCAwKSwgbGFzdE1lc3NhZ2VPZmZzZXQpOworICAgICAgICAgICAgICAgIG5ldyBQYXJ0aXRpb24oQnJva2VyLmZyb21TdHJpbmcoYnJva2VyLmdldEJyb2tlckNvbm5lY3Rpb25TdHJpbmcoKSksVGVzdFV0aWxzLlRPUElDLCAwKSwgbGFzdE1lc3NhZ2VPZmZzZXQpOwogICAgICAgICBNZXNzYWdlQW5kT2Zmc2V0IG1lc3NhZ2VBbmRPZmZzZXQgPSBtZXNzYWdlQW5kT2Zmc2V0cy5pdGVyYXRvcigpLm5leHQoKTsKICAgICAgICAgTWVzc2FnZSBrYWZrYU1lc3NhZ2UgPSBtZXNzYWdlQW5kT2Zmc2V0Lm1lc3NhZ2UoKTsKICAgICAgICAgQnl0ZUJ1ZmZlciBtZXNzYWdlS2V5QnVmZmVyID0ga2Fma2FNZXNzYWdlLmtleSgpOwpkaWZmIC0tZ2l0IGEvZXh0ZXJuYWwvc3Rvcm0ta2Fma2Evc3JjL3Rlc3Qvc3Rvcm0va2Fma2EvVHJpZGVudEthZmthVGVzdC5qYXZhIGIvZXh0ZXJuYWwvc3Rvcm0ta2Fma2Evc3JjL3Rlc3Qvc3Rvcm0va2Fma2EvVHJpZGVudEthZmthVGVzdC5qYXZhCmluZGV4IGQ4YTVlMjQuLjgyMTNiMDcgMTAwNjQ0Ci0tLSBhL2V4dGVybmFsL3N0b3JtLWthZmthL3NyYy90ZXN0L3N0b3JtL2thZmthL1RyaWRlbnRLYWZrYVRlc3QuamF2YQorKysgYi9leHRlcm5hbC9zdG9ybS1rYWZrYS9zcmMvdGVzdC9zdG9ybS9rYWZrYS9UcmlkZW50S2Fma2FUZXN0LmphdmEKQEAgLTE3LDcgKzE3LDYgQEAKICAqLwogcGFja2FnZSBzdG9ybS5rYWZrYTsKIAotaW1wb3J0IGJhY2t0eXBlLnN0b3JtLkNvbmZpZzsKIGltcG9ydCBiYWNrdHlwZS5zdG9ybS50dXBsZS5GaWVsZHM7CiBpbXBvcnQga2Fma2EuamF2YWFwaS5jb25zdW1lci5TaW1wbGVDb25zdW1lcjsKIGltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CkBAIC0zNywyMiArMzYsMTggQEAKIHB1YmxpYyBjbGFzcyBUcmlkZW50S2Fma2FUZXN0IHsKICAgICBwcml2YXRlIEthZmthVGVzdEJyb2tlciBicm9rZXI7CiAgICAgcHJpdmF0ZSBUcmlkZW50S2Fma2FTdGF0ZSBzdGF0ZTsKLSAgICBwcml2YXRlIENvbmZpZyBjb25maWc7CiAgICAgcHJpdmF0ZSBTaW1wbGVDb25zdW1lciBzaW1wbGVDb25zdW1lcjsKLSAgICBwcml2YXRlIFRyaWRlbnRUdXBsZVRvS2Fma2FNYXBwZXIgbWFwcGVyOwotICAgIHByaXZhdGUgS2Fma2FUb3BpY1NlbGVjdG9yIHRvcGljU2VsZWN0b3I7CiAKICAgICBAQmVmb3JlCiAgICAgcHVibGljIHZvaWQgc2V0dXAoKSB7CiAgICAgICAgIGJyb2tlciA9IG5ldyBLYWZrYVRlc3RCcm9rZXIoKTsKICAgICAgICAgc2ltcGxlQ29uc3VtZXIgPSBUZXN0VXRpbHMuZ2V0S2Fma2FDb25zdW1lcihicm9rZXIpOwotICAgICAgICBjb25maWcgPSBUZXN0VXRpbHMuZ2V0Q29uZmlnKGJyb2tlci5nZXRCcm9rZXJDb25uZWN0aW9uU3RyaW5nKCkpOwotICAgICAgICBtYXBwZXIgPSBuZXcgRmllbGROYW1lQmFzZWRUdXBsZVRvS2Fma2FNYXBwZXIoImtleSIsICJtZXNzYWdlIik7Ci0gICAgICAgIHRvcGljU2VsZWN0b3IgPSBuZXcgRGVmYXVsdFRvcGljU2VsZWN0b3IoVGVzdFV0aWxzLlRPUElDKTsKKyAgICAgICAgVHJpZGVudFR1cGxlVG9LYWZrYU1hcHBlciBtYXBwZXIgPSBuZXcgRmllbGROYW1lQmFzZWRUdXBsZVRvS2Fma2FNYXBwZXIoImtleSIsICJtZXNzYWdlIik7CisgICAgICAgIEthZmthVG9waWNTZWxlY3RvciB0b3BpY1NlbGVjdG9yID0gbmV3IERlZmF1bHRUb3BpY1NlbGVjdG9yKFRlc3RVdGlscy5UT1BJQyk7CiAgICAgICAgIHN0YXRlID0gbmV3IFRyaWRlbnRLYWZrYVN0YXRlKCkKICAgICAgICAgICAgICAgICAud2l0aEthZmthVG9waWNTZWxlY3Rvcih0b3BpY1NlbGVjdG9yKQogICAgICAgICAgICAgICAgIC53aXRoVHJpZGVudFR1cGxlVG9LYWZrYU1hcHBlcihtYXBwZXIpOwotICAgICAgICBzdGF0ZS5wcmVwYXJlKGNvbmZpZyk7CisgICAgICAgIHN0YXRlLnByZXBhcmUoVGVzdFV0aWxzLmdldFByb2R1Y2VyUHJvcGVydGllcyhicm9rZXIuZ2V0QnJva2VyQ29ubmVjdGlvblN0cmluZygpKSk7CiAgICAgfQogCiAgICAgQFRlc3QKQEAgLTcxLDcgKzY2LDcgQEAKICAgICB9CiAKICAgICBwcml2YXRlIExpc3Q8VHJpZGVudFR1cGxlPiBnZW5lcmF0ZVR1cGxlQmF0Y2goU3RyaW5nIGtleSwgU3RyaW5nIG1lc3NhZ2UsIGludCBiYXRjaHNpemUpIHsKLSAgICAgICAgTGlzdDxUcmlkZW50VHVwbGU+IGJhdGNoID0gbmV3IEFycmF5TGlzdDxUcmlkZW50VHVwbGU+KCk7CisgICAgICAgIExpc3Q8VHJpZGVudFR1cGxlPiBiYXRjaCA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgICBmb3IoaW50IGkgPTAgOyBpIDwgYmF0Y2hzaXplOyBpKyspIHsKICAgICAgICAgICAgIGJhdGNoLmFkZChUcmlkZW50VHVwbGVWaWV3LmNyZWF0ZUZyZXNoVHVwbGUobmV3IEZpZWxkcygia2V5IiwgIm1lc3NhZ2UiKSwga2V5LCBtZXNzYWdlKSk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2V4dGVybmFsL3N0b3JtLWthZmthL3NyYy90ZXN0L3N0b3JtL2thZmthL1RyaWRlbnRLYWZrYVRvcG9sb2d5LmphdmEgYi9leHRlcm5hbC9zdG9ybS1rYWZrYS9zcmMvdGVzdC9zdG9ybS9rYWZrYS9UcmlkZW50S2Fma2FUb3BvbG9neS5qYXZhCmluZGV4IDljYjdiYmYuLmI5ZTI1ZTQgMTAwNjQ0Ci0tLSBhL2V4dGVybmFsL3N0b3JtLWthZmthL3NyYy90ZXN0L3N0b3JtL2thZmthL1RyaWRlbnRLYWZrYVRvcG9sb2d5LmphdmEKKysrIGIvZXh0ZXJuYWwvc3Rvcm0ta2Fma2Evc3JjL3Rlc3Qvc3Rvcm0va2Fma2EvVHJpZGVudEthZmthVG9wb2xvZ3kuamF2YQpAQCAtMjIsNyArMjIsNyBAQAogaW1wb3J0IGJhY2t0eXBlLnN0b3JtLmdlbmVyYXRlZC5TdG9ybVRvcG9sb2d5OwogaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnR1cGxlLkZpZWxkczsKIGltcG9ydCBiYWNrdHlwZS5zdG9ybS50dXBsZS5WYWx1ZXM7Ci1pbXBvcnQgc3Rvcm0ua2Fma2EudHJpZGVudC5UcmlkZW50S2Fma2FTdGF0ZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZU1hcDsKIGltcG9ydCBzdG9ybS5rYWZrYS50cmlkZW50LlRyaWRlbnRLYWZrYVN0YXRlRmFjdG9yeTsKIGltcG9ydCBzdG9ybS5rYWZrYS50cmlkZW50LlRyaWRlbnRLYWZrYVVwZGF0ZXI7CiBpbXBvcnQgc3Rvcm0ua2Fma2EudHJpZGVudC5tYXBwZXIuRmllbGROYW1lQmFzZWRUdXBsZVRvS2Fma2FNYXBwZXI7CkBAIC0zMSwxNCArMzEsMTEgQEAKIGltcG9ydCBzdG9ybS50cmlkZW50LlRyaWRlbnRUb3BvbG9neTsKIGltcG9ydCBzdG9ybS50cmlkZW50LnRlc3RpbmcuRml4ZWRCYXRjaFNwb3V0OwogCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKIAotCiBwdWJsaWMgY2xhc3MgVHJpZGVudEthZmthVG9wb2xvZ3kgewogCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3Rvcm1Ub3BvbG9neSBidWlsZFRvcG9sb2d5KCkgeworICAgIHByaXZhdGUgc3RhdGljIFN0b3JtVG9wb2xvZ3kgYnVpbGRUb3BvbG9neShTdHJpbmcgYnJva2VyQ29ubmVjdGlvblN0cmluZykgewogICAgICAgICBGaWVsZHMgZmllbGRzID0gbmV3IEZpZWxkcygid29yZCIsICJjb3VudCIpOwogICAgICAgICBGaXhlZEJhdGNoU3BvdXQgc3BvdXQgPSBuZXcgRml4ZWRCYXRjaFNwb3V0KGZpZWxkcywgNCwKICAgICAgICAgICAgICAgICBuZXcgVmFsdWVzKCJzdG9ybSIsICIxIiksCkBAIC01MSw5ICs0OCwxNiBAQAogICAgICAgICBUcmlkZW50VG9wb2xvZ3kgdG9wb2xvZ3kgPSBuZXcgVHJpZGVudFRvcG9sb2d5KCk7CiAgICAgICAgIFN0cmVhbSBzdHJlYW0gPSB0b3BvbG9neS5uZXdTdHJlYW0oInNwb3V0MSIsIHNwb3V0KTsKIAorICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgcHJvcHMucHV0KCJib290c3RyYXAuc2VydmVycyIsIGJyb2tlckNvbm5lY3Rpb25TdHJpbmcpOworICAgICAgICBwcm9wcy5wdXQoImFja3MiLCAiMSIpOworICAgICAgICBwcm9wcy5wdXQoImtleS5zZXJpYWxpemVyIiwgIm9yZy5hcGFjaGUua2Fma2EuY29tbW9uLnNlcmlhbGl6YXRpb24uU3RyaW5nU2VyaWFsaXplciIpOworICAgICAgICBwcm9wcy5wdXQoInZhbHVlLnNlcmlhbGl6ZXIiLCAib3JnLmFwYWNoZS5rYWZrYS5jb21tb24uc2VyaWFsaXphdGlvbi5TdHJpbmdTZXJpYWxpemVyIik7CisKICAgICAgICAgVHJpZGVudEthZmthU3RhdGVGYWN0b3J5IHN0YXRlRmFjdG9yeSA9IG5ldyBUcmlkZW50S2Fma2FTdGF0ZUZhY3RvcnkoKQotICAgICAgICAgICAgICAgIC53aXRoS2Fma2FUb3BpY1NlbGVjdG9yKG5ldyBEZWZhdWx0VG9waWNTZWxlY3RvcigidGVzdCIpKQotICAgICAgICAgICAgICAgIC53aXRoVHJpZGVudFR1cGxlVG9LYWZrYU1hcHBlcihuZXcgRmllbGROYW1lQmFzZWRUdXBsZVRvS2Fma2FNYXBwZXIoIndvcmQiLCAiY291bnQiKSk7CisgICAgICAgICAgICAud2l0aFByb2R1Y2VyUHJvcGVydGllcyhwcm9wcykKKyAgICAgICAgICAgIC53aXRoS2Fma2FUb3BpY1NlbGVjdG9yKG5ldyBEZWZhdWx0VG9waWNTZWxlY3RvcigidGVzdCIpKQorICAgICAgICAgICAgLndpdGhUcmlkZW50VHVwbGVUb0thZmthTWFwcGVyKG5ldyBGaWVsZE5hbWVCYXNlZFR1cGxlVG9LYWZrYU1hcHBlcigid29yZCIsICJjb3VudCIpKTsKICAgICAgICAgc3RyZWFtLnBhcnRpdGlvblBlcnNpc3Qoc3RhdGVGYWN0b3J5LCBmaWVsZHMsIG5ldyBUcmlkZW50S2Fma2FVcGRhdGVyKCksIG5ldyBGaWVsZHMoKSk7CiAKICAgICAgICAgcmV0dXJuIHRvcG9sb2d5LmJ1aWxkKCk7CkBAIC03NywyNCArODEsMTEgQEAKICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUGxlYXNlIHByb3ZpZGUga2Fma2EgYnJva2VyIHVybCAsZS5nLiBsb2NhbGhvc3Q6OTA5MiIpOwogICAgICAgICB9CiAKLSAgICAgICAgQ29uZmlnIGNvbmYgPSBnZXRDb25maWcoYXJnc1swXSk7CiAgICAgICAgIExvY2FsQ2x1c3RlciBjbHVzdGVyID0gbmV3IExvY2FsQ2x1c3RlcigpOwotICAgICAgICBjbHVzdGVyLnN1Ym1pdFRvcG9sb2d5KCJ3b3JkQ291bnRlciIsIGNvbmYsIGJ1aWxkVG9wb2xvZ3koKSk7CisgICAgICAgIGNsdXN0ZXIuc3VibWl0VG9wb2xvZ3koIndvcmRDb3VudGVyIiwgbmV3IENvbmZpZygpLCBidWlsZFRvcG9sb2d5KGFyZ3NbMF0pKTsKICAgICAgICAgVGhyZWFkLnNsZWVwKDYwICogMTAwMCk7CiAgICAgICAgIGNsdXN0ZXIua2lsbFRvcG9sb2d5KCJ3b3JkQ291bnRlciIpOwogCiAgICAgICAgIGNsdXN0ZXIuc2h1dGRvd24oKTsKICAgICB9Ci0KLSAgICBwcml2YXRlICBzdGF0aWMgQ29uZmlnIGdldENvbmZpZyhTdHJpbmcgYnJva2VyQ29ubmVjdGlvblN0cmluZykgewotICAgICAgICBDb25maWcgY29uZiA9IG5ldyBDb25maWcoKTsKLSAgICAgICAgTWFwIGNvbmZpZyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwotICAgICAgICBwcm9wcy5wdXQoIm1ldGFkYXRhLmJyb2tlci5saXN0IiwgYnJva2VyQ29ubmVjdGlvblN0cmluZyk7Ci0gICAgICAgIHByb3BzLnB1dCgicmVxdWVzdC5yZXF1aXJlZC5hY2tzIiwgIjEiKTsKLSAgICAgICAgcHJvcHMucHV0KCJzZXJpYWxpemVyLmNsYXNzIiwgImthZmthLnNlcmlhbGl6ZXIuU3RyaW5nRW5jb2RlciIpOwotICAgICAgICBjb25mLnB1dChUcmlkZW50S2Fma2FTdGF0ZS5LQUZLQV9CUk9LRVJfUFJPUEVSVElFUywgcHJvcHMpOwotICAgICAgICByZXR1cm4gY29uZjsKLSAgICB9Ci0KIH0KZGlmZiAtLWdpdCBhL2V4dGVybmFsL3N0b3JtLWthZmthL3NyYy90ZXN0L3N0b3JtL2thZmthL1prQ29vcmRpbmF0b3JUZXN0LmphdmEgYi9leHRlcm5hbC9zdG9ybS1rYWZrYS9zcmMvdGVzdC9zdG9ybS9rYWZrYS9aa0Nvb3JkaW5hdG9yVGVzdC5qYXZhCmluZGV4IDMyNTllZWEuLjQ4Y2E2MGYgMTAwNjQ0Ci0tLSBhL2V4dGVybmFsL3N0b3JtLWthZmthL3NyYy90ZXN0L3N0b3JtL2thZmthL1prQ29vcmRpbmF0b3JUZXN0LmphdmEKKysrIGIvZXh0ZXJuYWwvc3Rvcm0ta2Fma2Evc3JjL3Rlc3Qvc3Rvcm0va2Fma2EvWmtDb29yZGluYXRvclRlc3QuamF2YQpAQCAtNjEsNyArNjEsNyBAQAogICAgICAgICBNYXAgY29uZiA9IGJ1aWxkWm9va2VlcGVyQ29uZmlnKHNlcnZlcik7CiAgICAgICAgIHN0YXRlID0gbmV3IFprU3RhdGUoY29uZik7CiAgICAgICAgIHNpbXBsZUNvbnN1bWVyID0gbmV3IFNpbXBsZUNvbnN1bWVyKCJsb2NhbGhvc3QiLCBicm9rZXIuZ2V0UG9ydCgpLCA2MDAwMCwgMTAyNCwgInRlc3RDbGllbnQiKTsKLSAgICAgICAgd2hlbihkeW5hbWljUGFydGl0aW9uQ29ubmVjdGlvbnMucmVnaXN0ZXIoYW55KEJyb2tlci5jbGFzcyksIGFueUludCgpKSkudGhlblJldHVybihzaW1wbGVDb25zdW1lcik7CisgICAgICAgIHdoZW4oZHluYW1pY1BhcnRpdGlvbkNvbm5lY3Rpb25zLnJlZ2lzdGVyKGFueShCcm9rZXIuY2xhc3MpLCBhbnkoU3RyaW5nLmNsYXNzKSAsYW55SW50KCkpKS50aGVuUmV0dXJuKHNpbXBsZUNvbnN1bWVyKTsKICAgICB9CiAKICAgICBwcml2YXRlIE1hcCBidWlsZFpvb2tlZXBlckNvbmZpZyhUZXN0aW5nU2VydmVyIHNlcnZlcikgewpAQCAtODcsNyArODcsNyBAQAogICAgICAgICBpbnQgdG90YWxUYXNrcyA9IDY0OwogICAgICAgICBpbnQgcGFydGl0aW9uc1BlclRhc2sgPSAxOwogICAgICAgICBMaXN0PFprQ29vcmRpbmF0b3I+IGNvb3JkaW5hdG9yTGlzdCA9IGJ1aWxkQ29vcmRpbmF0b3JzKHRvdGFsVGFza3MgLyBwYXJ0aXRpb25zUGVyVGFzayk7Ci0gICAgICAgIHdoZW4ocmVhZGVyLmdldEJyb2tlckluZm8oKSkudGhlblJldHVybihUZXN0VXRpbHMuYnVpbGRQYXJ0aXRpb25JbmZvKHRvdGFsVGFza3MpKTsKKyAgICAgICAgd2hlbihyZWFkZXIuZ2V0QnJva2VySW5mbygpKS50aGVuUmV0dXJuKFRlc3RVdGlscy5idWlsZFBhcnRpdGlvbkluZm9MaXN0KFRlc3RVdGlscy5idWlsZFBhcnRpdGlvbkluZm8odG90YWxUYXNrcykpKTsKICAgICAgICAgZm9yIChaa0Nvb3JkaW5hdG9yIGNvb3JkaW5hdG9yIDogY29vcmRpbmF0b3JMaXN0KSB7CiAgICAgICAgICAgICBMaXN0PFBhcnRpdGlvbk1hbmFnZXI+IG15TWFuYWdlZFBhcnRpdGlvbnMgPSBjb29yZGluYXRvci5nZXRNeU1hbmFnZWRQYXJ0aXRpb25zKCk7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMocGFydGl0aW9uc1BlclRhc2ssIG15TWFuYWdlZFBhcnRpdGlvbnMuc2l6ZSgpKTsKQEAgLTEwMSwxMCArMTAxLDEwIEBACiAgICAgICAgIGZpbmFsIGludCB0b3RhbFRhc2tzID0gNjQ7CiAgICAgICAgIGludCBwYXJ0aXRpb25zUGVyVGFzayA9IDI7CiAgICAgICAgIExpc3Q8WmtDb29yZGluYXRvcj4gY29vcmRpbmF0b3JMaXN0ID0gYnVpbGRDb29yZGluYXRvcnModG90YWxUYXNrcyAvIHBhcnRpdGlvbnNQZXJUYXNrKTsKLSAgICAgICAgd2hlbihyZWFkZXIuZ2V0QnJva2VySW5mbygpKS50aGVuUmV0dXJuKFRlc3RVdGlscy5idWlsZFBhcnRpdGlvbkluZm8odG90YWxUYXNrcywgOTA5MikpOworICAgICAgICB3aGVuKHJlYWRlci5nZXRCcm9rZXJJbmZvKCkpLnRoZW5SZXR1cm4oVGVzdFV0aWxzLmJ1aWxkUGFydGl0aW9uSW5mb0xpc3QoVGVzdFV0aWxzLmJ1aWxkUGFydGl0aW9uSW5mbyh0b3RhbFRhc2tzLCA5MDkyKSkpOwogICAgICAgICBMaXN0PExpc3Q8UGFydGl0aW9uTWFuYWdlcj4+IHBhcnRpdGlvbk1hbmFnZXJzQmVmb3JlUmVmcmVzaCA9IGdldFBhcnRpdGlvbk1hbmFnZXJzKGNvb3JkaW5hdG9yTGlzdCk7CiAgICAgICAgIHdhaXRGb3JSZWZyZXNoKCk7Ci0gICAgICAgIHdoZW4ocmVhZGVyLmdldEJyb2tlckluZm8oKSkudGhlblJldHVybihUZXN0VXRpbHMuYnVpbGRQYXJ0aXRpb25JbmZvKHRvdGFsVGFza3MsIDkwOTMpKTsKKyAgICAgICAgd2hlbihyZWFkZXIuZ2V0QnJva2VySW5mbygpKS50aGVuUmV0dXJuKFRlc3RVdGlscy5idWlsZFBhcnRpdGlvbkluZm9MaXN0KFRlc3RVdGlscy5idWlsZFBhcnRpdGlvbkluZm8odG90YWxUYXNrcywgOTA5MykpKTsKICAgICAgICAgTGlzdDxMaXN0PFBhcnRpdGlvbk1hbmFnZXI+PiBwYXJ0aXRpb25NYW5hZ2Vyc0FmdGVyUmVmcmVzaCA9IGdldFBhcnRpdGlvbk1hbmFnZXJzKGNvb3JkaW5hdG9yTGlzdCk7CiAgICAgICAgIGFzc2VydEVxdWFscyhwYXJ0aXRpb25NYW5hZ2Vyc0FmdGVyUmVmcmVzaC5zaXplKCksIHBhcnRpdGlvbk1hbmFnZXJzQWZ0ZXJSZWZyZXNoLnNpemUoKSk7CiAgICAgICAgIEl0ZXJhdG9yPExpc3Q8UGFydGl0aW9uTWFuYWdlcj4+IGl0ZXJhdG9yID0gcGFydGl0aW9uTWFuYWdlcnNBZnRlclJlZnJlc2guaXRlcmF0b3IoKTsKZGlmZiAtLWdpdCBhL2V4dGVybmFsL3N0b3JtLWthZmthL3NyYy90ZXN0L3N0b3JtL2thZmthL2JvbHQvS2Fma2FCb2x0VGVzdC5qYXZhIGIvZXh0ZXJuYWwvc3Rvcm0ta2Fma2Evc3JjL3Rlc3Qvc3Rvcm0va2Fma2EvYm9sdC9LYWZrYUJvbHRUZXN0LmphdmEKaW5kZXggNTNkN2M1MC4uODdkYWFiMCAxMDA2NDQKLS0tIGEvZXh0ZXJuYWwvc3Rvcm0ta2Fma2Evc3JjL3Rlc3Qvc3Rvcm0va2Fma2EvYm9sdC9LYWZrYUJvbHRUZXN0LmphdmEKKysrIGIvZXh0ZXJuYWwvc3Rvcm0ta2Fma2Evc3JjL3Rlc3Qvc3Rvcm0va2Fma2EvYm9sdC9LYWZrYUJvbHRUZXN0LmphdmEKQEAgLTc5LDcgKzc5LDcgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgc2V0dXBLYWZrYUNvbnN1bWVyKCkgewotICAgICAgICBHbG9iYWxQYXJ0aXRpb25JbmZvcm1hdGlvbiBnbG9iYWxQYXJ0aXRpb25JbmZvcm1hdGlvbiA9IG5ldyBHbG9iYWxQYXJ0aXRpb25JbmZvcm1hdGlvbigpOworICAgICAgICBHbG9iYWxQYXJ0aXRpb25JbmZvcm1hdGlvbiBnbG9iYWxQYXJ0aXRpb25JbmZvcm1hdGlvbiA9IG5ldyBHbG9iYWxQYXJ0aXRpb25JbmZvcm1hdGlvbihURVNUX1RPUElDKTsKICAgICAgICAgZ2xvYmFsUGFydGl0aW9uSW5mb3JtYXRpb24uYWRkUGFydGl0aW9uKDAsIEJyb2tlci5mcm9tU3RyaW5nKGJyb2tlci5nZXRCcm9rZXJDb25uZWN0aW9uU3RyaW5nKCkpKTsKICAgICAgICAgQnJva2VySG9zdHMgYnJva2VySG9zdHMgPSBuZXcgU3RhdGljSG9zdHMoZ2xvYmFsUGFydGl0aW9uSW5mb3JtYXRpb24pOwogICAgICAgICBrYWZrYUNvbmZpZyA9IG5ldyBLYWZrYUNvbmZpZyhicm9rZXJIb3N0cywgVEVTVF9UT1BJQyk7CkBAIC0xODMsMzEgKzE4MywyNyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgS2Fma2FCb2x0IGdlbmVyYXRlU3RyaW5nU2VyaWFsaXplckJvbHQoKSB7Ci0gICAgICAgIEthZmthQm9sdCBib2x0ID0gbmV3IEthZmthQm9sdCgpOwogICAgICAgICBQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICAgICAgcHJvcHMucHV0KCJyZXF1ZXN0LnJlcXVpcmVkLmFja3MiLCAiMSIpOwotICAgICAgICBwcm9wcy5wdXQoInNlcmlhbGl6ZXIuY2xhc3MiLCAia2Fma2Euc2VyaWFsaXplci5TdHJpbmdFbmNvZGVyIik7CisgICAgICAgIHByb3BzLnB1dCgiYWNrcyIsICIxIik7CiAgICAgICAgIHByb3BzLnB1dCgiYm9vdHN0cmFwLnNlcnZlcnMiLCBicm9rZXIuZ2V0QnJva2VyQ29ubmVjdGlvblN0cmluZygpKTsKICAgICAgICAgcHJvcHMucHV0KCJrZXkuc2VyaWFsaXplciIsICJvcmcuYXBhY2hlLmthZmthLmNvbW1vbi5zZXJpYWxpemF0aW9uLlN0cmluZ1NlcmlhbGl6ZXIiKTsKICAgICAgICAgcHJvcHMucHV0KCJ2YWx1ZS5zZXJpYWxpemVyIiwgIm9yZy5hcGFjaGUua2Fma2EuY29tbW9uLnNlcmlhbGl6YXRpb24uU3RyaW5nU2VyaWFsaXplciIpOwogICAgICAgICBwcm9wcy5wdXQoIm1ldGFkYXRhLmZldGNoLnRpbWVvdXQubXMiLCAxMDAwKTsKLSAgICAgICAgY29uZmlnLnB1dChLYWZrYUJvbHQuS0FGS0FfQlJPS0VSX1BST1BFUlRJRVMsIHByb3BzKTsKKyAgICAgICAgS2Fma2FCb2x0IGJvbHQgPSBuZXcgS2Fma2FCb2x0KCkud2l0aFByb2R1Y2VyUHJvcGVydGllcyhwcm9wcyk7CiAgICAgICAgIGJvbHQucHJlcGFyZShjb25maWcsIG51bGwsIG5ldyBPdXRwdXRDb2xsZWN0b3IoY29sbGVjdG9yKSk7CiAgICAgICAgIGJvbHQuc2V0QXN5bmMoZmFsc2UpOwogICAgICAgICByZXR1cm4gYm9sdDsKICAgICB9CiAKICAgICBwcml2YXRlIEthZmthQm9sdCBnZW5lcmF0ZURlZmF1bHRTZXJpYWxpemVyQm9sdChib29sZWFuIGFzeW5jLCBib29sZWFuIGZpcmVBbmRGb3JnZXQpIHsKLSAgICAgICAgS2Fma2FCb2x0IGJvbHQgPSBuZXcgS2Fma2FCb2x0KCk7CiAgICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwotICAgICAgICBwcm9wcy5wdXQoInJlcXVlc3QucmVxdWlyZWQuYWNrcyIsICIxIik7Ci0gICAgICAgIHByb3BzLnB1dCgic2VyaWFsaXplci5jbGFzcyIsICJrYWZrYS5zZXJpYWxpemVyLlN0cmluZ0VuY29kZXIiKTsKKyAgICAgICAgcHJvcHMucHV0KCJhY2tzIiwgIjEiKTsKICAgICAgICAgcHJvcHMucHV0KCJib290c3RyYXAuc2VydmVycyIsIGJyb2tlci5nZXRCcm9rZXJDb25uZWN0aW9uU3RyaW5nKCkpOwogICAgICAgICBwcm9wcy5wdXQoImtleS5zZXJpYWxpemVyIiwgIm9yZy5hcGFjaGUua2Fma2EuY29tbW9uLnNlcmlhbGl6YXRpb24uQnl0ZUFycmF5U2VyaWFsaXplciIpOwogICAgICAgICBwcm9wcy5wdXQoInZhbHVlLnNlcmlhbGl6ZXIiLCAib3JnLmFwYWNoZS5rYWZrYS5jb21tb24uc2VyaWFsaXphdGlvbi5CeXRlQXJyYXlTZXJpYWxpemVyIik7CiAgICAgICAgIHByb3BzLnB1dCgibWV0YWRhdGEuZmV0Y2gudGltZW91dC5tcyIsIDEwMDApOwogICAgICAgICBwcm9wcy5wdXQoImxpbmdlci5tcyIsIDApOwotICAgICAgICBjb25maWcucHV0KEthZmthQm9sdC5LQUZLQV9CUk9LRVJfUFJPUEVSVElFUywgcHJvcHMpOworICAgICAgICBLYWZrYUJvbHQgYm9sdCA9IG5ldyBLYWZrYUJvbHQoKS53aXRoUHJvZHVjZXJQcm9wZXJ0aWVzKHByb3BzKTsKICAgICAgICAgYm9sdC5wcmVwYXJlKGNvbmZpZywgbnVsbCwgbmV3IE91dHB1dENvbGxlY3Rvcihjb2xsZWN0b3IpKTsKICAgICAgICAgYm9sdC5zZXRBc3luYyhhc3luYyk7CiAgICAgICAgIGJvbHQuc2V0RmlyZUFuZEZvcmdldChmaXJlQW5kRm9yZ2V0KTsKQEAgLTIxNiw4ICsyMTIsNyBAQAogCiAgICAgcHJpdmF0ZSBLYWZrYUJvbHQgZGVmYXVsdFNlcmlhbGl6ZXJCb2x0V2l0aFNwZWNpZmllZFByb3BlcnRpZXMoYm9vbGVhbiBhc3luYywgYm9vbGVhbiBmaXJlQW5kRm9yZ2V0KSB7CiAgICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwotICAgICAgICBwcm9wcy5wdXQoInJlcXVlc3QucmVxdWlyZWQuYWNrcyIsICIxIik7Ci0gICAgICAgIHByb3BzLnB1dCgic2VyaWFsaXplci5jbGFzcyIsICJrYWZrYS5zZXJpYWxpemVyLlN0cmluZ0VuY29kZXIiKTsKKyAgICAgICAgcHJvcHMucHV0KCJhY2tzIiwgIjEiKTsKICAgICAgICAgcHJvcHMucHV0KCJib290c3RyYXAuc2VydmVycyIsIGJyb2tlci5nZXRCcm9rZXJDb25uZWN0aW9uU3RyaW5nKCkpOwogICAgICAgICBwcm9wcy5wdXQoImtleS5zZXJpYWxpemVyIiwgIm9yZy5hcGFjaGUua2Fma2EuY29tbW9uLnNlcmlhbGl6YXRpb24uQnl0ZUFycmF5U2VyaWFsaXplciIpOwogICAgICAgICBwcm9wcy5wdXQoInZhbHVlLnNlcmlhbGl6ZXIiLCAib3JnLmFwYWNoZS5rYWZrYS5jb21tb24uc2VyaWFsaXphdGlvbi5CeXRlQXJyYXlTZXJpYWxpemVyIik7CkBAIC0yNTIsNyArMjQ3LDcgQEAKICAgICBwcml2YXRlIGJvb2xlYW4gdmVyaWZ5TWVzc2FnZShTdHJpbmcga2V5LCBTdHJpbmcgbWVzc2FnZSkgewogICAgICAgICBsb25nIGxhc3RNZXNzYWdlT2Zmc2V0ID0gS2Fma2FVdGlscy5nZXRPZmZzZXQoc2ltcGxlQ29uc3VtZXIsIGthZmthQ29uZmlnLnRvcGljLCAwLCBPZmZzZXRSZXF1ZXN0LkxhdGVzdFRpbWUoKSkgLSAxOwogICAgICAgICBCeXRlQnVmZmVyTWVzc2FnZVNldCBtZXNzYWdlQW5kT2Zmc2V0cyA9IEthZmthVXRpbHMuZmV0Y2hNZXNzYWdlcyhrYWZrYUNvbmZpZywgc2ltcGxlQ29uc3VtZXIsCi0gICAgICAgICAgICAgICAgbmV3IFBhcnRpdGlvbihCcm9rZXIuZnJvbVN0cmluZyhicm9rZXIuZ2V0QnJva2VyQ29ubmVjdGlvblN0cmluZygpKSwgMCksIGxhc3RNZXNzYWdlT2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBuZXcgUGFydGl0aW9uKEJyb2tlci5mcm9tU3RyaW5nKGJyb2tlci5nZXRCcm9rZXJDb25uZWN0aW9uU3RyaW5nKCkpLGthZmthQ29uZmlnLnRvcGljLCAwKSwgbGFzdE1lc3NhZ2VPZmZzZXQpOwogICAgICAgICBNZXNzYWdlQW5kT2Zmc2V0IG1lc3NhZ2VBbmRPZmZzZXQgPSBtZXNzYWdlQW5kT2Zmc2V0cy5pdGVyYXRvcigpLm5leHQoKTsKICAgICAgICAgTWVzc2FnZSBrYWZrYU1lc3NhZ2UgPSBtZXNzYWdlQW5kT2Zmc2V0Lm1lc3NhZ2UoKTsKICAgICAgICAgQnl0ZUJ1ZmZlciBtZXNzYWdlS2V5QnVmZmVyID0ga2Fma2FNZXNzYWdlLmtleSgpOwpkaWZmIC0tZ2l0IGEvZXh0ZXJuYWwvc3Rvcm0tbWV0cmljcy9wb20ueG1sIGIvZXh0ZXJuYWwvc3Rvcm0tbWV0cmljcy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyZmEzZWMKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlcm5hbC9zdG9ybS1tZXRyaWNzL3BvbS54bWwKQEAgLTAsMCArMSwxMDcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorICA8cGFyZW50PgorICAgICAgPGFydGlmYWN0SWQ+c3Rvcm08L2FydGlmYWN0SWQ+CisgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnN0b3JtPC9ncm91cElkPgorICAgICAgPHZlcnNpb24+MC4xMS4wLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgPHJlbGF0aXZlUGF0aD4uLi8uLi9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+CisgIDwvcGFyZW50PgorCisgIDxncm91cElkPm9yZy5hcGFjaGUuc3Rvcm08L2dyb3VwSWQ+CisgIDxhcnRpZmFjdElkPnN0b3JtLW1ldHJpY3M8L2FydGlmYWN0SWQ+CisgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisKKyAgPG5hbWU+c3Rvcm0tbWV0cmljczwvbmFtZT4KKworICA8cHJvcGVydGllcz4KKyAgICA8IS0tIHNldHRpbmdzIGZvciBkb3dubG9hZGluZyB0aGUgc2lnYXIgbmF0aXZlIGJpbmFyeSBjb21wbGV0ZSBhcmNoaXZlLCB3aGljaCBpcyBub3QgYXZhaWxhYmxlIGluIE1hdmVuIGNlbnRyYWwtLT4KKyAgICA8c2lnYXIudmVyc2lvbj4xLjYuNDwvc2lnYXIudmVyc2lvbj4KKyAgICA8c2lnYXIuZG93bmxvYWQudXJsPmh0dHBzOi8vbWFnZWxhbi5nb29nbGVjb2RlLmNvbS9maWxlcy9oeXBlcmljLXNpZ2FyLSR7c2lnYXIudmVyc2lvbn0uemlwPC9zaWdhci5kb3dubG9hZC51cmw+CisgICAgPHNpZ2FyLlNIQTE+OGY3OWQ0MDM5Y2EzZWM2Yzg4MDM5ZDU4OTdhODBhMjY4MjEzZTZiNzwvc2lnYXIuU0hBMT4KKyAgICA8IS0tIHRoaXMgd2lsbCBkb3dubG9hZCB0aGUgc2lnYXIgWklQIHRvIHRoZSBsb2NhbCBtYXZlbiByZXBvc2l0b3J5IG5leHQgdG8gdGhlIHNpZ2FyIGRlcGVuZGVuY2llcywKKyAgICAgICAgIHNvIHdlIG9ubHkgZG93bmxvYWQgaXQgb25jZSAtLT4KKyAgICA8c2lnYXIuZG93bmxvYWQucGF0aD4ke3NldHRpbmdzLmxvY2FsUmVwb3NpdG9yeX0vb3JnL2Z1c2Vzb3VyY2Uvc2lnYXIvJHtzaWdhci52ZXJzaW9ufTwvc2lnYXIuZG93bmxvYWQucGF0aD4KKyAgPC9wcm9wZXJ0aWVzPgorCisgIDxkZXBlbmRlbmNpZXM+CisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD5vcmcuaGRyaGlzdG9ncmFtPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+SGRySGlzdG9ncmFtPC9hcnRpZmFjdElkPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5mdXNlc291cmNlPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+c2lnYXI8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4ke3NpZ2FyLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgPGV4Y2x1c2lvbnM+CisgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgPGdyb3VwSWQ+bG9nNGo8L2dyb3VwSWQ+CisgICAgICAgICAgPGFydGlmYWN0SWQ+bG9nNGo8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgPC9leGNsdXNpb25zPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuc3Rvcm08L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5zdG9ybS1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgPCEtLSBrZWVwIHN0b3JtIG91dCBvZiB0aGUgamFyLXdpdGgtZGVwZW5kZW5jaWVzIC0tPgorICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICA8L2RlcGVuZGVuY3k+CisgIDwvZGVwZW5kZW5jaWVzPgorICA8YnVpbGQ+CisgICAgPHBsdWdpbnM+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFudHJ1bi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjEuNjwvdmVyc2lvbj4KKyAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgIDxpZD5wcmVwYXJlPC9pZD4KKyAgICAgICAgICAgIDxwaGFzZT52YWxpZGF0ZTwvcGhhc2U+CisgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgPHRhc2tzPgorICAgICAgICAgICAgICAgIDxlY2hvIG1lc3NhZ2U9IkRvd25sb2FkaW5nIHNpZ2FyIG5hdGl2ZSBiaW5hcmllcy4uLiIvPgorICAgICAgICAgICAgICAgIDxnZXQgc3JjPSIke3NpZ2FyLmRvd25sb2FkLnVybH0iCisgICAgICAgICAgICAgICAgICAgICBkZXN0PSIke3NpZ2FyLmRvd25sb2FkLnBhdGh9LyIgc2tpcEV4aXN0aW5nPSJ0cnVlIi8+CisgICAgICAgICAgICAgICAgPGNoZWNrc3VtIGZpbGU9IiR7c2lnYXIuZG93bmxvYWQucGF0aH0vaHlwZXJpYy1zaWdhci0ke3NpZ2FyLnZlcnNpb259LnppcCIgYWxnb3JpdGhtPSJTSEExIgorICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eT0iJHtzaWdhci5TSEExfSIgdmVyaWZ5UHJvcGVydHk9InZhbGlkQ2hlY2tzdW0iLz4KKyAgICAgICAgICAgICAgICA8ZmFpbCBtZXNzYWdlPSJDaGVja3N1bSB2YWxpZGF0aW9uIGZhaWxlZCBmb3IgaHlwZXJpYy1zaWdhci0ke3NpZ2FyLnZlcnNpb259LnppcCI+CisgICAgICAgICAgICAgICAgICA8Y29uZGl0aW9uPgorICAgICAgICAgICAgICAgICAgICA8aXNmYWxzZSB2YWx1ZT0iJHt2YWxpZENoZWNrc3VtfSIvPgorICAgICAgICAgICAgICAgICAgPC9jb25kaXRpb24+CisgICAgICAgICAgICAgICAgPC9mYWlsPgorICAgICAgICAgICAgICAgIDx1bnppcCBzcmM9IiR7c2lnYXIuZG93bmxvYWQucGF0aH0vaHlwZXJpYy1zaWdhci0ke3NpZ2FyLnZlcnNpb259LnppcCIKKyAgICAgICAgICAgICAgICAgICAgICAgZGVzdD0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vY2xhc3Nlcy9yZXNvdXJjZXMiPgorICAgICAgICAgICAgICAgICAgPHBhdHRlcm5zZXQ+CisgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqL2xpYi9saWJzaWdhci0qIi8+CisgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9IioqL2xpYi9zaWdhci0qIi8+CisgICAgICAgICAgICAgICAgICA8L3BhdHRlcm5zZXQ+CisgICAgICAgICAgICAgICAgICA8bWFwcGVyIHR5cGU9ImZsYXR0ZW4iLz4KKyAgICAgICAgICAgICAgICA8L3VuemlwPgorICAgICAgICAgICAgICA8L3Rhc2tzPgorICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICA8Z29hbD5ydW48L2dvYWw+CisgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICA8L3BsdWdpbj4KKyAgICA8L3BsdWdpbnM+CisgIDwvYnVpbGQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9leHRlcm5hbC9zdG9ybS1tZXRyaWNzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdG9ybS9tZXRyaWNzL2hkcmhpc3RvZ3JhbS9IaXN0b2dyYW1NZXRyaWMuamF2YSBiL2V4dGVybmFsL3N0b3JtLW1ldHJpY3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0b3JtL21ldHJpY3MvaGRyaGlzdG9ncmFtL0hpc3RvZ3JhbU1ldHJpYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZGM1MDAKLS0tIC9kZXYvbnVsbAorKysgYi9leHRlcm5hbC9zdG9ybS1tZXRyaWNzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9zdG9ybS9tZXRyaWNzL2hkcmhpc3RvZ3JhbS9IaXN0b2dyYW1NZXRyaWMuamF2YQpAQCAtMCwwICsxLDc5IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnN0b3JtLm1ldHJpY3MuaGRyaGlzdG9ncmFtOworCitpbXBvcnQgYmFja3R5cGUuc3Rvcm0ubWV0cmljLmFwaS5JTWV0cmljOworaW1wb3J0IG9yZy5IZHJIaXN0b2dyYW0uSGlzdG9ncmFtOworCisvKioKKyAqIEEgbWV0cmljIHdyYXBwaW5nIGFuIEhkckhpc3RvZ3JhbS4KKyAqLworcHVibGljIGNsYXNzIEhpc3RvZ3JhbU1ldHJpYyBpbXBsZW1lbnRzIElNZXRyaWMgeworICAgIHByaXZhdGUgZmluYWwgSGlzdG9ncmFtIF9oaXN0bzsKKworCisgICAgcHVibGljIEhpc3RvZ3JhbU1ldHJpYyhmaW5hbCBpbnQgbnVtYmVyT2ZTaWduaWZpY2FudFZhbHVlRGlnaXRzKSB7CisgICAgICAgIHRoaXMobnVsbCwgbnVtYmVyT2ZTaWduaWZpY2FudFZhbHVlRGlnaXRzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSGlzdG9ncmFtTWV0cmljKExvbmcgaGlnaGVzdFRyYWNrYWJsZVZhbHVlLCBmaW5hbCBpbnQgbnVtYmVyT2ZTaWduaWZpY2FudFZhbHVlRGlnaXRzKSB7CisgICAgICAgIHRoaXMobnVsbCwgaGlnaGVzdFRyYWNrYWJsZVZhbHVlLCBudW1iZXJPZlNpZ25pZmljYW50VmFsdWVEaWdpdHMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIChGcm9tIHRoZSBDb25zdHJ1Y3RvciBvZiBIaXN0b2dyYW0pCisgICAgICogQ29uc3RydWN0IGEgSGlzdG9ncmFtIGdpdmVuIHRoZSBMb3dlc3QgYW5kIEhpZ2hlc3QgdmFsdWVzIHRvIGJlIHRyYWNrZWQgYW5kIGEgbnVtYmVyIG9mIHNpZ25pZmljYW50CisgICAgICogZGVjaW1hbCBkaWdpdHMuIFByb3ZpZGluZyBhIGxvd2VzdERpc2Nlcm5pYmxlVmFsdWUgaXMgdXNlZnVsIGlzIHNpdHVhdGlvbnMgd2hlcmUgdGhlIHVuaXRzIHVzZWQKKyAgICAgKiBmb3IgdGhlIGhpc3RvZ3JhbSdzIHZhbHVlcyBhcmUgbXVjaCBzbWFsbGVyIHRoYXQgdGhlIG1pbmltYWwgYWNjdXJhY3kgcmVxdWlyZWQuIEUuZy4gd2hlbiB0cmFja2luZworICAgICAqIHRpbWUgdmFsdWVzIHN0YXRlZCBpbiBuYW5vc2Vjb25kIHVuaXRzLCB3aGVyZSB0aGUgbWluaW1hbCBhY2N1cmFjeSByZXF1aXJlZCBpcyBhIG1pY3Jvc2Vjb25kLCB0aGUKKyAgICAgKiBwcm9wZXIgdmFsdWUgZm9yIGxvd2VzdERpc2Nlcm5pYmxlVmFsdWUgd291bGQgYmUgMTAwMC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsb3dlc3REaXNjZXJuaWJsZVZhbHVlICAgICAgICAgVGhlIGxvd2VzdCB2YWx1ZSB0aGF0IGNhbiBiZSBkaXNjZXJuZWQgKGRpc3Rpbmd1aXNoZWQgZnJvbSAwKSBieSB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpc3RvZ3JhbS4gTXVzdCBiZSBhIHBvc2l0aXZlIGludGVnZXIgdGhhdCBpcyB7QGxpdGVyYWwgPj19IDEuIE1heSBiZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWxseSByb3VuZGVkIGRvd24gdG8gbmVhcmVzdCBwb3dlciBvZiAyCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaWYgbnVsbCAxIGlzIHVzZWQpLgorICAgICAqIEBwYXJhbSBoaWdoZXN0VHJhY2thYmxlVmFsdWUgICAgICAgICAgVGhlIGhpZ2hlc3QgdmFsdWUgdG8gYmUgdHJhY2tlZCBieSB0aGUgaGlzdG9ncmFtLiBNdXN0IGJlIGEgcG9zaXRpdmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVnZXIgdGhhdCBpcyB7QGxpdGVyYWwgPj19ICgyICogbG93ZXN0RGlzY2VybmlibGVWYWx1ZSkuCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaWYgbnVsbCAyICogbG93ZXN0RGlzY2VybmlibGVWYWx1ZSBpcyB1c2VkIGFuZCBhdXRvLXJlc2l6ZSBpcyBlbmFibGVkKQorICAgICAqIEBwYXJhbSBudW1iZXJPZlNpZ25pZmljYW50VmFsdWVEaWdpdHMgU3BlY2lmaWVzIHRoZSBwcmVjaXNpb24gdG8gdXNlLiBUaGlzIGlzIHRoZSBudW1iZXIgb2Ygc2lnbmlmaWNhbnQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2ltYWwgZGlnaXRzIHRvIHdoaWNoIHRoZSBoaXN0b2dyYW0gd2lsbCBtYWludGFpbiB2YWx1ZSByZXNvbHV0aW9uCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgc2VwYXJhdGlvbi4gTXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIGJldHdlZW4gMCBhbmQgNS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSGlzdG9ncmFtTWV0cmljKExvbmcgbG93ZXN0RGlzY2VybmlibGVWYWx1ZSwgTG9uZyBoaWdoZXN0VHJhY2thYmxlVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbnVtYmVyT2ZTaWduaWZpY2FudFZhbHVlRGlnaXRzKSB7CisgICAgICAgIGJvb2xlYW4gYXV0b1Jlc2l6ZSA9IGZhbHNlOworICAgICAgICBpZiAobG93ZXN0RGlzY2VybmlibGVWYWx1ZSA9PSBudWxsKSBsb3dlc3REaXNjZXJuaWJsZVZhbHVlID0gMUw7CisgICAgICAgIGlmIChoaWdoZXN0VHJhY2thYmxlVmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgaGlnaGVzdFRyYWNrYWJsZVZhbHVlID0gMiAqIGxvd2VzdERpc2Nlcm5pYmxlVmFsdWU7CisgICAgICAgICAgICBhdXRvUmVzaXplID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBfaGlzdG8gPSBuZXcgSGlzdG9ncmFtKGxvd2VzdERpc2Nlcm5pYmxlVmFsdWUsIGhpZ2hlc3RUcmFja2FibGVWYWx1ZSwgbnVtYmVyT2ZTaWduaWZpY2FudFZhbHVlRGlnaXRzKTsKKyAgICAgICAgaWYgKGF1dG9SZXNpemUpIF9oaXN0by5zZXRBdXRvUmVzaXplKHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlY29yZFZhbHVlKGxvbmcgdmFsKSB7CisgICAgICAgIF9oaXN0by5yZWNvcmRWYWx1ZSh2YWwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWVBbmRSZXNldCgpIHsKKyAgICAgICAgICBIaXN0b2dyYW0gY29weSA9IF9oaXN0by5jb3B5KCk7CisgICAgICAgICAgX2hpc3RvLnJlc2V0KCk7CisgICAgICAgICAgcmV0dXJuIGNvcHk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXh0ZXJuYWwvc3Rvcm0tbWV0cmljcy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvc3Rvcm0vbWV0cmljcy9zaWdhci9DUFVNZXRyaWMuamF2YSBiL2V4dGVybmFsL3N0b3JtLW1ldHJpY3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0b3JtL21ldHJpY3Mvc2lnYXIvQ1BVTWV0cmljLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNhZGRjOQotLS0gL2Rldi9udWxsCisrKyBiL2V4dGVybmFsL3N0b3JtLW1ldHJpY3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3N0b3JtL21ldHJpY3Mvc2lnYXIvQ1BVTWV0cmljLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5zdG9ybS5tZXRyaWNzLnNpZ2FyOworCitpbXBvcnQgb3JnLmh5cGVyaWMuc2lnYXIuU2lnYXI7CitpbXBvcnQgb3JnLmh5cGVyaWMuc2lnYXIuUHJvY0NwdTsKKworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLm1ldHJpYy5hcGkuSU1ldHJpYzsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCisvKioKKyAqIEEgbWV0cmljIHVzaW5nIFNpZ2FyIHRvIGdldCBVc2VyIGFuZCBTeXN0ZW0gQ1BVIHV0aWxpemF0aW9uIGZvciBhIHdvcmtlci4KKyAqLworcHVibGljIGNsYXNzIENQVU1ldHJpYyBpbXBsZW1lbnRzIElNZXRyaWMgeworICAgIHByaXZhdGUgbG9uZyBfcHJldlVzZXIgPSAwOworICAgIHByaXZhdGUgbG9uZyBfcHJldlN5cyA9IDA7CisgICAgcHJpdmF0ZSBmaW5hbCBTaWdhciBfc2lnYXI7CisgICAgcHJpdmF0ZSBmaW5hbCBsb25nIF9waWQ7CisKKyAgICBwdWJsaWMgQ1BVTWV0cmljKCkgeworICAgICAgICBfc2lnYXIgPSBuZXcgU2lnYXIoKTsKKyAgICAgICAgX3BpZCA9IF9zaWdhci5nZXRQaWQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlQW5kUmVzZXQoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgUHJvY0NwdSBjcHUgPSBfc2lnYXIuZ2V0UHJvY0NwdShfcGlkKTsKKyAgICAgICAgICBsb25nIHVzZXJUb3RhbCA9IGNwdS5nZXRVc2VyKCk7CisgICAgICAgICAgbG9uZyBzeXNUb3RhbCA9IGNwdS5nZXRTeXMoKTsKKyAgICAgICAgICBsb25nIHVzZXIgPSB1c2VyVG90YWwgLSBfcHJldlVzZXI7CisgICAgICAgICAgbG9uZyBzeXMgPSBzeXNUb3RhbCAtIF9wcmV2U3lzOworICAgICAgICAgIF9wcmV2VXNlciA9IHVzZXJUb3RhbDsKKyAgICAgICAgICBfcHJldlN5cyA9IHN5c1RvdGFsOworCisgICAgICAgICAgSGFzaE1hcDxTdHJpbmcsIExvbmc+IHJldCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTG9uZz4oKTsKKyAgICAgICAgICByZXQucHV0KCJ1c2VyLW1zIiwgdXNlcik7CisgICAgICAgICAgcmV0LnB1dCgic3lzLW1zIiwgc3lzKTsKKyAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leHRlcm5hbC9zdG9ybS1zb2xyL3BvbS54bWwgYi9leHRlcm5hbC9zdG9ybS1zb2xyL3BvbS54bWwKaW5kZXggMmI1Yzc0Mi4uZDViNzYyMiAxMDA2NDQKLS0tIGEvZXh0ZXJuYWwvc3Rvcm0tc29sci9wb20ueG1sCisrKyBiL2V4dGVybmFsL3N0b3JtLXNvbHIvcG9tLnhtbApAQCAtMSw0ICsxLDIxIEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLS8qKgorICAgICAgICAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAgICAgICAgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAgICAgICAgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICAgICAgICAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAgICAgICAgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgICAgICAgICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICAgICAgICAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAgICAgICAgKgorICAgICAgICAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICAgICAgICAqCisgICAgICAgICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICAgICAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgICAgICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgICAgICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICAgICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICAgICAgICAqLy0tPgogPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKICAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCiAgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KQEAgLTIxLDcgKzM4LDcgQEAKICAgICA8L2RldmVsb3BlcnM+CiAKICAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICA8ZGVwZW5kZW5jeT4KICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuc3Rvcm08L2dyb3VwSWQ+CiAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zdG9ybS1jb3JlPC9hcnRpZmFjdElkPgogICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgpAQCAtOTUsNCArMTEyLDQgQEAKICAgICAgICAgICAgIDwvcGx1Z2luPgogICAgICAgICA8L3BsdWdpbnM+CiAgICAgPC9idWlsZD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9sb2c0ajIvY2x1c3Rlci54bWwgYi9sb2c0ajIvY2x1c3Rlci54bWwKaW5kZXggYmI5NjY0Ni4uZjM0OWQ4YyAxMDA2NDQKLS0tIGEvbG9nNGoyL2NsdXN0ZXIueG1sCisrKyBiL2xvZzRqMi9jbHVzdGVyLnhtbApAQCAtMTksMTIgKzE5LDEyIEBACiA8Y29uZmlndXJhdGlvbiBtb25pdG9ySW50ZXJ2YWw9IjYwIj4KIDxwcm9wZXJ0aWVzPgogICAgIDxwcm9wZXJ0eSBuYW1lPSJwYXR0ZXJuIj4lZHt5eXl5LU1NLWRkIEhIOm1tOnNzLlNTU30gJWN7MS59IFslcF0gJW1zZyVuPC9wcm9wZXJ0eT4KLSAgICA8cHJvcGVydHkgbmFtZT0icGF0dGVybk1ldHJpcyI+JWQgJS04ciAlbSVuPC9wcm9wZXJ0eT4KKyAgICA8cHJvcGVydHkgbmFtZT0icGF0dGVybk1ldHJpY3MiPiVkICUtOHIgJW0lbjwvcHJvcGVydHk+CiA8L3Byb3BlcnRpZXM+CiA8YXBwZW5kZXJzPgotICAgIDxSb2xsaW5nRmlsZSBuYW1lPSJBMSIKKyAgICA8Um9sbGluZ0ZpbGUgbmFtZT0iQTEiIGltbWVkaWF0ZUZsdXNoPSJmYWxzZSIKICAgICAgICAgICAgICAgICAgZmlsZU5hbWU9IiR7c3lzOnN0b3JtLmxvZy5kaXJ9LyR7c3lzOmxvZ2ZpbGUubmFtZX0iCi0gICAgICAgICAgICAgICAgIGZpbGVQYXR0ZXJuPSIke3N5czpzdG9ybS5sb2cuZGlyfS8ke3N5czpsb2dmaWxlLm5hbWV9LiVpIj4KKyAgICAgICAgICAgICAgICAgZmlsZVBhdHRlcm49IiR7c3lzOnN0b3JtLmxvZy5kaXJ9LyR7c3lzOmxvZ2ZpbGUubmFtZX0uJWkuZ3oiPgogICAgICAgICA8UGF0dGVybkxheW91dD4KICAgICAgICAgICAgIDxwYXR0ZXJuPiR7cGF0dGVybn08L3BhdHRlcm4+CiAgICAgICAgIDwvUGF0dGVybkxheW91dD4KQEAgLTMzLDkgKzMzLDkgQEAKICAgICAgICAgPC9Qb2xpY2llcz4KICAgICAgICAgPERlZmF1bHRSb2xsb3ZlclN0cmF0ZWd5IG1heD0iOSIvPgogICAgIDwvUm9sbGluZ0ZpbGU+Ci0gICAgPFJvbGxpbmdGaWxlIG5hbWU9IkFDQ0VTUyIKLSAgICAgICAgICAgICAgICAgZmlsZU5hbWU9IiR7c3lzOnN0b3JtLmxvZy5kaXJ9L2FjY2Vzcy5sb2ciCi0gICAgICAgICAgICAgICAgIGZpbGVQYXR0ZXJuPSIke3N5czpzdG9ybS5sb2cuZGlyfS9hY2Nlc3MubG9nLiVpIj4KKyAgICA8Um9sbGluZ0ZpbGUgbmFtZT0iV0VCLUFDQ0VTUyIgaW1tZWRpYXRlRmx1c2g9ImZhbHNlIgorICAgICAgICAgICAgICAgICBmaWxlTmFtZT0iJHtzeXM6c3Rvcm0ubG9nLmRpcn0vYWNjZXNzLXdlYi0ke3N5czpkYWVtb24ubmFtZX0ubG9nIgorICAgICAgICAgICAgICAgICBmaWxlUGF0dGVybj0iJHtzeXM6c3Rvcm0ubG9nLmRpcn0vYWNjZXNzLXdlYi0ke3N5czpkYWVtb24ubmFtZX0ubG9nLiVpLmd6Ij4KICAgICAgICAgPFBhdHRlcm5MYXlvdXQ+CiAgICAgICAgICAgICA8cGF0dGVybj4ke3BhdHRlcm59PC9wYXR0ZXJuPgogICAgICAgICA8L1BhdHRlcm5MYXlvdXQ+CkBAIC00NCwyNiArNDQsNDIgQEAKICAgICAgICAgPC9Qb2xpY2llcz4KICAgICAgICAgPERlZmF1bHRSb2xsb3ZlclN0cmF0ZWd5IG1heD0iOSIvPgogICAgIDwvUm9sbGluZ0ZpbGU+Ci0gICAgPFJvbGxpbmdGaWxlIG5hbWU9Ik1FVFJJQ1MiCisgICAgPFJvbGxpbmdGaWxlIG5hbWU9IlRIUklGVC1BQ0NFU1MiIGltbWVkaWF0ZUZsdXNoPSJmYWxzZSIKKyAgICAgICAgICAgICAgICAgZmlsZU5hbWU9IiR7c3lzOnN0b3JtLmxvZy5kaXJ9L2FjY2Vzcy0ke3N5czpsb2dmaWxlLm5hbWV9IgorICAgICAgICAgICAgICAgICBmaWxlUGF0dGVybj0iJHtzeXM6c3Rvcm0ubG9nLmRpcn0vYWNjZXNzLSR7c3lzOmxvZ2ZpbGUubmFtZX0uJWkuZ3oiPgorICAgIDxQYXR0ZXJuTGF5b3V0PgorICAgICAgICA8cGF0dGVybj4ke3BhdHRlcm59PC9wYXR0ZXJuPgorICAgIDwvUGF0dGVybkxheW91dD4KKyAgICAgICAgPFBvbGljaWVzPgorICAgICAgICAgICAgPFNpemVCYXNlZFRyaWdnZXJpbmdQb2xpY3kgc2l6ZT0iMTAwIE1CIi8+IDwhLS0gT3IgZXZlcnkgMTAwIE1CIC0tPgorICAgICAgICA8L1BvbGljaWVzPgorICAgICAgICA8RGVmYXVsdFJvbGxvdmVyU3RyYXRlZ3kgbWF4PSI5Ii8+CisgICAgPC9Sb2xsaW5nRmlsZT4KKyAgICA8Um9sbGluZ0ZpbGUgbmFtZT0iTUVUUklDUyIgaW1tZWRpYXRlRmx1c2g9ImZhbHNlIgogICAgICAgICAgICAgICAgICBmaWxlTmFtZT0iJHtzeXM6c3Rvcm0ubG9nLmRpcn0vbWV0cmljcy5sb2ciCi0gICAgICAgICAgICAgICAgIGZpbGVQYXR0ZXJuPSIke3N5czpzdG9ybS5sb2cuZGlyfS9tZXRyaWNzLmxvZy4laSI+CisgICAgICAgICAgICAgICAgIGZpbGVQYXR0ZXJuPSIke3N5czpzdG9ybS5sb2cuZGlyfS9tZXRyaWNzLmxvZy4laS5neiI+CiAgICAgICAgIDxQYXR0ZXJuTGF5b3V0PgotICAgICAgICAgICAgPHBhdHRlcm4+JHtwYXR0ZXJuTWV0cmlzfTwvcGF0dGVybj4KKyAgICAgICAgICAgIDxwYXR0ZXJuPiR7cGF0dGVybk1ldHJpY3N9PC9wYXR0ZXJuPgogICAgICAgICA8L1BhdHRlcm5MYXlvdXQ+CiAgICAgICAgIDxQb2xpY2llcz4KICAgICAgICAgICAgIDxTaXplQmFzZWRUcmlnZ2VyaW5nUG9saWN5IHNpemU9IjIgTUIiLz4gPCEtLSBPciBldmVyeSAxMDAgTUIgLS0+CiAgICAgICAgIDwvUG9saWNpZXM+CiAgICAgICAgIDxEZWZhdWx0Um9sbG92ZXJTdHJhdGVneSBtYXg9IjkiLz4KICAgICA8L1JvbGxpbmdGaWxlPgotICAgIDxTeXNsb2cgbmFtZT0ic3lzbG9nIiBmb3JtYXQ9IlJGQzU0MjQiIGhvc3Q9ImxvY2FsaG9zdCIgcG9ydD0iNTE0IgorICAgIDxTeXNsb2cgbmFtZT0ic3lzbG9nIiBmb3JtYXQ9IlJGQzU0MjQiIGNoYXJzZXQ9IlVURi04IiBob3N0PSJsb2NhbGhvc3QiIHBvcnQ9IjUxNCIKICAgICAgICAgICAgIHByb3RvY29sPSJVRFAiIGFwcE5hbWU9Ilske3N5czpkYWVtb24ubmFtZX1dIiBtZGNJZD0ibWRjIiBpbmNsdWRlTURDPSJ0cnVlIgogICAgICAgICAgICAgZmFjaWxpdHk9IkxPQ0FMNSIgZW50ZXJwcmlzZU51bWJlcj0iMTgwNjAiIG5ld0xpbmU9InRydWUiIGV4Y2VwdGlvblBhdHRlcm49IiVyRXh7ZnVsbH0iCi0gICAgICAgICAgICBtZXNzYWdlSWQ9Ilske3N5czp1c2VyLm5hbWV9OlMwXSIgaWQ9InN0b3JtIi8+CisgICAgICAgICAgICBtZXNzYWdlSWQ9Ilske3N5czp1c2VyLm5hbWV9OlMwXSIgaWQ9InN0b3JtIiBpbW1lZGlhdGVGbHVzaD0iZmFsc2UiIGltbWVkaWF0ZUZhaWw9InRydWUiLz4KIDwvYXBwZW5kZXJzPgogPGxvZ2dlcnM+CiAKLSAgICA8TG9nZ2VyIG5hbWU9ImJhY2t0eXBlLnN0b3JtLnNlY3VyaXR5LmF1dGguYXV0aG9yaXplciIgbGV2ZWw9ImluZm8iPgotICAgICAgICA8QXBwZW5kZXJSZWYgcmVmPSJBQ0NFU1MiLz4KKyAgICA8TG9nZ2VyIG5hbWU9ImJhY2t0eXBlLnN0b3JtLmxvZ2dpbmcuZmlsdGVycy5BY2Nlc3NMb2dnaW5nRmlsdGVyIiBsZXZlbD0iaW5mbyIgYWRkaXRpdml0eT0iZmFsc2UiPgorICAgICAgICA8QXBwZW5kZXJSZWYgcmVmPSJXRUItQUNDRVNTIi8+CisgICAgICAgIDxBcHBlbmRlclJlZiByZWY9InN5c2xvZyIvPgorICAgIDwvTG9nZ2VyPgorICAgIDxMb2dnZXIgbmFtZT0iYmFja3R5cGUuc3Rvcm0ubG9nZ2luZy5UaHJpZnRBY2Nlc3NMb2dnZXIiIGxldmVsPSJpbmZvIiBhZGRpdGl2aXR5PSJmYWxzZSI+CisgICAgICAgIDxBcHBlbmRlclJlZiByZWY9IlRIUklGVC1BQ0NFU1MiLz4KKyAgICAgICAgPEFwcGVuZGVyUmVmIHJlZj0ic3lzbG9nIi8+CiAgICAgPC9Mb2dnZXI+CiAgICAgPExvZ2dlciBuYW1lPSJiYWNrdHlwZS5zdG9ybS5tZXRyaWMuTG9nZ2luZ01ldHJpY3NDb25zdW1lciIgbGV2ZWw9ImluZm8iPgogICAgICAgICA8QXBwZW5kZXJSZWYgcmVmPSJNRVRSSUNTIi8+CmRpZmYgLS1naXQgYS9sb2c0ajIvd29ya2VyLnhtbCBiL2xvZzRqMi93b3JrZXIueG1sCmluZGV4IDIwMTc2OTkuLmRmMzY4YzYgMTAwNjQ0Ci0tLSBhL2xvZzRqMi93b3JrZXIueG1sCisrKyBiL2xvZzRqMi93b3JrZXIueG1sCkBAIC0yMiw5ICsyMiw5IEBACiAgICAgPHByb3BlcnR5IG5hbWU9InBhdHRlcm5Ob1RpbWUiPiVtc2clbjwvcHJvcGVydHk+CiA8L3Byb3BlcnRpZXM+CiA8YXBwZW5kZXJzPgotICAgIDxSb2xsaW5nRmlsZSBuYW1lPSJBMSIKLSAgICAgICAgICAgICAgICAgZmlsZU5hbWU9IiR7c3lzOnN0b3JtLmxvZy5kaXJ9LyR7c3lzOmxvZ2ZpbGUubmFtZX0iCi0gICAgICAgICAgICAgICAgIGZpbGVQYXR0ZXJuPSIke3N5czpzdG9ybS5sb2cuZGlyfS8ke3N5czpsb2dmaWxlLm5hbWV9LiVpLmd6Ij4KKyAgICA8Um9sbGluZ0ZpbGUgbmFtZT0iQTEiIGltbWVkaWF0ZUZsdXNoPSJmYWxzZSIKKwkJZmlsZU5hbWU9IiR7c3lzOndvcmtlcnMuYXJ0aWZhY3RzfS8ke3N5czpzdG9ybS5pZH0vJHtzeXM6d29ya2VyLnBvcnR9LyR7c3lzOmxvZ2ZpbGUubmFtZX0iCisJCWZpbGVQYXR0ZXJuPSIke3N5czp3b3JrZXJzLmFydGlmYWN0c30vJHtzeXM6c3Rvcm0uaWR9LyR7c3lzOndvcmtlci5wb3J0fS8ke3N5czpsb2dmaWxlLm5hbWV9LiVpLmd6Ij4KICAgICAgICAgPFBhdHRlcm5MYXlvdXQ+CiAgICAgICAgICAgICA8cGF0dGVybj4ke3BhdHRlcm59PC9wYXR0ZXJuPgogICAgICAgICA8L1BhdHRlcm5MYXlvdXQ+CkBAIC0zMyw5ICszMyw5IEBACiAgICAgICAgIDwvUG9saWNpZXM+CiAgICAgICAgIDxEZWZhdWx0Um9sbG92ZXJTdHJhdGVneSBtYXg9IjkiLz4KICAgICA8L1JvbGxpbmdGaWxlPgotICAgIDxSb2xsaW5nRmlsZSBuYW1lPSJTVERPVVQiCi0gICAgICAgICAgICAgICAgIGZpbGVOYW1lPSIke3N5czpzdG9ybS5sb2cuZGlyfS8ke3N5czpsb2dmaWxlLm5hbWV9Lm91dCIKLSAgICAgICAgICAgICAgICAgZmlsZVBhdHRlcm49IiR7c3lzOnN0b3JtLmxvZy5kaXJ9LyR7c3lzOmxvZ2ZpbGUubmFtZX0ub3V0LiVpLmd6Ij4KKyAgICA8Um9sbGluZ0ZpbGUgbmFtZT0iU1RET1VUIiBpbW1lZGlhdGVGbHVzaD0iZmFsc2UiCisJCWZpbGVOYW1lPSIke3N5czp3b3JrZXJzLmFydGlmYWN0c30vJHtzeXM6c3Rvcm0uaWR9LyR7c3lzOndvcmtlci5wb3J0fS8ke3N5czpsb2dmaWxlLm5hbWV9Lm91dCIKKwkJZmlsZVBhdHRlcm49IiR7c3lzOndvcmtlcnMuYXJ0aWZhY3RzfS8ke3N5czpzdG9ybS5pZH0vJHtzeXM6d29ya2VyLnBvcnR9LyR7c3lzOmxvZ2ZpbGUubmFtZX0ub3V0LiVpLmd6Ij4KICAgICAgICAgPFBhdHRlcm5MYXlvdXQ+CiAgICAgICAgICAgICA8cGF0dGVybj4ke3BhdHRlcm5Ob1RpbWV9PC9wYXR0ZXJuPgogICAgICAgICA8L1BhdHRlcm5MYXlvdXQ+CkBAIC00NCw5ICs0NCw5IEBACiAgICAgICAgIDwvUG9saWNpZXM+CiAgICAgICAgIDxEZWZhdWx0Um9sbG92ZXJTdHJhdGVneSBtYXg9IjQiLz4KICAgICA8L1JvbGxpbmdGaWxlPgotICAgIDxSb2xsaW5nRmlsZSBuYW1lPSJTVERFUlIiCi0gICAgICAgICAgICAgICAgIGZpbGVOYW1lPSIke3N5czpzdG9ybS5sb2cuZGlyfS8ke3N5czpsb2dmaWxlLm5hbWV9LmVyciIKLSAgICAgICAgICAgICAgICAgZmlsZVBhdHRlcm49IiR7c3lzOnN0b3JtLmxvZy5kaXJ9LyR7c3lzOmxvZ2ZpbGUubmFtZX0uZXJyLiVpLmd6Ij4KKyAgICA8Um9sbGluZ0ZpbGUgbmFtZT0iU1RERVJSIiBpbW1lZGlhdGVGbHVzaD0iZmFsc2UiCisJCWZpbGVOYW1lPSIke3N5czp3b3JrZXJzLmFydGlmYWN0c30vJHtzeXM6c3Rvcm0uaWR9LyR7c3lzOndvcmtlci5wb3J0fS8ke3N5czpsb2dmaWxlLm5hbWV9LmVyciIKKwkJZmlsZVBhdHRlcm49IiR7c3lzOndvcmtlcnMuYXJ0aWZhY3RzfS8ke3N5czpzdG9ybS5pZH0vJHtzeXM6d29ya2VyLnBvcnR9LyR7c3lzOmxvZ2ZpbGUubmFtZX0uZXJyLiVpLmd6Ij4KICAgICAgICAgPFBhdHRlcm5MYXlvdXQ+CiAgICAgICAgICAgICA8cGF0dGVybj4ke3BhdHRlcm5Ob1RpbWV9PC9wYXR0ZXJuPgogICAgICAgICA8L1BhdHRlcm5MYXlvdXQ+CkBAIC01NSwxMCArNTUsMTAgQEAKICAgICAgICAgPC9Qb2xpY2llcz4KICAgICAgICAgPERlZmF1bHRSb2xsb3ZlclN0cmF0ZWd5IG1heD0iNCIvPgogICAgIDwvUm9sbGluZ0ZpbGU+Ci0gICAgPFN5c2xvZyBuYW1lPSJzeXNsb2ciIGZvcm1hdD0iUkZDNTQyNCIgaG9zdD0ibG9jYWxob3N0IiBwb3J0PSI1MTQiCisgICAgPFN5c2xvZyBuYW1lPSJzeXNsb2ciIGZvcm1hdD0iUkZDNTQyNCIgY2hhcnNldD0iVVRGLTgiIGhvc3Q9ImxvY2FsaG9zdCIgcG9ydD0iNTE0IgogICAgICAgICBwcm90b2NvbD0iVURQIiBhcHBOYW1lPSJbJHtzeXM6c3Rvcm0uaWR9OiR7c3lzOndvcmtlci5wb3J0fV0iIG1kY0lkPSJtZGMiIGluY2x1ZGVNREM9InRydWUiCiAgICAgICAgIGZhY2lsaXR5PSJMT0NBTDUiIGVudGVycHJpc2VOdW1iZXI9IjE4MDYwIiBuZXdMaW5lPSJ0cnVlIiBleGNlcHRpb25QYXR0ZXJuPSIlckV4e2Z1bGx9IgotICAgICAgICBtZXNzYWdlSWQ9Ilske3N5czp1c2VyLm5hbWV9OiR7c3lzOmxvZ2dpbmcuc2Vuc2l0aXZpdHl9XSIgaWQ9InN0b3JtIi8+CisgICAgICAgIG1lc3NhZ2VJZD0iWyR7c3lzOnVzZXIubmFtZX06JHtzeXM6bG9nZ2luZy5zZW5zaXRpdml0eX1dIiBpZD0ic3Rvcm0iIGltbWVkaWF0ZUZsdXNoPSJmYWxzZSIgaW1tZWRpYXRlRmFpbD0idHJ1ZSIvPgogPC9hcHBlbmRlcnM+CiA8bG9nZ2Vycz4KICAgICA8cm9vdCBsZXZlbD0iaW5mbyI+IDwhLS0gV2UgbG9nIGV2ZXJ5dGhpbmcgLS0+CmRpZmYgLS1naXQgYS9wb20ueG1sIGIvcG9tLnhtbAppbmRleCBmYWY5NGFiLi4zZWQ4ZTNmIDEwMDY0NAotLS0gYS9wb20ueG1sCisrKyBiL3BvbS54bWwKQEAgLTE1NCwyNyArMTU0LDYgQEAKICAgICAgICAgPG1hdmVuPjMuMC4wPC9tYXZlbj4KICAgICA8L3ByZXJlcXVpc2l0ZXM+CiAKLSAgICA8bW9kdWxlcz4KLSAgICAgICAgPG1vZHVsZT5zdG9ybS1idWlsZHRvb2xzL21hdmVuLXNoYWRlLWNsb2p1cmUtdHJhbnNmb3JtZXI8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5zdG9ybS1idWlsZHRvb2xzL3N0b3JtLW1hdmVuLXBsdWdpbnM8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5zdG9ybS1tdWx0aWxhbmcvamF2YXNjcmlwdDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPnN0b3JtLW11bHRpbGFuZy9weXRob248L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5zdG9ybS1tdWx0aWxhbmcvcnVieTwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPnN0b3JtLWNvcmU8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5leHRlcm5hbC9zdG9ybS1rYWZrYTwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPmV4dGVybmFsL3N0b3JtLWhkZnM8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5leHRlcm5hbC9zdG9ybS1oYmFzZTwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPmV4dGVybmFsL3N0b3JtLWhpdmU8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5leHRlcm5hbC9zdG9ybS1qZGJjPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGU+ZXh0ZXJuYWwvc3Rvcm0tcmVkaXM8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5leHRlcm5hbC9zdG9ybS1ldmVudGh1YnM8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5leHRlcm5hbC9mbHV4PC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGU+ZXh0ZXJuYWwvc3Rvcm0tZWxhc3RpY3NlYXJjaDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPmV4dGVybmFsL3N0b3JtLXNvbHI8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5leHRlcm5hbC9zcWw8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZT5leGFtcGxlcy9zdG9ybS1zdGFydGVyPC9tb2R1bGU+Ci0gICAgPC9tb2R1bGVzPgotCiAgICAgPHNjbT4KICAgICAgICAgPGNvbm5lY3Rpb24+c2NtOmdpdDpodHRwczovL2dpdC13aXAtdXMuYXBhY2hlLm9yZy9yZXBvcy9hc2Yvc3Rvcm0uZ2l0PC9jb25uZWN0aW9uPgogICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206Z2l0Omh0dHBzOi8vZ2l0LXdpcC11cy5hcGFjaGUub3JnL3JlcG9zL2FzZi9zdG9ybS5naXQ8L2RldmVsb3BlckNvbm5lY3Rpb24+CkBAIC0xOTIsMTYgKzE3MSwyMCBAQAogICAgICAgICA8dGVzdC5leHRyYS5hcmdzPi1EamF2YS5uZXQucHJlZmVySVB2NFN0YWNrPXRydWU8L3Rlc3QuZXh0cmEuYXJncz4KIAogICAgICAgICA8IS0tIGRlcGVuZGVuY3kgdmVyc2lvbnMgLS0+Ci0gICAgICAgIDxjbG9qdXJlLnZlcnNpb24+MS42LjA8L2Nsb2p1cmUudmVyc2lvbj4KKyAgICAgICAgPGNsb2p1cmUudmVyc2lvbj4xLjcuMDwvY2xvanVyZS52ZXJzaW9uPgorICAgICAgICA8amF2YV9qbXgudmVyc2lvbj4wLjMuMTwvamF2YV9qbXgudmVyc2lvbj4KICAgICAgICAgPGNvbXBvanVyZS52ZXJzaW9uPjEuMS4zPC9jb21wb2p1cmUudmVyc2lvbj4KICAgICAgICAgPGhpY2N1cC52ZXJzaW9uPjAuMy42PC9oaWNjdXAudmVyc2lvbj4KICAgICAgICAgPGNvbW1vbnMtaW8udmVyc2lvbj4yLjQ8L2NvbW1vbnMtaW8udmVyc2lvbj4KICAgICAgICAgPGNvbW1vbnMtbGFuZy52ZXJzaW9uPjIuNTwvY29tbW9ucy1sYW5nLnZlcnNpb24+CiAgICAgICAgIDxjb21tb25zLWV4ZWMudmVyc2lvbj4xLjE8L2NvbW1vbnMtZXhlYy52ZXJzaW9uPgorICAgICAgICA8Y29tbW9ucy1maWxldXBsb2FkLnZlcnNpb24+MS4yLjE8L2NvbW1vbnMtZmlsZXVwbG9hZC52ZXJzaW9uPgorICAgICAgICA8Y29tbW9ucy1jb2RlYy52ZXJzaW9uPjEuNjwvY29tbW9ucy1jb2RlYy52ZXJzaW9uPgogICAgICAgICA8Y2xqLXRpbWUudmVyc2lvbj4wLjguMDwvY2xqLXRpbWUudmVyc2lvbj4KLSAgICAgICAgPGN1cmF0b3IudmVyc2lvbj4yLjUuMDwvY3VyYXRvci52ZXJzaW9uPgorICAgICAgICA8Y3VyYXRvci52ZXJzaW9uPjIuOS4wPC9jdXJhdG9yLnZlcnNpb24+CiAgICAgICAgIDxqc29uLXNpbXBsZS52ZXJzaW9uPjEuMTwvanNvbi1zaW1wbGUudmVyc2lvbj4KICAgICAgICAgPHJpbmcudmVyc2lvbj4xLjMuMDwvcmluZy52ZXJzaW9uPgorICAgICAgICA8cmluZy1qc29uLnZlcnNpb24+MC4zLjE8L3JpbmctanNvbi52ZXJzaW9uPgogICAgICAgICA8amV0dHkudmVyc2lvbj43LjYuMTMudjIwMTMwOTE2PC9qZXR0eS52ZXJzaW9uPgogICAgICAgICA8Y2xvanVyZS50b29scy5sb2dnaW5nLnZlcnNpb24+MC4yLjM8L2Nsb2p1cmUudG9vbHMubG9nZ2luZy52ZXJzaW9uPgogICAgICAgICA8Y2xvanVyZS5tYXRoLm51bWVyaWMtdG93ZXIudmVyc2lvbj4wLjAuMTwvY2xvanVyZS5tYXRoLm51bWVyaWMtdG93ZXIudmVyc2lvbj4KQEAgLTIwOSwxMiArMTkyLDE0IEBACiAgICAgICAgIDxzbmFrZXlhbWwudmVyc2lvbj4xLjExPC9zbmFrZXlhbWwudmVyc2lvbj4KICAgICAgICAgPGh0dHBjbGllbnQudmVyc2lvbj40LjMuMzwvaHR0cGNsaWVudC52ZXJzaW9uPgogICAgICAgICA8Y2xvanVyZS50b29scy5jbGkudmVyc2lvbj4wLjIuNDwvY2xvanVyZS50b29scy5jbGkudmVyc2lvbj4KLSAgICAgICAgPGRpc3J1cHRvci52ZXJzaW9uPjIuMTAuNDwvZGlzcnVwdG9yLnZlcnNpb24+CisgICAgICAgIDxkaXNydXB0b3IudmVyc2lvbj4zLjMuMjwvZGlzcnVwdG9yLnZlcnNpb24+CiAgICAgICAgIDxqZ3JhcGh0LnZlcnNpb24+MC45LjA8L2pncmFwaHQudmVyc2lvbj4KICAgICAgICAgPGd1YXZhLnZlcnNpb24+MTYuMC4xPC9ndWF2YS52ZXJzaW9uPgogICAgICAgICA8bmV0dHkudmVyc2lvbj4zLjkuMC5GaW5hbDwvbmV0dHkudmVyc2lvbj4KICAgICAgICAgPGxvZzRqLW92ZXItc2xmNGoudmVyc2lvbj4xLjYuNjwvbG9nNGotb3Zlci1zbGY0ai52ZXJzaW9uPgogICAgICAgICA8bG9nNGoudmVyc2lvbj4yLjE8L2xvZzRqLnZlcnNpb24+CisgICAgICAgIDxzbGY0ai52ZXJzaW9uPjEuNy43PC9zbGY0ai52ZXJzaW9uPgorICAgICAgICA8bWV0cmljcy52ZXJzaW9uPjMuMS4wPC9tZXRyaWNzLnZlcnNpb24+CiAgICAgICAgIDxjbG9qdXJlLnRvb2xzLm5yZXBsLnZlcnNpb24+MC4yLjM8L2Nsb2p1cmUudG9vbHMubnJlcGwudmVyc2lvbj4KICAgICAgICAgPGNsb2p1cmUtY29tcGxldGUudmVyc2lvbj4wLjIuMzwvY2xvanVyZS1jb21wbGV0ZS52ZXJzaW9uPgogICAgICAgICA8bW9ja2l0by52ZXJzaW9uPjEuOS41PC9tb2NraXRvLnZlcnNpb24+CkBAIC0yMjUsMTAgKzIxMCwzOSBAQAogICAgICAgICA8aGl2ZS52ZXJzaW9uPjAuMTQuMDwvaGl2ZS52ZXJzaW9uPgogICAgICAgICA8aGFkb29wLnZlcnNpb24+Mi42LjA8L2hhZG9vcC52ZXJzaW9uPgogICAgICAgICA8a3J5by52ZXJzaW9uPjIuMjE8L2tyeW8udmVyc2lvbj4KKyAgICAgICAgPHNlcnZsZXQudmVyc2lvbj4yLjU8L3NlcnZsZXQudmVyc2lvbj4KKyAgICAgICAgPGpvZGEtdGltZS52ZXJzaW9uPjIuMzwvam9kYS10aW1lLnZlcnNpb24+CisgICAgICAgIDxqYWNrc29uLnZlcnNpb24+Mi4zLjE8L2phY2tzb24udmVyc2lvbj4KKyAgICAgICAgPHRocmlmdC52ZXJzaW9uPjAuOS4zPC90aHJpZnQudmVyc2lvbj4KKyAgICAgICAgPGp1bml0LnZlcnNpb24+NC4xMTwvanVuaXQudmVyc2lvbj4KKyAgICAgICAgPG1ldHJpY3MtY2xvanVyZS52ZXJzaW9uPjIuNS4xPC9tZXRyaWNzLWNsb2p1cmUudmVyc2lvbj4KKyAgICAgICAgPGhkcmhpc3RvZ3JhbS52ZXJzaW9uPjIuMS43PC9oZHJoaXN0b2dyYW0udmVyc2lvbj4KICAgICAgICAgPGNhbGNpdGUudmVyc2lvbj4xLjQuMC1pbmN1YmF0aW5nPC9jYWxjaXRlLnZlcnNpb24+Ci0gICAgICAgIDxqYWNrc29uLnZlcnNpb24+Mi42LjM8L2phY2tzb24udmVyc2lvbj4KICAgICA8L3Byb3BlcnRpZXM+CiAKKyAgICA8bW9kdWxlcz4KKyAgICAgICAgPG1vZHVsZT5zdG9ybS1tdWx0aWxhbmcvamF2YXNjcmlwdDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnN0b3JtLW11bHRpbGFuZy9weXRob248L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5zdG9ybS1tdWx0aWxhbmcvcnVieTwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnN0b3JtLWJ1aWxkdG9vbHMvbWF2ZW4tc2hhZGUtY2xvanVyZS10cmFuc2Zvcm1lcjwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnN0b3JtLWJ1aWxkdG9vbHMvc3Rvcm0tbWF2ZW4tcGx1Z2luczwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnN0b3JtLWNvcmU8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5leHRlcm5hbC9zdG9ybS1rYWZrYTwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmV4dGVybmFsL3N0b3JtLWhkZnM8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5leHRlcm5hbC9zdG9ybS1oYmFzZTwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmV4dGVybmFsL3N0b3JtLWhpdmU8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5leHRlcm5hbC9zdG9ybS1qZGJjPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+ZXh0ZXJuYWwvc3Rvcm0tcmVkaXM8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5leHRlcm5hbC9zdG9ybS1ldmVudGh1YnM8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5leHRlcm5hbC9mbHV4PC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+ZXh0ZXJuYWwvc3Rvcm0tZWxhc3RpY3NlYXJjaDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmV4dGVybmFsL3N0b3JtLXNvbHI8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5leHRlcm5hbC9zdG9ybS1tZXRyaWNzPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+ZXh0ZXJuYWwvc3FsPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+ZXhhbXBsZXMvc3Rvcm0tc3RhcnRlcjwvbW9kdWxlPgorICAgIDwvbW9kdWxlcz4KKworCiAgICAgPHByb2ZpbGVzPgogICAgICAgICA8cHJvZmlsZT4KICAgICAgICAgICAgIDxpZD5zaWduPC9pZD4KQEAgLTMyMiw2ICszMzYsMTEgQEAKICAgICA8ZGVwZW5kZW5jeU1hbmFnZW1lbnQ+CiAgICAgICAgIDxkZXBlbmRlbmNpZXM+CiAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuaGRyaGlzdG9ncmFtPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPkhkckhpc3RvZ3JhbTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2hkcmhpc3RvZ3JhbS52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgogICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jbG9qdXJlPC9ncm91cElkPgogICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmNsb2p1cmU8L2FydGlmYWN0SWQ+CiAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtjbG9qdXJlLnZlcnNpb259PC92ZXJzaW9uPgpAQCAtMzgzLDYgKzQwMiw0MSBAQAogICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtzZXJ2bGV0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNsZjRqPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnNsZjRqLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3NsZjRqLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+am9kYS10aW1lPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpvZGEtdGltZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2pvZGEtdGltZS52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPmNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5jb3JlPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmphY2tzb24tY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2phY2tzb24udmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWZvcm1hdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYWNrc29uLWRhdGFmb3JtYXQtc21pbGU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtqYWNrc29uLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1maWxldXBsb2FkPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtZmlsZXVwbG9hZDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2NvbW1vbnMtZmlsZXVwbG9hZC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPmNvbW1vbnMtY29kZWM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1jb2RlYzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2NvbW1vbnMtY29kZWMudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmN1cmF0b3I8L2dyb3VwSWQ+CiAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y3VyYXRvci1mcmFtZXdvcms8L2FydGlmYWN0SWQ+CiAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtjdXJhdG9yLnZlcnNpb259PC92ZXJzaW9uPgpAQCAtNDEyLDYgKzQ2NiwxMSBAQAogICAgICAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KICAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbnM+CiAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmN1cmF0b3I8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y3VyYXRvci1jbGllbnQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtjdXJhdG9yLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgogCiAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlY29kZS5qc29uLXNpbXBsZTwvZ3JvdXBJZD4KQEAgLTQzOSw2ICs0OTgsMTEgQEAKICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3JpbmcudmVyc2lvbn08L3ZlcnNpb24+CiAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CiAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5yaW5nPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnJpbmctanNvbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3JpbmctanNvbi52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgogCSAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpldHR5PC9ncm91cElkPgogCSAgICAgIDxhcnRpZmFjdElkPmpldHR5LXNlcnZsZXQ8L2FydGlmYWN0SWQ+CiAJICAgICAgPHZlcnNpb24+JHtqZXR0eS52ZXJzaW9ufTwvdmVyc2lvbj4KQEAgLTQ0OSw2ICs1MTMsMTcgQEAKIAkgICAgICA8dmVyc2lvbj4ke2pldHR5LnZlcnNpb259PC92ZXJzaW9uPgogICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgogICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktc2VydmVyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7amV0dHkudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS11dGlsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7amV0dHkudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgogICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jbG9qdXJlPC9ncm91cElkPgogICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnRvb2xzLmxvZ2dpbmc8L2FydGlmYWN0SWQ+CiAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtjbG9qdXJlLnRvb2xzLmxvZ2dpbmcudmVyc2lvbn08L3ZlcnNpb24+CkBAIC00NzksNyArNTU0LDcgQEAKICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2Nsb2p1cmUudG9vbHMuY2xpLnZlcnNpb259PC92ZXJzaW9uPgogICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgogICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZWNvZGUuZGlzcnVwdG9yPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxncm91cElkPmNvbS5sbWF4PC9ncm91cElkPgogICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmRpc3J1cHRvcjwvYXJ0aWZhY3RJZD4KICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2Rpc3J1cHRvci52ZXJzaW9ufTwvdmVyc2lvbj4KICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KQEAgLTUyNCw2ICs1OTksMTYgQEAKICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke25ldHR5LnZlcnNpb259PC92ZXJzaW9uPgogICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgogICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+aW8uZHJvcHdpemFyZC5tZXRyaWNzPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1ldHJpY3MtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke21ldHJpY3MudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5tZXRyaWNzLWNsb2p1cmU8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWV0cmljcy1jbG9qdXJlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7bWV0cmljcy1jbG9qdXJlLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgPGRlcGVuZGVuY3k+CiAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNsb2p1cmU8L2dyb3VwSWQ+CiAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y2xvanVyZS1jb250cmliPC9hcnRpZmFjdElkPgogICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7Y2xvanVyZS1jb250cmliLnZlcnNpb259PC92ZXJzaW9uPgpAQCAtNTczLDI2ICs2NTgsMjUgQEAKICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgogICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUudGhyaWZ0PC9ncm91cElkPgogICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmxpYnRocmlmdDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4wLjkuMjwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3RocmlmdC52ZXJzaW9ufTwvdmVyc2lvbj4KICAgICAgICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CiAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CiAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5jYWxjaXRlPC9ncm91cElkPgotICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jYWxjaXRlLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgIDx2ZXJzaW9uPiR7Y2FsY2l0ZS52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmNhbGNpdGU8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y2FsY2l0ZS1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7Y2FsY2l0ZS52ZXJzaW9ufTwvdmVyc2lvbj4KICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICA8Z3JvdXBJZD5jb20uZmFzdGVyeG1sLmphY2tzb24uY29yZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amFja3Nvbi1kYXRhYmluZDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgPHZlcnNpb24+JHtqYWNrc29uLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgIDxncm91cElkPmNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5jb3JlPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmphY2tzb24tZGF0YWJpbmQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtqYWNrc29uLnZlcnNpb259PC92ZXJzaW9uPgogICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotCQkJPCEtLSB1c2VkIGJ5IGV4YW1wbGVzL3N0b3JtLXN0YXJ0ZXIgLS0+Ci0JCSAgICA8ZGVwZW5kZW5jeT4KLQkJICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+Ci0JCSAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotCQkgICAgICA8dmVyc2lvbj40LjExPC92ZXJzaW9uPgotCQkgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0JCSAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2p1bml0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KICAgICAgICAgPC9kZXBlbmRlbmNpZXM+CiAgICAgPC9kZXBlbmRlbmN5TWFuYWdlbWVudD4KIApAQCAtNjg2LDcgKzc3MCw3IEBACiAgICAgICAgICAgICAgICAgPHBsdWdpbj4KICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgogICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zaGFkZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi40LjE8L3ZlcnNpb24+CiAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CiAgICAgICAgICAgICAgICAgPHBsdWdpbj4KICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgpAQCAtNzI0LDYgKzgwOCw3NiBAQAogICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmNsb2p1cmUtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgogICAgICAgICAgICAgICAgIDxleHRlbnNpb25zPnRydWU8L2V4dGVuc2lvbnM+CiAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5yYXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXBhY2hlLXJhdC1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+MC4xMTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT52ZXJpZnk8L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmNoZWNrPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZVN1YlByb2plY3RzPmZhbHNlPC9leGNsdWRlU3ViUHJvamVjdHM+CisgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gZXhjbHVkZSBtYXZlbiBhcnRpZmFjdHMgLS0+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi90YXJnZXQvKio8L2V4Y2x1ZGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGV4Y2x1ZGUgaW50ZWxsaWogcHJvamVjdHMgLS0+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qLmltbDwvZXhjbHVkZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLy5pZGVhLyoqPC9leGNsdWRlPgorICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBtb2R1bGUgc3BlY2lmaWMgdGVzdGluZyBhcnRpZmFjdHMgLS0+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9tZXRhc3RvcmVfZGIvKio8L2V4Y2x1ZGU+CisKKyAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gZXhjbHVkZSBDSEFOR0VMT0csIFZFUlNJT04sIEFORCBUT0RPIGZpbGVzIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovQ0hBTkdFTE9HLm1kPC9leGNsdWRlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovUkVBRE1FLm1kPC9leGNsdWRlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovUkVBRE1FLm1hcmtkb3duPC9leGNsdWRlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovREVWRUxPUEVSLm1kPC9leGNsdWRlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovQllMQVdTLm1kPC9leGNsdWRlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovU1RPUk0tVUktUkVTVC1BUEkubWQ8L2V4Y2x1ZGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT5TRUNVUklUWS5tZDwvZXhjbHVkZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPlZFUlNJT048L2V4Y2x1ZGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT5UT0RPPC9leGNsdWRlPgorICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSB0aHJpZnQtZ2VuZXJhdGVkIGNvZGUgLS0+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9zcmMvcHkvKio8L2V4Y2x1ZGU+CisKKyAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gdGhlIGZvbGxvd2luZyBhcmUgaW4gdGhlIExJQ0VOU0UgZmlsZSAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL3NyYy91aS9wdWJsaWMvanMvanF1ZXJ5LmRhdGFUYWJsZXMuMS4xMC40Lm1pbi5qczwvZXhjbHVkZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL3NyYy91aS9wdWJsaWMvY3NzL2pxdWVyeS5kYXRhVGFibGVzLjEuMTAuNC5taW4uY3NzPC9leGNsdWRlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+Kiovc3JjL3VpL3B1YmxpYy9pbWFnZXMvKjwvZXhjbHVkZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL3NyYy91aS9wdWJsaWMvanMvYm9vdHN0cmFwLTMuMy4xLm1pbi5qczwvZXhjbHVkZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL3NyYy91aS9wdWJsaWMvY3NzL2Jvb3RzdHJhcC0zLjMuMS5taW4uY3NzPC9leGNsdWRlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+Kiovc3JjL3VpL3B1YmxpYy9qcy9kYXRhVGFibGVzLmJvb3RzdHJhcC5taW4uanM8L2V4Y2x1ZGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9zcmMvdWkvcHVibGljL2Nzcy9kYXRhVGFibGVzLmJvb3RzdHJhcC5jc3M8L2V4Y2x1ZGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9zcmMvdWkvcHVibGljL2pzL2pzb25Gb3JtYXR0ZXIubWluLmpzPC9leGNsdWRlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+Kiovc3JjL3VpL3B1YmxpYy9jc3MvanNvbkZvcm1hdHRlci5taW4uY3NzPC9leGNsdWRlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+Kiovc3JjL3VpL3B1YmxpYy9qcy9qcXVlcnktMS4xMS4xLm1pbi5qczwvZXhjbHVkZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL3NyYy91aS9wdWJsaWMvanMvanF1ZXJ5LmNvb2tpZXMuMi4yLjAubWluLmpzPC9leGNsdWRlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+Kiovc3JjL3VpL3B1YmxpYy9qcy9tb21lbnQubWluLmpzPC9leGNsdWRlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+Kiovc3JjL3VpL3B1YmxpYy9qcy9qcXVlcnkuYmxvY2tVSS5taW4uanM8L2V4Y2x1ZGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9zcmMvdWkvcHVibGljL2pzL3VybC5taW4uanM8L2V4Y2x1ZGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9zcmMvdWkvcHVibGljL2pzL2FyYm9yLmpzPC9leGNsdWRlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+Kiovc3JjL3VpL3B1YmxpYy9qcy9hcmJvci1ncmFwaGljcy5qczwvZXhjbHVkZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL3NyYy91aS9wdWJsaWMvanMvYXJib3ItdHdlZW4uanM8L2V4Y2x1ZGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9zcmMvdWkvcHVibGljL2pzL2pxdWVyeS5tdXN0YWNoZS5qczwvZXhjbHVkZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL3NyYy91aS9wdWJsaWMvanMvdHlwZWFoZWFkLmpxdWVyeS5taW4uanM8L2V4Y2x1ZGU+CisKKyAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gZ2VuZXJhdGVkIGJ5IHNoYWRlIHBsdWdpbiAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL2RlcGVuZGVuY3ktcmVkdWNlZC1wb20ueG1sPC9leGNsdWRlPgorCisgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9kb2NzLyoqPC9leGNsdWRlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovLmdpdC8qKjwvZXhjbHVkZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL2RlcmJ5LmxvZzwvZXhjbHVkZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL3NyYy9kZXYvKio8L2V4Y2x1ZGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFN0b3JtIFNRTCAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL3NyYy9jb2RlZ2VuL2NvbmZpZy5mbXBwPC9leGNsdWRlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+Kiovc3JjL2NvZGVnZW4vZGF0YS9QYXJzZXIudGRkPC9leGNsdWRlPgorICAgICAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgogICAgICAgICA8L3BsdWdpbnM+CiAgICAgPC9idWlsZD4KIApAQCAtNzg0LDYwICs5MzgsNiBAQAogICAgICAgICAgICAgICAgICAgICA8L3RhZ0xpc3RPcHRpb25zPgogICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnJhdDwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5hcGFjaGUtcmF0LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4wLjExPC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZVN1YlByb2plY3RzPmZhbHNlPC9leGNsdWRlU3ViUHJvamVjdHM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gZXhjbHVkZSBtYXZlbiBhcnRpZmFjdHMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi90YXJnZXQvKio8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGV4Y2x1ZGUgaW50ZWxsaWogcHJvamVjdHMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qLmltbDwvZXhjbHVkZT4KLQotICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBleGNsdWRlIENIQU5HRUxPRywgVkVSU0lPTiwgQU5EIFRPRE8gZmlsZXMgLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9DSEFOR0VMT0cubWQ8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9SRUFETUUubWQ8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9SRUFETUUubWFya2Rvd248L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9ERVZFTE9QRVIubWQ8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9CWUxBV1MubWQ8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9TVE9STS1VSS1SRVNULUFQSS5tZDwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPlNFQ1VSSVRZLm1kPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+VkVSU0lPTjwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPlRPRE88L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHRocmlmdC1nZW5lcmF0ZWQgY29kZSAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL3NyYy9weS8qKjwvZXhjbHVkZT4KLQotICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSB0aGUgZm9sbG93aW5nIGFyZSBpbiB0aGUgTElDRU5TRSBmaWxlIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+Kiovc3JjL3VpL3B1YmxpYy9qcy9qcXVlcnkuZGF0YVRhYmxlcy4xLjEwLjQubWluLmpzPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+Kiovc3JjL3VpL3B1YmxpYy9jc3MvanF1ZXJ5LmRhdGFUYWJsZXMuMS4xMC40Lm1pbi5jc3M8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9zcmMvdWkvcHVibGljL2ltYWdlcy8qPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+Kiovc3JjL3VpL3B1YmxpYy9qcy9ib290c3RyYXAtMy4zLjEubWluLmpzPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+Kiovc3JjL3VpL3B1YmxpYy9jc3MvYm9vdHN0cmFwLTMuMy4xLm1pbi5jc3M8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9zcmMvdWkvcHVibGljL2pzL2RhdGFUYWJsZXMuYm9vdHN0cmFwLm1pbi5qczwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL3NyYy91aS9wdWJsaWMvY3NzL2RhdGFUYWJsZXMuYm9vdHN0cmFwLmNzczwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL3NyYy91aS9wdWJsaWMvanMvanNvbkZvcm1hdHRlci5taW4uanM8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9zcmMvdWkvcHVibGljL2Nzcy9qc29uRm9ybWF0dGVyLm1pbi5jc3M8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9zcmMvdWkvcHVibGljL2pzL2pxdWVyeS0xLjExLjEubWluLmpzPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+Kiovc3JjL3VpL3B1YmxpYy9qcy9qcXVlcnkuY29va2llcy4yLjIuMC5taW4uanM8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9zcmMvdWkvcHVibGljL2pzL21vbWVudC5taW4uanM8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9zcmMvdWkvcHVibGljL2pzL2pxdWVyeS5ibG9ja1VJLm1pbi5qczwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL3NyYy91aS9wdWJsaWMvanMvdXJsLm1pbi5qczwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL3NyYy91aS9wdWJsaWMvanMvYXJib3IuanM8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9zcmMvdWkvcHVibGljL2pzL2FyYm9yLWdyYXBoaWNzLmpzPC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+Kiovc3JjL3VpL3B1YmxpYy9qcy9hcmJvci10d2Vlbi5qczwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL3NyYy91aS9wdWJsaWMvanMvanF1ZXJ5Lm11c3RhY2hlLmpzPC9leGNsdWRlPgotCi0gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGdlbmVyYXRlZCBieSBzaGFkZSBwbHVnaW4gLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9kZXBlbmRlbmN5LXJlZHVjZWQtcG9tLnhtbDwvZXhjbHVkZT4KLQotICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovZG9jcy8qKjwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLy5naXQvKio8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9kZXJieS5sb2c8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+CiAgICAgICAgIDwvcGx1Z2lucz4KICAgICA8L3JlcG9ydGluZz4KIDwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvcG9tLnhtbCBiL3N0b3JtLWNvcmUvcG9tLnhtbAppbmRleCAzZWI0MTEyLi4wODNjZGNhIDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3BvbS54bWwKKysrIGIvc3Rvcm0tY29yZS9wb20ueG1sCkBAIC0zOSw2ICszOSwxMiBAQAogICAgICAgICA8ZGVwZW5kZW5jeT4KICAgICAgICAgICAgIDxncm91cElkPmNvbS5lc290ZXJpY3NvZnR3YXJlLmtyeW88L2dyb3VwSWQ+CiAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5rcnlvPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPGV4Y2x1c2lvbnM+CisgICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm9iamVuZXNpczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+b2JqZW5lc2lzPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICAgICAgPC9leGNsdXNpb25zPgogICAgICAgICA8L2RlcGVuZGVuY3k+CiAgICAgICAgIDwhLS1jbG9qdXJlLS0+CiAgICAgICAgIDxkZXBlbmRlbmN5PgpAQCAtNzQsNyArODAsNiBAQAogICAgICAgICA8ZGVwZW5kZW5jeT4KICAgICAgICAgICAgIDxncm91cElkPnJpbmc8L2dyb3VwSWQ+CiAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5yaW5nLWpzb248L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4wLjMuMTwvdmVyc2lvbj4KICAgICAgICAgPC9kZXBlbmRlbmN5PgogICAgICAgICA8ZGVwZW5kZW5jeT4KICAgICAgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpldHR5PC9ncm91cElkPgpAQCAtMTIxLDcgKzEyNiwxMiBAQAogICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZGF0YS5jb2RlYzwvYXJ0aWZhY3RJZD4KICAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KICAgICAgICAgPC9kZXBlbmRlbmN5PgotCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgIDxncm91cElkPm9yZy5jbG9qdXJlPC9ncm91cElkPgorICAgICAgICAgIDxhcnRpZmFjdElkPmphdmEuam14PC9hcnRpZmFjdElkPgorICAgICAgICAgIDx2ZXJzaW9uPiR7amF2YV9qbXgudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgCiAgICAgICAgIDwhLS1qYXZhLS0+CiAgICAgICAgIDxkZXBlbmRlbmN5PgogICAgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1pbzwvZ3JvdXBJZD4KQEAgLTE0MSw3ICsxNTEsNiBAQAogICAgICAgICA8ZGVwZW5kZW5jeT4KICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUudGhyaWZ0PC9ncm91cElkPgogICAgICAgICAgICAgPGFydGlmYWN0SWQ+bGlidGhyaWZ0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MC45LjI8L3ZlcnNpb24+CiAgICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CiAgICAgICAgICAgICA8ZXhjbHVzaW9ucz4KICAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgpAQCAtMTU0LDggKzE2Myw2IEBACiAgICAgICAgICAgICAgICAgPC9leGNsdXNpb24+CiAgICAgICAgICAgICA8L2V4Y2x1c2lvbnM+CiAgICAgICAgIDwvZGVwZW5kZW5jeT4KLQotCiAgICAgICAgIDxkZXBlbmRlbmN5PgogICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5jdXJhdG9yPC9ncm91cElkPgogICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y3VyYXRvci1mcmFtZXdvcms8L2FydGlmYWN0SWQ+CkBAIC0xOTIsOCArMTk5LDYgQEAKICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzb24tc2ltcGxlPC9hcnRpZmFjdElkPgogICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgogICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLQogICAgICAgICA8ZGVwZW5kZW5jeT4KICAgICAgICAgICAgIDxncm91cElkPmNvbS50d2l0dGVyPC9ncm91cElkPgogICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y2FyYm9uaXRlPC9hcnRpZmFjdElkPgpAQCAtMjA1LDcgKzIxMCw3IEBACiAgICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CiAgICAgICAgIDwvZGVwZW5kZW5jeT4KICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlY29kZS5kaXNydXB0b3I8L2dyb3VwSWQ+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb20ubG1heDwvZ3JvdXBJZD4KICAgICAgICAgICAgIDxhcnRpZmFjdElkPmRpc3J1cHRvcjwvYXJ0aWZhY3RJZD4KICAgICAgICAgPC9kZXBlbmRlbmN5PgogICAgICAgICA8ZGVwZW5kZW5jeT4KQEAgLTIzOSwxNSArMjQ0LDY2IEBACiAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5uZXR0eTwvYXJ0aWZhY3RJZD4KICAgICAgICAgPC9kZXBlbmRlbmN5PgogICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmlvLmRyb3B3aXphcmQubWV0cmljczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm1ldHJpY3MtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm1ldHJpY3MtY2xvanVyZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm1ldHJpY3MtY2xvanVyZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb2NraXRvPC9ncm91cElkPgogICAgICAgICAgICAgPGFydGlmYWN0SWQ+bW9ja2l0by1hbGw8L2FydGlmYWN0SWQ+CiAgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CiAgICAgICAgIDwvZGVwZW5kZW5jeT4KICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgIAk8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLSAgICAgICAgCTxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgICAgICAJPHZlcnNpb24+NC4xMTwvdmVyc2lvbj4KLSAgICAgICAgCTxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnpvb2tlZXBlcjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnpvb2tlZXBlcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5zbGY0ajwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnNsZjRqLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmpvZGEtdGltZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmpvZGEtdGltZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktc2VydmVyPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS11dGlsPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLmZhc3RlcnhtbC5qYWNrc29uLmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYWNrc29uLWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWZvcm1hdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphY2tzb24tZGF0YWZvcm1hdC1zbWlsZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuY3VyYXRvcjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmN1cmF0b3ItY2xpZW50PC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1maWxldXBsb2FkPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1maWxldXBsb2FkPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1jb2RlYzwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtY29kZWM8L2FydGlmYWN0SWQ+CiAgICAgICAgIDwvZGVwZW5kZW5jeT4KICAgICA8L2RlcGVuZGVuY2llcz4KICAgICA8YnVpbGQ+CkBAIC0zNjAsMjMgKzQxNiwyMiBAQAogICAgICAgICAgICAgICAgICAgICA8bWluaW1pemVKYXI+ZmFsc2U8L21pbmltaXplSmFyPgogICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RTZXQ+CiAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+bnMtdHJhY2tlcjpucy10cmFja2VyPC9pbmNsdWRlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPmhpY2N1cDpoaWNjdXA8L2luY2x1ZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+cmluZzoqPC9pbmNsdWRlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPmNvbXBvanVyZTpjb21wb2p1cmU8L2luY2x1ZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Y2xqLXRpbWU6Y2xqLXRpbWU8L2luY2x1ZGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+b3JnLmFwYWNoZS50aHJpZnQ6KjwvaW5jbHVkZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5pby5uZXR0eTpuZXR0eTwvaW5jbHVkZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5jb20uZ29vZ2xlLmd1YXZhOmd1YXZhPC9pbmNsdWRlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPm9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHM6aHR0cCo8L2luY2x1ZGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+b3JnLmFwYWNoZS56b29rZWVwZXI6em9va2VlcGVyPC9pbmNsdWRlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPm9yZy5hcGFjaGUuY3VyYXRvcjoqPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPm9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHM6aHR0cCo8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+b3JnLmFwYWNoZS56b29rZWVwZXI6em9va2VlcGVyPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPm9yZy5hcGFjaGUuY3VyYXRvcjoqPC9pbmNsdWRlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPmNvbS50d2l0dGVyOmNhcmJvbml0ZTwvaW5jbHVkZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5jb20udHdpdHRlcjpjaGlsbC1qYXZhPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPm9yZy5vYmplbmVzaXM6b2JqZW5lc2lzPC9pbmNsdWRlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPm9yZy50dWthYW5pOnh6PC9pbmNsdWRlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPm9yZy55YW1sOnNuYWtleWFtbDwvaW5jbHVkZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5vcmcuamdyYXBodDpqZ3JhcGh0LWNvcmU8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Y29tbW9ucy1odHRwY2xpZW50OmNvbW1vbnMtaHR0cGNsaWVudDwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5vcmcuYXBhY2hlLmNvbW1vbnM6Y29tbW9ucy1jb21wcmVzczwvaW5jbHVkZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5vcmcuYXBhY2hlLmNvbW1vbnM6Y29tbW9ucy1leGVjPC9pbmNsdWRlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPmNvbW1vbnMtaW86Y29tbW9ucy1pbzwvaW5jbHVkZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5jb21tb25zLWNvZGVjOmNvbW1vbnMtY29kZWM8L2luY2x1ZGU+CkBAIC0zODUsMTY4ICs0NDAsMjQ0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Y29tLmdvb2dsZWNvZGUuanNvbi1zaW1wbGU6anNvbi1zaW1wbGU8L2luY2x1ZGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+b3JnLmNsb2p1cmU6bWF0aC5udW1lcmljLXRvd2VyPC9pbmNsdWRlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPm9yZy5jbG9qdXJlOnRvb2xzLmNsaTwvaW5jbHVkZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5vcmcuY2xvanVyZTp0b29scy5sb2dnaW5nPC9pbmNsdWRlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPm9yZy5jbG9qdXJlOnRvb2xzLm1hY3JvPC9pbmNsdWRlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPm9yZy5jbG9qdXJlOmphdmEuam14PC9pbmNsdWRlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPmpvZGEtdGltZTpqb2RhLXRpbWU8L2luY2x1ZGU+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+b3JnLmVjbGlwc2UuamV0dHk6KjwvaW5jbHVkZT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5jb20uZmFzdGVyeG1sLmphY2tzb24uY29yZToqPC9pbmNsdWRlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPmNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhZm9ybWF0Oio8L2luY2x1ZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Y2xvdXQ6Y2xvdXQ8L2luY2x1ZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+b3JnLmNsb2p1cmU6dG9vbHMubmFtZXNwYWNlPC9pbmNsdWRlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPmNoZXNoaXJlOmNoZXNoaXJlPC9pbmNsdWRlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPm9yZy5jbG9qdXJlOmNvcmUuaW5jdWJhdG9yPC9pbmNsdWRlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPmlvLmRyb3B3aXphcmQubWV0cmljczoqPC9pbmNsdWRlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPm1ldHJpY3MtY2xvanVyZToqPC9pbmNsdWRlPgogICAgICAgICAgICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdFNldD4KLQogICAgICAgICAgICAgICAgICAgICA8cmVsb2NhdGlvbnM+CiAgICAgICAgICAgICAgICAgICAgICAgICA8cmVsb2NhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0dGVybj5jb20uZmFzdGVyeG1sLmphY2tzb24uY29yZTwvcGF0dGVybj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhZGVkUGF0dGVybj5jb20uZmFzdGVyeG1sLmphY2tzb24uc3Rvcm0uY29yZTwvc2hhZGVkUGF0dGVybj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0dGVybj5jaGVzaGlyZTwvcGF0dGVybj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhZGVkUGF0dGVybj5vcmcuYXBhY2hlLnN0b3JtLnNoYWRlLmNoZXNoaXJlPC9zaGFkZWRQYXR0ZXJuPgogICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWxvY2F0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgPHJlbG9jYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdHRlcm4+Y29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFmb3JtYXQ8L3BhdHRlcm4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYWRlZFBhdHRlcm4+Y29tLmZhc3RlcnhtbC5qYWNrc29uLnN0b3JtLmRhdGFmb3JtYXQ8L3NoYWRlZFBhdHRlcm4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdHRlcm4+Y2xvanVyZS50b29scy5sb2dnaW5nPC9wYXR0ZXJuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFkZWRQYXR0ZXJuPm9yZy5hcGFjaGUuc3Rvcm0uc2hhZGUuY2xvanVyZS50b29scy5sb2dnaW5nPC9zaGFkZWRQYXR0ZXJuPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWxvY2F0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlbG9jYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdHRlcm4+Y2xvanVyZS5jb3JlLmluY3ViYXRvcjwvcGF0dGVybj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhZGVkUGF0dGVybj5vcmcuYXBhY2hlLnN0b3JtLnNoYWRlLmNsb2p1cmUuY29yZS5pbmN1YmF0b3I8L3NoYWRlZFBhdHRlcm4+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlbG9jYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVsb2NhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0dGVybj5jbG9qdXJlLnRvb2xzLm5hbWVzcGFjZTwvcGF0dGVybj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhZGVkUGF0dGVybj5vcmcuYXBhY2hlLnN0b3JtLnNoYWRlLmNsb2p1cmUudG9vbHMubmFtZXNwYWNlPC9zaGFkZWRQYXR0ZXJuPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWxvY2F0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlbG9jYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdHRlcm4+Y2xvdXQ8L3BhdHRlcm4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYWRlZFBhdHRlcm4+b3JnLmFwYWNoZS5zdG9ybS5zaGFkZS5jbG91dDwvc2hhZGVkUGF0dGVybj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVsb2NhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWxvY2F0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXR0ZXJuPmNvbXBvanVyZTwvcGF0dGVybj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhZGVkUGF0dGVybj5vcmcuYXBhY2hlLnN0b3JtLnNoYWRlLmNvbXBvanVyZTwvc2hhZGVkUGF0dGVybj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVsb2NhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWxvY2F0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXR0ZXJuPm5zX3RyYWNrZXI8L3BhdHRlcm4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYWRlZFBhdHRlcm4+b3JnLmFwYWNoZS5zdG9ybS5zaGFkZS5uc190cmFja2VyPC9zaGFkZWRQYXR0ZXJuPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWxvY2F0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlbG9jYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdHRlcm4+bnMtdHJhY2tlcjwvcGF0dGVybj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhZGVkUGF0dGVybj5vcmcuYXBhY2hlLnN0b3JtLnNoYWRlLm5zLXRyYWNrZXI8L3NoYWRlZFBhdHRlcm4+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlbG9jYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVsb2NhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0dGVybj5oaWNjdXA8L3BhdHRlcm4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYWRlZFBhdHRlcm4+b3JnLmFwYWNoZS5zdG9ybS5zaGFkZS5oaWNjdXA8L3NoYWRlZFBhdHRlcm4+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlbG9jYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVsb2NhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0dGVybj5yaW5nPC9wYXR0ZXJuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFkZWRQYXR0ZXJuPm9yZy5hcGFjaGUuc3Rvcm0uc2hhZGUucmluZzwvc2hhZGVkUGF0dGVybj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVsb2NhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWxvY2F0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXR0ZXJuPmNsal90aW1lPC9wYXR0ZXJuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFkZWRQYXR0ZXJuPm9yZy5hcGFjaGUuc3Rvcm0uc2hhZGUuY2xqX3RpbWU8L3NoYWRlZFBhdHRlcm4+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlbG9jYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVsb2NhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0dGVybj5jbGotdGltZTwvcGF0dGVybj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhZGVkUGF0dGVybj5vcmcuYXBhY2hlLnN0b3JtLnNoYWRlLmNsai10aW1lPC9zaGFkZWRQYXR0ZXJuPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWxvY2F0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlbG9jYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdHRlcm4+Y29tLmZhc3RlcnhtbDwvcGF0dGVybj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhZGVkUGF0dGVybj5vcmcuYXBhY2hlLnN0b3JtLnNoYWRlLmNvbS5mYXN0ZXJ4bWw8L3NoYWRlZFBhdHRlcm4+CiAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlbG9jYXRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICA8cmVsb2NhdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0dGVybj5vcmcuYXBhY2hlLnRocmlmdDwvcGF0dGVybj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFRoaXMgcGF0dGVybiBpcyBpbmNvbnNpc3RlbnQgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHB1cnBvc2VzLiAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhZGVkUGF0dGVybj5vcmcuYXBhY2hlLnRocmlmdDc8L3NoYWRlZFBhdHRlcm4+CiAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlbG9jYXRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICA8cmVsb2NhdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0dGVybj5vcmcuamJvc3MubmV0dHk8L3BhdHRlcm4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYWRlZFBhdHRlcm4+b3JnLmFwYWNoZS5zdG9ybS5uZXR0eTwvc2hhZGVkUGF0dGVybj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhZGVkUGF0dGVybj5vcmcuYXBhY2hlLnN0b3JtLnNoYWRlLm9yZy5qYm9zcy5uZXR0eTwvc2hhZGVkUGF0dGVybj4KICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVsb2NhdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWxvY2F0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXR0ZXJuPmNvbS5nb29nbGUuY29tbW9uPC9wYXR0ZXJuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFkZWRQYXR0ZXJuPm9yZy5hcGFjaGUuc3Rvcm0uZ3VhdmE8L3NoYWRlZFBhdHRlcm4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYWRlZFBhdHRlcm4+b3JnLmFwYWNoZS5zdG9ybS5zaGFkZS5jb20uZ29vZ2xlLmNvbW1vbjwvc2hhZGVkUGF0dGVybj4KICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVsb2NhdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWxvY2F0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXR0ZXJuPmNvbS5nb29nbGUudGhpcmRwYXJ0eTwvcGF0dGVybj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhZGVkUGF0dGVybj5vcmcuYXBhY2hlLnN0b3JtLmd1YXZhLnRoaXJkcGFydHk8L3NoYWRlZFBhdHRlcm4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYWRlZFBhdHRlcm4+b3JnLmFwYWNoZS5zdG9ybS5zaGFkZS5jb20uZ29vZ2xlLnRoaXJkcGFydHk8L3NoYWRlZFBhdHRlcm4+CiAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlbG9jYXRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICA8cmVsb2NhdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0dGVybj5vcmcuYXBhY2hlLmh0dHA8L3BhdHRlcm4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYWRlZFBhdHRlcm4+b3JnLmFwYWNoZS5zdG9ybS5odHRwPC9zaGFkZWRQYXR0ZXJuPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWxvY2F0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPHJlbG9jYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdHRlcm4+b3JnLmFwYWNoZS56b29rZWVwZXI8L3BhdHRlcm4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYWRlZFBhdHRlcm4+b3JnLmFwYWNoZS5zdG9ybS56b29rZWVwZXI8L3NoYWRlZFBhdHRlcm4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYWRlZFBhdHRlcm4+b3JnLmFwYWNoZS5zdG9ybS5zaGFkZS5vcmcuYXBhY2hlLmh0dHA8L3NoYWRlZFBhdHRlcm4+CiAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlbG9jYXRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICA8cmVsb2NhdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0dGVybj5vcmcuYXBhY2hlLmN1cmF0b3I8L3BhdHRlcm4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYWRlZFBhdHRlcm4+b3JnLmFwYWNoZS5zdG9ybS5jdXJhdG9yPC9zaGFkZWRQYXR0ZXJuPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWxvY2F0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPHJlbG9jYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdHRlcm4+b3JnLmpib3NzLm5ldHR5PC9wYXR0ZXJuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFkZWRQYXR0ZXJuPm9yZy5hcGFjaGUuc3Rvcm0ubmV0dHk8L3NoYWRlZFBhdHRlcm4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3JlbG9jYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cmVsb2NhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0dGVybj5jb20uZ29vZ2xlLmNvbW1vbjwvcGF0dGVybj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhZGVkUGF0dGVybj5vcmcuYXBhY2hlLnN0b3JtLmd1YXZhPC9zaGFkZWRQYXR0ZXJuPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWxvY2F0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPHJlbG9jYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdHRlcm4+Y29tLmdvb2dsZS50aGlyZHBhcnR5PC9wYXR0ZXJuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFkZWRQYXR0ZXJuPm9yZy5hcGFjaGUuc3Rvcm0uZ3VhdmEudGhpcmRwYXJ0eTwvc2hhZGVkUGF0dGVybj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVsb2NhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxyZWxvY2F0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXR0ZXJuPm9yZy5hcGFjaGUuaHR0cDwvcGF0dGVybj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhZGVkUGF0dGVybj5vcmcuYXBhY2hlLnN0b3JtLmh0dHA8L3NoYWRlZFBhdHRlcm4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYWRlZFBhdHRlcm4+b3JnLmFwYWNoZS5zdG9ybS5zaGFkZS5vcmcuYXBhY2hlLmN1cmF0b3I8L3NoYWRlZFBhdHRlcm4+CiAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlbG9jYXRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICA8cmVsb2NhdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0dGVybj5vcmcuYXBhY2hlLnpvb2tlZXBlcjwvcGF0dGVybj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhZGVkUGF0dGVybj5vcmcuYXBhY2hlLnN0b3JtLnpvb2tlZXBlcjwvc2hhZGVkUGF0dGVybj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhZGVkUGF0dGVybj5vcmcuYXBhY2hlLnN0b3JtLnNoYWRlLm9yZy5hcGFjaGUuem9va2VlcGVyPC9zaGFkZWRQYXR0ZXJuPgogICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWxvY2F0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgPHJlbG9jYXRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdHRlcm4+b3JnLmFwYWNoZS5qdXRlPC9wYXR0ZXJuPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFkZWRQYXR0ZXJuPm9yZy5hcGFjaGUuc3Rvcm0uanV0ZTwvc2hhZGVkUGF0dGVybj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVsb2NhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxyZWxvY2F0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXR0ZXJuPm9yZy5hcGFjaGUuY3VyYXRvcjwvcGF0dGVybj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhZGVkUGF0dGVybj5vcmcuYXBhY2hlLnN0b3JtLmN1cmF0b3I8L3NoYWRlZFBhdHRlcm4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYWRlZFBhdHRlcm4+b3JnLmFwYWNoZS5zdG9ybS5zaGFkZS5vcmcuYXBhY2hlLmp1dGU8L3NoYWRlZFBhdHRlcm4+CiAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlbG9jYXRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICA8cmVsb2NhdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdHRlcm4+Y2FyYm9uaXRlPC9wYXR0ZXJuPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhZGVkUGF0dGVybj5vcmcuYXBhY2hlLnN0b3JtLmNhcmJvbml0ZTwvc2hhZGVkUGF0dGVybj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYWRlZFBhdHRlcm4+b3JnLmFwYWNoZS5zdG9ybS5zaGFkZS5jYXJib25pdGU8L3NoYWRlZFBhdHRlcm4+CiAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlbG9jYXRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICA8cmVsb2NhdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdHRlcm4+Y29tLnR3aXR0ZXIuY2hpbGw8L3BhdHRlcm4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFkZWRQYXR0ZXJuPm9yZy5hcGFjaGUuc3Rvcm0uY2hpbGw8L3NoYWRlZFBhdHRlcm4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3JlbG9jYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cmVsb2NhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdHRlcm4+b3JnLm9iamVuZXNpczwvcGF0dGVybj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYWRlZFBhdHRlcm4+b3JnLmFwYWNoZS5zdG9ybS5vYmplbmVzaXM8L3NoYWRlZFBhdHRlcm4+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFkZWRQYXR0ZXJuPm9yZy5hcGFjaGUuc3Rvcm0uc2hhZGUuY29tLnR3aXR0ZXIuY2hpbGw8L3NoYWRlZFBhdHRlcm4+CiAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlbG9jYXRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICA8cmVsb2NhdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdHRlcm4+b3JnLnR1a2FhbmkueHo8L3BhdHRlcm4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFkZWRQYXR0ZXJuPm9yZy5hcGFjaGUuc3Rvcm0ueHo8L3NoYWRlZFBhdHRlcm4+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFkZWRQYXR0ZXJuPm9yZy5hcGFjaGUuc3Rvcm0uc2hhZGUub3JnLnR1a2FhbmkueHo8L3NoYWRlZFBhdHRlcm4+CiAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlbG9jYXRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICA8cmVsb2NhdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdHRlcm4+b3JnLnlhbWwuc25ha2V5YW1sPC9wYXR0ZXJuPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhZGVkUGF0dGVybj5vcmcuYXBhY2hlLnN0b3JtLnNuYWtleWFtbDwvc2hhZGVkUGF0dGVybj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYWRlZFBhdHRlcm4+b3JnLmFwYWNoZS5zdG9ybS5zaGFkZS5vcmcueWFtbC5zbmFrZXlhbWw8L3NoYWRlZFBhdHRlcm4+CiAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlbG9jYXRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICA8cmVsb2NhdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdHRlcm4+b3JnLmpncmFwaHQ8L3BhdHRlcm4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFkZWRQYXR0ZXJuPm9yZy5hcGFjaGUuc3Rvcm0uamdyYXBodDwvc2hhZGVkUGF0dGVybj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYWRlZFBhdHRlcm4+b3JnLmFwYWNoZS5zdG9ybS5zaGFkZS5vcmcuamdyYXBodDwvc2hhZGVkUGF0dGVybj4KICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVsb2NhdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWxvY2F0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0dGVybj5vcmcuZnVzZXNvdXJjZTwvcGF0dGVybj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYWRlZFBhdHRlcm4+b3JnLmFwYWNoZS5zdG9ybS5mdXNlc291cmNlPC9zaGFkZWRQYXR0ZXJuPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhZGVkUGF0dGVybj5vcmcuYXBhY2hlLnN0b3JtLnNoYWRlLm9yZy5mdXNlc291cmNlPC9zaGFkZWRQYXR0ZXJuPgogICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWxvY2F0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgPHJlbG9jYXRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXR0ZXJuPmNvbS5tZXRhbXguaHR0cC5jbGllbnQ8L3BhdHRlcm4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFkZWRQYXR0ZXJuPm9yZy5hcGFjaGUuc3Rvcm0ubWV0YW14Lmh0dHAuY2xpZW50PC9zaGFkZWRQYXR0ZXJuPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhZGVkUGF0dGVybj5vcmcuYXBhY2hlLnN0b3JtLnNoYWRlLmNvbS5tZXRhbXguaHR0cC5jbGllbnQ8L3NoYWRlZFBhdHRlcm4+CiAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlbG9jYXRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICA8cmVsb2NhdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdHRlcm4+b3JnLmFwYWNoZS5jb21tb25zLmlvPC9wYXR0ZXJuPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhZGVkUGF0dGVybj5vcmcuYXBhY2hlLnN0b3JtLmNvbW1vbnMuaW88L3NoYWRlZFBhdHRlcm4+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFkZWRQYXR0ZXJuPm9yZy5hcGFjaGUuc3Rvcm0uc2hhZGUub3JnLmFwYWNoZS5jb21tb25zLmlvPC9zaGFkZWRQYXR0ZXJuPgogICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWxvY2F0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgPHJlbG9jYXRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXR0ZXJuPm9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYzwvcGF0dGVybj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYWRlZFBhdHRlcm4+b3JnLmFwYWNoZS5zdG9ybS5jb21tb25zLmNvZGVjPC9zaGFkZWRQYXR0ZXJuPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhZGVkUGF0dGVybj5vcmcuYXBhY2hlLnN0b3JtLnNoYWRlLm9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYzwvc2hhZGVkUGF0dGVybj4KICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVsb2NhdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWxvY2F0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0dGVybj5vcmcuYXBhY2hlLmNvbW1vbnMuZmlsZXVwbG9hZDwvcGF0dGVybj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYWRlZFBhdHRlcm4+b3JnLmFwYWNoZS5zdG9ybS5jb21tb25zLmZpbGV1cGxvYWQ8L3NoYWRlZFBhdHRlcm4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L3JlbG9jYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cmVsb2NhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdHRlcm4+b3JnLmFwYWNoZS5jb21tb25zLmNvbXByZXNzPC9wYXR0ZXJuPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhZGVkUGF0dGVybj5vcmcuYXBhY2hlLnN0b3JtLmNvbW1vbnMuY29tcHJlc3M8L3NoYWRlZFBhdHRlcm4+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFkZWRQYXR0ZXJuPm9yZy5hcGFjaGUuc3Rvcm0uc2hhZGUub3JnLmFwYWNoZS5jb21tb25zLmZpbGV1cGxvYWQ8L3NoYWRlZFBhdHRlcm4+CiAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlbG9jYXRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICA8cmVsb2NhdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdHRlcm4+b3JnLmFwYWNoZS5jb21tb25zLmV4ZWM8L3BhdHRlcm4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFkZWRQYXR0ZXJuPm9yZy5hcGFjaGUuc3Rvcm0uY29tbW9ucy5leGVjPC9zaGFkZWRQYXR0ZXJuPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhZGVkUGF0dGVybj5vcmcuYXBhY2hlLnN0b3JtLnNoYWRlLm9yZy5hcGFjaGUuY29tbW9ucy5leGVjPC9zaGFkZWRQYXR0ZXJuPgogICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWxvY2F0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgPHJlbG9jYXRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXR0ZXJuPm9yZy5hcGFjaGUuY29tbW9ucy5sYW5nPC9wYXR0ZXJuPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhZGVkUGF0dGVybj5vcmcuYXBhY2hlLnN0b3JtLmNvbW1vbnMubGFuZzwvc2hhZGVkUGF0dGVybj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYWRlZFBhdHRlcm4+b3JnLmFwYWNoZS5zdG9ybS5zaGFkZS5vcmcuYXBhY2hlLmNvbW1vbnMubGFuZzwvc2hhZGVkUGF0dGVybj4KICAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVsb2NhdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWxvY2F0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0dGVybj5vcmcuanNvbi5zaW1wbGU8L3BhdHRlcm4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFkZWRQYXR0ZXJuPm9yZy5hcGFjaGUuc3Rvcm0uanNvbi5zaW1wbGU8L3NoYWRlZFBhdHRlcm4+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFkZWRQYXR0ZXJuPm9yZy5hcGFjaGUuc3Rvcm0uc2hhZGUub3JnLmpzb24uc2ltcGxlPC9zaGFkZWRQYXR0ZXJuPgogICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWxvY2F0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgPHJlbG9jYXRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXR0ZXJuPmNsb2p1cmUubWF0aDwvcGF0dGVybj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYWRlZFBhdHRlcm4+b3JnLmFwYWNoZS5zdG9ybS5jbG9qdXJlLm1hdGg8L3NoYWRlZFBhdHRlcm4+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFkZWRQYXR0ZXJuPm9yZy5hcGFjaGUuc3Rvcm0uc2hhZGUuY2xvanVyZS5tYXRoPC9zaGFkZWRQYXR0ZXJuPgogICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWxvY2F0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgPHJlbG9jYXRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXR0ZXJuPmNsb2p1cmUudG9vbHMuY2xpPC9wYXR0ZXJuPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhZGVkUGF0dGVybj5vcmcuYXBhY2hlLnN0b3JtLmNsb2p1cmUudG9vbHMuY2xpPC9zaGFkZWRQYXR0ZXJuPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhZGVkUGF0dGVybj5vcmcuYXBhY2hlLnN0b3JtLnNoYWRlLmNsb2p1cmUudG9vbHMuY2xpPC9zaGFkZWRQYXR0ZXJuPgogICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWxvY2F0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgPHJlbG9jYXRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXR0ZXJuPmNsanMudG9vbHMuY2xpPC9wYXR0ZXJuPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhZGVkUGF0dGVybj5vcmcuYXBhY2hlLnN0b3JtLmNsanMudG9vbHMuY2xpPC9zaGFkZWRQYXR0ZXJuPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhZGVkUGF0dGVybj5vcmcuYXBhY2hlLnN0b3JtLnNoYWRlLmNsanMudG9vbHMuY2xpPC9zaGFkZWRQYXR0ZXJuPgogICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWxvY2F0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgPHJlbG9jYXRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXR0ZXJuPmNsb2p1cmUudG9vbHMubWFjcm88L3BhdHRlcm4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFkZWRQYXR0ZXJuPm9yZy5hcGFjaGUuc3Rvcm0uY2xvanVyZS50b29scy5tYWNybzwvc2hhZGVkUGF0dGVybj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYWRlZFBhdHRlcm4+b3JnLmFwYWNoZS5zdG9ybS5zaGFkZS5jbG9qdXJlLnRvb2xzLm1hY3JvPC9zaGFkZWRQYXR0ZXJuPgogICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWxvY2F0aW9uPgogICAgICAgICAgICAgICAgICAgICAgICAgPHJlbG9jYXRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXR0ZXJuPm9yZy5qb2RhLnRpbWU8L3BhdHRlcm4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFkZWRQYXR0ZXJuPm9yZy5hcGFjaGUuc3Rvcm0uam9kYS50aW1lPC9zaGFkZWRQYXR0ZXJuPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhZGVkUGF0dGVybj5vcmcuYXBhY2hlLnN0b3JtLnNoYWRlLm9yZy5qb2RhLnRpbWU8L3NoYWRlZFBhdHRlcm4+CiAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlbG9jYXRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICA8cmVsb2NhdGlvbj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdHRlcm4+b3JnLmVjbGlwc2UuamV0dHk8L3BhdHRlcm4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFkZWRQYXR0ZXJuPm9yZy5hcGFjaGUuc3Rvcm0uamV0dHk8L3NoYWRlZFBhdHRlcm4+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFkZWRQYXR0ZXJuPm9yZy5hcGFjaGUuc3Rvcm0uc2hhZGUub3JnLmVjbGlwc2UuamV0dHk8L3NoYWRlZFBhdHRlcm4+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlbG9jYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVsb2NhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0dGVybj5jb20uY29kYWhhbGUubWV0cmljczwvcGF0dGVybj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhZGVkUGF0dGVybj5vcmcuYXBhY2hlLnN0b3JtLnNoYWRlLmNvbS5jb2RhaGFsZS5tZXRyaWNzPC9zaGFkZWRQYXR0ZXJuPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWxvY2F0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlbG9jYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdHRlcm4+bWV0cmljcy5jb3JlPC9wYXR0ZXJuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFkZWRQYXR0ZXJuPm9yZy5hcGFjaGUuc3Rvcm0uc2hhZGUubWV0cmljcy5jb3JlPC9zaGFkZWRQYXR0ZXJuPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWxvY2F0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlbG9jYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdHRlcm4+bWV0cmljcy5jb3VudGVyczwvcGF0dGVybj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhZGVkUGF0dGVybj5vcmcuYXBhY2hlLnN0b3JtLnNoYWRlLm1ldHJpY3MuY291bnRlcnM8L3NoYWRlZFBhdHRlcm4+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlbG9jYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVsb2NhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0dGVybj5tZXRyaWNzLmdhdWdlczwvcGF0dGVybj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhZGVkUGF0dGVybj5vcmcuYXBhY2hlLnN0b3JtLnNoYWRlLm1ldHJpY3MuZ2F1Z2VzPC9zaGFkZWRQYXR0ZXJuPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWxvY2F0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlbG9jYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdHRlcm4+bWV0cmljcy5oaXN0b2dyYW1zPC9wYXR0ZXJuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFkZWRQYXR0ZXJuPm9yZy5hcGFjaGUuc3Rvcm0uc2hhZGUubWV0cmljcy5oaXN0b2dyYW1zPC9zaGFkZWRQYXR0ZXJuPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWxvY2F0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlbG9jYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdHRlcm4+bWV0cmljcy5tZXRlcnM8L3BhdHRlcm4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYWRlZFBhdHRlcm4+b3JnLmFwYWNoZS5zdG9ybS5zaGFkZS5tZXRyaWNzLm1ldGVyczwvc2hhZGVkUGF0dGVybj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcmVsb2NhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyZWxvY2F0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXR0ZXJuPm1ldHJpY3MucmVwb3J0ZXJzPC9wYXR0ZXJuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaGFkZWRQYXR0ZXJuPm9yZy5hcGFjaGUuc3Rvcm0uc2hhZGUubWV0cmljcy5yZXBvcnRlcnM8L3NoYWRlZFBhdHRlcm4+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlbG9jYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVsb2NhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0dGVybj5tZXRyaWNzLnRpbWVyczwvcGF0dGVybj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhZGVkUGF0dGVybj5vcmcuYXBhY2hlLnN0b3JtLnNoYWRlLm1ldHJpY3MudGltZXJzPC9zaGFkZWRQYXR0ZXJuPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWxvY2F0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlbG9jYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdHRlcm4+bWV0cmljcy51dGlsczwvcGF0dGVybj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhZGVkUGF0dGVybj5vcmcuYXBhY2hlLnN0b3JtLnNoYWRlLm1ldHJpY3MudXRpbHM8L3NoYWRlZFBhdHRlcm4+CiAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlbG9jYXRpb24+CiAgICAgICAgICAgICAgICAgICAgIDwvcmVsb2NhdGlvbnM+CiAgICAgICAgICAgICAgICAgICAgIDx0cmFuc2Zvcm1lcnM+CiAgICAgICAgICAgICAgICAgICAgICAgICA8dHJhbnNmb3JtZXIgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUuc3Rvcm0ubWF2ZW4uc2hhZGUuY2xvanVyZS5DbG9qdXJlVHJhbnNmb3JtZXIiIC8+CiAgICAgICAgICAgICAgICAgICAgIDwvdHJhbnNmb3JtZXJzPgogICAgICAgICAgICAgICAgICAgICA8ZmlsdGVycz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU2V2ZXJhbCBvZiB0aGVzZSBmaWx0ZXJzIHJlbW92ZSB0aGUgLmNsaiBmaWxlcyBmcm9tIHRoZSBzaGFkZWQgZGVwZW5kZW5jaWVzLCBldmVuIHRob3VnaCBvbmx5IC5jbGogZmlsZXMgYXJlIGluIHRoZXNlIGphcnMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSByZWFzb24gZm9yIHRoaXMgaXMgYSBiaXQgY29tcGxleCwgYnV0IGludGVudGlvbmFsLiAgRHVyaW5nIHRoZSBidWlsZCBwcm9jZXNzIGFsbCBvZiB0aGUgZGVwZW5kZW5jeSAuY2xqIGZpbGVzIGFyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlZCBkb3duIGludG8gLmNsYXNzIGZpbGVzLCBhbmQgaW5jbHVkZWQgaW4gc3Rvcm0tY29yZS5qYXIuICBUaGUgcmVndWxhciBzaGFkZSB0cmFuc2Zvcm1lciBoYW5kbGVzIHRoZXNlIGluIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbWFqb3JpdHkgb2YgY2FzZXMgY29ycmVjdGx5LiAgSG93ZXZlciwgdGhlIENsb2p1cmUtVHJhbnNmb3JtZXIgZG9lcyBub3Qgc2hhZGUgZXZlcnl0aGluZyBjb3JyZWN0bHkgYWxsIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lLiAgSW5zdGVhZCBvZiBzcGVuZGluZyBhIGxvdCBvZiB0aW1lIHRvIGdldCB0aGUgQ2xvanVyZS1UcmFuc2Zvcm1lciB0byBwYXJzZSBDbG9qdXJlIGNvcnJlY3RseSB3ZSBvcHRlZCB0byByZW1vdmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIC5jbGogZmlsZXMgZnJvbSB0aGUgdWJlciBqYXIuIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgPGZpbHRlcj48YXJ0aWZhY3Q+bWV0cmljcy1jbG9qdXJlOio8L2FydGlmYWN0PjxleGNsdWRlcz48ZXhjbHVkZT4qKi8qLmNsajwvZXhjbHVkZT48L2V4Y2x1ZGVzPjwvZmlsdGVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPGZpbHRlcj48YXJ0aWZhY3Q+b3JnLmNsb2p1cmU6Y29yZS5pbmN1YmF0b3I8L2FydGlmYWN0PjxleGNsdWRlcz48ZXhjbHVkZT4qKi8qLmNsajwvZXhjbHVkZT48L2V4Y2x1ZGVzPjwvZmlsdGVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPGZpbHRlcj48YXJ0aWZhY3Q+Y2hlc2hpcmU6Y2hlc2hpcmU8L2FydGlmYWN0PjxleGNsdWRlcz48ZXhjbHVkZT4qKi8qLmNsajwvZXhjbHVkZT48L2V4Y2x1ZGVzPjwvZmlsdGVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPGZpbHRlcj48YXJ0aWZhY3Q+b3JnLmNsb2p1cmU6dG9vbHMubG9nZ2luZzwvYXJ0aWZhY3Q+PGV4Y2x1ZGVzPjxleGNsdWRlPioqLyouY2xqPC9leGNsdWRlPjwvZXhjbHVkZXM+PC9maWx0ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsdGVyPjxhcnRpZmFjdD5vcmcuY2xvanVyZTp0b29scy5uYW1lc3BhY2U8L2FydGlmYWN0PjxleGNsdWRlcz48ZXhjbHVkZT4qKi8qLmNsajwvZXhjbHVkZT48L2V4Y2x1ZGVzPjwvZmlsdGVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPGZpbHRlcj48YXJ0aWZhY3Q+b3JnLmNsb2p1cmU6bWF0aC5udW1lcmljLXRvd2VyPC9hcnRpZmFjdD48ZXhjbHVkZXM+PGV4Y2x1ZGU+KiovKi5jbGo8L2V4Y2x1ZGU+PC9leGNsdWRlcz48L2ZpbHRlcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxmaWx0ZXI+PGFydGlmYWN0Pm9yZy5jbG9qdXJlOnRvb2xzLm1hY3JvPC9hcnRpZmFjdD48ZXhjbHVkZXM+PGV4Y2x1ZGU+KiovKi5jbGo8L2V4Y2x1ZGU+PC9leGNsdWRlcz48L2ZpbHRlcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxmaWx0ZXI+PGFydGlmYWN0Pm9yZy5jbG9qdXJlOnRvb2xzLmNsaTwvYXJ0aWZhY3Q+PGV4Y2x1ZGVzPjxleGNsdWRlPioqLyouY2xqPC9leGNsdWRlPjwvZXhjbHVkZXM+PC9maWx0ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsdGVyPjxhcnRpZmFjdD5ucy10cmFja2VyOm5zLXRyYWNrZXI8L2FydGlmYWN0PjxleGNsdWRlcz48ZXhjbHVkZT4qKi8qLmNsajwvZXhjbHVkZT48L2V4Y2x1ZGVzPjwvZmlsdGVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPGZpbHRlcj48YXJ0aWZhY3Q+Y2xvdXQ6Y2xvdXQ8L2FydGlmYWN0PjxleGNsdWRlcz48ZXhjbHVkZT4qKi8qLmNsajwvZXhjbHVkZT48L2V4Y2x1ZGVzPjwvZmlsdGVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPGZpbHRlcj48YXJ0aWZhY3Q+aGljY3VwOmhpY2N1cDwvYXJ0aWZhY3Q+PGV4Y2x1ZGVzPjxleGNsdWRlPioqLyouY2xqPC9leGNsdWRlPjwvZXhjbHVkZXM+PC9maWx0ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsdGVyPjxhcnRpZmFjdD5jbGotdGltZTpjbGotdGltZTwvYXJ0aWZhY3Q+PGV4Y2x1ZGVzPjxleGNsdWRlPioqLyouY2xqPC9leGNsdWRlPjwvZXhjbHVkZXM+PC9maWx0ZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsdGVyPjxhcnRpZmFjdD5yaW5nOio8L2FydGlmYWN0PjxleGNsdWRlcz48ZXhjbHVkZT4qKi8qLmNsajwvZXhjbHVkZT48L2V4Y2x1ZGVzPjwvZmlsdGVyPgorICAgICAgICAgICAgICAgICAgICAgICAgPGZpbHRlcj48YXJ0aWZhY3Q+Y29tcG9qdXJlOmNvbXBvanVyZTwvYXJ0aWZhY3Q+PGV4Y2x1ZGVzPjxleGNsdWRlPioqLyouY2xqPC9leGNsdWRlPjwvZXhjbHVkZXM+PC9maWx0ZXI+CiAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsdGVyPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdD5vcmcuYXBhY2hlLnRocmlmdDoqPC9hcnRpZmFjdD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+CkBAIC01NjIsNDggKzY5MywxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+CiAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbHRlcj4KICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWx0ZXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0PmNvbW1vbnMtaHR0cGNsaWVudDpjb21tb25zLWh0dHBjbGllbnQ8L2FydGlmYWN0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+TUVUQS1JTkYvTElDRU5TRS50eHQ8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPk1FVEEtSU5GL05PVElDRS50eHQ8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPk1FVEEtSU5GL1JFQURNRS50eHQ8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsdGVyPgotICAgICAgICAgICAgICAgICAgICAgICAgPGZpbHRlcj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3Q+b3JnLmFwYWNoZS56b29rZWVwZXI6em9va2VlcGVyPC9hcnRpZmFjdD4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPkxJQ0VOU0UudHh0PC9leGNsdWRlPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+CiAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbHRlcj4KICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWx0ZXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0PmNvbW1vbnMtaHR0cGNsaWVudDpjb21tb25zLWh0dHBjbGllbnQ8L2FydGlmYWN0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+TUVUQS1JTkYvTElDRU5TRS50eHQ8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPk1FVEEtSU5GL05PVElDRS50eHQ8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPk1FVEEtSU5GL1JFQURNRS50eHQ8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsdGVyPgotICAgICAgICAgICAgICAgICAgICAgICAgPGZpbHRlcj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3Q+b3JnLmFwYWNoZS56b29rZWVwZXI6em9va2VlcGVyPC9hcnRpZmFjdD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPkxJQ0VOU0UudHh0PC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbHRlcj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxmaWx0ZXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0Pm9yZy5vYmplbmVzaXM6b2JqZW5lc2lzPC9hcnRpZmFjdD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPk1FVEEtSU5GL0xJQ0VOU0UudHh0PC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT5NRVRBLUlORi9OT1RJQ0UudHh0PC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbHRlcj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxmaWx0ZXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0Pm9yZy5hcGFjaGUuY29tbW9uczpjb21tb25zLWNvbXByZXNzPC9hcnRpZmFjdD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPk1FVEEtSU5GL0xJQ0VOU0UudHh0PC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT5NRVRBLUlORi9OT1RJQ0UudHh0PC9leGNsdWRlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbHRlcj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxmaWx0ZXI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0Pm9yZy5hcGFjaGUuY29tbW9uczpjb21tb25zLWV4ZWM8L2FydGlmYWN0PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+TUVUQS1JTkYvTElDRU5TRS50eHQ8L2V4Y2x1ZGU+CkBAIC03NDAsNiArODM1LDE4IEBACiAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgogICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamFyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjY8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+dGVzdC1qYXI8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICA8L3BsdWdpbj4KICAgICAgICAgPC9wbHVnaW5zPgogICAgIDwvYnVpbGQ+CiAKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2Nsai9iYWNrdHlwZS9zdG9ybS9jbHVzdGVyLmNsaiBiL3N0b3JtLWNvcmUvc3JjL2Nsai9iYWNrdHlwZS9zdG9ybS9jbHVzdGVyLmNsagppbmRleCA5OWZiNDllLi4zNWFhOGM4IDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9jbGovYmFja3R5cGUvc3Rvcm0vY2x1c3Rlci5jbGoKKysrIGIvc3Rvcm0tY29yZS9zcmMvY2xqL2JhY2t0eXBlL3N0b3JtL2NsdXN0ZXIuY2xqCkBAIC0xNiwxMiArMTYsMTMgQEAKIAogKG5zIGJhY2t0eXBlLnN0b3JtLmNsdXN0ZXIKICAgKDppbXBvcnQgW29yZy5hcGFjaGUuem9va2VlcGVyLmRhdGEgU3RhdCBBQ0wgSWRdCi0gICAgICAgICAgIFtiYWNrdHlwZS5zdG9ybS5nZW5lcmF0ZWQgU3VwZXJ2aXNvckluZm8gQXNzaWdubWVudCBTdG9ybUJhc2UgQ2x1c3RlcldvcmtlckhlYXJ0YmVhdCBFcnJvckluZm8gQ3JlZGVudGlhbHMgTmltYnVzU3VtbWFyeV0KKyAgICAgICAgICAgW2JhY2t0eXBlLnN0b3JtLmdlbmVyYXRlZCBTdXBlcnZpc29ySW5mbyBBc3NpZ25tZW50IFN0b3JtQmFzZSBDbHVzdGVyV29ya2VySGVhcnRiZWF0IEVycm9ySW5mbyBDcmVkZW50aWFscyBOaW1idXNTdW1tYXJ5CisgICAgICAgICAgICBMb2dDb25maWcgUHJvZmlsZUFjdGlvbiBQcm9maWxlUmVxdWVzdCBOb2RlSW5mb10KICAgICAgICAgICAgW2phdmEuaW8gU2VyaWFsaXphYmxlXSkKICAgKDppbXBvcnQgW29yZy5hcGFjaGUuem9va2VlcGVyIEtlZXBlckV4Y2VwdGlvbiBLZWVwZXJFeGNlcHRpb24kTm9Ob2RlRXhjZXB0aW9uIFpvb0RlZnMgWm9vRGVmcyRJZHMgWm9vRGVmcyRQZXJtc10pCi0gICg6aW1wb3J0IFtvcmcuYXBhY2hlLmN1cmF0b3IuZnJhbWV3b3JrLnN0YXRlIENvbm5lY3Rpb25TdGF0ZUxpc3RlbmVyIENvbm5lY3Rpb25TdGF0ZV0pCiAgICg6aW1wb3J0IFtvcmcuYXBhY2hlLmN1cmF0b3IuZnJhbWV3b3JrIEN1cmF0b3JGcmFtZXdvcmtdKQogICAoOmltcG9ydCBbYmFja3R5cGUuc3Rvcm0udXRpbHMgVXRpbHNdKQorICAoOmltcG9ydCBbYmFja3R5cGUuc3Rvcm0uY2x1c3RlciBDbHVzdGVyU3RhdGUgQ2x1c3RlclN0YXRlQ29udGV4dCBDbHVzdGVyU3RhdGVMaXN0ZW5lciBDb25uZWN0aW9uU3RhdGVdKQogICAoOmltcG9ydCBbamF2YS5zZWN1cml0eSBNZXNzYWdlRGlnZXN0XSkKICAgKDppbXBvcnQgW29yZy5hcGFjaGUuem9va2VlcGVyLnNlcnZlci5hdXRoIERpZ2VzdEF1dGhlbnRpY2F0aW9uUHJvdmlkZXJdKQogICAoOmltcG9ydCBbYmFja3R5cGUuc3Rvcm0ubmltYnVzIE5pbWJ1c0luZm9dKQpAQCAtMjksMTI4ICszMCwyMiBAQAogICAoOnJlcXVpcmUgW2JhY2t0eXBlLnN0b3JtIFt6b29rZWVwZXIgOmFzIHprXV0pCiAgICg6cmVxdWlyZSBbYmFja3R5cGUuc3Rvcm0uZGFlbW9uIFtjb21tb24gOmFzIGNvbW1vbl1dKSkKIAotKGRlZnByb3RvY29sIENsdXN0ZXJTdGF0ZQotICAoc2V0LWVwaGVtZXJhbC1ub2RlIFt0aGlzIHBhdGggZGF0YSBhY2xzXSkKLSAgKGRlbGV0ZS1ub2RlIFt0aGlzIHBhdGhdKQotICAoY3JlYXRlLXNlcXVlbnRpYWwgW3RoaXMgcGF0aCBkYXRhIGFjbHNdKQotICA7OyBpZiBub2RlIGRvZXMgbm90IGV4aXN0LCBjcmVhdGUgcGVyc2lzdGVudCB3aXRoIHRoaXMgZGF0YQotICAoc2V0LWRhdGEgW3RoaXMgcGF0aCBkYXRhIGFjbHNdKQotICAoZ2V0LWRhdGEgW3RoaXMgcGF0aCB3YXRjaD9dKQotICAoZ2V0LXZlcnNpb24gW3RoaXMgcGF0aCB3YXRjaD9dKQotICAoZ2V0LWRhdGEtd2l0aC12ZXJzaW9uIFt0aGlzIHBhdGggd2F0Y2g/XSkKLSAgKGdldC1jaGlsZHJlbiBbdGhpcyBwYXRoIHdhdGNoP10pCi0gIChta2RpcnMgW3RoaXMgcGF0aCBhY2xzXSkKLSAgKGV4aXN0cy1ub2RlPyBbdGhpcyBwYXRoIHdhdGNoP10pCi0gIChjbG9zZSBbdGhpc10pCi0gIChyZWdpc3RlciBbdGhpcyBjYWxsYmFja10pCi0gICh1bnJlZ2lzdGVyIFt0aGlzIGlkXSkKLSAgKGFkZC1saXN0ZW5lciBbdGhpcyBsaXN0ZW5lcl0pCi0gIChzeW5jLXBhdGggW3RoaXMgcGF0aF0pKQotCiAoZGVmbiBtay10b3BvLW9ubHktYWNscwogICBbdG9wby1jb25mXQogICAobGV0IFtwYXlsb2FkICguZ2V0IHRvcG8tY29uZiBTVE9STS1aT09LRUVQRVItVE9QT0xPR1ktQVVUSC1QQVlMT0FEKV0KICAgICAod2hlbiAoVXRpbHMvaXNaa0F1dGhlbnRpY2F0aW9uQ29uZmlndXJlZFRvcG9sb2d5IHRvcG8tY29uZikKICAgICAgIFsoZmlyc3QgWm9vRGVmcyRJZHMvQ1JFQVRPUl9BTExfQUNMKQogICAgICAgIChBQ0wuIFpvb0RlZnMkUGVybXMvUkVBRCAoSWQuICJkaWdlc3QiIChEaWdlc3RBdXRoZW50aWNhdGlvblByb3ZpZGVyL2dlbmVyYXRlRGlnZXN0IHBheWxvYWQpKSldKSkpCi0KKyAKIChkZWZuayBtay1kaXN0cmlidXRlZC1jbHVzdGVyLXN0YXRlCi0gIFtjb25mIDphdXRoLWNvbmYgbmlsIDphY2xzIG5pbF0KLSAgKGxldCBbemsgKHprL21rLWNsaWVudCBjb25mIChjb25mIFNUT1JNLVpPT0tFRVBFUi1TRVJWRVJTKSAoY29uZiBTVE9STS1aT09LRUVQRVItUE9SVCkgOmF1dGgtY29uZiBhdXRoLWNvbmYpXQotICAgICh6ay9ta2RpcnMgemsgKGNvbmYgU1RPUk0tWk9PS0VFUEVSLVJPT1QpIGFjbHMpCi0gICAgKC5jbG9zZSB6aykpCi0gIChsZXQgW2NhbGxiYWNrcyAoYXRvbSB7fSkKLSAgICAgICAgYWN0aXZlIChhdG9tIHRydWUpCi0gICAgICAgIHprICh6ay9tay1jbGllbnQgY29uZgotICAgICAgICAgICAgICAgICAgICAgICAgIChjb25mIFNUT1JNLVpPT0tFRVBFUi1TRVJWRVJTKQotICAgICAgICAgICAgICAgICAgICAgICAgIChjb25mIFNUT1JNLVpPT0tFRVBFUi1QT1JUKQotICAgICAgICAgICAgICAgICAgICAgICAgIDphdXRoLWNvbmYgYXV0aC1jb25mCi0gICAgICAgICAgICAgICAgICAgICAgICAgOnJvb3QgKGNvbmYgU1RPUk0tWk9PS0VFUEVSLVJPT1QpCi0gICAgICAgICAgICAgICAgICAgICAgICAgOndhdGNoZXIgKGZuIFtzdGF0ZSB0eXBlIHBhdGhdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2hlbiBAYWN0aXZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aGVuLW5vdCAoPSA6Y29ubmVjdGVkIHN0YXRlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb2ctd2FybiAiUmVjZWl2ZWQgZXZlbnQgIiBzdGF0ZSAiOiIgdHlwZSAiOiIgcGF0aCAiIHdpdGggZGlzY29ubmVjdGVkIFpvb2tlZXBlci4iKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdoZW4tbm90ICg9IDpub25lIHR5cGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRvc2VxIFtjYWxsYmFjayAodmFscyBAY2FsbGJhY2tzKV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjYWxsYmFjayB0eXBlIHBhdGgpKSkpKSldCi0gICAgKHJlaWZ5Ci0gICAgIENsdXN0ZXJTdGF0ZQotCi0gICAgIChyZWdpc3RlcgotICAgICAgIFt0aGlzIGNhbGxiYWNrXQotICAgICAgIChsZXQgW2lkICh1dWlkKV0KLSAgICAgICAgIChzd2FwISBjYWxsYmFja3MgYXNzb2MgaWQgY2FsbGJhY2spCi0gICAgICAgICBpZCkpCi0KLSAgICAgKHVucmVnaXN0ZXIKLSAgICAgICBbdGhpcyBpZF0KLSAgICAgICAoc3dhcCEgY2FsbGJhY2tzIGRpc3NvYyBpZCkpCi0KLSAgICAgKHNldC1lcGhlbWVyYWwtbm9kZQotICAgICAgIFt0aGlzIHBhdGggZGF0YSBhY2xzXQotICAgICAgICh6ay9ta2RpcnMgemsgKHBhcmVudC1wYXRoIHBhdGgpIGFjbHMpCi0gICAgICAgKGlmICh6ay9leGlzdHMgemsgcGF0aCBmYWxzZSkKLSAgICAgICAgICh0cnktY2F1c2UKLSAgICAgICAgICAgKHprL3NldC1kYXRhIHprIHBhdGggZGF0YSkgOyBzaG91bGQgdmVyaWZ5IHRoYXQgaXQncyBlcGhlbWVyYWwKLSAgICAgICAgICAgKGNhdGNoIEtlZXBlckV4Y2VwdGlvbiROb05vZGVFeGNlcHRpb24gZQotICAgICAgICAgICAgIChsb2ctd2Fybi1lcnJvciBlICJFcGhlbWVyYWwgbm9kZSBkaXNhcHBlYXJlZCBiZXR3ZWVuIGNoZWNraW5nIGZvciBleGlzdGluZyBhbmQgc2V0dGluZyBkYXRhIikKLSAgICAgICAgICAgICAoemsvY3JlYXRlLW5vZGUgemsgcGF0aCBkYXRhIDplcGhlbWVyYWwgYWNscykpKQotICAgICAgICAgKHprL2NyZWF0ZS1ub2RlIHprIHBhdGggZGF0YSA6ZXBoZW1lcmFsIGFjbHMpKSkKLQotICAgICAoY3JlYXRlLXNlcXVlbnRpYWwKLSAgICAgICBbdGhpcyBwYXRoIGRhdGEgYWNsc10KLSAgICAgICAoemsvY3JlYXRlLW5vZGUgemsgcGF0aCBkYXRhIDpzZXF1ZW50aWFsIGFjbHMpKQotCi0gICAgIChzZXQtZGF0YQotICAgICAgIFt0aGlzIHBhdGggZGF0YSBhY2xzXQotICAgICAgIDs7IG5vdGU6IHRoaXMgZG9lcyBub3QgdHVybiBvZmYgYW55IGV4aXN0aW5nIHdhdGNoZXMKLSAgICAgICAoaWYgKHprL2V4aXN0cyB6ayBwYXRoIGZhbHNlKQotICAgICAgICAgKHprL3NldC1kYXRhIHprIHBhdGggZGF0YSkKLSAgICAgICAgIChkbwotICAgICAgICAgICAoemsvbWtkaXJzIHprIChwYXJlbnQtcGF0aCBwYXRoKSBhY2xzKQotICAgICAgICAgICAoemsvY3JlYXRlLW5vZGUgemsgcGF0aCBkYXRhIDpwZXJzaXN0ZW50IGFjbHMpKSkpCi0KLSAgICAgKGRlbGV0ZS1ub2RlCi0gICAgICAgW3RoaXMgcGF0aF0KLSAgICAgICAoemsvZGVsZXRlLW5vZGUgemsgcGF0aCkpCi0KLSAgICAgKGdldC1kYXRhCi0gICAgICAgW3RoaXMgcGF0aCB3YXRjaD9dCi0gICAgICAgKHprL2dldC1kYXRhIHprIHBhdGggd2F0Y2g/KSkKLQotICAgICAoZ2V0LWRhdGEtd2l0aC12ZXJzaW9uCi0gICAgICAgW3RoaXMgcGF0aCB3YXRjaD9dCi0gICAgICAgKHprL2dldC1kYXRhLXdpdGgtdmVyc2lvbiB6ayBwYXRoIHdhdGNoPykpCi0KLSAgICAgKGdldC12ZXJzaW9uIAotICAgICAgIFt0aGlzIHBhdGggd2F0Y2g/XQotICAgICAgICh6ay9nZXQtdmVyc2lvbiB6ayBwYXRoIHdhdGNoPykpCi0KLSAgICAgKGdldC1jaGlsZHJlbgotICAgICAgIFt0aGlzIHBhdGggd2F0Y2g/XQotICAgICAgICh6ay9nZXQtY2hpbGRyZW4gemsgcGF0aCB3YXRjaD8pKQotCi0gICAgIChta2RpcnMKLSAgICAgICBbdGhpcyBwYXRoIGFjbHNdCi0gICAgICAgKHprL21rZGlycyB6ayBwYXRoIGFjbHMpKQotCi0gICAgIChleGlzdHMtbm9kZT8KLSAgICAgICBbdGhpcyBwYXRoIHdhdGNoP10KLSAgICAgICAoemsvZXhpc3RzLW5vZGU/IHprIHBhdGggd2F0Y2g/KSkKLQotICAgICAoY2xvc2UKLSAgICAgICBbdGhpc10KLSAgICAgICAocmVzZXQhIGFjdGl2ZSBmYWxzZSkKLSAgICAgICAoLmNsb3NlIHprKSkKLQotICAgICAgKGFkZC1saXN0ZW5lcgotICAgICAgICBbdGhpcyBsaXN0ZW5lcl0KLSAgICAgICAgKHprL2FkZC1saXN0ZW5lciB6ayBsaXN0ZW5lcikpCi0KLSAgICAgIChzeW5jLXBhdGgKLSAgICAgICAgW3RoaXMgcGF0aF0KLSAgICAgICAgKHprL3N5bmMtcGF0aCB6ayBwYXRoKSkKLSAgICAgICkpKQorICBbY29uZiA6YXV0aC1jb25mIG5pbCA6YWNscyBuaWwgOmNvbnRleHQgKENsdXN0ZXJTdGF0ZUNvbnRleHQuKV0KKyAgKGxldCBbY2xhenogKENsYXNzL2Zvck5hbWUgKG9yIChjb25mIFNUT1JNLUNMVVNURVItU1RBVEUtU1RPUkUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFja3R5cGUuc3Rvcm0uY2x1c3Rlcl9zdGF0ZS56b29rZWVwZXJfc3RhdGVfZmFjdG9yeSIpKQorICAgICAgICBzdGF0ZS1pbnN0YW5jZSAoLm5ld0luc3RhbmNlIGNsYXp6KV0KKyAgICAobG9nLWRlYnVnICJDcmVhdGluZyBjbHVzdGVyIHN0YXRlOiAiICgudG9TdHJpbmcgY2xhenopKQorICAgIChvciAoLm1rU3RhdGUgc3RhdGUtaW5zdGFuY2UgY29uZiBhdXRoLWNvbmYgYWNscyBjb250ZXh0KQorICAgICAgICBuaWwpKSkKKyAgCiAKIChkZWZwcm90b2NvbCBTdG9ybUNsdXN0ZXJTdGF0ZQogICAoYXNzaWdubWVudHMgW3RoaXMgY2FsbGJhY2tdKQpAQCAtMTcwLDYgKzY1LDEwIEBACiAgIChhY3RpdmUtc3Rvcm1zIFt0aGlzXSkKICAgKHN0b3JtLWJhc2UgW3RoaXMgc3Rvcm0taWQgY2FsbGJhY2tdKQogICAoZ2V0LXdvcmtlci1oZWFydGJlYXQgW3RoaXMgc3Rvcm0taWQgbm9kZSBwb3J0XSkKKyAgKGdldC13b3JrZXItcHJvZmlsZS1yZXF1ZXN0cyBbdGhpcyBzdG9ybS1pZCBub2RlaW5mbyB0aHJpZnQ/XSkKKyAgKGdldC10b3BvbG9neS1wcm9maWxlLXJlcXVlc3RzIFt0aGlzIHN0b3JtLWlkIHRocmlmdD9dKQorICAoc2V0LXdvcmtlci1wcm9maWxlLXJlcXVlc3QgW3RoaXMgc3Rvcm0taWQgcHJvZmlsZS1yZXF1ZXN0XSkKKyAgKGRlbGV0ZS10b3BvbG9neS1wcm9maWxlLXJlcXVlc3RzIFt0aGlzIHN0b3JtLWlkIHByb2ZpbGUtcmVxdWVzdF0pCiAgIChleGVjdXRvci1iZWF0cyBbdGhpcyBzdG9ybS1pZCBleGVjdXRvci0+bm9kZStwb3J0XSkKICAgKHN1cGVydmlzb3JzIFt0aGlzIGNhbGxiYWNrXSkKICAgKHN1cGVydmlzb3ItaW5mbyBbdGhpcyBzdXBlcnZpc29yLWlkXSkgOzsgcmV0dXJucyBuaWwgaWYgZG9lc24ndCBleGlzdApAQCAtMTc4LDYgKzc3LDggQEAKICAgKHRlYXJkb3duLXRvcG9sb2d5LWVycm9ycyEgW3RoaXMgc3Rvcm0taWRdKQogICAoaGVhcnRiZWF0LXN0b3JtcyBbdGhpc10pCiAgIChlcnJvci10b3BvbG9naWVzIFt0aGlzXSkKKyAgKHNldC10b3BvbG9neS1sb2ctY29uZmlnISBbdGhpcyBzdG9ybS1pZCBsb2ctY29uZmlnXSkKKyAgKHRvcG9sb2d5LWxvZy1jb25maWcgW3RoaXMgc3Rvcm0taWQgY2JdKQogICAod29ya2VyLWhlYXJ0YmVhdCEgW3RoaXMgc3Rvcm0taWQgbm9kZSBwb3J0IGluZm9dKQogICAocmVtb3ZlLXdvcmtlci1oZWFydGJlYXQhIFt0aGlzIHN0b3JtLWlkIG5vZGUgcG9ydF0pCiAgIChzdXBlcnZpc29yLWhlYXJ0YmVhdCEgW3RoaXMgc3VwZXJ2aXNvci1pZCBpbmZvXSkKQEAgLTIwOSw3ICsxMTAsOCBAQAogKGRlZiBDT0RFLURJU1RSSUJVVE9SLVJPT1QgImNvZGUtZGlzdHJpYnV0b3IiKQogKGRlZiBOSU1CVVNFUy1ST09UICJuaW1idXNlcyIpCiAoZGVmIENSRURFTlRJQUxTLVJPT1QgImNyZWRlbnRpYWxzIikKLQorKGRlZiBMT0dDT05GSUctUk9PVCAibG9nY29uZmlncyIpCisoZGVmIFBST0ZJTEVSQ09ORklHLVJPT1QgInByb2ZpbGVyY29uZmlncyIpCiAKIChkZWYgQVNTSUdOTUVOVFMtU1VCVFJFRSAoc3RyICIvIiBBU1NJR05NRU5UUy1ST09UKSkKIChkZWYgU1RPUk1TLVNVQlRSRUUgKHN0ciAiLyIgU1RPUk1TLVJPT1QpKQpAQCAtMjIwLDYgKzEyMiw4IEBACiAoZGVmIENPREUtRElTVFJJQlVUT1ItU1VCVFJFRSAoc3RyICIvIiBDT0RFLURJU1RSSUJVVE9SLVJPT1QpKQogKGRlZiBOSU1CVVNFUy1TVUJUUkVFIChzdHIgIi8iIE5JTUJVU0VTLVJPT1QpKQogKGRlZiBDUkVERU5USUFMUy1TVUJUUkVFIChzdHIgIi8iIENSRURFTlRJQUxTLVJPT1QpKQorKGRlZiBMT0dDT05GSUctU1VCVFJFRSAoc3RyICIvIiBMT0dDT05GSUctUk9PVCkpCisoZGVmIFBST0ZJTEVSQ09ORklHLVNVQlRSRUUgKHN0ciAiLyIgUFJPRklMRVJDT05GSUctUk9PVCkpCiAKIChkZWZuIHN1cGVydmlzb3ItcGF0aAogICBbaWRdCkBAIC0yNzksNiArMTgzLDE2IEBACiAgIFtzdG9ybS1pZF0KICAgKHN0ciBDUkVERU5USUFMUy1TVUJUUkVFICIvIiBzdG9ybS1pZCkpCiAKKyhkZWZuIGxvZy1jb25maWctcGF0aAorICBbc3Rvcm0taWRdCisgIChzdHIgTE9HQ09ORklHLVNVQlRSRUUgIi8iIHN0b3JtLWlkKSkKKworKGRlZm4gcHJvZmlsZXItY29uZmlnLXBhdGgKKyAgKFtzdG9ybS1pZF0KKyAgIChzdHIgUFJPRklMRVJDT05GSUctU1VCVFJFRSAiLyIgc3Rvcm0taWQpKQorICAoW3N0b3JtLWlkIGhvc3QgcG9ydCByZXF1ZXN0LXR5cGVdCisgICAoc3RyIChwcm9maWxlci1jb25maWctcGF0aCBzdG9ybS1pZCkgIi8iIGhvc3QgIl8iIHBvcnQgIl8iIHJlcXVlc3QtdHlwZSkpKQorCiAoZGVmbi0gaXNzdWUtY2FsbGJhY2shCiAgIFtjYi1hdG9tXQogICAobGV0IFtjYiBAY2ItYXRvbV0KQEAgLTMxOSwxMCArMjMzLDEwIEBACiAKIDs7IFdhdGNoZXMgc2hvdWxkIGJlIHVzZWQgZm9yIG9wdGltaXphdGlvbi4gV2hlbiBaSyBpcyByZWNvbm5lY3RpbmcsIHRoZXkncmUgbm90IGd1YXJhbnRlZWQgdG8gYmUgY2FsbGVkLgogKGRlZm5rIG1rLXN0b3JtLWNsdXN0ZXItc3RhdGUKLSAgW2NsdXN0ZXItc3RhdGUtc3BlYyA6YWNscyBuaWxdCi0gIChsZXQgW1tzb2xvPyBjbHVzdGVyLXN0YXRlXSAoaWYgKHNhdGlzZmllcz8gQ2x1c3RlclN0YXRlIGNsdXN0ZXItc3RhdGUtc3BlYykKKyAgW2NsdXN0ZXItc3RhdGUtc3BlYyA6YWNscyBuaWwgOmNvbnRleHQgKENsdXN0ZXJTdGF0ZUNvbnRleHQuKV0KKyAgKGxldCBbW3NvbG8/IGNsdXN0ZXItc3RhdGVdIChpZiAoaW5zdGFuY2U/IENsdXN0ZXJTdGF0ZSBjbHVzdGVyLXN0YXRlLXNwZWMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmYWxzZSBjbHVzdGVyLXN0YXRlLXNwZWNdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0cnVlIChtay1kaXN0cmlidXRlZC1jbHVzdGVyLXN0YXRlIGNsdXN0ZXItc3RhdGUtc3BlYyA6YXV0aC1jb25mIGNsdXN0ZXItc3RhdGUtc3BlYyA6YWNscyBhY2xzKV0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0cnVlIChtay1kaXN0cmlidXRlZC1jbHVzdGVyLXN0YXRlIGNsdXN0ZXItc3RhdGUtc3BlYyA6YXV0aC1jb25mIGNsdXN0ZXItc3RhdGUtc3BlYyA6YWNscyBhY2xzIDpjb250ZXh0IGNvbnRleHQpXSkKICAgICAgICAgYXNzaWdubWVudC1pbmZvLWNhbGxiYWNrIChhdG9tIHt9KQogICAgICAgICBhc3NpZ25tZW50LWluZm8td2l0aC12ZXJzaW9uLWNhbGxiYWNrIChhdG9tIHt9KQogICAgICAgICBhc3NpZ25tZW50LXZlcnNpb24tY2FsbGJhY2sgKGF0b20ge30pCkBAIC0zMzIsNyArMjQ2LDggQEAKICAgICAgICAgc3Rvcm0tYmFzZS1jYWxsYmFjayAoYXRvbSB7fSkKICAgICAgICAgY29kZS1kaXN0cmlidXRvci1jYWxsYmFjayAoYXRvbSBuaWwpCiAgICAgICAgIGNyZWRlbnRpYWxzLWNhbGxiYWNrIChhdG9tIHt9KQotICAgICAgICBzdGF0ZS1pZCAocmVnaXN0ZXIKKyAgICAgICAgbG9nLWNvbmZpZy1jYWxsYmFjayAoYXRvbSB7fSkKKyAgICAgICAgc3RhdGUtaWQgKC5yZWdpc3RlcgogICAgICAgICAgICAgICAgICAgY2x1c3Rlci1zdGF0ZQogICAgICAgICAgICAgICAgICAgKGZuIFt0eXBlIHBhdGhdCiAgICAgICAgICAgICAgICAgICAgIChsZXQgW1tzdWJ0cmVlICYgYXJnc10gKHRva2VuaXplLXBhdGggcGF0aCldCkBAIC0zNDcsMTEgKzI2MiwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIENPREUtRElTVFJJQlVUT1ItUk9PVCAoaXNzdWUtY2FsbGJhY2shIGNvZGUtZGlzdHJpYnV0b3ItY2FsbGJhY2spCiAgICAgICAgICAgICAgICAgICAgICAgICAgU1RPUk1TLVJPT1QgKGlzc3VlLW1hcC1jYWxsYmFjayEgc3Rvcm0tYmFzZS1jYWxsYmFjayAoZmlyc3QgYXJncykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgQ1JFREVOVElBTFMtUk9PVCAoaXNzdWUtbWFwLWNhbGxiYWNrISBjcmVkZW50aWFscy1jYWxsYmFjayAoZmlyc3QgYXJncykpCisgICAgICAgICAgICAgICAgICAgICAgICAgTE9HQ09ORklHLVJPT1QgKGlzc3VlLW1hcC1jYWxsYmFjayEgbG9nLWNvbmZpZy1jYWxsYmFjayAoZmlyc3QgYXJncykpCiAgICAgICAgICAgICAgICAgICAgICAgICAgQkFDS1BSRVNTVVJFLVJPT1QgKGlzc3VlLW1hcC1jYWxsYmFjayEgYmFja3ByZXNzdXJlLWNhbGxiYWNrIChmaXJzdCBhcmdzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICA7OyB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW4KICAgICAgICAgICAgICAgICAgICAgICAgICAoZXhpdC1wcm9jZXNzISAzMCAiVW5rbm93biBjYWxsYmFjayBmb3Igc3VidHJlZSAiIHN1YnRyZWUgYXJncykpKSkpXQotICAgIChkb3NlcSBbcCBbQVNTSUdOTUVOVFMtU1VCVFJFRSBTVE9STVMtU1VCVFJFRSBTVVBFUlZJU09SUy1TVUJUUkVFIFdPUktFUkJFQVRTLVNVQlRSRUUgRVJST1JTLVNVQlRSRUUgQ09ERS1ESVNUUklCVVRPUi1TVUJUUkVFIE5JTUJVU0VTLVNVQlRSRUVdXQotICAgICAgKG1rZGlycyBjbHVzdGVyLXN0YXRlIHAgYWNscykpCisgICAgKGRvc2VxIFtwIFtBU1NJR05NRU5UUy1TVUJUUkVFIFNUT1JNUy1TVUJUUkVFIFNVUEVSVklTT1JTLVNVQlRSRUUgV09SS0VSQkVBVFMtU1VCVFJFRSBFUlJPUlMtU1VCVFJFRSBDT0RFLURJU1RSSUJVVE9SLVNVQlRSRUUgTklNQlVTRVMtU1VCVFJFRQorICAgICAgICAgICAgICAgTE9HQ09ORklHLVNVQlRSRUVdXQorICAgICAgKC5ta2RpcnMgY2x1c3Rlci1zdGF0ZSBwIGFjbHMpKQogICAgIChyZWlmeQogICAgICAgU3Rvcm1DbHVzdGVyU3RhdGUKIApAQCAtMzU5LDIwICsyNzYsMjAgQEAKICAgICAgICAgW3RoaXMgY2FsbGJhY2tdCiAgICAgICAgICh3aGVuIGNhbGxiYWNrCiAgICAgICAgICAgKHJlc2V0ISBhc3NpZ25tZW50cy1jYWxsYmFjayBjYWxsYmFjaykpCi0gICAgICAgIChnZXQtY2hpbGRyZW4gY2x1c3Rlci1zdGF0ZSBBU1NJR05NRU5UUy1TVUJUUkVFIChub3QtbmlsPyBjYWxsYmFjaykpKQorICAgICAgICAoLmdldF9jaGlsZHJlbiBjbHVzdGVyLXN0YXRlIEFTU0lHTk1FTlRTLVNVQlRSRUUgKG5vdC1uaWw/IGNhbGxiYWNrKSkpCiAKICAgICAgIChhc3NpZ25tZW50LWluZm8KICAgICAgICAgW3RoaXMgc3Rvcm0taWQgY2FsbGJhY2tdCiAgICAgICAgICh3aGVuIGNhbGxiYWNrCiAgICAgICAgICAgKHN3YXAhIGFzc2lnbm1lbnQtaW5mby1jYWxsYmFjayBhc3NvYyBzdG9ybS1pZCBjYWxsYmFjaykpCi0gICAgICAgIChjbG9qdXJpZnktYXNzaWdubWVudCAobWF5YmUtZGVzZXJpYWxpemUgKGdldC1kYXRhIGNsdXN0ZXItc3RhdGUgKGFzc2lnbm1lbnQtcGF0aCBzdG9ybS1pZCkgKG5vdC1uaWw/IGNhbGxiYWNrKSkgQXNzaWdubWVudCkpKQorICAgICAgICAoY2xvanVyaWZ5LWFzc2lnbm1lbnQgKG1heWJlLWRlc2VyaWFsaXplICguZ2V0X2RhdGEgY2x1c3Rlci1zdGF0ZSAoYXNzaWdubWVudC1wYXRoIHN0b3JtLWlkKSAobm90LW5pbD8gY2FsbGJhY2spKSBBc3NpZ25tZW50KSkpCiAKICAgICAgIChhc3NpZ25tZW50LWluZm8td2l0aC12ZXJzaW9uIAogICAgICAgICBbdGhpcyBzdG9ybS1pZCBjYWxsYmFja10KICAgICAgICAgKHdoZW4gY2FsbGJhY2sKICAgICAgICAgICAoc3dhcCEgYXNzaWdubWVudC1pbmZvLXdpdGgtdmVyc2lvbi1jYWxsYmFjayBhc3NvYyBzdG9ybS1pZCBjYWxsYmFjaykpCiAgICAgICAgIChsZXQgW3tkYXRhIDpkYXRhIHZlcnNpb24gOnZlcnNpb259IAotICAgICAgICAgICAgICAoZ2V0LWRhdGEtd2l0aC12ZXJzaW9uIGNsdXN0ZXItc3RhdGUgKGFzc2lnbm1lbnQtcGF0aCBzdG9ybS1pZCkgKG5vdC1uaWw/IGNhbGxiYWNrKSldCisgICAgICAgICAgICAgICguZ2V0X2RhdGFfd2l0aF92ZXJzaW9uIGNsdXN0ZXItc3RhdGUgKGFzc2lnbm1lbnQtcGF0aCBzdG9ybS1pZCkgKG5vdC1uaWw/IGNhbGxiYWNrKSldCiAgICAgICAgIHs6ZGF0YSAoY2xvanVyaWZ5LWFzc2lnbm1lbnQgKG1heWJlLWRlc2VyaWFsaXplIGRhdGEgQXNzaWdubWVudCkpCiAgICAgICAgICA6dmVyc2lvbiB2ZXJzaW9ufSkpCiAKQEAgLTM4MCw1OSArMjk3LDU5IEBACiAgICAgICAgIFt0aGlzIHN0b3JtLWlkIGNhbGxiYWNrXQogICAgICAgICAod2hlbiBjYWxsYmFjawogICAgICAgICAgIChzd2FwISBhc3NpZ25tZW50LXZlcnNpb24tY2FsbGJhY2sgYXNzb2Mgc3Rvcm0taWQgY2FsbGJhY2spKQotICAgICAgICAoZ2V0LXZlcnNpb24gY2x1c3Rlci1zdGF0ZSAoYXNzaWdubWVudC1wYXRoIHN0b3JtLWlkKSAobm90LW5pbD8gY2FsbGJhY2spKSkKKyAgICAgICAgKC5nZXRfdmVyc2lvbiBjbHVzdGVyLXN0YXRlIChhc3NpZ25tZW50LXBhdGggc3Rvcm0taWQpIChub3QtbmlsPyBjYWxsYmFjaykpKQogCiAgICAgICAoY29kZS1kaXN0cmlidXRvcgogICAgICAgICBbdGhpcyBjYWxsYmFja10KICAgICAgICAgKHdoZW4gY2FsbGJhY2sKICAgICAgICAgICAocmVzZXQhIGNvZGUtZGlzdHJpYnV0b3ItY2FsbGJhY2sgY2FsbGJhY2spKQogICAgICAgICAoZG8KLSAgICAgICAgICAoc3luYy1wYXRoIGNsdXN0ZXItc3RhdGUgQ09ERS1ESVNUUklCVVRPUi1TVUJUUkVFKQotICAgICAgICAgIChnZXQtY2hpbGRyZW4gY2x1c3Rlci1zdGF0ZSBDT0RFLURJU1RSSUJVVE9SLVNVQlRSRUUgKG5vdC1uaWw/IGNhbGxiYWNrKSkpKQorICAgICAgICAgICguc3luY19wYXRoIGNsdXN0ZXItc3RhdGUgQ09ERS1ESVNUUklCVVRPUi1TVUJUUkVFKQorICAgICAgICAgICguZ2V0X2NoaWxkcmVuIGNsdXN0ZXItc3RhdGUgQ09ERS1ESVNUUklCVVRPUi1TVUJUUkVFIChub3QtbmlsPyBjYWxsYmFjaykpKSkKIAogICAgICAgKG5pbWJ1c2VzCiAgICAgICAgIFt0aGlzXQotICAgICAgICAobWFwICMobWF5YmUtZGVzZXJpYWxpemUgKGdldC1kYXRhIGNsdXN0ZXItc3RhdGUgKG5pbWJ1cy1wYXRoICUxKSBmYWxzZSkgTmltYnVzU3VtbWFyeSkKLSAgICAgICAgICAoZ2V0LWNoaWxkcmVuIGNsdXN0ZXItc3RhdGUgTklNQlVTRVMtU1VCVFJFRSBmYWxzZSkpKQorICAgICAgICAobWFwICMobWF5YmUtZGVzZXJpYWxpemUgKC5nZXRfZGF0YSBjbHVzdGVyLXN0YXRlIChuaW1idXMtcGF0aCAlMSkgZmFsc2UpIE5pbWJ1c1N1bW1hcnkpCisgICAgICAgICAgKC5nZXRfY2hpbGRyZW4gY2x1c3Rlci1zdGF0ZSBOSU1CVVNFUy1TVUJUUkVFIGZhbHNlKSkpCiAKICAgICAgIChhZGQtbmltYnVzLWhvc3QhCiAgICAgICAgIFt0aGlzIG5pbWJ1cy1pZCBuaW1idXMtc3VtbWFyeV0KICAgICAgICAgO2V4cGxpY2l0IGRlbGV0ZSBmb3IgZXBobWVyYWwgbm9kZSB0byBlbnN1cmUgdGhpcyBzZXNzaW9uIGNyZWF0ZXMgdGhlIGVudHJ5LgotICAgICAgICAoZGVsZXRlLW5vZGUgY2x1c3Rlci1zdGF0ZSAobmltYnVzLXBhdGggbmltYnVzLWlkKSkKKyAgICAgICAgKC5kZWxldGVfbm9kZSBjbHVzdGVyLXN0YXRlIChuaW1idXMtcGF0aCBuaW1idXMtaWQpKQogCi0gICAgICAgIChhZGQtbGlzdGVuZXIgY2x1c3Rlci1zdGF0ZSAocmVpZnkgQ29ubmVjdGlvblN0YXRlTGlzdGVuZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIChedm9pZCBzdGF0ZUNoYW5nZWRbdGhpcyBeQ3VyYXRvckZyYW1ld29yayBjbGllbnQgXkNvbm5lY3Rpb25TdGF0ZSBuZXdTdGF0ZV0KKyAgICAgICAgKC5hZGRfbGlzdGVuZXIgY2x1c3Rlci1zdGF0ZSAocmVpZnkgQ2x1c3RlclN0YXRlTGlzdGVuZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIChedm9pZCBzdGF0ZUNoYW5nZWRbdGhpcyBeQ29ubmVjdGlvblN0YXRlIG5ld1N0YXRlXQogICAgICAgICAgICAgICAgICAgICAgICAgICAobG9nLW1lc3NhZ2UgIkNvbm5lY3Rpb24gc3RhdGUgbGlzdGVuZXIgaW52b2tlZCwgem9va2VlcGVyIGNvbm5lY3Rpb24gc3RhdGUgaGFzIGNoYW5nZWQgdG8gIiBuZXdTdGF0ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlmICguZXF1YWxzIG5ld1N0YXRlIENvbm5lY3Rpb25TdGF0ZS9SRUNPTk5FQ1RFRCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZG8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb2ctbWVzc2FnZSAiQ29ubmVjdGlvbiBzdGF0ZSBoYXMgY2hhbmdlZCB0byByZWNvbm5lY3RlZCBzbyBzZXR0aW5nIG5pbWJ1c2VzIGVudHJ5IG9uZSBtb3JlIHRpbWUiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNldC1lcGhlbWVyYWwtbm9kZSBjbHVzdGVyLXN0YXRlIChuaW1idXMtcGF0aCBuaW1idXMtaWQpIChVdGlscy9zZXJpYWxpemUgbmltYnVzLXN1bW1hcnkpIGFjbHMpKSkpKSkKLQotICAgICAgICAoc2V0LWVwaGVtZXJhbC1ub2RlIGNsdXN0ZXItc3RhdGUgKG5pbWJ1cy1wYXRoIG5pbWJ1cy1pZCkgKFV0aWxzL3NlcmlhbGl6ZSBuaW1idXMtc3VtbWFyeSkgYWNscykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLnNldF9lcGhlbWVyYWxfbm9kZSBjbHVzdGVyLXN0YXRlIChuaW1idXMtcGF0aCBuaW1idXMtaWQpIChVdGlscy9zZXJpYWxpemUgbmltYnVzLXN1bW1hcnkpIGFjbHMpKSkpKSkKKyAgICAgICAgCisgICAgICAgICguc2V0X2VwaGVtZXJhbF9ub2RlIGNsdXN0ZXItc3RhdGUgKG5pbWJ1cy1wYXRoIG5pbWJ1cy1pZCkgKFV0aWxzL3NlcmlhbGl6ZSBuaW1idXMtc3VtbWFyeSkgYWNscykpCiAKICAgICAgIChjb2RlLWRpc3RyaWJ1dG9yLWluZm8KICAgICAgICAgW3RoaXMgc3Rvcm0taWRdCiAgICAgICAgIChtYXAgKGZuIFtuaW1idXMtaW5mb10gKE5pbWJ1c0luZm8vcGFyc2UgbmltYnVzLWluZm8pKQogICAgICAgICAgIChsZXQgW3BhdGggKGNvZGUtZGlzdHJpYnV0b3ItcGF0aCBzdG9ybS1pZCldCiAgICAgICAgICAgICAoZG8KLSAgICAgICAgICAgICAgKHN5bmMtcGF0aCBjbHVzdGVyLXN0YXRlIHBhdGgpCi0gICAgICAgICAgICAgIChnZXQtY2hpbGRyZW4gY2x1c3Rlci1zdGF0ZSBwYXRoIGZhbHNlKSkpKSkKKyAgICAgICAgICAgICAgKC5zeW5jX3BhdGggY2x1c3Rlci1zdGF0ZSBwYXRoKQorICAgICAgICAgICAgICAoLmdldF9jaGlsZHJlbiBjbHVzdGVyLXN0YXRlIHBhdGggZmFsc2UpKSkpKQogCiAgICAgICAoYWN0aXZlLXN0b3JtcwogICAgICAgICBbdGhpc10KLSAgICAgICAgKGdldC1jaGlsZHJlbiBjbHVzdGVyLXN0YXRlIFNUT1JNUy1TVUJUUkVFIGZhbHNlKSkKKyAgICAgICAgKC5nZXRfY2hpbGRyZW4gY2x1c3Rlci1zdGF0ZSBTVE9STVMtU1VCVFJFRSBmYWxzZSkpCiAKICAgICAgIChoZWFydGJlYXQtc3Rvcm1zCiAgICAgICAgIFt0aGlzXQotICAgICAgICAoZ2V0LWNoaWxkcmVuIGNsdXN0ZXItc3RhdGUgV09SS0VSQkVBVFMtU1VCVFJFRSBmYWxzZSkpCisgICAgICAgICguZ2V0X3dvcmtlcl9oYl9jaGlsZHJlbiBjbHVzdGVyLXN0YXRlIFdPUktFUkJFQVRTLVNVQlRSRUUgZmFsc2UpKQogCiAgICAgICAoZXJyb3ItdG9wb2xvZ2llcwogICAgICAgICBbdGhpc10KLSAgICAgICAgKGdldC1jaGlsZHJlbiBjbHVzdGVyLXN0YXRlIEVSUk9SUy1TVUJUUkVFIGZhbHNlKSkKKyAgICAgICAgKC5nZXRfY2hpbGRyZW4gY2x1c3Rlci1zdGF0ZSBFUlJPUlMtU1VCVFJFRSBmYWxzZSkpCiAKICAgICAgIChnZXQtd29ya2VyLWhlYXJ0YmVhdAogICAgICAgICBbdGhpcyBzdG9ybS1pZCBub2RlIHBvcnRdCi0gICAgICAgIChsZXQgW3dvcmtlci1oYiAoZ2V0LWRhdGEgY2x1c3Rlci1zdGF0ZSAod29ya2VyYmVhdC1wYXRoIHN0b3JtLWlkIG5vZGUgcG9ydCkgZmFsc2UpXQorICAgICAgICAobGV0IFt3b3JrZXItaGIgKC5nZXRfd29ya2VyX2hiIGNsdXN0ZXItc3RhdGUgKHdvcmtlcmJlYXQtcGF0aCBzdG9ybS1pZCBub2RlIHBvcnQpIGZhbHNlKV0KICAgICAgICAgICAoaWYgd29ya2VyLWhiCiAgICAgICAgICAgICAoLT4gd29ya2VyLWhiCiAgICAgICAgICAgICAgIChtYXliZS1kZXNlcmlhbGl6ZSBDbHVzdGVyV29ya2VySGVhcnRiZWF0KQpAQCAtNDU1LDMwICszNzIsODIgQEAKICAgICAgICAgW3RoaXMgY2FsbGJhY2tdCiAgICAgICAgICh3aGVuIGNhbGxiYWNrCiAgICAgICAgICAgKHJlc2V0ISBzdXBlcnZpc29ycy1jYWxsYmFjayBjYWxsYmFjaykpCi0gICAgICAgIChnZXQtY2hpbGRyZW4gY2x1c3Rlci1zdGF0ZSBTVVBFUlZJU09SUy1TVUJUUkVFIChub3QtbmlsPyBjYWxsYmFjaykpKQorICAgICAgICAoLmdldF9jaGlsZHJlbiBjbHVzdGVyLXN0YXRlIFNVUEVSVklTT1JTLVNVQlRSRUUgKG5vdC1uaWw/IGNhbGxiYWNrKSkpCiAKICAgICAgIChzdXBlcnZpc29yLWluZm8KICAgICAgICAgW3RoaXMgc3VwZXJ2aXNvci1pZF0KLSAgICAgICAgKGNsb2p1cmlmeS1zdXBlcnZpc29yLWluZm8gKG1heWJlLWRlc2VyaWFsaXplIChnZXQtZGF0YSBjbHVzdGVyLXN0YXRlIChzdXBlcnZpc29yLXBhdGggc3VwZXJ2aXNvci1pZCkgZmFsc2UpIFN1cGVydmlzb3JJbmZvKSkpCisgICAgICAgIChjbG9qdXJpZnktc3VwZXJ2aXNvci1pbmZvIChtYXliZS1kZXNlcmlhbGl6ZSAoLmdldF9kYXRhIGNsdXN0ZXItc3RhdGUgKHN1cGVydmlzb3ItcGF0aCBzdXBlcnZpc29yLWlkKSBmYWxzZSkgU3VwZXJ2aXNvckluZm8pKSkKIAorICAgICAgKHRvcG9sb2d5LWxvZy1jb25maWcKKyAgICAgICAgW3RoaXMgc3Rvcm0taWQgY2JdCisgICAgICAgICh3aGVuIGNiCisgICAgICAgICAgKHN3YXAhIGxvZy1jb25maWctY2FsbGJhY2sgYXNzb2Mgc3Rvcm0taWQgY2IpKQorICAgICAgICAobWF5YmUtZGVzZXJpYWxpemUgKC5nZXRfZGF0YSBjbHVzdGVyLXN0YXRlIChsb2ctY29uZmlnLXBhdGggc3Rvcm0taWQpIChub3QtbmlsPyBjYikpIExvZ0NvbmZpZykpCisKKyAgICAgIChzZXQtdG9wb2xvZ3ktbG9nLWNvbmZpZyEKKyAgICAgICAgW3RoaXMgc3Rvcm0taWQgbG9nLWNvbmZpZ10KKyAgICAgICAgKC5zZXRfZGF0YSBjbHVzdGVyLXN0YXRlIChsb2ctY29uZmlnLXBhdGggc3Rvcm0taWQpIChVdGlscy9zZXJpYWxpemUgbG9nLWNvbmZpZykgYWNscykpCisKKyAgICAgIChzZXQtd29ya2VyLXByb2ZpbGUtcmVxdWVzdAorICAgICAgICBbdGhpcyBzdG9ybS1pZCBwcm9maWxlLXJlcXVlc3RdCisgICAgICAgIChsZXQgW3JlcXVlc3QtdHlwZSAoLmdldF9hY3Rpb24gcHJvZmlsZS1yZXF1ZXN0KQorICAgICAgICAgICAgICBob3N0ICguZ2V0X25vZGUgKC5nZXRfbm9kZUluZm8gcHJvZmlsZS1yZXF1ZXN0KSkKKyAgICAgICAgICAgICAgcG9ydCAoZmlyc3QgKC5nZXRfcG9ydCAoLmdldF9ub2RlSW5mbyBwcm9maWxlLXJlcXVlc3QpKSldCisgICAgICAgICAgKC5zZXRfZGF0YSBjbHVzdGVyLXN0YXRlCisgICAgICAgICAgICAgICAgICAgICAocHJvZmlsZXItY29uZmlnLXBhdGggc3Rvcm0taWQgaG9zdCBwb3J0IHJlcXVlc3QtdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgIChVdGlscy9zZXJpYWxpemUgcHJvZmlsZS1yZXF1ZXN0KQorICAgICAgICAgICAgICAgICAgICAgYWNscykpKQorCisgICAgICAoZ2V0LXRvcG9sb2d5LXByb2ZpbGUtcmVxdWVzdHMKKyAgICAgICAgW3RoaXMgc3Rvcm0taWQgdGhyaWZ0P10KKyAgICAgICAgKGxldCBbcGF0aCAocHJvZmlsZXItY29uZmlnLXBhdGggc3Rvcm0taWQpCisgICAgICAgICAgICAgIHJlcXVlc3RzIChpZiAoLm5vZGVfZXhpc3RzIGNsdXN0ZXItc3RhdGUgcGF0aCBmYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAoZG9mb3IgW2MgKC5nZXRfY2hpbGRyZW4gY2x1c3Rlci1zdGF0ZSBwYXRoIGZhbHNlKV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxldCBbcmF3ICguZ2V0X2RhdGEgY2x1c3Rlci1zdGF0ZSAoc3RyIHBhdGggIi8iIGMpIGZhbHNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0IChtYXliZS1kZXNlcmlhbGl6ZSByYXcgUHJvZmlsZVJlcXVlc3QpXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaWYgdGhyaWZ0PworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xvanVyaWZ5LXByb2ZpbGUtcmVxdWVzdCByZXF1ZXN0KSkpKSldCisgICAgICAgICAgcmVxdWVzdHMpKQorCisgICAgICAoZGVsZXRlLXRvcG9sb2d5LXByb2ZpbGUtcmVxdWVzdHMKKyAgICAgICAgW3RoaXMgc3Rvcm0taWQgcHJvZmlsZS1yZXF1ZXN0XQorICAgICAgICAobGV0IFtwcm9maWxlLXJlcXVlc3QtaW5zdCAodGhyaWZ0aWZ5LXByb2ZpbGUtcmVxdWVzdCBwcm9maWxlLXJlcXVlc3QpCisgICAgICAgICAgICAgIGFjdGlvbiAoOmFjdGlvbiBwcm9maWxlLXJlcXVlc3QpCisgICAgICAgICAgICAgIGhvc3QgKDpob3N0IHByb2ZpbGUtcmVxdWVzdCkKKyAgICAgICAgICAgICAgcG9ydCAoOnBvcnQgcHJvZmlsZS1yZXF1ZXN0KV0KKyAgICAgICAgICAoLmRlbGV0ZV9ub2RlIGNsdXN0ZXItc3RhdGUKKyAgICAgICAgICAgKHByb2ZpbGVyLWNvbmZpZy1wYXRoIHN0b3JtLWlkIGhvc3QgcG9ydCBhY3Rpb24pKSkpCisgICAgICAgICAgCisgICAgICAoZ2V0LXdvcmtlci1wcm9maWxlLXJlcXVlc3RzCisgICAgICAgIFt0aGlzIHN0b3JtLWlkIG5vZGUtaW5mbyB0aHJpZnQ/XQorICAgICAgICAobGV0IFtob3N0ICg6aG9zdCBub2RlLWluZm8pCisgICAgICAgICAgICAgIHBvcnQgKDpwb3J0IG5vZGUtaW5mbykKKyAgICAgICAgICAgICAgcHJvZmlsZS1yZXF1ZXN0cyAoZ2V0LXRvcG9sb2d5LXByb2ZpbGUtcmVxdWVzdHMgdGhpcyBzdG9ybS1pZCB0aHJpZnQ/KV0KKyAgICAgICAgICAoaWYgdGhyaWZ0PworICAgICAgICAgICAgKGZpbHRlciAjKGFuZCAoPSBob3N0ICguZ2V0X25vZGUgKC5nZXRfbm9kZUluZm8gJSkpKSAoPSBwb3J0IChmaXJzdCAoLmdldF9wb3J0ICguZ2V0X25vZGVJbmZvICAlKSkpKSkKKyAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS1yZXF1ZXN0cykKKyAgICAgICAgICAgIChmaWx0ZXIgIyhhbmQgKD0gaG9zdCAoOmhvc3QgJSkpICg9IHBvcnQgKDpwb3J0ICUpKSkKKyAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS1yZXF1ZXN0cykpKSkKKyAgICAgIAogICAgICAgKHdvcmtlci1oZWFydGJlYXQhCiAgICAgICAgIFt0aGlzIHN0b3JtLWlkIG5vZGUgcG9ydCBpbmZvXQogICAgICAgICAobGV0IFt0aHJpZnQtd29ya2VyLWhiICh0aHJpZnRpZnktemstd29ya2VyLWhiIGluZm8pXQogICAgICAgICAgIChpZiB0aHJpZnQtd29ya2VyLWhiCi0gICAgICAgICAgICAoc2V0LWRhdGEgY2x1c3Rlci1zdGF0ZSAod29ya2VyYmVhdC1wYXRoIHN0b3JtLWlkIG5vZGUgcG9ydCkgKFV0aWxzL3NlcmlhbGl6ZSB0aHJpZnQtd29ya2VyLWhiKSBhY2xzKSkpKQorICAgICAgICAgICAgKC5zZXRfd29ya2VyX2hiIGNsdXN0ZXItc3RhdGUgKHdvcmtlcmJlYXQtcGF0aCBzdG9ybS1pZCBub2RlIHBvcnQpIChVdGlscy9zZXJpYWxpemUgdGhyaWZ0LXdvcmtlci1oYikgYWNscykpKSkKIAogICAgICAgKHJlbW92ZS13b3JrZXItaGVhcnRiZWF0IQogICAgICAgICBbdGhpcyBzdG9ybS1pZCBub2RlIHBvcnRdCi0gICAgICAgIChkZWxldGUtbm9kZSBjbHVzdGVyLXN0YXRlICh3b3JrZXJiZWF0LXBhdGggc3Rvcm0taWQgbm9kZSBwb3J0KSkpCisgICAgICAgICguZGVsZXRlX3dvcmtlcl9oYiBjbHVzdGVyLXN0YXRlICh3b3JrZXJiZWF0LXBhdGggc3Rvcm0taWQgbm9kZSBwb3J0KSkpCiAKICAgICAgIChzZXR1cC1oZWFydGJlYXRzIQogICAgICAgICBbdGhpcyBzdG9ybS1pZF0KLSAgICAgICAgKG1rZGlycyBjbHVzdGVyLXN0YXRlICh3b3JrZXJiZWF0LXN0b3JtLXJvb3Qgc3Rvcm0taWQpIGFjbHMpKQorICAgICAgICAoLm1rZGlycyBjbHVzdGVyLXN0YXRlICh3b3JrZXJiZWF0LXN0b3JtLXJvb3Qgc3Rvcm0taWQpIGFjbHMpKQogCiAgICAgICAodGVhcmRvd24taGVhcnRiZWF0cyEKICAgICAgICAgW3RoaXMgc3Rvcm0taWRdCiAgICAgICAgICh0cnktY2F1c2UKLSAgICAgICAgICAoZGVsZXRlLW5vZGUgY2x1c3Rlci1zdGF0ZSAod29ya2VyYmVhdC1zdG9ybS1yb290IHN0b3JtLWlkKSkKKyAgICAgICAgICAoLmRlbGV0ZV93b3JrZXJfaGIgY2x1c3Rlci1zdGF0ZSAod29ya2VyYmVhdC1zdG9ybS1yb290IHN0b3JtLWlkKSkKICAgICAgICAgICAoY2F0Y2ggS2VlcGVyRXhjZXB0aW9uIGUKICAgICAgICAgICAgIChsb2ctd2Fybi1lcnJvciBlICJDb3VsZCBub3QgdGVhcmRvd24gaGVhcnRiZWF0cyBmb3IgIiBzdG9ybS1pZCkpKSkKIApAQCAtNDg3LDEyICs0NTYsMTIgQEAKICAgICAgICAgImlmIHpub2RlIGV4aXN0cyBhbmQgdG8gYmUgbm90IG9uPywgZGVsZXRlOyBpZiBleGlzdHMgYW5kIG9uPywgZG8gbm90aGluZzsKICAgICAgICAgaWYgbm90IGV4aXN0cyBhbmQgdG8gYmUgb24/LCBjcmVhdGU7IGlmIG5vdCBleGlzdHMgYW5kIG5vdCBvbj8sIGRvIG5vdGhpbmciCiAgICAgICAgIChsZXQgW3BhdGggKGJhY2twcmVzc3VyZS1wYXRoIHN0b3JtLWlkIG5vZGUgcG9ydCkKLSAgICAgICAgICAgICAgZXhpc3RlZCAoZXhpc3RzLW5vZGU/IGNsdXN0ZXItc3RhdGUgcGF0aCBmYWxzZSldCisgICAgICAgICAgICAgIGV4aXN0ZWQgKC5ub2RlX2V4aXN0cyBjbHVzdGVyLXN0YXRlIHBhdGggZmFsc2UpXQogICAgICAgICAgIChpZiBleGlzdGVkCiAgICAgICAgICAgICAoaWYgKG5vdCBvbj8pCi0gICAgICAgICAgICAgIChkZWxldGUtbm9kZSBjbHVzdGVyLXN0YXRlIHBhdGgpKSAgIDs7IGRlbGV0ZSB0aGUgem5vZGUgc2luY2UgdGhlIHdvcmtlciBpcyBub3QgY29uZ2VzdGVkCisgICAgICAgICAgICAgICguZGVsZXRlX25vZGUgY2x1c3Rlci1zdGF0ZSBwYXRoKSkgICA7OyBkZWxldGUgdGhlIHpub2RlIHNpbmNlIHRoZSB3b3JrZXIgaXMgbm90IGNvbmdlc3RlZAogICAgICAgICAgICAgKGlmIG9uPwotICAgICAgICAgICAgICAoc2V0LWVwaGVtZXJhbC1ub2RlIGNsdXN0ZXItc3RhdGUgcGF0aCBuaWwgYWNscykpKSkpIDs7IGNyZWF0ZSB0aGUgem5vZGUgc2luY2Ugd29ya2VyIGlzIGNvbmdlc3RlZAorICAgICAgICAgICAgICAoLnNldF9lcGhlbWVyYWxfbm9kZSBjbHVzdGVyLXN0YXRlIHBhdGggbmlsIGFjbHMpKSkpKSA7OyBjcmVhdGUgdGhlIHpub2RlIHNpbmNlIHdvcmtlciBpcyBjb25nZXN0ZWQKICAgICAKICAgICAgICh0b3BvbG9neS1iYWNrcHJlc3N1cmUKICAgICAgICAgW3RoaXMgc3Rvcm0taWQgY2FsbGJhY2tdCkBAIC01MDAsMzMgKzQ2OSwzMyBAQAogICAgICAgICAod2hlbiBjYWxsYmFjawogICAgICAgICAgIChzd2FwISBiYWNrcHJlc3N1cmUtY2FsbGJhY2sgYXNzb2Mgc3Rvcm0taWQgY2FsbGJhY2spKQogICAgICAgICAobGV0IFtwYXRoIChiYWNrcHJlc3N1cmUtc3Rvcm0tcm9vdCBzdG9ybS1pZCkKLSAgICAgICAgICAgICAgY2hpbGRyZW4gKGdldC1jaGlsZHJlbiBjbHVzdGVyLXN0YXRlIHBhdGggKG5vdC1uaWw/IGNhbGxiYWNrKSldCisgICAgICAgICAgICAgIGNoaWxkcmVuICguZ2V0X2NoaWxkcmVuIGNsdXN0ZXItc3RhdGUgcGF0aCAobm90LW5pbD8gY2FsbGJhY2spKV0KICAgICAgICAgICAgICAgKD4gKGNvdW50IGNoaWxkcmVuKSAwKSkpCiAgICAgICAKICAgICAgIChzZXR1cC1iYWNrcHJlc3N1cmUhCiAgICAgICAgIFt0aGlzIHN0b3JtLWlkXQotICAgICAgICAobWtkaXJzIGNsdXN0ZXItc3RhdGUgKGJhY2twcmVzc3VyZS1zdG9ybS1yb290IHN0b3JtLWlkKSBhY2xzKSkKKyAgICAgICAgKC5ta2RpcnMgY2x1c3Rlci1zdGF0ZSAoYmFja3ByZXNzdXJlLXN0b3JtLXJvb3Qgc3Rvcm0taWQpIGFjbHMpKQogCiAgICAgICAocmVtb3ZlLXdvcmtlci1iYWNrcHJlc3N1cmUhCiAgICAgICAgIFt0aGlzIHN0b3JtLWlkIG5vZGUgcG9ydF0KLSAgICAgICAgKGRlbGV0ZS1ub2RlIGNsdXN0ZXItc3RhdGUgKGJhY2twcmVzc3VyZS1wYXRoIHN0b3JtLWlkIG5vZGUgcG9ydCkpKQorICAgICAgICAoLmRlbGV0ZV9ub2RlIGNsdXN0ZXItc3RhdGUgKGJhY2twcmVzc3VyZS1wYXRoIHN0b3JtLWlkIG5vZGUgcG9ydCkpKQogCiAgICAgICAodGVhcmRvd24tdG9wb2xvZ3ktZXJyb3JzIQogICAgICAgICBbdGhpcyBzdG9ybS1pZF0KICAgICAgICAgKHRyeS1jYXVzZQotICAgICAgICAgIChkZWxldGUtbm9kZSBjbHVzdGVyLXN0YXRlIChlcnJvci1zdG9ybS1yb290IHN0b3JtLWlkKSkKKyAgICAgICAgICAoLmRlbGV0ZV9ub2RlIGNsdXN0ZXItc3RhdGUgKGVycm9yLXN0b3JtLXJvb3Qgc3Rvcm0taWQpKQogICAgICAgICAgIChjYXRjaCBLZWVwZXJFeGNlcHRpb24gZQogICAgICAgICAgICAgKGxvZy13YXJuLWVycm9yIGUgIkNvdWxkIG5vdCB0ZWFyZG93biBlcnJvcnMgZm9yICIgc3Rvcm0taWQpKSkpCiAKICAgICAgIChzdXBlcnZpc29yLWhlYXJ0YmVhdCEKICAgICAgICAgW3RoaXMgc3VwZXJ2aXNvci1pZCBpbmZvXQogICAgICAgICAobGV0IFt0aHJpZnQtc3VwZXJ2aXNvci1pbmZvICh0aHJpZnRpZnktc3VwZXJ2aXNvci1pbmZvIGluZm8pXQotICAgICAgICAgIChzZXQtZXBoZW1lcmFsLW5vZGUgY2x1c3Rlci1zdGF0ZSAoc3VwZXJ2aXNvci1wYXRoIHN1cGVydmlzb3ItaWQpIChVdGlscy9zZXJpYWxpemUgdGhyaWZ0LXN1cGVydmlzb3ItaW5mbykgYWNscykpKQorICAgICAgICAgICguc2V0X2VwaGVtZXJhbF9ub2RlIGNsdXN0ZXItc3RhdGUgKHN1cGVydmlzb3ItcGF0aCBzdXBlcnZpc29yLWlkKSAoVXRpbHMvc2VyaWFsaXplIHRocmlmdC1zdXBlcnZpc29yLWluZm8pIGFjbHMpKSkKIAogICAgICAgKGFjdGl2YXRlLXN0b3JtIQogICAgICAgICBbdGhpcyBzdG9ybS1pZCBzdG9ybS1iYXNlXQogICAgICAgICAobGV0IFt0aHJpZnQtc3Rvcm0tYmFzZSAodGhyaWZ0aWZ5LXN0b3JtLWJhc2Ugc3Rvcm0tYmFzZSldCi0gICAgICAgICAgKHNldC1kYXRhIGNsdXN0ZXItc3RhdGUgKHN0b3JtLXBhdGggc3Rvcm0taWQpIChVdGlscy9zZXJpYWxpemUgdGhyaWZ0LXN0b3JtLWJhc2UpIGFjbHMpKSkKKyAgICAgICAgICAoLnNldF9kYXRhIGNsdXN0ZXItc3RhdGUgKHN0b3JtLXBhdGggc3Rvcm0taWQpIChVdGlscy9zZXJpYWxpemUgdGhyaWZ0LXN0b3JtLWJhc2UpIGFjbHMpKSkKIAogICAgICAgKHVwZGF0ZS1zdG9ybSEKICAgICAgICAgW3RoaXMgc3Rvcm0taWQgbmV3LWVsZW1zXQpAQCAtNTM1LDcgKzUwNCw3IEBACiAgICAgICAgICAgICAgIGNvbXBvbmVudC0+ZGVidWcgKDpjb21wb25lbnQtPmRlYnVnIGJhc2UpCiAgICAgICAgICAgICAgIG5ldy1lbGVtcyAodXBkYXRlIG5ldy1lbGVtcyA6Y29tcG9uZW50LT5leGVjdXRvcnMgKHBhcnRpYWwgbWVyZ2UgZXhlY3V0b3JzKSkKICAgICAgICAgICAgICAgbmV3LWVsZW1zICh1cGRhdGUgbmV3LWVsZW1zIDpjb21wb25lbnQtPmRlYnVnIChwYXJ0aWFsIG1lcmdlLXdpdGggbWVyZ2UgY29tcG9uZW50LT5kZWJ1ZykpXQotICAgICAgICAgIChzZXQtZGF0YSBjbHVzdGVyLXN0YXRlIChzdG9ybS1wYXRoIHN0b3JtLWlkKQorICAgICAgICAgICguc2V0X2RhdGEgY2x1c3Rlci1zdGF0ZSAoc3Rvcm0tcGF0aCBzdG9ybS1pZCkKICAgICAgICAgICAgICAgICAgICAgKC0+IGJhc2UKICAgICAgICAgICAgICAgICAgICAgICAgIChtZXJnZSBuZXctZWxlbXMpCiAgICAgICAgICAgICAgICAgICAgICAgICB0aHJpZnRpZnktc3Rvcm0tYmFzZQpAQCAtNTQ2LDMwICs1MTUsMzIgQEAKICAgICAgICAgW3RoaXMgc3Rvcm0taWQgY2FsbGJhY2tdCiAgICAgICAgICh3aGVuIGNhbGxiYWNrCiAgICAgICAgICAgKHN3YXAhIHN0b3JtLWJhc2UtY2FsbGJhY2sgYXNzb2Mgc3Rvcm0taWQgY2FsbGJhY2spKQotICAgICAgICAoY2xvanVyaWZ5LXN0b3JtLWJhc2UgKG1heWJlLWRlc2VyaWFsaXplIChnZXQtZGF0YSBjbHVzdGVyLXN0YXRlIChzdG9ybS1wYXRoIHN0b3JtLWlkKSAobm90LW5pbD8gY2FsbGJhY2spKSBTdG9ybUJhc2UpKSkKKyAgICAgICAgKGNsb2p1cmlmeS1zdG9ybS1iYXNlIChtYXliZS1kZXNlcmlhbGl6ZSAoLmdldF9kYXRhIGNsdXN0ZXItc3RhdGUgKHN0b3JtLXBhdGggc3Rvcm0taWQpIChub3QtbmlsPyBjYWxsYmFjaykpIFN0b3JtQmFzZSkpKQogCiAgICAgICAocmVtb3ZlLXN0b3JtLWJhc2UhCiAgICAgICAgIFt0aGlzIHN0b3JtLWlkXQotICAgICAgICAoZGVsZXRlLW5vZGUgY2x1c3Rlci1zdGF0ZSAoc3Rvcm0tcGF0aCBzdG9ybS1pZCkpKQorICAgICAgICAoLmRlbGV0ZV9ub2RlIGNsdXN0ZXItc3RhdGUgKHN0b3JtLXBhdGggc3Rvcm0taWQpKSkKIAogICAgICAgKHNldC1hc3NpZ25tZW50IQogICAgICAgICBbdGhpcyBzdG9ybS1pZCBpbmZvXQogICAgICAgICAobGV0IFt0aHJpZnQtYXNzaWdubWVudCAodGhyaWZ0aWZ5LWFzc2lnbm1lbnQgaW5mbyldCi0gICAgICAgICAgKHNldC1kYXRhIGNsdXN0ZXItc3RhdGUgKGFzc2lnbm1lbnQtcGF0aCBzdG9ybS1pZCkgKFV0aWxzL3NlcmlhbGl6ZSB0aHJpZnQtYXNzaWdubWVudCkgYWNscykpKQorICAgICAgICAgICguc2V0X2RhdGEgY2x1c3Rlci1zdGF0ZSAoYXNzaWdubWVudC1wYXRoIHN0b3JtLWlkKSAoVXRpbHMvc2VyaWFsaXplIHRocmlmdC1hc3NpZ25tZW50KSBhY2xzKSkpCiAKICAgICAgIChzZXR1cC1jb2RlLWRpc3RyaWJ1dG9yIQogICAgICAgICBbdGhpcyBzdG9ybS1pZCBuaW1idXNJbmZvXQogICAgICAgICAobGV0IFtwYXRoIChzdHIgKGNvZGUtZGlzdHJpYnV0b3ItcGF0aCBzdG9ybS1pZCkgIi8iICgudG9Ib3N0UG9ydFN0cmluZyBuaW1idXNJbmZvKSldCi0gICAgICAgIChta2RpcnMgY2x1c3Rlci1zdGF0ZSAoY29kZS1kaXN0cmlidXRvci1wYXRoIHN0b3JtLWlkKSBhY2xzKQorICAgICAgICAoLm1rZGlycyBjbHVzdGVyLXN0YXRlIChjb2RlLWRpc3RyaWJ1dG9yLXBhdGggc3Rvcm0taWQpIGFjbHMpCiAgICAgICAgIDt3ZSBkZWxldGUgdGhlIG5vZGUgZmlyc3QgdG8gZW5zdXJlIHRoZSBub2RlIGdldHMgY3JlYXRlZCBhcyBwYXJ0IG9mIHRoaXMgc2Vzc2lvbiBvbmx5LgotICAgICAgICAoZGVsZXRlLW5vZGUgY2x1c3Rlci1zdGF0ZSBwYXRoKQotICAgICAgICAoc2V0LWVwaGVtZXJhbC1ub2RlIGNsdXN0ZXItc3RhdGUgcGF0aCBuaWwgYWNscykpKQorICAgICAgICAoLmRlbGV0ZV9ub2RlIGNsdXN0ZXItc3RhdGUgcGF0aCkKKyAgICAgICAgKC5zZXRfZXBoZW1lcmFsX25vZGUgY2x1c3Rlci1zdGF0ZSBwYXRoIG5pbCBhY2xzKSkpCiAKICAgICAgIChyZW1vdmUtc3Rvcm0hCiAgICAgICAgIFt0aGlzIHN0b3JtLWlkXQotICAgICAgICAoZGVsZXRlLW5vZGUgY2x1c3Rlci1zdGF0ZSAoYXNzaWdubWVudC1wYXRoIHN0b3JtLWlkKSkKLSAgICAgICAgKGRlbGV0ZS1ub2RlIGNsdXN0ZXItc3RhdGUgKGNvZGUtZGlzdHJpYnV0b3ItcGF0aCBzdG9ybS1pZCkpCi0gICAgICAgIChkZWxldGUtbm9kZSBjbHVzdGVyLXN0YXRlIChjcmVkZW50aWFscy1wYXRoIHN0b3JtLWlkKSkKKyAgICAgICAgKC5kZWxldGVfbm9kZSBjbHVzdGVyLXN0YXRlIChhc3NpZ25tZW50LXBhdGggc3Rvcm0taWQpKQorICAgICAgICAoLmRlbGV0ZV9ub2RlIGNsdXN0ZXItc3RhdGUgKGNvZGUtZGlzdHJpYnV0b3ItcGF0aCBzdG9ybS1pZCkpCisgICAgICAgICguZGVsZXRlX25vZGUgY2x1c3Rlci1zdGF0ZSAoY3JlZGVudGlhbHMtcGF0aCBzdG9ybS1pZCkpCisgICAgICAgICguZGVsZXRlX25vZGUgY2x1c3Rlci1zdGF0ZSAobG9nLWNvbmZpZy1wYXRoIHN0b3JtLWlkKSkKKyAgICAgICAgKC5kZWxldGVfbm9kZSBjbHVzdGVyLXN0YXRlIChwcm9maWxlci1jb25maWctcGF0aCBzdG9ybS1pZCkpCiAgICAgICAgIChyZW1vdmUtc3Rvcm0tYmFzZSEgdGhpcyBzdG9ybS1pZCkpCiAKICAgICAgIChzZXQtY3JlZGVudGlhbHMhCkBAIC01NzcsMzcgKzU0OCwzNyBAQAogICAgICAgICAgKGxldCBbdG9wby1hY2xzIChtay10b3BvLW9ubHktYWNscyB0b3BvLWNvbmYpCiAgICAgICAgICAgICAgICBwYXRoIChjcmVkZW50aWFscy1wYXRoIHN0b3JtLWlkKQogICAgICAgICAgICAgICAgdGhyaWZ0aWZpZWQtY3JlZHMgKHRocmlmdGlmeS1jcmVkZW50aWFscyBjcmVkcyldCi0gICAgICAgICAgIChzZXQtZGF0YSBjbHVzdGVyLXN0YXRlIHBhdGggKFV0aWxzL3NlcmlhbGl6ZSB0aHJpZnRpZmllZC1jcmVkcykgdG9wby1hY2xzKSkpCisgICAgICAgICAgICguc2V0X2RhdGEgY2x1c3Rlci1zdGF0ZSBwYXRoIChVdGlscy9zZXJpYWxpemUgdGhyaWZ0aWZpZWQtY3JlZHMpIHRvcG8tYWNscykpKQogCiAgICAgICAoY3JlZGVudGlhbHMKICAgICAgICAgW3RoaXMgc3Rvcm0taWQgY2FsbGJhY2tdCiAgICAgICAgICh3aGVuIGNhbGxiYWNrCiAgICAgICAgICAgKHN3YXAhIGNyZWRlbnRpYWxzLWNhbGxiYWNrIGFzc29jIHN0b3JtLWlkIGNhbGxiYWNrKSkKLSAgICAgICAgKGNsb2p1cmlmeS1jcmRlbnRpYWxzIChtYXliZS1kZXNlcmlhbGl6ZSAoZ2V0LWRhdGEgY2x1c3Rlci1zdGF0ZSAoY3JlZGVudGlhbHMtcGF0aCBzdG9ybS1pZCkgKG5vdC1uaWw/IGNhbGxiYWNrKSkgQ3JlZGVudGlhbHMpKSkKKyAgICAgICAgKGNsb2p1cmlmeS1jcmRlbnRpYWxzIChtYXliZS1kZXNlcmlhbGl6ZSAoLmdldF9kYXRhIGNsdXN0ZXItc3RhdGUgKGNyZWRlbnRpYWxzLXBhdGggc3Rvcm0taWQpIChub3QtbmlsPyBjYWxsYmFjaykpIENyZWRlbnRpYWxzKSkpCiAKICAgICAgIChyZXBvcnQtZXJyb3IKICAgICAgICAgIFt0aGlzIHN0b3JtLWlkIGNvbXBvbmVudC1pZCBub2RlIHBvcnQgZXJyb3JdCiAgICAgICAgICAobGV0IFtwYXRoIChlcnJvci1wYXRoIHN0b3JtLWlkIGNvbXBvbmVudC1pZCkKICAgICAgICAgICAgICAgIGxhc3QtZXJyb3ItcGF0aCAobGFzdC1lcnJvci1wYXRoIHN0b3JtLWlkIGNvbXBvbmVudC1pZCkKICAgICAgICAgICAgICAgIGRhdGEgKHRocmlmdGlmeS1lcnJvciB7OnRpbWUtc2VjcyAoY3VycmVudC10aW1lLXNlY3MpIDplcnJvciAoc3RyaW5naWZ5LWVycm9yIGVycm9yKSA6aG9zdCBub2RlIDpwb3J0IHBvcnR9KQotICAgICAgICAgICAgICAgXyAobWtkaXJzIGNsdXN0ZXItc3RhdGUgcGF0aCBhY2xzKQorICAgICAgICAgICAgICAgXyAoLm1rZGlycyBjbHVzdGVyLXN0YXRlIHBhdGggYWNscykKICAgICAgICAgICAgICAgIHNlci1kYXRhIChVdGlscy9zZXJpYWxpemUgZGF0YSkKLSAgICAgICAgICAgICAgIF8gKG1rZGlycyBjbHVzdGVyLXN0YXRlIHBhdGggYWNscykKLSAgICAgICAgICAgICAgIF8gKGNyZWF0ZS1zZXF1ZW50aWFsIGNsdXN0ZXItc3RhdGUgKHN0ciBwYXRoICIvZSIpIHNlci1kYXRhIGFjbHMpCi0gICAgICAgICAgICAgICBfIChzZXQtZGF0YSBjbHVzdGVyLXN0YXRlIGxhc3QtZXJyb3ItcGF0aCBzZXItZGF0YSBhY2xzKQotICAgICAgICAgICAgICAgdG8ta2lsbCAoLT4+IChnZXQtY2hpbGRyZW4gY2x1c3Rlci1zdGF0ZSBwYXRoIGZhbHNlKQorICAgICAgICAgICAgICAgXyAoLm1rZGlycyBjbHVzdGVyLXN0YXRlIHBhdGggYWNscykKKyAgICAgICAgICAgICAgIF8gKC5jcmVhdGVfc2VxdWVudGlhbCBjbHVzdGVyLXN0YXRlIChzdHIgcGF0aCAiL2UiKSBzZXItZGF0YSBhY2xzKQorICAgICAgICAgICAgICAgXyAoLnNldF9kYXRhIGNsdXN0ZXItc3RhdGUgbGFzdC1lcnJvci1wYXRoIHNlci1kYXRhIGFjbHMpCisgICAgICAgICAgICAgICB0by1raWxsICgtPj4gKC5nZXRfY2hpbGRyZW4gY2x1c3Rlci1zdGF0ZSBwYXRoIGZhbHNlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzb3J0LWJ5IHBhcnNlLWVycm9yLXBhdGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV2ZXJzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkcm9wIDEwKSldCiAgICAgICAgICAgIChkb3NlcSBbayB0by1raWxsXQotICAgICAgICAgICAgIChkZWxldGUtbm9kZSBjbHVzdGVyLXN0YXRlIChzdHIgcGF0aCAiLyIgaykpKSkpCisgICAgICAgICAgICAgKC5kZWxldGVfbm9kZSBjbHVzdGVyLXN0YXRlIChzdHIgcGF0aCAiLyIgaykpKSkpCiAKICAgICAgIChlcnJvcnMKICAgICAgICAgIFt0aGlzIHN0b3JtLWlkIGNvbXBvbmVudC1pZF0KICAgICAgICAgIChsZXQgW3BhdGggKGVycm9yLXBhdGggc3Rvcm0taWQgY29tcG9uZW50LWlkKQotICAgICAgICAgICAgICAgZXJyb3JzIChpZiAoZXhpc3RzLW5vZGU/IGNsdXN0ZXItc3RhdGUgcGF0aCBmYWxzZSkKLSAgICAgICAgICAgICAgICAgICAgICAgIChkb2ZvciBbYyAoZ2V0LWNoaWxkcmVuIGNsdXN0ZXItc3RhdGUgcGF0aCBmYWxzZSldCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChpZi1sZXQgW2RhdGEgKC0+IChnZXQtZGF0YSBjbHVzdGVyLXN0YXRlCisgICAgICAgICAgICAgICBlcnJvcnMgKGlmICgubm9kZV9leGlzdHMgY2x1c3Rlci1zdGF0ZSBwYXRoIGZhbHNlKQorICAgICAgICAgICAgICAgICAgICAgICAgKGRvZm9yIFtjICguZ2V0X2NoaWxkcmVuIGNsdXN0ZXItc3RhdGUgcGF0aCBmYWxzZSldCisgICAgICAgICAgICAgICAgICAgICAgICAgIChpZi1sZXQgW2RhdGEgKC0+ICguZ2V0X2RhdGEgY2x1c3Rlci1zdGF0ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0ciBwYXRoICIvIiBjKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWF5YmUtZGVzZXJpYWxpemUgRXJyb3JJbmZvKQpAQCAtNjIwLDE3ICs1OTEsMTcgQEAKICAgICAgIChsYXN0LWVycm9yCiAgICAgICAgIFt0aGlzIHN0b3JtLWlkIGNvbXBvbmVudC1pZF0KICAgICAgICAgKGxldCBbcGF0aCAobGFzdC1lcnJvci1wYXRoIHN0b3JtLWlkIGNvbXBvbmVudC1pZCldCi0gICAgICAgICAgKGlmIChleGlzdHMtbm9kZT8gY2x1c3Rlci1zdGF0ZSBwYXRoIGZhbHNlKQotICAgICAgICAgICAgKGlmLWxldCBbZGF0YSAoLT4gKGdldC1kYXRhIGNsdXN0ZXItc3RhdGUgcGF0aCBmYWxzZSkKKyAgICAgICAgICAoaWYgKC5ub2RlX2V4aXN0cyBjbHVzdGVyLXN0YXRlIHBhdGggZmFsc2UpCisgICAgICAgICAgICAoaWYtbGV0IFtkYXRhICgtPiAoLmdldF9kYXRhIGNsdXN0ZXItc3RhdGUgcGF0aCBmYWxzZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXliZS1kZXNlcmlhbGl6ZSBFcnJvckluZm8pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9qdXJpZnktZXJyb3IpXQogICAgICAgICAgICAgICAobWFwLT5UYXNrRXJyb3IgZGF0YSkpKSkpCiAgICAgICAKICAgICAgIChkaXNjb25uZWN0CiAgICAgICAgICBbdGhpc10KLSAgICAgICAgKHVucmVnaXN0ZXIgY2x1c3Rlci1zdGF0ZSBzdGF0ZS1pZCkKKyAgICAgICAgKC51bnJlZ2lzdGVyIGNsdXN0ZXItc3RhdGUgc3RhdGUtaWQpCiAgICAgICAgICh3aGVuIHNvbG8/Ci0gICAgICAgICAgKGNsb3NlIGNsdXN0ZXItc3RhdGUpKSkpKSkKKyAgICAgICAgICAoLmNsb3NlIGNsdXN0ZXItc3RhdGUpKSkpKSkKIAogOzsgZGFlbW9ucyBoYXZlIGEgc2luZ2xlIHRocmVhZCB0aGF0IHdpbGwgcmVzcG9uZCB0byBldmVudHMKIDs7IHN0YXJ0IHdpdGggaW5pdGlhbGl6ZSBldmVudApkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvY2xqL2JhY2t0eXBlL3N0b3JtL2NsdXN0ZXJfc3RhdGUvem9va2VlcGVyX3N0YXRlX2ZhY3RvcnkuY2xqIGIvc3Rvcm0tY29yZS9zcmMvY2xqL2JhY2t0eXBlL3N0b3JtL2NsdXN0ZXJfc3RhdGUvem9va2VlcGVyX3N0YXRlX2ZhY3RvcnkuY2xqCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmOTQyZGIKLS0tIC9kZXYvbnVsbAorKysgYi9zdG9ybS1jb3JlL3NyYy9jbGovYmFja3R5cGUvc3Rvcm0vY2x1c3Rlcl9zdGF0ZS96b29rZWVwZXJfc3RhdGVfZmFjdG9yeS5jbGoKQEAgLTAsMCArMSwxNTcgQEAKKzs7IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKzs7IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorOzsgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKzs7IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKzs7IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKzs7ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKzs7IHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzs7Cis7OyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzs7Cis7OyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis7OyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOzsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis7OyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis7OyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworKG5zIGJhY2t0eXBlLnN0b3JtLmNsdXN0ZXItc3RhdGUuem9va2VlcGVyLXN0YXRlLWZhY3RvcnkKKyAgKDppbXBvcnQgW29yZy5hcGFjaGUuY3VyYXRvci5mcmFtZXdvcmsuc3RhdGUgQ29ubmVjdGlvblN0YXRlTGlzdGVuZXJdKQorICAoOmltcG9ydCBbb3JnLmFwYWNoZS56b29rZWVwZXIgS2VlcGVyRXhjZXB0aW9uJE5vTm9kZUV4Y2VwdGlvbl0KKyAgICAgICAgICAgW2JhY2t0eXBlLnN0b3JtLmNsdXN0ZXIgQ2x1c3RlclN0YXRlIERhZW1vblR5cGVdKQorICAoOnVzZSBbYmFja3R5cGUuc3Rvcm0gY2x1c3RlciBjb25maWcgbG9nIHV0aWxdKQorICAoOnJlcXVpcmUgW2JhY2t0eXBlLnN0b3JtIFt6b29rZWVwZXIgOmFzIHprXV0pCisgICg6Z2VuLWNsYXNzCisgICA6aW1wbGVtZW50cyBbYmFja3R5cGUuc3Rvcm0uY2x1c3Rlci5DbHVzdGVyU3RhdGVGYWN0b3J5XSkpCisKKyhkZWZuIC1ta1N0YXRlIFt0aGlzIGNvbmYgYXV0aC1jb25mIGFjbHMgY29udGV4dF0KKyAgKGxldCBbemsgKHprL21rLWNsaWVudCBjb25mIChjb25mIFNUT1JNLVpPT0tFRVBFUi1TRVJWRVJTKSAoY29uZiBTVE9STS1aT09LRUVQRVItUE9SVCkgOmF1dGgtY29uZiBhdXRoLWNvbmYpXQorICAgICh6ay9ta2RpcnMgemsgKGNvbmYgU1RPUk0tWk9PS0VFUEVSLVJPT1QpIGFjbHMpCisgICAgKC5jbG9zZSB6aykpCisgIChsZXQgW2NhbGxiYWNrcyAoYXRvbSB7fSkKKyAgICAgICAgYWN0aXZlIChhdG9tIHRydWUpCisgICAgICAgIHprLXdyaXRlciAoemsvbWstY2xpZW50IGNvbmYKKyAgICAgICAgICAgICAgICAgICAgICAgICAoY29uZiBTVE9STS1aT09LRUVQRVItU0VSVkVSUykKKyAgICAgICAgICAgICAgICAgICAgICAgICAoY29uZiBTVE9STS1aT09LRUVQRVItUE9SVCkKKyAgICAgICAgICAgICAgICAgICAgICAgICA6YXV0aC1jb25mIGF1dGgtY29uZgorICAgICAgICAgICAgICAgICAgICAgICAgIDpyb290IChjb25mIFNUT1JNLVpPT0tFRVBFUi1ST09UKQorICAgICAgICAgICAgICAgICAgICAgICAgIDp3YXRjaGVyIChmbiBbc3RhdGUgdHlwZSBwYXRoXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdoZW4gQGFjdGl2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2hlbi1ub3QgKD0gOmNvbm5lY3RlZCBzdGF0ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9nLXdhcm4gIlJlY2VpdmVkIGV2ZW50ICIgc3RhdGUgIjoiIHR5cGUgIjoiIHBhdGggIiB3aXRoIGRpc2Nvbm5lY3RlZCBXcml0ZXIgWm9va2VlcGVyLiIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2hlbi1ub3QgKD0gOm5vbmUgdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZG9zZXEgW2NhbGxiYWNrICh2YWxzIEBjYWxsYmFja3MpXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNhbGxiYWNrIHR5cGUgcGF0aCkpKSkpKQorICAgICAgICBpcy1uaW1idXM/ICg9ICguZ2V0RGFlbW9uVHlwZSBjb250ZXh0KSBEYWVtb25UeXBlL05JTUJVUykKKyAgICAgICAgemstcmVhZGVyIChpZiBpcy1uaW1idXM/CisgICAgICAgICAgICAgICAgICAgICh6ay9tay1jbGllbnQgY29uZgorICAgICAgICAgICAgICAgICAgICAgICAgIChjb25mIFNUT1JNLVpPT0tFRVBFUi1TRVJWRVJTKQorICAgICAgICAgICAgICAgICAgICAgICAgIChjb25mIFNUT1JNLVpPT0tFRVBFUi1QT1JUKQorICAgICAgICAgICAgICAgICAgICAgICAgIDphdXRoLWNvbmYgYXV0aC1jb25mCisgICAgICAgICAgICAgICAgICAgICAgICAgOnJvb3QgKGNvbmYgU1RPUk0tWk9PS0VFUEVSLVJPT1QpCisgICAgICAgICAgICAgICAgICAgICAgICAgOndhdGNoZXIgKGZuIFtzdGF0ZSB0eXBlIHBhdGhdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2hlbiBAYWN0aXZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aGVuLW5vdCAoPSA6Y29ubmVjdGVkIHN0YXRlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb2ctd2FybiAiUmVjZWl2ZWQgZXZlbnQgIiBzdGF0ZSAiOiIgdHlwZSAiOiIgcGF0aCAiIHdpdGggZGlzY29ubmVjdGVkIFJlYWRlciBab29rZWVwZXIuIikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aGVuLW5vdCAoPSA6bm9uZSB0eXBlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkb3NlcSBbY2FsbGJhY2sgKHZhbHMgQGNhbGxiYWNrcyldCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2FsbGJhY2sgdHlwZSBwYXRoKSkpKSkpCisgICAgICAgICAgICAgICAgICAgIHprLXdyaXRlcildCisgICAgKHJlaWZ5CisgICAgIENsdXN0ZXJTdGF0ZQorCisgICAgIChyZWdpc3RlcgorICAgICAgIFt0aGlzIGNhbGxiYWNrXQorICAgICAgIChsZXQgW2lkICh1dWlkKV0KKyAgICAgICAgIChzd2FwISBjYWxsYmFja3MgYXNzb2MgaWQgY2FsbGJhY2spCisgICAgICAgICBpZCkpCisKKyAgICAgKHVucmVnaXN0ZXIKKyAgICAgICBbdGhpcyBpZF0KKyAgICAgICAoc3dhcCEgY2FsbGJhY2tzIGRpc3NvYyBpZCkpCisKKyAgICAgKHNldC1lcGhlbWVyYWwtbm9kZQorICAgICAgIFt0aGlzIHBhdGggZGF0YSBhY2xzXQorICAgICAgICh6ay9ta2RpcnMgemstd3JpdGVyIChwYXJlbnQtcGF0aCBwYXRoKSBhY2xzKQorICAgICAgIChpZiAoemsvZXhpc3RzIHprLXdyaXRlciBwYXRoIGZhbHNlKQorICAgICAgICAgKHRyeS1jYXVzZQorICAgICAgICAgICAoemsvc2V0LWRhdGEgemstd3JpdGVyIHBhdGggZGF0YSkgOyBzaG91bGQgdmVyaWZ5IHRoYXQgaXQncyBlcGhlbWVyYWwKKyAgICAgICAgICAgKGNhdGNoIEtlZXBlckV4Y2VwdGlvbiROb05vZGVFeGNlcHRpb24gZQorICAgICAgICAgICAgIChsb2ctd2Fybi1lcnJvciBlICJFcGhlbWVyYWwgbm9kZSBkaXNhcHBlYXJlZCBiZXR3ZWVuIGNoZWNraW5nIGZvciBleGlzdGluZyBhbmQgc2V0dGluZyBkYXRhIikKKyAgICAgICAgICAgICAoemsvY3JlYXRlLW5vZGUgemstd3JpdGVyIHBhdGggZGF0YSA6ZXBoZW1lcmFsIGFjbHMpKSkKKyAgICAgICAgICh6ay9jcmVhdGUtbm9kZSB6ay13cml0ZXIgcGF0aCBkYXRhIDplcGhlbWVyYWwgYWNscykpKQorCisgICAgIChjcmVhdGUtc2VxdWVudGlhbAorICAgICAgIFt0aGlzIHBhdGggZGF0YSBhY2xzXQorICAgICAgICh6ay9jcmVhdGUtbm9kZSB6ay13cml0ZXIgcGF0aCBkYXRhIDpzZXF1ZW50aWFsIGFjbHMpKQorCisgICAgIChzZXQtZGF0YQorICAgICAgIFt0aGlzIHBhdGggZGF0YSBhY2xzXQorICAgICAgIDs7IG5vdGU6IHRoaXMgZG9lcyBub3QgdHVybiBvZmYgYW55IGV4aXN0aW5nIHdhdGNoZXMKKyAgICAgICAoaWYgKHprL2V4aXN0cyB6ay13cml0ZXIgcGF0aCBmYWxzZSkKKyAgICAgICAgICh6ay9zZXQtZGF0YSB6ay13cml0ZXIgcGF0aCBkYXRhKQorICAgICAgICAgKGRvCisgICAgICAgICAgICh6ay9ta2RpcnMgemstd3JpdGVyIChwYXJlbnQtcGF0aCBwYXRoKSBhY2xzKQorICAgICAgICAgICAoemsvY3JlYXRlLW5vZGUgemstd3JpdGVyIHBhdGggZGF0YSA6cGVyc2lzdGVudCBhY2xzKSkpKQorCisgICAgIChzZXQtd29ya2VyLWhiCisgICAgICAgW3RoaXMgcGF0aCBkYXRhIGFjbHNdCisgICAgICAgKC5zZXRfZGF0YSB0aGlzIHBhdGggZGF0YSBhY2xzKSkKKworICAgICAoZGVsZXRlLW5vZGUKKyAgICAgICBbdGhpcyBwYXRoXQorICAgICAgICh6ay9kZWxldGUtbm9kZSB6ay13cml0ZXIgcGF0aCkpCisKKyAgICAgKGRlbGV0ZS13b3JrZXItaGIKKyAgICAgICBbdGhpcyBwYXRoXQorICAgICAgICguZGVsZXRlX25vZGUgdGhpcyBwYXRoKSkKKworICAgICAoZ2V0LWRhdGEKKyAgICAgICBbdGhpcyBwYXRoIHdhdGNoP10KKyAgICAgICAoemsvZ2V0LWRhdGEgemstcmVhZGVyIHBhdGggd2F0Y2g/KSkKKworICAgICAoZ2V0LWRhdGEtd2l0aC12ZXJzaW9uCisgICAgICAgW3RoaXMgcGF0aCB3YXRjaD9dCisgICAgICAgKHprL2dldC1kYXRhLXdpdGgtdmVyc2lvbiB6ay1yZWFkZXIgcGF0aCB3YXRjaD8pKQorCisgICAgIChnZXQtdmVyc2lvbgorICAgICAgIFt0aGlzIHBhdGggd2F0Y2g/XQorICAgICAgICh6ay9nZXQtdmVyc2lvbiB6ay1yZWFkZXIgcGF0aCB3YXRjaD8pKQorCisgICAgIChnZXQtd29ya2VyLWhiCisgICAgICAgW3RoaXMgcGF0aCB3YXRjaD9dCisgICAgICAgKC5nZXRfZGF0YSB0aGlzIHBhdGggd2F0Y2g/KSkKKworICAgICAoZ2V0LWNoaWxkcmVuCisgICAgICAgW3RoaXMgcGF0aCB3YXRjaD9dCisgICAgICAgKHprL2dldC1jaGlsZHJlbiB6ay1yZWFkZXIgcGF0aCB3YXRjaD8pKQorCisgICAgIChnZXQtd29ya2VyLWhiLWNoaWxkcmVuCisgICAgICAgW3RoaXMgcGF0aCB3YXRjaD9dCisgICAgICAgKC5nZXRfY2hpbGRyZW4gdGhpcyBwYXRoIHdhdGNoPykpCisKKyAgICAgKG1rZGlycworICAgICAgIFt0aGlzIHBhdGggYWNsc10KKyAgICAgICAoemsvbWtkaXJzIHprLXdyaXRlciBwYXRoIGFjbHMpKQorCisgICAgIChub2RlLWV4aXN0cworICAgICAgIFt0aGlzIHBhdGggd2F0Y2g/XQorICAgICAgICh6ay9leGlzdHMtbm9kZT8gemstcmVhZGVyIHBhdGggd2F0Y2g/KSkKKworICAgICAoYWRkLWxpc3RlbmVyCisgICAgICAgW3RoaXMgbGlzdGVuZXJdCisgICAgICAgKGxldCBbY3VyYXRvci1saXN0ZW5lciAocmVpZnkgQ29ubmVjdGlvblN0YXRlTGlzdGVuZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXRlQ2hhbmdlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aGlzIGNsaWVudCBuZXdTdGF0ZV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLnN0YXRlQ2hhbmdlZCBsaXN0ZW5lciBjbGllbnQgbmV3U3RhdGUpKSldCisgICAgICAgICAoemsvYWRkLWxpc3RlbmVyIHprLXJlYWRlciBjdXJhdG9yLWxpc3RlbmVyKSkpCisKKyAgICAgKHN5bmMtcGF0aAorICAgICAgIFt0aGlzIHBhdGhdCisgICAgICAgKHprL3N5bmMtcGF0aCB6ay13cml0ZXIgcGF0aCkpCisKKyAgICAgKGNsb3NlCisgICAgICAgW3RoaXNdCisgICAgICAgKHJlc2V0ISBhY3RpdmUgZmFsc2UpCisgICAgICAgKC5jbG9zZSB6ay13cml0ZXIpCisgICAgICAgKGlmIGlzLW5pbWJ1cz8KKyAgICAgICAgICguY2xvc2UgemstcmVhZGVyKSkpKSkpCmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9jbGovYmFja3R5cGUvc3Rvcm0vY29tbWFuZC9oZWFsdGhjaGVjay5jbGogYi9zdG9ybS1jb3JlL3NyYy9jbGovYmFja3R5cGUvc3Rvcm0vY29tbWFuZC9oZWFsdGhjaGVjay5jbGoKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRhZjIyMwotLS0gL2Rldi9udWxsCisrKyBiL3N0b3JtLWNvcmUvc3JjL2Nsai9iYWNrdHlwZS9zdG9ybS9jb21tYW5kL2hlYWx0aGNoZWNrLmNsagpAQCAtMCwwICsxLDg4IEBACis7OyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCis7OyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKzs7IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCis7OyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCis7OyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCis7OyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCis7OyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7OworOzsgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis7OworOzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOzsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzs7IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOzsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisobnMgYmFja3R5cGUuc3Rvcm0uY29tbWFuZC5oZWFsdGhjaGVjaworICAoOnJlcXVpcmUgW2JhY2t0eXBlLnN0b3JtCisgICAgICAgICAgICAgW2NvbmZpZyA6cmVmZXIgOmFsbF0KKyAgICAgICAgICAgICBbbG9nIDpyZWZlciA6YWxsXV0KKyAgICAgICAgICAgIFtjbG9qdXJlLmphdmEgW2lvIDphcyBpb11dCisgICAgICAgICAgICBbY2xvanVyZSBbc3RyaW5nIDpyZWZlciBbc3BsaXRdXV0pCisgICg6Z2VuLWNsYXNzKSkKKworKGRlZm4gaW50ZXJydXB0ZXIKKyAgIkludGVycnVwdCBhIGdpdmVuIHRocmVhZCBhZnRlciBtcyBtaWxsaXNlY29uZHMuIgorICBbdGhyZWFkIG1zXQorICAobGV0IFtpbnRlcnJ1cHRlciAoVGhyZWFkLgorICAgICAgICAgICAgICAgICAgICAgKGZuIFtdCisgICAgICAgICAgICAgICAgICAgICAgICh0cnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAoVGhyZWFkL3NsZWVwIG1zKQorICAgICAgICAgICAgICAgICAgICAgICAgICguaW50ZXJydXB0IHRocmVhZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAoY2F0Y2ggSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkpKSldCisgICAgKC5zdGFydCBpbnRlcnJ1cHRlcikKKyAgICBpbnRlcnJ1cHRlcikpCisKKyhkZWZuIGNoZWNrLW91dHB1dCBbbGluZXNdCisgIChpZiAoc29tZSAjKC5zdGFydHNXaXRoICUgIkVSUk9SIikgbGluZXMpCisgICAgOmZhaWxlZAorICAgIDpzdWNjZXNzKSkKKworKGRlZm4gcHJvY2Vzcy1zY3JpcHQgW2NvbmYgc2NyaXB0XQorICAobGV0IFtzY3JpcHQtcHJvYyAoLiAoUnVudGltZS9nZXRSdW50aW1lKSAoZXhlYyBzY3JpcHQpKQorICAgICAgICBjdXJ0aHJlYWQgKFRocmVhZC9jdXJyZW50VGhyZWFkKQorICAgICAgICBpbnRlcnJ1cHRlci10aHJlYWQgKGludGVycnVwdGVyIGN1cnRocmVhZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25mIFNUT1JNLUhFQUxUSC1DSEVDSy1USU1FT1VULU1TKSldCisgICAgKHRyeQorICAgICAgKC53YWl0Rm9yIHNjcmlwdC1wcm9jKQorICAgICAgKC5pbnRlcnJ1cHQgaW50ZXJydXB0ZXItdGhyZWFkKQorICAgICAgKGlmIChub3QgKD0gKC5leGl0VmFsdWUgc2NyaXB0LXByb2MpIDApKQorICAgICAgICA6ZmFpbGVkX3dpdGhfZXhpdF9jb2RlCisgICAgICAgIChjaGVjay1vdXRwdXQgKHNwbGl0CisgICAgICAgICAgICAgICAgICAgICAgIChzbHVycCAoLmdldElucHV0U3RyZWFtIHNjcmlwdC1wcm9jKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIyJcbisiKSkpCisgICAgICAoY2F0Y2ggSW50ZXJydXB0ZWRFeGNlcHRpb24gZQorICAgICAgICAocHJpbnRsbiAiU2NyaXB0IiBzY3JpcHQgInRpbWVkIG91dC4iKQorICAgICAgICA6dGltZW91dCkKKyAgICAgIChjYXRjaCBFeGNlcHRpb24gZQorICAgICAgICAocHJpbnRsbiAiU2NyaXB0IGZhaWxlZCB3aXRoIGV4Y2VwdGlvbjogIiBlKQorICAgICAgICA6ZmFpbGVkX3dpdGhfZXhjZXB0aW9uKQorICAgICAgKGZpbmFsbHkgKC5pbnRlcnJ1cHQgaW50ZXJydXB0ZXItdGhyZWFkKSkpKSkKKworKGRlZm4gaGVhbHRoLWNoZWNrIFtjb25mXQorICAobGV0IFtoZWFsdGgtZGlyIChhYnNvbHV0ZS1oZWFsdGhjaGVjay1kaXIgY29uZikKKyAgICAgICAgaGVhbHRoLWZpbGVzIChmaWxlLXNlcSAoaW8vZmlsZSBoZWFsdGgtZGlyKSkKKyAgICAgICAgaGVhbHRoLXNjcmlwdHMgKGZpbHRlciAjKGFuZCAoLmNhbkV4ZWN1dGUgJSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobm90ICguaXNEaXJlY3RvcnkgJSkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWx0aC1maWxlcykKKyAgICAgICAgcmVzdWx0cyAoLT4+IGhlYWx0aC1zY3JpcHRzCisgICAgICAgICAgICAgICAgICAgICAobWFwICMoLmdldEFic29sdXRlUGF0aCAlKSkKKyAgICAgICAgICAgICAgICAgICAgIChtYXAgKHBhcnRpYWwgcHJvY2Vzcy1zY3JpcHQgY29uZikpKV0KKyAgICAobG9nLW1lc3NhZ2UKKyAgICAgKHByLXN0ciAobWFwICMndmVjdG9yCisgICAgICAgICAgICAgICAgICAobWFwICMoLmdldEFic29sdXRlUGF0aCAlKSBoZWFsdGgtc2NyaXB0cykKKyAgICAgICAgICAgICAgICAgIHJlc3VsdHMpKSkKKyAgICA7IGZhaWxlZF93aXRoX2V4aXRfY29kZSBpcyBPSy4gV2UncmUgbWltaWNpbmcgSGFkb29wJ3MgaGVhbHRoIGNoZWNrcy4KKyAgICA7IFdlIHRyZWF0IG5vbi16ZXJvIGV4aXQgY29kZXMgYXMgaW5kaWNhdG9ycyB0aGF0IHRoZSBzY3JpcHRzIGZhaWxlZAorICAgIDsgdG8gZXhlY3V0ZSBwcm9wZXJseSwgbm90IHRoYXQgdGhlIHN5c3RlbSBpcyB1bmhlYWx0aHksIGluIHdoaWNoIGNhc2UKKyAgICA7IHdlIGRvbid0IHdhbnQgdG8gc3RhcnQga2lsbGluZyB0aGluZ3MuCisgICAgKGlmIChldmVyeT8gIyhvciAoPSAlIDpmYWlsZWRfd2l0aF9leGl0X2NvZGUpCisgICAgICAgICAgICAgICAgICAgICAoPSAlIDpzdWNjZXNzKSkKKyAgICAgICAgICAgICAgICByZXN1bHRzKQorICAgICAgMAorICAgICAgMSkpKQorCisoZGVmbiAtbWFpbiBbJiBhcmdzXQorICAobGV0IFtjb25mIChyZWFkLXN0b3JtLWNvbmZpZyldCisgICAgKFN5c3RlbS9leGl0CisgICAgIChoZWFsdGgtY2hlY2sgY29uZikpKSkKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2Nsai9iYWNrdHlwZS9zdG9ybS9jb21tYW5kL2hlYXJ0YmVhdHMuY2xqIGIvc3Rvcm0tY29yZS9zcmMvY2xqL2JhY2t0eXBlL3N0b3JtL2NvbW1hbmQvaGVhcnRiZWF0cy5jbGoKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk3OTBhYQotLS0gL2Rldi9udWxsCisrKyBiL3N0b3JtLWNvcmUvc3JjL2Nsai9iYWNrdHlwZS9zdG9ybS9jb21tYW5kL2hlYXJ0YmVhdHMuY2xqCkBAIC0wLDAgKzEsNTIgQEAKKzs7IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKzs7IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorOzsgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKzs7IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKzs7IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKzs7ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKzs7IHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzs7Cis7OyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzs7Cis7OyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis7OyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOzsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis7OyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis7OyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyhucyBiYWNrdHlwZS5zdG9ybS5jb21tYW5kLmhlYXJ0YmVhdHMKKyAgKDpyZXF1aXJlIFtiYWNrdHlwZS5zdG9ybQorICAgICAgICAgICAgIFtjb25maWcgOnJlZmVyIDphbGxdCisgICAgICAgICAgICAgW2xvZyA6cmVmZXIgOmFsbF0KKyAgICAgICAgICAgICBbY2x1c3RlciA6cmVmZXIgOmFsbF0KKyAgICAgICAgICAgICBbY29udmVydGVyIDpyZWZlciA6YWxsXV0KKyAgICAgICAgW2Nsb2p1cmUuc3RyaW5nIDpyZWZlciA6YWxsXSkKKyAgKDppbXBvcnQgW2JhY2t0eXBlLnN0b3JtLmdlbmVyYXRlZCBDbHVzdGVyV29ya2VySGVhcnRiZWF0XQorICAgICAgICAgICBbYmFja3R5cGUuc3Rvcm0udXRpbHMgVXRpbHNdKQorICAoOmdlbi1jbGFzcykpCisKKyhkZWZuIC1tYWluIFtjb21tYW5kIHBhdGggJiBhcmdzXQorICAobGV0IFtjb25mIChyZWFkLXN0b3JtLWNvbmZpZykKKyAgICAgICAgY2x1c3RlciAobWstZGlzdHJpYnV0ZWQtY2x1c3Rlci1zdGF0ZSBjb25mIDphdXRoLWNvbmYgY29uZildCisgICAgKHByaW50bG4gIkNvbW1hbmQ6IFsiIGNvbW1hbmQgIl0iKQorICAgIChjb25kcCA9IGNvbW1hbmQKKyAgICAgICJsaXN0IgorICAgICAgKGxldCBbbWVzc2FnZSAoam9pbiAiIFxuIiAoLmdldF93b3JrZXJfaGJfY2hpbGRyZW4gY2x1c3RlciBwYXRoIGZhbHNlKSldCisgICAgICAgIChsb2ctbWVzc2FnZSAibGlzdCAiIHBhdGggIjpcbiIKKyAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgIlxuIikpCisgICAgICAiZ2V0IgorICAgICAgKGxvZy1tZXNzYWdlIAorICAgICAgIChpZi1sZXQgW2hiICguZ2V0X3dvcmtlcl9oYiBjbHVzdGVyIHBhdGggZmFsc2UpXQorICAgICAgICAgKGNsb2p1cmlmeS16ay13b3JrZXItaGIKKyAgICAgICAgICAoVXRpbHMvZGVzZXJpYWxpemUKKyAgICAgICAgICAgaGIKKyAgICAgICAgICAgQ2x1c3RlcldvcmtlckhlYXJ0YmVhdCkpCisgICAgICAgICAiTm90aGluZyIpKQorICAgICAgCisgICAgICAobG9nLW1lc3NhZ2UgIlVzYWdlOiBoZWFydGJlYXRzIFtsaXN0fGdldF0gcGF0aCIpKQorICAgIAorICAgICh0cnkKKyAgICAgICguY2xvc2UgY2x1c3RlcikKKyAgICAgIChjYXRjaCBFeGNlcHRpb24gZQorICAgICAgICAobG9nLW1lc3NhZ2UgIkNhdWdodCBleGNlcHRpb246ICIgZSAiIG9uIGNsb3NlLiIpKSkpCisgIChTeXN0ZW0vZXhpdCAwKSkKKyAgICAgICAgIApkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvY2xqL2JhY2t0eXBlL3N0b3JtL2NvbW1hbmQva2lsbF93b3JrZXJzLmNsaiBiL3N0b3JtLWNvcmUvc3JjL2Nsai9iYWNrdHlwZS9zdG9ybS9jb21tYW5kL2tpbGxfd29ya2Vycy5jbGoKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg2NmNjNwotLS0gL2Rldi9udWxsCisrKyBiL3N0b3JtLWNvcmUvc3JjL2Nsai9iYWNrdHlwZS9zdG9ybS9jb21tYW5kL2tpbGxfd29ya2Vycy5jbGoKQEAgLTAsMCArMSwzMyBAQAorOzsgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorOzsgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCis7OyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorOzsgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorOzsgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorOzsgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorOzsgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOzsKKzs7IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOzsKKzs7IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzs7IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis7OyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzs7IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzs7IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKG5zIGJhY2t0eXBlLnN0b3JtLmNvbW1hbmQua2lsbC13b3JrZXJzCisgICg6aW1wb3J0IFtqYXZhLmlvIEZpbGVdKQorICAoOnVzZSBbYmFja3R5cGUuc3Rvcm0uZGFlbW9uIGNvbW1vbl0pCisgICg6dXNlIFtiYWNrdHlwZS5zdG9ybSB1dGlsIGNvbmZpZ10pCisgICg6cmVxdWlyZSBbYmFja3R5cGUuc3Rvcm0uZGFlbW9uCisgICAgICAgICAgICAgW3N1cGVydmlzb3IgOmFzIHN1cGVydmlzb3JdXSkKKyAgKDpnZW4tY2xhc3MpKQorCisoZGVmbiAtbWFpbiAKKyAgIkNvbnN0cnVjdCB0aGUgc3VwZXJ2aXNvci1kYXRhIGZyb20gc2NyYXRjaCBhbmQga2lsbCB0aGUgd29ya2VycyBvbiB0aGlzIHN1cGVydmlzb3IiCisgIFsmIGFyZ3NdCisgIChsZXQgW2NvbmYgKHJlYWQtc3Rvcm0tY29uZmlnKQorICAgICAgICBjb25mIChhc3NvYyBjb25mIFNUT1JNLUxPQ0FMLURJUiAoLiAoRmlsZS4gKGNvbmYgU1RPUk0tTE9DQUwtRElSKSkgZ2V0Q2Fub25pY2FsUGF0aCkpCisgICAgICAgIGlzdXBlcnZpc29yIChzdXBlcnZpc29yL3N0YW5kYWxvbmUtc3VwZXJ2aXNvcikKKyAgICAgICAgc3VwZXJ2aXNvci1kYXRhIChzdXBlcnZpc29yL3N1cGVydmlzb3ItZGF0YSBjb25mIG5pbCBpc3VwZXJ2aXNvcikKKyAgICAgICAgaWRzIChzdXBlcnZpc29yL215LXdvcmtlci1pZHMgY29uZildCisgICAgKGRvc2VxIFtpZCBpZHNdCisgICAgICAoc3VwZXJ2aXNvci9zaHV0ZG93bi13b3JrZXIgc3VwZXJ2aXNvci1kYXRhIGlkKSkpKQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvY2xqL2JhY2t0eXBlL3N0b3JtL2NvbW1hbmQvc2V0X2xvZ19sZXZlbC5jbGogYi9zdG9ybS1jb3JlL3NyYy9jbGovYmFja3R5cGUvc3Rvcm0vY29tbWFuZC9zZXRfbG9nX2xldmVsLmNsagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGIyOTdkCi0tLSAvZGV2L251bGwKKysrIGIvc3Rvcm0tY29yZS9zcmMvY2xqL2JhY2t0eXBlL3N0b3JtL2NvbW1hbmQvc2V0X2xvZ19sZXZlbC5jbGoKQEAgLTAsMCArMSw3NSBAQAorOzsgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorOzsgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCis7OyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorOzsgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorOzsgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorOzsgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorOzsgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOzsKKzs7IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOzsKKzs7IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzs7IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis7OyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzs7IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzs7IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKG5zIGJhY2t0eXBlLnN0b3JtLmNvbW1hbmQuc2V0LWxvZy1sZXZlbAorICAoOnVzZSBbY2xvanVyZS50b29scy5jbGkgOm9ubHkgW2NsaV1dKQorICAoOnVzZSBbYmFja3R5cGUuc3Rvcm0gdGhyaWZ0IGxvZ10pCisgICg6aW1wb3J0IFtvcmcuYXBhY2hlLmxvZ2dpbmcubG9nNGogTGV2ZWxdKQorICAoOmltcG9ydCBbYmFja3R5cGUuc3Rvcm0uZ2VuZXJhdGVkIExvZ0NvbmZpZyBMb2dMZXZlbCBMb2dMZXZlbEFjdGlvbl0pCisgICg6Z2VuLWNsYXNzKSkKKworKGRlZm4tIGdldC1zdG9ybS1pZAorICAiR2V0IHRvcG9sb2d5IGlkIGZvciBhIHJ1bm5pbmcgdG9wb2xvZ3kgZnJvbSB0aGUgdG9wb2xvZ3kgbmFtZS4iCisgIFtuaW1idXMgbmFtZV0KKyAgKGxldCBbaW5mbyAoLmdldENsdXN0ZXJJbmZvIG5pbWJ1cykKKyAgICAgICAgdG9wb2xvZ2llcyAoLmdldF90b3BvbG9naWVzIGluZm8pCisgICAgICAgIHRvcG9sb2d5IChmaXJzdCAoZmlsdGVyIChmbiBbdG9wb10gKD0gbmFtZSAoLmdldF9uYW1lIHRvcG8pKSkgdG9wb2xvZ2llcykpXQorICAgIChpZiB0b3BvbG9neSAKKyAgICAgICguZ2V0X2lkIHRvcG9sb2d5KQorICAgICAgKHRocm93ICguSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIChzdHIgbmFtZSAiIGlzIG5vdCBhIHJ1bm5pbmcgdG9wb2xvZ3kiKSkpKSkpCisKKyhkZWZuLSBwYXJzZS1uYW1lZC1sb2ctbGV2ZWxzIFthY3Rpb25dCisgICJQYXJzZXMgW2xvZ2dlciBuYW1lXT1bbGV2ZWwgc3RyaW5nXTpbb3B0aW9uYWwgdGltZW91dF0sW2xvZ2dlciBuYW1lMl0uLi4KKworICAgZS5nLiBST09UPURFQlVHOjMwCisgICAgICAgIHJvb3QgbG9nZ2VyLCBkZWJ1ZyBmb3IgMzAgc2Vjb25kcworCisgICAgICAgIG9yZy5hcGFjaGUuZm9vPVdBUk4KKyAgICAgICAgb3JnLmFwYWNoZS5mb28gc2V0IHRvIFdBUk4gaW5kZWZpbml0ZWx5IgorICAoZm4gW15TdHJpbmcgc10KKyAgICAobGV0IFtsb2ctYXJncyAocmUtZmluZCAjIiguKik9KFtBLVpdKyk6PyhcZCopIiBzKQorICAgICAgICAgIG5hbWUgKGlmICg9IGFjdGlvbiBMb2dMZXZlbEFjdGlvbi9SRU1PVkUpIHMgKG50aCBsb2ctYXJncyAxKSkKKyAgICAgICAgICBsZXZlbCAoTGV2ZWwvdG9MZXZlbCAobnRoIGxvZy1hcmdzIDIpKQorICAgICAgICAgIHRpbWVvdXQtc3RyIChudGggbG9nLWFyZ3MgMykKKyAgICAgICAgICBsb2ctbGV2ZWwgKExvZ0xldmVsLildCisgICAgICAoaWYgKD0gYWN0aW9uIExvZ0xldmVsQWN0aW9uL1JFTU9WRSkKKyAgICAgICAgKC5zZXRfYWN0aW9uIGxvZy1sZXZlbCBhY3Rpb24pCisgICAgICAgIChkbworICAgICAgICAgICguc2V0X2FjdGlvbiBsb2ctbGV2ZWwgYWN0aW9uKQorICAgICAgICAgICguc2V0X3RhcmdldF9sb2dfbGV2ZWwgbG9nLWxldmVsICgudG9TdHJpbmcgbGV2ZWwpKQorICAgICAgICAgICguc2V0X3Jlc2V0X2xvZ19sZXZlbF90aW1lb3V0X3NlY3MgbG9nLWxldmVsCisgICAgICAgICAgICAoSW50ZWdlci4gKGlmICg9IHRpbWVvdXQtc3RyICIiKSAiMCIgdGltZW91dC1zdHIpKSkpKQorICAgICAge25hbWUgbG9nLWxldmVsfSkpKQorCisoZGVmbi0gbWVyZ2UtdG9nZXRoZXIgW3ByZXZpb3VzIGtleSB2YWxdCisgICAoYXNzb2MgcHJldmlvdXMga2V5CisgICAgICAoaWYtbGV0IFtvbGR2YWwgKGdldCBwcmV2aW91cyBrZXkpXQorICAgICAgICAgKG1lcmdlIG9sZHZhbCB2YWwpCisgICAgICAgICB2YWwpKSkKKworKGRlZm4gLW1haW4gWyYgYXJnc10KKyAgKGxldCBbW3tsb2ctc2V0dGluZyA6bG9nLXNldHRpbmcgcmVtb3ZlLWxvZy1zZXR0aW5nIDpyZW1vdmUtbG9nLXNldHRpbmd9IFtuYW1lXSBfXQorICAgICAgICAoY2xpIGFyZ3MgWyItbCIgIi0tbG9nLXNldHRpbmciCisgICAgICAgICAgICAgICAgICAgOnBhcnNlLWZuIChwYXJzZS1uYW1lZC1sb2ctbGV2ZWxzIExvZ0xldmVsQWN0aW9uL1VQREFURSkKKyAgICAgICAgICAgICAgICAgICA6YXNzb2MtZm4gbWVyZ2UtdG9nZXRoZXJdCisgICAgICAgICAgICAgICAgICBbIi1yIiAiLS1yZW1vdmUtbG9nLXNldHRpbmciCisgICAgICAgICAgICAgICAgICAgOnBhcnNlLWZuIChwYXJzZS1uYW1lZC1sb2ctbGV2ZWxzIExvZ0xldmVsQWN0aW9uL1JFTU9WRSkKKyAgICAgICAgICAgICAgICAgICA6YXNzb2MtZm4gbWVyZ2UtdG9nZXRoZXJdKQorICAgICAgICBsb2ctY29uZmlnIChMb2dDb25maWcuKV0KKyAgICAoZG9zZXEgW1tsb2ctbmFtZSBsb2ctdmFsXSAobWVyZ2UgbG9nLXNldHRpbmcgcmVtb3ZlLWxvZy1zZXR0aW5nKV0KKyAgICAgICgucHV0X3RvX25hbWVkX2xvZ2dlcl9sZXZlbCBsb2ctY29uZmlnIGxvZy1uYW1lIGxvZy12YWwpKQorICAgIChsb2ctbWVzc2FnZSAiU2VudCBsb2cgY29uZmlnICIgbG9nLWNvbmZpZyAiIGZvciB0b3BvbG9neSAiIG5hbWUpCisgICAgKHdpdGgtY29uZmlndXJlZC1uaW1idXMtY29ubmVjdGlvbiBuaW1idXMKKyAgICAgICguc2V0TG9nQ29uZmlnIG5pbWJ1cyAoZ2V0LXN0b3JtLWlkIG5pbWJ1cyBuYW1lKSBsb2ctY29uZmlnKSkpKQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvY2xqL2JhY2t0eXBlL3N0b3JtL2NvbmZpZy5jbGogYi9zdG9ybS1jb3JlL3NyYy9jbGovYmFja3R5cGUvc3Rvcm0vY29uZmlnLmNsagppbmRleCBmN2ZhYmM0Li45NGI2NmMzIDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9jbGovYmFja3R5cGUvc3Rvcm0vY29uZmlnLmNsagorKysgYi9zdG9ybS1jb3JlL3NyYy9jbGovYmFja3R5cGUvc3Rvcm0vY29uZmlnLmNsagpAQCAtMTcsMTggKzE3LDIwIEBACiAobnMgYmFja3R5cGUuc3Rvcm0uY29uZmlnCiAgICg6aW1wb3J0IFtqYXZhLmlvIEZpbGVSZWFkZXIgRmlsZSBJT0V4Y2VwdGlvbl0KICAgICAgICAgICAgW2JhY2t0eXBlLnN0b3JtLmdlbmVyYXRlZCBTdG9ybVRvcG9sb2d5XSkKLSAgKDppbXBvcnQgW2JhY2t0eXBlLnN0b3JtIENvbmZpZyBDb25maWdWYWxpZGF0aW9uJEZpZWxkVmFsaWRhdG9yXSkKKyAgKDppbXBvcnQgW2JhY2t0eXBlLnN0b3JtIENvbmZpZ10pCiAgICg6aW1wb3J0IFtiYWNrdHlwZS5zdG9ybS51dGlscyBVdGlscyBMb2NhbFN0YXRlXSkKKyAgKDppbXBvcnQgW2JhY2t0eXBlLnN0b3JtLnZhbGlkYXRpb24gQ29uZmlnVmFsaWRhdGlvbl0pCiAgICg6aW1wb3J0IFtvcmcuYXBhY2hlLmNvbW1vbnMuaW8gRmlsZVV0aWxzXSkKICAgKDpyZXF1aXJlIFtjbG9qdXJlIFtzdHJpbmcgOmFzIHN0cl1dKQogICAoOnVzZSBbYmFja3R5cGUuc3Rvcm0gbG9nIHV0aWxdKSkKIAogKGRlZiBSRVNPVVJDRVMtU1VCRElSICJyZXNvdXJjZXMiKQorKGRlZiBOSU1CVVMtRE8tTk9ULVJFQVNTSUdOICJOSU1CVVMtRE8tTk9ULVJFQVNTSUdOIikKIAogKGRlZm4tIGNsb2p1cmUtY29uZmlnLW5hbWUgW25hbWVdCiAgICgucmVwbGFjZSAoLnRvVXBwZXJDYXNlIG5hbWUpICJfIiAiLSIpKQogCi07OyBkZWZpbmUgY2xvanVyZSBjb25zdGFudHMgZm9yIGV2ZXJ5IGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyCis7IGRlZmluZSBjbG9qdXJlIGNvbnN0YW50cyBmb3IgZXZlcnkgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIKIChkb3NlcSBbZiAoc2VxICguZ2V0RmllbGRzIENvbmZpZykpXQogICAobGV0IFtuYW1lICguZ2V0TmFtZSBmKQogICAgICAgICBuZXctbmFtZSAoY2xvanVyZS1jb25maWctbmFtZSBuYW1lKV0KQEAgLTM5LDM1ICs0MSw2IEBACiAgIChkb2ZvciBbZiAoc2VxICguZ2V0RmllbGRzIENvbmZpZykpXQogICAgICAgICAgKC5nZXQgZiBuaWwpKSkKIAotKGRlZm11bHRpIGdldC1GaWVsZFZhbGlkYXRvciBjbGFzcy1zZWxlY3RvcikKLQotKGRlZm1ldGhvZCBnZXQtRmllbGRWYWxpZGF0b3IgbmlsIFtfXQotICAodGhyb3cgKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi4gIkNhbm5vdCB2YWxpZGF0ZSBhIG5pbCBmaWVsZC4iKSkpCi0KLShkZWZtZXRob2QgZ2V0LUZpZWxkVmFsaWRhdG9yCi0gIENvbmZpZ1ZhbGlkYXRpb24kRmllbGRWYWxpZGF0b3IgW3ZhbGlkYXRvcl0gdmFsaWRhdG9yKQotCi0oZGVmbWV0aG9kIGdldC1GaWVsZFZhbGlkYXRvciBPYmplY3QKLSAgW2tsYXNzXQotICB7OnByZSBbKG5vdCAobmlsPyBrbGFzcykpXX0KLSAgKHJlaWZ5IENvbmZpZ1ZhbGlkYXRpb24kRmllbGRWYWxpZGF0b3IKLSAgICAodmFsaWRhdGVGaWVsZCBbdGhpcyBuYW1lIHZdCi0gICAgICAgICAgICAgICAgICAgKGlmIChhbmQgKG5vdCAobmlsPyB2KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAobm90IChpbnN0YW5jZT8ga2xhc3MgdikpKQotICAgICAgICAgICAgICAgICAgICAgKHRocm93IChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RyICJmaWVsZCAiIG5hbWUgIiAnIiB2ICInIG11c3QgYmUgYSAnIiAoLmdldE5hbWUga2xhc3MpICInIikpKSkpKSkKLQotOzsgQ3JlYXRlIGEgbWFwcGluZyBvZiBjb25maWctc3RyaW5nIC0+IHZhbGlkYXRvcgotOzsgQ29uZmlnIGZpZWxkcyBtdXN0IGhhdmUgYSBfU0NIRU1BIGZpZWxkIGRlZmluZWQKLShkZWYgQ09ORklHLVNDSEVNQS1NQVAKLSAgKC0+PiAoLmdldEZpZWxkcyBDb25maWcpCi0gICAgICAgKGZpbHRlciAjKG5vdCAocmUtbWF0Y2hlcyAjIi4qX1NDSEVNQSQiICguZ2V0TmFtZSAlKSkpKQotICAgICAgIChtYXAgKGZuIFtmXSBbKC5nZXQgZiBuaWwpCi0gICAgICAgICAgICAgICAgICAgICAoZ2V0LUZpZWxkVmFsaWRhdG9yCi0gICAgICAgICAgICAgICAgICAgICAgICgtPiBDb25maWcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICguZ2V0RmllbGQgKHN0ciAoLmdldE5hbWUgZikgIl9TQ0hFTUEiKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICguZ2V0IG5pbCkpKV0pKQotICAgICAgIChpbnRvIHt9KSkpCiAKIChkZWZuIGNsdXN0ZXItbW9kZQogICBbY29uZiAmIGFyZ3NdCkBAIC05MiwzMCArNjUsMTMgQEAKICAgW2NvbmZdCiAgIChldmVuLXNhbXBsZXIgKHNhbXBsaW5nLXJhdGUgY29uZikpKQogCi07IHN0b3JtLnpvb2tlZXBlci5zZXJ2ZXJzOgotOyAgICAgLSAic2VydmVyMSIKLTsgICAgIC0gInNlcnZlcjIiCi07ICAgICAtICJzZXJ2ZXIzIgotOyBuaW1idXMuaG9zdDogIm1hc3RlciIKLTsKLTsgIyMjIyMjIyMjIyMgVGhlc2UgYWxsIGhhdmUgZGVmYXVsdCB2YWx1ZXMgYXMgc2hvd24KLTsKLTsgIyMjIHN0b3JtLiogY29uZmlncyBhcmUgZ2VuZXJhbCBjb25maWd1cmF0aW9ucwotOyAjIHRoZSBsb2NhbCBkaXIgaXMgd2hlcmUgamFycyBhcmUga2VwdAotOyBzdG9ybS5sb2NhbC5kaXI6ICIvbW50L3N0b3JtIgotOyBzdG9ybS56b29rZWVwZXIucG9ydDogMjE4MQotOyBzdG9ybS56b29rZWVwZXIucm9vdDogIi9zdG9ybSIKLQogKGRlZm4gcmVhZC1kZWZhdWx0LWNvbmZpZwogICBbXQogICAoY2xvanVyaWZ5LXN0cnVjdHVyZSAoVXRpbHMvcmVhZERlZmF1bHRDb25maWcpKSkKIAogKGRlZm4gdmFsaWRhdGUtY29uZmlncy13aXRoLXNjaGVtYXMKICAgW2NvbmZdCi0gIChkb3NlcSBbW2sgdl0gY29uZgotICAgICAgICAgIDpsZXQgW3NjaGVtYSAoQ09ORklHLVNDSEVNQS1NQVAgayldXQotICAgIChpZiAobm90IChuaWw/IHNjaGVtYSkpCi0gICAgICAoLnZhbGlkYXRlRmllbGQgc2NoZW1hIGsgdikpKSkKKyAgKENvbmZpZ1ZhbGlkYXRpb24vdmFsaWRhdGVGaWVsZHMgY29uZikpCiAKIChkZWZuIHJlYWQtc3Rvcm0tY29uZmlnCiAgIFtdCkBAIC0xMzQsNyArOTAsMTYgQEAKIChkZWZuIGFic29sdXRlLXN0b3JtLWxvY2FsLWRpciBbY29uZl0KICAgKGxldCBbc3Rvcm0taG9tZSAoU3lzdGVtL2dldFByb3BlcnR5ICJzdG9ybS5ob21lIikKICAgICAgICAgcGF0aCAoY29uZiBTVE9STS1MT0NBTC1ESVIpXQotICAgIChpZiAoaXMtYWJzb2x1dGUtcGF0aD8gcGF0aCkgcGF0aCAoc3RyIHN0b3JtLWhvbWUgZmlsZS1wYXRoLXNlcGFyYXRvciBwYXRoKSkpKQorICAgIChpZiBwYXRoCisgICAgICAoaWYgKGlzLWFic29sdXRlLXBhdGg/IHBhdGgpIHBhdGggKHN0ciBzdG9ybS1ob21lIGZpbGUtcGF0aC1zZXBhcmF0b3IgcGF0aCkpCisgICAgICAoc3RyIHN0b3JtLWhvbWUgZmlsZS1wYXRoLXNlcGFyYXRvciAic3Rvcm0tbG9jYWwiKSkpKQorCisoZGVmbiBhYnNvbHV0ZS1oZWFsdGhjaGVjay1kaXIgW2NvbmZdCisgIChsZXQgW3N0b3JtLWhvbWUgKFN5c3RlbS9nZXRQcm9wZXJ0eSAic3Rvcm0uaG9tZSIpCisgICAgICAgIHBhdGggKGNvbmYgU1RPUk0tSEVBTFRILUNIRUNLLURJUildCisgICAgKGlmIHBhdGgKKyAgICAgIChpZiAoaXMtYWJzb2x1dGUtcGF0aD8gcGF0aCkgcGF0aCAoc3RyIHN0b3JtLWhvbWUgZmlsZS1wYXRoLXNlcGFyYXRvciBwYXRoKSkKKyAgICAgIChzdHIgc3Rvcm0taG9tZSBmaWxlLXBhdGgtc2VwYXJhdG9yICJoZWFsdGhjaGVja3MiKSkpKQogCiAoZGVmbiBtYXN0ZXItbG9jYWwtZGlyCiAgIFtjb25mXQpAQCAtMjIzLDYgKzE4OCwxMCBAQAogICBbY29uZl0KICAgKExvY2FsU3RhdGUuIChzdHIgKHN1cGVydmlzb3ItbG9jYWwtZGlyIGNvbmYpIGZpbGUtcGF0aC1zZXBhcmF0b3IgImxvY2Fsc3RhdGUiKSkpCiAKKyhkZWZuIF5Mb2NhbFN0YXRlIG5pbWJ1cy10b3BvLWhpc3Rvcnktc3RhdGUKKyAgW2NvbmZdCisgIChMb2NhbFN0YXRlLiAoc3RyIChtYXN0ZXItbG9jYWwtZGlyIGNvbmYpIGZpbGUtcGF0aC1zZXBhcmF0b3IgImhpc3RvcnkiKSkpCisKIChkZWZuIHJlYWQtc3VwZXJ2aXNvci1zdG9ybS1jb25mCiAgIFtjb25mIHN0b3JtLWlkXQogICAobGV0IFtzdG9ybXJvb3QgKHN1cGVydmlzb3Itc3Rvcm1kaXN0LXJvb3QgY29uZiBzdG9ybS1pZCkKQEAgLTI2Myw2ICsyMzIsMjkgQEAKICAgKGxvZy1tZXNzYWdlICJSRU1PVkUgd29ya2VyLXVzZXIgIiB3b3JrZXItaWQpCiAgICguZGVsZXRlIChGaWxlLiAod29ya2VyLXVzZXItZmlsZSBjb25mIHdvcmtlci1pZCkpKSkKIAorKGRlZm4gd29ya2VyLWFydGlmYWN0cy1yb290CisgIChbY29uZl0KKyAgIChzdHIgKGFic29sdXRlLXN0b3JtLWxvY2FsLWRpciBjb25mKSBmaWxlLXBhdGgtc2VwYXJhdG9yICJ3b3JrZXJzLWFydGlmYWN0cyIpKQorICAoW2NvbmYgaWRdCisgICAoc3RyICh3b3JrZXItYXJ0aWZhY3RzLXJvb3QgY29uZikgZmlsZS1wYXRoLXNlcGFyYXRvciBpZCkpCisgIChbY29uZiBpZCBwb3J0XQorICAgKHN0ciAod29ya2VyLWFydGlmYWN0cy1yb290IGNvbmYgaWQpIGZpbGUtcGF0aC1zZXBhcmF0b3IgcG9ydCkpKQorCisoZGVmbiB3b3JrZXItYXJ0aWZhY3RzLXBpZC1wYXRoCisgIFtjb25mIGlkIHBvcnRdCisgIChzdHIgKHdvcmtlci1hcnRpZmFjdHMtcm9vdCBjb25mIGlkIHBvcnQpIGZpbGUtcGF0aC1zZXBhcmF0b3IgIndvcmtlci5waWQiKSkKKworKGRlZm4gZ2V0LWxvZy1tZXRhZGF0YS1maWxlCisgIChbZm5hbWVdCisgICAgKGxldCBbW2lkIHBvcnQgJiBfXSAoc3RyL3NwbGl0IGZuYW1lIChyZS1wYXR0ZXJuIGZpbGUtcGF0aC1zZXBhcmF0b3IpKV0KKyAgICAgIChnZXQtbG9nLW1ldGFkYXRhLWZpbGUgKHJlYWQtc3Rvcm0tY29uZmlnKSBpZCBwb3J0KSkpCisgIChbY29uZiBpZCBwb3J0XQorICAgIChjbG9qdXJlLmphdmEuaW8vZmlsZSAoc3RyICh3b3JrZXItYXJ0aWZhY3RzLXJvb3QgY29uZiBpZCkgZmlsZS1wYXRoLXNlcGFyYXRvciBwb3J0IGZpbGUtcGF0aC1zZXBhcmF0b3IpICJ3b3JrZXIueWFtbCIpKSkKKworKGRlZm4gZ2V0LXdvcmtlci1kaXItZnJvbS1yb290CisgIFtsb2ctcm9vdCBpZCBwb3J0XQorICAoY2xvanVyZS5qYXZhLmlvL2ZpbGUgKHN0ciBsb2ctcm9vdCBmaWxlLXBhdGgtc2VwYXJhdG9yIGlkIGZpbGUtcGF0aC1zZXBhcmF0b3IgcG9ydCkpKQorCiAoZGVmbiB3b3JrZXItcm9vdAogICAoW2NvbmZdCiAgICAoc3RyIChhYnNvbHV0ZS1zdG9ybS1sb2NhbC1kaXIgY29uZikgZmlsZS1wYXRoLXNlcGFyYXRvciAid29ya2VycyIpKQpAQCAtMjg3LDMgKzI3OSwyMyBAQAogKGRlZm4gXkxvY2FsU3RhdGUgd29ya2VyLXN0YXRlCiAgIFtjb25mIGlkXQogICAoTG9jYWxTdGF0ZS4gKHdvcmtlci1oZWFydGJlYXRzLXJvb3QgY29uZiBpZCkpKQorCisoZGVmbiBvdmVycmlkZS1sb2dpbi1jb25maWctd2l0aC1zeXN0ZW0tcHJvcGVydHkgW2NvbmZdCisgIChpZi1sZXQgW2xvZ2luX2NvbmZfZmlsZSAoU3lzdGVtL2dldFByb3BlcnR5ICJqYXZhLnNlY3VyaXR5LmF1dGgubG9naW4uY29uZmlnIildCisgICAgKGFzc29jIGNvbmYgImphdmEuc2VjdXJpdHkuYXV0aC5sb2dpbi5jb25maWciIGxvZ2luX2NvbmZfZmlsZSkKKyAgICBjb25mKSkKKworKGRlZm4gZ2V0LXRvcG8tbG9ncy11c2VycworICBbdG9wb2xvZ3ktY29uZl0KKyAgKHNvcnQgKGRpc3RpbmN0IChyZW1vdmUgbmlsPworICAgICAgICAgICAgICAgICAgICAoY29uY2F0CisgICAgICAgICAgICAgICAgICAgICAgKHRvcG9sb2d5LWNvbmYgTE9HUy1VU0VSUykKKyAgICAgICAgICAgICAgICAgICAgICAodG9wb2xvZ3ktY29uZiBUT1BPTE9HWS1VU0VSUykpKSkpKQorCisoZGVmbiBnZXQtdG9wby1sb2dzLWdyb3VwcworICBbdG9wb2xvZ3ktY29uZl0KKyAgKHNvcnQgKGRpc3RpbmN0IChyZW1vdmUgbmlsPworICAgICAgICAgICAgICAgICAgICAoY29uY2F0CisgICAgICAgICAgICAgICAgICAgICAgKHRvcG9sb2d5LWNvbmYgTE9HUy1HUk9VUFMpCisgICAgICAgICAgICAgICAgICAgICAgKHRvcG9sb2d5LWNvbmYgVE9QT0xPR1ktR1JPVVBTKSkpKSkpCisKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2Nsai9iYWNrdHlwZS9zdG9ybS9jb252ZXJ0ZXIuY2xqIGIvc3Rvcm0tY29yZS9zcmMvY2xqL2JhY2t0eXBlL3N0b3JtL2NvbnZlcnRlci5jbGoKaW5kZXggYzU3MWZhMS4uNTJhMTgxNyAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvY2xqL2JhY2t0eXBlL3N0b3JtL2NvbnZlcnRlci5jbGoKKysrIGIvc3Rvcm0tY29yZS9zcmMvY2xqL2JhY2t0eXBlL3N0b3JtL2NvbnZlcnRlci5jbGoKQEAgLTE0LDkgKzE0LDkgQEAKIDs7IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIDs7IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKG5zIGJhY2t0eXBlLnN0b3JtLmNvbnZlcnRlcgotICAoOmltcG9ydCBbYmFja3R5cGUuc3Rvcm0uZ2VuZXJhdGVkIFN1cGVydmlzb3JJbmZvIE5vZGVJbmZvIEFzc2lnbm1lbnQKKyAgKDppbXBvcnQgW2JhY2t0eXBlLnN0b3JtLmdlbmVyYXRlZCBTdXBlcnZpc29ySW5mbyBOb2RlSW5mbyBBc3NpZ25tZW50IFdvcmtlclJlc291cmNlcwogICAgICAgICAgICAgU3Rvcm1CYXNlIFRvcG9sb2d5U3RhdHVzIENsdXN0ZXJXb3JrZXJIZWFydGJlYXQgRXhlY3V0b3JJbmZvIEVycm9ySW5mbyBDcmVkZW50aWFscyBSZWJhbGFuY2VPcHRpb25zIEtpbGxPcHRpb25zCi0gICAgICAgICAgICBUb3BvbG9neUFjdGlvbk9wdGlvbnMgRGVidWdPcHRpb25zXSkKKyAgICAgICAgICAgIFRvcG9sb2d5QWN0aW9uT3B0aW9ucyBEZWJ1Z09wdGlvbnMgUHJvZmlsZVJlcXVlc3RdKQogICAoOnVzZSBbYmFja3R5cGUuc3Rvcm0gdXRpbCBzdGF0cyBsb2ddKQogICAoOnJlcXVpcmUgW2JhY2t0eXBlLnN0b3JtLmRhZW1vbiBbY29tbW9uIDphcyBjb21tb25dXSkpCiAKQEAgLTMwLDYgKzMwLDcgQEAKICAgICAoLnNldF9zY2hlZHVsZXJfbWV0YSAoOnNjaGVkdWxlci1tZXRhIHN1cGVydmlzb3ItaW5mbykpCiAgICAgKC5zZXRfdXB0aW1lX3NlY3MgKGxvbmcgKDp1cHRpbWUtc2VjcyBzdXBlcnZpc29yLWluZm8pKSkKICAgICAoLnNldF92ZXJzaW9uICg6dmVyc2lvbiBzdXBlcnZpc29yLWluZm8pKQorICAgICguc2V0X3Jlc291cmNlc19tYXAgKDpyZXNvdXJjZXMtbWFwIHN1cGVydmlzb3ItaW5mbykpCiAgICAgKSkKIAogKGRlZm4gY2xvanVyaWZ5LXN1cGVydmlzb3ItaW5mbyBbXlN1cGVydmlzb3JJbmZvIHN1cGVydmlzb3ItaW5mb10KQEAgLTQyLDIyICs0MywzMyBAQAogICAgICAgKGlmICguZ2V0X21ldGEgc3VwZXJ2aXNvci1pbmZvKSAoaW50byBbXSAoLmdldF9tZXRhIHN1cGVydmlzb3ItaW5mbykpKQogICAgICAgKGlmICguZ2V0X3NjaGVkdWxlcl9tZXRhIHN1cGVydmlzb3ItaW5mbykgKGludG8ge30gKC5nZXRfc2NoZWR1bGVyX21ldGEgc3VwZXJ2aXNvci1pbmZvKSkpCiAgICAgICAoLmdldF91cHRpbWVfc2VjcyBzdXBlcnZpc29yLWluZm8pCi0gICAgICAoLmdldF92ZXJzaW9uIHN1cGVydmlzb3ItaW5mbykpKSkKKyAgICAgICguZ2V0X3ZlcnNpb24gc3VwZXJ2aXNvci1pbmZvKQorICAgICAgKGlmLWxldCBbcmVzLW1hcCAoLmdldF9yZXNvdXJjZXNfbWFwIHN1cGVydmlzb3ItaW5mbyldIChpbnRvIHt9IHJlcy1tYXApKSkpKQogCiAoZGVmbiB0aHJpZnRpZnktYXNzaWdubWVudCBbYXNzaWdubWVudF0KLSAgKGRvdG8gKEFzc2lnbm1lbnQuKQotICAgICguc2V0X21hc3Rlcl9jb2RlX2RpciAoOm1hc3Rlci1jb2RlLWRpciBhc3NpZ25tZW50KSkKLSAgICAoLnNldF9ub2RlX2hvc3QgKDpub2RlLT5ob3N0IGFzc2lnbm1lbnQpKQotICAgICguc2V0X2V4ZWN1dG9yX25vZGVfcG9ydCAobWFwLXZhbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbiBbbm9kZStwb3J0XQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE5vZGVJbmZvLiAoZmlyc3Qgbm9kZStwb3J0KSAoc2V0IChtYXAgbG9uZyAocmVzdCBub2RlK3BvcnQpKSkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXAta2V5ICMobWFwIGxvbmcgJSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg6ZXhlY3V0b3ItPm5vZGUrcG9ydCBhc3NpZ25tZW50KSkpKQotICAgICguc2V0X2V4ZWN1dG9yX3N0YXJ0X3RpbWVfc2VjcwotICAgICAgKG1hcC12YWwKLSAgICAgICAgbG9uZwotICAgICAgICAobWFwLWtleSAjKG1hcCBsb25nICUpCi0gICAgICAgICAgKDpleGVjdXRvci0+c3RhcnQtdGltZS1zZWNzIGFzc2lnbm1lbnQpKSkpKSkKKyAgKGxldCBbdGhyaWZ0LWFzc2lnbm1lbnQgKGRvdG8gKEFzc2lnbm1lbnQuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICguc2V0X21hc3Rlcl9jb2RlX2RpciAoOm1hc3Rlci1jb2RlLWRpciBhc3NpZ25tZW50KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLnNldF9ub2RlX2hvc3QgKDpub2RlLT5ob3N0IGFzc2lnbm1lbnQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICguc2V0X2V4ZWN1dG9yX25vZGVfcG9ydCAoaW50byB7fQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWFwIChmbiBbW2sgdl1dCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG1hcCBsb25nIGspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE5vZGVJbmZvLiAoZmlyc3QgdikgKHNldCAobWFwIGxvbmcgKHJlc3QgdikpKSldKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg6ZXhlY3V0b3ItPm5vZGUrcG9ydCBhc3NpZ25tZW50KSkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICguc2V0X2V4ZWN1dG9yX3N0YXJ0X3RpbWVfc2VjcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludG8ge30KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXAgKGZuIFtbayB2XV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG1hcCBsb25nIGspIChsb25nIHYpXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDpleGVjdXRvci0+c3RhcnQtdGltZS1zZWNzIGFzc2lnbm1lbnQpKSkpKV0KKyAgICAoaWYgKDp3b3JrZXItPnJlc291cmNlcyBhc3NpZ25tZW50KQorICAgICAgKC5zZXRfd29ya2VyX3Jlc291cmNlcyB0aHJpZnQtYXNzaWdubWVudCAoaW50byB7fSAobWFwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZuIFtbbm9kZStwb3J0IHJlc291cmNlc11dCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKE5vZGVJbmZvLiAoZmlyc3Qgbm9kZStwb3J0KSAoc2V0IChtYXAgbG9uZyAocmVzdCBub2RlK3BvcnQpKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRvdG8gKFdvcmtlclJlc291cmNlcy4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLnNldF9tZW1fb25faGVhcCAoZmlyc3QgcmVzb3VyY2VzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICguc2V0X21lbV9vZmZfaGVhcCAoc2Vjb25kIHJlc291cmNlcykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLnNldF9jcHUgKGxhc3QgcmVzb3VyY2VzKSkpXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoOndvcmtlci0+cmVzb3VyY2VzIGFzc2lnbm1lbnQpKSkpKQorICAgIHRocmlmdC1hc3NpZ25tZW50KSkKIAogKGRlZm4gY2xvanVyaWZ5LWV4ZWN1dG9yLT5ub2RlX3BvcnQgW2V4ZWN1dG9yLT5ub2RlX3BvcnRdCiAgIChpbnRvIHt9CkBAIC02OSw2ICs4MSwxNSBAQAogICAgICAgICAgIChpbnRvIFtdIGxpc3Qtb2YtZXhlY3V0b3JzKSkgOyBsaXN0IG9mIGV4ZWN1dG9ycyBtdXN0IGJlIGNvdmVydGVkIHRvIGNsb2p1cmUgdmVjdG9yIHRvIGVuc3VyZSBpdCBpcyBzb3J0YWJsZS4KICAgICAgICAgZXhlY3V0b3ItPm5vZGVfcG9ydCkpKSkKIAorKGRlZm4gY2xvanVyaWZ5LXdvcmtlci0+cmVzb3VyY2VzIFt3b3JrZXItPnJlc291cmNlc10KKyAgImNvbnZlcnQgd29ya2VyIGluZm8gdG8gYmUgW25vZGUsIHBvcnRdCisgICBjb252ZXJ0IHJlc291cmNlcyB0byBiZSBbbWVtX29uX2hlYXAgbWVtX29mZl9oZWFwIGNwdV0iCisgIChpbnRvIHt9IChtYXAKKyAgICAgICAgICAgICAoZm4gW1tub2RlSW5mbyByZXNvdXJjZXNdXQorICAgICAgICAgICAgICAgWyhjb25jYXQgWyguZ2V0X25vZGUgbm9kZUluZm8pXSAoLmdldF9wb3J0IG5vZGVJbmZvKSkKKyAgICAgICAgICAgICAgICBbKC5nZXRfbWVtX29uX2hlYXAgcmVzb3VyY2VzKSAoLmdldF9tZW1fb2ZmX2hlYXAgcmVzb3VyY2VzKSAoLmdldF9jcHUgcmVzb3VyY2VzKV1dKQorICAgICAgICAgICAgIHdvcmtlci0+cmVzb3VyY2VzKSkpCisKIChkZWZuIGNsb2p1cmlmeS1hc3NpZ25tZW50IFteQXNzaWdubWVudCBhc3NpZ25tZW50XQogICAoaWYgYXNzaWdubWVudAogICAgIChiYWNrdHlwZS5zdG9ybS5kYWVtb24uY29tbW9uLkFzc2lnbm1lbnQuCkBAIC03Niw3ICs5Nyw4IEBACiAgICAgICAoaW50byB7fSAoLmdldF9ub2RlX2hvc3QgYXNzaWdubWVudCkpCiAgICAgICAoY2xvanVyaWZ5LWV4ZWN1dG9yLT5ub2RlX3BvcnQgKGludG8ge30gKC5nZXRfZXhlY3V0b3Jfbm9kZV9wb3J0IGFzc2lnbm1lbnQpKSkKICAgICAgIChtYXAta2V5IChmbiBbZXhlY3V0b3JdIChpbnRvIFtdIGV4ZWN1dG9yKSkKLSAgICAgICAgKGludG8ge30gKC5nZXRfZXhlY3V0b3Jfc3RhcnRfdGltZV9zZWNzIGFzc2lnbm1lbnQpKSkpKSkKKyAgICAgICAgKGludG8ge30gKC5nZXRfZXhlY3V0b3Jfc3RhcnRfdGltZV9zZWNzIGFzc2lnbm1lbnQpKSkKKyAgICAgIChjbG9qdXJpZnktd29ya2VyLT5yZXNvdXJjZXMgKGludG8ge30gKC5nZXRfd29ya2VyX3Jlc291cmNlcyBhc3NpZ25tZW50KSkpKSkpCiAKIChkZWZuIGNvbnZlcnQtdG8tc3ltYm9sLWZyb20tc3RhdHVzIFtzdGF0dXNdCiAgIChjb25kcCA9IHN0YXR1cwpAQCAtMjI3LDYgKzI0OSwyMyBAQAogICAgICguc2V0X2hvc3QgKDpob3N0IGVycm9yKSkKICAgICAoLnNldF9wb3J0ICg6cG9ydCBlcnJvcikpKSkKIAorKGRlZm4gY2xvanVyaWZ5LXByb2ZpbGUtcmVxdWVzdAorICBbXlByb2ZpbGVSZXF1ZXN0IHJlcXVlc3RdCisgICh3aGVuIHJlcXVlc3QKKyAgICB7Omhvc3QgKC5nZXRfbm9kZSAoLmdldF9ub2RlSW5mbyByZXF1ZXN0KSkKKyAgICAgOnBvcnQgKGZpcnN0ICguZ2V0X3BvcnQgKC5nZXRfbm9kZUluZm8gcmVxdWVzdCkpKQorICAgICA6YWN0aW9uICAgICAoLmdldF9hY3Rpb24gcmVxdWVzdCkKKyAgICAgOnRpbWVzdGFtcCAgKC5nZXRfdGltZV9zdGFtcCByZXF1ZXN0KX0pKQorCisoZGVmbiB0aHJpZnRpZnktcHJvZmlsZS1yZXF1ZXN0CisgIFtwcm9maWxlLXJlcXVlc3RdCisgIChsZXQgW25vZGVpbmZvIChkb3RvIChOb2RlSW5mby4pCisgICAgICAgICAgICAgICAgICAgKC5zZXRfbm9kZSAoOmhvc3QgcHJvZmlsZS1yZXF1ZXN0KSkKKyAgICAgICAgICAgICAgICAgICAoLnNldF9wb3J0IChzZXQgWyg6cG9ydCBwcm9maWxlLXJlcXVlc3QpXSkpKQorICAgICAgICByZXF1ZXN0IChQcm9maWxlUmVxdWVzdC4gbm9kZWluZm8gKDphY3Rpb24gcHJvZmlsZS1yZXF1ZXN0KSldCisgICAgKC5zZXRfdGltZV9zdGFtcCByZXF1ZXN0ICg6dGltZXN0YW1wIHByb2ZpbGUtcmVxdWVzdCkpCisgICAgcmVxdWVzdCkpCisKIChkZWZuIHRocmlmdGlmeS1jcmVkZW50aWFscyBbY3JlZGVudGlhbHNdCiAgICAgKGRvdG8gKENyZWRlbnRpYWxzLikKICAgICAgICguc2V0X2NyZWRzIChpZiBjcmVkZW50aWFscyBjcmVkZW50aWFscyB7fSkpKSkKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2Nsai9iYWNrdHlwZS9zdG9ybS9kYWVtb24vYnVpbHRpbl9tZXRyaWNzLmNsaiBiL3N0b3JtLWNvcmUvc3JjL2Nsai9iYWNrdHlwZS9zdG9ybS9kYWVtb24vYnVpbHRpbl9tZXRyaWNzLmNsagppbmRleCA5OTA4MDBhLi4wY2FhMGI5IDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9jbGovYmFja3R5cGUvc3Rvcm0vZGFlbW9uL2J1aWx0aW5fbWV0cmljcy5jbGoKKysrIGIvc3Rvcm0tY29yZS9zcmMvY2xqL2JhY2t0eXBlL3N0b3JtL2RhZW1vbi9idWlsdGluX21ldHJpY3MuY2xqCkBAIC0xNCw0MSArMTQsNDIgQEAKIDs7IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIDs7IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKG5zIGJhY2t0eXBlLnN0b3JtLmRhZW1vbi5idWlsdGluLW1ldHJpY3MKLSAgKDppbXBvcnQgW2JhY2t0eXBlLnN0b3JtLm1ldHJpYy5hcGkgTXVsdGlDb3VudE1ldHJpYyBNdWx0aVJlZHVjZWRNZXRyaWMgQ291bnRNZXRyaWMgTWVhblJlZHVjZXIgU3RhdGVNZXRyaWMgSU1ldHJpYyBJU3RhdGVmdWxPYmplY3RdKQorICAoOmltcG9ydCBbYmFja3R5cGUuc3Rvcm0ubWV0cmljLmFwaSBDb3VudE1ldHJpYyBTdGF0ZU1ldHJpYyBJTWV0cmljIElTdGF0ZWZ1bE9iamVjdF0pCisgICg6aW1wb3J0IFtiYWNrdHlwZS5zdG9ybS5tZXRyaWMuaW50ZXJuYWwgTXVsdGlDb3VudFN0YXRBbmRNZXRyaWMgTXVsdGlMYXRlbmN5U3RhdEFuZE1ldHJpY10pCiAgICg6aW1wb3J0IFtiYWNrdHlwZS5zdG9ybSBDb25maWddKQotICAoOnVzZSBbYmFja3R5cGUuc3Rvcm0uc3RhdHMgOm9ubHkgW3N0YXRzLXJhdGVdXSkpCisgICg6dXNlIFtiYWNrdHlwZS5zdG9ybS5zdGF0c10pKQogCi0oZGVmcmVjb3JkIEJ1aWx0aW5TcG91dE1ldHJpY3MgW15NdWx0aUNvdW50TWV0cmljIGFjay1jb3VudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5NdWx0aVJlZHVjZWRNZXRyaWMgY29tcGxldGUtbGF0ZW5jeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeTXVsdGlDb3VudE1ldHJpYyBmYWlsLWNvdW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5NdWx0aUNvdW50TWV0cmljIGVtaXQtY291bnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXk11bHRpQ291bnRNZXRyaWMgdHJhbnNmZXItY291bnRdKQotKGRlZnJlY29yZCBCdWlsdGluQm9sdE1ldHJpY3MgW15NdWx0aUNvdW50TWV0cmljIGFjay1jb3VudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5NdWx0aVJlZHVjZWRNZXRyaWMgcHJvY2Vzcy1sYXRlbmN5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXk11bHRpQ291bnRNZXRyaWMgZmFpbC1jb3VudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5NdWx0aUNvdW50TWV0cmljIGV4ZWN1dGUtY291bnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeTXVsdGlSZWR1Y2VkTWV0cmljIGV4ZWN1dGUtbGF0ZW5jeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5NdWx0aUNvdW50TWV0cmljIGVtaXQtY291bnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeTXVsdGlDb3VudE1ldHJpYyB0cmFuc2Zlci1jb3VudF0pCisoZGVmcmVjb3JkIEJ1aWx0aW5TcG91dE1ldHJpY3MgW15NdWx0aUNvdW50U3RhdEFuZE1ldHJpYyBhY2stY291bnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXk11bHRpTGF0ZW5jeVN0YXRBbmRNZXRyaWMgY29tcGxldGUtbGF0ZW5jeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeTXVsdGlDb3VudFN0YXRBbmRNZXRyaWMgZmFpbC1jb3VudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeTXVsdGlDb3VudFN0YXRBbmRNZXRyaWMgZW1pdC1jb3VudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeTXVsdGlDb3VudFN0YXRBbmRNZXRyaWMgdHJhbnNmZXItY291bnRdKQorKGRlZnJlY29yZCBCdWlsdGluQm9sdE1ldHJpY3MgW15NdWx0aUNvdW50U3RhdEFuZE1ldHJpYyBhY2stY291bnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeTXVsdGlMYXRlbmN5U3RhdEFuZE1ldHJpYyBwcm9jZXNzLWxhdGVuY3kKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeTXVsdGlDb3VudFN0YXRBbmRNZXRyaWMgZmFpbC1jb3VudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5NdWx0aUNvdW50U3RhdEFuZE1ldHJpYyBleGVjdXRlLWNvdW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXk11bHRpTGF0ZW5jeVN0YXRBbmRNZXRyaWMgZXhlY3V0ZS1sYXRlbmN5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXk11bHRpQ291bnRTdGF0QW5kTWV0cmljIGVtaXQtY291bnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeTXVsdGlDb3VudFN0YXRBbmRNZXRyaWMgdHJhbnNmZXItY291bnRdKQogKGRlZnJlY29yZCBTcG91dFRocm90dGxpbmdNZXRyaWNzIFteQ291bnRNZXRyaWMgc2tpcHBlZC1tYXgtc3BvdXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXkNvdW50TWV0cmljIHNraXBwZWQtdGhyb3R0bGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXkNvdW50TWV0cmljIHNraXBwZWQtaW5hY3RpdmVdKQogCiAKLShkZWZuIG1ha2UtZGF0YSBbZXhlY3V0b3ItdHlwZV0KKyhkZWZuIG1ha2UtZGF0YSBbZXhlY3V0b3ItdHlwZSBzdGF0c10KICAgKGNvbmRwID0gZXhlY3V0b3ItdHlwZQotICAgIDpzcG91dCAoQnVpbHRpblNwb3V0TWV0cmljcy4gKE11bHRpQ291bnRNZXRyaWMuKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE11bHRpUmVkdWNlZE1ldHJpYy4gKE1lYW5SZWR1Y2VyLikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTXVsdGlDb3VudE1ldHJpYy4pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTXVsdGlDb3VudE1ldHJpYy4pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTXVsdGlDb3VudE1ldHJpYy4pKQotICAgIDpib2x0IChCdWlsdGluQm9sdE1ldHJpY3MuIChNdWx0aUNvdW50TWV0cmljLikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTXVsdGlSZWR1Y2VkTWV0cmljLiAoTWVhblJlZHVjZXIuKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTXVsdGlDb3VudE1ldHJpYy4pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE11bHRpQ291bnRNZXRyaWMuKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNdWx0aVJlZHVjZWRNZXRyaWMuIChNZWFuUmVkdWNlci4pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNdWx0aUNvdW50TWV0cmljLikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTXVsdGlDb3VudE1ldHJpYy4pKSkpCisgICAgOnNwb3V0IChCdWlsdGluU3BvdXRNZXRyaWNzLiAoc3RhdHMtYWNrZWQgc3RhdHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RhdHMtY29tcGxldGUtbGF0ZW5jaWVzIHN0YXRzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXRzLWZhaWxlZCBzdGF0cykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0cy1lbWl0dGVkIHN0YXRzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXRzLXRyYW5zZmVycmVkIHN0YXRzKSkKKyAgICA6Ym9sdCAoQnVpbHRpbkJvbHRNZXRyaWNzLiAoc3RhdHMtYWNrZWQgc3RhdHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXRzLXByb2Nlc3MtbGF0ZW5jaWVzIHN0YXRzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0cy1mYWlsZWQgc3RhdHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXRzLWV4ZWN1dGVkIHN0YXRzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0cy1leGVjdXRlLWxhdGVuY2llcyBzdGF0cykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RhdHMtZW1pdHRlZCBzdGF0cykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RhdHMtdHJhbnNmZXJyZWQgc3RhdHMpKSkpCiAKIChkZWZuIG1ha2Utc3BvdXQtdGhyb3R0bGluZy1kYXRhIFtdCiAgIChTcG91dFRocm90dGxpbmdNZXRyaWNzLiAoQ291bnRNZXRyaWMuKQpAQCAtODcsMzMgKzg4LDYgQEAKICAgICAoLnJlZ2lzdGVyTWV0cmljIHRvcG9sb2d5LWNvbnRleHQgKHN0ciAiX18iIChuYW1lIHFuYW1lKSkgKFN0YXRlTWV0cmljLiBxKQogICAgICAgICAgICAgICAgICAgICAgKGludCAoZ2V0IHN0b3JtLWNvbmYgQ29uZmlnL1RPUE9MT0dZX0JVSUxUSU5fTUVUUklDU19CVUNLRVRfU0laRV9TRUNTKSkpKSkKIAotKGRlZm4gc3BvdXQtYWNrZWQtdHVwbGUhIFteQnVpbHRpblNwb3V0TWV0cmljcyBtIHN0YXRzIHN0cmVhbSBsYXRlbmN5LW1zXSAgCi0gICgtPiBtIC5hY2stY291bnQgKC5zY29wZSBzdHJlYW0pICguaW5jckJ5IChzdGF0cy1yYXRlIHN0YXRzKSkpCi0gICgtPiBtIC5jb21wbGV0ZS1sYXRlbmN5ICguc2NvcGUgc3RyZWFtKSAoLnVwZGF0ZSBsYXRlbmN5LW1zKSkpCi0KLShkZWZuIHNwb3V0LWZhaWxlZC10dXBsZSEgW15CdWlsdGluU3BvdXRNZXRyaWNzIG0gc3RhdHMgc3RyZWFtXSAgCi0gICgtPiBtIC5mYWlsLWNvdW50ICguc2NvcGUgc3RyZWFtKSAoLmluY3JCeSAoc3RhdHMtcmF0ZSBzdGF0cykpKSkKLQotKGRlZm4gYm9sdC1leGVjdXRlLXR1cGxlISBbXkJ1aWx0aW5Cb2x0TWV0cmljcyBtIHN0YXRzIGNvbXAtaWQgc3RyZWFtIGxhdGVuY3ktbXNdCi0gIChsZXQgW3Njb3BlIChzdHIgY29tcC1pZCAiOiIgc3RyZWFtKV0gICAgCi0gICAgKC0+IG0gLmV4ZWN1dGUtY291bnQgKC5zY29wZSBzY29wZSkgKC5pbmNyQnkgKHN0YXRzLXJhdGUgc3RhdHMpKSkKLSAgICAoLT4gbSAuZXhlY3V0ZS1sYXRlbmN5ICguc2NvcGUgc2NvcGUpICgudXBkYXRlIGxhdGVuY3ktbXMpKSkpCi0KLShkZWZuIGJvbHQtYWNrZWQtdHVwbGUhIFteQnVpbHRpbkJvbHRNZXRyaWNzIG0gc3RhdHMgY29tcC1pZCBzdHJlYW0gbGF0ZW5jeS1tc10KLSAgKGxldCBbc2NvcGUgKHN0ciBjb21wLWlkICI6IiBzdHJlYW0pXQotICAgICgtPiBtIC5hY2stY291bnQgKC5zY29wZSBzY29wZSkgKC5pbmNyQnkgKHN0YXRzLXJhdGUgc3RhdHMpKSkKLSAgICAoLT4gbSAucHJvY2Vzcy1sYXRlbmN5ICguc2NvcGUgc2NvcGUpICgudXBkYXRlIGxhdGVuY3ktbXMpKSkpCi0KLShkZWZuIGJvbHQtZmFpbGVkLXR1cGxlISBbXkJ1aWx0aW5Cb2x0TWV0cmljcyBtIHN0YXRzIGNvbXAtaWQgc3RyZWFtXQotICAobGV0IFtzY29wZSAoc3RyIGNvbXAtaWQgIjoiIHN0cmVhbSldICAgIAotICAgICgtPiBtIC5mYWlsLWNvdW50ICguc2NvcGUgc2NvcGUpICguaW5jckJ5IChzdGF0cy1yYXRlIHN0YXRzKSkpKSkKLQotKGRlZm4gZW1pdHRlZC10dXBsZSEgW20gc3RhdHMgc3RyZWFtXQotICAoLT4gbSA6ZW1pdC1jb3VudCAoLnNjb3BlIHN0cmVhbSkgKC5pbmNyQnkgKHN0YXRzLXJhdGUgc3RhdHMpKSkpCi0KLShkZWZuIHRyYW5zZmVycmVkLXR1cGxlISBbbSBzdGF0cyBzdHJlYW0gbnVtLW91dC10YXNrc10KLSAgKC0+IG0gOnRyYW5zZmVyLWNvdW50ICguc2NvcGUgc3RyZWFtKSAoLmluY3JCeSAoKiBudW0tb3V0LXRhc2tzIChzdGF0cy1yYXRlIHN0YXRzKSkpKSkKLQogKGRlZm4gc2tpcHBlZC1tYXgtc3BvdXQhIFteU3BvdXRUaHJvdHRsaW5nTWV0cmljcyBtIHN0YXRzXQogICAoLT4gbSAuc2tpcHBlZC1tYXgtc3BvdXQgKC5pbmNyQnkgKHN0YXRzLXJhdGUgc3RhdHMpKSkpCiAKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2Nsai9iYWNrdHlwZS9zdG9ybS9kYWVtb24vY29tbW9uLmNsaiBiL3N0b3JtLWNvcmUvc3JjL2Nsai9iYWNrdHlwZS9zdG9ybS9kYWVtb24vY29tbW9uLmNsagppbmRleCA5ZGEwZTRmLi45YjNhYWIzIDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9jbGovYmFja3R5cGUvc3Rvcm0vZGFlbW9uL2NvbW1vbi5jbGoKKysrIGIvc3Rvcm0tY29yZS9zcmMvY2xqL2JhY2t0eXBlL3N0b3JtL2RhZW1vbi9jb21tb24uY2xqCkBAIC0xNiw3ICsxNiw4IEBACiAobnMgYmFja3R5cGUuc3Rvcm0uZGFlbW9uLmNvbW1vbgogICAoOnVzZSBbYmFja3R5cGUuc3Rvcm0gbG9nIGNvbmZpZyB1dGlsXSkKICAgKDppbXBvcnQgW2JhY2t0eXBlLnN0b3JtLmdlbmVyYXRlZCBTdG9ybVRvcG9sb2d5Ci0gICAgICAgICAgICBJbnZhbGlkVG9wb2xvZ3lFeGNlcHRpb24gR2xvYmFsU3RyZWFtSWRdKQorICAgICAgICAgICAgSW52YWxpZFRvcG9sb2d5RXhjZXB0aW9uIEdsb2JhbFN0cmVhbUlkXQorICAgICAgICAgICBbYmFja3R5cGUuc3Rvcm0udXRpbHMgVGhyaWZ0VG9wb2xvZ3lVdGlsc10pCiAgICg6aW1wb3J0IFtiYWNrdHlwZS5zdG9ybS51dGlscyBVdGlsc10pCiAgICg6aW1wb3J0IFtiYWNrdHlwZS5zdG9ybS50YXNrIFdvcmtlclRvcG9sb2d5Q29udGV4dF0pCiAgICg6aW1wb3J0IFtiYWNrdHlwZS5zdG9ybSBDb25zdGFudHNdKQpAQCAtMjcsMTAgKzI4LDEwIEBACiAgICg6cmVxdWlyZSBbY2xvanVyZS5zZXQgOmFzIHNldF0pICAKICAgKDpyZXF1aXJlIFtiYWNrdHlwZS5zdG9ybS5kYWVtb24uYWNrZXIgOmFzIGFja2VyXSkKICAgKDpyZXF1aXJlIFtiYWNrdHlwZS5zdG9ybS50aHJpZnQgOmFzIHRocmlmdF0pCi0gICkKKyAgKDpyZXF1aXJlIFttZXRyaWNzLnJlcG9ydGVycy5qbXggOmFzIGpteF0pKQogCi0oZGVmbiBzeXN0ZW0taWQ/IFtpZF0KLSAgKFV0aWxzL2lzU3lzdGVtSWQgaWQpKQorKGRlZm4gc3RhcnQtbWV0cmljcy1yZXBvcnRlcnMgW10KKyAgKGpteC9zdGFydCAoam14L3JlcG9ydGVyIHt9KSkpCiAKIChkZWYgQUNLRVItQ09NUE9ORU5ULUlEIGFja2VyL0FDS0VSLUNPTVBPTkVOVC1JRCkKIChkZWYgQUNLRVItSU5JVC1TVFJFQU0tSUQgYWNrZXIvQUNLRVItSU5JVC1TVFJFQU0tSUQpCkBAIC01MSwxMyArNTIsMTMgQEAKIDs7IHRoZSB0YXNrIGlkIGlzIHRoZSB2aXJ0dWFsIHBvcnQKIDs7IG5vZGUtPmhvc3QgaXMgaGVyZSBzbyB0aGF0IHRhc2tzIGtub3cgd2hvIHRvIHRhbGsgdG8ganVzdCBmcm9tIGFzc2lnbm1lbnQKIDs7IHRoaXMgYXZvaWQgc2l0dWF0aW9uIHdoZXJlIG5vZGUgZ29lcyBkb3duIGFuZCB0YXNrIGRvZXNuJ3Qga25vdyB3aGF0IHRvIGRvIGluZm9ybWF0aW9uLXdpc2UKLShkZWZyZWNvcmQgQXNzaWdubWVudCBbbWFzdGVyLWNvZGUtZGlyIG5vZGUtPmhvc3QgZXhlY3V0b3ItPm5vZGUrcG9ydCBleGVjdXRvci0+c3RhcnQtdGltZS1zZWNzXSkKKyhkZWZyZWNvcmQgQXNzaWdubWVudCBbbWFzdGVyLWNvZGUtZGlyIG5vZGUtPmhvc3QgZXhlY3V0b3ItPm5vZGUrcG9ydCBleGVjdXRvci0+c3RhcnQtdGltZS1zZWNzIHdvcmtlci0+cmVzb3VyY2VzXSkKIAogCiA7OyBjb21wb25lbnQtPmV4ZWN1dG9ycyBpcyBhIG1hcCBmcm9tIHNwb3V0L2JvbHQgaWQgdG8gbnVtYmVyIG9mIGV4ZWN1dG9ycyBmb3IgdGhhdCBjb21wb25lbnQKIChkZWZyZWNvcmQgU3Rvcm1CYXNlIFtzdG9ybS1uYW1lIGxhdW5jaC10aW1lLXNlY3Mgc3RhdHVzIG51bS13b3JrZXJzIGNvbXBvbmVudC0+ZXhlY3V0b3JzIG93bmVyIHRvcG9sb2d5LWFjdGlvbi1vcHRpb25zIHByZXYtc3RhdHVzIGNvbXBvbmVudC0+ZGVidWddKQogCi0oZGVmcmVjb3JkIFN1cGVydmlzb3JJbmZvIFt0aW1lLXNlY3MgaG9zdG5hbWUgYXNzaWdubWVudC1pZCB1c2VkLXBvcnRzIG1ldGEgc2NoZWR1bGVyLW1ldGEgdXB0aW1lLXNlY3MgdmVyc2lvbl0pCisoZGVmcmVjb3JkIFN1cGVydmlzb3JJbmZvIFt0aW1lLXNlY3MgaG9zdG5hbWUgYXNzaWdubWVudC1pZCB1c2VkLXBvcnRzIG1ldGEgc2NoZWR1bGVyLW1ldGEgdXB0aW1lLXNlY3MgdmVyc2lvbiByZXNvdXJjZXMtbWFwXSkKIAogKGRlZnByb3RvY29sIERhZW1vbkNvbW1vbgogICAod2FpdGluZz8gW3RoaXNdKSkKQEAgLTExMywyMiArMTE0LDIzIEBACiAgICAgICAgICAgICAgIChzdHIgIkR1cGxpY2F0ZSBjb21wb25lbnQgaWRzOiAiIG9mZmVuZGluZykpKSkKICAgICAoZG9zZXEgW2YgdGhyaWZ0L1NUT1JNLVRPUE9MT0dZLUZJRUxEUwogICAgICAgICAgICAgOmxldCBbb2JqLW1hcCAoLmdldEZpZWxkVmFsdWUgdG9wb2xvZ3kgZildXQotICAgICAgKGRvc2VxIFtpZCAoa2V5cyBvYmotbWFwKV0KLSAgICAgICAgKGlmIChzeXN0ZW0taWQ/IGlkKQotICAgICAgICAgICh0aHJvdyAoSW52YWxpZFRvcG9sb2d5RXhjZXB0aW9uLgotICAgICAgICAgICAgICAgICAgKHN0ciBpZCAiIGlzIG5vdCBhIHZhbGlkIGNvbXBvbmVudCBpZCIpKSkpKQotICAgICAgKGRvc2VxIFtvYmogKHZhbHMgb2JqLW1hcCkKLSAgICAgICAgICAgICAgaWQgKC0+IG9iaiAuZ2V0X2NvbW1vbiAuZ2V0X3N0cmVhbXMga2V5cyldCi0gICAgICAgIChpZiAoc3lzdGVtLWlkPyBpZCkKLSAgICAgICAgICAodGhyb3cgKEludmFsaWRUb3BvbG9neUV4Y2VwdGlvbi4KLSAgICAgICAgICAgICAgICAgIChzdHIgaWQgIiBpcyBub3QgYSB2YWxpZCBzdHJlYW0gaWQiKSkpKSkpCi0gICAgKSkKKyAgICAgIChpZi1ub3QgKFRocmlmdFRvcG9sb2d5VXRpbHMvaXNXb3JrZXJIb29rIGYpCisgICAgICAgIChkbworICAgICAgICAgIChkb3NlcSBbaWQgKGtleXMgb2JqLW1hcCldCisgICAgICAgICAgICAoaWYgKFV0aWxzL2lzU3lzdGVtSWQgaWQpCisgICAgICAgICAgICAgICh0aHJvdyAoSW52YWxpZFRvcG9sb2d5RXhjZXB0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAoc3RyIGlkICIgaXMgbm90IGEgdmFsaWQgY29tcG9uZW50IGlkIikpKSkpCisgICAgICAgICAgKGRvc2VxIFtvYmogKHZhbHMgb2JqLW1hcCkKKyAgICAgICAgICAgICAgICAgIGlkICgtPiBvYmogLmdldF9jb21tb24gLmdldF9zdHJlYW1zIGtleXMpXQorICAgICAgICAgICAgKGlmIChVdGlscy9pc1N5c3RlbUlkIGlkKQorICAgICAgICAgICAgICAodGhyb3cgKEludmFsaWRUb3BvbG9neUV4Y2VwdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgKHN0ciBpZCAiIGlzIG5vdCBhIHZhbGlkIHN0cmVhbSBpZCIpKSkpKSkpKSkpCiAKIChkZWZuIGFsbC1jb21wb25lbnRzIFteU3Rvcm1Ub3BvbG9neSB0b3BvbG9neV0KICAgKGFwcGx5IG1lcmdlIHt9Ci0gICAgICAgICAoZm9yIFtmIHRocmlmdC9TVE9STS1UT1BPTE9HWS1GSUVMRFNdCi0gICAgICAgICAgICguZ2V0RmllbGRWYWx1ZSB0b3BvbG9neSBmKQotICAgICAgICAgICApKSkKKyAgICAoZm9yIFtmIHRocmlmdC9TVE9STS1UT1BPTE9HWS1GSUVMRFNdCisgICAgICAoaWYtbm90IChUaHJpZnRUb3BvbG9neVV0aWxzL2lzV29ya2VySG9vayBmKQorICAgICAgICAoLmdldEZpZWxkVmFsdWUgdG9wb2xvZ3kgZikpKSkpCiAKIChkZWZuIGNvbXBvbmVudC1jb25mIFtjb21wb25lbnRdCiAgICgtPj4gY29tcG9uZW50CkBAIC0zMTAsNyArMzEyLDcgQEAKICAgICAoZG9zZXEgW1tfIGNvbXBvbmVudF0gKGFsbC1jb21wb25lbnRzIHJldCkKICAgICAgICAgICAgIDpsZXQgW2NvbW1vbiAoLmdldF9jb21tb24gY29tcG9uZW50KV1dCiAgICAgICAoLnB1dF90b19zdHJlYW1zIGNvbW1vbiBFVkVOVExPR0dFUi1TVFJFQU0tSUQgKHRocmlmdC9vdXRwdXQtZmllbGRzIChldmVudGxvZ2dlci1ib2x0LWZpZWxkcykpKSkKLSAgICAoLnB1dF90b19ib2x0cyByZXQgIl9fZXZlbnRsb2dnZXIiIGV2ZW50bG9nZ2VyLWJvbHQpCisgICAgKC5wdXRfdG9fYm9sdHMgcmV0IEVWRU5UTE9HR0VSLUNPTVBPTkVOVC1JRCBldmVudGxvZ2dlci1ib2x0KQogICAgICkpCiAKIChkZWZuIGFkZC1tZXRyaWMtY29tcG9uZW50cyEgW3N0b3JtLWNvbmYgXlN0b3JtVG9wb2xvZ3kgdG9wb2xvZ3ldICAKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2Nsai9iYWNrdHlwZS9zdG9ybS9kYWVtb24vZHJwYy5jbGogYi9zdG9ybS1jb3JlL3NyYy9jbGovYmFja3R5cGUvc3Rvcm0vZGFlbW9uL2RycGMuY2xqCmluZGV4IGJiYzk2MTEuLjQwNzQ0ZmIgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2Nsai9iYWNrdHlwZS9zdG9ybS9kYWVtb24vZHJwYy5jbGoKKysrIGIvc3Rvcm0tY29yZS9zcmMvY2xqL2JhY2t0eXBlL3N0b3JtL2RhZW1vbi9kcnBjLmNsagpAQCAtMzEsOCArMzEsMTYgQEAKICAgKDp1c2UgY29tcG9qdXJlLmNvcmUpCiAgICg6dXNlIHJpbmcubWlkZGxld2FyZS5yZWxvYWQpCiAgICg6cmVxdWlyZSBbY29tcG9qdXJlLmhhbmRsZXIgOmFzIGhhbmRsZXJdKQorICAoOnJlcXVpcmUgW21ldHJpY3MubWV0ZXJzIDpyZWZlciBbZGVmbWV0ZXIgbWFyayFdXSkKICAgKDpnZW4tY2xhc3MpKQogCisoZGVmbWV0ZXIgZHJwYzpudW0tZXhlY3V0ZS1odHRwLXJlcXVlc3RzKQorKGRlZm1ldGVyIGRycGM6bnVtLWV4ZWN1dGUtY2FsbHMpCisoZGVmbWV0ZXIgZHJwYzpudW0tcmVzdWx0LWNhbGxzKQorKGRlZm1ldGVyIGRycGM6bnVtLWZhaWxSZXF1ZXN0LWNhbGxzKQorKGRlZm1ldGVyIGRycGM6bnVtLWZldGNoUmVxdWVzdC1jYWxscykKKyhkZWZtZXRlciBkcnBjOm51bS1zaHV0ZG93bi1jYWxscykKKwogKGRlZm4gdGltZW91dC1jaGVjay1zZWNzIFtdIDUpCiAKIChkZWZuIGFjcXVpcmUtcXVldWUgW3F1ZXVlcy1hdG9tIGZ1bmN0aW9uXQpAQCAtNDUsNiArNTMsOCBAQAogCiAoZGVmbiBjaGVjay1hdXRob3JpemF0aW9uCiAgIChbYWNsSGFuZGxlciBtYXBwaW5nIG9wZXJhdGlvbiBjb250ZXh0XQorICAgIChpZiAobm90LW5pbD8gY29udGV4dCkKKyAgICAgIChsb2ctdGhyaWZ0LWFjY2VzcyAoLnJlcXVlc3RJRCBjb250ZXh0KSAoLnJlbW90ZUFkZHJlc3MgY29udGV4dCkgKC5wcmluY2lwYWwgY29udGV4dCkgb3BlcmF0aW9uKSkKICAgICAoaWYgYWNsSGFuZGxlcgogICAgICAgKGxldCBbY29udGV4dCAob3IgY29udGV4dCAoUmVxQ29udGV4dC9jb250ZXh0KSldCiAgICAgICAgIChpZi1ub3QgKC5wZXJtaXQgYWNsSGFuZGxlciBjb250ZXh0IG9wZXJhdGlvbiBtYXBwaW5nKQpAQCAtODUsNiArOTUsNyBAQAogICAgIChyZWlmeSBEaXN0cmlidXRlZFJQQyRJZmFjZQogICAgICAgKF5TdHJpbmcgZXhlY3V0ZQogICAgICAgICBbdGhpcyBeU3RyaW5nIGZ1bmN0aW9uIF5TdHJpbmcgYXJnc10KKyAgICAgICAgKG1hcmshIGRycGM6bnVtLWV4ZWN1dGUtY2FsbHMpCiAgICAgICAgIChsb2ctZGVidWcgIlJlY2VpdmVkIERSUEMgcmVxdWVzdCBmb3IgIiBmdW5jdGlvbiAiICgiIGFyZ3MgIikgYXQgIiAoU3lzdGVtL2N1cnJlbnRUaW1lTWlsbGlzKSkKICAgICAgICAgKGNoZWNrLWF1dGhvcml6YXRpb24gZHJwYy1hY2wtaGFuZGxlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7RFJQQ0F1dGhvcml6ZXJCYXNlL0ZVTkNUSU9OX05BTUUgZnVuY3Rpb259CkBAIC0xMTQsNiArMTI1LDcgQEAKIAogICAgICAgKF52b2lkIHJlc3VsdAogICAgICAgICBbdGhpcyBeU3RyaW5nIGlkIF5TdHJpbmcgcmVzdWx0XQorICAgICAgICAobWFyayEgZHJwYzpudW0tcmVzdWx0LWNhbGxzKQogICAgICAgICAod2hlbi1sZXQgW2Z1bmMgKEBpZC0+ZnVuY3Rpb24gaWQpXQogICAgICAgICAgIChjaGVjay1hdXRob3JpemF0aW9uIGRycGMtYWNsLWhhbmRsZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7RFJQQ0F1dGhvcml6ZXJCYXNlL0ZVTkNUSU9OX05BTUUgZnVuY30KQEAgLTEyNyw2ICsxMzksNyBAQAogCiAgICAgICAoXnZvaWQgZmFpbFJlcXVlc3QKICAgICAgICAgW3RoaXMgXlN0cmluZyBpZF0KKyAgICAgICAgKG1hcmshIGRycGM6bnVtLWZhaWxSZXF1ZXN0LWNhbGxzKQogICAgICAgICAod2hlbi1sZXQgW2Z1bmMgKEBpZC0+ZnVuY3Rpb24gaWQpXQogICAgICAgICAgIChjaGVjay1hdXRob3JpemF0aW9uIGRycGMtYWNsLWhhbmRsZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7RFJQQ0F1dGhvcml6ZXJCYXNlL0ZVTkNUSU9OX05BTUUgZnVuY30KQEAgLTEzOCw2ICsxNTEsNyBAQAogCiAgICAgICAoXkRSUENSZXF1ZXN0IGZldGNoUmVxdWVzdAogICAgICAgICBbdGhpcyBeU3RyaW5nIGZ1bmNdCisgICAgICAgIChtYXJrISBkcnBjOm51bS1mZXRjaFJlcXVlc3QtY2FsbHMpCiAgICAgICAgIChjaGVjay1hdXRob3JpemF0aW9uIGRycGMtYWNsLWhhbmRsZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0RSUENBdXRob3JpemVyQmFzZS9GVU5DVElPTl9OQU1FIGZ1bmN9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmZXRjaFJlcXVlc3QiKQpAQCAtMTUyLDQxICsxNjYsMzkgQEAKIAogICAgICAgKHNodXRkb3duCiAgICAgICAgIFt0aGlzXQorICAgICAgICAobWFyayEgZHJwYzpudW0tc2h1dGRvd24tY2FsbHMpCiAgICAgICAgICguaW50ZXJydXB0IGNsZWFyLXRocmVhZCkpKSkpCiAKIChkZWZuIGhhbmRsZS1yZXF1ZXN0IFtoYW5kbGVyXQogICAoZm4gW3JlcXVlc3RdCiAgICAgKGhhbmRsZXIgcmVxdWVzdCkpKQogCisoZGVmbiBwb3B1bGF0ZS1jb250ZXh0IQorICAiUG9wdWxhdGUgdGhlIFN0b3JtIFJlcXVlc3RDb250ZXh0IGZyb20gYW4gc2VydmxldC1yZXF1ZXN0LiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgaW4gZWFjaCBoYW5kbGVyIgorICBbaHR0cC1jcmVkcy1oYW5kbGVyIHNlcnZsZXQtcmVxdWVzdF0KKyAgICAod2hlbiBodHRwLWNyZWRzLWhhbmRsZXIKKyAgICAgICgucG9wdWxhdGVDb250ZXh0IGh0dHAtY3JlZHMtaGFuZGxlciAoUmVxQ29udGV4dC9jb250ZXh0KSBzZXJ2bGV0LXJlcXVlc3QpKSkKKwogKGRlZm4gd2ViYXBwIFtoYW5kbGVyIGh0dHAtY3JlZHMtaGFuZGxlcl0KKyAgKG1hcmshIGRycGM6bnVtLWV4ZWN1dGUtaHR0cC1yZXF1ZXN0cykKICAgKC0+CiAgICAgKHJvdXRlcwogICAgICAgKFBPU1QgIi9kcnBjLzpmdW5jIiBbOmFzIHs6a2V5cyBbYm9keSBzZXJ2bGV0LXJlcXVlc3RdfSBmdW5jICYgbV0KICAgICAgICAgKGxldCBbYXJncyAoc2x1cnAgYm9keSldCi0gICAgICAgICAgKGlmIGh0dHAtY3JlZHMtaGFuZGxlcgotICAgICAgICAgICAgKC5wb3B1bGF0ZUNvbnRleHQgaHR0cC1jcmVkcy1oYW5kbGVyIChSZXFDb250ZXh0L2NvbnRleHQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2bGV0LXJlcXVlc3QpKQorICAgICAgICAgIChwb3B1bGF0ZS1jb250ZXh0ISBodHRwLWNyZWRzLWhhbmRsZXIgc2VydmxldC1yZXF1ZXN0KQogICAgICAgICAgICguZXhlY3V0ZSBoYW5kbGVyIGZ1bmMgYXJncykpKQogICAgICAgKFBPU1QgIi9kcnBjLzpmdW5jLyIgWzphcyB7OmtleXMgW2JvZHkgc2VydmxldC1yZXF1ZXN0XX0gZnVuYyAmIG1dCiAgICAgICAgIChsZXQgW2FyZ3MgKHNsdXJwIGJvZHkpXQotICAgICAgICAgIChpZiBodHRwLWNyZWRzLWhhbmRsZXIKLSAgICAgICAgICAgICgucG9wdWxhdGVDb250ZXh0IGh0dHAtY3JlZHMtaGFuZGxlciAoUmVxQ29udGV4dC9jb250ZXh0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmxldC1yZXF1ZXN0KSkKKyAgICAgICAgICAocG9wdWxhdGUtY29udGV4dCEgaHR0cC1jcmVkcy1oYW5kbGVyIHNlcnZsZXQtcmVxdWVzdCkKICAgICAgICAgICAoLmV4ZWN1dGUgaGFuZGxlciBmdW5jIGFyZ3MpKSkKICAgICAgIChHRVQgIi9kcnBjLzpmdW5jLzphcmdzIiBbOmFzIHs6a2V5cyBbc2VydmxldC1yZXF1ZXN0XX0gZnVuYyBhcmdzICYgbV0KLSAgICAgICAgICAoaWYgaHR0cC1jcmVkcy1oYW5kbGVyCi0gICAgICAgICAgICAoLnBvcHVsYXRlQ29udGV4dCBodHRwLWNyZWRzLWhhbmRsZXIgKFJlcUNvbnRleHQvY29udGV4dCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZsZXQtcmVxdWVzdCkpCisgICAgICAgICAgKHBvcHVsYXRlLWNvbnRleHQhIGh0dHAtY3JlZHMtaGFuZGxlciBzZXJ2bGV0LXJlcXVlc3QpCiAgICAgICAgICAgKC5leGVjdXRlIGhhbmRsZXIgZnVuYyBhcmdzKSkKICAgICAgIChHRVQgIi9kcnBjLzpmdW5jLyIgWzphcyB7OmtleXMgW3NlcnZsZXQtcmVxdWVzdF19IGZ1bmMgJiBtXQotICAgICAgICAgIChpZiBodHRwLWNyZWRzLWhhbmRsZXIKLSAgICAgICAgICAgICgucG9wdWxhdGVDb250ZXh0IGh0dHAtY3JlZHMtaGFuZGxlciAoUmVxQ29udGV4dC9jb250ZXh0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmxldC1yZXF1ZXN0KSkKKyAgICAgICAgICAocG9wdWxhdGUtY29udGV4dCEgaHR0cC1jcmVkcy1oYW5kbGVyIHNlcnZsZXQtcmVxdWVzdCkKICAgICAgICAgICAoLmV4ZWN1dGUgaGFuZGxlciBmdW5jICIiKSkKICAgICAgIChHRVQgIi9kcnBjLzpmdW5jIiBbOmFzIHs6a2V5cyBbc2VydmxldC1yZXF1ZXN0XX0gZnVuYyAmIG1dCi0gICAgICAgICAgKGlmIGh0dHAtY3JlZHMtaGFuZGxlcgotICAgICAgICAgICAgKC5wb3B1bGF0ZUNvbnRleHQgaHR0cC1jcmVkcy1oYW5kbGVyIChSZXFDb250ZXh0L2NvbnRleHQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2bGV0LXJlcXVlc3QpKQorICAgICAgICAgIChwb3B1bGF0ZS1jb250ZXh0ISBodHRwLWNyZWRzLWhhbmRsZXIgc2VydmxldC1yZXF1ZXN0KQogICAgICAgICAgICguZXhlY3V0ZSBoYW5kbGVyIGZ1bmMgIiIpKSkKICAgICAod3JhcC1yZWxvYWQgJ1tiYWNrdHlwZS5zdG9ybS5kYWVtb24uZHJwY10pCiAgICAgaGFuZGxlLXJlcXVlc3QpKQpAQCAtMjE3LDcgKzIyOSw4IEBACiAgICAgICAobG9nLW1lc3NhZ2UgIlN0YXJ0aW5nIERpc3RyaWJ1dGVkIFJQQyBzZXJ2ZXJzLi4uIikKICAgICAgIChmdXR1cmUgKC5zZXJ2ZSBpbnZva2Utc2VydmVyKSkKICAgICAgICh3aGVuICg+IGRycGMtaHR0cC1wb3J0IDApCi0gICAgICAgIChsZXQgW2FwcCAod2ViYXBwIGRycGMtc2VydmljZS1oYW5kbGVyIGh0dHAtY3JlZHMtaGFuZGxlcikKKyAgICAgICAgKGxldCBbYXBwICgtPiAod2ViYXBwIGRycGMtc2VydmljZS1oYW5kbGVyIGh0dHAtY3JlZHMtaGFuZGxlcikKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdHMtbWlkZGxld2FyZSkKICAgICAgICAgICAgICAgZmlsdGVyLWNsYXNzIChjb25mIERSUEMtSFRUUC1GSUxURVIpCiAgICAgICAgICAgICAgIGZpbHRlci1wYXJhbXMgKGNvbmYgRFJQQy1IVFRQLUZJTFRFUi1QQVJBTVMpCiAgICAgICAgICAgICAgIGZpbHRlcnMtY29uZnMgW3s6ZmlsdGVyLWNsYXNzIGZpbHRlci1jbGFzcwpAQCAtMjQ4LDYgKzI2MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cHMtbmVlZC1jbGllbnQtYXV0aAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBzLXdhbnQtY2xpZW50LWF1dGgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbmZpZy1maWx0ZXIgc2VydmVyIGFwcCBmaWx0ZXJzLWNvbmZzKSl9KSkpCisgICAgICAoc3RhcnQtbWV0cmljcy1yZXBvcnRlcnMpCiAgICAgICAod2hlbiBoYW5kbGVyLXNlcnZlcgogICAgICAgICAoLnNlcnZlIGhhbmRsZXItc2VydmVyKSkpKSkKIApkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvY2xqL2JhY2t0eXBlL3N0b3JtL2RhZW1vbi9leGVjdXRvci5jbGogYi9zdG9ybS1jb3JlL3NyYy9jbGovYmFja3R5cGUvc3Rvcm0vZGFlbW9uL2V4ZWN1dG9yLmNsagppbmRleCBkN2E2OGJlLi4yYWViNWU3IDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9jbGovYmFja3R5cGUvc3Rvcm0vZGFlbW9uL2V4ZWN1dG9yLmNsagorKysgYi9zdG9ybS1jb3JlL3NyYy9jbGovYmFja3R5cGUvc3Rvcm0vZGFlbW9uL2V4ZWN1dG9yLmNsagpAQCAtMjEsNyArMjEsNyBAQAogICAoOmltcG9ydCBbamF2YS51dGlsIExpc3QgUmFuZG9tIEhhc2hNYXAgQXJyYXlMaXN0IExpbmtlZExpc3QgTWFwXSkKICAgKDppbXBvcnQgW2JhY2t0eXBlLnN0b3JtIElDcmVkZW50aWFsc0xpc3RlbmVyXSkKICAgKDppbXBvcnQgW2JhY2t0eXBlLnN0b3JtLmhvb2tzIElUYXNrSG9va10pCi0gICg6aW1wb3J0IFtiYWNrdHlwZS5zdG9ybS50dXBsZSBUdXBsZSBGaWVsZHMgVHVwbGVJbXBsIE1lc3NhZ2VJZF0pCisgICg6aW1wb3J0IFtiYWNrdHlwZS5zdG9ybS50dXBsZSBBZGRyZXNzZWRUdXBsZSBUdXBsZSBGaWVsZHMgVHVwbGVJbXBsIE1lc3NhZ2VJZF0pCiAgICg6aW1wb3J0IFtiYWNrdHlwZS5zdG9ybS5zcG91dCBJU3BvdXRXYWl0U3RyYXRlZ3kgSVNwb3V0IFNwb3V0T3V0cHV0Q29sbGVjdG9yIElTcG91dE91dHB1dENvbGxlY3Rvcl0pCiAgICg6aW1wb3J0IFtiYWNrdHlwZS5zdG9ybS5ob29rcy5pbmZvIFNwb3V0QWNrSW5mbyBTcG91dEZhaWxJbmZvCiAgICAgICAgICAgICBFbWl0SW5mbyBCb2x0RmFpbEluZm8gQm9sdEFja0luZm8gQm9sdEV4ZWN1dGVJbmZvXSkKQEAgLTMwLDEwICszMCwxMSBAQAogICAoOmltcG9ydCBbYmFja3R5cGUuc3Rvcm0uZ2VuZXJhdGVkIEdsb2JhbFN0cmVhbUlkXSkKICAgKDppbXBvcnQgW2JhY2t0eXBlLnN0b3JtLnV0aWxzIFV0aWxzIE11dGFibGVPYmplY3QgUm90YXRpbmdNYXAgUm90YXRpbmdNYXAkRXhwaXJlZENhbGxiYWNrIE11dGFibGVMb25nIFRpbWUgRGlzcnVwdG9yUXVldWUgV29ya2VyQmFja3ByZXNzdXJlVGhyZWFkXSkKICAgKDppbXBvcnQgW2NvbS5sbWF4LmRpc3J1cHRvciBJbnN1ZmZpY2llbnRDYXBhY2l0eUV4Y2VwdGlvbl0pCi0gICg6aW1wb3J0IFtiYWNrdHlwZS5zdG9ybS5zZXJpYWxpemF0aW9uIEtyeW9UdXBsZVNlcmlhbGl6ZXIgS3J5b1R1cGxlRGVzZXJpYWxpemVyXSkKKyAgKDppbXBvcnQgW2JhY2t0eXBlLnN0b3JtLnNlcmlhbGl6YXRpb24gS3J5b1R1cGxlU2VyaWFsaXplcl0pCiAgICg6aW1wb3J0IFtiYWNrdHlwZS5zdG9ybS5kYWVtb24gU2h1dGRvd25hYmxlXSkKICAgKDppbXBvcnQgW2JhY2t0eXBlLnN0b3JtLm1ldHJpYy5hcGkgSU1ldHJpYyBJTWV0cmljc0NvbnN1bWVyJFRhc2tJbmZvIElNZXRyaWNzQ29uc3VtZXIkRGF0YVBvaW50IFN0YXRlTWV0cmljXSkKICAgKDppbXBvcnQgW2JhY2t0eXBlLnN0b3JtIENvbmZpZyBDb25zdGFudHNdKQorICAoOmltcG9ydCBbYmFja3R5cGUuc3Rvcm0uZ3JvdXBpbmcgTG9hZEF3YXJlQ3VzdG9tU3RyZWFtR3JvdXBpbmcgTG9hZEF3YXJlU2h1ZmZsZUdyb3VwaW5nIExvYWRNYXBwaW5nIFNodWZmbGVHcm91cGluZ10pCiAgICg6aW1wb3J0IFtqYXZhLnV0aWwuY29uY3VycmVudCBDb25jdXJyZW50TGlua2VkUXVldWVdKQogICAoOnJlcXVpcmUgW2JhY2t0eXBlLnN0b3JtIFt0dXBsZSA6YXMgdHVwbGVdIFt0aHJpZnQgOmFzIHRocmlmdF0KICAgICAgICAgICAgICBbY2x1c3RlciA6YXMgY2x1c3Rlcl0gW2Rpc3J1cHRvciA6YXMgZGlzcnVwdG9yXSBbc3RhdHMgOmFzIHN0YXRzXV0pCkBAIC00MSw1NCArNDIsNTkgQEAKICAgKDpyZXF1aXJlIFtiYWNrdHlwZS5zdG9ybS5kYWVtb24uYnVpbHRpbi1tZXRyaWNzIDphcyBidWlsdGluLW1ldHJpY3NdKQogICAoOnJlcXVpcmUgW2Nsb2p1cmUuc2V0IDphcyBzZXRdKSkKIAotKGRlZm4tIG1rLWZpZWxkcy1ncm91cGVyIFteRmllbGRzIG91dC1maWVsZHMgXkZpZWxkcyBncm91cC1maWVsZHMgXkxpc3QgdGFyZ2V0LXRhc2tzXQorKGRlZm4tIG1rLWZpZWxkcy1ncm91cGVyCisgIFteRmllbGRzIG91dC1maWVsZHMgXkZpZWxkcyBncm91cC1maWVsZHMgXkxpc3QgdGFyZ2V0LXRhc2tzXQogICAobGV0IFtudW0tdGFza3MgKGNvdW50IHRhcmdldC10YXNrcykKICAgICAgICAgdGFzay1nZXR0ZXIgKGZuIFtpXSAoLmdldCB0YXJnZXQtdGFza3MgaSkpXQotICAgIChmbiBbdGFzay1pZCBeTGlzdCB2YWx1ZXNdCisgICAgKGZuIFt0YXNrLWlkIF5MaXN0IHZhbHVlcyBsb2FkXQogICAgICAgKC0+ICguc2VsZWN0IG91dC1maWVsZHMgZ3JvdXAtZmllbGRzIHZhbHVlcykKICAgICAgICAgICB0dXBsZS9saXN0LWhhc2gtY29kZQogICAgICAgICAgIChtb2QgbnVtLXRhc2tzKQogICAgICAgICAgIHRhc2stZ2V0dGVyKSkpKQogCi0oZGVmbi0gbWstc2h1ZmZsZS1ncm91cGVyIFteTGlzdCB0YXJnZXQtdGFza3NdCi0gIChsZXQgW2Nob2ljZXMgKHJvdGF0aW5nLXJhbmRvbS1yYW5nZSB0YXJnZXQtdGFza3MpXQotICAgIChmbiBbdGFzay1pZCB0dXBsZV0KLSAgICAgIChhY3F1aXJlLXJhbmRvbS1yYW5nZS1pZCBjaG9pY2VzKSkpKQotCi0oZGVmbi0gbWstY3VzdG9tLWdyb3VwZXIgW15DdXN0b21TdHJlYW1Hcm91cGluZyBncm91cGluZyBeV29ya2VyVG9wb2xvZ3lDb250ZXh0IGNvbnRleHQgXlN0cmluZyBjb21wb25lbnQtaWQgXlN0cmluZyBzdHJlYW0taWQgdGFyZ2V0LXRhc2tzXQorKGRlZm4tIG1rLWN1c3RvbS1ncm91cGVyCisgIFteQ3VzdG9tU3RyZWFtR3JvdXBpbmcgZ3JvdXBpbmcgXldvcmtlclRvcG9sb2d5Q29udGV4dCBjb250ZXh0IF5TdHJpbmcgY29tcG9uZW50LWlkIF5TdHJpbmcgc3RyZWFtLWlkIHRhcmdldC10YXNrc10KICAgKC5wcmVwYXJlIGdyb3VwaW5nIGNvbnRleHQgKEdsb2JhbFN0cmVhbUlkLiBjb21wb25lbnQtaWQgc3RyZWFtLWlkKSB0YXJnZXQtdGFza3MpCi0gIChmbiBbdGFzay1pZCBeTGlzdCB2YWx1ZXNdCi0gICAgKC5jaG9vc2VUYXNrcyBncm91cGluZyB0YXNrLWlkIHZhbHVlcykKLSAgICApKQorICAoaWYgKGluc3RhbmNlPyBMb2FkQXdhcmVDdXN0b21TdHJlYW1Hcm91cGluZyBncm91cGluZykKKyAgICAoZm4gW3Rhc2staWQgXkxpc3QgdmFsdWVzIGxvYWRdCisgICAgICAoLmNob29zZVRhc2tzIGdyb3VwaW5nIHRhc2staWQgdmFsdWVzIGxvYWQpKQorICAgIChmbiBbdGFzay1pZCBeTGlzdCB2YWx1ZXMgbG9hZF0KKyAgICAgICguY2hvb3NlVGFza3MgZ3JvdXBpbmcgdGFzay1pZCB2YWx1ZXMpKSkpCisKKyhkZWZuIG1rLXNodWZmbGUtZ3JvdXBlcgorICBbXkxpc3QgdGFyZ2V0LXRhc2tzIHRvcG8tY29uZiBeV29ya2VyVG9wb2xvZ3lDb250ZXh0IGNvbnRleHQgXlN0cmluZyBjb21wb25lbnQtaWQgXlN0cmluZyBzdHJlYW0taWRdCisgIChpZiAoLmdldCB0b3BvLWNvbmYgVE9QT0xPR1ktRElTQUJMRS1MT0FEQVdBUkUtTUVTU0FHSU5HKQorICAgIChtay1jdXN0b20tZ3JvdXBlciAoU2h1ZmZsZUdyb3VwaW5nLikgY29udGV4dCBjb21wb25lbnQtaWQgc3RyZWFtLWlkIHRhcmdldC10YXNrcykKKyAgICAobWstY3VzdG9tLWdyb3VwZXIgKExvYWRBd2FyZVNodWZmbGVHcm91cGluZy4pIGNvbnRleHQgY29tcG9uZW50LWlkIHN0cmVhbS1pZCB0YXJnZXQtdGFza3MpKSkKIAogKGRlZm4tIG1rLWdyb3VwZXIKICAgIlJldHVybnMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSB2ZWN0b3Igb2Ygd2hpY2ggdGFzayBpbmRpY2VzIHRvIHNlbmQgdHVwbGUgdG8sIG9yIGp1c3QgYSBzaW5nbGUgdGFzayBpbmRleC4iCi0gIFteV29ya2VyVG9wb2xvZ3lDb250ZXh0IGNvbnRleHQgY29tcG9uZW50LWlkIHN0cmVhbS1pZCBeRmllbGRzIG91dC1maWVsZHMgdGhyaWZ0LWdyb3VwaW5nIF5MaXN0IHRhcmdldC10YXNrc10KKyAgW15Xb3JrZXJUb3BvbG9neUNvbnRleHQgY29udGV4dCBjb21wb25lbnQtaWQgc3RyZWFtLWlkIF5GaWVsZHMgb3V0LWZpZWxkcyB0aHJpZnQtZ3JvdXBpbmcgXkxpc3QgdGFyZ2V0LXRhc2tzIHRvcG8tY29uZl0KICAgKGxldCBbbnVtLXRhc2tzIChjb3VudCB0YXJnZXQtdGFza3MpCiAgICAgICAgIHJhbmRvbSAoUmFuZG9tLikKICAgICAgICAgdGFyZ2V0LXRhc2tzICh2ZWMgKHNvcnQgdGFyZ2V0LXRhc2tzKSldCiAgICAgKGNvbmRwID0gKHRocmlmdC9ncm91cGluZy10eXBlIHRocmlmdC1ncm91cGluZykKICAgICAgIDpmaWVsZHMKICAgICAgICAgKGlmICh0aHJpZnQvZ2xvYmFsLWdyb3VwaW5nPyB0aHJpZnQtZ3JvdXBpbmcpCi0gICAgICAgICAgKGZuIFt0YXNrLWlkIHR1cGxlXQorICAgICAgICAgIChmbiBbdGFzay1pZCB0dXBsZSBsb2FkXQogICAgICAgICAgICAgOzsgSXQncyBwb3NzaWJsZSBmb3IgdGFyZ2V0IHRvIGhhdmUgbXVsdGlwbGUgdGFza3MgaWYgaXQgcmVhZHMgbXVsdGlwbGUgc291cmNlcwogICAgICAgICAgICAgKGZpcnN0IHRhcmdldC10YXNrcykpCiAgICAgICAgICAgKGxldCBbZ3JvdXAtZmllbGRzIChGaWVsZHMuICh0aHJpZnQvZmllbGQtZ3JvdXBpbmcgdGhyaWZ0LWdyb3VwaW5nKSldCiAgICAgICAgICAgICAobWstZmllbGRzLWdyb3VwZXIgb3V0LWZpZWxkcyBncm91cC1maWVsZHMgdGFyZ2V0LXRhc2tzKQogICAgICAgICAgICAgKSkKICAgICAgIDphbGwKLSAgICAgICAgKGZuIFt0YXNrLWlkIHR1cGxlXSB0YXJnZXQtdGFza3MpCisgICAgICAgIChmbiBbdGFzay1pZCB0dXBsZSBsb2FkXSB0YXJnZXQtdGFza3MpCiAgICAgICA6c2h1ZmZsZQotICAgICAgICAobWstc2h1ZmZsZS1ncm91cGVyIHRhcmdldC10YXNrcykKKyAgICAgICAgKG1rLXNodWZmbGUtZ3JvdXBlciB0YXJnZXQtdGFza3MgdG9wby1jb25mIGNvbnRleHQgY29tcG9uZW50LWlkIHN0cmVhbS1pZCkKICAgICAgIDpsb2NhbC1vci1zaHVmZmxlCiAgICAgICAgIChsZXQgW3NhbWUtdGFza3MgKHNldC9pbnRlcnNlY3Rpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZXQgdGFyZ2V0LXRhc2tzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNldCAoLmdldFRoaXNXb3JrZXJUYXNrcyBjb250ZXh0KSkpXQogICAgICAgICAgIChpZi1ub3QgKGVtcHR5PyBzYW1lLXRhc2tzKQotICAgICAgICAgICAgKG1rLXNodWZmbGUtZ3JvdXBlciAodmVjIHNhbWUtdGFza3MpKQotICAgICAgICAgICAgKG1rLXNodWZmbGUtZ3JvdXBlciB0YXJnZXQtdGFza3MpKSkKKyAgICAgICAgICAgIChtay1zaHVmZmxlLWdyb3VwZXIgKHZlYyBzYW1lLXRhc2tzKSB0b3BvLWNvbmYgY29udGV4dCBjb21wb25lbnQtaWQgc3RyZWFtLWlkKQorICAgICAgICAgICAgKG1rLXNodWZmbGUtZ3JvdXBlciB0YXJnZXQtdGFza3MgdG9wby1jb25mIGNvbnRleHQgY29tcG9uZW50LWlkIHN0cmVhbS1pZCkpKQogICAgICAgOm5vbmUKLSAgICAgICAgKGZuIFt0YXNrLWlkIHR1cGxlXQorICAgICAgICAoZm4gW3Rhc2staWQgdHVwbGUgbG9hZF0KICAgICAgICAgICAobGV0IFtpIChtb2QgKC5uZXh0SW50IHJhbmRvbSkgbnVtLXRhc2tzKV0KICAgICAgICAgICAgIChnZXQgdGFyZ2V0LXRhc2tzIGkpCiAgICAgICAgICAgICApKQpAQCAtMTAyLDcgKzEwOCw4IEBACiAgICAgICAgIDpkaXJlY3QKICAgICAgICkpKQogCi0oZGVmbi0gb3V0Ym91bmQtZ3JvdXBpbmdzIFteV29ya2VyVG9wb2xvZ3lDb250ZXh0IHdvcmtlci1jb250ZXh0IHRoaXMtY29tcG9uZW50LWlkIHN0cmVhbS1pZCBvdXQtZmllbGRzIGNvbXBvbmVudC0+Z3JvdXBpbmddCisoZGVmbi0gb3V0Ym91bmQtZ3JvdXBpbmdzCisgIFteV29ya2VyVG9wb2xvZ3lDb250ZXh0IHdvcmtlci1jb250ZXh0IHRoaXMtY29tcG9uZW50LWlkIHN0cmVhbS1pZCBvdXQtZmllbGRzIGNvbXBvbmVudC0+Z3JvdXBpbmcgdG9wby1jb25mXQogICAoLT4+IGNvbXBvbmVudC0+Z3JvdXBpbmcKICAgICAgICAoZmlsdGVyLWtleSAjKC0+IHdvcmtlci1jb250ZXh0CiAgICAgICAgICAgICAgICAgICAgICAgICAoLmdldENvbXBvbmVudFRhc2tzICUpCkBAIC0xMTYsMTMgKzEyMywxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC1maWVsZHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Z3JvdXBpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLmdldENvbXBvbmVudFRhc2tzIHdvcmtlci1jb250ZXh0IGNvbXBvbmVudCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICApXSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wby1jb25mKV0pKQogICAgICAgIChpbnRvIHt9KQogICAgICAgIChIYXNoTWFwLikpKQogCiAoZGVmbiBvdXRib3VuZC1jb21wb25lbnRzCiAgICJSZXR1cm5zIG1hcCBvZiBzdHJlYW0gaWQgdG8gY29tcG9uZW50IGlkIHRvIGdyb3VwZXIiCi0gIFteV29ya2VyVG9wb2xvZ3lDb250ZXh0IHdvcmtlci1jb250ZXh0IGNvbXBvbmVudC1pZF0KKyAgW15Xb3JrZXJUb3BvbG9neUNvbnRleHQgd29ya2VyLWNvbnRleHQgY29tcG9uZW50LWlkIHRvcG8tY29uZl0KICAgKC0+PiAoLmdldFRhcmdldHMgd29ya2VyLWNvbnRleHQgY29tcG9uZW50LWlkKQogICAgICAgICBjbG9qdXJpZnktc3RydWN0dXJlCiAgICAgICAgIChtYXAgKGZuIFtbc3RyZWFtLWlkIGNvbXBvbmVudC0+Z3JvdXBpbmddXQpAQCAtMTMyLDcgKzEzOSw4IEBACiAgICAgICAgICAgICAgICAgICBjb21wb25lbnQtaWQKICAgICAgICAgICAgICAgICAgIHN0cmVhbS1pZAogICAgICAgICAgICAgICAgICAgKC5nZXRDb21wb25lbnRPdXRwdXRGaWVsZHMgd29ya2VyLWNvbnRleHQgY29tcG9uZW50LWlkIHN0cmVhbS1pZCkKLSAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC0+Z3JvdXBpbmcpXSkpCisgICAgICAgICAgICAgICAgICBjb21wb25lbnQtPmdyb3VwaW5nCisgICAgICAgICAgICAgICAgICB0b3BvLWNvbmYpXSkpCiAgICAgICAgICAoaW50byB7fSkKICAgICAgICAgIChIYXNoTWFwLikpKQogCkBAIC0xNTksNiArMTY3LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBUT1BPTE9HWS1USUNLLVRVUExFLUZSRVEtU0VDUwogICAgICAgICAgICAgICAgICAgICAgICAgVE9QT0xPR1ktU0xFRVAtU1BPVVQtV0FJVC1TVFJBVEVHWS1USU1FLU1TCiAgICAgICAgICAgICAgICAgICAgICAgICBUT1BPTE9HWS1TUE9VVC1XQUlULVNUUkFURUdZCisgICAgICAgICAgICAgICAgICAgICAgICBUT1BPTE9HWS1CT0xUUy1XSU5ET1ctTEVOR1RILUNPVU5UCisgICAgICAgICAgICAgICAgICAgICAgICBUT1BPTE9HWS1CT0xUUy1XSU5ET1ctTEVOR1RILURVUkFUSU9OLU1TCisgICAgICAgICAgICAgICAgICAgICAgICBUT1BPTE9HWS1CT0xUUy1TTElESU5HLUlOVEVSVkFMLUNPVU5UCisgICAgICAgICAgICAgICAgICAgICAgICBUT1BPTE9HWS1CT0xUUy1TTElESU5HLUlOVEVSVkFMLURVUkFUSU9OLU1TCiAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgIHNwZWMtY29uZiAoLT4gZ2VuZXJhbC1jb250ZXh0CiAgICAgICAgICAgICAgICAgICAgICAgKC5nZXRDb21wb25lbnRDb21tb24gY29tcG9uZW50LWlkKQpAQCAtMTk3LDIzICsyMDksMTEgQEAKIDs7IGluIGl0cyBvd24gZnVuY3Rpb24gc28gdGhhdCBpdCBjYW4gYmUgbW9ja2VkIG91dCBieSB0cmFja2VkIHRvcG9sb2dpZXMKIChkZWZuIG1rLWV4ZWN1dG9yLXRyYW5zZmVyLWZuIFtiYXRjaC10cmFuc2Zlci0+d29ya2VyIHN0b3JtLWNvbmZdCiAgIChmbiB0aGlzCi0gICAgKFt0YXNrIHR1cGxlIGJsb2NrPyBeQ29uY3VycmVudExpbmtlZFF1ZXVlIG92ZXJmbG93LWJ1ZmZlcl0KKyAgICBbdGFzayB0dXBsZV0KKyAgICAobGV0IFt2YWwgKEFkZHJlc3NlZFR1cGxlLiB0YXNrIHR1cGxlKV0KICAgICAgICh3aGVuICg9IHRydWUgKHN0b3JtLWNvbmYgVE9QT0xPR1ktREVCVUcpKQotICAgICAgICAobG9nLW1lc3NhZ2UgIlRSQU5TRkVSSU5HIHR1cGxlIFRBU0s6ICIgdGFzayAiIFRVUExFOiAiIHR1cGxlKSkKLSAgICAgIChpZiAoYW5kIG92ZXJmbG93LWJ1ZmZlciAobm90ICguaXNFbXB0eSBvdmVyZmxvdy1idWZmZXIpKSkKLSAgICAgICAgKC5hZGQgb3ZlcmZsb3ctYnVmZmVyIFt0YXNrIHR1cGxlXSkKLSAgICAgICAgKHRyeS1jYXVzZQotICAgICAgICAgIChkaXNydXB0b3IvcHVibGlzaCBiYXRjaC10cmFuc2Zlci0+d29ya2VyIFt0YXNrIHR1cGxlXSBibG9jaz8pCi0gICAgICAgIChjYXRjaCBJbnN1ZmZpY2llbnRDYXBhY2l0eUV4Y2VwdGlvbiBlCi0gICAgICAgICAgKGlmIG92ZXJmbG93LWJ1ZmZlcgotICAgICAgICAgICAgKC5hZGQgb3ZlcmZsb3ctYnVmZmVyIFt0YXNrIHR1cGxlXSkKLSAgICAgICAgICAgICh0aHJvdyBlKSkKLSAgICAgICAgICApKSkpCi0gICAgKFt0YXNrIHR1cGxlIG92ZXJmbG93LWJ1ZmZlcl0KLSAgICAgICh0aGlzIHRhc2sgdHVwbGUgKG5pbD8gb3ZlcmZsb3ctYnVmZmVyKSBvdmVyZmxvdy1idWZmZXIpKQotICAgIChbdGFzayB0dXBsZV0KLSAgICAgICh0aGlzIHRhc2sgdHVwbGUgbmlsKQotICAgICAgKSkpCisgICAgICAgIChsb2ctbWVzc2FnZSAiVFJBTlNGRVJJTkcgdHVwbGUgIiB2YWwpKQorICAgICAgKGRpc3J1cHRvci9wdWJsaXNoIGJhdGNoLXRyYW5zZmVyLT53b3JrZXIgdmFsKSkpKQogCiAoZGVmbiBtay1leGVjdXRvci1kYXRhIFt3b3JrZXIgZXhlY3V0b3ItaWRdCiAgIChsZXQgW3dvcmtlci1jb250ZXh0ICh3b3JrZXItY29udGV4dCB3b3JrZXIpCkBAIC0yMjUsOCArMjI1LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RyICJleGVjdXRvciIgIGV4ZWN1dG9yLWlkICItc2VuZC1xdWV1ZSIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0b3JtLWNvbmYgVE9QT0xPR1ktRVhFQ1VUT1ItU0VORC1CVUZGRVItU0laRSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3Rvcm0tY29uZiBUT1BPTE9HWS1ESVNSVVBUT1ItV0FJVC1USU1FT1VULU1JTExJUykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Y2xhaW0tc3RyYXRlZ3kgOnNpbmdsZS10aHJlYWRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDp3YWl0LXN0cmF0ZWd5IChzdG9ybS1jb25mIFRPUE9MT0dZLURJU1JVUFRPUi1XQUlULVNUUkFURUdZKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6cHJvZHVjZXItdHlwZSA6c2luZ2xlLXRocmVhZGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmJhdGNoLXNpemUgKHN0b3JtLWNvbmYgVE9QT0xPR1ktRElTUlVQVE9SLUJBVENILVNJWkUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmJhdGNoLXRpbWVvdXQgKHN0b3JtLWNvbmYgVE9QT0xPR1ktRElTUlVQVE9SLUJBVENILVRJTUVPVVQtTUlMTElTKSkKICAgICAgICAgXQogICAgIChyZWN1cnNpdmUtbWFwCiAgICAgIDp3b3JrZXIgd29ya2VyCkBAIC0yNTIsNyArMjUzLDcgQEAKICAgICAgOnN0YXRzIChtay1leGVjdXRvci1zdGF0cyA8PiAoc2FtcGxpbmctcmF0ZSBzdG9ybS1jb25mKSkKICAgICAgOmludGVydmFsLT50YXNrLT5tZXRyaWMtcmVnaXN0cnkgKEhhc2hNYXAuKQogICAgICA6dGFzay0+Y29tcG9uZW50ICg6dGFzay0+Y29tcG9uZW50IHdvcmtlcikKLSAgICAgOnN0cmVhbS0+Y29tcG9uZW50LT5ncm91cGVyIChvdXRib3VuZC1jb21wb25lbnRzIHdvcmtlci1jb250ZXh0IGNvbXBvbmVudC1pZCkKKyAgICAgOnN0cmVhbS0+Y29tcG9uZW50LT5ncm91cGVyIChvdXRib3VuZC1jb21wb25lbnRzIHdvcmtlci1jb250ZXh0IGNvbXBvbmVudC1pZCBzdG9ybS1jb25mKQogICAgICA6cmVwb3J0LWVycm9yICh0aHJvdHRsZWQtcmVwb3J0LWVycm9yLWZuIDw+KQogICAgICA6cmVwb3J0LWVycm9yLWFuZC1kaWUgKGZuIFtlcnJvcl0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCg6cmVwb3J0LWVycm9yIDw+KSBlcnJvcikKQEAgLTI2MSw3ICsyNjIsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGV4Y2VwdGlvbi1jYXVzZT8gamF2YS5pby5JbnRlcnJ1cHRlZElPRXhjZXB0aW9uIGVycm9yKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9nLW1lc3NhZ2UgIkdvdCBpbnRlcnJ1cHRlZCBleGNwZXRpb24gc2h1dHRpbmcgdGhyZWFkIGRvd24uLi4iKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoOnN1aWNpZGUtZm4gPD4pKSkpCi0gICAgIDpkZXNlcmlhbGl6ZXIgKEtyeW9UdXBsZURlc2VyaWFsaXplci4gc3Rvcm0tY29uZiB3b3JrZXItY29udGV4dCkKICAgICAgOnNhbXBsZXIgKG1rLXN0YXRzLXNhbXBsZXIgc3Rvcm0tY29uZikKICAgICAgOmJhY2twcmVzc3VyZSAoYXRvbSBmYWxzZSkKICAgICAgOnNwb3V0LXRocm90dGxpbmctbWV0cmljcyAoaWYgKD0gZXhlY3V0b3ItdHlwZSA6c3BvdXQpIApAQCAtMjg0LDYgKzI4NCw3IEBACiAgICAgICAiV2hlbiByZWNlaXZlIHF1ZXVlIGlzIGJlbG93IGxvd1dhdGVyTWFyayIKICAgICAgIChpZiBAKDpiYWNrcHJlc3N1cmUgZXhlY3V0b3ItZGF0YSkKICAgICAgICAgKGRvIChyZXNldCEgKDpiYWNrcHJlc3N1cmUgZXhlY3V0b3ItZGF0YSkgZmFsc2UpCisgICAgICAgICAgICAobG9nLWRlYnVnICJleGVjdXRvciAiICg6ZXhlY3V0b3ItaWQgZXhlY3V0b3ItZGF0YSkgIiBpcyBub3QtY29uZ2VzdGVkLCBzZXQgYmFja3ByZXNzdXJlIGZsYWcgZmFsc2UiKQogICAgICAgICAgICAgKFdvcmtlckJhY2twcmVzc3VyZVRocmVhZC9ub3RpZnlCYWNrcHJlc3N1cmVDaGVja2VyICg6YmFja3ByZXNzdXJlLXRyaWdnZXIgKDp3b3JrZXIgZXhlY3V0b3ItZGF0YSkpKSkpKSkpCiAKIChkZWZuIHN0YXJ0LWJhdGNoLXRyYW5zZmVyLT53b3JrZXItaGFuZGxlciEgW3dvcmtlciBleGVjdXRvci1kYXRhXQpAQCAtMjk5LDggKzMwMCw3IEBACiAgICAgICAgICAgKC5hZGQgYWxpc3QgbykKICAgICAgICAgICAod2hlbiBiYXRjaC1lbmQ/CiAgICAgICAgICAgICAod29ya2VyLXRyYW5zZmVyLWZuIHNlcmlhbGl6ZXIgYWxpc3QpCi0gICAgICAgICAgICAoLnNldE9iamVjdCBjYWNoZWQtZW1pdCAoQXJyYXlMaXN0LikpCi0gICAgICAgICAgICApKSkKKyAgICAgICAgICAgICguc2V0T2JqZWN0IGNhY2hlZC1lbWl0IChBcnJheUxpc3QuKSkpKSkKICAgICAgIDpraWxsLWZuICg6cmVwb3J0LWVycm9yLWFuZC1kaWUgZXhlY3V0b3ItZGF0YSkpKSkKIAogKGRlZm4gc2V0dXAtbWV0cmljcyEgW2V4ZWN1dG9yLWRhdGFdCkBAIC0zMTIsMTIgKzMxMiwxMSBAQAogICAgICAgIGludGVydmFsCiAgICAgICAgaW50ZXJ2YWwKICAgICAgICAoZm4gW10KLSAgICAgICAgIChkaXNydXB0b3IvcHVibGlzaAotICAgICAgICAgIHJlY2VpdmUtcXVldWUKLSAgICAgICAgICBbW25pbCAoVHVwbGVJbXBsLiB3b3JrZXItY29udGV4dCBbaW50ZXJ2YWxdIENvbnN0YW50cy9TWVNURU1fVEFTS19JRCBDb25zdGFudHMvTUVUUklDU19USUNLX1NUUkVBTV9JRCldXSkpKSkpKQorICAgICAgICAgKGxldCBbdmFsIFsoQWRkcmVzc2VkVHVwbGUuIEFkZHJlc3NlZFR1cGxlL0JST0FEQ0FTVF9ERVNUIChUdXBsZUltcGwuIHdvcmtlci1jb250ZXh0IFtpbnRlcnZhbF0gQ29uc3RhbnRzL1NZU1RFTV9UQVNLX0lEIENvbnN0YW50cy9NRVRSSUNTX1RJQ0tfU1RSRUFNX0lEKSldXQorICAgICAgICAgICAoZGlzcnVwdG9yL3B1Ymxpc2ggcmVjZWl2ZS1xdWV1ZSB2YWwpKSkpKSkpCiAKIChkZWZuIG1ldHJpY3MtdGljawotICAoW2V4ZWN1dG9yLWRhdGEgdGFzay1kYXRhIF5UdXBsZUltcGwgdHVwbGUgb3ZlcmZsb3ctYnVmZmVyXQorICBbZXhlY3V0b3ItZGF0YSB0YXNrLWRhdGEgXlR1cGxlSW1wbCB0dXBsZV0KICAgIChsZXQgW3s6a2V5cyBbaW50ZXJ2YWwtPnRhc2stPm1ldHJpYy1yZWdpc3RyeSBeV29ya2VyVG9wb2xvZ3lDb250ZXh0IHdvcmtlci1jb250ZXh0XX0gZXhlY3V0b3ItZGF0YQogICAgICAgICAgaW50ZXJ2YWwgKC5nZXRJbnRlZ2VyIHR1cGxlIDApCiAgICAgICAgICB0YXNrLWlkICg6dGFzay1pZCB0YXNrLWRhdGEpCkBAIC0zMzYsMTIgKzMzNSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElNZXRyaWNzQ29uc3VtZXIkRGF0YVBvaW50LiBuYW1lIHZhbHVlKSkpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpbHRlciBpZGVudGl0eSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludG8gW10pKV0KLSAgICAgKGlmIChzZXEgZGF0YS1wb2ludHMpCi0gICAgICAgKHRhc2svc2VuZC11bmFuY2hvcmVkIHRhc2stZGF0YSBDb25zdGFudHMvTUVUUklDU19TVFJFQU1fSUQgW3Rhc2staW5mbyBkYXRhLXBvaW50c10gb3ZlcmZsb3ctYnVmZmVyKSkpKQotICAoW2V4ZWN1dG9yLWRhdGEgdGFzay1kYXRhIF5UdXBsZUltcGwgdHVwbGVdCi0gICAgKG1ldHJpY3MtdGljayBleGVjdXRvci1kYXRhIHRhc2stZGF0YSB0dXBsZSBuaWwpCi0gICAgKSkKLQorICAgICAod2hlbiAoc2VxIGRhdGEtcG9pbnRzKQorICAgICAgICh0YXNrL3NlbmQtdW5hbmNob3JlZCB0YXNrLWRhdGEgQ29uc3RhbnRzL01FVFJJQ1NfU1RSRUFNX0lEIFt0YXNrLWluZm8gZGF0YS1wb2ludHNdKSkpKQogCiAoZGVmbiBzZXR1cC10aWNrcyEgW3dvcmtlciBleGVjdXRvci1kYXRhXQogICAobGV0IFtzdG9ybS1jb25mICg6c3Rvcm0tY29uZiBleGVjdXRvci1kYXRhKQpAQCAtMzQ5LDcgKzM0NCw3IEBACiAgICAgICAgIHJlY2VpdmUtcXVldWUgKDpyZWNlaXZlLXF1ZXVlIGV4ZWN1dG9yLWRhdGEpCiAgICAgICAgIGNvbnRleHQgKDp3b3JrZXItY29udGV4dCBleGVjdXRvci1kYXRhKV0KICAgICAod2hlbiB0aWNrLXRpbWUtc2VjcwotICAgICAgKGlmIChvciAoc3lzdGVtLWlkPyAoOmNvbXBvbmVudC1pZCBleGVjdXRvci1kYXRhKSkKKyAgICAgIChpZiAob3IgKFV0aWxzL2lzU3lzdGVtSWQgKDpjb21wb25lbnQtaWQgZXhlY3V0b3ItZGF0YSkpCiAgICAgICAgICAgICAgIChhbmQgKD0gZmFsc2UgKHN0b3JtLWNvbmYgVE9QT0xPR1ktRU5BQkxFLU1FU1NBR0UtVElNRU9VVFMpKQogICAgICAgICAgICAgICAgICAgICg9IDpzcG91dCAoOnR5cGUgZXhlY3V0b3ItZGF0YSkpKSkKICAgICAgICAgKGxvZy1tZXNzYWdlICJUaW1lb3V0cyBkaXNhYmxlZCBmb3IgZXhlY3V0b3IgIiAoOmNvbXBvbmVudC1pZCBleGVjdXRvci1kYXRhKSAiOiIgKDpleGVjdXRvci1pZCBleGVjdXRvci1kYXRhKSkKQEAgLTM1OCwxMCArMzUzLDggQEAKICAgICAgICAgICB0aWNrLXRpbWUtc2VjcwogICAgICAgICAgIHRpY2stdGltZS1zZWNzCiAgICAgICAgICAgKGZuIFtdCi0gICAgICAgICAgICAoZGlzcnVwdG9yL3B1Ymxpc2gKLSAgICAgICAgICAgICAgcmVjZWl2ZS1xdWV1ZQotICAgICAgICAgICAgICBbW25pbCAoVHVwbGVJbXBsLiBjb250ZXh0IFt0aWNrLXRpbWUtc2Vjc10gQ29uc3RhbnRzL1NZU1RFTV9UQVNLX0lEIENvbnN0YW50cy9TWVNURU1fVElDS19TVFJFQU1fSUQpXV0KLSAgICAgICAgICAgICAgKSkpKSkpKQorICAgICAgICAgICAgKGxldCBbdmFsIFsoQWRkcmVzc2VkVHVwbGUuIEFkZHJlc3NlZFR1cGxlL0JST0FEQ0FTVF9ERVNUIChUdXBsZUltcGwuIGNvbnRleHQgW3RpY2stdGltZS1zZWNzXSBDb25zdGFudHMvU1lTVEVNX1RBU0tfSUQgQ29uc3RhbnRzL1NZU1RFTV9USUNLX1NUUkVBTV9JRCkpXV0KKyAgICAgICAgICAgICAgKGRpc3J1cHRvci9wdWJsaXNoIHJlY2VpdmUtcXVldWUgdmFsKSkpKSkpKSkKIAogKGRlZm4gbWstZXhlY3V0b3IgW3dvcmtlciBleGVjdXRvci1pZCBpbml0aWFsLWNyZWRlbnRpYWxzXQogICAobGV0IFtleGVjdXRvci1kYXRhIChtay1leGVjdXRvci1kYXRhIHdvcmtlciBleGVjdXRvci1pZCkKQEAgLTQwMSwxMSArMzk0LDkgQEAKICAgICAgICAgZXhlY3V0b3ItaWQpCiAgICAgICAoY3JlZGVudGlhbHMtY2hhbmdlZCBbdGhpcyBjcmVkc10KICAgICAgICAgKGxldCBbcmVjZWl2ZS1xdWV1ZSAoOnJlY2VpdmUtcXVldWUgZXhlY3V0b3ItZGF0YSkKLSAgICAgICAgICAgICAgY29udGV4dCAoOndvcmtlci1jb250ZXh0IGV4ZWN1dG9yLWRhdGEpXQotICAgICAgICAgIChkaXNydXB0b3IvcHVibGlzaAotICAgICAgICAgICAgcmVjZWl2ZS1xdWV1ZQotICAgICAgICAgICAgW1tuaWwgKFR1cGxlSW1wbC4gY29udGV4dCBbY3JlZHNdIENvbnN0YW50cy9TWVNURU1fVEFTS19JRCBDb25zdGFudHMvQ1JFREVOVElBTFNfQ0hBTkdFRF9TVFJFQU1fSUQpXV0KLSAgICAgICAgICAgICAgKSkpCisgICAgICAgICAgICAgIGNvbnRleHQgKDp3b3JrZXItY29udGV4dCBleGVjdXRvci1kYXRhKQorICAgICAgICAgICAgICB2YWwgWyhBZGRyZXNzZWRUdXBsZS4gQWRkcmVzc2VkVHVwbGUvQlJPQURDQVNUX0RFU1QgKFR1cGxlSW1wbC4gY29udGV4dCBbY3JlZHNdIENvbnN0YW50cy9TWVNURU1fVEFTS19JRCBDb25zdGFudHMvQ1JFREVOVElBTFNfQ0hBTkdFRF9TVFJFQU1fSUQpKV1dCisgICAgICAgICAgKGRpc3J1cHRvci9wdWJsaXNoIHJlY2VpdmUtcXVldWUgdmFsKSkpCiAgICAgICAoZ2V0LWJhY2twcmVzc3VyZS1mbGFnIFt0aGlzXQogICAgICAgICBAKDpiYWNrcHJlc3N1cmUgZXhlY3V0b3ItZGF0YSkpCiAgICAgICBTaHV0ZG93bmFibGUKQEAgLTQzOCw3ICs0MjksNiBAQAogICAgICguZmFpbCBzcG91dCBtc2ctaWQpCiAgICAgKHRhc2svYXBwbHktaG9va3MgKDp1c2VyLWNvbnRleHQgdGFzay1kYXRhKSAuc3BvdXRGYWlsIChTcG91dEZhaWxJbmZvLiBtc2ctaWQgdGFzay1pZCB0aW1lLWRlbHRhKSkKICAgICAod2hlbiB0aW1lLWRlbHRhCi0gICAgICAoYnVpbHRpbi1tZXRyaWNzL3Nwb3V0LWZhaWxlZC10dXBsZSEgKDpidWlsdGluLW1ldHJpY3MgdGFzay1kYXRhKSAoOnN0YXRzIGV4ZWN1dG9yLWRhdGEpICg6c3RyZWFtIHR1cGxlLWluZm8pKSAgICAgIAogICAgICAgKHN0YXRzL3Nwb3V0LWZhaWxlZC10dXBsZSEgKDpzdGF0cyBleGVjdXRvci1kYXRhKSAoOnN0cmVhbSB0dXBsZS1pbmZvKSB0aW1lLWRlbHRhKSkpKQogCiAoZGVmbi0gYWNrLXNwb3V0LW1zZyBbZXhlY3V0b3ItZGF0YSB0YXNrLWRhdGEgbXNnLWlkIHR1cGxlLWluZm8gdGltZS1kZWx0YSBpZF0KQEAgLTQ1MCwyMCArNDQwLDE5IEBACiAgICAgKC5hY2sgc3BvdXQgbXNnLWlkKQogICAgICh0YXNrL2FwcGx5LWhvb2tzICg6dXNlci1jb250ZXh0IHRhc2stZGF0YSkgLnNwb3V0QWNrIChTcG91dEFja0luZm8uIG1zZy1pZCB0YXNrLWlkIHRpbWUtZGVsdGEpKQogICAgICh3aGVuIHRpbWUtZGVsdGEKLSAgICAgIChidWlsdGluLW1ldHJpY3Mvc3BvdXQtYWNrZWQtdHVwbGUhICg6YnVpbHRpbi1tZXRyaWNzIHRhc2stZGF0YSkgKDpzdGF0cyBleGVjdXRvci1kYXRhKSAoOnN0cmVhbSB0dXBsZS1pbmZvKSB0aW1lLWRlbHRhKQogICAgICAgKHN0YXRzL3Nwb3V0LWFja2VkLXR1cGxlISAoOnN0YXRzIGV4ZWN1dG9yLWRhdGEpICg6c3RyZWFtIHR1cGxlLWluZm8pIHRpbWUtZGVsdGEpKSkpCiAKIChkZWZuIG1rLXRhc2stcmVjZWl2ZXIgW2V4ZWN1dG9yLWRhdGEgdHVwbGUtYWN0aW9uLWZuXQotICAobGV0IFteS3J5b1R1cGxlRGVzZXJpYWxpemVyIGRlc2VyaWFsaXplciAoOmRlc2VyaWFsaXplciBleGVjdXRvci1kYXRhKQotICAgICAgICB0YXNrLWlkcyAoOnRhc2staWRzIGV4ZWN1dG9yLWRhdGEpCisgIChsZXQgW3Rhc2staWRzICg6dGFzay1pZHMgZXhlY3V0b3ItZGF0YSkKICAgICAgICAgZGVidWc/ICg9IHRydWUgKC0+IGV4ZWN1dG9yLWRhdGEgOnN0b3JtLWNvbmYgKGdldCBUT1BPTE9HWS1ERUJVRykpKQogICAgICAgICBdCiAgICAgKGRpc3J1cHRvci9jbG9qdXJlLWhhbmRsZXIKICAgICAgIChmbiBbdHVwbGUtYmF0Y2ggc2VxdWVuY2UtaWQgZW5kLW9mLWJhdGNoP10KLSAgICAgICAgKGZhc3QtbGlzdC1pdGVyIFtbdGFzay1pZCBtc2ddIHR1cGxlLWJhdGNoXQotICAgICAgICAgIChsZXQgW15UdXBsZUltcGwgdHVwbGUgKGlmIChpbnN0YW5jZT8gVHVwbGUgbXNnKSBtc2cgKC5kZXNlcmlhbGl6ZSBkZXNlcmlhbGl6ZXIgbXNnKSldCisgICAgICAgIChmYXN0LWxpc3QtaXRlciBbXkFkZHJlc3NlZFR1cGxlIGFkZHJlc3NlZC10dXBsZSB0dXBsZS1iYXRjaF0KKyAgICAgICAgICAobGV0IFteVHVwbGVJbXBsIHR1cGxlICguZ2V0VHVwbGUgYWRkcmVzc2VkLXR1cGxlKQorICAgICAgICAgICAgICAgIHRhc2staWQgKC5nZXREZXN0IGFkZHJlc3NlZC10dXBsZSldCiAgICAgICAgICAgICAod2hlbiBkZWJ1Zz8gKGxvZy1tZXNzYWdlICJQcm9jZXNzaW5nIHJlY2VpdmVkIG1lc3NhZ2UgRk9SICIgdGFzay1pZCAiIFRVUExFOiAiIHR1cGxlKSkKLSAgICAgICAgICAgIChpZiB0YXNrLWlkCisgICAgICAgICAgICAoaWYgKG5vdD0gdGFzay1pZCBBZGRyZXNzZWRUdXBsZS9CUk9BRENBU1RfREVTVCkKICAgICAgICAgICAgICAgKHR1cGxlLWFjdGlvbi1mbiB0YXNrLWlkIHR1cGxlKQogICAgICAgICAgICAgICA7OyBudWxsIHRhc2sgaWRzIGFyZSBicm9hZGNhc3QgdHVwbGVzCiAgICAgICAgICAgICAgIChmYXN0LWxpc3QtaXRlciBbdGFzay1pZCB0YXNrLWlkc10KQEAgLTQ4MywxOCArNDcyLDE3IEBACiAKIDs7IFNlbmQgc2FtcGxlZCBkYXRhIHRvIHRoZSBldmVudGxvZ2dlciBpZiB0aGUgZ2xvYmFsIG9yIGNvbXBvbmVudCBsZXZlbAogOzsgZGVidWcgZmxhZyBpcyBzZXQgKHZpYSBuaW1idXMgYXBpKS4KLShkZWZuIHNlbmQtdG8tZXZlbnRsb2dnZXIgW2V4ZWN1dG9yLWRhdGEgdGFzay1kYXRhIHZhbHVlcyBvdmVyZmxvdy1idWZmZXIgY29tcG9uZW50LWlkIG1lc3NhZ2UtaWQgcmFuZG9tXQorKGRlZm4gc2VuZC10by1ldmVudGxvZ2dlciBbZXhlY3V0b3ItZGF0YSB0YXNrLWRhdGEgdmFsdWVzIGNvbXBvbmVudC1pZCBtZXNzYWdlLWlkIHJhbmRvbV0KICAgICAobGV0IFtjLT5kIEAoOnN0b3JtLWNvbXBvbmVudC0+ZGVidWctYXRvbSBleGVjdXRvci1kYXRhKQogICAgICAgICAgIG9wdGlvbnMgKGdldCBjLT5kIGNvbXBvbmVudC1pZCAoZ2V0IGMtPmQgKDpzdG9ybS1pZCBleGVjdXRvci1kYXRhKSkpCiAgICAgICAgICAgc3BjdCAgICAoaWYgKGFuZCAobm90LW5pbD8gb3B0aW9ucykgKDplbmFibGUgb3B0aW9ucykpICg6c2FtcGxpbmdwY3Qgb3B0aW9ucykgMCldCiAgICAgICA7OyB0aGUgdGhyZWFkJ3MgaW5pdGlhbGl6ZWQgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgaXMgdXNlZCB0byBnZW5lcmF0ZQogICAgICAgOzsgdW5pZm9ybWlseSBkaXN0cmlidXRlZCByYW5kb20gbnVtYmVycy4KLSAgICAgIChpZiAoYW5kICg+IHNwY3QgMCkgKDwgKCogMTAwICgubmV4dERvdWJsZSByYW5kb20pKSBzcGN0KSkKKyAgICAgICh3aGVuIChhbmQgKD4gc3BjdCAwKSAoPCAoKiAxMDAgKC5uZXh0RG91YmxlIHJhbmRvbSkpIHNwY3QpKQogICAgICAgICAodGFzay9zZW5kLXVuYW5jaG9yZWQKICAgICAgICAgICB0YXNrLWRhdGEKICAgICAgICAgICBFVkVOVExPR0dFUi1TVFJFQU0tSUQKLSAgICAgICAgICBbY29tcG9uZW50LWlkIG1lc3NhZ2UtaWQgKFN5c3RlbS9jdXJyZW50VGltZU1pbGxpcykgdmFsdWVzXQotICAgICAgICAgIG92ZXJmbG93LWJ1ZmZlcikpKSkKKyAgICAgICAgICBbY29tcG9uZW50LWlkIG1lc3NhZ2UtaWQgKFN5c3RlbS9jdXJyZW50VGltZU1pbGxpcykgdmFsdWVzXSkpKSkKIAogKGRlZm1ldGhvZCBtay10aHJlYWRzIDpzcG91dCBbZXhlY3V0b3ItZGF0YSB0YXNrLWRhdGFzIGluaXRpYWwtY3JlZGVudGlhbHNdCiAgIChsZXQgW3s6a2V5cyBbc3Rvcm0tY29uZiBjb21wb25lbnQtaWQgd29ya2VyLWNvbnRleHQgdHJhbnNmZXItZm4gcmVwb3J0LWVycm9yIHNhbXBsZXIgb3Blbi1vci1wcmVwYXJlLXdhcy1jYWxsZWQ/XX0gZXhlY3V0b3ItZGF0YQpAQCAtNTA0LDE1ICs0OTIsNyBAQAogICAgICAgICBsYXN0LWFjdGl2ZSAoYXRvbSBmYWxzZSkgICAgICAgIAogICAgICAgICBzcG91dHMgKEFycmF5TGlzdC4gKG1hcCA6b2JqZWN0ICh2YWxzIHRhc2stZGF0YXMpKSkKICAgICAgICAgcmFuZCAoUmFuZG9tLiAoVXRpbHMvc2VjdXJlUmFuZG9tTG9uZykpCi0KLSAgICAgICAgOzsgdGhlIG92ZXJmbG93IGJ1ZmZlciBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0IHNwb3V0cyBuZXZlciBibG9jayB3aGVuIGVtaXR0aW5nCi0gICAgICAgIDs7IHRoaXMgZW5zdXJlcyB0aGF0IHRoZSBzcG91dCBjYW4gYWx3YXlzIGNsZWFyIHRoZSBpbmNvbWluZyBidWZmZXIgKGFja3MgYW5kIGZhaWxzKSwgd2hpY2gKLSAgICAgICAgOzsgcHJldmVudHMgZGVhZGxvY2sgZnJvbSBvY2N1cmluZyBhY3Jvc3MgdGhlIHRvcG9sb2d5IChlLmcuIFNwb3V0IC0+IEJvbHQgLT4gQWNrZXIgLT4gU3BvdXQsIGFuZCBhbGwKLSAgICAgICAgOzsgYnVmZmVycyBmaWxsZWQgdXApCi0gICAgICAgIDs7IHdoZW4gdGhlIG92ZXJmbG93IGJ1ZmZlciBpcyBmdWxsLCBzcG91dHMgc3RvcCBjYWxsaW5nIG5leHRUdXBsZSB1bnRpbCBpdCdzIGFibGUgdG8gY2xlYXIgdGhlIG92ZXJmbG93IGJ1ZmZlcgotICAgICAgICA7OyB0aGlzIGxpbWl0cyB0aGUgc2l6ZSBvZiB0aGUgb3ZlcmZsb3cgYnVmZmVyIHRvIGhvd2V2ZXIgbWFueSB0dXBsZXMgYSBzcG91dCBlbWl0cyBpbiBvbmUgY2FsbCBvZiBuZXh0VHVwbGUsIAotICAgICAgICA7OyBwcmV2ZW50aW5nIG1lbW9yeSBpc3N1ZXMKLSAgICAgICAgb3ZlcmZsb3ctYnVmZmVyIChDb25jdXJyZW50TGlua2VkUXVldWUuKQorICAgICAgICBeRGlzcnVwdG9yUXVldWUgdHJhbnNmZXItcXVldWUgKGV4ZWN1dG9yLWRhdGEgOmJhdGNoLXRyYW5zZmVyLXF1ZXVlKQogCiAgICAgICAgIHBlbmRpbmcgKFJvdGF0aW5nTWFwLgogICAgICAgICAgICAgICAgICAyIDs7IG1pY3Jvb3B0aW1pemUgZm9yIHBlcmZvcm1hbmNlIG9mIC5zaXplIG1ldGhvZApAQCAtNTI1LDcgKzUwNSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIChsZXQgW3N0cmVhbS1pZCAoLmdldFNvdXJjZVN0cmVhbUlkIHR1cGxlKV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uZHAgPSBzdHJlYW0taWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy9TWVNURU1fVElDS19TVFJFQU1fSUQgKC5yb3RhdGUgcGVuZGluZykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy9NRVRSSUNTX1RJQ0tfU1RSRUFNX0lEIChtZXRyaWNzLXRpY2sgZXhlY3V0b3ItZGF0YSAoZ2V0IHRhc2stZGF0YXMgdGFzay1pZCkgdHVwbGUgb3ZlcmZsb3ctYnVmZmVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzL01FVFJJQ1NfVElDS19TVFJFQU1fSUQgKG1ldHJpY3MtdGljayBleGVjdXRvci1kYXRhIChnZXQgdGFzay1kYXRhcyB0YXNrLWlkKSB0dXBsZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy9DUkVERU5USUFMU19DSEFOR0VEX1NUUkVBTV9JRCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxldCBbdGFzay1kYXRhIChnZXQgdGFzay1kYXRhcyB0YXNrLWlkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcG91dC1vYmogKDpvYmplY3QgdGFzay1kYXRhKV0KQEAgLTU3MCw3ICs1NTAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRhc2tzLWZuIG91dC1zdHJlYW0taWQgdmFsdWVzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RlZD8gKGFuZCBtZXNzYWdlLWlkIGhhcy1hY2tlcnM/KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdC1pZCAoaWYgcm9vdGVkPyAoTWVzc2FnZUlkL2dlbmVyYXRlSWQgcmFuZCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQtaWRzIChmYXN0LWxpc3QtZm9yIFt0IG91dC10YXNrc10gKGlmIHJvb3RlZD8gKE1lc3NhZ2VJZC9nZW5lcmF0ZUlkIHJhbmQpKSldCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeTGlzdCBvdXQtaWRzIChmYXN0LWxpc3QtZm9yIFt0IG91dC10YXNrc10gKGlmIHJvb3RlZD8gKE1lc3NhZ2VJZC9nZW5lcmF0ZUlkIHJhbmQpKSldCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmYXN0LWxpc3QtaXRlciBbb3V0LXRhc2sgb3V0LXRhc2tzIGlkIG91dC1pZHNdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGV0IFt0dXBsZS1pZCAoaWYgcm9vdGVkPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTWVzc2FnZUlkL21ha2VSb290SWQgcm9vdC1pZCBpZCkKQEAgLTU4MCwxMiArNTYwLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrLWlkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0LXN0cmVhbS1pZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1cGxlLWlkKV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRyYW5zZmVyLWZuIG91dC10YXNrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQtdHVwbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJmbG93LWJ1ZmZlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRyYW5zZmVyLWZuIG91dC10YXNrIG91dC10dXBsZSkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaWYgaGFzLWV2ZW50bG9nZ2Vycz8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VuZC10by1ldmVudGxvZ2dlciBleGVjdXRvci1kYXRhIHRhc2stZGF0YSB2YWx1ZXMgb3ZlcmZsb3ctYnVmZmVyIGNvbXBvbmVudC1pZCBtZXNzYWdlLWlkIHJhbmQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZW5kLXRvLWV2ZW50bG9nZ2VyIGV4ZWN1dG9yLWRhdGEgdGFzay1kYXRhIHZhbHVlcyBjb21wb25lbnQtaWQgbWVzc2FnZS1pZCByYW5kKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlmIChhbmQgcm9vdGVkPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobm90ICguaXNFbXB0eSBvdXQtaWRzKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRvCkBAIC01OTUsOCArNTcyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlmIChzYW1wbGVyKSAoU3lzdGVtL2N1cnJlbnRUaW1lTWlsbGlzKSldKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRhc2svc2VuZC11bmFuY2hvcmVkIHRhc2stZGF0YQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDS0VSLUlOSVQtU1RSRUFNLUlECi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvb3QtaWQgKGJpdC14b3ItdmFscyBvdXQtaWRzKSB0YXNrLWlkXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJmbG93LWJ1ZmZlcikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvb3QtaWQgKGJpdC14b3ItdmFscyBvdXQtaWRzKSB0YXNrLWlkXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdoZW4gbWVzc2FnZS1pZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFjay1zcG91dC1tc2cgZXhlY3V0b3ItZGF0YSB0YXNrLWRhdGEgbWVzc2FnZS1pZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezpzdHJlYW0gb3V0LXN0cmVhbS1pZCA6dmFsdWVzIHZhbHVlc30KQEAgLTYzMSw0OCArNjA3LDQwIEBACiAgICAgICAgIChsb2ctbWVzc2FnZSAiT3BlbmVkIHNwb3V0ICIgY29tcG9uZW50LWlkICI6IiAoa2V5cyB0YXNrLWRhdGFzKSkKICAgICAgICAgKHNldHVwLW1ldHJpY3MhIGV4ZWN1dG9yLWRhdGEpCiAgICAgICAgIAotICAgICAgICAoZGlzcnVwdG9yL2NvbnN1bWVyLXN0YXJ0ZWQhICg6cmVjZWl2ZS1xdWV1ZSBleGVjdXRvci1kYXRhKSkKICAgICAgICAgKGZuIFtdCiAgICAgICAgICAgOzsgVGhpcyBkZXNpZ24gcmVxdWlyZXMgdGhhdCBzcG91dHMgYmUgbm9uLWJsb2NraW5nCiAgICAgICAgICAgKGRpc3J1cHRvci9jb25zdW1lLWJhdGNoIHJlY2VpdmUtcXVldWUgZXZlbnQtaGFuZGxlcikKICAgICAgICAgICAKLSAgICAgICAgICA7OyB0cnkgdG8gY2xlYXIgdGhlIG92ZXJmbG93LWJ1ZmZlcgotICAgICAgICAgICh0cnktY2F1c2UKLSAgICAgICAgICAgICh3aGlsZSAobm90ICguaXNFbXB0eSBvdmVyZmxvdy1idWZmZXIpKQotICAgICAgICAgICAgICAobGV0IFtbb3V0LXRhc2sgb3V0LXR1cGxlXSAoLnBlZWsgb3ZlcmZsb3ctYnVmZmVyKV0KLSAgICAgICAgICAgICAgICAodHJhbnNmZXItZm4gb3V0LXRhc2sgb3V0LXR1cGxlIGZhbHNlIG5pbCkKLSAgICAgICAgICAgICAgICAoLnBvbGwgb3ZlcmZsb3ctYnVmZmVyKSkpCi0gICAgICAgICAgKGNhdGNoIEluc3VmZmljaWVudENhcGFjaXR5RXhjZXB0aW9uIGUKLSAgICAgICAgICAgICkpCi0gICAgICAgICAgCiAgICAgICAgICAgKGxldCBbYWN0aXZlPyBAKDpzdG9ybS1hY3RpdmUtYXRvbSBleGVjdXRvci1kYXRhKQogICAgICAgICAgICAgICAgIGN1cnItY291bnQgKC5nZXQgZW1pdHRlZC1jb3VudCkKLSAgICAgICAgICAgICAgICA7OyBzdXNwZW5kLXRpbWUgKCg6c3Rvcm0tY29uZiBleGVjdXRvci1kYXRhKSBCQUNLUFJFU1NVUkUtU1BPVVQtU1VTUEVORC1USU1FLU1TKQogICAgICAgICAgICAgICAgIGJhY2twcmVzc3VyZS1lbmFibGVkICgoOnN0b3JtLWNvbmYgZXhlY3V0b3ItZGF0YSkgVE9QT0xPR1ktQkFDS1BSRVNTVVJFLUVOQUJMRSkKICAgICAgICAgICAgICAgICB0aHJvdHRsZS1vbiAoYW5kIGJhY2twcmVzc3VyZS1lbmFibGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAKDp0aHJvdHRsZS1vbiAoOndvcmtlciBleGVjdXRvci1kYXRhKSkpCiAgICAgICAgICAgICAgICAgcmVhY2hlZC1tYXgtc3BvdXQtcGVuZGluZyAoYW5kIG1heC1zcG91dC1wZW5kaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg+PSAoLnNpemUgcGVuZGluZykgbWF4LXNwb3V0LXBlbmRpbmcpKQogICAgICAgICAgICAgICAgIF0KLSAgICAgICAgICAgIChpZiAoYW5kICguaXNFbXB0eSBvdmVyZmxvdy1idWZmZXIpCi0gICAgICAgICAgICAgICAgICAgICAobm90IHRocm90dGxlLW9uKQotICAgICAgICAgICAgICAgICAgICAgKG5vdCByZWFjaGVkLW1heC1zcG91dC1wZW5kaW5nKSkKLSAgICAgICAgICAgICAgKGlmIGFjdGl2ZT8KLSAgICAgICAgICAgICAgICAoZG8KLSAgICAgICAgICAgICAgICAgICh3aGVuLW5vdCBAbGFzdC1hY3RpdmUKLSAgICAgICAgICAgICAgICAgICAgKHJlc2V0ISBsYXN0LWFjdGl2ZSB0cnVlKQotICAgICAgICAgICAgICAgICAgICAobG9nLW1lc3NhZ2UgIkFjdGl2YXRpbmcgc3BvdXQgIiBjb21wb25lbnQtaWQgIjoiIChrZXlzIHRhc2stZGF0YXMpKQotICAgICAgICAgICAgICAgICAgICAoZmFzdC1saXN0LWl0ZXIgW15JU3BvdXQgc3BvdXQgc3BvdXRzXSAoLmFjdGl2YXRlIHNwb3V0KSkpCi0gICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgIChmYXN0LWxpc3QtaXRlciBbXklTcG91dCBzcG91dCBzcG91dHNdICgubmV4dFR1cGxlIHNwb3V0KSkpCi0gICAgICAgICAgICAgICAgKGRvCi0gICAgICAgICAgICAgICAgICAod2hlbiBAbGFzdC1hY3RpdmUKLSAgICAgICAgICAgICAgICAgICAgKHJlc2V0ISBsYXN0LWFjdGl2ZSBmYWxzZSkKLSAgICAgICAgICAgICAgICAgICAgKGxvZy1tZXNzYWdlICJEZWFjdGl2YXRpbmcgc3BvdXQgIiBjb21wb25lbnQtaWQgIjoiIChrZXlzIHRhc2stZGF0YXMpKQotICAgICAgICAgICAgICAgICAgICAoZmFzdC1saXN0LWl0ZXIgW15JU3BvdXQgc3BvdXQgc3BvdXRzXSAoLmRlYWN0aXZhdGUgc3BvdXQpKSkKLSAgICAgICAgICAgICAgICAgIDs7IFRPRE86IGxvZyB0aGF0IGl0J3MgZ2V0dGluZyB0aHJvdHRsZWQKLSAgICAgICAgICAgICAgICAgIChUaW1lL3NsZWVwIDEwMCkKLSAgICAgICAgICAgICAgICAgIChidWlsdGluLW1ldHJpY3Mvc2tpcHBlZC1pbmFjdGl2ZSEgKDpzcG91dC10aHJvdHRsaW5nLW1ldHJpY3MgZXhlY3V0b3ItZGF0YSkgKDpzdGF0cyBleGVjdXRvci1kYXRhKSkpKSkKKyAgICAgICAgICAgIChpZiBhY3RpdmU/CisgICAgICAgICAgICAgIDsgYWN0aXZhdGVkCisgICAgICAgICAgICAgIChkbworICAgICAgICAgICAgICAgICh3aGVuLW5vdCBAbGFzdC1hY3RpdmUKKyAgICAgICAgICAgICAgICAgIChyZXNldCEgbGFzdC1hY3RpdmUgdHJ1ZSkKKyAgICAgICAgICAgICAgICAgIChsb2ctbWVzc2FnZSAiQWN0aXZhdGluZyBzcG91dCAiIGNvbXBvbmVudC1pZCAiOiIgKGtleXMgdGFzay1kYXRhcykpCisgICAgICAgICAgICAgICAgICAoZmFzdC1saXN0LWl0ZXIgW15JU3BvdXQgc3BvdXQgc3BvdXRzXSAoLmFjdGl2YXRlIHNwb3V0KSkpCisKKyAgICAgICAgICAgICAgICAoaWYgKGFuZCAobm90ICguaXNGdWxsIHRyYW5zZmVyLXF1ZXVlKSkKKyAgICAgICAgICAgICAgICAgICAgICAobm90IHRocm90dGxlLW9uKQorICAgICAgICAgICAgICAgICAgICAgIChub3QgcmVhY2hlZC1tYXgtc3BvdXQtcGVuZGluZykpCisgICAgICAgICAgICAgICAgICAoZmFzdC1saXN0LWl0ZXIgW15JU3BvdXQgc3BvdXQgc3BvdXRzXSAoLm5leHRUdXBsZSBzcG91dCkpKSkKKyAgICAgICAgICAgICAgOyBkZWFjdGl2YXRlZAorICAgICAgICAgICAgICAoZG8KKyAgICAgICAgICAgICAgICAod2hlbiBAbGFzdC1hY3RpdmUKKyAgICAgICAgICAgICAgICAgIChyZXNldCEgbGFzdC1hY3RpdmUgZmFsc2UpCisgICAgICAgICAgICAgICAgICAobG9nLW1lc3NhZ2UgIkRlYWN0aXZhdGluZyBzcG91dCAiIGNvbXBvbmVudC1pZCAiOiIgKGtleXMgdGFzay1kYXRhcykpCisgICAgICAgICAgICAgICAgICAoZmFzdC1saXN0LWl0ZXIgW15JU3BvdXQgc3BvdXQgc3BvdXRzXSAoLmRlYWN0aXZhdGUgc3BvdXQpKSkKKyAgICAgICAgICAgICAgICA7OyBUT0RPOiBsb2cgdGhhdCBpdCdzIGdldHRpbmcgdGhyb3R0bGVkCisgICAgICAgICAgICAgICAgKFRpbWUvc2xlZXAgMTAwKQorICAgICAgICAgICAgICAgIChidWlsdGluLW1ldHJpY3Mvc2tpcHBlZC1pbmFjdGl2ZSEgKDpzcG91dC10aHJvdHRsaW5nLW1ldHJpY3MgZXhlY3V0b3ItZGF0YSkgKDpzdGF0cyBleGVjdXRvci1kYXRhKSkpKQorCiAgICAgICAgICAgICAoaWYgKGFuZCAoPSBjdXJyLWNvdW50ICguZ2V0IGVtaXR0ZWQtY291bnQpKSBhY3RpdmU/KQogICAgICAgICAgICAgICAoZG8gKC5pbmNyZW1lbnQgZW1wdHktZW1pdC1zdHJlYWspCiAgICAgICAgICAgICAgICAgICAoLmVtcHR5RW1pdCBzcG91dC13YWl0LXN0cmF0ZWd5ICguZ2V0IGVtcHR5LWVtaXQtc3RyZWFrKSkKQEAgLTY4MiwxMSArNjUwLDExIEBACiAgICAgICAgICAgICAgICAgICAgIChpZiByZWFjaGVkLW1heC1zcG91dC1wZW5kaW5nCiAgICAgICAgICAgICAgICAgICAgICAgKGJ1aWx0aW4tbWV0cmljcy9za2lwcGVkLW1heC1zcG91dCEgKDpzcG91dC10aHJvdHRsaW5nLW1ldHJpY3MgZXhlY3V0b3ItZGF0YSkgKDpzdGF0cyBleGVjdXRvci1kYXRhKSkpKSkKICAgICAgICAgICAgICAgKC5zZXQgZW1wdHktZW1pdC1zdHJlYWsgMCkKLSAgICAgICAgICAgICAgKSkgICAgICAgICAgIAorICAgICAgICAgICAgICApKQogICAgICAgICAgIDApKQogICAgICAgOmtpbGwtZm4gKDpyZXBvcnQtZXJyb3ItYW5kLWRpZSBleGVjdXRvci1kYXRhKQogICAgICAgOmZhY3Rvcnk/IHRydWUKLSAgICAgIDp0aHJlYWQtbmFtZSBjb21wb25lbnQtaWQpXSkpCisgICAgICA6dGhyZWFkLW5hbWUgKHN0ciBjb21wb25lbnQtaWQgIi1leGVjdXRvciIgKDpleGVjdXRvci1pZCBleGVjdXRvci1kYXRhKSkpXSkpCiAKIChkZWZuLSB0dXBsZS10aW1lLWRlbHRhISBbXlR1cGxlSW1wbCB0dXBsZV0KICAgKGxldCBbbXMgKC5nZXRQcm9jZXNzU2FtcGxlU3RhcnRUaW1lIHR1cGxlKV0KQEAgLTcxMCwxNCArNjc4LDYgQEAKICAgICAgICAgICAgICAgICBvcGVuLW9yLXByZXBhcmUtd2FzLWNhbGxlZD9dfSBleGVjdXRvci1kYXRhCiAgICAgICAgIHJhbmQgKFJhbmRvbS4gKFV0aWxzL3NlY3VyZVJhbmRvbUxvbmcpKQogCi0gICAgICAgIDs7IHRoZSBvdmVyZmxvdyBidWZmZXIgaXMgdXNlZCB0byBlbnN1cmUgdGhhdCBib2x0cyBkbyBub3QgYmxvY2sgd2hlbiBlbWl0dGluZwotICAgICAgICA7OyB0aGlzIGVuc3VyZXMgdGhhdCB0aGUgYm9sdCBjYW4gYWx3YXlzIGNsZWFyIHRoZSBpbmNvbWluZyBtZXNzYWdlcywgd2hpY2gKLSAgICAgICAgOzsgcHJldmVudHMgZGVhZGxvY2sgZnJvbSBvY2N1cnMgYWNyb3NzIHRoZSB0b3BvbG9neQotICAgICAgICA7OyAoZS5nLiBTcG91dCAtPiBCb2x0QSAtPiBTcGxpdHRlciAtPiBCb2x0QiAtPiBCb2x0QSwgYW5kIGFsbAotICAgICAgICA7OyBidWZmZXJzIGZpbGxlZCB1cCkKLSAgICAgICAgOzsgdGhlIG92ZXJmbG93IGJ1ZmZlciBpcyBtaWdodCBncmFkdWFsbHkgZmlsbCBkZWdyYWRpbmcgdGhlIHBlcmZvcm1hbmNlIGdyYWR1YWxseQotICAgICAgICA7OyBldmVudHVhbGx5IHJ1bm5pbmcgb3V0IG9mIG1lbW9yeSwgYnV0IGF0IGxlYXN0IHByZXZlbnQgbGl2ZS1sb2Nrcy9kZWFkbG9ja3MuCi0gICAgICAgIG92ZXJmbG93LWJ1ZmZlciAoaWYgKHN0b3JtLWNvbmYgVE9QT0xPR1ktQk9MVFMtT1VUR09JTkctT1ZFUkZMT1ctQlVGRkVSLUVOQUJMRSkgKENvbmN1cnJlbnRMaW5rZWRRdWV1ZS4pIG5pbCkKICAgICAgICAgdHVwbGUtYWN0aW9uLWZuIChmbiBbdGFzay1pZCBeVHVwbGVJbXBsIHR1cGxlXQogICAgICAgICAgICAgICAgICAgICAgICAgICA7OyBzeW5jaHJvbml6YXRpb24gbmVlZHMgdG8gYmUgZG9uZSB3aXRoIGEga2V5IHByb3ZpZGVkIGJ5IHRoaXMgYm9sdCwgb3RoZXJ3aXNlOgogICAgICAgICAgICAgICAgICAgICAgICAgICA7OyBzcG91dCAxIHNlbmRzIHN5bmNocm9uaXphdGlvbiAoczEpLCBkaWVzLCBzYW1lIHNwb3V0IHJlc3RhcnRzIHNvbWV3aGVyZSBlbHNlLCBzZW5kcyBzeW5jaHJvbml6YXRpb24gKHMyKSBhbmQgaW5jcmVtZW50YWwgdXBkYXRlLiBzMiBhbmQgdXBkYXRlIGZpbmlzaCBiZWZvcmUgczEgLT4gbG9zZSB0aGUgaW5jcmVtZW50YWwgdXBkYXRlCkBAIC03NDIsNyArNzAyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9sdC1vYmogKDpvYmplY3QgdGFzay1kYXRhKV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2hlbiAoaW5zdGFuY2U/IElDcmVkZW50aWFsc0xpc3RlbmVyIGJvbHQtb2JqKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC5zZXRDcmVkZW50aWFscyBib2x0LW9iaiAoLmdldFZhbHVlIHR1cGxlIDApKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMvTUVUUklDU19USUNLX1NUUkVBTV9JRCAobWV0cmljcy10aWNrIGV4ZWN1dG9yLWRhdGEgKGdldCB0YXNrLWRhdGFzIHRhc2staWQpIHR1cGxlIG92ZXJmbG93LWJ1ZmZlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy9NRVRSSUNTX1RJQ0tfU1RSRUFNX0lEIChtZXRyaWNzLXRpY2sgZXhlY3V0b3ItZGF0YSAoZ2V0IHRhc2stZGF0YXMgdGFzay1pZCkgdHVwbGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGV0IFt0YXNrLWRhdGEgKGdldCB0YXNrLWRhdGFzIHRhc2staWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeSUJvbHQgYm9sdC1vYmogKDpvYmplY3QgdGFzay1kYXRhKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlci1jb250ZXh0ICg6dXNlci1jb250ZXh0IHRhc2stZGF0YSkKQEAgLTc2MSwxMSArNzIxLDYgQEAKICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGFzay9hcHBseS1ob29rcyB1c2VyLWNvbnRleHQgLmJvbHRFeGVjdXRlIChCb2x0RXhlY3V0ZUluZm8uIHR1cGxlIHRhc2staWQgZGVsdGEpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aGVuIGRlbHRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYnVpbHRpbi1tZXRyaWNzL2JvbHQtZXhlY3V0ZS10dXBsZSEgKDpidWlsdGluLW1ldHJpY3MgdGFzay1kYXRhKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dG9yLXN0YXRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC5nZXRTb3VyY2VDb21wb25lbnQgdHVwbGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC5nZXRTb3VyY2VTdHJlYW1JZCB0dXBsZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0cy9ib2x0LWV4ZWN1dGUtdHVwbGUhIGV4ZWN1dG9yLXN0YXRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLmdldFNvdXJjZUNvbXBvbmVudCB0dXBsZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICguZ2V0U291cmNlU3RyZWFtSWQgdHVwbGUpCkBAIC03OTksMTUgKzc1NCwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmYXN0LWxpc3QtaXRlciBbcm9vdC1pZCByb290LWlkc10KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHB1dC14b3IhIGFuY2hvcnMtdG8taWRzIHJvb3QtaWQgZWRnZS1pZCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHJhbnNmZXItZm4gdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChUdXBsZUltcGwuIHdvcmtlci1jb250ZXh0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsZXQgW3R1cGxlIChUdXBsZUltcGwuIHdvcmtlci1jb250ZXh0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFzay1pZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNZXNzYWdlSWQvbWFrZUlkIGFuY2hvcnMtdG8taWRzKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdmVyZmxvdy1idWZmZXIpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTWVzc2FnZUlkL21ha2VJZCBhbmNob3JzLXRvLWlkcykpXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0cmFuc2Zlci1mbiB0IHR1cGxlKSkpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlmIGhhcy1ldmVudGxvZ2dlcnM/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZW5kLXRvLWV2ZW50bG9nZ2VyIGV4ZWN1dG9yLWRhdGEgdGFzay1kYXRhIHZhbHVlcyBvdmVyZmxvdy1idWZmZXIgY29tcG9uZW50LWlkIG5pbCByYW5kKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbmQtdG8tZXZlbnRsb2dnZXIgZXhlY3V0b3ItZGF0YSB0YXNrLWRhdGEgdmFsdWVzIGNvbXBvbmVudC1pZCBuaWwgcmFuZCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3Igb3V0LXRhc2tzIFtdKSkpXV0KICAgICAgICAgICAoYnVpbHRpbi1tZXRyaWNzL3JlZ2lzdGVyLWFsbCAoOmJ1aWx0aW4tbWV0cmljcyB0YXNrLWRhdGEpIHN0b3JtLWNvbmYgdXNlci1jb250ZXh0KQogICAgICAgICAgICh3aGVuIChpbnN0YW5jZT8gSUNyZWRlbnRpYWxzTGlzdGVuZXIgYm9sdC1vYmopICguc2V0Q3JlZGVudGlhbHMgYm9sdC1vYmogaW5pdGlhbC1jcmVkZW50aWFscykpIApAQCAtODM5LDE5ICs3OTMsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmYXN0LW1hcC1pdGVyIFtbcm9vdCBpZF0gKC4uIHR1cGxlIGdldE1lc3NhZ2VJZCBnZXRBbmNob3JzVG9JZHMpXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRhc2svc2VuZC11bmFuY2hvcmVkIHRhc2stZGF0YQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDS0VSLUFDSy1TVFJFQU0tSUQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm9vdCAoYml0LXhvciBpZCBhY2stdmFsKV0gb3ZlcmZsb3ctYnVmZmVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm9vdCAoYml0LXhvciBpZCBhY2stdmFsKV0pKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAobGV0IFtkZWx0YSAodHVwbGUtdGltZS1kZWx0YSEgdHVwbGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWc/ICg9IHRydWUgKHN0b3JtLWNvbmYgVE9QT0xPR1ktREVCVUcpKV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aGVuIGRlYnVnPyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvZy1tZXNzYWdlICJCT0xUIGFjayBUQVNLOiAiIHRhc2staWQgIiBUSU1FOiAiIGRlbHRhICIgVFVQTEU6ICIgdHVwbGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRhc2svYXBwbHktaG9va3MgdXNlci1jb250ZXh0IC5ib2x0QWNrIChCb2x0QWNrSW5mby4gdHVwbGUgdGFzay1pZCBkZWx0YSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2hlbiBkZWx0YQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYnVpbHRpbi1tZXRyaWNzL2JvbHQtYWNrZWQtdHVwbGUhICg6YnVpbHRpbi1tZXRyaWNzIHRhc2stZGF0YSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRvci1zdGF0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICguZ2V0U291cmNlQ29tcG9uZW50IHR1cGxlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICguZ2V0U291cmNlU3RyZWFtSWQgdHVwbGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0cy9ib2x0LWFja2VkLXR1cGxlISBleGVjdXRvci1zdGF0cwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC5nZXRTb3VyY2VDb21wb25lbnQgdHVwbGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLmdldFNvdXJjZVN0cmVhbUlkIHR1cGxlKQpAQCAtODYwLDE3ICs4MDgsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAoZmFzdC1saXN0LWl0ZXIgW3Jvb3QgKC4uIHR1cGxlIGdldE1lc3NhZ2VJZCBnZXRBbmNob3JzKV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRhc2svc2VuZC11bmFuY2hvcmVkIHRhc2stZGF0YQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNLRVItRkFJTC1TVFJFQU0tSUQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtyb290XSBvdmVyZmxvdy1idWZmZXIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3Jvb3RdKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAobGV0IFtkZWx0YSAodHVwbGUtdGltZS1kZWx0YSEgdHVwbGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWc/ICg9IHRydWUgKHN0b3JtLWNvbmYgVE9QT0xPR1ktREVCVUcpKV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aGVuIGRlYnVnPyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvZy1tZXNzYWdlICJCT0xUIGZhaWwgVEFTSzogIiB0YXNrLWlkICIgVElNRTogIiBkZWx0YSAiIFRVUExFOiAiIHR1cGxlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0YXNrL2FwcGx5LWhvb2tzIHVzZXItY29udGV4dCAuYm9sdEZhaWwgKEJvbHRGYWlsSW5mby4gdHVwbGUgdGFzay1pZCBkZWx0YSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2hlbiBkZWx0YQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYnVpbHRpbi1tZXRyaWNzL2JvbHQtZmFpbGVkLXR1cGxlISAoOmJ1aWx0aW4tbWV0cmljcyB0YXNrLWRhdGEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dG9yLXN0YXRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICguZ2V0U291cmNlQ29tcG9uZW50IHR1cGxlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLmdldFNvdXJjZVN0cmVhbUlkIHR1cGxlKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXRzL2JvbHQtZmFpbGVkLXR1cGxlISBleGVjdXRvci1zdGF0cwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICguZ2V0U291cmNlQ29tcG9uZW50IHR1cGxlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICguZ2V0U291cmNlU3RyZWFtSWQgdHVwbGUpCkBAIC04ODQsMjMgKzgyOCwxMiBAQAogCiAgICAgICAgIChsZXQgW3JlY2VpdmUtcXVldWUgKDpyZWNlaXZlLXF1ZXVlIGV4ZWN1dG9yLWRhdGEpCiAgICAgICAgICAgICAgIGV2ZW50LWhhbmRsZXIgKG1rLXRhc2stcmVjZWl2ZXIgZXhlY3V0b3ItZGF0YSB0dXBsZS1hY3Rpb24tZm4pXQotICAgICAgICAgIChkaXNydXB0b3IvY29uc3VtZXItc3RhcnRlZCEgcmVjZWl2ZS1xdWV1ZSkKICAgICAgICAgICAoZm4gW10gICAgICAgICAgICAKICAgICAgICAgICAgIChkaXNydXB0b3IvY29uc3VtZS1iYXRjaC13aGVuLWF2YWlsYWJsZSByZWNlaXZlLXF1ZXVlIGV2ZW50LWhhbmRsZXIpCi0gICAgICAgICAgICA7OyB0cnkgdG8gY2xlYXIgdGhlIG92ZXJmbG93LWJ1ZmZlcgotICAgICAgICAgICAgKHRyeS1jYXVzZQotICAgICAgICAgICAgICAod2hpbGUgKGFuZCBvdmVyZmxvdy1idWZmZXIgKG5vdCAoLmlzRW1wdHkgb3ZlcmZsb3ctYnVmZmVyKSkpCi0gICAgICAgICAgICAgICAgKGxldCBbW291dC10YXNrIG91dC10dXBsZV0gKC5wZWVrIG92ZXJmbG93LWJ1ZmZlcildCi0gICAgICAgICAgICAgICAgICAodHJhbnNmZXItZm4gb3V0LXRhc2sgb3V0LXR1cGxlIGZhbHNlIG5pbCkKLSAgICAgICAgICAgICAgICAgICgucG9sbCBvdmVyZmxvdy1idWZmZXIpKSkKLSAgICAgICAgICAgICAgKGNhdGNoIEluc3VmZmljaWVudENhcGFjaXR5RXhjZXB0aW9uIGUKLSAgICAgICAgICAgICAgICAod2hlbiAoPSB0cnVlIChzdG9ybS1jb25mIFRPUE9MT0dZLURFQlVHKSkKLSAgICAgICAgICAgICAgICAgIChsb2ctbWVzc2FnZSAiSW5zdWZmaWNpZW50IENhcGFjaXR5IG9uIHF1ZXVlIHRvIGVtaXQgYnkgYm9sdCAiIGNvbXBvbmVudC1pZCAiOiIgKGtleXMgdGFzay1kYXRhcykgKSkKLSAgICAgICAgICAgICAgICApKQogICAgICAgICAgICAgMCkpKQogICAgICAgOmtpbGwtZm4gKDpyZXBvcnQtZXJyb3ItYW5kLWRpZSBleGVjdXRvci1kYXRhKQogICAgICAgOmZhY3Rvcnk/IHRydWUKLSAgICAgIDp0aHJlYWQtbmFtZSBjb21wb25lbnQtaWQpXSkpCisgICAgICA6dGhyZWFkLW5hbWUgKHN0ciBjb21wb25lbnQtaWQgIi1leGVjdXRvciIgKDpleGVjdXRvci1pZCBleGVjdXRvci1kYXRhKSkpXSkpCiAKIChkZWZtZXRob2QgY2xvc2UtY29tcG9uZW50IDpzcG91dCBbZXhlY3V0b3ItZGF0YSBzcG91dF0KICAgKC5jbG9zZSBzcG91dCkpCmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9jbGovYmFja3R5cGUvc3Rvcm0vZGFlbW9uL2xvZ3ZpZXdlci5jbGogYi9zdG9ybS1jb3JlL3NyYy9jbGovYmFja3R5cGUvc3Rvcm0vZGFlbW9uL2xvZ3ZpZXdlci5jbGoKaW5kZXggMmE4YTQwYy4uODBlZTAxYSAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvY2xqL2JhY2t0eXBlL3N0b3JtL2RhZW1vbi9sb2d2aWV3ZXIuY2xqCisrKyBiL3N0b3JtLWNvcmUvc3JjL2Nsai9iYWNrdHlwZS9zdG9ybS9kYWVtb24vbG9ndmlld2VyLmNsagpAQCAtMTYsNDggKzE2LDc0IEBACiAobnMgYmFja3R5cGUuc3Rvcm0uZGFlbW9uLmxvZ3ZpZXdlcgogICAoOnVzZSBjb21wb2p1cmUuY29yZSkKICAgKDp1c2UgW2Nsb2p1cmUuc2V0IDpvbmx5IFtkaWZmZXJlbmNlIGludGVyc2VjdGlvbl1dKQotICAoOnVzZSBbY2xvanVyZS5zdHJpbmcgOm9ubHkgW2JsYW5rP11dKQotICAoOnVzZSBbaGljY3VwIGNvcmUgcGFnZS1oZWxwZXJzXSkKKyAgKDp1c2UgW2Nsb2p1cmUuc3RyaW5nIDpvbmx5IFtibGFuaz8gc3BsaXRdXSkKKyAgKDp1c2UgW2hpY2N1cCBjb3JlIHBhZ2UtaGVscGVycyBmb3JtLWhlbHBlcnNdKQogICAoOnVzZSBbYmFja3R5cGUuc3Rvcm0gY29uZmlnIHV0aWwgbG9nIHRpbWVyXSkKICAgKDp1c2UgW2JhY2t0eXBlLnN0b3JtLnVpIGhlbHBlcnNdKQorICAoOmltcG9ydCBbYmFja3R5cGUuc3Rvcm0udXRpbHMgVXRpbHNdKQogICAoOmltcG9ydCBbb3JnLnNsZjRqIExvZ2dlckZhY3RvcnldKQotICAoOmltcG9ydCBbamF2YS5pbyBGaWxlIEZpbGVGaWx0ZXIgRmlsZUlucHV0U3RyZWFtXSkKKyAgKDppbXBvcnQgW2phdmEudXRpbCBBcnJheXNdKQorICAoOmltcG9ydCBbamF2YS51dGlsLnppcCBHWklQSW5wdXRTdHJlYW1dKQogICAoOmltcG9ydCBbb3JnLmFwYWNoZS5sb2dnaW5nLmxvZzRqIExvZ01hbmFnZXJdKQogICAoOmltcG9ydCBbb3JnLmFwYWNoZS5sb2dnaW5nLmxvZzRqLmNvcmUgQXBwZW5kZXIgTG9nZ2VyQ29udGV4dF0pCiAgICg6aW1wb3J0IFtvcmcuYXBhY2hlLmxvZ2dpbmcubG9nNGouY29yZS5hcHBlbmRlciBSb2xsaW5nRmlsZUFwcGVuZGVyXSkKKyAgKDppbXBvcnQgW2phdmEuaW8gQnVmZmVyZWRJbnB1dFN0cmVhbSBGaWxlIEZpbGVGaWx0ZXIgRmlsZUlucHV0U3RyZWFtCisgICAgICAgICAgICBJbnB1dFN0cmVhbSBJbnB1dFN0cmVhbVJlYWRlcl0pCisgICg6aW1wb3J0IFtqYXZhLm5pbyBCeXRlQnVmZmVyXSkKICAgKDppbXBvcnQgW29yZy55YW1sLnNuYWtleWFtbCBZYW1sXQogICAgICAgICAgICBbb3JnLnlhbWwuc25ha2V5YW1sLmNvbnN0cnVjdG9yIFNhZmVDb25zdHJ1Y3Rvcl0pCiAgICg6aW1wb3J0IFtiYWNrdHlwZS5zdG9ybS51aSBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbl0KICAgICAgICAgICAgW2JhY2t0eXBlLnN0b3JtLnNlY3VyaXR5LmF1dGggQXV0aFV0aWxzXSkKKyAgKDpyZXF1aXJlIFtiYWNrdHlwZS5zdG9ybS5kYWVtb24gY29tbW9uIFtzdXBlcnZpc29yIDphcyBzdXBlcnZpc29yXV0pCiAgICg6cmVxdWlyZSBbY29tcG9qdXJlLnJvdXRlIDphcyByb3V0ZV0KICAgICAgICAgICAgIFtjb21wb2p1cmUuaGFuZGxlciA6YXMgaGFuZGxlcl0KICAgICAgICAgICAgIFtyaW5nLm1pZGRsZXdhcmUua2V5d29yZC1wYXJhbXNdCi0gICAgICAgICAgICBbcmluZy51dGlsLnJlc3BvbnNlIDphcyByZXNwXSkKLSAgKDpyZXF1aXJlIFtiYWNrdHlwZS5zdG9ybS5kYWVtb24gY29tbW9uIFtzdXBlcnZpc29yIDphcyBzdXBlcnZpc29yXV0pCi0gICg6aW1wb3J0IFtqYXZhLmlvIEZpbGUgRmlsZUZpbHRlcl0pCi0gICg6cmVxdWlyZSBbY29tcG9qdXJlLnJvdXRlIDphcyByb3V0ZV0KLSAgICAgICAgICAgIFtjb21wb2p1cmUuaGFuZGxlciA6YXMgaGFuZGxlcl0KKyAgICAgICAgICAgIFtyaW5nLnV0aWwuY29kZWMgOmFzIGNvZGVjXQogICAgICAgICAgICAgW3JpbmcudXRpbC5yZXNwb25zZSA6YXMgcmVzcF0KICAgICAgICAgICAgIFtjbG9qdXJlLnN0cmluZyA6YXMgc3RyaW5nXSkKKyAgKDpyZXF1aXJlIFttZXRyaWNzLm1ldGVycyA6cmVmZXIgW2RlZm1ldGVyIG1hcmshXV0pCisgICg6dXNlIFtiYWNrdHlwZS5zdG9ybS5kYWVtb24uY29tbW9uIDpvbmx5IFtzdGFydC1tZXRyaWNzLXJlcG9ydGVyc11dKQogICAoOmdlbi1jbGFzcykpCiAKIChkZWYgXjpkeW5hbWljICpTVE9STS1DT05GKiAocmVhZC1zdG9ybS1jb25maWcpKQogCisoZGVmbWV0ZXIgbG9ndmlld2VyOm51bS1sb2ctcGFnZS1odHRwLXJlcXVlc3RzKQorKGRlZm1ldGVyIGxvZ3ZpZXdlcjpudW0tZGFlbW9ubG9nLXBhZ2UtaHR0cC1yZXF1ZXN0cykKKyhkZWZtZXRlciBsb2d2aWV3ZXI6bnVtLWRvd25sb2FkLWxvZy1maWxlLWh0dHAtcmVxdWVzdHMpCisoZGVmbWV0ZXIgbG9ndmlld2VyOm51bS1kb3dubG9hZC1sb2ctZGFlbW9uLWZpbGUtaHR0cC1yZXF1ZXN0cykKKyhkZWZtZXRlciBsb2d2aWV3ZXI6bnVtLWxpc3QtbG9ncy1odHRwLXJlcXVlc3RzKQorCiAoZGVmbiBjbGVhbnVwLWN1dG9mZi1hZ2UtbWlsbGlzIFtjb25mIG5vdy1taWxsaXNdCiAgICgtIG5vdy1taWxsaXMgKCogKGNvbmYgTE9HVklFV0VSLUNMRUFOVVAtQUdFLU1JTlMpIDYwIDEwMDApKSkKIAotO1RPRE86IGhhbmRsZSBjbGVhbnVwIG9mIG9sZCBldmVudCBsb2cgZmlsZXMKKyhkZWZuLSBsYXN0LW1vZGlmaWVkdGltZS13b3JrZXItbG9nZGlyCisgICJSZXR1cm4gdGhlIGxhc3QgbW9kaWZpZWQgdGltZSBmb3IgYWxsIGxvZyBmaWxlcyBpbiBhIHdvcmtlcidzIGxvZyBkaXIiCisgIFtsb2ctZGlyXQorICAoYXBwbHkgbWF4CisgICAgICAgICAoLmxhc3RNb2RpZmllZCBsb2ctZGlyKQorICAgICAgICAgKGZvciBbXkZpbGUgZmlsZSAoLmxpc3RGaWxlcyBsb2ctZGlyKV0KKyAgICAgICAgICAgKC5sYXN0TW9kaWZpZWQgZmlsZSkpKSkKKwogKGRlZm4gbWstRmlsZUZpbHRlci1mb3ItbG9nLWNsZWFudXAgW2NvbmYgbm93LW1pbGxpc10KICAgKGxldCBbY3V0b2ZmLWFnZS1taWxsaXMgKGNsZWFudXAtY3V0b2ZmLWFnZS1taWxsaXMgY29uZiBub3ctbWlsbGlzKV0KICAgICAocmVpZnkgRmlsZUZpbHRlciAoXmJvb2xlYW4gYWNjZXB0IFt0aGlzIF5GaWxlIGZpbGVdCiAgICAgICAgICAgICAgICAgICAgICAgICAoYm9vbGVhbiAoYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICguaXNGaWxlIGZpbGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChyZS1maW5kIHdvcmtlci1sb2ctZmlsZW5hbWUtcGF0dGVybiAoLmdldE5hbWUgZmlsZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICg8PSAoLmxhc3RNb2RpZmllZCBmaWxlKSBjdXRvZmYtYWdlLW1pbGxpcykpKSkpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5vdCAoLmlzRmlsZSBmaWxlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDw9IChsYXN0LW1vZGlmaWVkdGltZS13b3JrZXItbG9nZGlyIGZpbGUpIGN1dG9mZi1hZ2UtbWlsbGlzKSkpKSkpKQogCi0oZGVmbiBzZWxlY3QtZmlsZXMtZm9yLWNsZWFudXAgW2NvbmYgbm93LW1pbGxpcyByb290LWRpcl0KKyhkZWZuIHNlbGVjdC1kaXJzLWZvci1jbGVhbnVwIFtjb25mIG5vdy1taWxsaXMgcm9vdC1kaXJdCiAgIChsZXQgW2ZpbGUtZmlsdGVyIChtay1GaWxlRmlsdGVyLWZvci1sb2ctY2xlYW51cCBjb25mIG5vdy1taWxsaXMpXQotICAgICgubGlzdEZpbGVzIChGaWxlLiByb290LWRpcikgZmlsZS1maWx0ZXIpKSkKKyAgICAocmVkdWNlIGNsb2p1cmUuc2V0L3VuaW9uCisgICAgICAgICAgICAoc29ydGVkLXNldCkKKyAgICAgICAgICAgIChmb3IgW15GaWxlIHRvcG8tZGlyICgubGlzdEZpbGVzIChGaWxlLiByb290LWRpcikpXQorICAgICAgICAgICAgICAoaW50byBbXSAoLmxpc3RGaWxlcyB0b3BvLWRpciBmaWxlLWZpbHRlcikpKSkpKQorCisoZGVmbiBnZXQtdG9wby1wb3J0LXdvcmtlcmxvZworICAiUmV0dXJuIHRoZSBwYXRoIG9mIHRoZSB3b3JrZXIgbG9nIHdpdGggdGhlIGZvcm1hdCBvZiB0b3BvSWQvcG9ydC93b3JrZXIubG9nLioiCisgIFteRmlsZSBmaWxlXQorICAoY2xvanVyZS5zdHJpbmcvam9pbiBmaWxlLXBhdGgtc2VwYXJhdG9yCisgICAgICAgICAgICAgICAgICAgICAgICh0YWtlLWxhc3QgMworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzcGxpdCAoLmdldENhbm9uaWNhbFBhdGggZmlsZSkgKHJlLXBhdHRlcm4gZmlsZS1wYXRoLXNlcGFyYXRvcikpKSkpCiAKIChkZWZuIGdldC1tZXRhZGF0YS1maWxlLWZvci1sb2ctcm9vdC1uYW1lIFtyb290LW5hbWUgcm9vdC1kaXJdCiAgIChsZXQgW21ldGFGaWxlIChjbG9qdXJlLmphdmEuaW8vZmlsZSByb290LWRpciAibWV0YWRhdGEiCkBAIC02OSwxMTYgKzk1LDIwMiBAQAogICAgICAgICAgICAgICAgICAgIiB0byBjbGVhbiB1cCBmb3IgIiByb290LW5hbWUpCiAgICAgICAgIG5pbCkpKSkKIAorKGRlZm4gZ2V0LW1ldGFkYXRhLWZpbGUtZm9yLXdyb2tlci1sb2dkaXIgW2xvZ2Rpcl0KKyAgKGxldCBbbWV0YUZpbGUgKGNsb2p1cmUuamF2YS5pby9maWxlIGxvZ2RpciAid29ya2VyLnlhbWwiKV0KKyAgICAoaWYgKC5leGlzdHMgbWV0YUZpbGUpCisgICAgICBtZXRhRmlsZQorICAgICAgKGRvCisgICAgICAgIChsb2ctd2FybiAiQ291bGQgbm90IGZpbmQgIiAoLmdldENhbm9uaWNhbFBhdGggbWV0YUZpbGUpCisgICAgICAgICAgICAgICAgICAiIHRvIGNsZWFuIHVwIGZvciAiIGxvZ2RpcikKKyAgICAgICAgbmlsKSkpKQorCiAoZGVmbiBnZXQtd29ya2VyLWlkLWZyb20tbWV0YWRhdGEtZmlsZSBbbWV0YUZpbGVdCiAgIChnZXQgKGNsb2p1cmUtZnJvbS15YW1sLWZpbGUgbWV0YUZpbGUpICJ3b3JrZXItaWQiKSkKIAogKGRlZm4gZ2V0LXRvcG8tb3duZXItZnJvbS1tZXRhZGF0YS1maWxlIFttZXRhRmlsZV0KICAgKGdldCAoY2xvanVyZS1mcm9tLXlhbWwtZmlsZSBtZXRhRmlsZSkgVE9QT0xPR1ktU1VCTUlUVEVSLVVTRVIpKQogCi0oZGVmbiBnZXQtbG9nLXJvb3QtPmZpbGVzLW1hcCBbbG9nLWZpbGVzXQotICAiUmV0dXJucyBhIG1hcCBvZiBcInJvb3QgbmFtZVwiIHRvIGEgdGhlIHNldCBvZiBmaWxlcyBpbiBsb2ctZmlsZXMgaGF2aW5nIHRoZQotICByb290IG5hbWUuICBUaGUgXCJyb290IG5hbWVcIiBvZiBhIGxvZyBmaWxlIGlzIHRoZSBwYXJ0IG9mIHRoZSBuYW1lIHByZWNlZGluZwotICB0aGUgZXh0ZW5zaW9uLiIKLSAgKHJlZHVjZSAjKGFzc29jICUxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OyBUaGUgYWNjdW11bGF0ZWQgbWFwIHNvIGZhcgotICAgICAgICAgICAgICAgICAgKGZpcnN0ICUyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7IGtleTogVGhlIHJvb3QgbmFtZSBvZiB0aGUgbG9nIGZpbGUKLSAgICAgICAgICAgICAgICAgIChjb25qICglMSAoZmlyc3QgJTIpICN7fSkgKHNlY29uZCAlMikpKSA7OyB2YWw6IFRoZSBzZXQgb2YgbG9nIGZpbGVzIHdpdGggdGhlIHJvb3QgbmFtZQotICAgICAgICAgIHt9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7IGluaXRpYWwgKGVtcHR5KSBtYXAKLSAgICAgICAgICAobWFwICMobGlzdAotICAgICAgICAgICAgICAgICAgKHNlY29uZCAocmUtZmluZCB3b3JrZXItbG9nLWZpbGVuYW1lLXBhdHRlcm4gKC5nZXROYW1lICUpKSkgOzsgVGhlIHJvb3QgbmFtZSBvZiB0aGUgbG9nIGZpbGUKLSAgICAgICAgICAgICAgICAgICUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDs7IFRoZSBsb2cgZmlsZQotICAgICAgICAgICAgICAgbG9nLWZpbGVzKSkpCi0KLShkZWZuIGlkZW50aWZ5LXdvcmtlci1sb2ctZmlsZXMgW2xvZy1maWxlcyByb290LWRpcl0KLSAgKGludG8ge30gKGZvciBbbG9nLXJvb3QtZW50cnkgKGdldC1sb2ctcm9vdC0+ZmlsZXMtbWFwIGxvZy1maWxlcykKLSAgICAgICAgICAgICAgICAgOmxldCBbbWV0YUZpbGUgKGdldC1tZXRhZGF0YS1maWxlLWZvci1sb2ctcm9vdC1uYW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleSBsb2ctcm9vdC1lbnRyeSkgcm9vdC1kaXIpCi0gICAgICAgICAgICAgICAgICAgICAgIGxvZy1yb290IChrZXkgbG9nLXJvb3QtZW50cnkpCi0gICAgICAgICAgICAgICAgICAgICAgIGZpbGVzICh2YWwgbG9nLXJvb3QtZW50cnkpXQorKGRlZm4gaWRlbnRpZnktd29ya2VyLWxvZy1kaXJzIFtsb2ctZGlyc10KKyAgInJldHVybiB0aGUgd29ya2VyaWQgdG8gd29ya2VyLWxvZy1kaXIgbWFwIgorICAoaW50byB7fSAoZm9yIFtsb2dkaXIgbG9nLWRpcnMKKyAgICAgICAgICAgICAgICAgOmxldCBbbWV0YUZpbGUgKGdldC1tZXRhZGF0YS1maWxlLWZvci13cm9rZXItbG9nZGlyIGxvZ2RpcildCiAgICAgICAgICAgICAgICAgIDp3aGVuIG1ldGFGaWxlXQotICAgICAgICAgICAgIHsoZ2V0LXdvcmtlci1pZC1mcm9tLW1ldGFkYXRhLWZpbGUgbWV0YUZpbGUpCi0gICAgICAgICAgICAgIHs6b3duZXIgKGdldC10b3BvLW93bmVyLWZyb20tbWV0YWRhdGEtZmlsZSBtZXRhRmlsZSkKLSAgICAgICAgICAgICAgIDpmaWxlcwotICAgICAgICAgICAgICAgICA7OyBJZiBlYWNoIGxvZyBmb3IgdGhpcyByb290IG5hbWUgaXMgdG8gYmUgZGVsZXRlZCwgdGhlbgotICAgICAgICAgICAgICAgICA7OyBpbmNsdWRlIHRoZSBtZXRhZGF0YSBmaWxlIGFsc28uCi0gICAgICAgICAgICAgICAgIChpZiAoZW1wdHk/IChkaWZmZXJlbmNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNldCAoZmlsdGVyICMocmUtZmluZCAocmUtcGF0dGVybiBsb2ctcm9vdCkgJSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlYWQtZGlyLWNvbnRlbnRzIHJvb3QtZGlyKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNldCAobWFwICMoLmdldE5hbWUgJSkgZmlsZXMpKSkpCi0gICAgICAgICAgICAgICAgICAoY29uaiBmaWxlcyBtZXRhRmlsZSkKLSAgICAgICAgICAgICAgICAgIDs7IE90aGVyd2lzZSwga2VlcCB0aGUgbGlzdCBvZiBmaWxlcyBhcyBpdCBpcy4KLSAgICAgICAgICAgICAgICAgIGZpbGVzKX19KSkpCisgICAgICAgICAgICAgeyhnZXQtd29ya2VyLWlkLWZyb20tbWV0YWRhdGEtZmlsZSBtZXRhRmlsZSkgbG9nZGlyfSkpKQogCi0oZGVmbiBnZXQtZGVhZC13b3JrZXItZmlsZXMtYW5kLW93bmVycyBbY29uZiBub3ctc2VjcyBsb2ctZmlsZXMgcm9vdC1kaXJdCi0gIChpZiAoZW1wdHk/IGxvZy1maWxlcykKLSAgICB7fQotICAgIChsZXQgW2lkLT5oZWFydGJlYXQgKHN1cGVydmlzb3IvcmVhZC13b3JrZXItaGVhcnRiZWF0cyBjb25mKQotICAgICAgICAgIGFsaXZlLWlkcyAoa2V5cyAocmVtb3ZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIyhvciAobm90ICh2YWwgJSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3VwZXJ2aXNvci9pcy13b3JrZXItaGItdGltZWQtb3V0PyBub3ctc2VjcyAodmFsICUpIGNvbmYpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLT5oZWFydGJlYXQpKQotICAgICAgICAgIGlkLT5lbnRyaWVzIChpZGVudGlmeS13b3JrZXItbG9nLWZpbGVzIGxvZy1maWxlcyByb290LWRpcildCi0gICAgICAoZm9yIFtbaWQgezprZXlzIFtvd25lciBmaWxlc119XSBpZC0+ZW50cmllcwotICAgICAgICAgICAgOndoZW4gKG5vdCAoY29udGFpbnM/IChzZXQgYWxpdmUtaWRzKSBpZCkpXQotICAgICAgICB7Om93bmVyIG93bmVyCi0gICAgICAgICA6ZmlsZXMgZmlsZXN9KSkpKQorKGRlZm4gZ2V0LWFsaXZlLWlkcworICBbY29uZiBub3ctc2Vjc10KKyAgKC0+PgorICAgIChzdXBlcnZpc29yL3JlYWQtd29ya2VyLWhlYXJ0YmVhdHMgY29uZikKKyAgICAocmVtb3ZlCisgICAgICAjKG9yIChub3QgKHZhbCAlKSkKKyAgICAgICAgICAgKHN1cGVydmlzb3IvaXMtd29ya2VyLWhiLXRpbWVkLW91dD8gbm93LXNlY3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZhbCAlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mKSkpCisgICAga2V5cworICAgIHNldCkpCiAKLShkZWZuIGNsZWFudXAtZm4hIFtsb2ctcm9vdC1kaXJdCisoZGVmbiBnZXQtZGVhZC13b3JrZXItZGlycworICAiUmV0dXJuIGEgc29ydGVkIHNldCBvZiBqYXZhLmlvLkZpbGVzIHRoYXQgd2VyZSB3cml0dGVuIGJ5IHdvcmtlcnMgdGhhdCBhcmUKKyAgbm93IGRlYWQiCisgIFtjb25mIG5vdy1zZWNzIGxvZy1kaXJzXQorICAoaWYgKGVtcHR5PyBsb2ctZGlycykKKyAgICAoc29ydGVkLXNldCkKKyAgICAobGV0IFthbGl2ZS1pZHMgKGdldC1hbGl2ZS1pZHMgY29uZiBub3ctc2VjcykKKyAgICAgICAgICBpZC0+ZGlyIChpZGVudGlmeS13b3JrZXItbG9nLWRpcnMgbG9nLWRpcnMpXQorICAgICAgKGFwcGx5IHNvcnRlZC1zZXQKKyAgICAgICAgICAgICAoZm9yIFtbaWQgZGlyXSBpZC0+ZGlyCisgICAgICAgICAgICAgICAgICAgOndoZW4gKG5vdCAoY29udGFpbnM/IGFsaXZlLWlkcyBpZCkpXQorICAgICAgICAgICAgICAgZGlyKSkpKSkKKworKGRlZm4gZ2V0LWFsbC13b3JrZXItZGlycyBbXkZpbGUgcm9vdC1kaXJdCisgIChyZWR1Y2UgY2xvanVyZS5zZXQvdW5pb24KKyAgICAgICAgICAoc29ydGVkLXNldCkKKyAgICAgICAgICAoZm9yIFteRmlsZSB0b3BvLWRpciAoLmxpc3RGaWxlcyByb290LWRpcildCisgICAgICAgICAgICAoaW50byBbXSAoLmxpc3RGaWxlcyB0b3BvLWRpcikpKSkpCisKKyhkZWZuIGdldC1hbGl2ZS13b3JrZXItZGlycworICAiUmV0dXJuIGEgc29ydGVkIHNldCBvZiBqYXZhLmlvLkZpbGVzIHRoYXQgd2VyZSB3cml0dGVuIGJ5IHdvcmtlcnMgdGhhdCBhcmUKKyAgbm93IGFjdGl2ZSIKKyAgW2NvbmYgcm9vdC1kaXJdCisgIChsZXQgW2FsaXZlLWlkcyAoZ2V0LWFsaXZlLWlkcyBjb25mIChjdXJyZW50LXRpbWUtc2VjcykpCisgICAgICAgIGxvZy1kaXJzIChnZXQtYWxsLXdvcmtlci1kaXJzIHJvb3QtZGlyKQorICAgICAgICBpZC0+ZGlyIChpZGVudGlmeS13b3JrZXItbG9nLWRpcnMgbG9nLWRpcnMpXQorICAgIChhcHBseSBzb3J0ZWQtc2V0CisgICAgICAgICAgIChmb3IgW1tpZCBkaXJdIGlkLT5kaXIKKyAgICAgICAgICAgICAgICAgOndoZW4gKGNvbnRhaW5zPyBhbGl2ZS1pZHMgaWQpXQorICAgICAgICAgICAgICguZ2V0Q2Fub25pY2FsUGF0aCBkaXIpKSkpKQorCisoZGVmbiBnZXQtYWxsLWxvZ3MtZm9yLXJvb3RkaXIgW15GaWxlIGxvZy1kaXJdCisgIChyZWR1Y2UgY29uY2F0CisgICAgICAgICAgKGZvciBbcG9ydC1kaXIgKGdldC1hbGwtd29ya2VyLWRpcnMgbG9nLWRpcildCisgICAgICAgICAgICAoaW50byBbXSAoLmxpc3RGaWxlcyBwb3J0LWRpcikpKSkpCisKKyhkZWZuIGlzLWFjdGl2ZS1sb2cgW15GaWxlIGZpbGVdCisgIChyZS1maW5kICMiXC4obG9nfGVycnxvdXR8Y3VycmVudHx5YW1sfHBpZCkkIiAoLmdldE5hbWUgZmlsZSkpKQorCisoZGVmbiBmaWx0ZXItY2FuZGlkYXRlLWZpbGVzCisgICJGaWx0ZXIgY2FuZGlkYXRlIGZpbGVzIGZvciBnbG9iYWwgY2xlYW51cCIKKyAgW2xvZ3MgbG9nLWRpcl0KKyAgKGxldCBbYWxpdmUtd29ya2VyLWRpcnMgKGdldC1hbGl2ZS13b3JrZXItZGlycyAqU1RPUk0tQ09ORiogbG9nLWRpcildCisgICAgKGZpbHRlciAjKGFuZCAobm90PSAoLmdldE5hbWUgJSkgIndvcmtlci55YW1sIikgIDsgZXhjbHVkZSBtZXRhZGF0YSBmaWxlCisgICAgICAgICAgICAgICAgICAobm90IChhbmQgKGNvbnRhaW5zPyBhbGl2ZS13b3JrZXItZGlycyAoLmdldENhbm9uaWNhbFBhdGggKC5nZXRQYXJlbnRGaWxlICUpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXMtYWN0aXZlLWxvZyAlKSkpKSA7IGV4Y2x1ZGUgYWN0aXZlIHdvcmtlcnMnIGFjdGl2ZSBsb2dzCisgICAgICAgICAgICBsb2dzKSkpCisKKyhkZWZuIHNvcnRlZC13b3JrZXItbG9ncworICAiQ29sbGVjdCB0aGUgd3Jva2VyIGxvZyBmaWxlcyByZWN1cnNpdmVseSwgc29ydGVkIGJ5IGRlY3JlYXNpbmcgYWdlLiIKKyAgW15GaWxlIHJvb3QtZGlyXQorICAobGV0IFtmaWxlcyAoZ2V0LWFsbC1sb2dzLWZvci1yb290ZGlyIHJvb3QtZGlyKQorICAgICAgICBsb2dzIChmaWx0ZXItY2FuZGlkYXRlLWZpbGVzIGZpbGVzIHJvb3QtZGlyKV0KKyAgICAoc29ydC1ieSAjKC5sYXN0TW9kaWZpZWQgJSkgbG9ncykpKQorCisoZGVmbiBzdW0tZmlsZS1zaXplCisgICJHaXZlbiBhIHNlcXVlbmNlIG9mIEZpbGVzLCBzdW0gdGhlaXIgc2l6ZXMuIgorICBbZmlsZXNdCisgIChyZWR1Y2UgIygrICUxICgubGVuZ3RoICUyKSkgMCBmaWxlcykpCisKKyhkZWZuIGRlbGV0ZS1vbGRlc3Qtd2hpbGUtbG9ncy10b28tbGFyZ2UgW2xvZ3NfIHNpemVdCisgIChsb29wIFtsb2dzIGxvZ3NfXQorICAgIChpZiAoPiAoc3VtLWZpbGUtc2l6ZSBsb2dzKSBzaXplKQorICAgICAgKGRvCisgICAgICAgIChsb2ctbWVzc2FnZSAiTG9nIHNpemVzIHRvbyBoaWdoLiBHb2luZyB0byBkZWxldGU6ICIgKC5nZXROYW1lIChmaXJzdCBsb2dzKSkpCisgICAgICAgICh0cnkgKHJtciAoLmdldENhbm9uaWNhbFBhdGggKGZpcnN0IGxvZ3MpKSkKKyAgICAgICAgICAgICAoY2F0Y2ggRXhjZXB0aW9uIGV4IChsb2ctZXJyb3IgZXgpKSkKKyAgICAgICAgKHJlY3VyIChyZXN0IGxvZ3MpKSkKKyAgICAgIGxvZ3MpKSkKKworKGRlZm4gcGVyLXdvcmtlcmRpci1jbGVhbnVwCisgICJEZWxldGUgdGhlIG9sZGVzdCBmaWxlcyBpbiBlYWNoIG92ZXJsb2FkZWQgd29ya2VyIGxvZyBkaXIiCisgIFteRmlsZSByb290LWRpciBzaXplXQorICAoZG9mb3IgW3dvcmtlci1kaXIgKGdldC1hbGwtd29ya2VyLWRpcnMgcm9vdC1kaXIpXQorICAgIChsZXQgW2ZpbHRlcmVkLWxvZ3MgKGZpbHRlciAjKG5vdCAoaXMtYWN0aXZlLWxvZyAlKSkgKC5saXN0RmlsZXMgd29ya2VyLWRpcikpCisgICAgICAgICAgc29ydGVkLWxvZ3MgKHNvcnQtYnkgIygubGFzdE1vZGlmaWVkICUpIGZpbHRlcmVkLWxvZ3MpXQorICAgICAgKGRlbGV0ZS1vbGRlc3Qtd2hpbGUtbG9ncy10b28tbGFyZ2Ugc29ydGVkLWxvZ3Mgc2l6ZSkpKSkKKworKGRlZm4gY2xlYW51cC1lbXB0eS10b3BvZGlyCisgICJEZWxldGUgdGhlIHRvcG8gZGlyIGlmIGl0IGNvbnRhaW5zIHplcm8gcG9ydCBkaXJzIgorICBbXkZpbGUgZGlyXQorICAobGV0IFt0b3BvZGlyICguZ2V0UGFyZW50RmlsZSBkaXIpXQorICAgIChpZiAoZW1wdHk/ICgubGlzdEZpbGVzIHRvcG9kaXIpKQorICAgICAgKHJtciAoLmdldENhbm9uaWNhbFBhdGggdG9wb2RpcikpKSkpCisKKyhkZWZuIGNsZWFudXAtZm4hCisgICJEZWxldGUgb2xkIGxvZyBkaXJzIGZvciB3aGljaCB0aGUgd29ya2VycyBhcmUgbm8gbG9uZ2VyIGFsaXZlIgorICBbbG9nLXJvb3QtZGlyXQogICAobGV0IFtub3ctc2VjcyAoY3VycmVudC10aW1lLXNlY3MpCi0gICAgICAgIG9sZC1sb2ctZmlsZXMgKHNlbGVjdC1maWxlcy1mb3ItY2xlYW51cCAqU1RPUk0tQ09ORiogKCogbm93LXNlY3MgMTAwMCkgbG9nLXJvb3QtZGlyKQotICAgICAgICBkZWFkLXdvcmtlci1maWxlcyAoZ2V0LWRlYWQtd29ya2VyLWZpbGVzLWFuZC1vd25lcnMgKlNUT1JNLUNPTkYqIG5vdy1zZWNzIG9sZC1sb2ctZmlsZXMgbG9nLXJvb3QtZGlyKV0KKyAgICAgICAgb2xkLWxvZy1kaXJzIChzZWxlY3QtZGlycy1mb3ItY2xlYW51cCAqU1RPUk0tQ09ORioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKiBub3ctc2VjcyAxMDAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZy1yb290LWRpcikKKyAgICAgICAgdG90YWwtc2l6ZSAoKlNUT1JNLUNPTkYqIExPR1ZJRVdFUi1NQVgtU1VNLVdPUktFUi1MT0dTLVNJWkUtTUIpCisgICAgICAgIHBlci1kaXItc2l6ZSAoKlNUT1JNLUNPTkYqIExPR1ZJRVdFUi1NQVgtUEVSLVdPUktFUi1MT0dTLVNJWkUtTUIpCisgICAgICAgIHBlci1kaXItc2l6ZSAobWluIHBlci1kaXItc2l6ZSAoKiB0b3RhbC1zaXplIDAuNSkpCisgICAgICAgIGRlYWQtd29ya2VyLWRpcnMgKGdldC1kZWFkLXdvcmtlci1kaXJzICpTVE9STS1DT05GKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3ctc2VjcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGQtbG9nLWRpcnMpXQogICAgIChsb2ctZGVidWcgImxvZyBjbGVhbnVwOiBub3c9IiBub3ctc2VjcwotICAgICAgICAgICAgICAgIiBvbGQgbG9nIGZpbGVzICIgKHByLXN0ciAobWFwICMoLmdldE5hbWUgJSkgb2xkLWxvZy1maWxlcykpCi0gICAgICAgICAgICAgICAiIGRlYWQgd29ya2VyIGZpbGVzICIgKC0+PiBkZWFkLXdvcmtlci1maWxlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hcGNhdCAoZm4gW3tsIDpmaWxlc31dIGwpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hcCAjKC5nZXROYW1lICUpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByLXN0cikpKQotICAgIChkb2ZvciBbezprZXlzIFtvd25lciBmaWxlc119IGRlYWQtd29ya2VyLWZpbGVzCi0gICAgICAgICAgICBmaWxlIGZpbGVzXQotICAgICAgKGxldCBbcGF0aCAoLmdldENhbm9uaWNhbFBhdGggZmlsZSldCi0gICAgICAgIChsb2ctbWVzc2FnZSAiQ2xlYW5pbmcgdXA6IFJlbW92aW5nICIgcGF0aCkKLSAgICAgICAgKHRyeQotICAgICAgICAgIChpZiAob3IgKGJsYW5rPyBvd25lcikgKHJlLW1hdGNoZXMgIyIuKlwueWFtbCQiIHBhdGgpKQotICAgICAgICAgICAgKHJtciBwYXRoKQotICAgICAgICAgICAgOzsgd29ya2VyLWxhdW5jaGVyIGRvZXMgbm90IGFjdHVhbGx5IGxhdW5jaCBhIHdvcmtlciBwcm9jZXNzLiAgSXQKLSAgICAgICAgICAgIDs7IG1lcmVseSBleGVjdXRlcyBvbmUgb2YgYSBwcmVzY3JpYmVkIHNldCBvZiBjb21tYW5kcy4gIEluIHRoaXMgY2FzZSwgd2UgYXNrIGl0Ci0gICAgICAgICAgICA7OyB0byBkZWxldGUgYSBmaWxlIGFzIHRoZSBvd25lciBvZiB0aGF0IGZpbGUuCi0gICAgICAgICAgICAoc3VwZXJ2aXNvci93b3JrZXItbGF1bmNoZXIgKlNUT1JNLUNPTkYqIG93bmVyIChzdHIgInJtciAiIHBhdGgpKSkKLSAgICAgICAgICAoY2F0Y2ggRXhjZXB0aW9uIGV4Ci0gICAgICAgICAgICAobG9nLWVycm9yIGV4KSkpKSkpKQorICAgICAgICAgICAgICAgIiBvbGQgbG9nIGRpcnMgIiAocHItc3RyIChtYXAgIyguZ2V0TmFtZSAlKSBvbGQtbG9nLWRpcnMpKQorICAgICAgICAgICAgICAgIiBkZWFkIHdvcmtlciBkaXJzICIgKHByLXN0cgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hcCAjKC5nZXROYW1lICUpIGRlYWQtd29ya2VyLWRpcnMpKSkKKyAgICAoZG9mb3IgW2RpciBkZWFkLXdvcmtlci1kaXJzXQorICAgICAgICAgICAobGV0IFtwYXRoICguZ2V0Q2Fub25pY2FsUGF0aCBkaXIpXQorICAgICAgICAgICAgIChsb2ctbWVzc2FnZSAiQ2xlYW5pbmcgdXA6IFJlbW92aW5nICIgcGF0aCkKKyAgICAgICAgICAgICAodHJ5IChybXIgcGF0aCkKKyAgICAgICAgICAgICAgICAgIChjbGVhbnVwLWVtcHR5LXRvcG9kaXIgZGlyKQorICAgICAgICAgICAgICAgICAgKGNhdGNoIEV4Y2VwdGlvbiBleCAobG9nLWVycm9yIGV4KSkpKSkKKyAgICAocGVyLXdvcmtlcmRpci1jbGVhbnVwIChGaWxlLiBsb2ctcm9vdC1kaXIpICgqIHBlci1kaXItc2l6ZSAoKiAxMDI0IDEwMjQpKSkKKyAgICAobGV0IFthbGwtbG9ncyAoc29ydGVkLXdvcmtlci1sb2dzIChGaWxlLiBsb2ctcm9vdC1kaXIpKQorICAgICAgICAgIHNpemUgKCogdG90YWwtc2l6ZSAoKiAgMTAyNCAxMDI0KSldCisgICAgICAoZGVsZXRlLW9sZGVzdC13aGlsZS1sb2dzLXRvby1sYXJnZSBhbGwtbG9ncyBzaXplKSkpKQogCiAoZGVmbiBzdGFydC1sb2ctY2xlYW5lciEgW2NvbmYgbG9nLXJvb3QtZGlyXQogICAobGV0IFtpbnRlcnZhbC1zZWNzIChjb25mIExPR1ZJRVdFUi1DTEVBTlVQLUlOVEVSVkFMLVNFQ1MpXQogICAgICh3aGVuIGludGVydmFsLXNlY3MKICAgICAgIChsb2ctZGVidWcgInN0YXJ0aW5nIGxvZyBjbGVhbnVwIHRocmVhZCBhdCBpbnRlcnZhbDogIiBpbnRlcnZhbC1zZWNzKQotICAgICAgKHNjaGVkdWxlLXJlY3VycmluZyAobWstdGltZXIgOnRocmVhZC1uYW1lICJsb2d2aWV3ZXItY2xlYW51cCIpCisgICAgICAoc2NoZWR1bGUtcmVjdXJyaW5nIChtay10aW1lciA6dGhyZWFkLW5hbWUgImxvZ3ZpZXdlci1jbGVhbnVwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmtpbGwtZm4gKGZuIFt0XQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9nLWVycm9yIHQgIkVycm9yIHdoZW4gZG9pbmcgbG9ncyBjbGVhbnVwIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGV4aXQtcHJvY2VzcyEgMjAgIkVycm9yIHdoZW4gZG9pbmcgbG9nIGNsZWFudXAiKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgOzsgU3RhcnQgaW1tZWRpYXRlbHkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVydmFsLXNlY3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZuIFtdIChjbGVhbnVwLWZuISBsb2ctcm9vdC1kaXIpKSkpKSkKIAorKGRlZm4tIHNraXAtYnl0ZXMKKyAgIkZpbGVJbnB1dFN0cmVhbSNza2lwIG1heSBub3Qgd29yayB0aGUgZmlyc3QgdGltZSwgc28gZW5zdXJlIGl0IHN1Y2Nlc3NmdWxseQorICBza2lwcyB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzLiIKKyAgW15JbnB1dFN0cmVhbSBzdHJlYW0gbl0KKyAgKGxvb3AgW3NraXBwZWQgMF0KKyAgICAobGV0IFtza2lwcGVkICgrIHNraXBwZWQgKC5za2lwIHN0cmVhbSAoLSBuIHNraXBwZWQpKSldCisgICAgICAoaWYgKDwgc2tpcHBlZCBuKSAocmVjdXIgc2tpcHBlZCkpKSkpCisKKyhkZWZuIGxvZ2ZpbGUtbWF0Y2hlcy1maWx0ZXI/CisgIFtsb2ctZmlsZS1uYW1lXQorICAobGV0IFtyZWdleC1zdHJpbmcgKHN0ciAid29ya2VyLmxvZy4qIikKKyAgICAgICAgcmVnZXgtcGF0dGVybiAocmUtcGF0dGVybiByZWdleC1zdHJpbmcpXQorICAgIChub3Q9IChyZS1zZXEgcmVnZXgtcGF0dGVybiAoLnRvU3RyaW5nIGxvZy1maWxlLW5hbWUpKSBuaWwpKSkKKwogKGRlZm4gcGFnZS1maWxlCiAgIChbcGF0aCB0YWlsXQotICAgIChsZXQgW2ZsZW4gKC5sZW5ndGggKGNsb2p1cmUuamF2YS5pby9maWxlIHBhdGgpKQorICAgIChsZXQgW3ppcC1maWxlPyAoLmVuZHNXaXRoIHBhdGggIi5neiIpCisgICAgICAgICAgZmxlbiAoaWYgemlwLWZpbGU/IChVdGlscy96aXBGaWxlU2l6ZSAoY2xvanVyZS5qYXZhLmlvL2ZpbGUgcGF0aCkpICgubGVuZ3RoIChjbG9qdXJlLmphdmEuaW8vZmlsZSBwYXRoKSkpCiAgICAgICAgICAgc2tpcCAoLSBmbGVuIHRhaWwpXQogICAgICAgKHBhZ2UtZmlsZSBwYXRoIHNraXAgdGFpbCkpKQogICAoW3BhdGggc3RhcnQgbGVuZ3RoXQotICAgICh3aXRoLW9wZW4gW2lucHV0IChGaWxlSW5wdXRTdHJlYW0uIHBhdGgpCi0gICAgICAgICAgICAgICAgb3V0cHV0IChqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbS4pXQotICAgICAgKGlmICg+PSBzdGFydCAoLmxlbmd0aCAoY2xvanVyZS5qYXZhLmlvL2ZpbGUgcGF0aCkpKQotICAgICAgICAodGhyb3cKLSAgICAgICAgICAoSW52YWxpZFJlcXVlc3RFeGNlcHRpb24uICJDYW5ub3Qgc3RhcnQgcGFzdCB0aGUgZW5kIG9mIHRoZSBmaWxlIikpKQotICAgICAgKGlmICg+IHN0YXJ0IDApCi0gICAgICAgIDs7IEZpbGVJbnB1dFN0cmVhbSNza2lwIG1heSBub3Qgd29yayB0aGUgZmlyc3QgdGltZS4KLSAgICAgICAgKGxvb3AgW3NraXBwZWQgMF0KLSAgICAgICAgICAobGV0IFtza2lwcGVkICgrIHNraXBwZWQgKC5za2lwIGlucHV0ICgtIHN0YXJ0IHNraXBwZWQpKSldCi0gICAgICAgICAgICAoaWYgKDwgc2tpcHBlZCBzdGFydCkgKHJlY3VyIHNraXBwZWQpKSkpKQotICAgICAgKGxldCBbYnVmZmVyIChtYWtlLWFycmF5IEJ5dGUvVFlQRSAxMDI0KV0KLSAgICAgICAgKGxvb3AgW10KLSAgICAgICAgICAod2hlbiAoPCAoLnNpemUgb3V0cHV0KSBsZW5ndGgpCi0gICAgICAgICAgICAobGV0IFtzaXplICgucmVhZCBpbnB1dCBidWZmZXIgMCAobWluIDEwMjQgKC0gbGVuZ3RoICguc2l6ZSBvdXRwdXQpKSkpXQotICAgICAgICAgICAgICAod2hlbiAocG9zPyBzaXplKQotICAgICAgICAgICAgICAgICgud3JpdGUgb3V0cHV0IGJ1ZmZlciAwIHNpemUpCi0gICAgICAgICAgICAgICAgKHJlY3VyKSkpKSkKLSAgICAgICgudG9TdHJpbmcgb3V0cHV0KSkpKSkKKyAgICAobGV0IFt6aXAtZmlsZT8gKC5lbmRzV2l0aCBwYXRoICIuZ3oiKQorICAgICAgICAgIGZsZW4gKGlmIHppcC1maWxlPyAoVXRpbHMvemlwRmlsZVNpemUgKGNsb2p1cmUuamF2YS5pby9maWxlIHBhdGgpKSAoLmxlbmd0aCAoY2xvanVyZS5qYXZhLmlvL2ZpbGUgcGF0aCkpKV0KKyAgICAgICh3aXRoLW9wZW4gW2lucHV0IChpZiB6aXAtZmlsZT8gKEdaSVBJbnB1dFN0cmVhbS4gKEZpbGVJbnB1dFN0cmVhbS4gcGF0aCkpIChGaWxlSW5wdXRTdHJlYW0uIHBhdGgpKQorICAgICAgICAgICAgICAgICAgb3V0cHV0IChqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbS4pXQorICAgICAgICAoaWYgKD49IHN0YXJ0IGZsZW4pCisgICAgICAgICAgKHRocm93CisgICAgICAgICAgICAoSW52YWxpZFJlcXVlc3RFeGNlcHRpb24uICJDYW5ub3Qgc3RhcnQgcGFzdCB0aGUgZW5kIG9mIHRoZSBmaWxlIikpKQorICAgICAgICAoaWYgKD4gc3RhcnQgMCkgKHNraXAtYnl0ZXMgaW5wdXQgc3RhcnQpKQorICAgICAgICAobGV0IFtidWZmZXIgKG1ha2UtYXJyYXkgQnl0ZS9UWVBFIDEwMjQpXQorICAgICAgICAgIChsb29wIFtdCisgICAgICAgICAgICAod2hlbiAoPCAoLnNpemUgb3V0cHV0KSBsZW5ndGgpCisgICAgICAgICAgICAgIChsZXQgW3NpemUgKC5yZWFkIGlucHV0IGJ1ZmZlciAwIChtaW4gMTAyNCAoLSBsZW5ndGggKC5zaXplIG91dHB1dCkpKSldCisgICAgICAgICAgICAgICAgKHdoZW4gKHBvcz8gc2l6ZSkKKyAgICAgICAgICAgICAgICAgICgud3JpdGUgb3V0cHV0IGJ1ZmZlciAwIHNpemUpCisgICAgICAgICAgICAgICAgICAocmVjdXIpKSkpKQorICAgICAgICAoLnRvU3RyaW5nIG91dHB1dCkpKSkpKQogCiAoZGVmbiBnZXQtbG9nLXVzZXItZ3JvdXAtd2hpdGVsaXN0IFtmbmFtZV0KICAgKGxldCBbd2wtZmlsZSAoZ2V0LWxvZy1tZXRhZGF0YS1maWxlIGZuYW1lKQpAQCAtMjEyLDE0ICszMjQsMTMgQEAKIAogKGRlZm4gbG9nLXJvb3QtZGlyCiAgICJHaXZlbiBhbiBhcHBlbmRlciBuYW1lLCBhcyBjb25maWd1cmVkLCBnZXQgdGhlIHBhcmVudCBkaXJlY3Rvcnkgb2YgdGhlIGFwcGVuZGVyJ3MgbG9nIGZpbGUuCi0KLU5vdGUgdGhhdCBpZiBhbnl0aGluZyBnb2VzIHdyb25nLCB0aGlzIHdpbGwgdGhyb3cgYW4gRXJyb3IgYW5kIGV4aXQuIgorICAgTm90ZSB0aGF0IGlmIGFueXRoaW5nIGdvZXMgd3JvbmcsIHRoaXMgd2lsbCB0aHJvdyBhbiBFcnJvciBhbmQgZXhpdC4iCiAgIFthcHBlbmRlci1uYW1lXQogICAobGV0IFthcHBlbmRlciAoLmdldEFwcGVuZGVyICguZ2V0Q29uZmlndXJhdGlvbiAoTG9nTWFuYWdlci9nZXRDb250ZXh0KSkgYXBwZW5kZXItbmFtZSldCiAgICAgKGlmIChhbmQgYXBwZW5kZXItbmFtZSBhcHBlbmRlciAoaW5zdGFuY2U/IFJvbGxpbmdGaWxlQXBwZW5kZXIgYXBwZW5kZXIpKQogICAgICAgKC5nZXRQYXJlbnQgKEZpbGUuICguZ2V0RmlsZU5hbWUgYXBwZW5kZXIpKSkKICAgICAgICh0aHJvdwotICAgICAgIChSdW50aW1lRXhjZXB0aW9uLiAiTG9nIHZpZXdlciBjb3VsZCBub3QgZmluZCBjb25maWd1cmVkIGFwcGVuZGVyLCBvciB0aGUgYXBwZW5kZXIgaXMgbm90IGEgRmlsZUFwcGVuZGVyLiBQbGVhc2UgY2hlY2sgdGhhdCB0aGUgYXBwZW5kZXIgbmFtZSBjb25maWd1cmVkIGluIHN0b3JtIGFuZCBsb2c0ajIgYWdyZWUuIikpKSkpCisgICAgICAgKFJ1bnRpbWVFeGNlcHRpb24uICJMb2cgdmlld2VyIGNvdWxkIG5vdCBmaW5kIGNvbmZpZ3VyZWQgYXBwZW5kZXIsIG9yIHRoZSBhcHBlbmRlciBpcyBub3QgYSBGaWxlQXBwZW5kZXIuIFBsZWFzZSBjaGVjayB0aGF0IHRoZSBhcHBlbmRlciBuYW1lIGNvbmZpZ3VyZWQgaW4gc3Rvcm0gYW5kIGxvZzRqIGFncmVlLiIpKSkpKQogCiAoZGVmbmsgdG8tYnRuLWxpbmsKICAgIkNyZWF0ZSBhIGxpbmsgdGhhdCBpcyBmb3JtYXR0ZWQgbGlrZSBhIGJ1dHRvbiIKQEAgLTIyNyw2ICszMzgsMTggQEAKICAgWzphIHs6aHJlZiAoamF2YS5uZXQuVVJJLiB1cmwpCiAgICAgICAgOmNsYXNzIChzdHIgImJ0biBidG4tZGVmYXVsdCAiIChpZiBlbmFibGVkICJlbmFibGVkIiAiZGlzYWJsZWQiKSl9IHRleHRdKQogCisoZGVmbiBzZWFyY2gtZmlsZS1mb3JtIFtmbmFtZV0KKyAgW1s6Zm9ybSB7OmFjdGlvbiAibG9ndmlld2VyX3NlYXJjaC5odG1sIiA6aWQgInNlYXJjaC1ib3gifQorICAgICJTZWFyY2ggdGhpcyBmaWxlOiIKKyAgICBbOmlucHV0IHs6dHlwZSAidGV4dCIgOm5hbWUgInNlYXJjaCJ9XQorICAgIFs6aW5wdXQgezp0eXBlICJoaWRkZW4iIDpuYW1lICJmaWxlIiA6dmFsdWUgZm5hbWV9XQorICAgIFs6aW5wdXQgezp0eXBlICJzdWJtaXQiIDp2YWx1ZSAiU2VhcmNoIn1dXV0pCisKKyhkZWZuIGxvZy1maWxlLXNlbGVjdGlvbi1mb3JtIFtsb2ctZmlsZXMgdHlwZV0KKyAgW1s6Zm9ybSB7OmFjdGlvbiB0eXBlIDppZCAibGlzdC1vZi1maWxlcyJ9CisgICAgKGRyb3AtZG93biAiZmlsZSIgbG9nLWZpbGVzICkKKyAgICBbOmlucHV0IHs6dHlwZSAic3VibWl0IiA6dmFsdWUgIlN3aXRjaCBmaWxlIn1dXV0pCisKIChkZWZuIHBhZ2VyLWxpbmtzIFtmbmFtZSBzdGFydCBsZW5ndGggZmlsZS1zaXplXQogICAobGV0IFtwcmV2LXN0YXJ0IChtYXggMCAoLSBzdGFydCBsZW5ndGgpKQogICAgICAgICBuZXh0LXN0YXJ0IChpZiAoPiBmaWxlLXNpemUgMCkKQEAgLTI1NSwyNSArMzc4LDQzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAiTmV4dCIgOmVuYWJsZWQgKD4gbmV4dC1zdGFydCBzdGFydCkpXSldXSkpCiAKIChkZWZuLSBkb3dubG9hZC1saW5rIFtmbmFtZV0KLSAgW1s6cCAobGluay10byAodXJsLWZvcm1hdCAiL2Rvd25sb2FkLyVzIiBmbmFtZSkgIkRvd25sb2FkIEZ1bGwgTG9nIildXSkKKyAgW1s6cCAobGluay10byAodXJsLWZvcm1hdCAiL2Rvd25sb2FkLyVzIiBmbmFtZSkgIkRvd25sb2FkIEZ1bGwgRmlsZSIpXV0pCisKKyhkZWZuLSBkYWVtb24tZG93bmxvYWQtbGluayBbZm5hbWVdCisgIFtbOnAgKGxpbmstdG8gKHVybC1mb3JtYXQgIi9kYWVtb25kb3dubG9hZC8lcyIgZm5hbWUpICJEb3dubG9hZCBGdWxsIEZpbGUiKV1dKQorCisoZGVmbi0gaXMtdHh0LWZpbGUgW2ZuYW1lXQorICAocmUtZmluZCAjIlwuKGxvZy4qfHR4dHx5YW1sfHBpZCkkIiBmbmFtZSkpCisKKyhkZWYgZGVmYXVsdC1ieXRlcy1wZXItcGFnZSA1MTIwMCkKIAogKGRlZm4gbG9nLXBhZ2UgW2ZuYW1lIHN0YXJ0IGxlbmd0aCBncmVwIHVzZXIgcm9vdC1kaXJdCiAgIChpZiAob3IgKGJsYW5rPyAoKlNUT1JNLUNPTkYqIFVJLUZJTFRFUikpCiAgICAgICAgICAgKGF1dGhvcml6ZWQtbG9nLXVzZXI/IHVzZXIgZm5hbWUgKlNUT1JNLUNPTkYqKSkKICAgICAobGV0IFtmaWxlICguZ2V0Q2Fub25pY2FsRmlsZSAoRmlsZS4gcm9vdC1kaXIgZm5hbWUpKQotICAgICAgICAgIGZpbGUtbGVuZ3RoICgubGVuZ3RoIGZpbGUpCi0gICAgICAgICAgcGF0aCAoLmdldENhbm9uaWNhbFBhdGggZmlsZSldCi0gICAgICAoaWYgKGFuZCAoPSAoLmdldENhbm9uaWNhbEZpbGUgKEZpbGUuIHJvb3QtZGlyKSkKLSAgICAgICAgICAgICAgICAgICguZ2V0UGFyZW50RmlsZSBmaWxlKSkKLSAgICAgICAgICAgICAgICguZXhpc3RzIGZpbGUpKQotICAgICAgICAobGV0IFtkZWZhdWx0LWxlbmd0aCA1MTIwMAotICAgICAgICAgICAgICBsZW5ndGggKGlmIGxlbmd0aAorICAgICAgICAgIHBhdGggKC5nZXRDYW5vbmljYWxQYXRoIGZpbGUpCisgICAgICAgICAgemlwLWZpbGU/ICguZW5kc1dpdGggcGF0aCAiLmd6IikKKyAgICAgICAgICB0b3BvLWRpciAoLmdldFBhcmVudEZpbGUgKC5nZXRQYXJlbnRGaWxlIGZpbGUpKV0KKyAgICAgIChpZiAoYW5kICguZXhpc3RzIGZpbGUpCisgICAgICAgICAgICAgICAoPSAoLmdldENhbm9uaWNhbEZpbGUgKEZpbGUuIHJvb3QtZGlyKSkKKyAgICAgICAgICAgICAgICAgICguZ2V0UGFyZW50RmlsZSB0b3BvLWRpcikpKQorICAgICAgICAobGV0IFtmaWxlLWxlbmd0aCAoaWYgemlwLWZpbGU/IChVdGlscy96aXBGaWxlU2l6ZSAoY2xvanVyZS5qYXZhLmlvL2ZpbGUgcGF0aCkpICgubGVuZ3RoIChjbG9qdXJlLmphdmEuaW8vZmlsZSBwYXRoKSkpCisgICAgICAgICAgICAgIGxvZy1maWxlcyAocmVkdWNlIGNsb2p1cmUuc2V0L3VuaW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgIChzb3J0ZWQtc2V0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9yIFteRmlsZSBwb3J0LWRpciAoLmxpc3RGaWxlcyB0b3BvLWRpcildCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludG8gW10gKGZpbHRlciAjKC5pc0ZpbGUgJSkgKC5saXN0RmlsZXMgcG9ydC1kaXIpKSkpKSA7YWxsIHR5cGVzIG9mIGZpbGVzIGluY2x1ZGVkCisgICAgICAgICAgICAgIGZpbGVzLXN0ciAoZm9yIFtmaWxlIGxvZy1maWxlc10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGdldC10b3BvLXBvcnQtd29ya2VybG9nIGZpbGUpKQorICAgICAgICAgICAgICByZW9yZGVyZWQtZmlsZXMtc3RyIChjb25qIChmaWx0ZXIgIyhub3Q9IGZuYW1lICUpIGZpbGVzLXN0cikgZm5hbWUpCisgICAgICAgICAgICAgICBsZW5ndGggKGlmIGxlbmd0aAogICAgICAgICAgICAgICAgICAgICAgICAobWluIDEwNDg1NzYwIGxlbmd0aCkKLSAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQtbGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0LWJ5dGVzLXBlci1wYWdlKQogICAgICAgICAgICAgICBsb2ctc3RyaW5nIChlc2NhcGUtaHRtbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlmIHN0YXJ0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYWdlLWZpbGUgcGF0aCBzdGFydCBsZW5ndGgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYWdlLWZpbGUgcGF0aCBsZW5ndGgpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChpZiAoaXMtdHh0LWZpbGUgZm5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpZiBzdGFydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYWdlLWZpbGUgcGF0aCBzdGFydCBsZW5ndGgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhZ2UtZmlsZSBwYXRoIGxlbmd0aCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGlzIGlzIGEgYmluYXJ5IGZpbGUgYW5kIGNhbm5vdCBkaXNwbGF5ISBZb3UgbWF5IGRvd25sb2FkIHRoZSBmdWxsIGZpbGUuIikpCiAgICAgICAgICAgICAgIHN0YXJ0IChvciBzdGFydCAoLSBmaWxlLWxlbmd0aCBsZW5ndGgpKV0KICAgICAgICAgICAoaWYgZ3JlcAogICAgICAgICAgICAgKGh0bWwgWzpwcmUjbG9nQ29udGVudApAQCAtMjgyLDggKzQyMywxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAoZmlsdGVyICMoLmNvbnRhaW5zICUgZ3JlcCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJpbmcvam9pbiAiXG4iKSkKICAgICAgICAgICAgICAgICAgICAgIGxvZy1zdHJpbmcpXSkKLSAgICAgICAgICAgIChsZXQgW3BhZ2VyLWRhdGEgKHBhZ2VyLWxpbmtzIGZuYW1lIHN0YXJ0IGxlbmd0aCBmaWxlLWxlbmd0aCldCi0gICAgICAgICAgICAgIChodG1sIChjb25jYXQgcGFnZXItZGF0YQorICAgICAgICAgICAgKGxldCBbcGFnZXItZGF0YSAoaWYgKGlzLXR4dC1maWxlIGZuYW1lKSAocGFnZXItbGlua3MgZm5hbWUgc3RhcnQgbGVuZ3RoIGZpbGUtbGVuZ3RoKSBuaWwpXQorICAgICAgICAgICAgICAoaHRtbCAoY29uY2F0IChzZWFyY2gtZmlsZS1mb3JtIGZuYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb2ctZmlsZS1zZWxlY3Rpb24tZm9ybSByZW9yZGVyZWQtZmlsZXMtc3RyICJsb2ciKSA7IGxpc3QgYWxsIGZpbGVzIGZvciB0aGlzIHRvcG9sb2d5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZXItZGF0YQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkb3dubG9hZC1saW5rIGZuYW1lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtbOnByZSNsb2dDb250ZW50IGxvZy1zdHJpbmddXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VyLWRhdGEpKSkpKQpAQCAtMjk0LDkgKzQzNyw1NCBAQAogICAgICAgICAocmVzcC9zdGF0dXMgNDA0KSkKICAgICAgICh1bmF1dGhvcml6ZWQtdXNlci1odG1sIHVzZXIpKSkpCiAKKyhkZWZuIGRhZW1vbmxvZy1wYWdlIFtmbmFtZSBzdGFydCBsZW5ndGggZ3JlcCB1c2VyIHJvb3QtZGlyXQorICAoaWYgKG9yIChibGFuaz8gKCpTVE9STS1DT05GKiBVSS1GSUxURVIpKQorICAgICAgICAoYXV0aG9yaXplZC1sb2ctdXNlcj8gdXNlciBmbmFtZSAqU1RPUk0tQ09ORiopKQorICAgIChsZXQgW2ZpbGUgKC5nZXRDYW5vbmljYWxGaWxlIChGaWxlLiByb290LWRpciBmbmFtZSkpCisgICAgICAgICAgZmlsZS1sZW5ndGggKC5sZW5ndGggZmlsZSkKKyAgICAgICAgICBwYXRoICguZ2V0Q2Fub25pY2FsUGF0aCBmaWxlKQorICAgICAgICAgIHppcC1maWxlPyAoLmVuZHNXaXRoIHBhdGggIi5neiIpXQorICAgICAgKGlmIChhbmQgKD0gKC5nZXRDYW5vbmljYWxGaWxlIChGaWxlLiByb290LWRpcikpCisgICAgICAgICAgICAgICAgICguZ2V0UGFyZW50RmlsZSBmaWxlKSkKKyAgICAgICAgICAgICguZXhpc3RzIGZpbGUpKQorICAgICAgICAobGV0IFtmaWxlLWxlbmd0aCAoaWYgemlwLWZpbGU/IChVdGlscy96aXBGaWxlU2l6ZSAoY2xvanVyZS5qYXZhLmlvL2ZpbGUgcGF0aCkpICgubGVuZ3RoIChjbG9qdXJlLmphdmEuaW8vZmlsZSBwYXRoKSkpCisgICAgICAgICAgICAgIGxlbmd0aCAoaWYgbGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICAgIChtaW4gMTA0ODU3NjAgbGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0LWJ5dGVzLXBlci1wYWdlKQorICAgICAgICAgICAgICBsb2ctZmlsZXMgKGludG8gW10gKGZpbHRlciAjKC5pc0ZpbGUgJSkgKC5saXN0RmlsZXMgKEZpbGUuIHJvb3QtZGlyKSkpKSA7YWxsIHR5cGVzIG9mIGZpbGVzIGluY2x1ZGVkCisgICAgICAgICAgICAgIGZpbGVzLXN0ciAoZm9yIFtmaWxlIGxvZy1maWxlc10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgKC5nZXROYW1lIGZpbGUpKQorICAgICAgICAgICAgICByZW9yZGVyZWQtZmlsZXMtc3RyIChjb25qIChmaWx0ZXIgIyhub3Q9IGZuYW1lICUpIGZpbGVzLXN0cikgZm5hbWUpCisgICAgICAgICAgICAgIGxvZy1zdHJpbmcgKGVzY2FwZS1odG1sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoaWYgKGlzLXR4dC1maWxlIGZuYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaWYgc3RhcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGFnZS1maWxlIHBhdGggc3RhcnQgbGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYWdlLWZpbGUgcGF0aCBsZW5ndGgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVGhpcyBpcyBhIGJpbmFyeSBmaWxlIGFuZCBjYW5ub3QgZGlzcGxheSEgWW91IG1heSBkb3dubG9hZCB0aGUgZnVsbCBmaWxlLiIpKQorICAgICAgICAgICAgICBzdGFydCAob3Igc3RhcnQgKC0gZmlsZS1sZW5ndGggbGVuZ3RoKSldCisgICAgICAgICAgKGlmIGdyZXAKKyAgICAgICAgICAgIChodG1sIFs6cHJlI2xvZ0NvbnRlbnQKKyAgICAgICAgICAgICAgICAgICAoaWYgZ3JlcAorICAgICAgICAgICAgICAgICAgICAgKC0+PiAoLnNwbGl0IGxvZy1zdHJpbmcgIlxuIikKKyAgICAgICAgICAgICAgICAgICAgICAgKGZpbHRlciAjKC5jb250YWlucyAlIGdyZXApKQorICAgICAgICAgICAgICAgICAgICAgICAoc3RyaW5nL2pvaW4gIlxuIikpCisgICAgICAgICAgICAgICAgICAgICBsb2ctc3RyaW5nKV0pCisgICAgICAgICAgICAobGV0IFtwYWdlci1kYXRhIChpZiAoaXMtdHh0LWZpbGUgZm5hbWUpIChwYWdlci1saW5rcyBmbmFtZSBzdGFydCBsZW5ndGggZmlsZS1sZW5ndGgpIG5pbCldCisgICAgICAgICAgICAgIChodG1sIChjb25jYXQgKGxvZy1maWxlLXNlbGVjdGlvbi1mb3JtIHJlb3JkZXJlZC1maWxlcy1zdHIgImRhZW1vbmxvZyIpIDsgbGlzdCBhbGwgZGFlbW9uIGxvZ3MKKyAgICAgICAgICAgICAgICAgICAgICBwYWdlci1kYXRhCisgICAgICAgICAgICAgICAgICAgICAgKGRhZW1vbi1kb3dubG9hZC1saW5rIGZuYW1lKQorICAgICAgICAgICAgICAgICAgICAgIFtbOnByZSNsb2dDb250ZW50IGxvZy1zdHJpbmddXQorICAgICAgICAgICAgICAgICAgICAgIHBhZ2VyLWRhdGEpKSkpKQorICAgICAgICAoLT4gKHJlc3AvcmVzcG9uc2UgIlBhZ2Ugbm90IGZvdW5kIikKKyAgICAgICAgICAocmVzcC9zdGF0dXMgNDA0KSkpKQorICAgIChpZiAobmlsPyAoZ2V0LWxvZy11c2VyLWdyb3VwLXdoaXRlbGlzdCBmbmFtZSkpCisgICAgICAoLT4gKHJlc3AvcmVzcG9uc2UgIlBhZ2Ugbm90IGZvdW5kIikKKyAgICAgICAgKHJlc3Avc3RhdHVzIDQwNCkpCisgICAgICAodW5hdXRob3JpemVkLXVzZXItaHRtbCB1c2VyKSkpKQorCiAoZGVmbiBkb3dubG9hZC1sb2ctZmlsZSBbZm5hbWUgcmVxIHJlc3AgdXNlciBeU3RyaW5nIHJvb3QtZGlyXQogICAobGV0IFtmaWxlICguZ2V0Q2Fub25pY2FsRmlsZSAoRmlsZS4gcm9vdC1kaXIgZm5hbWUpKV0KLSAgICAoaWYgKD0gKEZpbGUuIHJvb3QtZGlyKSAoLmdldFBhcmVudEZpbGUgZmlsZSkpCisgICAgKGlmICguZXhpc3RzIGZpbGUpCiAgICAgICAoaWYgKG9yIChibGFuaz8gKCpTVE9STS1DT05GKiBVSS1GSUxURVIpKQogICAgICAgICAgICAgICAoYXV0aG9yaXplZC1sb2ctdXNlcj8gdXNlciBmbmFtZSAqU1RPUk0tQ09ORiopKQogICAgICAgICAoLT4gKHJlc3AvcmVzcG9uc2UgZmlsZSkKQEAgLTMwNSw2ICs0OTMsNDA1IEBACiAgICAgICAoLT4gKHJlc3AvcmVzcG9uc2UgIlBhZ2Ugbm90IGZvdW5kIikKICAgICAgICAgICAocmVzcC9zdGF0dXMgNDA0KSkpKSkKIAorKGRlZiBncmVwLW1heC1zZWFyY2gtc2l6ZSAxMDI0KQorKGRlZiBncmVwLWJ1Zi1zaXplIDIwNDgpCisoZGVmIGdyZXAtY29udGV4dC1zaXplIDEyOCkKKworKGRlZm4gbG9ndmlld2VyLXBvcnQKKyAgW10KKyAgKGludCAoKlNUT1JNLUNPTkYqIExPR1ZJRVdFUi1QT1JUKSkpCisKKyhkZWZuIHVybC10by1tYXRjaC1jZW50ZXJlZC1pbi1sb2ctcGFnZQorICBbbmVlZGxlIGZuYW1lIG9mZnNldCBwb3J0XQorICAobGV0IFtob3N0IChsb2NhbC1ob3N0bmFtZSkKKyAgICAgICAgcG9ydCAobG9ndmlld2VyLXBvcnQpCisgICAgICAgIGZuYW1lIChjbG9qdXJlLnN0cmluZy9qb2luIGZpbGUtcGF0aC1zZXBhcmF0b3IgKHRha2UtbGFzdCAzIChzcGxpdCBmbmFtZSAocmUtcGF0dGVybiBmaWxlLXBhdGgtc2VwYXJhdG9yKSkpKV0KKyAgICAodXJsIChzdHIgImh0dHA6Ly8iIGhvc3QgIjoiIHBvcnQgIi9sb2ciKQorICAgICAgezpmaWxlIGZuYW1lCisgICAgICAgOnN0YXJ0IChtYXggMAorICAgICAgICAgICAgICAgICgtIG9mZnNldAorICAgICAgICAgICAgICAgICAgKGludCAoLyBkZWZhdWx0LWJ5dGVzLXBlci1wYWdlIDIpKQorICAgICAgICAgICAgICAgICAgKGludCAoLyAoYWxlbmd0aCBuZWVkbGUpIC0yKSkpKSA7OyBBZGRpdGlvbgorICAgICAgIDpsZW5ndGggZGVmYXVsdC1ieXRlcy1wZXItcGFnZX0pKSkKKworKGRlZm5rIG1rLW1hdGNoLWRhdGEKKyAgW15ieXRlcyBuZWVkbGUgXkJ5dGVCdWZmZXIgaGF5c3RhY2sgaGF5c3RhY2stb2Zmc2V0IGZpbGUtb2Zmc2V0IGZuYW1lCisgICA6YmVmb3JlLWJ5dGVzIG5pbCA6YWZ0ZXItYnl0ZXMgbmlsXQorICAobGV0IFt1cmwgKHVybC10by1tYXRjaC1jZW50ZXJlZC1pbi1sb2ctcGFnZSBuZWVkbGUKKyAgICAgICAgICAgICAgZm5hbWUKKyAgICAgICAgICAgICAgZmlsZS1vZmZzZXQKKyAgICAgICAgICAgICAgKCpTVE9STS1DT05GKiBMT0dWSUVXRVItUE9SVCkpCisgICAgICAgIGhheXN0YWNrLWJ5dGVzICguYXJyYXkgaGF5c3RhY2spCisgICAgICAgIGJlZm9yZS1zdHJpbmcgKGlmICg+PSBoYXlzdGFjay1vZmZzZXQgZ3JlcC1jb250ZXh0LXNpemUpCisgICAgICAgICAgICAgICAgICAgICAgICAoU3RyaW5nLiBoYXlzdGFjay1ieXRlcworICAgICAgICAgICAgICAgICAgICAgICAgICAoLSBoYXlzdGFjay1vZmZzZXQgZ3JlcC1jb250ZXh0LXNpemUpCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXAtY29udGV4dC1zaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICJVVEYtOCIpCisgICAgICAgICAgICAgICAgICAgICAgICAobGV0IFtudW0tZGVzaXJlZCAobWF4IDAgKC0gZ3JlcC1jb250ZXh0LXNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhheXN0YWNrLW9mZnNldCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUtc2l6ZSAoaWYgYmVmb3JlLWJ5dGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbGVuZ3RoIGJlZm9yZS1ieXRlcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bS1leHBlY3RlZCAobWluIGJlZm9yZS1zaXplIG51bS1kZXNpcmVkKV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGlmIChwb3M/IG51bS1leHBlY3RlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RyIChTdHJpbmcuIGJlZm9yZS1ieXRlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLSBiZWZvcmUtc2l6ZSBudW0tZXhwZWN0ZWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bS1leHBlY3RlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVVRGLTgiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN0cmluZy4gaGF5c3RhY2stYnl0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXlzdGFjay1vZmZzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVURi04IikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN0cmluZy4gaGF5c3RhY2stYnl0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhheXN0YWNrLW9mZnNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVURi04IikpKSkKKyAgICAgICAgYWZ0ZXItc3RyaW5nIChsZXQgW25lZWRsZS1zaXplIChhbGVuZ3RoIG5lZWRsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFmdGVyLW9mZnNldCAoKyBoYXlzdGFjay1vZmZzZXQgbmVlZGxlLXNpemUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXlzdGFjay1zaXplICgubGltaXQgaGF5c3RhY2spXQorICAgICAgICAgICAgICAgICAgICAgICAoaWYgKDwgKCsgYWZ0ZXItb2Zmc2V0IGdyZXAtY29udGV4dC1zaXplKSBoYXlzdGFjay1zaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgIChTdHJpbmcuIGhheXN0YWNrLWJ5dGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlci1vZmZzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXAtY29udGV4dC1zaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiVVRGLTgiKQorICAgICAgICAgICAgICAgICAgICAgICAgIChsZXQgW251bS1kZXNpcmVkICgtIGdyZXAtY29udGV4dC1zaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLSBoYXlzdGFjay1zaXplIGFmdGVyLW9mZnNldCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXItc2l6ZSAoaWYgYWZ0ZXItYnl0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFsZW5ndGggYWZ0ZXItYnl0ZXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtLWV4cGVjdGVkIChtaW4gYWZ0ZXItc2l6ZSBudW0tZGVzaXJlZCldCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoaWYgKHBvcz8gbnVtLWV4cGVjdGVkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RyIChTdHJpbmcuIGhheXN0YWNrLWJ5dGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlci1vZmZzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtIGhheXN0YWNrLXNpemUgYWZ0ZXItb2Zmc2V0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVURi04IikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3RyaW5nLiBhZnRlci1ieXRlcyAwIG51bS1leHBlY3RlZCAiVVRGLTgiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN0cmluZy4gaGF5c3RhY2stYnl0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZnRlci1vZmZzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLSBoYXlzdGFjay1zaXplIGFmdGVyLW9mZnNldCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVVRGLTgiKSkpKSldCisgICAgeyJieXRlT2Zmc2V0IiBmaWxlLW9mZnNldAorICAgICAiYmVmb3JlU3RyaW5nIiBiZWZvcmUtc3RyaW5nCisgICAgICJhZnRlclN0cmluZyIgYWZ0ZXItc3RyaW5nCisgICAgICJtYXRjaFN0cmluZyIgKFN0cmluZy4gbmVlZGxlICJVVEYtOCIpCisgICAgICJsb2d2aWV3ZXJVUkwiIHVybH0pKQorCisoZGVmbi0gdHJ5LXJlYWQtYWhlYWQhCisgICJUcmllcyBvbmNlIHRvIHJlYWQgYWhlYWQgaW4gdGhlIHN0cmVhbSB0byBmaWxsIHRoZSBjb250ZXh0IGFuZCByZXNldHMgdGhlCisgIHN0cmVhbSB0byBpdHMgcG9zaXRpb24gYmVmb3JlIHRoZSBjYWxsLiIKKyAgW15CdWZmZXJlZElucHV0U3RyZWFtIHN0cmVhbSBoYXlzdGFjayBvZmZzZXQgZmlsZS1sZW4gYnl0ZXMtcmVhZF0KKyAgKGxldCBbbnVtLWV4cGVjdGVkIChtaW4gKC0gZmlsZS1sZW4gYnl0ZXMtcmVhZCkKKyAgICAgICAgICAgICAgICAgICAgICAgZ3JlcC1jb250ZXh0LXNpemUpCisgICAgICAgIGFmdGVyLWJ5dGVzIChieXRlLWFycmF5IG51bS1leHBlY3RlZCldCisgICAgKC5tYXJrIHN0cmVhbSBudW0tZXhwZWN0ZWQpCisgICAgOzsgT25seSB0cnkgcmVhZGluZyBvbmNlLgorICAgICgucmVhZCBzdHJlYW0gYWZ0ZXItYnl0ZXMgMCBudW0tZXhwZWN0ZWQpCisgICAgKC5yZXNldCBzdHJlYW0pCisgICAgYWZ0ZXItYnl0ZXMpKQorCisoZGVmbiBvZmZzZXQtb2YtYnl0ZXMKKyAgIlNlYXJjaGVzIGEgZ2l2ZW4gYnl0ZSBhcnJheSBmb3IgYSBtYXRjaCBvZiBhIHN1Yi1hcnJheSBvZiBieXRlcy4gIFJldHVybnMKKyAgdGhlIG9mZnNldCB0byB0aGUgYnl0ZSB0aGF0IG1hdGNoZXMsIG9yIC0xIGlmIG5vIG1hdGNoIHdhcyBmb3VuZC4iCisgIFteYnl0ZXMgYnVmIF5ieXRlcyB2YWx1ZSBpbml0LW9mZnNldF0KKyAgezpwcmUgWyg+IChhbGVuZ3RoIHZhbHVlKSAwKQorICAgICAgICAgKG5vdCAobmVnPyBpbml0LW9mZnNldCkpXX0KKyAgKGxvb3AgW29mZnNldCBpbml0LW9mZnNldAorICAgICAgICAgY2FuZGlkYXRlLW9mZnNldCBpbml0LW9mZnNldAorICAgICAgICAgdmFsLW9mZnNldCAwXQorICAgIChpZi1ub3QgKHBvcz8gKC0gKGFsZW5ndGggdmFsdWUpIHZhbC1vZmZzZXQpKQorICAgICAgOzsgRm91bmQKKyAgICAgIGNhbmRpZGF0ZS1vZmZzZXQKKyAgICAgIChpZiAoPj0gb2Zmc2V0IChhbGVuZ3RoIGJ1ZikpCisgICAgICAgIDs7IFdlIHJhbiBvdXQgb2YgYnVmZmVyIGZvciB0aGUgc2VhcmNoLgorICAgICAgICAtMQorICAgICAgICAoaWYgKG5vdD0gKGFnZXQgdmFsdWUgdmFsLW9mZnNldCkgKGFnZXQgYnVmIG9mZnNldCkpCisgICAgICAgICAgOzsgVGhlIG1hdGNoIGF0IHRoaXMgY2FuZGlkYXRlIG9mZnNldCBmYWlsZWQsIHNvIHN0YXJ0IG92ZXIgd2l0aCB0aGUKKyAgICAgICAgICA7OyBuZXh0IGNhbmRpZGF0ZSBieXRlIGZyb20gdGhlIGJ1ZmZlci4KKyAgICAgICAgICAobGV0IFtuZXctb2Zmc2V0IChpbmMgY2FuZGlkYXRlLW9mZnNldCldCisgICAgICAgICAgICAocmVjdXIgbmV3LW9mZnNldCBuZXctb2Zmc2V0IDApKQorICAgICAgICAgIDs7IFNvIGZhciBpdCBtYXRjaGVzLiAgS2VlcCBnb2luZy4uLgorICAgICAgICAgIChyZWN1ciAoaW5jIG9mZnNldCkgY2FuZGlkYXRlLW9mZnNldCAoaW5jIHZhbC1vZmZzZXQpKSkpKSkpCisKKyhkZWZuLSBidWZmZXItc3Vic3RyaW5nLXNlYXJjaCEKKyAgIkFzIHRoZSBmaWxlIGlzIHJlYWQgaW50byBhIGJ1ZmZlciwgMS8yIHRoZSBidWZmZXIncyBzaXplIGF0IGEgdGltZSwgd2UKKyAgc2VhcmNoIHRoZSBidWZmZXIgZm9yIG1hdGNoZXMgb2YgdGhlIHN1YnN0cmluZyBhbmQgcmV0dXJuIGEgbGlzdCBvZiB6ZXJvIG9yCisgIG1vcmUgbWF0Y2hlcy4iCisgIFtmaWxlIGZpbGUtbGVuIG9mZnNldC10by1idWYgaW5pdC1idWYtb2Zmc2V0IHN0cmVhbSBieXRlcy1za2lwcGVkCisgICBieXRlcy1yZWFkIF5CeXRlQnVmZmVyIGhheXN0YWNrIF5ieXRlcyBuZWVkbGUgaW5pdGlhbC1tYXRjaGVzIG51bS1tYXRjaGVzCisgICBeYnl0ZXMgYmVmb3JlLWJ5dGVzXQorICAobG9vcCBbYnVmLW9mZnNldCBpbml0LWJ1Zi1vZmZzZXQKKyAgICAgICAgIG1hdGNoZXMgaW5pdGlhbC1tYXRjaGVzXQorICAgIChsZXQgW29mZnNldCAob2Zmc2V0LW9mLWJ5dGVzICguYXJyYXkgaGF5c3RhY2spIG5lZWRsZSBidWYtb2Zmc2V0KV0KKyAgICAgIChpZiAoYW5kICg8IChjb3VudCBtYXRjaGVzKSBudW0tbWF0Y2hlcykgKG5vdCAobmVnPyBvZmZzZXQpKSkKKyAgICAgICAgKGxldCBbZmlsZS1vZmZzZXQgKCsgb2Zmc2V0LXRvLWJ1ZiBvZmZzZXQpCisgICAgICAgICAgICAgIGJ5dGVzLW5lZWRlZC1hZnRlci1tYXRjaCAoLSAoLmxpbWl0IGhheXN0YWNrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVwLWNvbnRleHQtc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWxlbmd0aCBuZWVkbGUpKQorICAgICAgICAgICAgICBiZWZvcmUtYXJnIChpZiAoPCBvZmZzZXQgZ3JlcC1jb250ZXh0LXNpemUpIGJlZm9yZS1ieXRlcykKKyAgICAgICAgICAgICAgYWZ0ZXItYXJnIChpZiAoPiBvZmZzZXQgYnl0ZXMtbmVlZGVkLWFmdGVyLW1hdGNoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAodHJ5LXJlYWQtYWhlYWQhIHN0cmVhbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhheXN0YWNrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZS1sZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlcy1yZWFkKSldCisgICAgICAgICAgKHJlY3VyICgrIG9mZnNldCAoYWxlbmd0aCBuZWVkbGUpKQorICAgICAgICAgICAgKGNvbmogbWF0Y2hlcworICAgICAgICAgICAgICAobWstbWF0Y2gtZGF0YSBuZWVkbGUKKyAgICAgICAgICAgICAgICBoYXlzdGFjaworICAgICAgICAgICAgICAgIG9mZnNldAorICAgICAgICAgICAgICAgIGZpbGUtb2Zmc2V0CisgICAgICAgICAgICAgICAgKC5nZXRDYW5vbmljYWxQYXRoIGZpbGUpCisgICAgICAgICAgICAgICAgOmJlZm9yZS1ieXRlcyBiZWZvcmUtYXJnCisgICAgICAgICAgICAgICAgOmFmdGVyLWJ5dGVzIGFmdGVyLWFyZykpKSkKKyAgICAgICAgKGxldCBbYmVmb3JlLXN0ci10by1vZmZzZXQgKG1pbiAoLmxpbWl0IGhheXN0YWNrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXAtbWF4LXNlYXJjaC1zaXplKQorICAgICAgICAgICAgICBiZWZvcmUtc3RyLWZyb20tb2Zmc2V0IChtYXggMCAoLSBiZWZvcmUtc3RyLXRvLW9mZnNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZXAtY29udGV4dC1zaXplKSkKKyAgICAgICAgICAgICAgbmV3LWJlZm9yZS1ieXRlcyAoQXJyYXlzL2NvcHlPZlJhbmdlICguYXJyYXkgaGF5c3RhY2spCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUtc3RyLWZyb20tb2Zmc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUtc3RyLXRvLW9mZnNldCkKKyAgICAgICAgICAgICAgOzsgSXQncyBPSyBpZiBuZXctYnl0ZS1vZmZzZXQgaXMgbmVnYXRpdmUuICBUaGlzIGlzIG5vcm1hbCBpZgorICAgICAgICAgICAgICA7OyB3ZSBhcmUgb3V0IG9mIGJ5dGVzIHRvIHJlYWQgZnJvbSBhIHNtYWxsIGZpbGUuCisgICAgICAgICAgICAgIG5ldy1ieXRlLW9mZnNldCAoaWYgKD49IChjb3VudCBtYXRjaGVzKSBudW0tbWF0Y2hlcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCsgKGdldCAobGFzdCBtYXRjaGVzKSAiYnl0ZU9mZnNldCIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFsZW5ndGggbmVlZGxlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCsgYnl0ZXMtc2tpcHBlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzLXJlYWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLSBncmVwLW1heC1zZWFyY2gtc2l6ZSkpKV0KKyAgICAgICAgICBbbWF0Y2hlcyBuZXctYnl0ZS1vZmZzZXQgbmV3LWJlZm9yZS1ieXRlc10pKSkpKQorCisoZGVmbi0gbWstZ3JlcC1yZXNwb25zZQorICAiVGhpcyByZXNwb25zZSBkYXRhIG9ubHkgaW5jbHVkZXMgYSBuZXh0IGJ5dGUgb2Zmc2V0IGlmIHRoZXJlIGlzIG1vcmUgb2YgdGhlCisgIGZpbGUgdG8gcmVhZC4iCisgIFtzZWFyY2gtYnl0ZXMgb2Zmc2V0IG1hdGNoZXMgbmV4dC1ieXRlLW9mZnNldF0KKyAgKG1lcmdlIHsic2VhcmNoU3RyaW5nIiAoU3RyaW5nLiBzZWFyY2gtYnl0ZXMgIlVURi04IikKKyAgICAgICAgICAic3RhcnRCeXRlT2Zmc2V0IiBvZmZzZXQKKyAgICAgICAgICAibWF0Y2hlcyIgbWF0Y2hlc30KKyAgICAoYW5kIG5leHQtYnl0ZS1vZmZzZXQgeyJuZXh0Qnl0ZU9mZnNldCIgbmV4dC1ieXRlLW9mZnNldH0pKSkKKworKGRlZm4gcm90YXRlLWdyZXAtYnVmZmVyIQorICBbXkJ5dGVCdWZmZXIgYnVmIF5CdWZmZXJlZElucHV0U3RyZWFtIHN0cmVhbSB0b3RhbC1ieXRlcy1yZWFkIGZpbGUgZmlsZS1sZW5dCisgIChsZXQgW2J1Zi1hcnIgKC5hcnJheSBidWYpXQorICAgIDs7IENvcHkgdGhlIDJuZCBoYWxmIG9mIHRoZSBidWZmZXIgdG8gdGhlIGZpcnN0IGhhbGYuCisgICAgKFN5c3RlbS9hcnJheWNvcHkgYnVmLWFycgorICAgICAgZ3JlcC1tYXgtc2VhcmNoLXNpemUKKyAgICAgIGJ1Zi1hcnIKKyAgICAgIDAKKyAgICAgIGdyZXAtbWF4LXNlYXJjaC1zaXplKQorICAgIDs7IFplcm8tb3V0IHRoZSAybmQgaGFsZiB0byBwcmV2ZW50IGFjY2lkZW50YWwgbWF0Y2hlcy4KKyAgICAoQXJyYXlzL2ZpbGwgYnVmLWFycgorICAgICAgZ3JlcC1tYXgtc2VhcmNoLXNpemUKKyAgICAgIChjb3VudCBidWYtYXJyKQorICAgICAgKGJ5dGUgMCkpCisgICAgOzsgRmlsbCB0aGUgMm5kIGhhbGYgd2l0aCBuZXcgYnl0ZXMgZnJvbSB0aGUgc3RyZWFtLgorICAgIChsZXQgW2J5dGVzLXJlYWQgKC5yZWFkIHN0cmVhbQorICAgICAgICAgICAgICAgICAgICAgICBidWYtYXJyCisgICAgICAgICAgICAgICAgICAgICAgIGdyZXAtbWF4LXNlYXJjaC1zaXplCisgICAgICAgICAgICAgICAgICAgICAgIChtaW4gZmlsZS1sZW4gZ3JlcC1tYXgtc2VhcmNoLXNpemUpKV0KKyAgICAgICgubGltaXQgYnVmICgrIGdyZXAtbWF4LXNlYXJjaC1zaXplIGJ5dGVzLXJlYWQpKQorICAgICAgKHN3YXAhIHRvdGFsLWJ5dGVzLXJlYWQgKyBieXRlcy1yZWFkKSkpKQorCisoZGVmbmsgc3Vic3RyaW5nLXNlYXJjaAorICAiU2VhcmNoZXMgZm9yIGEgc3Vic3RyaW5nIGluIGEgbG9nIGZpbGUsIHN0YXJ0aW5nIGF0IHRoZSBnaXZlbiBvZmZzZXQsCisgIHJldHVybmluZyB0aGUgZ2l2ZW4gbnVtYmVyIG9mIG1hdGNoZXMsIHN1cnJvdW5kZWQgYnkgdGhlIGdpdmVuIG51bWJlciBvZgorICBjb250ZXh0IGxpbmVzLiAgT3RoZXIgaW5mb3JtYXRpb24gaXMgaW5jbHVkZWQgdG8gYmUgdXNlZnVsIGZvciBwcm9ncmVzc2l2ZWx5CisgIHNlYXJjaGluZyB0aHJvdWdoIGEgZmlsZSBmb3IgZGlzcGxheSBpbiBhIFVJLiBUaGUgc2VhcmNoIHN0cmluZyBtdXN0CisgIGdyZXAtbWF4LXNlYXJjaC1zaXplIGJ5dGVzIG9yIGZld2VyIHdoZW4gZGVjb2RlZCB3aXRoIFVURi04LiIKKyAgW2ZpbGUgXlN0cmluZyBzZWFyY2gtc3RyaW5nIDpudW0tbWF0Y2hlcyAxMCA6c3RhcnQtYnl0ZS1vZmZzZXQgMF0KKyAgezpwcmUgWyhub3QgKGVtcHR5PyBzZWFyY2gtc3RyaW5nKSkKKyAgICAgICAgICg8PSAoY291bnQgKC5nZXRCeXRlcyBzZWFyY2gtc3RyaW5nICJVVEYtOCIpKSBncmVwLW1heC1zZWFyY2gtc2l6ZSldfQorICAobGV0IFt6aXAtZmlsZT8gKC5lbmRzV2l0aCAoLmdldE5hbWUgZmlsZSkgIi5neiIpCisgICAgICAgIGYtaW5wdXQtc3RlYW0gKEZpbGVJbnB1dFN0cmVhbS4gZmlsZSkKKyAgICAgICAgZ3ppcHBlZC1pbnB1dC1zdHJlYW0gKGlmIHppcC1maWxlPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChHWklQSW5wdXRTdHJlYW0uIGYtaW5wdXQtc3RlYW0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi1pbnB1dC1zdGVhbSkKKyAgICAgICAgc3RyZWFtIF5CdWZmZXJlZElucHV0U3RyZWFtIChCdWZmZXJlZElucHV0U3RyZWFtLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnemlwcGVkLWlucHV0LXN0cmVhbSkKKyAgICAgICAgZmlsZS1sZW4gKGlmIHppcC1maWxlPyAoVXRpbHMvemlwRmlsZVNpemUgZmlsZSkgKC5sZW5ndGggZmlsZSkpCisgICAgICAgIGJ1ZiBeQnl0ZUJ1ZmZlciAoQnl0ZUJ1ZmZlci9hbGxvY2F0ZSBncmVwLWJ1Zi1zaXplKQorICAgICAgICBidWYtYXJyIF5ieXRlcyAoLmFycmF5IGJ1ZikKKyAgICAgICAgc3RyaW5nIG5pbAorICAgICAgICB0b3RhbC1ieXRlcy1yZWFkIChhdG9tIDApCisgICAgICAgIG1hdGNoZXMgW10KKyAgICAgICAgc2VhcmNoLWJ5dGVzIF5ieXRlcyAoLmdldEJ5dGVzIHNlYXJjaC1zdHJpbmcgIlVURi04IikKKyAgICAgICAgbnVtLW1hdGNoZXMgKG9yIG51bS1tYXRjaGVzIDEwKQorICAgICAgICBzdGFydC1ieXRlLW9mZnNldCAob3Igc3RhcnQtYnl0ZS1vZmZzZXQgMCldCisgICAgOzsgU3RhcnQgYXQgdGhlIHBhcnQgb2YgdGhlIGxvZyBmaWxlIHdlIGFyZSBpbnRlcmVzdGVkIGluLgorICAgIDs7IEFsbG93IHNlYXJjaGluZyB3aGVuIHN0YXJ0LWJ5dGUtb2Zmc2V0ID09IGZpbGUtbGVuIHNvIGl0IGRvZXNuJ3QgYmxvdyB1cCBvbiAwLWxlbmd0aCBmaWxlcworICAgIChpZiAoPiBzdGFydC1ieXRlLW9mZnNldCBmaWxlLWxlbikKKyAgICAgICh0aHJvdworICAgICAgICAoSW52YWxpZFJlcXVlc3RFeGNlcHRpb24uICJDYW5ub3Qgc2VhcmNoIHBhc3QgdGhlIGVuZCBvZiB0aGUgZmlsZSIpKSkKKyAgICAod2hlbiAoPiBzdGFydC1ieXRlLW9mZnNldCAwKQorICAgICAgKHNraXAtYnl0ZXMgc3RyZWFtIHN0YXJ0LWJ5dGUtb2Zmc2V0KSkKKyAgICAoamF2YS51dGlsLkFycmF5cy9maWxsIGJ1Zi1hcnIgKGJ5dGUgMCkpCisgICAgKGxldCBbYnl0ZXMtcmVhZCAoLnJlYWQgc3RyZWFtIGJ1Zi1hcnIgMCAobWluIGZpbGUtbGVuIGdyZXAtYnVmLXNpemUpKV0KKyAgICAgICgubGltaXQgYnVmIGJ5dGVzLXJlYWQpCisgICAgICAoc3dhcCEgdG90YWwtYnl0ZXMtcmVhZCArIGJ5dGVzLXJlYWQpKQorICAgIChsb29wIFtpbml0aWFsLW1hdGNoZXMgW10KKyAgICAgICAgICAgaW5pdC1idWYtb2Zmc2V0IDAKKyAgICAgICAgICAgYnl0ZS1vZmZzZXQgc3RhcnQtYnl0ZS1vZmZzZXQKKyAgICAgICAgICAgYmVmb3JlLWJ5dGVzIG5pbF0KKyAgICAgIChsZXQgW1ttYXRjaGVzIG5ldy1ieXRlLW9mZnNldCBuZXctYmVmb3JlLWJ5dGVzXQorICAgICAgICAgICAgKGJ1ZmZlci1zdWJzdHJpbmctc2VhcmNoISBmaWxlCisgICAgICAgICAgICAgIGZpbGUtbGVuCisgICAgICAgICAgICAgIGJ5dGUtb2Zmc2V0CisgICAgICAgICAgICAgIGluaXQtYnVmLW9mZnNldAorICAgICAgICAgICAgICBzdHJlYW0KKyAgICAgICAgICAgICAgc3RhcnQtYnl0ZS1vZmZzZXQKKyAgICAgICAgICAgICAgQHRvdGFsLWJ5dGVzLXJlYWQKKyAgICAgICAgICAgICAgYnVmCisgICAgICAgICAgICAgIHNlYXJjaC1ieXRlcworICAgICAgICAgICAgICBpbml0aWFsLW1hdGNoZXMKKyAgICAgICAgICAgICAgbnVtLW1hdGNoZXMKKyAgICAgICAgICAgICAgYmVmb3JlLWJ5dGVzKV0KKyAgICAgICAgKGlmIChhbmQgKDwgKGNvdW50IG1hdGNoZXMpIG51bS1tYXRjaGVzKQorICAgICAgICAgICAgICAoPCAoKyBAdG90YWwtYnl0ZXMtcmVhZCBzdGFydC1ieXRlLW9mZnNldCkgZmlsZS1sZW4pKQorICAgICAgICAgIChsZXQgWzs7IFRoZSBzdGFydCBpbmRleCBpcyBwb3NpdGlvbmVkIHRvIGZpbmQgYW55IHBvc3NpYmxlCisgICAgICAgICAgICAgICAgOzsgb2NjdXJyZW5jZSBzZWFyY2ggc3RyaW5nIHRoYXQgZGlkIG5vdCBxdWl0ZSBmaXQgaW4gdGhlCisgICAgICAgICAgICAgICAgOzsgYnVmZmVyIG9uIHRoZSBwcmV2aW91cyByZWFkLgorICAgICAgICAgICAgICAgIG5ldy1idWYtb2Zmc2V0ICgtIChtaW4gKC5saW1pdCBeQnl0ZUJ1ZmZlciBidWYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmVwLW1heC1zZWFyY2gtc2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbGVuZ3RoIHNlYXJjaC1ieXRlcykpXQorICAgICAgICAgICAgKHJvdGF0ZS1ncmVwLWJ1ZmZlciEgYnVmIHN0cmVhbSB0b3RhbC1ieXRlcy1yZWFkIGZpbGUgZmlsZS1sZW4pCisgICAgICAgICAgICAod2hlbiAoPCBAdG90YWwtYnl0ZXMtcmVhZCAwKQorICAgICAgICAgICAgICAodGhyb3cgKEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uLiAiQ2Fubm90IHNlYXJjaCBwYXN0IHRoZSBlbmQgb2YgdGhlIGZpbGUiKSkpCisgICAgICAgICAgICAocmVjdXIgbWF0Y2hlcworICAgICAgICAgICAgICBuZXctYnVmLW9mZnNldAorICAgICAgICAgICAgICBuZXctYnl0ZS1vZmZzZXQKKyAgICAgICAgICAgICAgbmV3LWJlZm9yZS1ieXRlcykpCisgICAgICAgICAgKG1rLWdyZXAtcmVzcG9uc2Ugc2VhcmNoLWJ5dGVzCisgICAgICAgICAgICBzdGFydC1ieXRlLW9mZnNldAorICAgICAgICAgICAgbWF0Y2hlcworICAgICAgICAgICAgKGlmLW5vdCAoYW5kICg8IChjb3VudCBtYXRjaGVzKSBudW0tbWF0Y2hlcykKKyAgICAgICAgICAgICAgICAgICAgICAoPj0gQHRvdGFsLWJ5dGVzLXJlYWQgZmlsZS1sZW4pKQorICAgICAgICAgICAgICAobGV0IFtuZXh0LWJ5dGUtb2Zmc2V0ICgrIChnZXQgKGxhc3QgbWF0Y2hlcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJieXRlT2Zmc2V0IikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbGVuZ3RoIHNlYXJjaC1ieXRlcykpXQorICAgICAgICAgICAgICAgIChpZiAoPiBmaWxlLWxlbiBuZXh0LWJ5dGUtb2Zmc2V0KQorICAgICAgICAgICAgICAgICAgbmV4dC1ieXRlLW9mZnNldCkpKSkpKSkpKQorCisoZGVmbi0gdHJ5LXBhcnNlLWludC1wYXJhbQorICBbbmFtIHZhbHVlXQorICAodHJ5CisgICAgKEludGVnZXIvcGFyc2VJbnQgdmFsdWUpCisgICAgKGNhdGNoIGphdmEubGFuZy5OdW1iZXJGb3JtYXRFeGNlcHRpb24gZQorICAgICAgKC0+CisgICAgICAgIChzdHIgIkNvdWxkIG5vdCBwYXJzZSAiIG5hbSAiIHRvIGFuIGludGVnZXIiKQorICAgICAgICAoSW52YWxpZFJlcXVlc3RFeGNlcHRpb24uIGUpCisgICAgICAgIHRocm93KSkpKQorCisoZGVmbiBzZWFyY2gtbG9nLWZpbGUKKyAgW2ZuYW1lIHVzZXIgXlN0cmluZyByb290LWRpciBzZWFyY2ggbnVtLW1hdGNoZXMgb2Zmc2V0IGNhbGxiYWNrIG9yaWdpbl0KKyAgKGxldCBbZmlsZSAoLmdldENhbm9uaWNhbEZpbGUgKEZpbGUuIHJvb3QtZGlyIGZuYW1lKSldCisgICAgKGlmICguZXhpc3RzIGZpbGUpCisgICAgICAoaWYgKG9yIChibGFuaz8gKCpTVE9STS1DT05GKiBVSS1GSUxURVIpKQorICAgICAgICAgICAgKGF1dGhvcml6ZWQtbG9nLXVzZXI/IHVzZXIgZm5hbWUgKlNUT1JNLUNPTkYqKSkKKyAgICAgICAgKGxldCBbbnVtLW1hdGNoZXMtaW50IChpZiBudW0tbWF0Y2hlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHJ5LXBhcnNlLWludC1wYXJhbSAibnVtLW1hdGNoZXMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtLW1hdGNoZXMpKQorICAgICAgICAgICAgICBvZmZzZXQtaW50IChpZiBvZmZzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh0cnktcGFyc2UtaW50LXBhcmFtICJzdGFydC1ieXRlLW9mZnNldCIgb2Zmc2V0KSldCisgICAgICAgICAgKHRyeQorICAgICAgICAgICAgKGlmIChhbmQgKG5vdCAoZW1wdHk/IHNlYXJjaCkpCisgICAgICAgICAgICAgICAgICA8PSAoY291bnQgKC5nZXRCeXRlcyBzZWFyY2ggIlVURi04IikpIGdyZXAtbWF4LXNlYXJjaC1zaXplKQorICAgICAgICAgICAgICAoanNvbi1yZXNwb25zZQorICAgICAgICAgICAgICAgIChzdWJzdHJpbmctc2VhcmNoIGZpbGUKKyAgICAgICAgICAgICAgICAgIHNlYXJjaAorICAgICAgICAgICAgICAgICAgOm51bS1tYXRjaGVzIG51bS1tYXRjaGVzLWludAorICAgICAgICAgICAgICAgICAgOnN0YXJ0LWJ5dGUtb2Zmc2V0IG9mZnNldC1pbnQpCisgICAgICAgICAgICAgICAgY2FsbGJhY2sKKyAgICAgICAgICAgICAgICA6aGVhZGVycyB7IkFjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbiIgb3JpZ2luCisgICAgICAgICAgICAgICAgICAgICAgICAgICJBY2Nlc3MtQ29udHJvbC1BbGxvdy1DcmVkZW50aWFscyIgInRydWUifSkKKyAgICAgICAgICAgICAgKHRocm93CisgICAgICAgICAgICAgICAgKEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uLgorICAgICAgICAgICAgICAgICAgKHN0ciAiU2VhcmNoIHN1YnN0cmluZyBtdXN0IGJlIGJldHdlZW4gMSBhbmQgMTAyNCBVVEYtOCAiCisgICAgICAgICAgICAgICAgICAgICJieXRlcyBpbiBzaXplIChpbmNsdXNpdmUpIikpKSkKKyAgICAgICAgICAgIChjYXRjaCBFeGNlcHRpb24gZXgKKyAgICAgICAgICAgICAgKGpzb24tcmVzcG9uc2UgKGV4Y2VwdGlvbi0+anNvbiBleCkgY2FsbGJhY2sgOnN0YXR1cyA1MDApKSkpCisgICAgICAgIChqc29uLXJlc3BvbnNlICh1bmF1dGhvcml6ZWQtdXNlci1qc29uIHVzZXIpIGNhbGxiYWNrIDpzdGF0dXMgNDAxKSkKKyAgICAgIChqc29uLXJlc3BvbnNlIHsiZXJyb3IiICJOb3QgRm91bmQiCisgICAgICAgICAgICAgICAgICAgICAgImVycm9yTWVzc2FnZSIgIlRoZSBmaWxlIHdhcyBub3QgZm91bmQgb24gdGhpcyBub2RlLiJ9CisgICAgICAgIGNhbGxiYWNrCisgICAgICAgIDpzdGF0dXMgNDA0KSkpKQorCisoZGVmbiBmaW5kLW4tbWF0Y2hlcyBbbG9ncyBuIGZpbGUtb2Zmc2V0IG9mZnNldCBzZWFyY2hdCisgIChsZXQgW2xvZ3MgKGRyb3AgZmlsZS1vZmZzZXQgbG9ncykKKyAgICAgICAgd3JhcC1tYXRjaGVzLWZuIChmbiBbbWF0Y2hlc10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgeyJmaWxlT2Zmc2V0IiBmaWxlLW9mZnNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlYXJjaFN0cmluZyIgc2VhcmNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAibWF0Y2hlcyIgbWF0Y2hlc30pXQorICAgIChsb29wIFttYXRjaGVzIFtdCisgICAgICAgICAgIGxvZ3MgbG9ncworICAgICAgICAgICBvZmZzZXQgb2Zmc2V0CisgICAgICAgICAgIGZpbGUtb2Zmc2V0IGZpbGUtb2Zmc2V0CisgICAgICAgICAgIG1hdGNoLWNvdW50IDBdCisgICAgICAoaWYgKGVtcHR5PyBsb2dzKQorICAgICAgICAod3JhcC1tYXRjaGVzLWZuIG1hdGNoZXMpCisgICAgICAgIChsZXQgW3RoZXNlLW1hdGNoZXMgKHRyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvZy1kZWJ1ZyAiTG9va2luZyB0aHJvdWdoICIgKGZpcnN0IGxvZ3MpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN1YnN0cmluZy1zZWFyY2ggKGZpcnN0IGxvZ3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6bnVtLW1hdGNoZXMgKC0gbiBtYXRjaC1jb3VudCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOnN0YXJ0LWJ5dGUtb2Zmc2V0IG9mZnNldCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjYXRjaCBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb2ctZXJyb3IgZSAiQ2FuJ3Qgc2VhcmNoIHBhc3QgZW5kIG9mIGZpbGUuIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge30pKQorICAgICAgICAgICAgICBmaWxlLW5hbWUgKGdldC10b3BvLXBvcnQtd29ya2VybG9nIChmaXJzdCBsb2dzKSkKKyAgICAgICAgICAgICAgbmV3LW1hdGNoZXMgKGNvbmogbWF0Y2hlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtZXJnZSB0aGVzZS1tYXRjaGVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ICJmaWxlTmFtZSIgZmlsZS1uYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiAoZmlyc3QgKHRha2UtbGFzdCAyIChzcGxpdCAoLmdldENhbm9uaWNhbFBhdGggKGZpcnN0IGxvZ3MpKSAocmUtcGF0dGVybiBmaWxlLXBhdGgtc2VwYXJhdG9yKSkpKX0pKQorICAgICAgICAgICAgICBuZXctY291bnQgKCsgbWF0Y2gtY291bnQgKGNvdW50ICh0aGVzZS1tYXRjaGVzICJtYXRjaGVzIikpKV0KKyAgICAgICAgICAoaWYgKGVtcHR5PyB0aGVzZS1tYXRjaGVzKQorICAgICAgICAgICAgKHJlY3VyIG1hdGNoZXMgKHJlc3QgbG9ncykgMCAoKyBmaWxlLW9mZnNldCAxKSBtYXRjaC1jb3VudCkKKyAgICAgICAgICAgIChpZiAoPj0gbmV3LWNvdW50IG4pCisgICAgICAgICAgICAgICh3cmFwLW1hdGNoZXMtZm4gbmV3LW1hdGNoZXMpCisgICAgICAgICAgICAgIChyZWN1ciBuZXctbWF0Y2hlcyAocmVzdCBsb2dzKSAwICgrIGZpbGUtb2Zmc2V0IDEpIG5ldy1jb3VudCkpKSkpKSkpCisKKyhkZWZuIGxvZ3MtZm9yLXBvcnQKKyAgIkdldCB0aGUgZmlsdGVyZWQsIGF1dGhvcml6ZWQsIHNvcnRlZCBsb2cgZmlsZXMgZm9yIGEgcG9ydC4iCisgIFt1c2VyIHBvcnQtZGlyXQorICAobGV0IFtmaWx0ZXItYXV0aG9yaXplZC1mbiAoZm4gW3VzZXIgbG9nc10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmlsdGVyICMob3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChibGFuaz8gKCpTVE9STS1DT05GKiBVSS1GSUxURVIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1dGhvcml6ZWQtbG9nLXVzZXI/IHVzZXIgKGdldC10b3BvLXBvcnQtd29ya2VybG9nICUpICpTVE9STS1DT05GKikpIGxvZ3MpKV0KKyAgICAoc29ydCAjKGNvbXBhcmUgKC5sYXN0TW9kaWZpZWQgJTIpICgubGFzdE1vZGlmaWVkICUxKSkKKyAgICAgIChmaWx0ZXItYXV0aG9yaXplZC1mbgorICAgICAgICB1c2VyCisgICAgICAgIChmaWx0ZXIgIyhyZS1maW5kIHdvcmtlci1sb2ctZmlsZW5hbWUtcGF0dGVybiAoLmdldE5hbWUgJSkpICgubGlzdEZpbGVzIHBvcnQtZGlyKSkpKSkpCisKKyhkZWZuIGRlZXAtc2VhcmNoLWxvZ3MtZm9yLXRvcG9sb2d5CisgIFt0b3BvbG9neS1pZCB1c2VyIF5TdHJpbmcgcm9vdC1kaXIgc2VhcmNoIG51bS1tYXRjaGVzIHBvcnQgZmlsZS1vZmZzZXQgb2Zmc2V0IHNlYXJjaC1hcmNoaXZlZD8gY2FsbGJhY2sgb3JpZ2luXQorICAoanNvbi1yZXNwb25zZQorICAgIChpZiAob3IgKG5vdCBzZWFyY2gpIChub3QgKC5leGlzdHMgKEZpbGUuIChzdHIgcm9vdC1kaXIgZmlsZS1wYXRoLXNlcGFyYXRvciB0b3BvbG9neS1pZCkpKSkpCisgICAgICBbXQorICAgICAgKGxldCBbZmlsZS1vZmZzZXQgKGlmIGZpbGUtb2Zmc2V0IChJbnRlZ2VyL3BhcnNlSW50IGZpbGUtb2Zmc2V0KSAwKQorICAgICAgICAgICAgb2Zmc2V0IChpZiBvZmZzZXQgKEludGVnZXIvcGFyc2VJbnQgb2Zmc2V0KSAwKQorICAgICAgICAgICAgbnVtLW1hdGNoZXMgKG9yIChJbnRlZ2VyL3BhcnNlSW50IG51bS1tYXRjaGVzKSAxKQorICAgICAgICAgICAgcG9ydC1kaXJzICh2ZWMgKC5saXN0RmlsZXMgKEZpbGUuIChzdHIgcm9vdC1kaXIgZmlsZS1wYXRoLXNlcGFyYXRvciB0b3BvbG9neS1pZCkpKSkKKyAgICAgICAgICAgIGxvZ3MtZm9yLXBvcnQtZm4gKHBhcnRpYWwgbG9ncy1mb3ItcG9ydCB1c2VyKV0KKyAgICAgICAgKGlmIChvciAobm90IHBvcnQpICg9ICIqIiBwb3J0KSkKKyAgICAgICAgICA7OyBDaGVjayBmb3IgYWxsIHBvcnRzCisgICAgICAgICAgKGxldCBbZmlsdGVyZWQtbG9ncyAoZmlsdGVyIChjb21wIG5vdCBlbXB0eT8pIChtYXAgbG9ncy1mb3ItcG9ydC1mbiBwb3J0LWRpcnMpKV0KKyAgICAgICAgICAgIChpZiBzZWFyY2gtYXJjaGl2ZWQ/CisgICAgICAgICAgICAgIChtYXAgIyhmaW5kLW4tbWF0Y2hlcyAlIG51bS1tYXRjaGVzIDAgMCBzZWFyY2gpCisgICAgICAgICAgICAgICAgZmlsdGVyZWQtbG9ncykKKyAgICAgICAgICAgICAgKG1hcCAjKGZpbmQtbi1tYXRjaGVzICUgbnVtLW1hdGNoZXMgMCAwIHNlYXJjaCkKKyAgICAgICAgICAgICAgICAobWFwIChjb21wIHZlY3RvciBmaXJzdCkgZmlsdGVyZWQtbG9ncykpKSkKKyAgICAgICAgICA7OyBDaGVjayBqdXN0IHRoZSBvbmUgcG9ydAorICAgICAgICAgIChpZiAobm90IChjb250YWlucz8gKGludG8gI3t9IChtYXAgc3RyICgqU1RPUk0tQ09ORiogU1VQRVJWSVNPUi1TTE9UUy1QT1JUUykpKSBwb3J0KSkKKyAgICAgICAgICAgIFtdCisgICAgICAgICAgICAobGV0IFtwb3J0LWRpciAoRmlsZS4gKHN0ciByb290LWRpciBmaWxlLXBhdGgtc2VwYXJhdG9yIHRvcG9sb2d5LWlkIGZpbGUtcGF0aC1zZXBhcmF0b3IgcG9ydCkpXQorICAgICAgICAgICAgICAoaWYgKG9yIChub3QgKC5leGlzdHMgcG9ydC1kaXIpKSAoZW1wdHk/IChsb2dzLWZvci1wb3J0IHVzZXIgcG9ydC1kaXIpKSkKKyAgICAgICAgICAgICAgICBbXQorICAgICAgICAgICAgICAgIChsZXQgW2ZpbHRlcmVkLWxvZ3MgKGxvZ3MtZm9yLXBvcnQgdXNlciBwb3J0LWRpcildCisgICAgICAgICAgICAgICAgICAoaWYgc2VhcmNoLWFyY2hpdmVkPworICAgICAgICAgICAgICAgICAgICAoZmluZC1uLW1hdGNoZXMgZmlsdGVyZWQtbG9ncyBudW0tbWF0Y2hlcyBmaWxlLW9mZnNldCBvZmZzZXQgc2VhcmNoKQorICAgICAgICAgICAgICAgICAgICAoZmluZC1uLW1hdGNoZXMgWyhmaXJzdCBmaWx0ZXJlZC1sb2dzKV0gbnVtLW1hdGNoZXMgMCBvZmZzZXQgc2VhcmNoKSkpKSkpKSkpCisgICAgY2FsbGJhY2sKKyAgICA6aGVhZGVycyB7IkFjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbiIgb3JpZ2luCisgICAgICAgICAgICAgICJBY2Nlc3MtQ29udHJvbC1BbGxvdy1DcmVkZW50aWFscyIgInRydWUifSkpCisKIChkZWZuIGxvZy10ZW1wbGF0ZQogICAoW2JvZHldIChsb2ctdGVtcGxhdGUgYm9keSBuaWwgbmlsKSkKICAgKFtib2R5IGZuYW1lIHVzZXJdCkBAIC0zMzMsNDIgKzkyMCwyMjcgQEAKICAgICAgICAgICAgICAgICAgICAgKG5hbWUgaykgIiciKQogICAgICAgICAgICAgICAgZXgpKSkpKQogCisoZGVmbiBsaXN0LWxvZy1maWxlcworICBbdXNlciB0b3BvSWQgcG9ydCBsb2ctcm9vdCBjYWxsYmFjayBvcmlnaW5dCisgIChsZXQgW2ZpbGUtcmVzdWx0cworICAgICAgICAoaWYgKG5pbD8gdG9wb0lkKQorICAgICAgICAgIChpZiAobmlsPyBwb3J0KQorICAgICAgICAgICAgKGdldC1hbGwtbG9ncy1mb3Itcm9vdGRpciAoRmlsZS4gbG9nLXJvb3QpKQorICAgICAgICAgICAgKHJlZHVjZSBjb25jYXQKKyAgICAgICAgICAgICAgKGZvciBbdG9wby1kaXIgKC5saXN0RmlsZXMgKEZpbGUuIGxvZy1yb290KSldCisgICAgICAgICAgICAgICAgKHJlZHVjZSBjb25jYXQKKyAgICAgICAgICAgICAgICAgIChmb3IgW3BvcnQtZGlyICgubGlzdEZpbGVzIHRvcG8tZGlyKV0KKyAgICAgICAgICAgICAgICAgICAgKGlmICg9IChzdHIgcG9ydCkgKC5nZXROYW1lIHBvcnQtZGlyKSkKKyAgICAgICAgICAgICAgICAgICAgICAoaW50byBbXSAoLmxpc3RGaWxlcyBwb3J0LWRpcikpKSkpKSkpCisgICAgICAgICAgKGlmIChuaWw/IHBvcnQpCisgICAgICAgICAgICAobGV0IFt0b3BvLWRpciAoRmlsZS4gKHN0ciBsb2ctcm9vdCBmaWxlLXBhdGgtc2VwYXJhdG9yIHRvcG9JZCkpXQorICAgICAgICAgICAgICAoaWYgKC5leGlzdHMgdG9wby1kaXIpCisgICAgICAgICAgICAgICAgKHJlZHVjZSBjb25jYXQKKyAgICAgICAgICAgICAgICAgIChmb3IgW3BvcnQtZGlyICgubGlzdEZpbGVzIHRvcG8tZGlyKV0KKyAgICAgICAgICAgICAgICAgICAgKGludG8gW10gKC5saXN0RmlsZXMgcG9ydC1kaXIpKSkpCisgICAgICAgICAgICAgICAgW10pKQorICAgICAgICAgICAgKGxldCBbcG9ydC1kaXIgKGdldC13b3JrZXItZGlyLWZyb20tcm9vdCBsb2ctcm9vdCB0b3BvSWQgcG9ydCldCisgICAgICAgICAgICAgIChpZiAoLmV4aXN0cyBwb3J0LWRpcikKKyAgICAgICAgICAgICAgICAoaW50byBbXSAoLmxpc3RGaWxlcyBwb3J0LWRpcikpCisgICAgICAgICAgICAgICAgW10pKSkpCisgICAgICAgIGZpbGUtc3RycyAoc29ydCAoZm9yIFtmaWxlIGZpbGUtcmVzdWx0c10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGdldC10b3BvLXBvcnQtd29ya2VybG9nIGZpbGUpKSldCisgICAgKGpzb24tcmVzcG9uc2UgZmlsZS1zdHJzCisgICAgICBjYWxsYmFjaworICAgICAgOmhlYWRlcnMgeyJBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW4iIG9yaWdpbgorICAgICAgICAgICAgICAgICJBY2Nlc3MtQ29udHJvbC1BbGxvdy1DcmVkZW50aWFscyIgInRydWUifSkpKQorCisoZGVmbiBnZXQtcHJvZmlsZXItZHVtcC1maWxlcworICBbZGlyXQorICAoZmlsdGVyIChjb21wIG5vdCBuaWw/KQorICAgICAgICAoZm9yIFtmICgubGlzdEZpbGVzIGRpcildCisgICAgICAgICAgKGxldCBbbmFtZSAoLmdldE5hbWUgZildCisgICAgICAgICAgICAoaWYgKG9yCisgICAgICAgICAgICAgICAgICAoLmVuZHNXaXRoIG5hbWUgIi50eHQiKQorICAgICAgICAgICAgICAgICAgKC5lbmRzV2l0aCBuYW1lICIuamZyIikKKyAgICAgICAgICAgICAgICAgICguZW5kc1dpdGggbmFtZSAiLmJpbiIpKQorICAgICAgICAgICAgICAoLmdldE5hbWUgZikpKSkpKQorCiAoZGVmcm91dGVzIGxvZy1yb3V0ZXMKICAgKEdFVCAiL2xvZyIgWzphcyByZXEgJiBtXQotICAgICAgICh0cnkKLSAgICAgICAgIChsZXQgW3NlcnZsZXQtcmVxdWVzdCAoOnNlcnZsZXQtcmVxdWVzdCByZXEpCi0gICAgICAgICAgICAgICBsb2ctcm9vdCAoOmxvZy1yb290IHJlcSkKLSAgICAgICAgICAgICAgIHVzZXIgKC5nZXRVc2VyTmFtZSBodHRwLWNyZWRzLWhhbmRsZXIgc2VydmxldC1yZXF1ZXN0KQotICAgICAgICAgICAgICAgc3RhcnQgKGlmICg6c3RhcnQgbSkgKHBhcnNlLWxvbmctZnJvbS1tYXAgbSA6c3RhcnQpKQotICAgICAgICAgICAgICAgbGVuZ3RoIChpZiAoOmxlbmd0aCBtKSAocGFyc2UtbG9uZy1mcm9tLW1hcCBtIDpsZW5ndGgpKV0KLSAgICAgICAgICAgKGxvZy10ZW1wbGF0ZSAobG9nLXBhZ2UgKDpmaWxlIG0pIHN0YXJ0IGxlbmd0aCAoOmdyZXAgbSkgdXNlciBsb2ctcm9vdCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAoOmZpbGUgbSkgdXNlcikpCi0gICAgICAgICAoY2F0Y2ggSW52YWxpZFJlcXVlc3RFeGNlcHRpb24gZXgKLSAgICAgICAgICAgKGxvZy1lcnJvciBleCkKLSAgICAgICAgICAgKHJpbmctcmVzcG9uc2UtZnJvbS1leGNlcHRpb24gZXgpKSkpCisgICAgKHRyeQorICAgICAgKG1hcmshIGxvZ3ZpZXdlcjpudW0tbG9nLXBhZ2UtaHR0cC1yZXF1ZXN0cykKKyAgICAgIChsZXQgW3NlcnZsZXQtcmVxdWVzdCAoOnNlcnZsZXQtcmVxdWVzdCByZXEpCisgICAgICAgICAgICBsb2ctcm9vdCAoOmxvZy1yb290IHJlcSkKKyAgICAgICAgICAgIHVzZXIgKC5nZXRVc2VyTmFtZSBodHRwLWNyZWRzLWhhbmRsZXIgc2VydmxldC1yZXF1ZXN0KQorICAgICAgICAgICAgc3RhcnQgKGlmICg6c3RhcnQgbSkgKHBhcnNlLWxvbmctZnJvbS1tYXAgbSA6c3RhcnQpKQorICAgICAgICAgICAgbGVuZ3RoIChpZiAoOmxlbmd0aCBtKSAocGFyc2UtbG9uZy1mcm9tLW1hcCBtIDpsZW5ndGgpKQorICAgICAgICAgICAgZmlsZSAodXJsLWRlY29kZSAoOmZpbGUgbSkpXQorICAgICAgICAobG9nLXRlbXBsYXRlIChsb2ctcGFnZSBmaWxlIHN0YXJ0IGxlbmd0aCAoOmdyZXAgbSkgdXNlciBsb2ctcm9vdCkKKyAgICAgICAgICBmaWxlIHVzZXIpKQorICAgICAgKGNhdGNoIEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGV4CisgICAgICAgIChsb2ctZXJyb3IgZXgpCisgICAgICAgIChyaW5nLXJlc3BvbnNlLWZyb20tZXhjZXB0aW9uIGV4KSkpKQorICAoR0VUICIvZHVtcHMvOnRvcG8taWQvOmhvc3QtcG9ydC86ZmlsZW5hbWUiCisgICAgICAgWzphcyB7OmtleXMgW3NlcnZsZXQtcmVxdWVzdCBzZXJ2bGV0LXJlc3BvbnNlIGxvZy1yb290XX0gdG9wby1pZCBob3N0LXBvcnQgZmlsZW5hbWUgJm1dCisgICAgIChsZXQgW3VzZXIgKC5nZXRVc2VyTmFtZSBodHRwLWNyZWRzLWhhbmRsZXIgc2VydmxldC1yZXF1ZXN0KQorICAgICAgICAgICBwb3J0IChzZWNvbmQgKHNwbGl0IGhvc3QtcG9ydCAjIjoiKSkKKyAgICAgICAgICAgZGlyIChGaWxlLiAoc3RyIGxvZy1yb290CisgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLXBhdGgtc2VwYXJhdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BvLWlkCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLXBhdGgtc2VwYXJhdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0KSkKKyAgICAgICAgICAgZmlsZSAoRmlsZS4gKHN0ciBsb2ctcm9vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUtcGF0aC1zZXBhcmF0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BvLWlkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZS1wYXRoLXNlcGFyYXRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLXBhdGgtc2VwYXJhdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUpKV0KKyAgICAgICAoaWYgKGFuZCAoLmV4aXN0cyBkaXIpICguZXhpc3RzIGZpbGUpKQorICAgICAgICAgKGlmIChvciAoYmxhbms/ICgqU1RPUk0tQ09ORiogVUktRklMVEVSKSkKKyAgICAgICAgICAgICAgIChhdXRob3JpemVkLWxvZy11c2VyPyB1c2VyIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHIgdG9wby1pZCBmaWxlLXBhdGgtc2VwYXJhdG9yIHBvcnQgZmlsZS1wYXRoLXNlcGFyYXRvciAid29ya2VyLmxvZyIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlNUT1JNLUNPTkYqKSkKKyAgICAgICAgICAgKC0+IChyZXNwL3Jlc3BvbnNlIGZpbGUpCisgICAgICAgICAgICAgICAocmVzcC9jb250ZW50LXR5cGUgImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpKQorICAgICAgICAgICAodW5hdXRob3JpemVkLXVzZXItaHRtbCB1c2VyKSkKKyAgICAgICAgICgtPiAocmVzcC9yZXNwb25zZSAiUGFnZSBub3QgZm91bmQiKQorICAgICAgICAgICAocmVzcC9zdGF0dXMgNDA0KSkpKSkKKyAgKEdFVCAiL2R1bXBzLzp0b3BvLWlkLzpob3N0LXBvcnQiCisgICAgICAgWzphcyB7OmtleXMgW3NlcnZsZXQtcmVxdWVzdCBzZXJ2bGV0LXJlc3BvbnNlIGxvZy1yb290XX0gdG9wby1pZCBob3N0LXBvcnQgJm1dCisgICAgIChsZXQgW3VzZXIgKC5nZXRVc2VyTmFtZSBodHRwLWNyZWRzLWhhbmRsZXIgc2VydmxldC1yZXF1ZXN0KQorICAgICAgICAgICBwb3J0IChzZWNvbmQgKHNwbGl0IGhvc3QtcG9ydCAjIjoiKSkKKyAgICAgICAgICAgZGlyIChGaWxlLiAoc3RyIGxvZy1yb290CisgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLXBhdGgtc2VwYXJhdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BvLWlkCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLXBhdGgtc2VwYXJhdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0KSldCisgICAgICAgKGlmICguZXhpc3RzIGRpcikKKyAgICAgICAgIChpZiAob3IgKGJsYW5rPyAoKlNUT1JNLUNPTkYqIFVJLUZJTFRFUikpCisgICAgICAgICAgICAgICAoYXV0aG9yaXplZC1sb2ctdXNlcj8gdXNlciAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RyIHRvcG8taWQgZmlsZS1wYXRoLXNlcGFyYXRvciBwb3J0IGZpbGUtcGF0aC1zZXBhcmF0b3IgIndvcmtlci5sb2ciKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpTVE9STS1DT05GKikpCisgICAgICAgICAgIChodG1sNAorICAgICAgICAgICAgIFs6aGVhZAorICAgICAgICAgICAgICBbOnRpdGxlICJGaWxlIER1bXBzIC0gU3Rvcm0gTG9nIFZpZXdlciJdCisgICAgICAgICAgICAgIChpbmNsdWRlLWNzcyAiL2Nzcy9ib290c3RyYXAtMy4zLjEubWluLmNzcyIpCisgICAgICAgICAgICAgIChpbmNsdWRlLWNzcyAiL2Nzcy9qcXVlcnkuZGF0YVRhYmxlcy4xLjEwLjQubWluLmNzcyIpCisgICAgICAgICAgICAgIChpbmNsdWRlLWNzcyAiL2Nzcy9zdHlsZS5jc3MiKV0KKyAgICAgICAgICAgICBbOmJvZHkKKyAgICAgICAgICAgICAgWzp1bAorICAgICAgICAgICAgICAgKGZvciBbZmlsZSAoZ2V0LXByb2ZpbGVyLWR1bXAtZmlsZXMgZGlyKV0KKyAgICAgICAgICAgICAgICAgWzpsaQorICAgICAgICAgICAgICAgICAgWzphIHs6aHJlZiAoc3RyICIvZHVtcHMvIiB0b3BvLWlkICIvIiBob3N0LXBvcnQgIi8iIGZpbGUpfSBmaWxlIF1dKV1dKQorICAgICAgICAgICAodW5hdXRob3JpemVkLXVzZXItaHRtbCB1c2VyKSkKKyAgICAgICAgICgtPiAocmVzcC9yZXNwb25zZSAiUGFnZSBub3QgZm91bmQiKQorICAgICAgICAgICAocmVzcC9zdGF0dXMgNDA0KSkpKSkKKyAgKEdFVCAiL2RhZW1vbmxvZyIgWzphcyByZXEgJiBtXQorICAgICh0cnkKKyAgICAgIChtYXJrISBsb2d2aWV3ZXI6bnVtLWRhZW1vbmxvZy1wYWdlLWh0dHAtcmVxdWVzdHMpCisgICAgICAobGV0IFtzZXJ2bGV0LXJlcXVlc3QgKDpzZXJ2bGV0LXJlcXVlc3QgcmVxKQorICAgICAgICAgICAgZGFlbW9ubG9nLXJvb3QgKDpkYWVtb25sb2ctcm9vdCByZXEpCisgICAgICAgICAgICB1c2VyICguZ2V0VXNlck5hbWUgaHR0cC1jcmVkcy1oYW5kbGVyIHNlcnZsZXQtcmVxdWVzdCkKKyAgICAgICAgICAgIHN0YXJ0IChpZiAoOnN0YXJ0IG0pIChwYXJzZS1sb25nLWZyb20tbWFwIG0gOnN0YXJ0KSkKKyAgICAgICAgICAgIGxlbmd0aCAoaWYgKDpsZW5ndGggbSkgKHBhcnNlLWxvbmctZnJvbS1tYXAgbSA6bGVuZ3RoKSkKKyAgICAgICAgICAgIGZpbGUgKHVybC1kZWNvZGUgKDpmaWxlIG0pKV0KKyAgICAgICAgKGxvZy10ZW1wbGF0ZSAoZGFlbW9ubG9nLXBhZ2UgZmlsZSBzdGFydCBsZW5ndGggKDpncmVwIG0pIHVzZXIgZGFlbW9ubG9nLXJvb3QpCisgICAgICAgICAgZmlsZSB1c2VyKSkKKyAgICAgIChjYXRjaCBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBleAorICAgICAgICAobG9nLWVycm9yIGV4KQorICAgICAgICAocmluZy1yZXNwb25zZS1mcm9tLWV4Y2VwdGlvbiBleCkpKSkKICAgKEdFVCAiL2Rvd25sb2FkLzpmaWxlIiBbOmFzIHs6a2V5cyBbc2VydmxldC1yZXF1ZXN0IHNlcnZsZXQtcmVzcG9uc2UgbG9nLXJvb3RdfSBmaWxlICYgbV0KLSAgICAgICAodHJ5Ci0gICAgICAgICAobGV0IFt1c2VyICguZ2V0VXNlck5hbWUgaHR0cC1jcmVkcy1oYW5kbGVyIHNlcnZsZXQtcmVxdWVzdCldCi0gICAgICAgICAgIChkb3dubG9hZC1sb2ctZmlsZSBmaWxlIHNlcnZsZXQtcmVxdWVzdCBzZXJ2bGV0LXJlc3BvbnNlIHVzZXIgbG9nLXJvb3QpKQotICAgICAgICAgKGNhdGNoIEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGV4Ci0gICAgICAgICAgIChsb2ctZXJyb3IgZXgpCi0gICAgICAgICAgIChyaW5nLXJlc3BvbnNlLWZyb20tZXhjZXB0aW9uIGV4KSkpKQorICAgICh0cnkKKyAgICAgIChtYXJrISBsb2d2aWV3ZXI6bnVtLWRvd25sb2FkLWxvZy1maWxlLWh0dHAtcmVxdWVzdHMpCisgICAgICAobGV0IFt1c2VyICguZ2V0VXNlck5hbWUgaHR0cC1jcmVkcy1oYW5kbGVyIHNlcnZsZXQtcmVxdWVzdCldCisgICAgICAgIChkb3dubG9hZC1sb2ctZmlsZSBmaWxlIHNlcnZsZXQtcmVxdWVzdCBzZXJ2bGV0LXJlc3BvbnNlIHVzZXIgbG9nLXJvb3QpKQorICAgICAgKGNhdGNoIEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGV4CisgICAgICAgIChsb2ctZXJyb3IgZXgpCisgICAgICAgIChyaW5nLXJlc3BvbnNlLWZyb20tZXhjZXB0aW9uIGV4KSkpKQorICAoR0VUICIvZGFlbW9uZG93bmxvYWQvOmZpbGUiIFs6YXMgezprZXlzIFtzZXJ2bGV0LXJlcXVlc3Qgc2VydmxldC1yZXNwb25zZSBkYWVtb25sb2ctcm9vdF19IGZpbGUgJiBtXQorICAgICh0cnkKKyAgICAgIChtYXJrISBsb2d2aWV3ZXI6bnVtLWRvd25sb2FkLWxvZy1kYWVtb24tZmlsZS1odHRwLXJlcXVlc3RzKQorICAgICAgKGxldCBbdXNlciAoLmdldFVzZXJOYW1lIGh0dHAtY3JlZHMtaGFuZGxlciBzZXJ2bGV0LXJlcXVlc3QpXQorICAgICAgICAoZG93bmxvYWQtbG9nLWZpbGUgZmlsZSBzZXJ2bGV0LXJlcXVlc3Qgc2VydmxldC1yZXNwb25zZSB1c2VyIGRhZW1vbmxvZy1yb290KSkKKyAgICAgIChjYXRjaCBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBleAorICAgICAgICAobG9nLWVycm9yIGV4KQorICAgICAgICAocmluZy1yZXNwb25zZS1mcm9tLWV4Y2VwdGlvbiBleCkpKSkKKyAgKEdFVCAiL3NlYXJjaC86ZmlsZSIgWzphcyB7OmtleXMgW3NlcnZsZXQtcmVxdWVzdCBzZXJ2bGV0LXJlc3BvbnNlIGxvZy1yb290XX0gZmlsZSAmIG1dCisgICAgOzsgV2UgZG8gbm90IHVzZSBzZXJ2bGV0LXJlc3BvbnNlIGhlcmUsIGJ1dCBkbyBub3QgcmVtb3ZlIGl0IGZyb20gdGhlCisgICAgOzsgOmtleXMgbGlzdCwgb3IgdGhpcyBydWxlIGNvdWxkIHN0b3Agd29ya2luZyB3aGVuIGFuIGF1dGhlbnRpY2F0aW9uCisgICAgOzsgZmlsdGVyIGlzIGNvbmZpZ3VyZWQuCisgICAgKHRyeQorICAgICAgKGxldCBbdXNlciAoLmdldFVzZXJOYW1lIGh0dHAtY3JlZHMtaGFuZGxlciBzZXJ2bGV0LXJlcXVlc3QpXQorICAgICAgICAoc2VhcmNoLWxvZy1maWxlICh1cmwtZGVjb2RlIGZpbGUpCisgICAgICAgICAgdXNlcgorICAgICAgICAgIGxvZy1yb290CisgICAgICAgICAgKDpzZWFyY2gtc3RyaW5nIG0pCisgICAgICAgICAgKDpudW0tbWF0Y2hlcyBtKQorICAgICAgICAgICg6c3RhcnQtYnl0ZS1vZmZzZXQgbSkKKyAgICAgICAgICAoOmNhbGxiYWNrIG0pCisgICAgICAgICAgKC5nZXRIZWFkZXIgc2VydmxldC1yZXF1ZXN0ICJPcmlnaW4iKSkpCisgICAgICAoY2F0Y2ggSW52YWxpZFJlcXVlc3RFeGNlcHRpb24gZXgKKyAgICAgICAgKGxvZy1lcnJvciBleCkKKyAgICAgICAgKGpzb24tcmVzcG9uc2UgKGV4Y2VwdGlvbi0+anNvbiBleCkgKDpjYWxsYmFjayBtKSA6c3RhdHVzIDQwMCkpKSkKKyAgKEdFVCAiL2RlZXBTZWFyY2gvOnRvcG8taWQiIFs6YXMgezprZXlzIFtzZXJ2bGV0LXJlcXVlc3Qgc2VydmxldC1yZXNwb25zZSBsb2ctcm9vdF19IHRvcG8taWQgJiBtXQorICAgIDs7IFdlIGRvIG5vdCB1c2Ugc2VydmxldC1yZXNwb25zZSBoZXJlLCBidXQgZG8gbm90IHJlbW92ZSBpdCBmcm9tIHRoZQorICAgIDs7IDprZXlzIGxpc3QsIG9yIHRoaXMgcnVsZSBjb3VsZCBzdG9wIHdvcmtpbmcgd2hlbiBhbiBhdXRoZW50aWNhdGlvbgorICAgIDs7IGZpbHRlciBpcyBjb25maWd1cmVkLgorICAgICh0cnkKKyAgICAgIChsZXQgW3VzZXIgKC5nZXRVc2VyTmFtZSBodHRwLWNyZWRzLWhhbmRsZXIgc2VydmxldC1yZXF1ZXN0KV0KKyAgICAgICAgKGRlZXAtc2VhcmNoLWxvZ3MtZm9yLXRvcG9sb2d5IHRvcG8taWQKKyAgICAgICAgICB1c2VyCisgICAgICAgICAgbG9nLXJvb3QKKyAgICAgICAgICAoOnNlYXJjaC1zdHJpbmcgbSkKKyAgICAgICAgICAoOm51bS1tYXRjaGVzIG0pCisgICAgICAgICAgKDpwb3J0IG0pCisgICAgICAgICAgKDpzdGFydC1maWxlLW9mZnNldCBtKQorICAgICAgICAgICg6c3RhcnQtYnl0ZS1vZmZzZXQgbSkKKyAgICAgICAgICAoOnNlYXJjaC1hcmNoaXZlZCBtKQorICAgICAgICAgICg6Y2FsbGJhY2sgbSkKKyAgICAgICAgICAoLmdldEhlYWRlciBzZXJ2bGV0LXJlcXVlc3QgIk9yaWdpbiIpKSkKKyAgICAgIChjYXRjaCBJbnZhbGlkUmVxdWVzdEV4Y2VwdGlvbiBleAorICAgICAgICAobG9nLWVycm9yIGV4KQorICAgICAgICAoanNvbi1yZXNwb25zZSAoZXhjZXB0aW9uLT5qc29uIGV4KSAoOmNhbGxiYWNrIG0pIDpzdGF0dXMgNDAwKSkpKQorICAoR0VUICIvc2VhcmNoTG9ncyIgWzphcyByZXEgJiBtXQorICAgICh0cnkKKyAgICAgIChsZXQgW3NlcnZsZXQtcmVxdWVzdCAoOnNlcnZsZXQtcmVxdWVzdCByZXEpCisgICAgICAgICAgICB1c2VyICguZ2V0VXNlck5hbWUgaHR0cC1jcmVkcy1oYW5kbGVyIHNlcnZsZXQtcmVxdWVzdCldCisgICAgICAgIChsaXN0LWxvZy1maWxlcyB1c2VyCisgICAgICAgICAgKDp0b3BvSWQgbSkKKyAgICAgICAgICAoOnBvcnQgbSkKKyAgICAgICAgICAoOmxvZy1yb290IHJlcSkKKyAgICAgICAgICAoOmNhbGxiYWNrIG0pCisgICAgICAgICAgKC5nZXRIZWFkZXIgc2VydmxldC1yZXF1ZXN0ICJPcmlnaW4iKSkpCisgICAgICAoY2F0Y2ggSW52YWxpZFJlcXVlc3RFeGNlcHRpb24gZXgKKyAgICAgICAgKGxvZy1lcnJvciBleCkKKyAgICAgICAgKGpzb24tcmVzcG9uc2UgKGV4Y2VwdGlvbi0+anNvbiBleCkgKDpjYWxsYmFjayBtKSA6c3RhdHVzIDQwMCkpKSkKKyAgKEdFVCAiL2xpc3RMb2dzIiBbOmFzIHJlcSAmIG1dCisgICAgKHRyeQorICAgICAgKG1hcmshIGxvZ3ZpZXdlcjpudW0tbGlzdC1sb2dzLWh0dHAtcmVxdWVzdHMpCisgICAgICAobGV0IFtzZXJ2bGV0LXJlcXVlc3QgKDpzZXJ2bGV0LXJlcXVlc3QgcmVxKQorICAgICAgICAgICAgdXNlciAoLmdldFVzZXJOYW1lIGh0dHAtY3JlZHMtaGFuZGxlciBzZXJ2bGV0LXJlcXVlc3QpXQorICAgICAgICAobGlzdC1sb2ctZmlsZXMgdXNlcgorICAgICAgICAgICg6dG9wb0lkIG0pCisgICAgICAgICAgKDpwb3J0IG0pCisgICAgICAgICAgKDpsb2ctcm9vdCByZXEpCisgICAgICAgICAgKDpjYWxsYmFjayBtKQorICAgICAgICAgICguZ2V0SGVhZGVyIHNlcnZsZXQtcmVxdWVzdCAiT3JpZ2luIikpKQorICAgICAgKGNhdGNoIEludmFsaWRSZXF1ZXN0RXhjZXB0aW9uIGV4CisgICAgICAgIChsb2ctZXJyb3IgZXgpCisgICAgICAgIChqc29uLXJlc3BvbnNlIChleGNlcHRpb24tPmpzb24gZXgpICg6Y2FsbGJhY2sgbSkgOnN0YXR1cyA0MDApKSkpCiAgIChyb3V0ZS9yZXNvdXJjZXMgIi8iKQogICAocm91dGUvbm90LWZvdW5kICJQYWdlIG5vdCBmb3VuZCIpKQogCiAoZGVmbiBjb25mLW1pZGRsZXdhcmUKICAgIkZvciBwYXNzaW5nIHRoZSBzdG9ybSBjb25maWd1cmF0aW9uIHdpdGggZWFjaCByZXF1ZXN0LiIKLSAgW2FwcCBsb2ctcm9vdF0KKyAgW2FwcCBsb2ctcm9vdCBkYWVtb25sb2ctcm9vdF0KICAgKGZuIFtyZXFdCi0gICAgKGFwcCAoYXNzb2MgcmVxIDpsb2ctcm9vdCBsb2ctcm9vdCkpKSkKKyAgICAoYXBwIChhc3NvYyByZXEgOmxvZy1yb290IGxvZy1yb290IDpkYWVtb25sb2ctcm9vdCBkYWVtb25sb2ctcm9vdCkpKSkKIAotKGRlZm4gc3RhcnQtbG9ndmlld2VyISBbY29uZiBsb2ctcm9vdC1kaXJdCisoZGVmbiBzdGFydC1sb2d2aWV3ZXIhIFtjb25mIGxvZy1yb290LWRpciBkYWVtb25sb2ctcm9vdC1kaXJdCiAgICh0cnkKICAgICAobGV0IFtoZWFkZXItYnVmZmVyLXNpemUgKGludCAoLmdldCBjb25mIFVJLUhFQURFUi1CVUZGRVItQllURVMpKQogICAgICAgICAgIGZpbHRlci1jbGFzcyAoY29uZiBVSS1GSUxURVIpCiAgICAgICAgICAgZmlsdGVyLXBhcmFtcyAoY29uZiBVSS1GSUxURVItUEFSQU1TKQotICAgICAgICAgIGxvZ2FwcCAoaGFuZGxlci9hcGkgbG9nLXJvdXRlcykgOzsgcXVlcnkgcGFyYW1zIGFzIG1hcAotICAgICAgICAgIG1pZGRsZSAoY29uZi1taWRkbGV3YXJlIGxvZ2FwcCBsb2ctcm9vdC1kaXIpCisgICAgICAgICAgbG9nYXBwIChoYW5kbGVyL2FwaSAoLT4gbG9nLXJvdXRlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0cy1taWRkbGV3YXJlKSkgIDs7IHF1ZXJ5IHBhcmFtcyBhcyBtYXAKKyAgICAgICAgICBtaWRkbGUgKGNvbmYtbWlkZGxld2FyZSBsb2dhcHAgbG9nLXJvb3QtZGlyIGRhZW1vbmxvZy1yb290LWRpcikKICAgICAgICAgICBmaWx0ZXJzLWNvbmZzIChpZiAoY29uZiBVSS1GSUxURVIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFt7OmZpbHRlci1jbGFzcyBmaWx0ZXItY2xhc3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ZmlsdGVyLXBhcmFtcyAob3IgKGNvbmYgVUktRklMVEVSLVBBUkFNUykge30pfV0KQEAgLTQwNiw3ICsxMTc4LDkgQEAKIAogKGRlZm4gLW1haW4gW10KICAgKGxldCBbY29uZiAocmVhZC1zdG9ybS1jb25maWcpCi0gICAgICAgIGxvZy1yb290IChsb2ctcm9vdC1kaXIgKGNvbmYgTE9HVklFV0VSLUFQUEVOREVSLU5BTUUpKV0KKyAgICAgICAgbG9nLXJvb3QgKHdvcmtlci1hcnRpZmFjdHMtcm9vdCBjb25mKQorICAgICAgICBkYWVtb25sb2ctcm9vdCAobG9nLXJvb3QtZGlyIChjb25mIExPR1ZJRVdFUi1BUFBFTkRFUi1OQU1FKSldCiAgICAgKHNldHVwLWRlZmF1bHQtdW5jYXVnaHQtZXhjZXB0aW9uLWhhbmRsZXIpCiAgICAgKHN0YXJ0LWxvZy1jbGVhbmVyISBjb25mIGxvZy1yb290KQotICAgIChzdGFydC1sb2d2aWV3ZXIhIGNvbmYgbG9nLXJvb3QpKSkKKyAgICAoc3RhcnQtbG9ndmlld2VyISBjb25mIGxvZy1yb290IGRhZW1vbmxvZy1yb290KQorICAgIChzdGFydC1tZXRyaWNzLXJlcG9ydGVycykpKQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvY2xqL2JhY2t0eXBlL3N0b3JtL2RhZW1vbi9uaW1idXMuY2xqIGIvc3Rvcm0tY29yZS9zcmMvY2xqL2JhY2t0eXBlL3N0b3JtL2RhZW1vbi9uaW1idXMuY2xqCmluZGV4IDdlYTUxNWIuLjcxZDQ2NTQgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2Nsai9iYWNrdHlwZS9zdG9ybS9kYWVtb24vbmltYnVzLmNsagorKysgYi9zdG9ybS1jb3JlL3NyYy9jbGovYmFja3R5cGUvc3Rvcm0vZGFlbW9uL25pbWJ1cy5jbGoKQEAgLTIwLDcgKzIwLDcgQEAKICAgKDppbXBvcnQgW29yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydCBUTm9uYmxvY2tpbmdTZXJ2ZXJUcmFuc3BvcnQgVE5vbmJsb2NraW5nU2VydmVyU29ja2V0XSkKICAgKDppbXBvcnQgW29yZy5hcGFjaGUuY29tbW9ucy5pbyBGaWxlVXRpbHNdKQogICAoOmltcG9ydCBbamF2YS5uaW8gQnl0ZUJ1ZmZlcl0KLSAgICAgICAgICAgW2phdmEudXRpbCBDb2xsZWN0aW9ucyBIYXNoTWFwXQorICAgICAgICAgICBbamF2YS51dGlsIENvbGxlY3Rpb25zIExpc3QgSGFzaE1hcF0KICAgICAgICAgICAgW2JhY2t0eXBlLnN0b3JtLmdlbmVyYXRlZCBOaW1idXNTdW1tYXJ5XSkKICAgKDppbXBvcnQgW2phdmEuaW8gRmlsZU5vdEZvdW5kRXhjZXB0aW9uIEZpbGUgRmlsZU91dHB1dFN0cmVhbV0pCiAgICg6aW1wb3J0IFtqYXZhLm5ldCBJbmV0QWRkcmVzc10pCkBAIC0zNCwxOSArMzQsNTcgQEAKICAgICAgICAgICAgIEJ1ZmZlckZpbGVJbnB1dFN0cmVhbV0pCiAgICg6aW1wb3J0IFtiYWNrdHlwZS5zdG9ybS5nZW5lcmF0ZWQgTm90QWxpdmVFeGNlcHRpb24gQWxyZWFkeUFsaXZlRXhjZXB0aW9uIFN0b3JtVG9wb2xvZ3kgRXJyb3JJbmZvCiAgICAgICAgICAgICBFeGVjdXRvckluZm8gSW52YWxpZFRvcG9sb2d5RXhjZXB0aW9uIE5pbWJ1cyRJZmFjZSBOaW1idXMkUHJvY2Vzc29yIFN1Ym1pdE9wdGlvbnMgVG9wb2xvZ3lJbml0aWFsU3RhdHVzCi0gICAgICAgICAgICBLaWxsT3B0aW9ucyBSZWJhbGFuY2VPcHRpb25zIENsdXN0ZXJTdW1tYXJ5IFN1cGVydmlzb3JTdW1tYXJ5IFRvcG9sb2d5U3VtbWFyeSBUb3BvbG9neUluZm8KLSAgICAgICAgICAgIEV4ZWN1dG9yU3VtbWFyeSBBdXRob3JpemF0aW9uRXhjZXB0aW9uIEdldEluZm9PcHRpb25zIE51bUVycm9yc0Nob2ljZV0pCisgICAgICAgICAgICBLaWxsT3B0aW9ucyBSZWJhbGFuY2VPcHRpb25zIENsdXN0ZXJTdW1tYXJ5IFN1cGVydmlzb3JTdW1tYXJ5IFRvcG9sb2d5U3VtbWFyeSBUb3BvbG9neUluZm8gVG9wb2xvZ3lIaXN0b3J5SW5mbworICAgICAgICAgICAgRXhlY3V0b3JTdW1tYXJ5IEF1dGhvcml6YXRpb25FeGNlcHRpb24gR2V0SW5mb09wdGlvbnMgTnVtRXJyb3JzQ2hvaWNlCisgICAgICAgICAgICBDb21wb25lbnRQYWdlSW5mbyBUb3BvbG9neVBhZ2VJbmZvIExvZ0NvbmZpZyBMb2dMZXZlbCBMb2dMZXZlbEFjdGlvbgorICAgICAgICAgICAgUHJvZmlsZVJlcXVlc3QgUHJvZmlsZUFjdGlvbiBOb2RlSW5mb10pCiAgICg6aW1wb3J0IFtiYWNrdHlwZS5zdG9ybS5kYWVtb24gU2h1dGRvd25hYmxlXSkKLSAgKDp1c2UgW2JhY2t0eXBlLnN0b3JtIHV0aWwgY29uZmlnIGxvZyB0aW1lciB6b29rZWVwZXJdKQotICAoOnJlcXVpcmUgW2JhY2t0eXBlLnN0b3JtIFtjbHVzdGVyIDphcyBjbHVzdGVyXSBbc3RhdHMgOmFzIHN0YXRzXSBbY29udmVydGVyIDphcyBjb252ZXJ0ZXJdXSkKKyAgKDp1c2UgW2JhY2t0eXBlLnN0b3JtIHV0aWwgY29uZmlnIGxvZyB0aW1lciB6b29rZWVwZXIgbG9jYWwtc3RhdGVdKQorICAoOnJlcXVpcmUgW2JhY2t0eXBlLnN0b3JtIFtjbHVzdGVyIDphcyBjbHVzdGVyXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjb252ZXJ0ZXIgOmFzIGNvbnZlcnRlcl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbc3RhdHMgOmFzIHN0YXRzXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0dXBsZSA6YXMgdHVwbGVdXSkKICAgKDpyZXF1aXJlIFtjbG9qdXJlLnNldCA6YXMgc2V0XSkKICAgKDppbXBvcnQgW2JhY2t0eXBlLnN0b3JtLmRhZW1vbi5jb21tb24gU3Rvcm1CYXNlIEFzc2lnbm1lbnRdKQogICAoOnVzZSBbYmFja3R5cGUuc3Rvcm0uZGFlbW9uIGNvbW1vbl0pCiAgICg6aW1wb3J0IFtvcmcuYXBhY2hlLnpvb2tlZXBlciBkYXRhLkFDTCBab29EZWZzJElkcyBab29EZWZzJFBlcm1zXSkKICAgKDppbXBvcnQgW2JhY2t0eXBlLnN0b3JtLnV0aWxzIFZlcnNpb25JbmZvXSkKKyAgKDpyZXF1aXJlIFtjbGotdGltZS5jb3JlIDphcyB0aW1lXSkKKyAgKDpyZXF1aXJlIFtjbGotdGltZS5jb2VyY2UgOmFzIGNvZXJjZV0pCisgICg6cmVxdWlyZSBbbWV0cmljcy5tZXRlcnMgOnJlZmVyIFtkZWZtZXRlciBtYXJrIV1dKQorICAoOnJlcXVpcmUgW21ldHJpY3MuZ2F1Z2VzIDpyZWZlciBbZGVmZ2F1Z2VdXSkKICAgKDpnZW4tY2xhc3MKICAgICA6bWV0aG9kcyBbXns6c3RhdGljIHRydWV9IFtsYXVuY2ggW2JhY2t0eXBlLnN0b3JtLnNjaGVkdWxlci5JTmltYnVzXSB2b2lkXV0pKQogCisoZGVmbWV0ZXIgbmltYnVzOm51bS1zdWJtaXRUb3BvbG9neVdpdGhPcHRzLWNhbGxzKQorKGRlZm1ldGVyIG5pbWJ1czpudW0tc3VibWl0VG9wb2xvZ3ktY2FsbHMpCisoZGVmbWV0ZXIgbmltYnVzOm51bS1raWxsVG9wb2xvZ3lXaXRoT3B0cy1jYWxscykKKyhkZWZtZXRlciBuaW1idXM6bnVtLWtpbGxUb3BvbG9neS1jYWxscykKKyhkZWZtZXRlciBuaW1idXM6bnVtLXJlYmFsYW5jZS1jYWxscykKKyhkZWZtZXRlciBuaW1idXM6bnVtLWFjdGl2YXRlLWNhbGxzKQorKGRlZm1ldGVyIG5pbWJ1czpudW0tZGVhY3RpdmF0ZS1jYWxscykKKyhkZWZtZXRlciBuaW1idXM6bnVtLWRlYnVnLWNhbGxzKQorKGRlZm1ldGVyIG5pbWJ1czpudW0tc2V0V29ya2VyUHJvZmlsZXItY2FsbHMpCisoZGVmbWV0ZXIgbmltYnVzOm51bS1nZXRDb21wb25lbnRQZW5kaW5nUHJvZmlsZUFjdGlvbnMtY2FsbHMpCisoZGVmbWV0ZXIgbmltYnVzOm51bS1zZXRMb2dDb25maWctY2FsbHMpCisoZGVmbWV0ZXIgbmltYnVzOm51bS11cGxvYWROZXdDcmVkZW50aWFscy1jYWxscykKKyhkZWZtZXRlciBuaW1idXM6bnVtLWJlZ2luRmlsZVVwbG9hZC1jYWxscykKKyhkZWZtZXRlciBuaW1idXM6bnVtLXVwbG9hZENodW5rLWNhbGxzKQorKGRlZm1ldGVyIG5pbWJ1czpudW0tZmluaXNoRmlsZVVwbG9hZC1jYWxscykKKyhkZWZtZXRlciBuaW1idXM6bnVtLWJlZ2luRmlsZURvd25sb2FkLWNhbGxzKQorKGRlZm1ldGVyIG5pbWJ1czpudW0tZG93bmxvYWRDaHVuay1jYWxscykKKyhkZWZtZXRlciBuaW1idXM6bnVtLWdldE5pbWJ1c0NvbmYtY2FsbHMpCisoZGVmbWV0ZXIgbmltYnVzOm51bS1nZXRMb2dDb25maWctY2FsbHMpCisoZGVmbWV0ZXIgbmltYnVzOm51bS1nZXRUb3BvbG9neUNvbmYtY2FsbHMpCisoZGVmbWV0ZXIgbmltYnVzOm51bS1nZXRUb3BvbG9neS1jYWxscykKKyhkZWZtZXRlciBuaW1idXM6bnVtLWdldFVzZXJUb3BvbG9neS1jYWxscykKKyhkZWZtZXRlciBuaW1idXM6bnVtLWdldENsdXN0ZXJJbmZvLWNhbGxzKQorKGRlZm1ldGVyIG5pbWJ1czpudW0tZ2V0VG9wb2xvZ3lJbmZvV2l0aE9wdHMtY2FsbHMpCisoZGVmbWV0ZXIgbmltYnVzOm51bS1nZXRUb3BvbG9neUluZm8tY2FsbHMpCisoZGVmbWV0ZXIgbmltYnVzOm51bS1nZXRUb3BvbG9neVBhZ2VJbmZvLWNhbGxzKQorKGRlZm1ldGVyIG5pbWJ1czpudW0tZ2V0Q29tcG9uZW50UGFnZUluZm8tY2FsbHMpCisoZGVmbWV0ZXIgbmltYnVzOm51bS1zaHV0ZG93bi1jYWxscykKKwogKGRlZm4gZmlsZS1jYWNoZS1tYXAgW2NvbmZdCiAgIChUaW1lQ2FjaGVNYXAuCiAgICAoaW50IChjb25mIE5JTUJVUy1GSUxFLUNPUFktRVhQSVJBVElPTi1TRUNTKSkKQEAgLTg4LDYgKzEyNiwxNSBAQAogICBbKGZpcnN0IFpvb0RlZnMkSWRzL0NSRUFUT1JfQUxMX0FDTCkgCiAgICAoQUNMLiAoYml0LW9yIFpvb0RlZnMkUGVybXMvUkVBRCBab29EZWZzJFBlcm1zL0NSRUFURSkgWm9vRGVmcyRJZHMvQU5ZT05FX0lEX1VOU0FGRSldKQogCisoZGVmbiBjcmVhdGUtdG9sb2d5LWFjdGlvbi1ub3RpZmllciBbY29uZl0KKyAgKHdoZW4tbm90IChjbG9qdXJlLnN0cmluZy9ibGFuaz8gKGNvbmYgTklNQlVTLVRPUE9MT0dZLUFDVElPTi1OT1RJRklFUi1QTFVHSU4pKQorICAgIChsZXQgW2luc3RhbmNlIChuZXctaW5zdGFuY2UgKGNvbmYgTklNQlVTLVRPUE9MT0dZLUFDVElPTi1OT1RJRklFUi1QTFVHSU4pKV0KKyAgICAgICh0cnkKKyAgICAgICAgKC5wcmVwYXJlIGluc3RhbmNlIGNvbmYpCisgICAgICAgIGluc3RhbmNlCisgICAgICAgIChjYXRjaCBFeGNlcHRpb24gZQorICAgICAgICAgIChsb2ctd2Fybi1lcnJvciBlICJJbmdvcmluZyBleGNlcHRpb24sIENvdWxkIG5vdCBpbml0aWFsaXplICIgKGNvbmYgTklNQlVTLVRPUE9MT0dZLUFDVElPTi1OT1RJRklFUi1QTFVHSU4pKSkpKSkpCisKIChkZWZuIG5pbWJ1cy1kYXRhIFtjb25mIGluaW1idXNdCiAgIChsZXQgW2ZvcmNlZC1zY2hlZHVsZXIgKC5nZXRGb3JjZWRTY2hlZHVsZXIgaW5pbWJ1cyldCiAgICAgezpjb25mIGNvbmYKQEAgLTk5LDkgKzE0NiwxMCBAQAogICAgICA6c3Rvcm0tY2x1c3Rlci1zdGF0ZSAoY2x1c3Rlci9tay1zdG9ybS1jbHVzdGVyLXN0YXRlIGNvbmYgOmFjbHMgKHdoZW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFV0aWxzL2lzWmtBdXRoZW50aWNhdGlvbkNvbmZpZ3VyZWRTdG9ybVNlcnZlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmYpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5JTUJVUy1aSy1BQ0xTKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTklNQlVTLVpLLUFDTFMpIDpzZXBhcmF0ZS16ay13cml0ZXI/IHRydWUpCiAgICAgIDpzdWJtaXQtbG9jayAoT2JqZWN0LikKICAgICAgOmNyZWQtdXBkYXRlLWxvY2sgKE9iamVjdC4pCisgICAgIDpsb2ctdXBkYXRlLWxvY2sgKE9iamVjdC4pCiAgICAgIDpoZWFydGJlYXRzLWNhY2hlIChhdG9tIHt9KQogICAgICA6ZG93bmxvYWRlcnMgKGZpbGUtY2FjaGUtbWFwIGNvbmYpCiAgICAgIDp1cGxvYWRlcnMgKGZpbGUtY2FjaGUtbWFwIGNvbmYpCkBAIC0xMTUsOCArMTYzLDEzIEBACiAgICAgIDpsZWFkZXItZWxlY3RvciAoemstbGVhZGVyLWVsZWN0b3IgY29uZikKICAgICAgOmNvZGUtZGlzdHJpYnV0b3IgKG1rLWNvZGUtZGlzdHJpYnV0b3IgY29uZikKICAgICAgOmlkLT5zY2hlZC1zdGF0dXMgKGF0b20ge30pCisgICAgIDpub2RlLWlkLT5yZXNvdXJjZXMgKGF0b20ge30pIDs7cmVzb3VyY2VzIG9mIHN1cGVydmlzb3JzCisgICAgIDppZC0+cmVzb3VyY2VzIChhdG9tIHt9KSA7O3Jlc291cmNlcyBvZiB0b3BvbG9naWVzCiAgICAgIDpjcmVkLXJlbmV3ZXJzIChBdXRoVXRpbHMvR2V0Q3JlZGVudGlhbFJlbmV3ZXJzIGNvbmYpCisgICAgIDp0b3BvbG9neS1oaXN0b3J5LWxvY2sgKE9iamVjdC4pCisgICAgIDp0b3BvLWhpc3Rvcnktc3RhdGUgKG5pbWJ1cy10b3BvLWhpc3Rvcnktc3RhdGUgY29uZikKICAgICAgOm5pbWJ1cy1hdXRvY3JlZC1wbHVnaW5zIChBdXRoVXRpbHMvZ2V0TmltYnVzQXV0b0NyZWRQbHVnaW5zIGNvbmYpCisgICAgIDpuaW1idXMtdG9wb2xvZ3ktYWN0aW9uLW5vdGlmaWVyIChjcmVhdGUtdG9sb2d5LWFjdGlvbi1ub3RpZmllciBjb25mKQogICAgICB9KSkKIAogKGRlZm4gaW5ib3ggW25pbWJ1c10KQEAgLTMyNiw3ICszNzksNyBAQAogICAgICAgICBzdXBlcnZpc29yLWluZm9zIChhbGwtc3VwZXJ2aXNvci1pbmZvIHN0b3JtLWNsdXN0ZXItc3RhdGUgbmlsKQogCiAgICAgICAgIHN1cGVydmlzb3ItZGV0YWlscyAoZG9mb3IgW1tpZCBpbmZvXSBzdXBlcnZpc29yLWluZm9zXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3VwZXJ2aXNvckRldGFpbHMuIGlkICg6bWV0YSBpbmZvKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTdXBlcnZpc29yRGV0YWlscy4gaWQgKDptZXRhIGluZm8pICg6cmVzb3VyY2VzLW1hcCBpbmZvKSkpCiAKICAgICAgICAgcmV0ICguYWxsU2xvdHNBdmFpbGFibGVGb3JTY2hlZHVsaW5nIGluaW1idXMKICAgICAgICAgICAgICAgICAgICAgIHN1cGVydmlzb3ItZGV0YWlscwpAQCAtNTM4LDEyICs1OTEsMjEgQEAKICAgKGludG8ge30gKGZvciBbW3RpZCBhc3NpZ25tZW50XSBleGlzdGluZy1hc3NpZ25tZW50cwogICAgICAgICAgICAgICAgICA6bGV0IFthbGl2ZS1leGVjdXRvcnMgKHRvcG9sb2d5LT5hbGl2ZS1leGVjdXRvcnMgdGlkKQogICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRvci0+bm9kZStwb3J0ICg6ZXhlY3V0b3ItPm5vZGUrcG9ydCBhc3NpZ25tZW50KQorICAgICAgICAgICAgICAgICAgICAgICB3b3JrZXItPnJlc291cmNlcyAoOndvcmtlci0+cmVzb3VyY2VzIGFzc2lnbm1lbnQpCisgICAgICAgICAgICAgICAgICAgICAgIDs7IG1ha2luZyBhIG1hcCBmcm9tIG5vZGUrcG9ydCB0byBXb3JrZXJTbG90IHdpdGggYWxsb2NhdGVkIHJlc291cmNlcworICAgICAgICAgICAgICAgICAgICAgICBub2RlK3BvcnQtPnNsb3QgKGludG8ge30gKGZvciBbW1tub2RlIHBvcnRdIFttZW0tb24taGVhcCBtZW0tb2ZmLWhlYXAgY3B1XV0gd29ya2VyLT5yZXNvdXJjZXNdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtbbm9kZSBwb3J0XQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRvdG8gKFdvcmtlclNsb3QuIG5vZGUgcG9ydCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC5hbGxvY2F0ZVJlc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtLW9uLWhlYXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW0tb2ZmLWhlYXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcHUpKX0pKQogICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRvci0+c2xvdCAoaW50byB7fSAoZm9yIFtbZXhlY3V0b3IgW25vZGUgcG9ydF1dIGV4ZWN1dG9yLT5ub2RlK3BvcnRdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsgZmlsdGVyIG91dCB0aGUgZGVhZCBleGVjdXRvcnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaWYgKGNvbnRhaW5zPyBhbGl2ZS1leGVjdXRvcnMgZXhlY3V0b3IpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KEV4ZWN1dG9yRGV0YWlscy4gKGZpcnN0IGV4ZWN1dG9yKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWNvbmQgZXhlY3V0b3IpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChXb3JrZXJTbG90LiBub2RlIHBvcnQpfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnZXQgbm9kZStwb3J0LT5zbG90IFtub2RlIHBvcnRdKX0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt9KSkpXV0KICAgICAgICAgICAgICB7dGlkIChTY2hlZHVsZXJBc3NpZ25tZW50SW1wbC4gdGlkIGV4ZWN1dG9yLT5zbG90KX0pKSkKIApAQCAtNTYxLDcgKzYyMyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsLXBvcnRzICgtPiAoZ2V0IGFsbC1zY2hlZHVsaW5nLXNsb3RzIHNpZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZXQvZGlmZmVyZW5jZSBkZWFkLXBvcnRzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChmbiBbcG9ydHNdIChtYXAgaW50IHBvcnRzKSkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVydmlzb3ItZGV0YWlscyAoU3VwZXJ2aXNvckRldGFpbHMuIHNpZCBob3N0bmFtZSBzY2hlZHVsZXItbWV0YSBhbGwtcG9ydHMpXV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBlcnZpc29yLWRldGFpbHMgKFN1cGVydmlzb3JEZXRhaWxzLiBzaWQgaG9zdG5hbWUgc2NoZWR1bGVyLW1ldGEgYWxsLXBvcnRzICg6cmVzb3VyY2VzLW1hcCBzdXBlcnZpc29yLWluZm8pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c2lkIHN1cGVydmlzb3ItZGV0YWlsc30pKV0KICAgICAobWVyZ2UgYWxsLXN1cGVydmlzb3ItZGV0YWlscwogICAgICAgICAgICAoaW50byB7fQpAQCAtNjA2LDggKzY2OSw0MiBAQAogICAgIChjb3VudCAoLmdldFNsb3RzIHNjaGVkdWxlci1hc3NpZ25tZW50KSkKICAgICAwICkpCiAKKyhkZWZuIGNvbnZlcnQtYXNzaWdubWVudHMtdG8td29ya2VyLT5yZXNvdXJjZXMgW25ldy1zY2hlZHVsZXItYXNzaWdubWVudHNdCisgICJjb252ZXJ0IHt0b3BvbG9neS1pZCAtPiBTY2hlZHVsZXJBc3NpZ25tZW50fSB0bworICAgICAgICAgICB7dG9wb2xvZ3ktaWQgLT4ge1tub2RlIHBvcnRdIFttZW0tb24taGVhcCBtZW0tb2ZmLWhlYXAgY3B1XX19CisgICBNYWtlIHN1cmUgdGhpcyBjYW4gZGVhbCB3aXRoIG90aGVyIG5vbi1SQVMgc2NoZWR1bGVycworICAgbGF0ZXIgd2UgbWF5IGZ1cnRoZXIgc3VwcG9ydCBtYXAtZm9yLWFueS1yZXNvdXJjZXMiCisgIChtYXAtdmFsIChmbiBbXlNjaGVkdWxlckFzc2lnbm1lbnQgYXNzaWdubWVudF0KKyAgICAgICAgICAgICAoLT4+IGFzc2lnbm1lbnQKKyAgICAgICAgICAgICAgICAgIC5nZXRFeGVjdXRvclRvU2xvdAorICAgICAgICAgICAgICAgICAgLnZhbHVlcworICAgICAgICAgICAgICAgICAgKCMoaW50byB7fSAoZm9yIFteV29ya2VyU2xvdCBzbG90ICVdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7WyguZ2V0Tm9kZUlkIHNsb3QpICguZ2V0UG9ydCBzbG90KV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKC5nZXRBbGxvY2F0ZWRNZW1PbkhlYXAgc2xvdCkgKC5nZXRBbGxvY2F0ZWRNZW1PZmZIZWFwIHNsb3QpICguZ2V0QWxsb2NhdGVkQ3B1IHNsb3QpXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSkpKQorICAgICAgICAgICBuZXctc2NoZWR1bGVyLWFzc2lnbm1lbnRzKSkKKworKGRlZm4gY29tcHV0ZS1uZXctdG9wb2xvZ3ktPmV4ZWN1dG9yLT5ub2RlK3BvcnQgW25ldy1zY2hlZHVsZXItYXNzaWdubWVudHMgZXhpc3RpbmctYXNzaWdubWVudHNdCisgIChsZXQgW25ldy10b3BvbG9neS0+ZXhlY3V0b3ItPm5vZGUrcG9ydCAoY29tcHV0ZS10b3BvbG9neS0+ZXhlY3V0b3ItPm5vZGUrcG9ydCBuZXctc2NoZWR1bGVyLWFzc2lnbm1lbnRzKV0KKyAgICA7OyBwcmludCBzb21lIHVzZWZ1bCBpbmZvcm1hdGlvbi4KKyAgICAoZG9zZXEgW1t0b3BvbG9neS1pZCBleGVjdXRvci0+bm9kZStwb3J0XSBuZXctdG9wb2xvZ3ktPmV4ZWN1dG9yLT5ub2RlK3BvcnQKKyAgICAgICAgICAgIDpsZXQgW29sZC1leGVjdXRvci0+bm9kZStwb3J0ICgtPiB0b3BvbG9neS1pZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLWFzc2lnbm1lbnRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmV4ZWN1dG9yLT5ub2RlK3BvcnQpCisgICAgICAgICAgICAgICAgICByZWFzc2lnbm1lbnQgKGZpbHRlciAoZm4gW1tleGVjdXRvciBub2RlK3BvcnRdXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYW5kIChjb250YWlucz8gb2xkLWV4ZWN1dG9yLT5ub2RlK3BvcnQgZXhlY3V0b3IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5vdCAoPSBub2RlK3BvcnQgKG9sZC1leGVjdXRvci0+bm9kZStwb3J0IGV4ZWN1dG9yKSkpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dG9yLT5ub2RlK3BvcnQpXV0KKyAgICAgICh3aGVuLW5vdCAoZW1wdHk/IHJlYXNzaWdubWVudCkKKyAgICAgICAgKGxldCBbbmV3LXNsb3RzLWNudCAoY291bnQgKHNldCAodmFscyBleGVjdXRvci0+bm9kZStwb3J0KSkpCisgICAgICAgICAgICAgIHJlYXNzaWduLWV4ZWN1dG9ycyAoa2V5cyByZWFzc2lnbm1lbnQpXQorICAgICAgICAgIChsb2ctbWVzc2FnZSAiUmVhc3NpZ25pbmcgIiB0b3BvbG9neS1pZCAiIHRvICIgbmV3LXNsb3RzLWNudCAiIHNsb3RzIikKKyAgICAgICAgICAobG9nLW1lc3NhZ2UgIlJlYXNzaWduIGV4ZWN1dG9yczogIiAodmVjIHJlYXNzaWduLWV4ZWN1dG9ycykpKSkpCisKKyAgICBuZXctdG9wb2xvZ3ktPmV4ZWN1dG9yLT5ub2RlK3BvcnQpKQorCiA7OyBwdWJsaWMgc28gaXQgY2FuIGJlIG1vY2tlZCBvdXQKLShkZWZuIGNvbXB1dGUtbmV3LXRvcG9sb2d5LT5leGVjdXRvci0+bm9kZStwb3J0IFtuaW1idXMgZXhpc3RpbmctYXNzaWdubWVudHMgdG9wb2xvZ2llcyBzY3JhdGNoLXRvcG9sb2d5LWlkXQorKGRlZm4gY29tcHV0ZS1uZXctc2NoZWR1bGVyLWFzc2lnbm1lbnRzIFtuaW1idXMgZXhpc3RpbmctYXNzaWdubWVudHMgdG9wb2xvZ2llcyBzY3JhdGNoLXRvcG9sb2d5LWlkXQogICAobGV0IFtjb25mICg6Y29uZiBuaW1idXMpCiAgICAgICAgIHN0b3JtLWNsdXN0ZXItc3RhdGUgKDpzdG9ybS1jbHVzdGVyLXN0YXRlIG5pbWJ1cykKICAgICAgICAgdG9wb2xvZ3ktPmV4ZWN1dG9ycyAoY29tcHV0ZS10b3BvbG9neS0+ZXhlY3V0b3JzIG5pbWJ1cyAoa2V5cyBleGlzdGluZy1hc3NpZ25tZW50cykpCkBAIC02MzAsNDYgKzcyNywzMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRUb3BvbG9naWVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hcCAobWVtZm4gZ2V0SWQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaWx0ZXIgKGZuIFt0XQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxldCBbYWxsZSAoZ2V0IHRvcG9sb2d5LT5leGVjdXRvcnMgdCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaXZlZSAoZ2V0IHRvcG9sb2d5LT5hbGl2ZS1leGVjdXRvcnMgdCldCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3IgKGVtcHR5PyBhbGxlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChub3Q9IGFsbGUgYWxpdmVlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg8ICgtPiB0b3BvbG9neS0+c2NoZWR1bGVyLWFzc2lnbm1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdldCB0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW0tdXNlZC13b3JrZXJzICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLT4gdG9wb2xvZ2llcyAoLmdldEJ5SWQgdCkgLmdldE51bVdvcmtlcnMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxldCBbYWxsZSAoZ2V0IHRvcG9sb2d5LT5leGVjdXRvcnMgdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpdmVlIChnZXQgdG9wb2xvZ3ktPmFsaXZlLWV4ZWN1dG9ycyB0KV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3IgKGVtcHR5PyBhbGxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobm90PSBhbGxlIGFsaXZlZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDwgKC0+IHRvcG9sb2d5LT5zY2hlZHVsZXItYXNzaWdubWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdldCB0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtLXVzZWQtd29ya2VycyApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtPiB0b3BvbG9naWVzICguZ2V0QnlJZCB0KSAuZ2V0TnVtV29ya2VycykpKSkpKSkKICAgICAgICAgYWxsLXNjaGVkdWxpbmctc2xvdHMgKC0+PiAoYWxsLXNjaGVkdWxpbmctc2xvdHMgbmltYnVzIHRvcG9sb2dpZXMgbWlzc2luZy1hc3NpZ25tZW50LXRvcG9sb2dpZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hcCAoZm4gW1tub2RlLWlkIHBvcnRdXSB7bm9kZS1pZCAje3BvcnR9fSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFwcGx5IG1lcmdlLXdpdGggc2V0L3VuaW9uKSkKIAogICAgICAgICBzdXBlcnZpc29ycyAocmVhZC1hbGwtc3VwZXJ2aXNvci1kZXRhaWxzIG5pbWJ1cyBhbGwtc2NoZWR1bGluZy1zbG90cyBzdXBlcnZpc29yLT5kZWFkLXBvcnRzKQotICAgICAgICBjbHVzdGVyIChDbHVzdGVyLiAoOmluaW1idXMgbmltYnVzKSBzdXBlcnZpc29ycyB0b3BvbG9neS0+c2NoZWR1bGVyLWFzc2lnbm1lbnQpCisgICAgICAgIGNsdXN0ZXIgKENsdXN0ZXIuICg6aW5pbWJ1cyBuaW1idXMpIHN1cGVydmlzb3JzIHRvcG9sb2d5LT5zY2hlZHVsZXItYXNzaWdubWVudCBjb25mKQogCiAgICAgICAgIDs7IGNhbGwgc2NoZWR1bGVyLnNjaGVkdWxlIHRvIHNjaGVkdWxlIGFsbCB0aGUgdG9wb2xvZ2llcwogICAgICAgICA7OyB0aGUgbmV3IGFzc2lnbm1lbnRzIGZvciBhbGwgdGhlIHRvcG9sb2dpZXMgYXJlIGluIHRoZSBjbHVzdGVyIG9iamVjdC4KICAgICAgICAgXyAoLnNjaGVkdWxlICg6c2NoZWR1bGVyIG5pbWJ1cykgdG9wb2xvZ2llcyBjbHVzdGVyKQotICAgICAgICBuZXctc2NoZWR1bGVyLWFzc2lnbm1lbnRzICguZ2V0QXNzaWdubWVudHMgY2x1c3RlcikKLSAgICAgICAgOzsgYWRkIG1vcmUgaW5mb3JtYXRpb24gdG8gY29udmVydCBTY2hlZHVsZXJBc3NpZ25tZW50IHRvIEFzc2lnbm1lbnQKLSAgICAgICAgbmV3LXRvcG9sb2d5LT5leGVjdXRvci0+bm9kZStwb3J0IChjb21wdXRlLXRvcG9sb2d5LT5leGVjdXRvci0+bm9kZStwb3J0IG5ldy1zY2hlZHVsZXItYXNzaWdubWVudHMpXQotICAgIChyZXNldCEgKDppZC0+c2NoZWQtc3RhdHVzIG5pbWJ1cykgKC5nZXRTdGF0dXNNYXAgY2x1c3RlcikpCi0gICAgOzsgcHJpbnQgc29tZSB1c2VmdWwgaW5mb3JtYXRpb24uCi0gICAgKGRvc2VxIFtbdG9wb2xvZ3ktaWQgZXhlY3V0b3ItPm5vZGUrcG9ydF0gbmV3LXRvcG9sb2d5LT5leGVjdXRvci0+bm9kZStwb3J0Ci0gICAgICAgICAgICA6bGV0IFtvbGQtZXhlY3V0b3ItPm5vZGUrcG9ydCAoLT4gdG9wb2xvZ3ktaWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLWFzc2lnbm1lbnRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ZXhlY3V0b3ItPm5vZGUrcG9ydCkKLSAgICAgICAgICAgICAgICAgIHJlYXNzaWdubWVudCAoZmlsdGVyIChmbiBbW2V4ZWN1dG9yIG5vZGUrcG9ydF1dCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbmQgKGNvbnRhaW5zPyBvbGQtZXhlY3V0b3ItPm5vZGUrcG9ydCBleGVjdXRvcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobm90ICg9IG5vZGUrcG9ydCAob2xkLWV4ZWN1dG9yLT5ub2RlK3BvcnQgZXhlY3V0b3IpKSkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0b3ItPm5vZGUrcG9ydCldXQotICAgICAgKHdoZW4tbm90IChlbXB0eT8gcmVhc3NpZ25tZW50KQotICAgICAgICAobGV0IFtuZXctc2xvdHMtY250IChjb3VudCAoc2V0ICh2YWxzIGV4ZWN1dG9yLT5ub2RlK3BvcnQpKSkKLSAgICAgICAgICAgICAgcmVhc3NpZ24tZXhlY3V0b3JzIChrZXlzIHJlYXNzaWdubWVudCldCi0gICAgICAgICAgKGxvZy1tZXNzYWdlICJSZWFzc2lnbmluZyAiIHRvcG9sb2d5LWlkICIgdG8gIiBuZXctc2xvdHMtY250ICIgc2xvdHMiKQotICAgICAgICAgIChsb2ctbWVzc2FnZSAiUmVhc3NpZ24gZXhlY3V0b3JzOiAiICh2ZWMgcmVhc3NpZ24tZXhlY3V0b3JzKSkpKSkKLQotICAgIG5ldy10b3BvbG9neS0+ZXhlY3V0b3ItPm5vZGUrcG9ydCkpCisgICAgICAgIF8gKC5zZXRSZXNvdXJjZXNNYXAgY2x1c3RlciBAKDppZC0+cmVzb3VyY2VzIG5pbWJ1cykpCisgICAgICAgIF8gKGlmLW5vdCAoY29uZiBTQ0hFRFVMRVItRElTUExBWS1SRVNPVVJDRSkgKC51cGRhdGVBc3NpZ25lZE1lbW9yeUZvclRvcG9sb2d5QW5kU3VwZXJ2aXNvciBjbHVzdGVyIHRvcG9sb2dpZXMpKQorICAgICAgICBfIChyZXNldCEgKDppZC0+c2NoZWQtc3RhdHVzIG5pbWJ1cykgKC5nZXRTdGF0dXNNYXAgY2x1c3RlcikpCisgICAgICAgIF8gKHJlc2V0ISAoOm5vZGUtaWQtPnJlc291cmNlcyBuaW1idXMpICguZ2V0U3VwZXJ2aXNvcnNSZXNvdXJjZXNNYXAgY2x1c3RlcikpCisgICAgICAgIF8gKHJlc2V0ISAoOmlkLT5yZXNvdXJjZXMgbmltYnVzKSAoLmdldFJlc291cmNlc01hcCBjbHVzdGVyKSldCisgICAgKC5nZXRBc3NpZ25tZW50cyBjbHVzdGVyKSkpCiAKIChkZWZuIGNoYW5nZWQtZXhlY3V0b3JzIFtleGVjdXRvci0+bm9kZStwb3J0IG5ldy1leGVjdXRvci0+bm9kZStwb3J0XQogICAobGV0IFtleGVjdXRvci0+bm9kZStwb3J0IChpZiBleGVjdXRvci0+bm9kZStwb3J0IChzb3J0IGV4ZWN1dG9yLT5ub2RlK3BvcnQpIG5pbCkKQEAgLTY5NCw3ICs3NzUsNyBAQAogICAobGV0IFtpbmZvcyAoYWxsLXN1cGVydmlzb3ItaW5mbyBzdG9ybS1jbHVzdGVyLXN0YXRlKV0KICAgICAoLT4+IGluZm9zCiAgICAgICAgICAobWFwIChmbiBbW2lkIGluZm9dXQotICAgICAgICAgICAgICAgICBbaWQgKFN1cGVydmlzb3JEZXRhaWxzLiBpZCAoOmhvc3RuYW1lIGluZm8pICg6c2NoZWR1bGVyLW1ldGEgaW5mbykgbmlsKV0pKQorICAgICAgICAgICAgICAgICBbaWQgKFN1cGVydmlzb3JEZXRhaWxzLiBpZCAoOmhvc3RuYW1lIGluZm8pICg6c2NoZWR1bGVyLW1ldGEgaW5mbykgbmlsICg6cmVzb3VyY2VzLW1hcCBpbmZvKSldKSkKICAgICAgICAgIChpbnRvIHt9KSkpKQogCiAoZGVmbi0gdG8td29ya2VyLXNsb3QgW1tub2RlIHBvcnRdXQpAQCAtNzI0LDE0ICs4MDUsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2hlbiAob3IgKG5pbD8gc2NyYXRjaC10b3BvbG9neS1pZCkgKG5vdD0gdGlkIHNjcmF0Y2gtdG9wb2xvZ3ktaWQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3RpZCAoLmFzc2lnbm1lbnQtaW5mbyBzdG9ybS1jbHVzdGVyLXN0YXRlIHRpZCBuaWwpfSkpKQogICAgICAgICA7OyBtYWtlIHRoZSBuZXcgYXNzaWdubWVudHMgZm9yIHRvcG9sb2dpZXMKLSAgICAgICAgdG9wb2xvZ3ktPmV4ZWN1dG9yLT5ub2RlK3BvcnQgKGNvbXB1dGUtbmV3LXRvcG9sb2d5LT5leGVjdXRvci0+bm9kZStwb3J0CisgICAgICAgIG5ldy1zY2hlZHVsZXItYXNzaWdubWVudHMgKGNvbXB1dGUtbmV3LXNjaGVkdWxlci1hc3NpZ25tZW50cwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmltYnVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZy1hc3NpZ25tZW50cwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wb2xvZ2llcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyYXRjaC10b3BvbG9neS1pZCkKIAotICAgICAgICB0b3BvbG9neS0+ZXhlY3V0b3ItPm5vZGUrcG9ydCAobWVyZ2UgKGludG8ge30gKGZvciBbaWQgYXNzaWduZWQtdG9wb2xvZ3ktaWRzXSB7aWQgbmlsfSkpIHRvcG9sb2d5LT5leGVjdXRvci0+bm9kZStwb3J0KQorICAgICAgICB0b3BvbG9neS0+ZXhlY3V0b3ItPm5vZGUrcG9ydCAoY29tcHV0ZS1uZXctdG9wb2xvZ3ktPmV4ZWN1dG9yLT5ub2RlK3BvcnQgbmV3LXNjaGVkdWxlci1hc3NpZ25tZW50cyBleGlzdGluZy1hc3NpZ25tZW50cykKIAorICAgICAgICB0b3BvbG9neS0+ZXhlY3V0b3ItPm5vZGUrcG9ydCAobWVyZ2UgKGludG8ge30gKGZvciBbaWQgYXNzaWduZWQtdG9wb2xvZ3ktaWRzXSB7aWQgbmlsfSkpIHRvcG9sb2d5LT5leGVjdXRvci0+bm9kZStwb3J0KQorICAgICAgICBuZXctYXNzaWduZWQtd29ya2VyLT5yZXNvdXJjZXMgKGNvbnZlcnQtYXNzaWdubWVudHMtdG8td29ya2VyLT5yZXNvdXJjZXMgbmV3LXNjaGVkdWxlci1hc3NpZ25tZW50cykKICAgICAgICAgbm93LXNlY3MgKGN1cnJlbnQtdGltZS1zZWNzKQogCiAgICAgICAgIGJhc2ljLXN1cGVydmlzb3ItZGV0YWlscy1tYXAgKGJhc2ljLXN1cGVydmlzb3ItZGV0YWlscy1tYXAgc3Rvcm0tY2x1c3Rlci1zdGF0ZSkKQEAgLTc1MiwxMiArODM1LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludG8ge30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9yIFtpZCByZWFzc2lnbi1leGVjdXRvcnNdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWQgbm93LXNlY3NdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApKSldXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VyLT5yZXNvdXJjZXMgKGdldCBuZXctYXNzaWduZWQtd29ya2VyLT5yZXNvdXJjZXMgdG9wb2xvZ3ktaWQpXV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3RvcG9sb2d5LWlkIChBc3NpZ25tZW50LgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXN0ZXItc3Rvcm1kaXN0LXJvb3QgY29uZiB0b3BvbG9neS1pZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0LWtleXMgYWxsLW5vZGUtPmhvc3QgYWxsLW5vZGVzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dG9yLT5ub2RlK3BvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydC10aW1lcyl9KSldCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQtdGltZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrZXItPnJlc291cmNlcyl9KSldCiAKICAgICA7OyB0YXNrcyBmaWd1cmUgb3V0IHdoYXQgdGFza3MgdG8gdGFsayB0byBieSBsb29raW5nIGF0IHRvcG9sb2d5IGF0IHJ1bnRpbWUKICAgICA7OyBvbmx5IGxvZy9zZXQgd2hlbiB0aGVyZSdzIGJlZW4gYSBjaGFuZ2UgdG8gdGhlIGFzc2lnbm1lbnQKQEAgLTc3OSw2ICs4NjQsMTMgQEAKICAgICAgICAgICAoLmFzc2lnblNsb3RzIGluaW1idXMgdG9wb2xvZ2llcykpKQogICAgIChsb2ctbWVzc2FnZSAibm90IGEgbGVhZGVyLCBza2lwcGluZyBhc3NpZ25tZW50cyIpKSkKIAorKGRlZm4gbm90aWZ5LXRvcG9sb2d5LWFjdGlvbi1saXN0ZW5lciBbbmltYnVzIHN0b3JtLWlkIGFjdGlvbl0KKyAgKGxldCBbdG9wb2xvZ3ktYWN0aW9uLW5vdGlmaWVyICg6bmltYnVzLXRvcG9sb2d5LWFjdGlvbi1ub3RpZmllciBuaW1idXMpXQorICAgICh3aGVuIChub3QtbmlsPyB0b3BvbG9neS1hY3Rpb24tbm90aWZpZXIpCisgICAgICAodHJ5ICgubm90aWZ5IHRvcG9sb2d5LWFjdGlvbi1ub3RpZmllciBzdG9ybS1pZCBhY3Rpb24pCisgICAgICAgIChjYXRjaCBFeGNlcHRpb24gZQorICAgICAgICAobG9nLXdhcm4tZXJyb3IgZSAiSWdub3JpbmcgZXhjZXB0aW9uIGZyb20gVG9wb2xvZ3kgYWN0aW9uIG5vdGlmaWVyIGZvciBzdG9ybS1JZCAiIHN0b3JtLWlkKSkpKSkpCisKIChkZWZuLSBzdGFydC1zdG9ybSBbbmltYnVzIHN0b3JtLW5hbWUgc3Rvcm0taWQgdG9wb2xvZ3ktaW5pdGlhbC1zdGF0dXNdCiAgIHs6cHJlIFsoI3s6YWN0aXZlIDppbmFjdGl2ZX0gdG9wb2xvZ3ktaW5pdGlhbC1zdGF0dXMpXX0KICAgKGxldCBbc3Rvcm0tY2x1c3Rlci1zdGF0ZSAoOnN0b3JtLWNsdXN0ZXItc3RhdGUgbmltYnVzKQpAQCAtNzk3LDcgKzg4OSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0b3JtLWNvbmYgVE9QT0xPR1ktU1VCTUlUVEVSLVVTRVIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmlsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmlsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge30pKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge30pKQorICAgIChub3RpZnktdG9wb2xvZ3ktYWN0aW9uLWxpc3RlbmVyIG5pbWJ1cyBzdG9ybS1uYW1lICJhY3RpdmF0ZSIpKSkKIAogOzsgTWFzdGVyOgogOzsgam9iIHN1Ym1pdDoKQEAgLTgyMyw4ICs5MTYsNyBAQAogICAgICAgICAgICBpbXBlcnNvbmF0aW9uLWF1dGhvcml6ZXIgKDppbXBlcnNvbmF0aW9uLWF1dGhvcml6YXRpb24taGFuZGxlciBuaW1idXMpCiAgICAgICAgICAgIGN0eCAob3IgY29udGV4dCAoUmVxQ29udGV4dC9jb250ZXh0KSkKICAgICAgICAgICAgY2hlY2stY29uZiAoaWYgc3Rvcm0tY29uZiBzdG9ybS1jb25mIChpZiBzdG9ybS1uYW1lIHtUT1BPTE9HWS1OQU1FIHN0b3JtLW5hbWV9KSldCi0gICAgICAgKGxvZy1tZXNzYWdlICJbcmVxICIgKC5yZXF1ZXN0SUQgY3R4KSAiXSBBY2Nlc3MgZnJvbTogIiAoLnJlbW90ZUFkZHJlc3MgY3R4KSAiIHByaW5jaXBhbDoiICgucHJpbmNpcGFsIGN0eCkgIiBvcDoiIG9wZXJhdGlvbikKLQorICAgICAgIChsb2ctdGhyaWZ0LWFjY2VzcyAoLnJlcXVlc3RJRCBjdHgpICgucmVtb3RlQWRkcmVzcyBjdHgpICgucHJpbmNpcGFsIGN0eCkgb3BlcmF0aW9uKQogICAgICAgIChpZiAoLmlzSW1wZXJzb25hdGluZyBjdHgpCiAgICAgICAgICAoZG8KICAgICAgICAgICAobG9nLXdhcm4gInByaW5jaXBhbDogIiAoLnJlYWxQcmluY2lwYWwgY3R4KSAiIGlzIHRyeWluZyB0byBpbXBlcnNvbmF0ZSBwcmluY2lwYWw6ICIgKC5wcmluY2lwYWwgY3R4KSkKQEAgLTk0Nyw2ICsxMDM5LDE3IEBACiAgICAgICAgIChsb2ctZXJyb3IgIkNsZWFuaW5nIGluYm94IC4uLiBlcnJvciBkZWxldGluZzogIiAoLmdldE5hbWUgZikpCiAgICAgICAgICkpKSkKIAorKGRlZm4gY2xlYW4tdG9wb2xvZ3ktaGlzdG9yeQorICAiRGVsZXRlcyB0b3BvbG9naWVzIGZyb20gaGlzdG9yeSBvbGRlciB0aGFuIG1pbnV0ZXMuIgorICBbbWlucyBuaW1idXNdCisgIChsb2NraW5nICg6dG9wb2xvZ3ktaGlzdG9yeS1sb2NrIG5pbWJ1cykKKyAgICAobGV0IFtjdXRvZmYtYWdlICgtIChjdXJyZW50LXRpbWUtc2VjcykgKCogbWlucyA2MCkpCisgICAgICAgICAgdG9wby1oaXN0b3J5LXN0YXRlICg6dG9wby1oaXN0b3J5LXN0YXRlIG5pbWJ1cykKKyAgICAgICAgICBjdXJyLWhpc3RvcnkgKHZlYyAobHMtdG9wby1oaXN0IHRvcG8taGlzdG9yeS1zdGF0ZSkpCisgICAgICAgICAgbmV3LWhpc3RvcnkgKHZlYyAoZmlsdGVyIChmbiBbbGluZV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoPiAobGluZSA6dGltZXN0YW1wKSBjdXRvZmYtYWdlKSkgY3Vyci1oaXN0b3J5KSldCisgICAgICAobHMtdG9wby1oaXN0ISB0b3BvLWhpc3Rvcnktc3RhdGUgbmV3LWhpc3RvcnkpKSkpCisKIChkZWZuIGNsZWFudXAtY29ycnVwdC10b3BvbG9naWVzISBbbmltYnVzXQogICAoaWYgKGlzLWxlYWRlciBuaW1idXMgOnRocm93LWV4Y2VwdGlvbiBmYWxzZSkKICAgICAobGV0IFtzdG9ybS1jbHVzdGVyLXN0YXRlICg6c3Rvcm0tY2x1c3Rlci1zdGF0ZSBuaW1idXMpCkBAIC05NzQsMTMgKzEwNzcsNiBAQAogICAgICAgICAgICAgICAgICAgICguc2V0X2hvc3QgKDpob3N0ICUpKQogICAgICAgICAgICAgICAgICAgICguc2V0X3BvcnQgKDpwb3J0ICUpKSkpKSkKIAotKGRlZm4tIGdldC1sYXN0LWVycm9yCi0gIFtzdG9ybS1jbHVzdGVyLXN0YXRlIHN0b3JtLWlkIGNvbXBvbmVudC1pZF0KLSAgKGlmLWxldCBbZSAoLmxhc3QtZXJyb3Igc3Rvcm0tY2x1c3Rlci1zdGF0ZSBzdG9ybS1pZCBjb21wb25lbnQtaWQpXQotICAgIChkb3RvIChFcnJvckluZm8uICg6ZXJyb3IgZSkgKDp0aW1lLXNlY3MgZSkpCi0gICAgICAgICAgICAgICAgICAgICAgKC5zZXRfaG9zdCAoOmhvc3QgZSkpCi0gICAgICAgICAgICAgICAgICAgICAgKC5zZXRfcG9ydCAoOnBvcnQgZSkpKSkpCi0KIChkZWZuLSB0aHJpZnRpZnktZXhlY3V0b3ItaWQgW1tmaXJzdC10YXNrLWlkIGxhc3QtdGFzay1pZF1dCiAgIChFeGVjdXRvckluZm8uIChpbnQgZmlyc3QtdGFzay1pZCkgKGludCBsYXN0LXRhc2staWQpKSkKIApAQCAtMTAyNyw2ICsxMTIzLDQ2IEBACiAgICkKICkKIAorKGRlZm4gYWRkLXRvcG9sb2d5LXRvLWhpc3RvcnktbG9nCisgIFtzdG9ybS1pZCBuaW1idXMgdG9wb2xvZ3ktY29uZl0KKyAgKGxvZy1tZXNzYWdlICJBZGRpbmcgdG9wbyB0byBoaXN0b3J5IGxvZzogIiBzdG9ybS1pZCkKKyAgKGxvY2tpbmcgKDp0b3BvbG9neS1oaXN0b3J5LWxvY2sgbmltYnVzKQorICAgIChsZXQgW3RvcG8taGlzdG9yeS1zdGF0ZSAoOnRvcG8taGlzdG9yeS1zdGF0ZSBuaW1idXMpCisgICAgICAgICAgdXNlcnMgKGdldC10b3BvLWxvZ3MtdXNlcnMgdG9wb2xvZ3ktY29uZikKKyAgICAgICAgICBncm91cHMgKGdldC10b3BvLWxvZ3MtZ3JvdXBzIHRvcG9sb2d5LWNvbmYpCisgICAgICAgICAgY3Vyci1oaXN0b3J5ICh2ZWMgKGxzLXRvcG8taGlzdCB0b3BvLWhpc3Rvcnktc3RhdGUpKQorICAgICAgICAgIG5ldy1oaXN0b3J5IChjb25qIGN1cnItaGlzdG9yeSB7OnRvcG9pZCBzdG9ybS1pZCA6dGltZXN0YW1wIChjdXJyZW50LXRpbWUtc2VjcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDp1c2VycyB1c2VycyA6Z3JvdXBzIGdyb3Vwc30pXQorICAgICAgKGxzLXRvcG8taGlzdCEgdG9wby1oaXN0b3J5LXN0YXRlIG5ldy1oaXN0b3J5KSkpKQorCisoZGVmbiBpZ3JvdXAtbWFwcGVyCisgIFtzdG9ybS1jb25mXQorICAoQXV0aFV0aWxzL0dldEdyb3VwTWFwcGluZ1NlcnZpY2VQcm92aWRlclBsdWdpbiBzdG9ybS1jb25mKSkKKworKGRlZm4gdXNlci1ncm91cHMKKyAgW3VzZXIgc3Rvcm0tY29uZl0KKyAgKGlmIChjbG9qdXJlLnN0cmluZy9ibGFuaz8gdXNlcikgW10gKC5nZXRHcm91cHMgKGlncm91cC1tYXBwZXIgc3Rvcm0tY29uZikgdXNlcikpKQorCisoZGVmbiBkb2VzLXVzZXJzLWdyb3VwLWludGVyc2VjdD8KKyAgIkNoZWNrIHRvIHNlZSBpZiBhbnkgb2YgdGhlIHVzZXJzIGdyb3VwcyBpbnRlcnNlY3Qgd2l0aCB0aGUgbGlzdCBvZiBncm91cHMgcGFzc2VkIGluIgorICBbdXNlciBncm91cHMtdG8tY2hlY2sgc3Rvcm0tY29uZl0KKyAgKGxldCBbZ3JvdXBzICh1c2VyLWdyb3VwcyB1c2VyIHN0b3JtLWNvbmYpXQorICAgICg+ICguc2l6ZSAoc2V0L2ludGVyc2VjdGlvbiAoc2V0IGdyb3VwcykgKHNldCBncm91cHMtdG8tY2hlY2spKSkgMCkpKQorCisoZGVmbiByZWFkLXRvcG9sb2d5LWhpc3RvcnkKKyAgW25pbWJ1cyB1c2VyIGFkbWluLXVzZXJzXQorICAobGV0IFt0b3BvLWhpc3Rvcnktc3RhdGUgKDp0b3BvLWhpc3Rvcnktc3RhdGUgbmltYnVzKQorICAgICAgICBjdXJyLWhpc3RvcnkgKHZlYyAobHMtdG9wby1oaXN0IHRvcG8taGlzdG9yeS1zdGF0ZSkpCisgICAgICAgIHRvcG8tdXNlci1jYW4tYWNjZXNzIChmbiBbbGluZSB1c2VyIHN0b3JtLWNvbmZdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlmIChuaWw/IHVzZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGluZSA6dG9wb2lkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlmIChvciAoc29tZSAjKD0gJSB1c2VyKSBhZG1pbi11c2VycykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkb2VzLXVzZXJzLWdyb3VwLWludGVyc2VjdD8gdXNlciAobGluZSA6Z3JvdXBzKSBzdG9ybS1jb25mKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNvbWUgIyg9ICUgdXNlcikgKGxpbmUgOnVzZXJzKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsaW5lIDp0b3BvaWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5pbCkpKV0KKyAgICAocmVtb3ZlIG5pbD8gKG1hcCAjKHRvcG8tdXNlci1jYW4tYWNjZXNzICUgdXNlciAoOmNvbmYgbmltYnVzKSkgY3Vyci1oaXN0b3J5KSkpKQorCiAoZGVmbiByZW5ldy1jcmVkZW50aWFscyBbbmltYnVzXQogICAoaWYgKGlzLWxlYWRlciBuaW1idXMgOnRocm93LWV4Y2VwdGlvbiBmYWxzZSkKICAgICAobGV0IFtzdG9ybS1jbHVzdGVyLXN0YXRlICg6c3Rvcm0tY2x1c3Rlci1zdGF0ZSBuaW1idXMpCkBAIC0xMDY3LDExICsxMjAzLDU0IEBACiAgICAgICAgKEludmFsaWRUb3BvbG9neUV4Y2VwdGlvbi4gCiAgICAgICAgIChzdHIgIkZhaWxlZCB0byBzdWJtaXQgdG9wb2xvZ3kuIFRvcG9sb2d5IHJlcXVlc3RzIG1vcmUgdGhhbiAiIHdvcmtlcnMtYWxsb3dlZCAiIHdvcmtlcnMuIikpKSkpKQogCisoZGVmbi0gc2V0LWxvZ2dlci10aW1lb3V0cyBbbG9nLWNvbmZpZ10KKyAgKGxldCBbdGltZW91dC1zZWNzICguZ2V0X3Jlc2V0X2xvZ19sZXZlbF90aW1lb3V0X3NlY3MgbG9nLWNvbmZpZykKKyAgICAgICB0aW1lb3V0ICh0aW1lL3BsdXMgKHRpbWUvbm93KSAodGltZS9zZWNzIHRpbWVvdXQtc2VjcykpXQorICAgKGlmICh0aW1lL2FmdGVyPyB0aW1lb3V0ICh0aW1lL25vdykpCisgICAgICguc2V0X3Jlc2V0X2xvZ19sZXZlbF90aW1lb3V0X2Vwb2NoIGxvZy1jb25maWcgKGNvZXJjZS90by1sb25nIHRpbWVvdXQpKQorICAgICAoLnVuc2V0X3Jlc2V0X2xvZ19sZXZlbF90aW1lb3V0X2Vwb2NoIGxvZy1jb25maWcpKSkpCisKIChkZWZzZXJ2ZXJmbiBzZXJ2aWNlLWhhbmRsZXIgW2NvbmYgaW5pbWJ1c10KICAgKC5wcmVwYXJlIGluaW1idXMgY29uZiAobWFzdGVyLWluaW1idXMtZGlyIGNvbmYpKQogICAobG9nLW1lc3NhZ2UgIlN0YXJ0aW5nIE5pbWJ1cyB3aXRoIGNvbmYgIiBjb25mKQogICAobGV0IFtuaW1idXMgKG5pbWJ1cy1kYXRhIGNvbmYgaW5pbWJ1cykKLSAgICAgICBwcmluY2lwYWwtdG8tbG9jYWwgKEF1dGhVdGlscy9HZXRQcmluY2lwYWxUb0xvY2FsUGx1Z2luIGNvbmYpXQorICAgICAgICBwcmluY2lwYWwtdG8tbG9jYWwgKEF1dGhVdGlscy9HZXRQcmluY2lwYWxUb0xvY2FsUGx1Z2luIGNvbmYpCisgICAgICAgIGFkbWluLXVzZXJzIChvciAoLmdldCBjb25mIE5JTUJVUy1BRE1JTlMpIFtdKQorICAgICAgICBnZXQtY29tbW9uLXRvcG8taW5mbworICAgICAgICAgIChmbiBbXlN0cmluZyBzdG9ybS1pZCBvcGVyYXRpb25dCisgICAgICAgICAgICAobGV0IFtzdG9ybS1jbHVzdGVyLXN0YXRlICg6c3Rvcm0tY2x1c3Rlci1zdGF0ZSBuaW1idXMpCisgICAgICAgICAgICAgICAgICB0b3BvbG9neS1jb25mICh0cnktcmVhZC1zdG9ybS1jb25mIGNvbmYgc3Rvcm0taWQpCisgICAgICAgICAgICAgICAgICBzdG9ybS1uYW1lICh0b3BvbG9neS1jb25mIFRPUE9MT0dZLU5BTUUpCisgICAgICAgICAgICAgICAgICBfIChjaGVjay1hdXRob3JpemF0aW9uISBuaW1idXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JtLW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcG9sb2d5LWNvbmYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbikKKyAgICAgICAgICAgICAgICAgIHRvcG9sb2d5ICh0cnktcmVhZC1zdG9ybS10b3BvbG9neSBjb25mIHN0b3JtLWlkKQorICAgICAgICAgICAgICAgICAgdGFzay0+Y29tcG9uZW50IChzdG9ybS10YXNrLWluZm8gdG9wb2xvZ3kgdG9wb2xvZ3ktY29uZikKKyAgICAgICAgICAgICAgICAgIGJhc2UgKC5zdG9ybS1iYXNlIHN0b3JtLWNsdXN0ZXItc3RhdGUgc3Rvcm0taWQgbmlsKQorICAgICAgICAgICAgICAgICAgbGF1bmNoLXRpbWUtc2VjcyAoaWYgYmFzZSAoOmxhdW5jaC10aW1lLXNlY3MgYmFzZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhyb3cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChOb3RBbGl2ZUV4Y2VwdGlvbi4gKHN0ciBzdG9ybS1pZCkpKSkKKyAgICAgICAgICAgICAgICAgIGFzc2lnbm1lbnQgKC5hc3NpZ25tZW50LWluZm8gc3Rvcm0tY2x1c3Rlci1zdGF0ZSBzdG9ybS1pZCBuaWwpCisgICAgICAgICAgICAgICAgICBiZWF0cyAobWFwLXZhbCA6aGVhcnRiZWF0IChnZXQgQCg6aGVhcnRiZWF0cy1jYWNoZSBuaW1idXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rvcm0taWQpKQorICAgICAgICAgICAgICAgICAgYWxsLWNvbXBvbmVudHMgKHNldCAodmFscyB0YXNrLT5jb21wb25lbnQpKV0KKyAgICAgICAgICAgICAgezpzdG9ybS1uYW1lIHN0b3JtLW5hbWUKKyAgICAgICAgICAgICAgIDpzdG9ybS1jbHVzdGVyLXN0YXRlIHN0b3JtLWNsdXN0ZXItc3RhdGUKKyAgICAgICAgICAgICAgIDphbGwtY29tcG9uZW50cyBhbGwtY29tcG9uZW50cworICAgICAgICAgICAgICAgOmxhdW5jaC10aW1lLXNlY3MgbGF1bmNoLXRpbWUtc2VjcworICAgICAgICAgICAgICAgOmFzc2lnbm1lbnQgYXNzaWdubWVudAorICAgICAgICAgICAgICAgOmJlYXRzIGJlYXRzCisgICAgICAgICAgICAgICA6dG9wb2xvZ3kgdG9wb2xvZ3kKKyAgICAgICAgICAgICAgIDp0YXNrLT5jb21wb25lbnQgdGFzay0+Y29tcG9uZW50CisgICAgICAgICAgICAgICA6YmFzZSBiYXNlfSkpCisgICAgICAgIGdldC1sYXN0LWVycm9yIChmbiBbc3Rvcm0tY2x1c3Rlci1zdGF0ZSBzdG9ybS1pZCBjb21wb25lbnQtaWRdCisgICAgICAgICAgICAgICAgICAgICAgICAgKGlmLWxldCBbZSAoLmxhc3QtZXJyb3Igc3Rvcm0tY2x1c3Rlci1zdGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JtLWlkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LWlkKV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChkb3RvIChFcnJvckluZm8uICg6ZXJyb3IgZSkgKDp0aW1lLXNlY3MgZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICguc2V0X2hvc3QgKDpob3N0IGUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLnNldF9wb3J0ICg6cG9ydCBlKSkpKSldCiAgICAgKC5wcmVwYXJlIF5iYWNrdHlwZS5zdG9ybS5uaW1idXMuSVRvcG9sb2d5VmFsaWRhdG9yICg6dmFsaWRhdG9yIG5pbWJ1cykgY29uZikKIAogICAgIDthZGQgdG8gbmltYnVzZXMKQEAgLTEwOTYsNyArMTI3NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAwCiAgICAgICAgICAgICAgICAgICAgICAgICAoY29uZiBOSU1CVVMtTU9OSVRPUi1GUkVRLVNFQ1MpCiAgICAgICAgICAgICAgICAgICAgICAgICAoZm4gW10KLSAgICAgICAgICAgICAgICAgICAgICAgICAgKHdoZW4gKGNvbmYgTklNQlVTLVJFQVNTSUdOKQorICAgICAgICAgICAgICAgICAgICAgICAgICAod2hlbi1ub3QgKGNvbmYgTklNQlVTLURPLU5PVC1SRUFTU0lHTikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9ja2luZyAoOnN1Ym1pdC1sb2NrIG5pbWJ1cykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtay1hc3NpZ25tZW50cyBuaW1idXMpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRvLWNsZWFudXAgbmltYnVzKQpAQCAtMTEwOCw2ICsxMjg3LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAoZm4gW10KICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsZWFuLWluYm94IChpbmJveCBuaW1idXMpIChjb25mIE5JTUJVUy1JTkJPWC1KQVItRVhQSVJBVElPTi1TRUNTKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkKKyAgICA7OyBTY2hlZHVsZSB0b3BvbG9neSBoaXN0b3J5IGNsZWFuZXIKKyAgICAod2hlbi1sZXQgW2ludGVydmFsIChjb25mIExPR1ZJRVdFUi1DTEVBTlVQLUlOVEVSVkFMLVNFQ1MpXQorICAgICAgKHNjaGVkdWxlLXJlY3VycmluZyAoOnRpbWVyIG5pbWJ1cykKKyAgICAgICAgMAorICAgICAgICAoY29uZiBMT0dWSUVXRVItQ0xFQU5VUC1JTlRFUlZBTC1TRUNTKQorICAgICAgICAoZm4gW10KKyAgICAgICAgICAoY2xlYW4tdG9wb2xvZ3ktaGlzdG9yeSAoY29uZiBMT0dWSUVXRVItQ0xFQU5VUC1BR0UtTUlOUykgbmltYnVzKQorICAgICAgICAgICkpKQogICAgIDs7c2NoZWR1bGUgbmltYnVzIGNvZGUgc3luYyB0aHJlYWQgdG8gc3luYyBjb2RlIGZyb20gb3RoZXIgbmltYnVzZXMuCiAgICAgKHNjaGVkdWxlLXJlY3VycmluZyAoOnRpbWVyIG5pbWJ1cykKICAgICAgIDAKQEAgLTExMjEsMTEgKzEzMDgsMTggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIChjb25mIE5JTUJVUy1DUkVERU5USUFMLVJFTkVXLUZSRVEtU0VDUykKICAgICAgICAgICAgICAgICAgICAgICAgIChmbiBbXQogICAgICAgICAgICAgICAgICAgICAgICAgICAocmVuZXctY3JlZGVudGlhbHMgbmltYnVzKSkpCisKKyAgICAoZGVmZ2F1Z2UgbmltYnVzOm51bS1zdXBlcnZpc29ycworICAgICAgKGZuIFtdICguc2l6ZSAoLnN1cGVydmlzb3JzICg6c3Rvcm0tY2x1c3Rlci1zdGF0ZSBuaW1idXMpIG5pbCkpKSkKKworICAgIChzdGFydC1tZXRyaWNzLXJlcG9ydGVycykKKwogICAgIChyZWlmeSBOaW1idXMkSWZhY2UKICAgICAgIChedm9pZCBzdWJtaXRUb3BvbG9neVdpdGhPcHRzCiAgICAgICAgIFt0aGlzIF5TdHJpbmcgc3Rvcm0tbmFtZSBeU3RyaW5nIHVwbG9hZGVkSmFyTG9jYXRpb24gXlN0cmluZyBzZXJpYWxpemVkQ29uZiBeU3Rvcm1Ub3BvbG9neSB0b3BvbG9neQogICAgICAgICAgXlN1Ym1pdE9wdGlvbnMgc3VibWl0T3B0aW9uc10KICAgICAgICAgKHRyeQorICAgICAgICAgIChtYXJrISBuaW1idXM6bnVtLXN1Ym1pdFRvcG9sb2d5V2l0aE9wdHMtY2FsbHMpCiAgICAgICAgICAgKGlzLWxlYWRlciBuaW1idXMpCiAgICAgICAgICAgKGFzc2VydCAobm90LW5pbD8gc3VibWl0T3B0aW9ucykpCiAgICAgICAgICAgKHZhbGlkYXRlLXRvcG9sb2d5LW5hbWUhIHN0b3JtLW5hbWUpCkBAIC0xMTkxLDYyICsxMzg1LDc1IEBACiAgICAgICAgICAgICAgICh3YWl0LWZvci1kZXNpcmVkLWNvZGUtcmVwbGljYXRpb24gbmltYnVzIHRvdGFsLXN0b3JtLWNvbmYgc3Rvcm0taWQpCiAgICAgICAgICAgICAgICguc2V0dXAtaGVhcnRiZWF0cyEgc3Rvcm0tY2x1c3Rlci1zdGF0ZSBzdG9ybS1pZCkKICAgICAgICAgICAgICAgKC5zZXR1cC1iYWNrcHJlc3N1cmUhIHN0b3JtLWNsdXN0ZXItc3RhdGUgc3Rvcm0taWQpCisgICAgICAgICAgICAgIChub3RpZnktdG9wb2xvZ3ktYWN0aW9uLWxpc3RlbmVyIG5pbWJ1cyBzdG9ybS1uYW1lICJzdWJtaXRUb3BvbG9neSIpCiAgICAgICAgICAgICAgIChsZXQgW3RocmlmdC1zdGF0dXMtPmt3LXN0YXR1cyB7VG9wb2xvZ3lJbml0aWFsU3RhdHVzL0lOQUNUSVZFIDppbmFjdGl2ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRvcG9sb2d5SW5pdGlhbFN0YXR1cy9BQ1RJVkUgOmFjdGl2ZX1dCi0gICAgICAgICAgICAgICAgKHN0YXJ0LXN0b3JtIG5pbWJ1cyBzdG9ybS1uYW1lIHN0b3JtLWlkICh0aHJpZnQtc3RhdHVzLT5rdy1zdGF0dXMgKC5nZXRfaW5pdGlhbF9zdGF0dXMgc3VibWl0T3B0aW9ucykpKSkKLSAgICAgICAgICAgICAgKG1rLWFzc2lnbm1lbnRzIG5pbWJ1cykpKQorICAgICAgICAgICAgICAgIChzdGFydC1zdG9ybSBuaW1idXMgc3Rvcm0tbmFtZSBzdG9ybS1pZCAodGhyaWZ0LXN0YXR1cy0+a3ctc3RhdHVzICguZ2V0X2luaXRpYWxfc3RhdHVzIHN1Ym1pdE9wdGlvbnMpKSkpKSkKICAgICAgICAgICAoY2F0Y2ggVGhyb3dhYmxlIGUKICAgICAgICAgICAgIChsb2ctd2Fybi1lcnJvciBlICJUb3BvbG9neSBzdWJtaXNzaW9uIGV4Y2VwdGlvbi4gKHRvcG9sb2d5IG5hbWU9JyIgc3Rvcm0tbmFtZSAiJykiKQogICAgICAgICAgICAgKHRocm93IGUpKSkpCiAgICAgICAKICAgICAgIChedm9pZCBzdWJtaXRUb3BvbG9neQogICAgICAgICBbdGhpcyBeU3RyaW5nIHN0b3JtLW5hbWUgXlN0cmluZyB1cGxvYWRlZEphckxvY2F0aW9uIF5TdHJpbmcgc2VyaWFsaXplZENvbmYgXlN0b3JtVG9wb2xvZ3kgdG9wb2xvZ3ldCisgICAgICAgIChtYXJrISBuaW1idXM6bnVtLXN1Ym1pdFRvcG9sb2d5LWNhbGxzKQogICAgICAgICAoLnN1Ym1pdFRvcG9sb2d5V2l0aE9wdHMgdGhpcyBzdG9ybS1uYW1lIHVwbG9hZGVkSmFyTG9jYXRpb24gc2VyaWFsaXplZENvbmYgdG9wb2xvZ3kKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTdWJtaXRPcHRpb25zLiBUb3BvbG9neUluaXRpYWxTdGF0dXMvQUNUSVZFKSkpCiAgICAgICAKICAgICAgIChedm9pZCBraWxsVG9wb2xvZ3kgW3RoaXMgXlN0cmluZyBuYW1lXQotICAgICAgICAgKC5raWxsVG9wb2xvZ3lXaXRoT3B0cyB0aGlzIG5hbWUgKEtpbGxPcHRpb25zLikpKQorICAgICAgICAobWFyayEgbmltYnVzOm51bS1raWxsVG9wb2xvZ3ktY2FsbHMpCisgICAgICAgICgua2lsbFRvcG9sb2d5V2l0aE9wdHMgdGhpcyBuYW1lIChLaWxsT3B0aW9ucy4pKSkKIAogICAgICAgKF52b2lkIGtpbGxUb3BvbG9neVdpdGhPcHRzIFt0aGlzIF5TdHJpbmcgc3Rvcm0tbmFtZSBeS2lsbE9wdGlvbnMgb3B0aW9uc10KKyAgICAgICAgKG1hcmshIG5pbWJ1czpudW0ta2lsbFRvcG9sb2d5V2l0aE9wdHMtY2FsbHMpCiAgICAgICAgIChjaGVjay1zdG9ybS1hY3RpdmUhIG5pbWJ1cyBzdG9ybS1uYW1lIHRydWUpCi0gICAgICAgIChsZXQgW3RvcG9sb2d5LWNvbmYgKHRyeS1yZWFkLXN0b3JtLWNvbmYtZnJvbS1uYW1lIGNvbmYgc3Rvcm0tbmFtZSBuaW1idXMpXQotICAgICAgICAgIChjaGVjay1hdXRob3JpemF0aW9uISBuaW1idXMgc3Rvcm0tbmFtZSB0b3BvbG9neS1jb25mICJraWxsVG9wb2xvZ3kiKSkKLSAgICAgICAgKGxldCBbd2FpdC1hbXQgKGlmICguaXNfc2V0X3dhaXRfc2VjcyBvcHRpb25zKQotICAgICAgICAgICAgICAgICAgICAgICAgICguZ2V0X3dhaXRfc2VjcyBvcHRpb25zKSAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgICApXQotICAgICAgICAgICh0cmFuc2l0aW9uLW5hbWUhIG5pbWJ1cyBzdG9ybS1uYW1lIFs6a2lsbCB3YWl0LWFtdF0gdHJ1ZSkKLSAgICAgICAgICApKQorICAgICAgICAobGV0IFt0b3BvbG9neS1jb25mICh0cnktcmVhZC1zdG9ybS1jb25mLWZyb20tbmFtZSBjb25mIHN0b3JtLW5hbWUgbmltYnVzKQorICAgICAgICAgICAgICBvcGVyYXRpb24gImtpbGxUb3BvbG9neSJdCisgICAgICAgICAgKGNoZWNrLWF1dGhvcml6YXRpb24hIG5pbWJ1cyBzdG9ybS1uYW1lIHRvcG9sb2d5LWNvbmYgb3BlcmF0aW9uKQorICAgICAgICAgIChsZXQgW3dhaXQtYW10IChpZiAoLmlzX3NldF93YWl0X3NlY3Mgb3B0aW9ucykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICguZ2V0X3dhaXRfc2VjcyBvcHRpb25zKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKV0KKyAgICAgICAgICAgICh0cmFuc2l0aW9uLW5hbWUhIG5pbWJ1cyBzdG9ybS1uYW1lIFs6a2lsbCB3YWl0LWFtdF0gdHJ1ZSkKKyAgICAgICAgICAgIChub3RpZnktdG9wb2xvZ3ktYWN0aW9uLWxpc3RlbmVyIG5pbWJ1cyBzdG9ybS1uYW1lIG9wZXJhdGlvbikpKSkKIAogICAgICAgKF52b2lkIHJlYmFsYW5jZSBbdGhpcyBeU3RyaW5nIHN0b3JtLW5hbWUgXlJlYmFsYW5jZU9wdGlvbnMgb3B0aW9uc10KKyAgICAgICAgKG1hcmshIG5pbWJ1czpudW0tcmViYWxhbmNlLWNhbGxzKQogICAgICAgICAoY2hlY2stc3Rvcm0tYWN0aXZlISBuaW1idXMgc3Rvcm0tbmFtZSB0cnVlKQotICAgICAgICAobGV0IFt0b3BvbG9neS1jb25mICh0cnktcmVhZC1zdG9ybS1jb25mLWZyb20tbmFtZSBjb25mIHN0b3JtLW5hbWUgbmltYnVzKV0KLSAgICAgICAgICAoY2hlY2stYXV0aG9yaXphdGlvbiEgbmltYnVzIHN0b3JtLW5hbWUgdG9wb2xvZ3ktY29uZiAicmViYWxhbmNlIikpCi0gICAgICAgIChsZXQgW3dhaXQtYW10IChpZiAoLmlzX3NldF93YWl0X3NlY3Mgb3B0aW9ucykKLSAgICAgICAgICAgICAgICAgICAgICAgICAoLmdldF93YWl0X3NlY3Mgb3B0aW9ucykpCi0gICAgICAgICAgICAgIG51bS13b3JrZXJzIChpZiAoLmlzX3NldF9udW1fd29ya2VycyBvcHRpb25zKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICguZ2V0X251bV93b3JrZXJzIG9wdGlvbnMpKQotICAgICAgICAgICAgICBleGVjdXRvci1vdmVycmlkZXMgKGlmICguaXNfc2V0X251bV9leGVjdXRvcnMgb3B0aW9ucykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC5nZXRfbnVtX2V4ZWN1dG9ycyBvcHRpb25zKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7fSldCi0gICAgICAgICAgKGRvc2VxIFtbYyBudW0tZXhlY3V0b3JzXSBleGVjdXRvci1vdmVycmlkZXNdCi0gICAgICAgICAgICAod2hlbiAoPD0gbnVtLWV4ZWN1dG9ycyAwKQotICAgICAgICAgICAgICAodGhyb3cgKEludmFsaWRUb3BvbG9neUV4Y2VwdGlvbi4gIk51bWJlciBvZiBleGVjdXRvcnMgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCIpKQotICAgICAgICAgICAgICApKQotICAgICAgICAgICh0cmFuc2l0aW9uLW5hbWUhIG5pbWJ1cyBzdG9ybS1uYW1lIFs6cmViYWxhbmNlIHdhaXQtYW10IG51bS13b3JrZXJzIGV4ZWN1dG9yLW92ZXJyaWRlc10gdHJ1ZSkKLSAgICAgICAgICApKQorICAgICAgICAobGV0IFt0b3BvbG9neS1jb25mICh0cnktcmVhZC1zdG9ybS1jb25mLWZyb20tbmFtZSBjb25mIHN0b3JtLW5hbWUgbmltYnVzKQorICAgICAgICAgICAgICBvcGVyYXRpb24gInJlYmFsYW5jZSJdCisgICAgICAgICAgKGNoZWNrLWF1dGhvcml6YXRpb24hIG5pbWJ1cyBzdG9ybS1uYW1lIHRvcG9sb2d5LWNvbmYgb3BlcmF0aW9uKQorICAgICAgICAgIChsZXQgW3dhaXQtYW10IChpZiAoLmlzX3NldF93YWl0X3NlY3Mgb3B0aW9ucykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICguZ2V0X3dhaXRfc2VjcyBvcHRpb25zKSkKKyAgICAgICAgICAgICAgICBudW0td29ya2VycyAoaWYgKC5pc19zZXRfbnVtX3dvcmtlcnMgb3B0aW9ucykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICguZ2V0X251bV93b3JrZXJzIG9wdGlvbnMpKQorICAgICAgICAgICAgICAgIGV4ZWN1dG9yLW92ZXJyaWRlcyAoaWYgKC5pc19zZXRfbnVtX2V4ZWN1dG9ycyBvcHRpb25zKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICguZ2V0X251bV9leGVjdXRvcnMgb3B0aW9ucykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7fSldCisgICAgICAgICAgICAoZG9zZXEgW1tjIG51bS1leGVjdXRvcnNdIGV4ZWN1dG9yLW92ZXJyaWRlc10KKyAgICAgICAgICAgICAgKHdoZW4gKDw9IG51bS1leGVjdXRvcnMgMCkKKyAgICAgICAgICAgICAgICAodGhyb3cgKEludmFsaWRUb3BvbG9neUV4Y2VwdGlvbi4gIk51bWJlciBvZiBleGVjdXRvcnMgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCIpKQorICAgICAgICAgICAgICAgICkpCisgICAgICAgICAgICAodHJhbnNpdGlvbi1uYW1lISBuaW1idXMgc3Rvcm0tbmFtZSBbOnJlYmFsYW5jZSB3YWl0LWFtdCBudW0td29ya2VycyBleGVjdXRvci1vdmVycmlkZXNdIHRydWUpCisKKyAgICAgICAgICAgIChub3RpZnktdG9wb2xvZ3ktYWN0aW9uLWxpc3RlbmVyIG5pbWJ1cyBzdG9ybS1uYW1lIG9wZXJhdGlvbikpKSkKIAogICAgICAgKGFjdGl2YXRlIFt0aGlzIHN0b3JtLW5hbWVdCi0gICAgICAgIChsZXQgW3RvcG9sb2d5LWNvbmYgKHRyeS1yZWFkLXN0b3JtLWNvbmYtZnJvbS1uYW1lIGNvbmYgc3Rvcm0tbmFtZSBuaW1idXMpXQotICAgICAgICAgIChjaGVjay1hdXRob3JpemF0aW9uISBuaW1idXMgc3Rvcm0tbmFtZSB0b3BvbG9neS1jb25mICJhY3RpdmF0ZSIpKQotICAgICAgICAodHJhbnNpdGlvbi1uYW1lISBuaW1idXMgc3Rvcm0tbmFtZSA6YWN0aXZhdGUgdHJ1ZSkKLSAgICAgICAgKQorICAgICAgICAobWFyayEgbmltYnVzOm51bS1hY3RpdmF0ZS1jYWxscykKKyAgICAgICAgKGxldCBbdG9wb2xvZ3ktY29uZiAodHJ5LXJlYWQtc3Rvcm0tY29uZi1mcm9tLW5hbWUgY29uZiBzdG9ybS1uYW1lIG5pbWJ1cykKKyAgICAgICAgICAgICAgb3BlcmF0aW9uICJhY3RpdmF0ZSJdCisgICAgICAgICAgKGNoZWNrLWF1dGhvcml6YXRpb24hIG5pbWJ1cyBzdG9ybS1uYW1lIHRvcG9sb2d5LWNvbmYgb3BlcmF0aW9uKQorICAgICAgICAgICh0cmFuc2l0aW9uLW5hbWUhIG5pbWJ1cyBzdG9ybS1uYW1lIDphY3RpdmF0ZSB0cnVlKQorICAgICAgICAgIChub3RpZnktdG9wb2xvZ3ktYWN0aW9uLWxpc3RlbmVyIG5pbWJ1cyBzdG9ybS1uYW1lIG9wZXJhdGlvbikpKQogCiAgICAgICAoZGVhY3RpdmF0ZSBbdGhpcyBzdG9ybS1uYW1lXQotICAgICAgICAobGV0IFt0b3BvbG9neS1jb25mICh0cnktcmVhZC1zdG9ybS1jb25mLWZyb20tbmFtZSBjb25mIHN0b3JtLW5hbWUgbmltYnVzKV0KLSAgICAgICAgICAoY2hlY2stYXV0aG9yaXphdGlvbiEgbmltYnVzIHN0b3JtLW5hbWUgdG9wb2xvZ3ktY29uZiAiZGVhY3RpdmF0ZSIpKQotICAgICAgICAodHJhbnNpdGlvbi1uYW1lISBuaW1idXMgc3Rvcm0tbmFtZSA6aW5hY3RpdmF0ZSB0cnVlKSkKKyAgICAgICAgKG1hcmshIG5pbWJ1czpudW0tZGVhY3RpdmF0ZS1jYWxscykKKyAgICAgICAgKGxldCBbdG9wb2xvZ3ktY29uZiAodHJ5LXJlYWQtc3Rvcm0tY29uZi1mcm9tLW5hbWUgY29uZiBzdG9ybS1uYW1lIG5pbWJ1cykKKyAgICAgICAgICAgICAgb3BlcmF0aW9uICJkZWFjdGl2YXRlIl0KKyAgICAgICAgICAoY2hlY2stYXV0aG9yaXphdGlvbiEgbmltYnVzIHN0b3JtLW5hbWUgdG9wb2xvZ3ktY29uZiBvcGVyYXRpb24pCisgICAgICAgICAgKHRyYW5zaXRpb24tbmFtZSEgbmltYnVzIHN0b3JtLW5hbWUgOmluYWN0aXZhdGUgdHJ1ZSkKKyAgICAgICAgICAobm90aWZ5LXRvcG9sb2d5LWFjdGlvbi1saXN0ZW5lciBuaW1idXMgc3Rvcm0tbmFtZSBvcGVyYXRpb24pKSkKIAogICAgICAgKGRlYnVnIFt0aGlzIHN0b3JtLW5hbWUgY29tcG9uZW50LWlkIGVuYWJsZT8gc2FtcGxpbmdQY3RdCisgICAgICAgIChtYXJrISBuaW1idXM6bnVtLWRlYnVnLWNhbGxzKQogICAgICAgICAobGV0IFtzdG9ybS1jbHVzdGVyLXN0YXRlICg6c3Rvcm0tY2x1c3Rlci1zdGF0ZSBuaW1idXMpCiAgICAgICAgICAgICAgIHN0b3JtLWlkIChnZXQtc3Rvcm0taWQgc3Rvcm0tY2x1c3Rlci1zdGF0ZSBzdG9ybS1uYW1lKQogICAgICAgICAgICAgICB0b3BvbG9neS1jb25mICh0cnktcmVhZC1zdG9ybS1jb25mIGNvbmYgc3Rvcm0taWQpCkBAIC0xMjY1LDcgKzE0NzIsNjYgQEAKICAgICAgICAgICAobG9ja2luZyAoOnN1Ym1pdC1sb2NrIG5pbWJ1cykKICAgICAgICAgICAgICgudXBkYXRlLXN0b3JtISBzdG9ybS1jbHVzdGVyLXN0YXRlIHN0b3JtLWlkIHN0b3JtLWJhc2UtdXBkYXRlcykpKSkKIAorICAgICAgKF52b2lkIHNldFdvcmtlclByb2ZpbGVyCisgICAgICAgIFt0aGlzIF5TdHJpbmcgaWQgXlByb2ZpbGVSZXF1ZXN0IHByb2ZpbGVSZXF1ZXN0XQorICAgICAgICAobWFyayEgbmltYnVzOm51bS1zZXRXb3JrZXJQcm9maWxlci1jYWxscykKKyAgICAgICAgKGxldCBbdG9wb2xvZ3ktY29uZiAodHJ5LXJlYWQtc3Rvcm0tY29uZiBjb25mIGlkKQorICAgICAgICAgICAgICBzdG9ybS1uYW1lICh0b3BvbG9neS1jb25mIFRPUE9MT0dZLU5BTUUpCisgICAgICAgICAgICAgIF8gKGNoZWNrLWF1dGhvcml6YXRpb24hIG5pbWJ1cyBzdG9ybS1uYW1lIHRvcG9sb2d5LWNvbmYgInNldFdvcmtlclByb2ZpbGVyIikKKyAgICAgICAgICAgICAgc3Rvcm0tY2x1c3Rlci1zdGF0ZSAoOnN0b3JtLWNsdXN0ZXItc3RhdGUgbmltYnVzKV0KKyAgICAgICAgICAoLnNldC13b3JrZXItcHJvZmlsZS1yZXF1ZXN0IHN0b3JtLWNsdXN0ZXItc3RhdGUgaWQgcHJvZmlsZVJlcXVlc3QpKSkKKworICAgICAgKF5MaXN0IGdldENvbXBvbmVudFBlbmRpbmdQcm9maWxlQWN0aW9ucworICAgICAgICBbdGhpcyBeU3RyaW5nIGlkIF5TdHJpbmcgY29tcG9uZW50X2lkIF5Qcm9maWxlQWN0aW9uIGFjdGlvbl0KKyAgICAgICAgKG1hcmshIG5pbWJ1czpudW0tZ2V0Q29tcG9uZW50UGVuZGluZ1Byb2ZpbGVBY3Rpb25zLWNhbGxzKQorICAgICAgICAobGV0IFtpbmZvIChnZXQtY29tbW9uLXRvcG8taW5mbyBpZCAiZ2V0Q29tcG9uZW50UGVuZGluZ1Byb2ZpbGVBY3Rpb25zIikKKyAgICAgICAgICAgICAgc3Rvcm0tY2x1c3Rlci1zdGF0ZSAoOnN0b3JtLWNsdXN0ZXItc3RhdGUgaW5mbykKKyAgICAgICAgICAgICAgdGFzay0+Y29tcG9uZW50ICg6dGFzay0+Y29tcG9uZW50IGluZm8pCisgICAgICAgICAgICAgIHs6a2V5cyBbZXhlY3V0b3ItPm5vZGUrcG9ydCBub2RlLT5ob3N0XX0gKDphc3NpZ25tZW50IGluZm8pCisgICAgICAgICAgICAgIGV4ZWN1dG9yLT5ob3N0K3BvcnQgKG1hcC12YWwgKGZuIFtbbm9kZSBwb3J0XV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobm9kZS0+aG9zdCBub2RlKSBwb3J0XSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dG9yLT5ub2RlK3BvcnQpCisgICAgICAgICAgICAgIG5vZGVpbmZvcyAoc3RhdHMvZXh0cmFjdC1ub2RlaW5mb3MtZnJvbS1oYi1mb3ItY29tcCBleGVjdXRvci0+aG9zdCtwb3J0IHRhc2stPmNvbXBvbmVudCBmYWxzZSBjb21wb25lbnRfaWQpCisgICAgICAgICAgICAgIGFsbC1wZW5kaW5nLWFjdGlvbnMtZm9yLXRvcG9sb2d5ICguZ2V0LXRvcG9sb2d5LXByb2ZpbGUtcmVxdWVzdHMgc3Rvcm0tY2x1c3Rlci1zdGF0ZSBpZCB0cnVlKQorICAgICAgICAgICAgICBsYXRlc3QtcHJvZmlsZS1hY3Rpb25zIChyZW1vdmUgbmlsPyAobWFwIChmbiBbbm9kZUluZm9dCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLT4+IGFsbC1wZW5kaW5nLWFjdGlvbnMtZm9yLXRvcG9sb2d5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaWx0ZXIgIyhhbmQgKD0gKDpob3N0IG5vZGVJbmZvKSAoLmdldF9ub2RlICguZ2V0X25vZGVJbmZvICUpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoPSAoOnBvcnQgbm9kZUluZm8pIChmaXJzdCAoLmdldF9wb3J0ICguZ2V0X25vZGVJbmZvICAlKSkpKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaWx0ZXIgIyg9IGFjdGlvbiAoLmdldF9hY3Rpb24gJSkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc29ydC1ieSAjKC5nZXRfdGltZV9zdGFtcCAlKSA+KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZWluZm9zKSldCisgICAgICAgICAgKGxvZy1tZXNzYWdlICJMYXRlc3QgcHJvZmlsZSBhY3Rpb25zIGZvciB0b3BvbG9neSAiIGlkICIgY29tcG9uZW50ICIgY29tcG9uZW50X2lkICIgIiAocHItc3RyIGxhdGVzdC1wcm9maWxlLWFjdGlvbnMpKQorICAgICAgICAgIGxhdGVzdC1wcm9maWxlLWFjdGlvbnMpKQorCisgICAgICAoXnZvaWQgc2V0TG9nQ29uZmlnIFt0aGlzIF5TdHJpbmcgaWQgXkxvZ0NvbmZpZyBsb2ctY29uZmlnLW1zZ10KKyAgICAgICAgKG1hcmshIG5pbWJ1czpudW0tc2V0TG9nQ29uZmlnLWNhbGxzKQorICAgICAgICAobGV0IFt0b3BvbG9neS1jb25mICh0cnktcmVhZC1zdG9ybS1jb25mIGNvbmYgaWQpCisgICAgICAgICAgICAgIHN0b3JtLW5hbWUgKHRvcG9sb2d5LWNvbmYgVE9QT0xPR1ktTkFNRSkKKyAgICAgICAgICAgICAgXyAoY2hlY2stYXV0aG9yaXphdGlvbiEgbmltYnVzIHN0b3JtLW5hbWUgdG9wb2xvZ3ktY29uZiAic2V0TG9nQ29uZmlnIikKKyAgICAgICAgICAgICAgc3Rvcm0tY2x1c3Rlci1zdGF0ZSAoOnN0b3JtLWNsdXN0ZXItc3RhdGUgbmltYnVzKQorICAgICAgICAgICAgICBtZXJnZWQtbG9nLWNvbmZpZyAob3IgKC50b3BvbG9neS1sb2ctY29uZmlnIHN0b3JtLWNsdXN0ZXItc3RhdGUgaWQgbmlsKSAoTG9nQ29uZmlnLikpCisgICAgICAgICAgICAgIG5hbWVkLWxvZ2dlcnMgKC5nZXRfbmFtZWRfbG9nZ2VyX2xldmVsIG1lcmdlZC1sb2ctY29uZmlnKV0KKyAgICAgICAgICAgIChkb3NlcSBbW18gbGV2ZWxdIG5hbWVkLWxvZ2dlcnNdCisgICAgICAgICAgICAgICguc2V0X2FjdGlvbiBsZXZlbCBMb2dMZXZlbEFjdGlvbi9VTkNIQU5HRUQpKQorICAgICAgICAgICAgKGRvc2VxIFtbbG9nZ2VyLW5hbWUgbG9nLWNvbmZpZ10gKC5nZXRfbmFtZWRfbG9nZ2VyX2xldmVsIGxvZy1jb25maWctbXNnKV0KKyAgICAgICAgICAgICAgKGxldCBbYWN0aW9uICguZ2V0X2FjdGlvbiBsb2ctY29uZmlnKV0KKyAgICAgICAgICAgICAgICAoaWYgKGNsb2p1cmUuc3RyaW5nL2JsYW5rPyBsb2dnZXItbmFtZSkKKyAgICAgICAgICAgICAgICAgICh0aHJvdyAoUnVudGltZUV4Y2VwdGlvbi4gIk5hbWVkIGxvZ2dlcnMgbmVlZCBhIHZhbGlkIG5hbWUuIFVzZSBST09UIGZvciB0aGUgcm9vdCBsb2dnZXIiKSkpCisgICAgICAgICAgICAgICAgKGNvbmRwID0gYWN0aW9uCisgICAgICAgICAgICAgICAgICBMb2dMZXZlbEFjdGlvbi9VUERBVEUKKyAgICAgICAgICAgICAgICAgICAgKGRvIChzZXQtbG9nZ2VyLXRpbWVvdXRzIGxvZy1jb25maWcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICgucHV0X3RvX25hbWVkX2xvZ2dlcl9sZXZlbCBtZXJnZWQtbG9nLWNvbmZpZyBsb2dnZXItbmFtZSBsb2ctY29uZmlnKSkKKyAgICAgICAgICAgICAgICAgIExvZ0xldmVsQWN0aW9uL1JFTU9WRQorICAgICAgICAgICAgICAgICAgICAobGV0IFtuYW1lZC1sb2dnZXJzICguZ2V0X25hbWVkX2xvZ2dlcl9sZXZlbCBtZXJnZWQtbG9nLWNvbmZpZyldCisgICAgICAgICAgICAgICAgICAgICAgKGlmIChhbmQgKG5vdCAobmlsPyBuYW1lZC1sb2dnZXJzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLmNvbnRhaW5zS2V5IG5hbWVkLWxvZ2dlcnMgbG9nZ2VyLW5hbWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgKC5yZW1vdmUgbmFtZWQtbG9nZ2VycyBsb2dnZXItbmFtZSkpKSkpKQorICAgICAgICAgICAgKGxvZy1tZXNzYWdlICJTZXR0aW5nIGxvZyBjb25maWcgZm9yICIgc3Rvcm0tbmFtZSAiOiIgbWVyZ2VkLWxvZy1jb25maWcpCisgICAgICAgICAgICAoLnNldC10b3BvbG9neS1sb2ctY29uZmlnISBzdG9ybS1jbHVzdGVyLXN0YXRlIGlkIG1lcmdlZC1sb2ctY29uZmlnKSkpCisKICAgICAgICh1cGxvYWROZXdDcmVkZW50aWFscyBbdGhpcyBzdG9ybS1uYW1lIGNyZWRlbnRpYWxzXQorICAgICAgICAobWFyayEgbmltYnVzOm51bS11cGxvYWROZXdDcmVkZW50aWFscy1jYWxscykKICAgICAgICAgKGxldCBbc3Rvcm0tY2x1c3Rlci1zdGF0ZSAoOnN0b3JtLWNsdXN0ZXItc3RhdGUgbmltYnVzKQogICAgICAgICAgICAgICBzdG9ybS1pZCAoZ2V0LXN0b3JtLWlkIHN0b3JtLWNsdXN0ZXItc3RhdGUgc3Rvcm0tbmFtZSkKICAgICAgICAgICAgICAgdG9wb2xvZ3ktY29uZiAodHJ5LXJlYWQtc3Rvcm0tY29uZiBjb25mIHN0b3JtLWlkKQpAQCAtMTI3NCw2ICsxNTQwLDcgQEAKICAgICAgICAgICAobG9ja2luZyAoOmNyZWQtdXBkYXRlLWxvY2sgbmltYnVzKSAoLnNldC1jcmVkZW50aWFscyEgc3Rvcm0tY2x1c3Rlci1zdGF0ZSBzdG9ybS1pZCBjcmVkcyB0b3BvbG9neS1jb25mKSkpKQogCiAgICAgICAoYmVnaW5GaWxlVXBsb2FkIFt0aGlzXQorICAgICAgICAobWFyayEgbmltYnVzOm51bS1iZWdpbkZpbGVVcGxvYWQtY2FsbHMpCiAgICAgICAgIChjaGVjay1hdXRob3JpemF0aW9uISBuaW1idXMgbmlsIG5pbCAiZmlsZVVwbG9hZCIpCiAgICAgICAgIChsZXQgW2ZpbGVsb2MgKHN0ciAoaW5ib3ggbmltYnVzKSAiL3N0b3JtamFyLSIgKHV1aWQpICIuamFyIildCiAgICAgICAgICAgKC5wdXQgKDp1cGxvYWRlcnMgbmltYnVzKQpAQCAtMTI4NCw2ICsxNTUxLDcgQEAKICAgICAgICAgICApKQogCiAgICAgICAoXnZvaWQgdXBsb2FkQ2h1bmsgW3RoaXMgXlN0cmluZyBsb2NhdGlvbiBeQnl0ZUJ1ZmZlciBjaHVua10KKyAgICAgICAgKG1hcmshIG5pbWJ1czpudW0tdXBsb2FkQ2h1bmstY2FsbHMpCiAgICAgICAgIChjaGVjay1hdXRob3JpemF0aW9uISBuaW1idXMgbmlsIG5pbCAiZmlsZVVwbG9hZCIpCiAgICAgICAgIChsZXQgW3VwbG9hZGVycyAoOnVwbG9hZGVycyBuaW1idXMpCiAgICAgICAgICAgICAgIF5Xcml0YWJsZUJ5dGVDaGFubmVsIGNoYW5uZWwgKC5nZXQgdXBsb2FkZXJzIGxvY2F0aW9uKV0KQEAgLTEyOTUsNiArMTU2Myw3IEBACiAgICAgICAgICAgKSkKIAogICAgICAgKF52b2lkIGZpbmlzaEZpbGVVcGxvYWQgW3RoaXMgXlN0cmluZyBsb2NhdGlvbl0KKyAgICAgICAgKG1hcmshIG5pbWJ1czpudW0tZmluaXNoRmlsZVVwbG9hZC1jYWxscykKICAgICAgICAgKGNoZWNrLWF1dGhvcml6YXRpb24hIG5pbWJ1cyBuaWwgbmlsICJmaWxlVXBsb2FkIikKICAgICAgICAgKGxldCBbdXBsb2FkZXJzICg6dXBsb2FkZXJzIG5pbWJ1cykKICAgICAgICAgICAgICAgXldyaXRhYmxlQnl0ZUNoYW5uZWwgY2hhbm5lbCAoLmdldCB1cGxvYWRlcnMgbG9jYXRpb24pXQpAQCAtMTMwNyw2ICsxNTc2LDcgQEAKICAgICAgICAgICApKQogCiAgICAgICAoXlN0cmluZyBiZWdpbkZpbGVEb3dubG9hZCBbdGhpcyBeU3RyaW5nIGZpbGVdCisgICAgICAgIChtYXJrISBuaW1idXM6bnVtLWJlZ2luRmlsZURvd25sb2FkLWNhbGxzKQogICAgICAgICAoY2hlY2stYXV0aG9yaXphdGlvbiEgbmltYnVzIG5pbCBuaWwgImZpbGVEb3dubG9hZCIpCiAgICAgICAgIChjaGVjay1maWxlLWFjY2VzcyAoOmNvbmYgbmltYnVzKSBmaWxlKQogICAgICAgICAobGV0IFtpcyAoQnVmZmVyRmlsZUlucHV0U3RyZWFtLiBmaWxlKQpAQCAtMTMxNiw2ICsxNTg2LDcgQEAKICAgICAgICAgICApKQogCiAgICAgICAoXkJ5dGVCdWZmZXIgZG93bmxvYWRDaHVuayBbdGhpcyBeU3RyaW5nIGlkXQorICAgICAgICAobWFyayEgbmltYnVzOm51bS1kb3dubG9hZENodW5rLWNhbGxzKQogICAgICAgICAoY2hlY2stYXV0aG9yaXphdGlvbiEgbmltYnVzIG5pbCBuaWwgImZpbGVEb3dubG9hZCIpCiAgICAgICAgIChsZXQgW2Rvd25sb2FkZXJzICg6ZG93bmxvYWRlcnMgbmltYnVzKQogICAgICAgICAgICAgICBeQnVmZmVyRmlsZUlucHV0U3RyZWFtIGlzICguZ2V0IGRvd25sb2FkZXJzIGlkKV0KQEAgLTEzMzAsNDQgKzE2MDEsNjEgQEAKICAgICAgICAgICAgICkpKQogCiAgICAgICAoXlN0cmluZyBnZXROaW1idXNDb25mIFt0aGlzXQorICAgICAgICAobWFyayEgbmltYnVzOm51bS1nZXROaW1idXNDb25mLWNhbGxzKQogICAgICAgICAoY2hlY2stYXV0aG9yaXphdGlvbiEgbmltYnVzIG5pbCBuaWwgImdldE5pbWJ1c0NvbmYiKQogICAgICAgICAodG8tanNvbiAoOmNvbmYgbmltYnVzKSkpCiAKKyAgICAgICheTG9nQ29uZmlnIGdldExvZ0NvbmZpZyBbdGhpcyBeU3RyaW5nIGlkXQorICAgICAgICAobWFyayEgbmltYnVzOm51bS1nZXRMb2dDb25maWctY2FsbHMpCisgICAgICAgIChsZXQgW3RvcG9sb2d5LWNvbmYgKHRyeS1yZWFkLXN0b3JtLWNvbmYgY29uZiBpZCkKKyAgICAgICAgICAgICAgc3Rvcm0tbmFtZSAodG9wb2xvZ3ktY29uZiBUT1BPTE9HWS1OQU1FKQorICAgICAgICAgICAgICBfIChjaGVjay1hdXRob3JpemF0aW9uISBuaW1idXMgc3Rvcm0tbmFtZSB0b3BvbG9neS1jb25mICJnZXRMb2dDb25maWciKQorICAgICAgICAgICAgIHN0b3JtLWNsdXN0ZXItc3RhdGUgKDpzdG9ybS1jbHVzdGVyLXN0YXRlIG5pbWJ1cykKKyAgICAgICAgICAgICBsb2ctY29uZmlnICgudG9wb2xvZ3ktbG9nLWNvbmZpZyBzdG9ybS1jbHVzdGVyLXN0YXRlIGlkIG5pbCldCisgICAgICAgICAgIChpZiBsb2ctY29uZmlnIGxvZy1jb25maWcgKExvZ0NvbmZpZy4pKSkpCisKICAgICAgICheU3RyaW5nIGdldFRvcG9sb2d5Q29uZiBbdGhpcyBeU3RyaW5nIGlkXQorICAgICAgICAobWFyayEgbmltYnVzOm51bS1nZXRUb3BvbG9neUNvbmYtY2FsbHMpCiAgICAgICAgIChsZXQgW3RvcG9sb2d5LWNvbmYgKHRyeS1yZWFkLXN0b3JtLWNvbmYgY29uZiBpZCkKICAgICAgICAgICAgICAgc3Rvcm0tbmFtZSAodG9wb2xvZ3ktY29uZiBUT1BPTE9HWS1OQU1FKV0KICAgICAgICAgICAgICAgKGNoZWNrLWF1dGhvcml6YXRpb24hIG5pbWJ1cyBzdG9ybS1uYW1lIHRvcG9sb2d5LWNvbmYgImdldFRvcG9sb2d5Q29uZiIpCiAgICAgICAgICAgICAgICh0by1qc29uIHRvcG9sb2d5LWNvbmYpKSkKIAogICAgICAgKF5TdG9ybVRvcG9sb2d5IGdldFRvcG9sb2d5IFt0aGlzIF5TdHJpbmcgaWRdCisgICAgICAgIChtYXJrISBuaW1idXM6bnVtLWdldFRvcG9sb2d5LWNhbGxzKQogICAgICAgICAobGV0IFt0b3BvbG9neS1jb25mICh0cnktcmVhZC1zdG9ybS1jb25mIGNvbmYgaWQpCiAgICAgICAgICAgICAgIHN0b3JtLW5hbWUgKHRvcG9sb2d5LWNvbmYgVE9QT0xPR1ktTkFNRSldCiAgICAgICAgICAgICAgIChjaGVjay1hdXRob3JpemF0aW9uISBuaW1idXMgc3Rvcm0tbmFtZSB0b3BvbG9neS1jb25mICJnZXRUb3BvbG9neSIpCiAgICAgICAgICAgICAgIChzeXN0ZW0tdG9wb2xvZ3khIHRvcG9sb2d5LWNvbmYgKHRyeS1yZWFkLXN0b3JtLXRvcG9sb2d5IGNvbmYgaWQpKSkpCiAKICAgICAgICheU3Rvcm1Ub3BvbG9neSBnZXRVc2VyVG9wb2xvZ3kgW3RoaXMgXlN0cmluZyBpZF0KKyAgICAgICAgKG1hcmshIG5pbWJ1czpudW0tZ2V0VXNlclRvcG9sb2d5LWNhbGxzKQogICAgICAgICAobGV0IFt0b3BvbG9neS1jb25mICh0cnktcmVhZC1zdG9ybS1jb25mIGNvbmYgaWQpCiAgICAgICAgICAgICAgIHN0b3JtLW5hbWUgKHRvcG9sb2d5LWNvbmYgVE9QT0xPR1ktTkFNRSldCiAgICAgICAgICAgICAgIChjaGVjay1hdXRob3JpemF0aW9uISBuaW1idXMgc3Rvcm0tbmFtZSB0b3BvbG9neS1jb25mICJnZXRVc2VyVG9wb2xvZ3kiKQogICAgICAgICAgICAgICAodHJ5LXJlYWQtc3Rvcm0tdG9wb2xvZ3kgdG9wb2xvZ3ktY29uZiBpZCkpKQogCiAgICAgICAoXkNsdXN0ZXJTdW1tYXJ5IGdldENsdXN0ZXJJbmZvIFt0aGlzXQorICAgICAgICAobWFyayEgbmltYnVzOm51bS1nZXRDbHVzdGVySW5mby1jYWxscykKICAgICAgICAgKGNoZWNrLWF1dGhvcml6YXRpb24hIG5pbWJ1cyBuaWwgbmlsICJnZXRDbHVzdGVySW5mbyIpCiAgICAgICAgIChsZXQgW3N0b3JtLWNsdXN0ZXItc3RhdGUgKDpzdG9ybS1jbHVzdGVyLXN0YXRlIG5pbWJ1cykKICAgICAgICAgICAgICAgc3VwZXJ2aXNvci1pbmZvcyAoYWxsLXN1cGVydmlzb3ItaW5mbyBzdG9ybS1jbHVzdGVyLXN0YXRlKQogICAgICAgICAgICAgICA7OyBUT0RPOiBuZWVkIHRvIGdldCB0aGUgcG9ydCBpbmZvIGFib3V0IHN1cGVydmlzb3JzLi4uCiAgICAgICAgICAgICAgIDs7IGluIHN0YW5kYWxvbmUganVzdCBsb29rIGF0IG1ldGFkYXRhLCBvdGhlcndpc2UganVzdCBzYXkgTi9BPwogICAgICAgICAgICAgICBzdXBlcnZpc29yLXN1bW1hcmllcyAoZG9mb3IgW1tpZCBpbmZvXSBzdXBlcnZpc29yLWluZm9zXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxldCBbcG9ydHMgKHNldCAoOm1ldGEgaW5mbykpIDs7VE9ETzogdGhpcyBpcyBvbmx5IHRydWUgZm9yIHN0YW5kYWxvbmUKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXAtc3VtIChTdXBlcnZpc29yU3VtbWFyeS4gKDpob3N0bmFtZSBpbmZvKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg6dXB0aW1lLXNlY3MgaW5mbykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY291bnQgcG9ydHMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvdW50ICg6dXNlZC1wb3J0cyBpbmZvKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCkgXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2hlbi1sZXQgW3ZlcnNpb24gKDp2ZXJzaW9uIGluZm8pXSAoLnNldF92ZXJzaW9uIHN1cC1zdW0gdmVyc2lvbikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cC1zdW0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGV0IFtwb3J0cyAoc2V0ICg6bWV0YSBpbmZvKSkgOztUT0RPOiB0aGlzIGlzIG9ubHkgdHJ1ZSBmb3Igc3RhbmRhbG9uZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cC1zdW0gKFN1cGVydmlzb3JTdW1tYXJ5LiAoOmhvc3RuYW1lIGluZm8pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg6dXB0aW1lLXNlY3MgaW5mbykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvdW50IHBvcnRzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY291bnQgKDp1c2VkLXBvcnRzIGluZm8pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCkgXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC5zZXRfdG90YWxfcmVzb3VyY2VzIHN1cC1zdW0gKG1hcC12YWwgZG91YmxlICg6cmVzb3VyY2VzLW1hcCBpbmZvKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2hlbi1sZXQgW1t0b3RhbC1tZW0gdG90YWwtY3B1IHVzZWQtbWVtIHVzZWQtY3B1XSAoLmdldCBAKDpub2RlLWlkLT5yZXNvdXJjZXMgbmltYnVzKSBpZCldCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICguc2V0X3VzZWRfbWVtIHN1cC1zdW0gdXNlZC1tZW0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICguc2V0X3VzZWRfY3B1IHN1cC1zdW0gdXNlZC1jcHUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdoZW4tbGV0IFt2ZXJzaW9uICg6dmVyc2lvbiBpbmZvKV0gKC5zZXRfdmVyc2lvbiBzdXAtc3VtIHZlcnNpb24pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwLXN1bSkpCisgICAgICAgICAgICAgIG5pbWJ1cy11cHRpbWUgKCg6dXB0aW1lIG5pbWJ1cykpCiAgICAgICAgICAgICAgIGJhc2VzICh0b3BvbG9neS1iYXNlcyBzdG9ybS1jbHVzdGVyLXN0YXRlKQogICAgICAgICAgICAgICBuaW1idXNlcyAoLm5pbWJ1c2VzIHN0b3JtLWNsdXN0ZXItc3RhdGUpCiAKQEAgLTEzOTgsMjcgKzE2ODYsMzQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChleHRyYWN0LXN0YXR1cy1zdHIgYmFzZSkpXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod2hlbi1sZXQgW293bmVyICg6b3duZXIgYmFzZSldICguc2V0X293bmVyIHRvcG8tc3VtbSBvd25lcikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3aGVuLWxldCBbc2NoZWQtc3RhdHVzICguZ2V0IEAoOmlkLT5zY2hlZC1zdGF0dXMgbmltYnVzKSBpZCldICguc2V0X3NjaGVkX3N0YXR1cyB0b3BvLXN1bW0gc2NoZWQtc3RhdHVzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHdoZW4tbGV0IFtyZXNvdXJjZXMgKC5nZXQgQCg6aWQtPnJlc291cmNlcyBuaW1idXMpIGlkKV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLnNldF9yZXF1ZXN0ZWRfbWVtb25oZWFwIHRvcG8tc3VtbSAoZ2V0IHJlc291cmNlcyAwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLnNldF9yZXF1ZXN0ZWRfbWVtb2ZmaGVhcCB0b3BvLXN1bW0gKGdldCByZXNvdXJjZXMgMSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC5zZXRfcmVxdWVzdGVkX2NwdSB0b3BvLXN1bW0gKGdldCByZXNvdXJjZXMgMikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC5zZXRfYXNzaWduZWRfbWVtb25oZWFwIHRvcG8tc3VtbSAoZ2V0IHJlc291cmNlcyAzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLnNldF9hc3NpZ25lZF9tZW1vZmZoZWFwIHRvcG8tc3VtbSAoZ2V0IHJlc291cmNlcyA0KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLnNldF9hc3NpZ25lZF9jcHUgdG9wby1zdW1tIChnZXQgcmVzb3VyY2VzIDUpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC5zZXRfcmVwbGljYXRpb25fY291bnQgdG9wby1zdW1tIChpZiAoOmNvZGUtZGlzdHJpYnV0b3IgbmltYnVzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLmdldFJlcGxpY2F0aW9uQ291bnQgKDpjb2RlLWRpc3RyaWJ1dG9yIG5pbWJ1cykgaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BvLXN1bW0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpXQotICAgICAgICAgIChDbHVzdGVyU3VtbWFyeS4gc3VwZXJ2aXNvci1zdW1tYXJpZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcG9sb2d5LXN1bW1hcmllcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmltYnVzZXMpCi0gICAgICAgICAgKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpCisgICAgICAgICAgICAgIHJldCAoQ2x1c3RlclN1bW1hcnkuIHN1cGVydmlzb3Itc3VtbWFyaWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcG9sb2d5LXN1bW1hcmllcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaW1idXNlcykKKyAgICAgICAgICAgICAgXyAoLnNldF9uaW1idXNfdXB0aW1lX3NlY3MgcmV0IG5pbWJ1cy11cHRpbWUpXQorICAgICAgICAgICAgICByZXQpKQogICAgICAgCiAgICAgICAoXlRvcG9sb2d5SW5mbyBnZXRUb3BvbG9neUluZm9XaXRoT3B0cyBbdGhpcyBeU3RyaW5nIHN0b3JtLWlkIF5HZXRJbmZvT3B0aW9ucyBvcHRpb25zXQotICAgICAgICAobGV0IFtzdG9ybS1jbHVzdGVyLXN0YXRlICg6c3Rvcm0tY2x1c3Rlci1zdGF0ZSBuaW1idXMpCi0gICAgICAgICAgICAgIHRvcG9sb2d5LWNvbmYgKHRyeS1yZWFkLXN0b3JtLWNvbmYgY29uZiBzdG9ybS1pZCkKLSAgICAgICAgICAgICAgc3Rvcm0tbmFtZSAodG9wb2xvZ3ktY29uZiBUT1BPTE9HWS1OQU1FKQotICAgICAgICAgICAgICBfIChjaGVjay1hdXRob3JpemF0aW9uISBuaW1idXMgc3Rvcm0tbmFtZSB0b3BvbG9neS1jb25mICJnZXRUb3BvbG9neUluZm8iKQotICAgICAgICAgICAgICB0YXNrLT5jb21wb25lbnQgKHN0b3JtLXRhc2staW5mbyAodHJ5LXJlYWQtc3Rvcm0tdG9wb2xvZ3kgY29uZiBzdG9ybS1pZCkgdG9wb2xvZ3ktY29uZikKLSAgICAgICAgICAgICAgYmFzZSAoLnN0b3JtLWJhc2Ugc3Rvcm0tY2x1c3Rlci1zdGF0ZSBzdG9ybS1pZCBuaWwpCi0gICAgICAgICAgICAgIGxhdW5jaC10aW1lLXNlY3MgKGlmIGJhc2UgKDpsYXVuY2gtdGltZS1zZWNzIGJhc2UpICh0aHJvdyAoTm90QWxpdmVFeGNlcHRpb24uIChzdHIgc3Rvcm0taWQpKSkpCi0gICAgICAgICAgICAgIGFzc2lnbm1lbnQgKC5hc3NpZ25tZW50LWluZm8gc3Rvcm0tY2x1c3Rlci1zdGF0ZSBzdG9ybS1pZCBuaWwpCi0gICAgICAgICAgICAgIGJlYXRzIChtYXAtdmFsIDpoZWFydGJlYXQgKGdldCBAKDpoZWFydGJlYXRzLWNhY2hlIG5pbWJ1cykgc3Rvcm0taWQpKQotICAgICAgICAgICAgICBhbGwtY29tcG9uZW50cyAoLT4gdGFzay0+Y29tcG9uZW50IHJldmVyc2UtbWFwIGtleXMpCisgICAgICAgIChtYXJrISBuaW1idXM6bnVtLWdldFRvcG9sb2d5SW5mb1dpdGhPcHRzLWNhbGxzKQorICAgICAgICAobGV0IFt7OmtleXMgW3N0b3JtLW5hbWUKKyAgICAgICAgICAgICAgICAgICAgICBzdG9ybS1jbHVzdGVyLXN0YXRlCisgICAgICAgICAgICAgICAgICAgICAgYWxsLWNvbXBvbmVudHMKKyAgICAgICAgICAgICAgICAgICAgICBsYXVuY2gtdGltZS1zZWNzCisgICAgICAgICAgICAgICAgICAgICAgYXNzaWdubWVudAorICAgICAgICAgICAgICAgICAgICAgIGJlYXRzCisgICAgICAgICAgICAgICAgICAgICAgdGFzay0+Y29tcG9uZW50CisgICAgICAgICAgICAgICAgICAgICAgYmFzZV19IChnZXQtY29tbW9uLXRvcG8taW5mbyBzdG9ybS1pZCAiZ2V0VG9wb2xvZ3lJbmZvIikKICAgICAgICAgICAgICAgbnVtLWVyci1jaG9pY2UgKG9yICguZ2V0X251bV9lcnJfY2hvaWNlIG9wdGlvbnMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1FcnJvcnNDaG9pY2UvQUxMKQogICAgICAgICAgICAgICBlcnJvcnMtZm4gKGNvbmRwID0gbnVtLWVyci1jaG9pY2UKQEAgLTE0NTksMTkgKzE3NTQsMTM2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXQogICAgICAgICAgICAgKHdoZW4tbGV0IFtvd25lciAoOm93bmVyIGJhc2UpXSAoLnNldF9vd25lciB0b3BvLWluZm8gb3duZXIpKQogICAgICAgICAgICAgKHdoZW4tbGV0IFtzY2hlZC1zdGF0dXMgKC5nZXQgQCg6aWQtPnNjaGVkLXN0YXR1cyBuaW1idXMpIHN0b3JtLWlkKV0gKC5zZXRfc2NoZWRfc3RhdHVzIHRvcG8taW5mbyBzY2hlZC1zdGF0dXMpKQorICAgICAgICAgICAgKHdoZW4tbGV0IFtyZXNvdXJjZXMgKC5nZXQgQCg6aWQtPnJlc291cmNlcyBuaW1idXMpIHN0b3JtLWlkKV0KKyAgICAgICAgICAgICAgKC5zZXRfcmVxdWVzdGVkX21lbW9uaGVhcCB0b3BvLWluZm8gKGdldCByZXNvdXJjZXMgMCkpCisgICAgICAgICAgICAgICguc2V0X3JlcXVlc3RlZF9tZW1vZmZoZWFwIHRvcG8taW5mbyAoZ2V0IHJlc291cmNlcyAxKSkKKyAgICAgICAgICAgICAgKC5zZXRfcmVxdWVzdGVkX2NwdSB0b3BvLWluZm8gKGdldCByZXNvdXJjZXMgMikpCisgICAgICAgICAgICAgICguc2V0X2Fzc2lnbmVkX21lbW9uaGVhcCB0b3BvLWluZm8gKGdldCByZXNvdXJjZXMgMykpCisgICAgICAgICAgICAgICguc2V0X2Fzc2lnbmVkX21lbW9mZmhlYXAgdG9wby1pbmZvIChnZXQgcmVzb3VyY2VzIDQpKQorICAgICAgICAgICAgICAoLnNldF9hc3NpZ25lZF9jcHUgdG9wby1pbmZvIChnZXQgcmVzb3VyY2VzIDUpKSkKICAgICAgICAgICAgICh3aGVuLWxldCBbY29tcG9uZW50LT5kZWJ1ZyAoOmNvbXBvbmVudC0+ZGVidWcgYmFzZSldCiAgICAgICAgICAgICAgICguc2V0X2NvbXBvbmVudF9kZWJ1ZyB0b3BvLWluZm8gKG1hcC12YWwgY29udmVydGVyL3RocmlmdGlmeS1kZWJ1Z29wdGlvbnMgY29tcG9uZW50LT5kZWJ1ZykpKQotICAgICAgICAgICAgKC5zZXRfcmVwbGljYXRpb25fY291bnQgdG9wby1pbmZvICguZ2V0UmVwbGljYXRpb25Db3VudCAoOmNvZGUtZGlzdHJpYnV0b3IgbmltYnVzKSBzdG9ybS1pZCkpCisgICAgICAgICAgICAoLnNldF9yZXBsaWNhdGlvbl9jb3VudCB0b3BvLWluZm8gKGlmICg6Y29kZS1kaXN0cmlidXRvciBuaW1idXMpICguZ2V0UmVwbGljYXRpb25Db3VudCAoOmNvZGUtZGlzdHJpYnV0b3IgbmltYnVzKSBzdG9ybS1pZCkgMSkpCisKICAgICAgICAgICAgIHRvcG8taW5mbwogICAgICAgICAgICkpCiAKLSAgICAgICheVG9wb2xvZ3lJbmZvIGdldFRvcG9sb2d5SW5mbyBbdGhpcyBeU3RyaW5nIHN0b3JtLWlkXQorICAgICAgKF5Ub3BvbG9neUluZm8gZ2V0VG9wb2xvZ3lJbmZvIFt0aGlzIF5TdHJpbmcgdG9wb2xvZ3ktaWRdCisgICAgICAgIChtYXJrISBuaW1idXM6bnVtLWdldFRvcG9sb2d5SW5mby1jYWxscykKICAgICAgICAgKC5nZXRUb3BvbG9neUluZm9XaXRoT3B0cyB0aGlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rvcm0taWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BvbG9neS1pZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkb3RvIChHZXRJbmZvT3B0aW9ucy4pICguc2V0X251bV9lcnJfY2hvaWNlIE51bUVycm9yc0Nob2ljZS9BTEwpKSkpCiAKKyAgICAgICheVG9wb2xvZ3lQYWdlSW5mbyBnZXRUb3BvbG9neVBhZ2VJbmZvCisgICAgICAgIFt0aGlzIF5TdHJpbmcgdG9wby1pZCBeU3RyaW5nIHdpbmRvdyBeYm9vbGVhbiBpbmNsdWRlLXN5cz9dCisgICAgICAgIChtYXJrISBuaW1idXM6bnVtLWdldFRvcG9sb2d5UGFnZUluZm8tY2FsbHMpCisgICAgICAgIChsZXQgW2luZm8gKGdldC1jb21tb24tdG9wby1pbmZvIHRvcG8taWQgImdldFRvcG9sb2d5UGFnZUluZm8iKQorCisgICAgICAgICAgICAgIGV4ZWMtPm5vZGUrcG9ydCAoOmV4ZWN1dG9yLT5ub2RlK3BvcnQgKDphc3NpZ25tZW50IGluZm8pKQorICAgICAgICAgICAgICBsYXN0LWVyci1mbiAocGFydGlhbCBnZXQtbGFzdC1lcnJvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoOnN0b3JtLWNsdXN0ZXItc3RhdGUgaW5mbykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wby1pZCkKKyAgICAgICAgICAgICAgdG9wby1wYWdlLWluZm8gKHN0YXRzL2FnZy10b3BvLWV4ZWNzLXN0YXRzIHRvcG8taWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWMtPm5vZGUrcG9ydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDp0YXNrLT5jb21wb25lbnQgaW5mbykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg6YmVhdHMgaW5mbykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg6dG9wb2xvZ3kgaW5mbykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZS1zeXM/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0LWVyci1mbildCisgICAgICAgICAgKHdoZW4tbGV0IFtvd25lciAoOm93bmVyICg6YmFzZSBpbmZvKSldCisgICAgICAgICAgICAoLnNldF9vd25lciB0b3BvLXBhZ2UtaW5mbyBvd25lcikpCisgICAgICAgICAgKHdoZW4tbGV0IFtzY2hlZC1zdGF0dXMgKC5nZXQgQCg6aWQtPnNjaGVkLXN0YXR1cyBuaW1idXMpIHRvcG8taWQpXQorICAgICAgICAgICAgKC5zZXRfc2NoZWRfc3RhdHVzIHRvcG8tcGFnZS1pbmZvIHNjaGVkLXN0YXR1cykpCisgICAgICAgICAgKHdoZW4tbGV0IFtyZXNvdXJjZXMgKC5nZXQgQCg6aWQtPnJlc291cmNlcyBuaW1idXMpIHRvcG8taWQpXQorICAgICAgICAgICAgKC5zZXRfcmVxdWVzdGVkX21lbW9uaGVhcCB0b3BvLXBhZ2UtaW5mbyAoZ2V0IHJlc291cmNlcyAwKSkKKyAgICAgICAgICAgICguc2V0X3JlcXVlc3RlZF9tZW1vZmZoZWFwIHRvcG8tcGFnZS1pbmZvIChnZXQgcmVzb3VyY2VzIDEpKQorICAgICAgICAgICAgKC5zZXRfcmVxdWVzdGVkX2NwdSB0b3BvLXBhZ2UtaW5mbyAoZ2V0IHJlc291cmNlcyAyKSkKKyAgICAgICAgICAgICguc2V0X2Fzc2lnbmVkX21lbW9uaGVhcCB0b3BvLXBhZ2UtaW5mbyAoZ2V0IHJlc291cmNlcyAzKSkKKyAgICAgICAgICAgICguc2V0X2Fzc2lnbmVkX21lbW9mZmhlYXAgdG9wby1wYWdlLWluZm8gKGdldCByZXNvdXJjZXMgNCkpCisgICAgICAgICAgICAoLnNldF9hc3NpZ25lZF9jcHUgdG9wby1wYWdlLWluZm8gKGdldCByZXNvdXJjZXMgNSkpKQorICAgICAgICAgIChkb3RvIHRvcG8tcGFnZS1pbmZvCisgICAgICAgICAgICAoLnNldF9uYW1lICg6c3Rvcm0tbmFtZSBpbmZvKSkKKyAgICAgICAgICAgICguc2V0X3N0YXR1cyAoZXh0cmFjdC1zdGF0dXMtc3RyICg6YmFzZSBpbmZvKSkpCisgICAgICAgICAgICAoLnNldF91cHRpbWVfc2VjcyAodGltZS1kZWx0YSAoOmxhdW5jaC10aW1lLXNlY3MgaW5mbykpKQorICAgICAgICAgICAgKC5zZXRfdG9wb2xvZ3lfY29uZiAodG8tanNvbiAodHJ5LXJlYWQtc3Rvcm0tY29uZiBjb25mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcG8taWQpKSkKKyAgICAgICAgICAgICguc2V0X3JlcGxpY2F0aW9uX2NvdW50CisgICAgICAgICAgICAgICguZ2V0UmVwbGljYXRpb25Db3VudCAoOmNvZGUtZGlzdHJpYnV0b3IgbmltYnVzKSB0b3BvLWlkKSkpCisgICAgICAgICAgKHdoZW4tbGV0IFtkZWJ1Zy1vcHRpb25zCisgICAgICAgICAgICAgICAgICAgICAoZ2V0LWluIGluZm8gWzpiYXNlIDpjb21wb25lbnQtPmRlYnVnIHRvcG8taWRdKV0KKyAgICAgICAgICAgICguc2V0X2RlYnVnX29wdGlvbnMKKyAgICAgICAgICAgICAgdG9wby1wYWdlLWluZm8KKyAgICAgICAgICAgICAgKGNvbnZlcnRlci90aHJpZnRpZnktZGVidWdvcHRpb25zIGRlYnVnLW9wdGlvbnMpKSkKKyAgICAgICAgICB0b3BvLXBhZ2UtaW5mbykpCisKKyAgICAgICheQ29tcG9uZW50UGFnZUluZm8gZ2V0Q29tcG9uZW50UGFnZUluZm8KKyAgICAgICAgW3RoaXMKKyAgICAgICAgIF5TdHJpbmcgdG9wby1pZAorICAgICAgICAgXlN0cmluZyBjb21wb25lbnQtaWQKKyAgICAgICAgIF5TdHJpbmcgd2luZG93CisgICAgICAgICBeYm9vbGVhbiBpbmNsdWRlLXN5cz9dCisgICAgICAgIChtYXJrISBuaW1idXM6bnVtLWdldENvbXBvbmVudFBhZ2VJbmZvLWNhbGxzKQorICAgICAgICAobGV0IFtpbmZvIChnZXQtY29tbW9uLXRvcG8taW5mbyB0b3BvLWlkICJnZXRDb21wb25lbnRQYWdlSW5mbyIpCisgICAgICAgICAgICAgIHs6a2V5cyBbZXhlY3V0b3ItPm5vZGUrcG9ydCBub2RlLT5ob3N0XX0gKDphc3NpZ25tZW50IGluZm8pCisgICAgICAgICAgICAgIGV4ZWN1dG9yLT5ob3N0K3BvcnQgKG1hcC12YWwgKGZuIFtbbm9kZSBwb3J0XV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobm9kZS0+aG9zdCBub2RlKSBwb3J0XSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRvci0+bm9kZStwb3J0KQorICAgICAgICAgICAgICBjb21wLXBhZ2UtaW5mbyAoc3RhdHMvYWdnLWNvbXAtZXhlY3Mtc3RhdHMgZXhlY3V0b3ItPmhvc3QrcG9ydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDp0YXNrLT5jb21wb25lbnQgaW5mbykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg6YmVhdHMgaW5mbykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZS1zeXM/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BvLWlkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoOnRvcG9sb2d5IGluZm8pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQtaWQpXQorICAgICAgICAgIChkb3RvIGNvbXAtcGFnZS1pbmZvCisgICAgICAgICAgICAoLnNldF90b3BvbG9neV9uYW1lICg6c3Rvcm0tbmFtZSBpbmZvKSkKKyAgICAgICAgICAgICguc2V0X2Vycm9ycyAoZ2V0LWVycm9ycyAoOnN0b3JtLWNsdXN0ZXItc3RhdGUgaW5mbykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BvLWlkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LWlkKSkKKyAgICAgICAgICAgICguc2V0X3RvcG9sb2d5X3N0YXR1cyAoZXh0cmFjdC1zdGF0dXMtc3RyICg6YmFzZSBpbmZvKSkpKQorICAgICAgICAgICh3aGVuLWxldCBbZGVidWctb3B0aW9ucworICAgICAgICAgICAgICAgICAgICAgKGdldC1pbiBpbmZvIFs6YmFzZSA6Y29tcG9uZW50LT5kZWJ1ZyBjb21wb25lbnQtaWRdKV0KKyAgICAgICAgICAgICguc2V0X2RlYnVnX29wdGlvbnMKKyAgICAgICAgICAgICAgY29tcC1wYWdlLWluZm8KKyAgICAgICAgICAgICAgKGNvbnZlcnRlci90aHJpZnRpZnktZGVidWdvcHRpb25zIGRlYnVnLW9wdGlvbnMpKSkKKyAgICAgICAgICA7OyBBZGQgdGhlIGV2ZW50IGxvZ2dlciBkZXRhaWxzLgorICAgICAgICAgIChsZXQgW2NvbXBvbmVudC0+dGFza3MgKHJldmVyc2UtbWFwICg6dGFzay0+Y29tcG9uZW50IGluZm8pKQorICAgICAgICAgICAgICAgIGV2ZW50bG9nZ2VyLXRhc2tzIChzb3J0IChnZXQgY29tcG9uZW50LT50YXNrcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZFTlRMT0dHRVItQ09NUE9ORU5ULUlEKSkKKyAgICAgICAgICAgICAgICA7OyBGaW5kIHRoZSB0YXNrIHRoZSBldmVudHMgZnJvbSB0aGlzIGNvbXBvbmVudCByb3V0ZSB0by4KKyAgICAgICAgICAgICAgICB0YXNrLWluZGV4IChtb2QgKHR1cGxlL2xpc3QtaGFzaC1jb2RlIFtjb21wb25lbnQtaWRdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY291bnQgZXZlbnRsb2dnZXItdGFza3MpKQorICAgICAgICAgICAgICAgIHRhc2staWQgKG50aCBldmVudGxvZ2dlci10YXNrcyB0YXNrLWluZGV4KQorICAgICAgICAgICAgICAgIGV2ZW50bG9nZ2VyLWV4ZWMgKGZpcnN0IChmaWx0ZXIgKGZuIFtbc3RhcnQgc3RvcF1dCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiZXR3ZWVuPyB0YXNrLWlkIHN0YXJ0IHN0b3ApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtleXMgZXhlY3V0b3ItPmhvc3QrcG9ydCkpKQorICAgICAgICAgICAgICAgIFtob3N0IHBvcnRdIChnZXQgZXhlY3V0b3ItPmhvc3QrcG9ydCBldmVudGxvZ2dlci1leGVjKV0KKyAgICAgICAgICAgIChpZiAoYW5kIGhvc3QgcG9ydCkKKyAgICAgICAgICAgICAgKGRvdG8gY29tcC1wYWdlLWluZm8KKyAgICAgICAgICAgICAgICAoLnNldF9ldmVudGxvZ19ob3N0IGhvc3QpCisgICAgICAgICAgICAgICAgKC5zZXRfZXZlbnRsb2dfcG9ydCBwb3J0KSkpKQorICAgICAgICAgIGNvbXAtcGFnZS1pbmZvKSkKKworICAgICAgKF5Ub3BvbG9neUhpc3RvcnlJbmZvIGdldFRvcG9sb2d5SGlzdG9yeSBbdGhpcyBeU3RyaW5nIHVzZXJdCisgICAgICAgIChsZXQgW3N0b3JtLWNsdXN0ZXItc3RhdGUgKDpzdG9ybS1jbHVzdGVyLXN0YXRlIG5pbWJ1cykKKyAgICAgICAgICAgICAgYmFzZXMgKHRvcG9sb2d5LWJhc2VzIHN0b3JtLWNsdXN0ZXItc3RhdGUpCisgICAgICAgICAgICAgIGFzc2lnbmVkLXRvcG9sb2d5LWlkcyAoLmFzc2lnbm1lbnRzIHN0b3JtLWNsdXN0ZXItc3RhdGUgbmlsKQorICAgICAgICAgICAgICB1c2VyLWdyb3VwLW1hdGNoLWZuIChmbiBbdG9wby1pZCB1c2VyIGNvbmZdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGV0IFt0b3BvbG9neS1jb25mICh0cnktcmVhZC1zdG9ybS1jb25mIGNvbmYgdG9wby1pZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwcyAoZ2V0LXRvcG8tbG9ncy1ncm91cHMgdG9wb2xvZ3ktY29uZildCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvciAobmlsPyB1c2VyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNvbWUgIyg9ICUgdXNlcikgYWRtaW4tdXNlcnMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZG9lcy11c2Vycy1ncm91cC1pbnRlcnNlY3Q/IHVzZXIgZ3JvdXBzIGNvbmYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc29tZSAjKD0gJSB1c2VyKSAoZ2V0LXRvcG8tbG9ncy11c2VycyB0b3BvbG9neS1jb25mKSkpKSkKKyAgICAgICAgICAgICAgYWN0aXZlLWlkcy1mb3ItdXNlciAoZmlsdGVyICModXNlci1ncm91cC1tYXRjaC1mbiAlIHVzZXIgKDpjb25mIG5pbWJ1cykpIGFzc2lnbmVkLXRvcG9sb2d5LWlkcykKKyAgICAgICAgICAgICAgdG9wby1oaXN0b3J5LWxpc3QgKHJlYWQtdG9wb2xvZ3ktaGlzdG9yeSBuaW1idXMgdXNlciBhZG1pbi11c2VycyldCisgICAgICAgICAgKFRvcG9sb2d5SGlzdG9yeUluZm8uIChkaXN0aW5jdCAoY29uY2F0IGFjdGl2ZS1pZHMtZm9yLXVzZXIgdG9wby1oaXN0b3J5LWxpc3QpKSkpKQorCiAgICAgICBTaHV0ZG93bmFibGUKICAgICAgIChzaHV0ZG93biBbdGhpc10KKyAgICAgICAgKG1hcmshIG5pbWJ1czpudW0tc2h1dGRvd24tY2FsbHMpCiAgICAgICAgIChsb2ctbWVzc2FnZSAiU2h1dHRpbmcgZG93biBtYXN0ZXIiKQogICAgICAgICAoY2FuY2VsLXRpbWVyICg6dGltZXIgbmltYnVzKSkKICAgICAgICAgKC5kaXNjb25uZWN0ICg6c3Rvcm0tY2x1c3Rlci1zdGF0ZSBuaW1idXMpKQpAQCAtMTQ3OSw2ICsxODkxLDcgQEAKICAgICAgICAgKC5jbGVhbnVwICg6dXBsb2FkZXJzIG5pbWJ1cykpCiAgICAgICAgICguY2xvc2UgKDpsZWFkZXItZWxlY3RvciBuaW1idXMpKQogICAgICAgICAoaWYgKDpjb2RlLWRpc3RyaWJ1dG9yIG5pbWJ1cykgKC5jbG9zZSAoOmNvZGUtZGlzdHJpYnV0b3IgbmltYnVzKSAoOmNvbmYgbmltYnVzKSkpCisgICAgICAgICh3aGVuICg6bmltYnVzLXRvcG9sb2d5LWFjdGlvbi1ub3RpZmllciBuaW1idXMpICguY2xlYW51cCAoOm5pbWJ1cy10b3BvbG9neS1hY3Rpb24tbm90aWZpZXIgbmltYnVzKSkpCiAgICAgICAgIChsb2ctbWVzc2FnZSAiU2h1dCBkb3duIG1hc3RlciIpCiAgICAgICAgICkKICAgICAgIERhZW1vbkNvbW1vbgpAQCAtMTUwOSw5ICsxOTIyLDggQEAKIAogKGRlZm1ldGhvZCBzeW5jLWNvZGUgOmRpc3RyaWJ1dGVkIFtjb25mIG5pbWJ1c10KICAgKGxldCBbc3Rvcm0tY2x1c3Rlci1zdGF0ZSAoOnN0b3JtLWNsdXN0ZXItc3RhdGUgbmltYnVzKQotICAgICAgICBjb2RlLWlkcyAoc2V0IChjb2RlLWlkcyAoOmNvbmYgbmltYnVzKSkpCiAgICAgICAgIGFjdGl2ZS10b3BvbG9naWVzIChzZXQgKC5jb2RlLWRpc3RyaWJ1dG9yIHN0b3JtLWNsdXN0ZXItc3RhdGUgKGZuIFtdIChzeW5jLWNvZGUgY29uZiBuaW1idXMpKSkpCi0gICAgICAgIG1pc3NpbmctdG9wb2xvZ2llcyAoc2V0L2RpZmZlcmVuY2UgYWN0aXZlLXRvcG9sb2dpZXMgY29kZS1pZHMpXQorICAgICAgICBtaXNzaW5nLXRvcG9sb2dpZXMgKHNldC9kaWZmZXJlbmNlIGFjdGl2ZS10b3BvbG9naWVzIChzZXQgKGNvZGUtaWRzICg6Y29uZiBuaW1idXMpKSkpXQogICAgIChpZiAobm90IChlbXB0eT8gbWlzc2luZy10b3BvbG9naWVzKSkKICAgICAgIChkbwogICAgICAgICAoLnJlbW92ZUZyb21MZWFkZXJMb2NrUXVldWUgKDpsZWFkZXItZWxlY3RvciBuaW1idXMpKQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvY2xqL2JhY2t0eXBlL3N0b3JtL2RhZW1vbi9zdXBlcnZpc29yLmNsaiBiL3N0b3JtLWNvcmUvc3JjL2Nsai9iYWNrdHlwZS9zdG9ybS9kYWVtb24vc3VwZXJ2aXNvci5jbGoKaW5kZXggMmE3NjEzZC4uZDY1OWQ1NyAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvY2xqL2JhY2t0eXBlL3N0b3JtL2RhZW1vbi9zdXBlcnZpc29yLmNsagorKysgYi9zdG9ybS1jb3JlL3NyYy9jbGovYmFja3R5cGUvc3Rvcm0vZGFlbW9uL3N1cGVydmlzb3IuY2xqCkBAIC0yNSwxNiArMjUsMjMgQEAKICAgICAgICAgICAgW2phdmEuaW8gRmlsZV0pCiAgICg6dXNlIFtiYWNrdHlwZS5zdG9ybSBjb25maWcgdXRpbCBsb2cgdGltZXIgbG9jYWwtc3RhdGVdKQogICAoOmltcG9ydCBbYmFja3R5cGUuc3Rvcm0udXRpbHMgVmVyc2lvbkluZm9dKQorICAoOmltcG9ydCBbYmFja3R5cGUuc3Rvcm0gQ29uZmlnXSkKKyAgKDppbXBvcnQgW2JhY2t0eXBlLnN0b3JtLmdlbmVyYXRlZCBXb3JrZXJSZXNvdXJjZXMgUHJvZmlsZUFjdGlvbl0pCiAgICg6dXNlIFtiYWNrdHlwZS5zdG9ybS5kYWVtb24gY29tbW9uXSkKKyAgKDpyZXF1aXJlIFtiYWNrdHlwZS5zdG9ybS5jb21tYW5kIFtoZWFsdGhjaGVjayA6YXMgaGVhbHRoY2hlY2tdXSkKICAgKDpyZXF1aXJlIFtiYWNrdHlwZS5zdG9ybS5kYWVtb24gW3dvcmtlciA6YXMgd29ya2VyXV0KICAgICAgICAgICAgIFtiYWNrdHlwZS5zdG9ybSBbcHJvY2Vzcy1zaW11bGF0b3IgOmFzIHBzaW1dIFtjbHVzdGVyIDphcyBjbHVzdGVyXSBbZXZlbnQgOmFzIGV2ZW50XV0KICAgICAgICAgICAgIFtjbG9qdXJlLnNldCA6YXMgc2V0XSkKICAgKDppbXBvcnQgW29yZy5hcGFjaGUuem9va2VlcGVyIGRhdGEuQUNMIFpvb0RlZnMkSWRzIFpvb0RlZnMkUGVybXNdKQogICAoOmltcG9ydCBbb3JnLnlhbWwuc25ha2V5YW1sIFlhbWxdCiAgICAgICAgICAgIFtvcmcueWFtbC5zbmFrZXlhbWwuY29uc3RydWN0b3IgU2FmZUNvbnN0cnVjdG9yXSkKKyAgKDpyZXF1aXJlIFttZXRyaWNzLmdhdWdlcyA6cmVmZXIgW2RlZmdhdWdlXV0pCisgICg6cmVxdWlyZSBbbWV0cmljcy5tZXRlcnMgOnJlZmVyIFtkZWZtZXRlciBtYXJrIV1dKQogICAoOmdlbi1jbGFzcwogICAgIDptZXRob2RzIFteezpzdGF0aWMgdHJ1ZX0gW2xhdW5jaCBbYmFja3R5cGUuc3Rvcm0uc2NoZWR1bGVyLklTdXBlcnZpc29yXSB2b2lkXV0pKQogCisoZGVmbWV0ZXIgc3VwZXJ2aXNvcjpudW0td29ya2Vycy1sYXVuY2hlZCkKKwogKGRlZm11bHRpIGRvd25sb2FkLXN0b3JtLWNvZGUgY2x1c3Rlci1tb2RlKQogKGRlZm11bHRpIGxhdW5jaC13b3JrZXIgKGZuIFtzdXBlcnZpc29yICYgX10gKGNsdXN0ZXItbW9kZSAoOmNvbmYgc3VwZXJ2aXNvcikpKSkKIChkZWZtdWx0aSBtay1jb2RlLWRpc3RyaWJ1dG9yIGNsdXN0ZXItbW9kZSkKQEAgLTU3LDI4ICs2NCwzOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAge3NpZCAoLmFzc2lnbm1lbnQtaW5mby13aXRoLXZlcnNpb24gc3Rvcm0tY2x1c3Rlci1zdGF0ZSBzaWQgY2FsbGJhY2spfSkKICAgICAgICAgICAgICAgICAgICAgICB7c2lkIG5pbH0pKSkKICAgICAgICAgICAgKGFwcGx5IG1lcmdlKQotICAgICAgICAgICAoZmlsdGVyLXZhbCBub3QtbmlsPykpXQotCisgICAgICAgICAgIChmaWx0ZXItdmFsIG5vdC1uaWw/KSkKKyAgICAgICAgICBuZXctcHJvZmlsZXItYWN0aW9ucworICAgICAgICAgICgtPj4KKyAgICAgICAgICAgIChkb2ZvciBbc2lkIChkaXN0aW5jdCBzdG9ybS1pZHMpXQorICAgICAgICAgICAgICAgICAgIChpZi1sZXQgW3RvcG8tcHJvZmlsZS1hY3Rpb25zICguZ2V0LXRvcG9sb2d5LXByb2ZpbGUtcmVxdWVzdHMgc3Rvcm0tY2x1c3Rlci1zdGF0ZSBzaWQgZmFsc2UpXQorICAgICAgICAgICAgICAgICAgICAgIHtzaWQgdG9wby1wcm9maWxlLWFjdGlvbnN9KSkKKyAgICAgICAgICAgKGFwcGx5IG1lcmdlKSldCisgICAgICAgICAKICAgICAgIHs6YXNzaWdubWVudHMgKGludG8ge30gKGZvciBbW2sgdl0gbmV3LWFzc2lnbm1lbnRzXSBbayAoOmRhdGEgdildKSkKKyAgICAgICA6cHJvZmlsZXItYWN0aW9ucyBuZXctcHJvZmlsZXItYWN0aW9ucwogICAgICAgIDp2ZXJzaW9ucyBuZXctYXNzaWdubWVudHN9KSkpCiAKIChkZWZuLSByZWFkLW15LWV4ZWN1dG9ycyBbYXNzaWdubWVudHMtc25hcHNob3Qgc3Rvcm0taWQgYXNzaWdubWVudC1pZF0KICAgKGxldCBbYXNzaWdubWVudCAoZ2V0IGFzc2lnbm1lbnRzLXNuYXBzaG90IHN0b3JtLWlkKQorICAgICAgICBteS1zbG90cy1yZXNvdXJjZXMgKGludG8ge30KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaWx0ZXIgKGZuIFtbW25vZGUgX10gX11dICg9IG5vZGUgYXNzaWdubWVudC1pZCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg6d29ya2VyLT5yZXNvdXJjZXMgYXNzaWdubWVudCkpKQogICAgICAgICBteS1leGVjdXRvcnMgKGZpbHRlciAoZm4gW1tfIFtub2RlIF9dXV0gKD0gbm9kZSBhc3NpZ25tZW50LWlkKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICg6ZXhlY3V0b3ItPm5vZGUrcG9ydCBhc3NpZ25tZW50KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDpleGVjdXRvci0+bm9kZStwb3J0IGFzc2lnbm1lbnQpKQogICAgICAgICBwb3J0LWV4ZWN1dG9ycyAoYXBwbHkgbWVyZ2Utd2l0aAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25jYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvciBbW2V4ZWN1dG9yIFtfIHBvcnRdXSBteS1leGVjdXRvcnNdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAge3BvcnQgW2V4ZWN1dG9yXX0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICApKV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmNhdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvciBbW2V4ZWN1dG9yIFtfIHBvcnRdXSBteS1leGVjdXRvcnNdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtwb3J0IFtleGVjdXRvcl19CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkpXQogICAgIChpbnRvIHt9IChmb3IgW1twb3J0IGV4ZWN1dG9yc10gcG9ydC1leGVjdXRvcnNdCiAgICAgICAgICAgICAgICA7OyBuZWVkIHRvIGNhc3QgdG8gaW50IGIvYyBpdCBtaWdodCBiZSBhIGxvbmcgKGR1ZSB0byBob3cgeWFtbCBwYXJzZXMgdGhpbmdzKQogICAgICAgICAgICAgICAgOzsgZG9hbGwgaXMgdG8gYXZvaWQgc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gcHJvYmxlbXMgd2l0aCBsYXp5IHNlcXMKLSAgICAgICAgICAgICAgIFsoSW50ZWdlci4gcG9ydCkgKG1rLWxvY2FsLWFzc2lnbm1lbnQgc3Rvcm0taWQgKGRvYWxsIGV4ZWN1dG9ycykpXQorICAgICAgICAgICAgICAgWyhJbnRlZ2VyLiBwb3J0KSAobWstbG9jYWwtYXNzaWdubWVudCBzdG9ybS1pZCAoZG9hbGwgZXhlY3V0b3JzKSAoZ2V0IG15LXNsb3RzLXJlc291cmNlcyBbYXNzaWdubWVudC1pZCBwb3J0XSkpXQogICAgICAgICAgICAgICAgKSkpKQogCiAoZGVmbi0gcmVhZC1hc3NpZ25tZW50cwotICAiUmV0dXJucyBtYXAgZnJvbSBwb3J0IHRvIHN0cnVjdCBjb250YWluaW5nIDpzdG9ybS1pZCBhbmQgOmV4ZWN1dG9ycyIKKyAgIlJldHVybnMgbWFwIGZyb20gcG9ydCB0byBzdHJ1Y3QgY29udGFpbmluZyA6c3Rvcm0taWQsIDpleGVjdXRvcnMgYW5kIDpyZXNvdXJjZXMiCiAgIChbYXNzaWdubWVudHMtc25hcHNob3QgYXNzaWdubWVudC1pZF0KICAgICAgKC0+PiAoZG9mb3IgW3NpZCAoa2V5cyBhc3NpZ25tZW50cy1zbmFwc2hvdCldIChyZWFkLW15LWV4ZWN1dG9ycyBhc3NpZ25tZW50cy1zbmFwc2hvdCBzaWQgYXNzaWdubWVudC1pZCkpCiAgICAgICAgICAgKGFwcGx5IG1lcmdlLXdpdGggKGZuIFsmIGlnbm9yZWRdICh0aHJvdy1ydW50aW1lICJTaG91bGQgbm90IGhhdmUgbXVsdGlwbGUgdG9wb2xvZ2llcyBhc3NpZ25lZCB0byBvbmUgcG9ydCIpKSkpKQpAQCAtMTk2LDcgKzIxMyw3IEBACiAoZGVmbiBnZW5lcmF0ZS1zdXBlcnZpc29yLWlkIFtdCiAgICh1dWlkKSkKIAotKGRlZm5rIHdvcmtlci1sYXVuY2hlciBbY29uZiB1c2VyIGFyZ3MgOmVudmlyb25tZW50IHt9IDpsb2ctcHJlZml4IG5pbCA6ZXhpdC1jb2RlLWNhbGxiYWNrIG5pbF0KKyhkZWZuayB3b3JrZXItbGF1bmNoZXIgW2NvbmYgdXNlciBhcmdzIDplbnZpcm9ubWVudCB7fSA6bG9nLXByZWZpeCBuaWwgOmV4aXQtY29kZS1jYWxsYmFjayBuaWwgOmRpcmVjdG9yeSBuaWxdCiAgIChsZXQgW18gKHdoZW4gKGNsb2p1cmUuc3RyaW5nL2JsYW5rPyB1c2VyKQogICAgICAgICAgICAgKHRocm93IChqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLgogICAgICAgICAgICAgICAgICAgICAgIlVzZXIgY2Fubm90IGJlIGJsYW5rIHdoZW4gY2FsbGluZyB3b3JrZXItbGF1bmNoZXIuIikpKQpAQCAtMjA1LDcgKzIyMiw3IEBACiAgICAgICAgIHdsIChpZiB3bC1pbml0aWFsIHdsLWluaXRpYWwgKHN0ciBzdG9ybS1ob21lICIvYmluL3dvcmtlci1sYXVuY2hlciIpKQogICAgICAgICBjb21tYW5kIChjb25jYXQgW3dsIHVzZXJdIGFyZ3MpXQogICAgIChsb2ctbWVzc2FnZSAiUnVubmluZyBhcyB1c2VyOiIgdXNlciAiIGNvbW1hbmQ6IiAocHItc3RyIGNvbW1hbmQpKQotICAgIChsYXVuY2gtcHJvY2VzcyBjb21tYW5kIDplbnZpcm9ubWVudCBlbnZpcm9ubWVudCA6bG9nLXByZWZpeCBsb2ctcHJlZml4IDpleGl0LWNvZGUtY2FsbGJhY2sgZXhpdC1jb2RlLWNhbGxiYWNrKQorICAgIChsYXVuY2gtcHJvY2VzcyBjb21tYW5kIDplbnZpcm9ubWVudCBlbnZpcm9ubWVudCA6bG9nLXByZWZpeCBsb2ctcHJlZml4IDpleGl0LWNvZGUtY2FsbGJhY2sgZXhpdC1jb2RlLWNhbGxiYWNrIDpkaXJlY3RvcnkgZGlyZWN0b3J5KQogICApKQogCiAoZGVmbmsgd29ya2VyLWxhdW5jaGVyLWFuZC13YWl0IFtjb25mIHVzZXIgYXJncyA6ZW52aXJvbm1lbnQge30gOmxvZy1wcmVmaXggbmlsXQpAQCAtMjM4LDggKzI1NSw4IEBACiAgICAgICAgICAgKGRvCiAgICAgICAgICAgICAocm1yICh3b3JrZXItaGVhcnRiZWF0cy1yb290IGNvbmYgaWQpKQogICAgICAgICAgICAgOzsgdGhpcyBhdm9pZHMgYSByYWNlIGNvbmRpdGlvbiB3aXRoIHdvcmtlciBvciBzdWJwcm9jZXNzIHdyaXRpbmcgcGlkIGFyb3VuZCBzYW1lIHRpbWUKLSAgICAgICAgICAgIChybXBhdGggKHdvcmtlci1waWRzLXJvb3QgY29uZiBpZCkpCi0gICAgICAgICAgICAocm1wYXRoICh3b3JrZXItcm9vdCBjb25mIGlkKSkpKQorICAgICAgICAgICAgKHJtciAod29ya2VyLXBpZHMtcm9vdCBjb25mIGlkKSkKKyAgICAgICAgICAgIChybXIgKHdvcmtlci1yb290IGNvbmYgaWQpKSkpCiAgICAgICAgIChyZW1vdmUtd29ya2VyLXVzZXIhIGNvbmYgaWQpCiAgICAgICAgIChyZW1vdmUtZGVhZC13b3JrZXIgaWQpCiAgICAgICApKQpAQCAtMzEzLDYgKzMzMCw3IEBACiAgICA6c3luYy1yZXRyeSAoYXRvbSAwKQogICAgOmNvZGUtZGlzdHJpYnV0b3IgKG1rLWNvZGUtZGlzdHJpYnV0b3IgY29uZikKICAgIDpkb3dubG9hZC1sb2NrIChPYmplY3QuKQorICAgOnN0b3JtaWQtPnByb2ZpbGVyLWFjdGlvbnMgKGF0b20ge30pCiAgICB9KQogCiAoZGVmbiBzeW5jLXByb2Nlc3NlcyBbc3VwZXJ2aXNvcl0KQEAgLTM4Niw3ICs0MDQsMTAgQEAKICAgICAod2FpdC1mb3Itd29ya2Vycy1sYXVuY2gKICAgICAgY29uZgogICAgICAoZG9mb3IgW1twb3J0IGFzc2lnbm1lbnRdIHJlYXNzaWduLWV4ZWN1dG9yc10KLSAgICAgICAgICAgIChsZXQgW2lkIChuZXctd29ya2VyLWlkcyBwb3J0KV0KKyAgICAgICAgICAgIChsZXQgW2lkIChuZXctd29ya2VyLWlkcyBwb3J0KQorICAgICAgICAgICAgICAgICAgc3Rvcm0taWQgKDpzdG9ybS1pZCBhc3NpZ25tZW50KQorICAgICAgICAgICAgICAgICAgXldvcmtlclJlc291cmNlcyByZXNvdXJjZXMgKDpyZXNvdXJjZXMgYXNzaWdubWVudCkKKyAgICAgICAgICAgICAgICAgIG1lbS1vbmhlYXAgKC5nZXRfbWVtX29uX2hlYXAgcmVzb3VyY2VzKV0KICAgICAgICAgICAgICAgKHRyeQogICAgICAgICAgICAgICAgIChsb2ctbWVzc2FnZSAiTGF1bmNoaW5nIHdvcmtlciB3aXRoIGFzc2lnbm1lbnQgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHItc3RyIGFzc2lnbm1lbnQpCkBAIC00MDAsNyArNDIxLDkgQEAKICAgICAgICAgICAgICAgICAobGF1bmNoLXdvcmtlciBzdXBlcnZpc29yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDpzdG9ybS1pZCBhc3NpZ25tZW50KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbS1vbmhlYXApCisgICAgICAgICAgICAgICAgKG1hcmshIHN1cGVydmlzb3I6bnVtLXdvcmtlcnMtbGF1bmNoZWQpCiAgICAgICAgICAgICAgICAgKGNhdGNoIGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUKICAgICAgICAgICAgICAgICAgIChsb2ctbWVzc2FnZSAiVW5hYmxlIHRvIGxhdW5jaCB3b3JrZXIgZHVlIHRvICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLmdldE1lc3NhZ2UgZSkpKQpAQCAtNDQwLDkgKzQ2MywxMCBAQAogICAgICAgICAgIF5Mb2NhbFN0YXRlIGxvY2FsLXN0YXRlICg6bG9jYWwtc3RhdGUgc3VwZXJ2aXNvcikKICAgICAgICAgICBzeW5jLWNhbGxiYWNrIChmbiBbJiBpZ25vcmVkXSAoLmFkZCBldmVudC1tYW5hZ2VyIHRoaXMpKQogICAgICAgICAgIGFzc2lnbm1lbnQtdmVyc2lvbnMgQCg6YXNzaWdubWVudC12ZXJzaW9ucyBzdXBlcnZpc29yKQotICAgICAgICAgIHthc3NpZ25tZW50cy1zbmFwc2hvdCA6YXNzaWdubWVudHMgdmVyc2lvbnMgOnZlcnNpb25zfSAgKGFzc2lnbm1lbnRzLXNuYXBzaG90Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rvcm0tY2x1c3Rlci1zdGF0ZSBzeW5jLWNhbGxiYWNrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ25tZW50LXZlcnNpb25zKQorICAgICAgICAgIHthc3NpZ25tZW50cy1zbmFwc2hvdCA6YXNzaWdubWVudHMKKyAgICAgICAgICAgc3Rvcm0taWQtPnByb2ZpbGVyLWFjdGlvbnMgOnByb2ZpbGVyLWFjdGlvbnMKKyAgICAgICAgICAgdmVyc2lvbnMgOnZlcnNpb25zfQorICAgICAgICAgIChhc3NpZ25tZW50cy1zbmFwc2hvdCBzdG9ybS1jbHVzdGVyLXN0YXRlIHN5bmMtY2FsbGJhY2sgYXNzaWdubWVudC12ZXJzaW9ucykKICAgICAgICAgICBzdG9ybS1jb2RlLW1hcCAocmVhZC1zdG9ybS1jb2RlLWxvY2F0aW9ucyBhc3NpZ25tZW50cy1zbmFwc2hvdCkKICAgICAgICAgICBkb3dubG9hZGVkLXN0b3JtLWlkcyAoc2V0IChyZWFkLWRvd25sb2FkZWQtc3Rvcm0taWRzIGNvbmYpKQogICAgICAgICAgIGV4aXN0aW5nLWFzc2lnbm1lbnQgKGxzLWxvY2FsLWFzc2lnbm1lbnRzIGxvY2FsLXN0YXRlKQpAQCAtNDUyLDEzICs0NzYsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoOnN5bmMtcmV0cnkgc3VwZXJ2aXNvcikpCiAgICAgICAgICAgbmV3LWFzc2lnbm1lbnQgKC0+PiBhbGwtYXNzaWdubWVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZpbHRlci1rZXkgIyguY29uZmlybUFzc2lnbmVkIGlzdXBlcnZpc29yICUpKSkKLSAgICAgICAgICBhc3NpZ25lZC1zdG9ybS1pZHMgKGFzc2lnbmVkLXN0b3JtLWlkcy1mcm9tLXBvcnQtYXNzaWdubWVudHMgbmV3LWFzc2lnbm1lbnQpCi0gICAgICAgICAgXQorICAgICAgICAgIGFzc2lnbmVkLXN0b3JtLWlkcyAoYXNzaWduZWQtc3Rvcm0taWRzLWZyb20tcG9ydC1hc3NpZ25tZW50cyBuZXctYXNzaWdubWVudCldCiAgICAgICAobG9nLWRlYnVnICJTeW5jaHJvbml6aW5nIHN1cGVydmlzb3IiKQogICAgICAgKGxvZy1kZWJ1ZyAiU3Rvcm0gY29kZSBtYXA6ICIgc3Rvcm0tY29kZS1tYXApCiAgICAgICAobG9nLWRlYnVnICJEb3dubG9hZGVkIHN0b3JtIGlkczogIiBkb3dubG9hZGVkLXN0b3JtLWlkcykKICAgICAgIChsb2ctZGVidWcgIkFsbCBhc3NpZ25tZW50OiAiIGFsbC1hc3NpZ25tZW50KQogICAgICAgKGxvZy1kZWJ1ZyAiTmV3IGFzc2lnbm1lbnQ6ICIgbmV3LWFzc2lnbm1lbnQpCisgICAgICAobG9nLWRlYnVnICJTdG9ybSBJZHMgUHJvZmlsZXIgQWN0aW9ucyIgc3Rvcm0taWQtPnByb2ZpbGVyLWFjdGlvbnMpCiAKICAgICAgIDs7IGRvd25sb2FkIGNvZGUgZmlyc3QKICAgICAgIDs7IFRoaXMgbWlnaHQgdGFrZSBhd2hpbGUKQEAgLTQ3OCw2ICs1MDIsOCBAQAogICAgICAgKGxzLWxvY2FsLWFzc2lnbm1lbnRzISBsb2NhbC1zdGF0ZQogICAgICAgICAgICAgbmV3LWFzc2lnbm1lbnQpCiAgICAgICAocmVzZXQhICg6YXNzaWdubWVudC12ZXJzaW9ucyBzdXBlcnZpc29yKSB2ZXJzaW9ucykKKyAgICAgIChyZXNldCEgKDpzdG9ybWlkLT5wcm9maWxlci1hY3Rpb25zIHN1cGVydmlzb3IpIHN0b3JtLWlkLT5wcm9maWxlci1hY3Rpb25zKQorCiAgICAgICAocmVzZXQhICg6Y3Vyci1hc3NpZ25tZW50IHN1cGVydmlzb3IpIG5ldy1hc3NpZ25tZW50KQogICAgICAgOzsgcmVtb3ZlIGFueSBkb3dubG9hZGVkIGNvZGUgdGhhdCdzIG5vIGxvbmdlciBhc3NpZ25lZCBvciBhY3RpdmUKICAgICAgIDs7IGltcG9ydGFudCB0aGF0IHRoaXMgaGFwcGVucyBhZnRlciBzZXR0aW5nIHRoZSBsb2NhbCBhc3NpZ25tZW50IHNvIHRoYXQKQEAgLTQ5NSw2ICs1MjEsMTI1IEBACiAgICAgICAoLmFkZCBwcm9jZXNzZXMtZXZlbnQtbWFuYWdlciBzeW5jLXByb2Nlc3NlcykKICAgICAgICkpKQogCisoZGVmbiBtay1zdXBlcnZpc29yLWNhcGFjaXRpZXMKKyAgW2NvbmZdCisgIHtDb25maWcvU1VQRVJWSVNPUl9NRU1PUllfQ0FQQUNJVFlfTUIgKGRvdWJsZSAoY29uZiBTVVBFUlZJU09SLU1FTU9SWS1DQVBBQ0lUWS1NQikpCisgICBDb25maWcvU1VQRVJWSVNPUl9DUFVfQ0FQQUNJVFkgKGRvdWJsZSAoY29uZiBTVVBFUlZJU09SLUNQVS1DQVBBQ0lUWSkpfSkKKworKGRlZm4ganZtLWNtZCBbY21kXQorICAobGV0IFtqYXZhLWhvbWUgKC5nZXQgKFN5c3RlbS9nZXRlbnYpICJKQVZBX0hPTUUiKV0KKyAgICAoaWYgKG5pbD8gamF2YS1ob21lKQorICAgICAgY21kCisgICAgICAoc3RyIGphdmEtaG9tZSBmaWxlLXBhdGgtc2VwYXJhdG9yICJiaW4iIGZpbGUtcGF0aC1zZXBhcmF0b3IgY21kKSkpKQorCisoZGVmbiBqYXZhLWNtZCBbXQorICAoanZtLWNtZCAiamF2YSIpKQorCisoZGVmbiBqbWFwLWR1bXAtY21kIFtwcm9maWxlLWNtZCBwaWQgdGFyZ2V0LWRpcl0KKyAgW3Byb2ZpbGUtY21kIHBpZCAiam1hcCIgdGFyZ2V0LWRpcl0pCisKKyhkZWZuIGpzdGFjay1kdW1wLWNtZCBbcHJvZmlsZS1jbWQgcGlkIHRhcmdldC1kaXJdCisgIFtwcm9maWxlLWNtZCBwaWQgImpzdGFjayIgdGFyZ2V0LWRpcl0pCisKKyhkZWZuIGpwcm9maWxlLXN0YXJ0IFtwcm9maWxlLWNtZCBwaWRdCisgIFtwcm9maWxlLWNtZCBwaWQgInN0YXJ0Il0pCisKKyhkZWZuIGpwcm9maWxlLXN0b3AgW3Byb2ZpbGUtY21kIHBpZCB0YXJnZXQtZGlyXQorICBbcHJvZmlsZS1jbWQgcGlkICJzdG9wIiB0YXJnZXQtZGlyXSkKKworKGRlZm4ganByb2ZpbGUtZHVtcCBbcHJvZmlsZS1jbWQgcGlkIHdvcmtlcnMtYXJ0aWZhY3RzLWRpcmVjdG9yeV0KKyAgW3Byb2ZpbGUtY21kIHBpZCAiZHVtcCIgd29ya2Vycy1hcnRpZmFjdHMtZGlyZWN0b3J5XSkKKworKGRlZm4ganByb2ZpbGUtanZtLXJlc3RhcnQgW3Byb2ZpbGUtY21kIHBpZF0KKyAgW3Byb2ZpbGUtY21kIHBpZCAia2lsbCJdKQorCisoZGVmbi0gZGVsZXRlLXRvcG9sb2d5LXByb2ZpbGVyLWFjdGlvbiBbc3Rvcm0tY2x1c3Rlci1zdGF0ZSBzdG9ybS1pZCBwcm9maWxlLWFjdGlvbl0KKyAgKGxvZy1tZXNzYWdlICJEZWxldGluZyBwcm9maWxlciBhY3Rpb24uLiIgcHJvZmlsZS1hY3Rpb24pCisgICguZGVsZXRlLXRvcG9sb2d5LXByb2ZpbGUtcmVxdWVzdHMgc3Rvcm0tY2x1c3Rlci1zdGF0ZSBzdG9ybS1pZCBwcm9maWxlLWFjdGlvbikpCisKKyhkZWZuayBsYXVuY2gtcHJvZmlsZXItYWN0aW9uLWZvci13b3JrZXIKKyAgIkxhdW5jaCBwcm9maWxlciBhY3Rpb24gZm9yIGEgd29ya2VyIgorICBbY29uZiB1c2VyIHRhcmdldC1kaXIgY29tbWFuZCA6ZW52aXJvbm1lbnQge30gOmV4aXQtY29kZS1vbi1wcm9maWxlLWFjdGlvbiBuaWwgOmxvZy1wcmVmaXggbmlsXQorICAoaWYtbGV0IFtydW4td29ya2VyLWFzLXVzZXIgKGNvbmYgU1VQRVJWSVNPUi1SVU4tV09SS0VSLUFTLVVTRVIpXQorICAgIChsZXQgW2NvbnRhaW5lci1maWxlIChjb250YWluZXItZmlsZS1wYXRoIHRhcmdldC1kaXIpCisgICAgICAgICAgc2NyaXB0LWZpbGUgKHNjcmlwdC1maWxlLXBhdGggdGFyZ2V0LWRpcildCisgICAgICAobG9nLW1lc3NhZ2UgIlJ1bm5pbmcgYXMgdXNlcjoiIHVzZXIgIiBjb21tYW5kOiIgKHNoZWxsLWNtZCBjb21tYW5kKSkKKyAgICAgIChpZiAoZXhpc3RzLWZpbGU/IGNvbnRhaW5lci1maWxlKSAocm1yLWFzLXVzZXIgY29uZiBjb250YWluZXItZmlsZSBjb250YWluZXItZmlsZSkpCisgICAgICAoaWYgKGV4aXN0cy1maWxlPyBzY3JpcHQtZmlsZSkgKHJtci1hcy11c2VyIGNvbmYgc2NyaXB0LWZpbGUgc2NyaXB0LWZpbGUpKQorICAgICAgKHdvcmtlci1sYXVuY2hlcgorICAgICAgICBjb25mCisgICAgICAgIHVzZXIKKyAgICAgICAgWyJwcm9maWxlciIgdGFyZ2V0LWRpciAod3JpdGUtc2NyaXB0IHRhcmdldC1kaXIgY29tbWFuZCA6ZW52aXJvbm1lbnQgZW52aXJvbm1lbnQpXQorICAgICAgICA6bG9nLXByZWZpeCBsb2ctcHJlZml4CisgICAgICAgIDpleGl0LWNvZGUtY2FsbGJhY2sgZXhpdC1jb2RlLW9uLXByb2ZpbGUtYWN0aW9uCisgICAgICAgIDpkaXJlY3RvcnkgKEZpbGUuIHRhcmdldC1kaXIpKSkKKyAgICAobGF1bmNoLXByb2Nlc3MKKyAgICAgIGNvbW1hbmQKKyAgICAgIDplbnZpcm9ubWVudCBlbnZpcm9ubWVudAorICAgICAgOmxvZy1wcmVmaXggbG9nLXByZWZpeAorICAgICAgOmV4aXQtY29kZS1jYWxsYmFjayBleGl0LWNvZGUtb24tcHJvZmlsZS1hY3Rpb24KKyAgICAgIDpkaXJlY3RvcnkgKEZpbGUuIHRhcmdldC1kaXIpKSkpCisKKyhkZWZuIG1rLXJ1bi1wcm9maWxlci1hY3Rpb25zLWZvci1hbGwtdG9wb2xvZ2llcworICAiUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgZG93bmxvYWRzIGFsbCBwcm9maWxlLWFjdGlvbnMgbGlzdGVkIGZvciBhbGwgdG9wb2xvZ2llcyBhc3NpZ25lZAorICB0byB0aGlzIHN1cGVydmlzb3IsIGV4ZWN1dGVzIHRob3NlIGFjdGlvbnMgYXMgdXNlciBhbmQgZGVsZXRlcyB0aGVtIGZyb20gem9va2VlcGVyLiIKKyAgW3N1cGVydmlzb3JdCisgIChmbiBbXQorICAgICh0cnkKKyAgICAgIChsZXQgW2NvbmYgKDpjb25mIHN1cGVydmlzb3IpCisgICAgICAgICAgICBzdG9ybWlkLT5wcm9maWxlci1hY3Rpb25zIEAoOnN0b3JtaWQtPnByb2ZpbGVyLWFjdGlvbnMgc3VwZXJ2aXNvcikKKyAgICAgICAgICAgIHN0b3JtLWNsdXN0ZXItc3RhdGUgKDpzdG9ybS1jbHVzdGVyLXN0YXRlIHN1cGVydmlzb3IpCisgICAgICAgICAgICBob3N0bmFtZSAoOm15LWhvc3RuYW1lIHN1cGVydmlzb3IpCisgICAgICAgICAgICBwcm9maWxlLWNtZCAoY29uZiBXT1JLRVItUFJPRklMRVItQ09NTUFORCkKKyAgICAgICAgICAgIG5ldy1hc3NpZ25tZW50IEAoOmN1cnItYXNzaWdubWVudCBzdXBlcnZpc29yKQorICAgICAgICAgICAgYXNzaWduZWQtc3Rvcm0taWRzIChhc3NpZ25lZC1zdG9ybS1pZHMtZnJvbS1wb3J0LWFzc2lnbm1lbnRzIG5ldy1hc3NpZ25tZW50KV0KKyAgICAgICAgKGRvc2VxIFtbc3Rvcm0taWQgcHJvZmlsZXItYWN0aW9uc10gc3Rvcm1pZC0+cHJvZmlsZXItYWN0aW9uc10KKyAgICAgICAgICAod2hlbiAobm90IChlbXB0eT8gcHJvZmlsZXItYWN0aW9ucykpCisgICAgICAgICAgICAoZG9zZXEgW3Byby1hY3Rpb24gcHJvZmlsZXItYWN0aW9uc10KKyAgICAgICAgICAgICAgKGlmICg9IGhvc3RuYW1lICg6aG9zdCBwcm8tYWN0aW9uKSkKKyAgICAgICAgICAgICAgICAobGV0IFtwb3J0ICg6cG9ydCBwcm8tYWN0aW9uKQorICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbiBeUHJvZmlsZUFjdGlvbiAoOmFjdGlvbiBwcm8tYWN0aW9uKQorICAgICAgICAgICAgICAgICAgICAgIHN0b3A/ICg+IChTeXN0ZW0vY3VycmVudFRpbWVNaWxsaXMpICg6dGltZXN0YW1wIHByby1hY3Rpb24pKQorICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC1kaXIgKHdvcmtlci1hcnRpZmFjdHMtcm9vdCBjb25mIHN0b3JtLWlkIHBvcnQpCisgICAgICAgICAgICAgICAgICAgICAgc3Rvcm0tY29uZiAocmVhZC1zdXBlcnZpc29yLXN0b3JtLWNvbmYgY29uZiBzdG9ybS1pZCkKKyAgICAgICAgICAgICAgICAgICAgICB1c2VyIChzdG9ybS1jb25mIFRPUE9MT0dZLVNVQk1JVFRFUi1VU0VSKQorICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50IChpZi1sZXQgW2VudiAoc3Rvcm0tY29uZiBUT1BPTE9HWS1FTlZJUk9OTUVOVCldIGVudiB7fSkKKyAgICAgICAgICAgICAgICAgICAgICB3b3JrZXItcGlkIChzbHVycCAod29ya2VyLWFydGlmYWN0cy1waWQtcGF0aCBjb25mIHN0b3JtLWlkIHBvcnQpKQorICAgICAgICAgICAgICAgICAgICAgIGxvZy1wcmVmaXggKHN0ciAiUHJvZmlsZXJBY3Rpb24gcHJvY2VzcyAiIHN0b3JtLWlkICI6IiBwb3J0ICIgUFJPRklMRVJfQUNUSU9OOiAiIGFjdGlvbiAiICIpCisgICAgICAgICAgICAgICAgICAgICAgOzsgVW50aWwgUFJPRklMRVJfU1RPUCBhY3Rpb24gaXMgaW52YWxpZCwga2VlcCBsYXVuY2hpbmcgcHJvZmlsZXIgc3RhcnQgaW4gY2FzZSB3b3JrZXIgcmVzdGFydGVkCisgICAgICAgICAgICAgICAgICAgICAgOzsgVGhlIHByb2ZpbGVyIHBsdWdpbiBzY3JpcHQgdmFsaWRhdGVzIGlmIEpWTSBpcyByZWNvcmRpbmcgYmVmb3JlIHN0YXJ0aW5nIGFub3RoZXIgcmVjb3JkaW5nLgorICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgKGNvbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKD0gYWN0aW9uIFByb2ZpbGVBY3Rpb24vSk1BUF9EVU1QKSAoam1hcC1kdW1wLWNtZCBwcm9maWxlLWNtZCB3b3JrZXItcGlkIHRhcmdldC1kaXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg9IGFjdGlvbiBQcm9maWxlQWN0aW9uL0pTVEFDS19EVU1QKSAoanN0YWNrLWR1bXAtY21kIHByb2ZpbGUtY21kIHdvcmtlci1waWQgdGFyZ2V0LWRpcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKD0gYWN0aW9uIFByb2ZpbGVBY3Rpb24vSlBST0ZJTEVfRFVNUCkgKGpwcm9maWxlLWR1bXAgcHJvZmlsZS1jbWQgd29ya2VyLXBpZCB0YXJnZXQtZGlyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoPSBhY3Rpb24gUHJvZmlsZUFjdGlvbi9KVk1fUkVTVEFSVCkgKGpwcm9maWxlLWp2bS1yZXN0YXJ0IHByb2ZpbGUtY21kIHdvcmtlci1waWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbmQgKG5vdCBzdG9wPykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoPSBhY3Rpb24gUHJvZmlsZUFjdGlvbi9KUFJPRklMRV9TVE9QKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoanByb2ZpbGUtc3RhcnQgcHJvZmlsZS1jbWQgd29ya2VyLXBpZCkgOzsgRW5zdXJlIHRoZSBwcm9maWxlciBpcyBzdGlsbCBydW5uaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbmQgc3RvcD8gKD0gYWN0aW9uIFByb2ZpbGVBY3Rpb24vSlBST0ZJTEVfU1RPUCkpIChqcHJvZmlsZS1zdG9wIHByb2ZpbGUtY21kIHdvcmtlci1waWQgdGFyZ2V0LWRpcikpCisgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uLW9uLWV4aXQgKGZuIFtleGl0LWNvZGVdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9nLW1lc3NhZ2UgbG9nLXByZWZpeCAiIHByb2ZpbGUtYWN0aW9uIGV4aXRlZCBmb3IgY29kZTogIiBleGl0LWNvZGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaWYgKGFuZCAoPSBleGl0LWNvZGUgMCkgc3RvcD8pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZWxldGUtdG9wb2xvZ3ktcHJvZmlsZXItYWN0aW9uIHN0b3JtLWNsdXN0ZXItc3RhdGUgc3Rvcm0taWQgcHJvLWFjdGlvbikpKQorICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgKC0+PiBjb21tYW5kIChtYXAgc3RyKSAoZmlsdGVyIChjb21wbGVtZW50IGVtcHR5PykpKV0KKworICAgICAgICAgICAgICAgICAgKHRyeQorICAgICAgICAgICAgICAgICAgICAobGF1bmNoLXByb2ZpbGVyLWFjdGlvbi1mb3Itd29ya2VyIGNvbmYKKyAgICAgICAgICAgICAgICAgICAgICB1c2VyCisgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LWRpcgorICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQKKyAgICAgICAgICAgICAgICAgICAgICA6ZW52aXJvbm1lbnQgZW52aXJvbm1lbnQKKyAgICAgICAgICAgICAgICAgICAgICA6ZXhpdC1jb2RlLW9uLXByb2ZpbGUtYWN0aW9uIGFjdGlvbi1vbi1leGl0CisgICAgICAgICAgICAgICAgICAgICAgOmxvZy1wcmVmaXggbG9nLXByZWZpeCkKKyAgICAgICAgICAgICAgICAgICAgKGNhdGNoIElPRXhjZXB0aW9uIGlvZQorICAgICAgICAgICAgICAgICAgICAgIChsb2ctZXJyb3IgaW9lCisgICAgICAgICAgICAgICAgICAgICAgICAoc3RyICJFcnJvciBpbiBwcm9jZXNzaW5nIFByb2ZpbGVyQWN0aW9uICciIGFjdGlvbiAiJyBmb3IgIiBzdG9ybS1pZCAiOiIgcG9ydCAiLCB3aWxsIHJldHJ5IGxhdGVyLiIpKSkKKyAgICAgICAgICAgICAgICAgICAgKGNhdGNoIFJ1bnRpbWVFeGNlcHRpb24gcnRlCisgICAgICAgICAgICAgICAgICAgICAgKGxvZy1lcnJvciBydGUKKyAgICAgICAgICAgICAgICAgICAgICAgIChzdHIgIkVycm9yIGluIHByb2Nlc3NpbmcgUHJvZmlsZXJBY3Rpb24gJyIgYWN0aW9uICInIGZvciAiIHN0b3JtLWlkICI6IiBwb3J0ICIsIHdpbGwgcmV0cnkgbGF0ZXIuIikpKSkpKSkpKSkKKyAgICAgIChjYXRjaCBFeGNlcHRpb24gZQorICAgICAgICAobG9nLWVycm9yIGUgIkVycm9yIHJ1bm5pbmcgcHJvZmlsZXIgYWN0aW9ucywgd2lsbCByZXRyeSBhZ2FpbiBsYXRlciIpKSkpKQorCiA7OyBpbiBsb2NhbCBzdGF0ZSwgc3VwZXJ2aXNvciBzdG9yZXMgd2hvIGl0cyBjdXJyZW50IGFzc2lnbm1lbnRzIGFyZQogOzsgYW5vdGhlciB0aHJlYWQgbGF1bmNoZXMgZXZlbnRzIHRvIHJlc3RhcnQgYW55IGRlYWQgcHJvY2Vzc2VzIGlmIG5lY2Vzc2FyeQogKGRlZnNlcnZlcmZuIG1rLXN1cGVydmlzb3IgW2NvbmYgc2hhcmVkLWNvbnRleHQgXklTdXBlcnZpc29yIGlzdXBlcnZpc29yXQpAQCAtNTA1LDYgKzY1MCw3IEBACiAgICAgICAgIFtldmVudC1tYW5hZ2VyIHByb2Nlc3Nlcy1ldmVudC1tYW5hZ2VyIDphcyBtYW5hZ2Vyc10gWyhldmVudC9ldmVudC1tYW5hZ2VyIGZhbHNlKSAoZXZlbnQvZXZlbnQtbWFuYWdlciBmYWxzZSldCiAgICAgICAgIHN5bmMtcHJvY2Vzc2VzIChwYXJ0aWFsIHN5bmMtcHJvY2Vzc2VzIHN1cGVydmlzb3IpCiAgICAgICAgIHN5bmNocm9uaXplLXN1cGVydmlzb3IgKG1rLXN5bmNocm9uaXplLXN1cGVydmlzb3Igc3VwZXJ2aXNvciBzeW5jLXByb2Nlc3NlcyBldmVudC1tYW5hZ2VyIHByb2Nlc3Nlcy1ldmVudC1tYW5hZ2VyKQorICAgICAgICBydW4tcHJvZmlsZXItYWN0aW9ucy1mbiAobWstcnVuLXByb2ZpbGVyLWFjdGlvbnMtZm9yLWFsbC10b3BvbG9naWVzIHN1cGVydmlzb3IpCiAgICAgICAgIGhlYXJ0YmVhdC1mbiAoZm4gW10gKC5zdXBlcnZpc29yLWhlYXJ0YmVhdCEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoOnN0b3JtLWNsdXN0ZXItc3RhdGUgc3VwZXJ2aXNvcikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoOnN1cGVydmlzb3ItaWQgc3VwZXJ2aXNvcikKQEAgLTUxNiw3ICs2NjIsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICguZ2V0TWV0YWRhdGEgaXN1cGVydmlzb3IpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbmYgU1VQRVJWSVNPUi1TQ0hFRFVMRVItTUVUQSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKDp1cHRpbWUgc3VwZXJ2aXNvcikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDp2ZXJzaW9uIHN1cGVydmlzb3IpKSkpXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg6dmVyc2lvbiBzdXBlcnZpc29yKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtay1zdXBlcnZpc29yLWNhcGFjaXRpZXMgY29uZikpKSldCiAgICAgKGhlYXJ0YmVhdC1mbikKIAogICAgIDs7IHNob3VsZCBzeW5jaHJvbml6ZSBzdXBlcnZpc29yIHNvIGl0IGRvZXNuJ3QgbGF1bmNoIGFueXRoaW5nIGFmdGVyIGJlaW5nIGRvd24gKG9wdGltaXphdGlvbikKQEAgLTUzMSw3ICs2NzgsMjIgQEAKICAgICAgIChzY2hlZHVsZS1yZWN1cnJpbmcgKDpldmVudC10aW1lciBzdXBlcnZpc29yKQogICAgICAgICAgICAgICAgICAgICAgICAgICAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25mIFNVUEVSVklTT1ItTU9OSVRPUi1GUkVRVUVOQ1ktU0VDUykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKGZuIFtdICguYWRkIHByb2Nlc3Nlcy1ldmVudC1tYW5hZ2VyIHN5bmMtcHJvY2Vzc2VzKSkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAoZm4gW10gKC5hZGQgcHJvY2Vzc2VzLWV2ZW50LW1hbmFnZXIgc3luYy1wcm9jZXNzZXMpKSkKKyAgICAgIChzY2hlZHVsZS1yZWN1cnJpbmcgKDpldmVudC10aW1lciBzdXBlcnZpc29yKQorICAgICAgICAgICAgICAgICAgICAgICAgICAoKiA2MCA1KQorICAgICAgICAgICAgICAgICAgICAgICAgICAoKiA2MCA1KQorICAgICAgICAgICAgICAgICAgICAgICAgICAoZm4gW10gKGxldCBbaGVhbHRoLWNvZGUgKGhlYWx0aGNoZWNrL2hlYWx0aC1jaGVjayBjb25mKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRzIChteS13b3JrZXItaWRzIGNvbmYpXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaWYgKG5vdCAoPSBoZWFsdGgtY29kZSAwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkb3NlcSBbaWQgaWRzXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2h1dGRvd24td29ya2VyIHN1cGVydmlzb3IgaWQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRocm93IChSdW50aW1lRXhjZXB0aW9uLiAiU3VwZXJ2aXNvciBmYWlsZWQgaGVhbHRoIGNoZWNrLiBFeGl0aW5nLiIpKSkpKSkpCisgICAgICA7OyBMYXVuY2ggYSB0aHJlYWQgdGhhdCBSdW5zIHByb2ZpbGVyIGNvbW1hbmRzIC4gU3RhcnRzIHdpdGggMzAgc2Vjb25kcyBkZWxheSwgZXZlcnkgMzAgc2Vjb25kcworICAgICAgKHNjaGVkdWxlLXJlY3VycmluZyAoOmV2ZW50LXRpbWVyIHN1cGVydmlzb3IpCisgICAgICAgICAgICAgICAgICAgICAgICAgIDMwCisgICAgICAgICAgICAgICAgICAgICAgICAgIDMwCisgICAgICAgICAgICAgICAgICAgICAgICAgIChmbiBbXSAoLmFkZCBldmVudC1tYW5hZ2VyIHJ1bi1wcm9maWxlci1hY3Rpb25zLWZuKSkpKQogICAgIChsb2ctbWVzc2FnZSAiU3RhcnRpbmcgc3VwZXJ2aXNvciB3aXRoIGlkICIgKDpzdXBlcnZpc29yLWlkIHN1cGVydmlzb3IpICIgYXQgaG9zdCAiICg6bXktaG9zdG5hbWUgc3VwZXJ2aXNvcikpCiAgICAgKHJlaWZ5CiAgICAgIFNodXRkb3duYWJsZQpAQCAtNTkxLDcgKzc1Myw3IEBACiAgICAgICAgIChsb2ctbWVzc2FnZSAiRmluaXNoZWQgZG93bmxvYWRpbmcgY29kZSBmb3Igc3Rvcm0gaWQgIiBzdG9ybS1pZCAiIGZyb20gIiBtYXN0ZXItY29kZS1kaXIpKSkpCiAKIChkZWZuIHdyaXRlLWxvZy1tZXRhZGF0YS10by15YW1sLWZpbGUhIFtzdG9ybS1pZCBwb3J0IGRhdGEgY29uZl0KLSAgKGxldCBbZmlsZSAoZ2V0LWxvZy1tZXRhZGF0YS1maWxlIHN0b3JtLWlkIHBvcnQpXQorICAobGV0IFtmaWxlIChnZXQtbG9nLW1ldGFkYXRhLWZpbGUgY29uZiBzdG9ybS1pZCBwb3J0KV0KICAgICA7O3J1biB3b3JrZXIgYXMgdXNlciBuZWVkcyB0aGUgZGlyZWN0b3J5IHRvIGhhdmUgc3BlY2lhbCBwZXJtaXNzaW9ucwogICAgIDs7IG9yIGl0IGlzIGluc2VjdXJlCiAgICAgKHdoZW4gKG5vdCAoLmV4aXN0cyAoLmdldFBhcmVudEZpbGUgZmlsZSkpKQpAQCAtNjAwLDcgKzc2Miw3IEBACiAgICAgICAgICAgICAoc2V0dXAtc3Rvcm0tY29kZS1kaXIgY29uZiAocmVhZC1zdXBlcnZpc29yLXN0b3JtLWNvbmYgY29uZiBzdG9ybS1pZCkgKC5nZXRDYW5vbmljYWxQYXRoICguZ2V0UGFyZW50RmlsZSBmaWxlKSkpKQogICAgICAgICAoLm1rZGlycyAoLmdldFBhcmVudEZpbGUgZmlsZSkpKSkKICAgICAobGV0IFt3cml0ZXIgKGphdmEuaW8uRmlsZVdyaXRlci4gZmlsZSkKLSAgICAgICAgeWFtbCAoWWFtbC4pXQorICAgICAgICAgIHlhbWwgKFlhbWwuKV0KICAgICAgICh0cnkKICAgICAgICAgKC5kdW1wIHlhbWwgZGF0YSB3cml0ZXIpCiAgICAgICAgIChmaW5hbGx5CkBAIC02MzIsMzEgKzc5NCwzNSBAQAogICAgIChzdHIgYXJjaC1yZXNvdXJjZS1yb290IEZpbGUvcGF0aFNlcGFyYXRvciByZXNvdXJjZS1yb290IEZpbGUvcGF0aFNlcGFyYXRvciAoY29uZiBKQVZBLUxJQlJBUlktUEFUSCkpKSkKIAogKGRlZm4gc3Vic3RpdHV0ZS1jaGlsZG9wdHMKLSAgIkdlbmVyYXRlcyBydW50aW1lIGNoaWxkb3B0cyBieSByZXBsYWNpbmcga2V5cyB3aXRoIHRvcG9sb2d5LWlkLCB3b3JrZXItaWQsIHBvcnQiCi0gIFt2YWx1ZSB3b3JrZXItaWQgdG9wb2xvZ3ktaWQgcG9ydF0KKyAgIkdlbmVyYXRlcyBydW50aW1lIGNoaWxkb3B0cyBieSByZXBsYWNpbmcga2V5cyB3aXRoIHRvcG9sb2d5LWlkLCB3b3JrZXItaWQsIHBvcnQsIG1lbS1vbmhlYXAiCisgIFt2YWx1ZSB3b3JrZXItaWQgdG9wb2xvZ3ktaWQgcG9ydCBtZW0tb25oZWFwXQogICAobGV0IFtyZXBsYWNlbWVudC1tYXAgeyIlSUQlIiAgICAgICAgICAoc3RyIHBvcnQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgIiVXT1JLRVItSUQlIiAgIChzdHIgd29ya2VyLWlkKQogICAgICAgICAgICAgICAgICAgICAgICAgICIlVE9QT0xPR1ktSUQlIiAgICAoc3RyIHRvcG9sb2d5LWlkKQotICAgICAgICAgICAgICAgICAgICAgICAgICIlV09SS0VSLVBPUlQlIiAoc3RyIHBvcnQpfQorICAgICAgICAgICAgICAgICAgICAgICAgICIlV09SS0VSLVBPUlQlIiAoc3RyIHBvcnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgIiVIRUFQLU1FTSUiIChzdHIgbWVtLW9uaGVhcCl9CiAgICAgICAgIHN1Yi1mbiAjKHJlZHVjZSAoZm4gW3N0cmluZyBlbnRyeV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFwcGx5IGNsb2p1cmUuc3RyaW5nL3JlcGxhY2Ugc3RyaW5nIGVudHJ5KSkKICAgICAgICAgICAgICAgICAgICAgICAgICUKICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50LW1hcCldCiAgICAgKGNvbmQKICAgICAgIChuaWw/IHZhbHVlKSBuaWwKLSAgICAgIChsaXN0PyB2YWx1ZSkgKG1hcCBzdWItZm4gdmFsdWUpCisgICAgICAoc2VxdWVudGlhbD8gdmFsdWUpICh2ZWMgKG1hcCBzdWItZm4gdmFsdWUpKQogICAgICAgOmVsc2UgKC0+IHZhbHVlIHN1Yi1mbiAoY2xvanVyZS5zdHJpbmcvc3BsaXQgIyJccysiKSkpKSkKIAotKGRlZm4gamF2YS1jbWQgW10KLSAgKGxldCBbamF2YS1ob21lICguZ2V0IChTeXN0ZW0vZ2V0ZW52KSAiSkFWQV9IT01FIildCi0gICAgKGlmIChuaWw/IGphdmEtaG9tZSkKLSAgICAgICJqYXZhIgotICAgICAgKHN0ciBqYXZhLWhvbWUgZmlsZS1wYXRoLXNlcGFyYXRvciAiYmluIiBmaWxlLXBhdGgtc2VwYXJhdG9yICJqYXZhIikKLSAgICAgICkpKQogCisoZGVmbiBjcmVhdGUtYXJ0aWZhY3RzLWxpbmsKKyAgIkNyZWF0ZSBhIHN5bWxpbmsgZnJvbSB3b3JrZGVyIGRpcmVjdG9yeSB0byBpdHMgcG9ydCBhcnRpZmFjdHMgZGlyZWN0b3J5IgorICBbY29uZiBzdG9ybS1pZCBwb3J0IHdvcmtlci1pZF0KKyAgKGxldCBbd29ya2VyLWRpciAod29ya2VyLXJvb3QgY29uZiB3b3JrZXItaWQpCisgICAgICAgIHRvcG8tZGlyICh3b3JrZXItYXJ0aWZhY3RzLXJvb3QgY29uZiBzdG9ybS1pZCldCisgICAgKGxvZy1tZXNzYWdlICJDcmVhdGluZyBzeW1saW5rcyBmb3Igd29ya2VyLWlkOiAiIHdvcmtlci1pZCAiIHN0b3JtLWlkOiAiCisgICAgICAgICAgICAgICAgIHN0b3JtLWlkICIgdG8gaXRzIHBvcnQgYXJ0aWZhY3RzIGRpcmVjdG9yeSIpCisgICAgKGlmICguZXhpc3RzIChGaWxlLiB3b3JrZXItZGlyKSkKKyAgICAgIChjcmVhdGUtc3ltbGluayEgd29ya2VyLWRpciB0b3BvLWRpciAiYXJ0aWZhY3RzIiBwb3J0KSkpKQogCiAoZGVmbWV0aG9kIGxhdW5jaC13b3JrZXIKLSAgICA6ZGlzdHJpYnV0ZWQgW3N1cGVydmlzb3Igc3Rvcm0taWQgcG9ydCB3b3JrZXItaWRdCisgICAgOmRpc3RyaWJ1dGVkIFtzdXBlcnZpc29yIHN0b3JtLWlkIHBvcnQgd29ya2VyLWlkIG1lbS1vbmhlYXBdCiAgICAgKGxldCBbY29uZiAoOmNvbmYgc3VwZXJ2aXNvcikKICAgICAgICAgICBydW4td29ya2VyLWFzLXVzZXIgKGNvbmYgU1VQRVJWSVNPUi1SVU4tV09SS0VSLUFTLVVTRVIpCiAgICAgICAgICAgc3Rvcm0taG9tZSAoU3lzdGVtL2dldFByb3BlcnR5ICJzdG9ybS5ob21lIikKQEAgLTY2NCw3ICs4MzAsMTEgQEAKICAgICAgICAgICBzdG9ybS1jb25mLWZpbGUgKFN5c3RlbS9nZXRQcm9wZXJ0eSAic3Rvcm0uY29uZi5maWxlIikKICAgICAgICAgICBzdG9ybS1sb2ctZGlyIChvciAoU3lzdGVtL2dldFByb3BlcnR5ICJzdG9ybS5sb2cuZGlyIikgKHN0ciBzdG9ybS1ob21lIGZpbGUtcGF0aC1zZXBhcmF0b3IgImxvZ3MiKSkKICAgICAgICAgICBzdG9ybS1sb2ctY29uZi1kaXIgKGNvbmYgU1RPUk0tTE9HNEoyLUNPTkYtRElSKQotICAgICAgICAgIHN0b3JtLWxvZzRqMi1jb25mLWRpciAob3Igc3Rvcm0tbG9nLWNvbmYtZGlyIChzdHIgc3Rvcm0taG9tZSBmaWxlLXBhdGgtc2VwYXJhdG9yICJsb2c0ajIiKSkKKyAgICAgICAgICBzdG9ybS1sb2c0ajItY29uZi1kaXIgKGlmIHN0b3JtLWxvZy1jb25mLWRpcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpZiAoaXMtYWJzb2x1dGUtcGF0aD8gc3Rvcm0tbG9nLWNvbmYtZGlyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rvcm0tbG9nLWNvbmYtZGlyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RyIHN0b3JtLWhvbWUgZmlsZS1wYXRoLXNlcGFyYXRvciBzdG9ybS1sb2ctY29uZi1kaXIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHIgc3Rvcm0taG9tZSBmaWxlLXBhdGgtc2VwYXJhdG9yICJsb2c0ajIiKSkKICAgICAgICAgICBzdG9ybXJvb3QgKHN1cGVydmlzb3Itc3Rvcm1kaXN0LXJvb3QgY29uZiBzdG9ybS1pZCkKICAgICAgICAgICBqbHAgKGpscCBzdG9ybXJvb3QgY29uZikKICAgICAgICAgICBzdG9ybWphciAoc3VwZXJ2aXNvci1zdG9ybWphci1wYXRoIHN0b3Jtcm9vdCkKQEAgLTY3NiwxNSArODQ2LDIyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAoYWRkLXRvLWNsYXNzcGF0aCBbc3Rvcm1qYXJdKQogICAgICAgICAgICAgICAgICAgICAgICAgKGFkZC10by1jbGFzc3BhdGggdG9wby1jbGFzc3BhdGgpKQogICAgICAgICAgIHRvcC1nYy1vcHRzIChzdG9ybS1jb25mIFRPUE9MT0dZLVdPUktFUi1HQy1DSElMRE9QVFMpCi0gICAgICAgICAgZ2Mtb3B0cyAoc3Vic3RpdHV0ZS1jaGlsZG9wdHMgKGlmIHRvcC1nYy1vcHRzIHRvcC1nYy1vcHRzIChjb25mIFdPUktFUi1HQy1DSElMRE9QVFMpKSB3b3JrZXItaWQgc3Rvcm0taWQgcG9ydCkKKyAgICAgICAgICBtZW0tb25oZWFwIChpZiAoYW5kIG1lbS1vbmhlYXAgKD4gbWVtLW9uaGVhcCAwKSkgOzsgbm90IG5pbCBhbmQgbm90IHplcm8KKyAgICAgICAgICAgICAgICAgICAgICAgKGludCAoTWF0aC9jZWlsIG1lbS1vbmhlYXApKSA7OyByb3VuZCB1cAorICAgICAgICAgICAgICAgICAgICAgICAoc3Rvcm0tY29uZiBXT1JLRVItSEVBUC1NRU1PUlktTUIpKSA7OyBvdGhlcndpc2UgdXNlIGRlZmF1bHQgdmFsdWUKKyAgICAgICAgICBnYy1vcHRzIChzdWJzdGl0dXRlLWNoaWxkb3B0cyAoaWYgdG9wLWdjLW9wdHMgdG9wLWdjLW9wdHMgKGNvbmYgV09SS0VSLUdDLUNISUxET1BUUykpIHdvcmtlci1pZCBzdG9ybS1pZCBwb3J0IG1lbS1vbmhlYXApCiAgICAgICAgICAgdG9wby13b3JrZXItbG9nd3JpdGVyLWNoaWxkb3B0cyAoc3Rvcm0tY29uZiBUT1BPTE9HWS1XT1JLRVItTE9HV1JJVEVSLUNISUxET1BUUykKICAgICAgICAgICB1c2VyIChzdG9ybS1jb25mIFRPUE9MT0dZLVNVQk1JVFRFUi1VU0VSKQorICAgICAgICAgIGxvZ2ZpbGVuYW1lICJ3b3JrZXIubG9nIgorICAgICAgICAgIHdvcmtlcnMtYXJ0aWZhY3RzICh3b3JrZXItYXJ0aWZhY3RzLXJvb3QgY29uZikKICAgICAgICAgICBsb2dnaW5nLXNlbnNpdGl2aXR5IChzdG9ybS1jb25mIFRPUE9MT0dZLUxPR0dJTkctU0VOU0lUSVZJVFkgIlMzIikKLSAgICAgICAgICBsb2dmaWxlbmFtZSAobG9ncy1maWxlbmFtZSBzdG9ybS1pZCBwb3J0KQogICAgICAgICAgIHdvcmtlci1jaGlsZG9wdHMgKHdoZW4tbGV0IFtzIChjb25mIFdPUktFUi1DSElMRE9QVFMpXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3Vic3RpdHV0ZS1jaGlsZG9wdHMgcyB3b3JrZXItaWQgc3Rvcm0taWQgcG9ydCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdWJzdGl0dXRlLWNoaWxkb3B0cyBzIHdvcmtlci1pZCBzdG9ybS1pZCBwb3J0IG1lbS1vbmhlYXApKQogICAgICAgICAgIHRvcG8td29ya2VyLWNoaWxkb3B0cyAod2hlbi1sZXQgW3MgKHN0b3JtLWNvbmYgVE9QT0xPR1ktV09SS0VSLUNISUxET1BUUyldCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN1YnN0aXR1dGUtY2hpbGRvcHRzIHMgd29ya2VyLWlkIHN0b3JtLWlkIHBvcnQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdWJzdGl0dXRlLWNoaWxkb3B0cyBzIHdvcmtlci1pZCBzdG9ybS1pZCBwb3J0IG1lbS1vbmhlYXApKQorICAgICAgICAgIHdvcmtlci0tcHJvZmlsZXItY2hpbGRvcHRzIChpZiAoY29uZiBXT1JLRVItUFJPRklMRVItRU5BQkxFRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdWJzdGl0dXRlLWNoaWxkb3B0cyAoY29uZiBXT1JLRVItUFJPRklMRVItQ0hJTERPUFRTKSB3b3JrZXItaWQgc3Rvcm0taWQgcG9ydCBtZW0tb25oZWFwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIpCiAgICAgICAgICAgdG9wb2xvZ3ktd29ya2VyLWVudmlyb25tZW50IChpZi1sZXQgW2VudiAoc3Rvcm0tY29uZiBUT1BPTE9HWS1FTlZJUk9OTUVOVCldCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1lcmdlIGVudiB7IkxEX0xJQlJBUllfUEFUSCIgamxwfSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IkxEX0xJQlJBUllfUEFUSCIgamxwfSkKQEAgLTY5MywyNCArODcwLDI5IEBACiAgICAgICAgICAgICAgICAgICAgICB0b3BvLXdvcmtlci1sb2d3cml0ZXItY2hpbGRvcHRzCiAgICAgICAgICAgICAgICAgICAgICAoc3RyICItRGxvZ2ZpbGUubmFtZT0iIGxvZ2ZpbGVuYW1lKQogICAgICAgICAgICAgICAgICAgICAgKHN0ciAiLURzdG9ybS5ob21lPSIgc3Rvcm0taG9tZSkKKyAgICAgICAgICAgICAgICAgICAgIChzdHIgIi1Ed29ya2Vycy5hcnRpZmFjdHM9IiB3b3JrZXJzLWFydGlmYWN0cykKICAgICAgICAgICAgICAgICAgICAgIChzdHIgIi1Ec3Rvcm0uaWQ9IiBzdG9ybS1pZCkKICAgICAgICAgICAgICAgICAgICAgIChzdHIgIi1Ed29ya2VyLmlkPSIgd29ya2VyLWlkKQogICAgICAgICAgICAgICAgICAgICAgKHN0ciAiLUR3b3JrZXIucG9ydD0iIHBvcnQpCiAgICAgICAgICAgICAgICAgICAgICAoc3RyICItRHN0b3JtLmxvZy5kaXI9IiBzdG9ybS1sb2ctZGlyKQogICAgICAgICAgICAgICAgICAgICAgKHN0ciAiLURsb2c0ai5jb25maWd1cmF0aW9uRmlsZT0iIHN0b3JtLWxvZzRqMi1jb25mLWRpciBmaWxlLXBhdGgtc2VwYXJhdG9yICJ3b3JrZXIueG1sIikKKyAgICAgICAgICAgICAgICAgICAgIChzdHIgIi1ETG9nNGpDb250ZXh0U2VsZWN0b3I9b3JnLmFwYWNoZS5sb2dnaW5nLmxvZzRqLmNvcmUuc2VsZWN0b3IuQmFzaWNDb250ZXh0U2VsZWN0b3IiKQogICAgICAgICAgICAgICAgICAgICAgImJhY2t0eXBlLnN0b3JtLkxvZ1dyaXRlciJdCiAgICAgICAgICAgICAgICAgICAgIFsoamF2YS1jbWQpICItc2VydmVyIl0KICAgICAgICAgICAgICAgICAgICAgd29ya2VyLWNoaWxkb3B0cwogICAgICAgICAgICAgICAgICAgICB0b3BvLXdvcmtlci1jaGlsZG9wdHMKICAgICAgICAgICAgICAgICAgICAgZ2Mtb3B0cworICAgICAgICAgICAgICAgICAgICB3b3JrZXItLXByb2ZpbGVyLWNoaWxkb3B0cwogICAgICAgICAgICAgICAgICAgICBbKHN0ciAiLURqYXZhLmxpYnJhcnkucGF0aD0iIGpscCkKICAgICAgICAgICAgICAgICAgICAgIChzdHIgIi1EbG9nZmlsZS5uYW1lPSIgbG9nZmlsZW5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAoc3RyICItRHN0b3JtLmhvbWU9IiBzdG9ybS1ob21lKQorICAgICAgICAgICAgICAgICAgICAgKHN0ciAiLUR3b3JrZXJzLmFydGlmYWN0cz0iIHdvcmtlcnMtYXJ0aWZhY3RzKQogICAgICAgICAgICAgICAgICAgICAgKHN0ciAiLURzdG9ybS5jb25mLmZpbGU9IiBzdG9ybS1jb25mLWZpbGUpCiAgICAgICAgICAgICAgICAgICAgICAoc3RyICItRHN0b3JtLm9wdGlvbnM9IiBzdG9ybS1vcHRpb25zKQogICAgICAgICAgICAgICAgICAgICAgKHN0ciAiLURzdG9ybS5sb2cuZGlyPSIgc3Rvcm0tbG9nLWRpcikKICAgICAgICAgICAgICAgICAgICAgIChzdHIgIi1EbG9nZ2luZy5zZW5zaXRpdml0eT0iIGxvZ2dpbmctc2Vuc2l0aXZpdHkpCiAgICAgICAgICAgICAgICAgICAgICAoc3RyICItRGxvZzRqLmNvbmZpZ3VyYXRpb25GaWxlPSIgc3Rvcm0tbG9nNGoyLWNvbmYtZGlyIGZpbGUtcGF0aC1zZXBhcmF0b3IgIndvcmtlci54bWwiKQorICAgICAgICAgICAgICAgICAgICAgKHN0ciAiLURMb2c0akNvbnRleHRTZWxlY3Rvcj1vcmcuYXBhY2hlLmxvZ2dpbmcubG9nNGouY29yZS5zZWxlY3Rvci5CYXNpY0NvbnRleHRTZWxlY3RvciIpCiAgICAgICAgICAgICAgICAgICAgICAoc3RyICItRHN0b3JtLmlkPSIgc3Rvcm0taWQpCiAgICAgICAgICAgICAgICAgICAgICAoc3RyICItRHdvcmtlci5pZD0iIHdvcmtlci1pZCkKICAgICAgICAgICAgICAgICAgICAgIChzdHIgIi1Ed29ya2VyLnBvcnQ9IiBwb3J0KQpAQCAtNzI0LDE2ICs5MDYsMTcgQEAKICAgICAgIChsb2ctbWVzc2FnZSAiTGF1bmNoaW5nIHdvcmtlciB3aXRoIGNvbW1hbmQ6ICIgKHNoZWxsLWNtZCBjb21tYW5kKSkKICAgICAgICh3cml0ZS1sb2ctbWV0YWRhdGEhIHN0b3JtLWNvbmYgdXNlciB3b3JrZXItaWQgc3Rvcm0taWQgcG9ydCBjb25mKQogICAgICAgKHNldC13b3JrZXItdXNlciEgY29uZiB3b3JrZXItaWQgdXNlcikKKyAgICAgIChjcmVhdGUtYXJ0aWZhY3RzLWxpbmsgY29uZiBzdG9ybS1pZCBwb3J0IHdvcmtlci1pZCkKICAgICAgIChsZXQgW2xvZy1wcmVmaXggKHN0ciAiV29ya2VyIFByb2Nlc3MgIiB3b3JrZXItaWQpCi0gICAgICAgICAgIGNhbGxiYWNrIChmbiBbZXhpdC1jb2RlXQotICAgICAgICAgICAgICAgICAgICAgICAgICAobG9nLW1lc3NhZ2UgbG9nLXByZWZpeCAiIGV4aXRlZCB3aXRoIGNvZGU6ICIgZXhpdC1jb2RlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAoYWRkLWRlYWQtd29ya2VyIHdvcmtlci1pZCkpXQorICAgICAgICAgICAgY2FsbGJhY2sgKGZuIFtleGl0LWNvZGVdCisgICAgICAgICAgICAgICAgICAgICAgIChsb2ctbWVzc2FnZSBsb2ctcHJlZml4ICIgZXhpdGVkIHdpdGggY29kZTogIiBleGl0LWNvZGUpCisgICAgICAgICAgICAgICAgICAgICAgIChhZGQtZGVhZC13b3JrZXIgd29ya2VyLWlkKSkKKyAgICAgICAgICAgIHdvcmtlci1kaXIgKHdvcmtlci1yb290IGNvbmYgd29ya2VyLWlkKV0KICAgICAgICAgKHJlbW92ZS1kZWFkLXdvcmtlciB3b3JrZXItaWQpCiAgICAgICAgIChpZiBydW4td29ya2VyLWFzLXVzZXIKLSAgICAgICAgICAobGV0IFt3b3JrZXItZGlyICh3b3JrZXItcm9vdCBjb25mIHdvcmtlci1pZCldCi0gICAgICAgICAgICAod29ya2VyLWxhdW5jaGVyIGNvbmYgdXNlciBbIndvcmtlciIgd29ya2VyLWRpciAod3JpdGUtc2NyaXB0IHdvcmtlci1kaXIgY29tbWFuZCA6ZW52aXJvbm1lbnQgdG9wb2xvZ3ktd29ya2VyLWVudmlyb25tZW50KV0gOmxvZy1wcmVmaXggbG9nLXByZWZpeCA6ZXhpdC1jb2RlLWNhbGxiYWNrIGNhbGxiYWNrKSkKLSAgICAgICAgICAobGF1bmNoLXByb2Nlc3MgY29tbWFuZCA6ZW52aXJvbm1lbnQgdG9wb2xvZ3ktd29ya2VyLWVudmlyb25tZW50IDpsb2ctcHJlZml4IGxvZy1wcmVmaXggOmV4aXQtY29kZS1jYWxsYmFjayBjYWxsYmFjaykKLSAgICAgICkpKSkKKyAgICAgICAgICAod29ya2VyLWxhdW5jaGVyIGNvbmYgdXNlciBbIndvcmtlciIgd29ya2VyLWRpciAod3JpdGUtc2NyaXB0IHdvcmtlci1kaXIgY29tbWFuZCA6ZW52aXJvbm1lbnQgdG9wb2xvZ3ktd29ya2VyLWVudmlyb25tZW50KV0gOmxvZy1wcmVmaXggbG9nLXByZWZpeCA6ZXhpdC1jb2RlLWNhbGxiYWNrIGNhbGxiYWNrIDpkaXJlY3RvcnkgKEZpbGUuIHdvcmtlci1kaXIpKQorICAgICAgICAgIChsYXVuY2gtcHJvY2VzcyBjb21tYW5kIDplbnZpcm9ubWVudCB0b3BvbG9neS13b3JrZXItZW52aXJvbm1lbnQgOmxvZy1wcmVmaXggbG9nLXByZWZpeCA6ZXhpdC1jb2RlLWNhbGxiYWNrIGNhbGxiYWNrIDpkaXJlY3RvcnkgKEZpbGUuIHdvcmtlci1kaXIpKSkKKyAgICAgICAgKSkpCiAKIDs7IGxvY2FsIGltcGxlbWVudGF0aW9uCiAKQEAgLTc3MSw3ICs5NTQsNyBAQAogKGRlZm1ldGhvZCBtay1jb2RlLWRpc3RyaWJ1dG9yIDpsb2NhbCBbY29uZl0gbmlsKQogCiAoZGVmbWV0aG9kIGxhdW5jaC13b3JrZXIKLSAgICA6bG9jYWwgW3N1cGVydmlzb3Igc3Rvcm0taWQgcG9ydCB3b3JrZXItaWRdCisgICAgOmxvY2FsIFtzdXBlcnZpc29yIHN0b3JtLWlkIHBvcnQgd29ya2VyLWlkIG1lbS1vbmhlYXBdCiAgICAgKGxldCBbY29uZiAoOmNvbmYgc3VwZXJ2aXNvcikKICAgICAgICAgICBwaWQgKHV1aWQpCiAgICAgICAgICAgd29ya2VyICh3b3JrZXIvbWstd29ya2VyIGNvbmYKQEAgLTc4OSw3ICs5NzIsOSBAQAogICAobGV0IFtjb25mIChyZWFkLXN0b3JtLWNvbmZpZyldCiAgICAgKHZhbGlkYXRlLWRpc3RyaWJ1dGVkLW1vZGUhIGNvbmYpCiAgICAgKGxldCBbc3VwZXJ2aXNvciAobWstc3VwZXJ2aXNvciBjb25mIG5pbCBzdXBlcnZpc29yKV0KLSAgICAgIChhZGQtc2h1dGRvd24taG9vay13aXRoLWZvcmNlLWtpbGwtaW4tMS1zZWMgIyguc2h1dGRvd24gc3VwZXJ2aXNvcikpKSkpCisgICAgICAoYWRkLXNodXRkb3duLWhvb2std2l0aC1mb3JjZS1raWxsLWluLTEtc2VjICMoLnNodXRkb3duIHN1cGVydmlzb3IpKSkKKyAgICAoZGVmZ2F1Z2Ugc3VwZXJ2aXNvcjpudW0tc2xvdHMtdXNlZC1nYXVnZSAjKGNvdW50IChteS13b3JrZXItaWRzIGNvbmYpKSkKKyAgICAoc3RhcnQtbWV0cmljcy1yZXBvcnRlcnMpKSkKIAogKGRlZm4gc3RhbmRhbG9uZS1zdXBlcnZpc29yIFtdCiAgIChsZXQgW2NvbmYtYXRvbSAoYXRvbSBuaWwpCmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9jbGovYmFja3R5cGUvc3Rvcm0vZGFlbW9uL3Rhc2suY2xqIGIvc3Rvcm0tY29yZS9zcmMvY2xqL2JhY2t0eXBlL3N0b3JtL2RhZW1vbi90YXNrLmNsagppbmRleCA5Y2YyYjg1Li43MTMzZmRmIDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9jbGovYmFja3R5cGUvc3Rvcm0vZGFlbW9uL3Rhc2suY2xqCisrKyBiL3N0b3JtLWNvcmUvc3JjL2Nsai9iYWNrdHlwZS9zdG9ybS9kYWVtb24vdGFzay5jbGoKQEAgLTE4LDYgKzE4LDcgQEAKICAgKDp1c2UgW2JhY2t0eXBlLnN0b3JtIGNvbmZpZyB1dGlsIGxvZ10pCiAgICg6aW1wb3J0IFtiYWNrdHlwZS5zdG9ybS5ob29rcyBJVGFza0hvb2tdKQogICAoOmltcG9ydCBbYmFja3R5cGUuc3Rvcm0udHVwbGUgVHVwbGUgVHVwbGVJbXBsXSkKKyAgKDppbXBvcnQgW2JhY2t0eXBlLnN0b3JtLmdyb3VwaW5nIExvYWRNYXBwaW5nXSkKICAgKDppbXBvcnQgW2JhY2t0eXBlLnN0b3JtLmdlbmVyYXRlZCBTcG91dFNwZWMgQm9sdCBTdGF0ZVNwb3V0U3BlYyBTdG9ybVRvcG9sb2d5XSkKICAgKDppbXBvcnQgW2JhY2t0eXBlLnN0b3JtLmhvb2tzLmluZm8gU3BvdXRBY2tJbmZvIFNwb3V0RmFpbEluZm8KICAgICAgICAgICAgIEVtaXRJbmZvIEJvbHRGYWlsSW5mbyBCb2x0QWNrSW5mb10pCkBAIC0xMDUsNyArMTA2LDcgQEAKIAogOzsgVE9ETzogdGhpcyBpcyBhbGwgZXhwZW5zaXZlLi4uIHNob3VsZCBiZSBwcmVjb21wdXRlZAogKGRlZm4gc2VuZC11bmFuY2hvcmVkCi0gIChbdGFzay1kYXRhIHN0cmVhbSB2YWx1ZXMgb3ZlcmZsb3ctYnVmZmVyXQorICBbdGFzay1kYXRhIHN0cmVhbSB2YWx1ZXNdCiAgICAgKGxldCBbXlRvcG9sb2d5Q29udGV4dCB0b3BvbG9neS1jb250ZXh0ICg6c3lzdGVtLWNvbnRleHQgdGFzay1kYXRhKQogICAgICAgICAgIHRhc2tzLWZuICg6dGFza3MtZm4gdGFzay1kYXRhKQogICAgICAgICAgIHRyYW5zZmVyLWZuICgtPiB0YXNrLWRhdGEgOmV4ZWN1dG9yLWRhdGEgOnRyYW5zZmVyLWZuKQpAQCAtMTE0LDE3ICsxMTUsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICguZ2V0VGhpc1Rhc2tJZCB0b3BvbG9neS1jb250ZXh0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtKV0KICAgICAgIChmYXN0LWxpc3QtaXRlciBbdCAodGFza3MtZm4gc3RyZWFtIHZhbHVlcyldCi0gICAgICAgICh0cmFuc2Zlci1mbiB0Ci0gICAgICAgICAgICAgICAgICAgICBvdXQtdHVwbGUKLSAgICAgICAgICAgICAgICAgICAgIG92ZXJmbG93LWJ1ZmZlcikKLSAgICAgICAgKSkpCi0gICAgKFt0YXNrLWRhdGEgc3RyZWFtIHZhbHVlc10KLSAgICAgIChzZW5kLXVuYW5jaG9yZWQgdGFzay1kYXRhIHN0cmVhbSB2YWx1ZXMgbmlsKQotICAgICAgKSkKKyAgICAgICAgKHRyYW5zZmVyLWZuIHQgb3V0LXR1cGxlKSkpKQogCiAoZGVmbiBtay10YXNrcy1mbiBbdGFzay1kYXRhXQogICAobGV0IFt0YXNrLWlkICg6dGFzay1pZCB0YXNrLWRhdGEpCiAgICAgICAgIGV4ZWN1dG9yLWRhdGEgKDpleGVjdXRvci1kYXRhIHRhc2stZGF0YSkKKyAgICAgICAgXkxvYWRNYXBwaW5nIGxvYWQtbWFwcGluZyAoOmxvYWQtbWFwcGluZyAoOndvcmtlciBleGVjdXRvci1kYXRhKSkKICAgICAgICAgY29tcG9uZW50LWlkICg6Y29tcG9uZW50LWlkIGV4ZWN1dG9yLWRhdGEpCiAgICAgICAgIF5Xb3JrZXJUb3BvbG9neUNvbnRleHQgd29ya2VyLWNvbnRleHQgKDp3b3JrZXItY29udGV4dCBleGVjdXRvci1kYXRhKQogICAgICAgICBzdG9ybS1jb25mICg6c3Rvcm0tY29uZiBleGVjdXRvci1kYXRhKQpAQCAtMTQ1LDExICsxNDEsOSBAQAogICAgICAgICAgICAgICAodGhyb3cgKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi4gIkNhbm5vdCBlbWl0RGlyZWN0IHRvIGEgdGFzayBleHBlY3RpbmcgYSByZWd1bGFyIGdyb3VwaW5nIikpKSAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAoYXBwbHktaG9va3MgdXNlci1jb250ZXh0IC5lbWl0IChFbWl0SW5mby4gdmFsdWVzIHN0cmVhbSB0YXNrLWlkIFtvdXQtdGFzay1pZF0pKQogICAgICAgICAgICAgKHdoZW4gKGVtaXQtc2FtcGxlcikKLSAgICAgICAgICAgICAgKGJ1aWx0aW4tbWV0cmljcy9lbWl0dGVkLXR1cGxlISAoOmJ1aWx0aW4tbWV0cmljcyB0YXNrLWRhdGEpIGV4ZWN1dG9yLXN0YXRzIHN0cmVhbSkKICAgICAgICAgICAgICAgKHN0YXRzL2VtaXR0ZWQtdHVwbGUhIGV4ZWN1dG9yLXN0YXRzIHN0cmVhbSkKICAgICAgICAgICAgICAgKGlmIG91dC10YXNrLWlkCi0gICAgICAgICAgICAgICAgKHN0YXRzL3RyYW5zZmVycmVkLXR1cGxlcyEgZXhlY3V0b3Itc3RhdHMgc3RyZWFtIDEpCi0gICAgICAgICAgICAgICAgKGJ1aWx0aW4tbWV0cmljcy90cmFuc2ZlcnJlZC10dXBsZSEgKDpidWlsdGluLW1ldHJpY3MgdGFzay1kYXRhKSBleGVjdXRvci1zdGF0cyBzdHJlYW0gMSkpKQorICAgICAgICAgICAgICAgIChzdGF0cy90cmFuc2ZlcnJlZC10dXBsZXMhIGV4ZWN1dG9yLXN0YXRzIHN0cmVhbSAxKSkpCiAgICAgICAgICAgICAoaWYgb3V0LXRhc2staWQgW291dC10YXNrLWlkXSkKICAgICAgICAgICAgICkpCiAgICAgICAgIChbXlN0cmluZyBzdHJlYW0gXkxpc3QgdmFsdWVzXQpAQCAtMTYwLDcgKzE1NCw3IEBACiAgICAgICAgICAgICAgICAod2hlbiAoPSA6ZGlyZWN0IGdyb3VwZXIpCiAgICAgICAgICAgICAgICAgICA7OyAgVE9ETzogdGhpcyBpcyB3cm9uZywgbmVlZCB0byBjaGVjayBob3cgdGhlIHN0cmVhbSB3YXMgZGVjbGFyZWQKICAgICAgICAgICAgICAgICAgICh0aHJvdyAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLiAiQ2Fubm90IGRvIHJlZ3VsYXIgZW1pdCB0byBkaXJlY3Qgc3RyZWFtIikpKQotICAgICAgICAgICAgICAgKGxldCBbY29tcC10YXNrcyAoZ3JvdXBlciB0YXNrLWlkIHZhbHVlcyldCisgICAgICAgICAgICAgICAobGV0IFtjb21wLXRhc2tzIChncm91cGVyIHRhc2staWQgdmFsdWVzIGxvYWQtbWFwcGluZyldCiAgICAgICAgICAgICAgICAgIChpZiAob3IgKHNlcXVlbnRpYWw/IGNvbXAtdGFza3MpIChpbnN0YW5jZT8gQ29sbGVjdGlvbiBjb21wLXRhc2tzKSkKICAgICAgICAgICAgICAgICAgICAoLmFkZEFsbCBvdXQtdGFza3MgY29tcC10YXNrcykKICAgICAgICAgICAgICAgICAgICAoLmFkZCBvdXQtdGFza3MgY29tcC10YXNrcykKQEAgLTE2OCw5ICsxNjIsNyBAQAogICAgICAgICAgICAgIChhcHBseS1ob29rcyB1c2VyLWNvbnRleHQgLmVtaXQgKEVtaXRJbmZvLiB2YWx1ZXMgc3RyZWFtIHRhc2staWQgb3V0LXRhc2tzKSkKICAgICAgICAgICAgICAod2hlbiAoZW1pdC1zYW1wbGVyKQogICAgICAgICAgICAgICAgKHN0YXRzL2VtaXR0ZWQtdHVwbGUhIGV4ZWN1dG9yLXN0YXRzIHN0cmVhbSkKLSAgICAgICAgICAgICAgIChidWlsdGluLW1ldHJpY3MvZW1pdHRlZC10dXBsZSEgKDpidWlsdGluLW1ldHJpY3MgdGFzay1kYXRhKSBleGVjdXRvci1zdGF0cyBzdHJlYW0pICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgIChzdGF0cy90cmFuc2ZlcnJlZC10dXBsZXMhIGV4ZWN1dG9yLXN0YXRzIHN0cmVhbSAoY291bnQgb3V0LXRhc2tzKSkKLSAgICAgICAgICAgICAgIChidWlsdGluLW1ldHJpY3MvdHJhbnNmZXJyZWQtdHVwbGUhICg6YnVpbHRpbi1tZXRyaWNzIHRhc2stZGF0YSkgZXhlY3V0b3Itc3RhdHMgc3RyZWFtIChjb3VudCBvdXQtdGFza3MpKSkKKyAgICAgICAgICAgICAgIChzdGF0cy90cmFuc2ZlcnJlZC10dXBsZXMhIGV4ZWN1dG9yLXN0YXRzIHN0cmVhbSAoY291bnQgb3V0LXRhc2tzKSkpCiAgICAgICAgICAgICAgb3V0LXRhc2tzKSkpCiAgICAgKSkKIApAQCAtMTgwLDcgKzE3Miw3IEBACiAgICAgOnRhc2staWQgdGFzay1pZAogICAgIDpzeXN0ZW0tY29udGV4dCAoc3lzdGVtLXRvcG9sb2d5LWNvbnRleHQgKDp3b3JrZXIgZXhlY3V0b3ItZGF0YSkgZXhlY3V0b3ItZGF0YSB0YXNrLWlkKQogICAgIDp1c2VyLWNvbnRleHQgKHVzZXItdG9wb2xvZ3ktY29udGV4dCAoOndvcmtlciBleGVjdXRvci1kYXRhKSBleGVjdXRvci1kYXRhIHRhc2staWQpCi0gICAgOmJ1aWx0aW4tbWV0cmljcyAoYnVpbHRpbi1tZXRyaWNzL21ha2UtZGF0YSAoOnR5cGUgZXhlY3V0b3ItZGF0YSkpCisgICAgOmJ1aWx0aW4tbWV0cmljcyAoYnVpbHRpbi1tZXRyaWNzL21ha2UtZGF0YSAoOnR5cGUgZXhlY3V0b3ItZGF0YSkgKDpzdGF0cyBleGVjdXRvci1kYXRhKSkKICAgICA6dGFza3MtZm4gKG1rLXRhc2tzLWZuIDw+KQogICAgIDpvYmplY3QgKGdldC10YXNrLW9iamVjdCAoLmdldFJhd1RvcG9sb2d5IF5Ub3BvbG9neUNvbnRleHQgKDpzeXN0ZW0tY29udGV4dCA8PikpICg6Y29tcG9uZW50LWlkIGV4ZWN1dG9yLWRhdGEpKSkpCiAKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2Nsai9iYWNrdHlwZS9zdG9ybS9kYWVtb24vd29ya2VyLmNsaiBiL3N0b3JtLWNvcmUvc3JjL2Nsai9iYWNrdHlwZS9zdG9ybS9kYWVtb24vd29ya2VyLmNsagppbmRleCA3ODFhOTU5Li5kOTc4MzE1IDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9jbGovYmFja3R5cGUvc3Rvcm0vZGFlbW9uL3dvcmtlci5jbGoKKysrIGIvc3Rvcm0tY29yZS9zcmMvY2xqL2JhY2t0eXBlL3N0b3JtL2RhZW1vbi93b3JrZXIuY2xqCkBAIC0xNiwyNCArMTYsMzIgQEAKIChucyBiYWNrdHlwZS5zdG9ybS5kYWVtb24ud29ya2VyCiAgICg6dXNlIFtiYWNrdHlwZS5zdG9ybS5kYWVtb24gY29tbW9uXSkKICAgKDp1c2UgW2JhY2t0eXBlLnN0b3JtIGNvbmZpZyBsb2cgdXRpbCB0aW1lciBsb2NhbC1zdGF0ZV0pCisgICg6cmVxdWlyZSBbY2xqLXRpbWUuY29yZSA6YXMgdGltZV0pCisgICg6cmVxdWlyZSBbY2xqLXRpbWUuY29lcmNlIDphcyBjb2VyY2VdKQogICAoOnJlcXVpcmUgW2JhY2t0eXBlLnN0b3JtLmRhZW1vbiBbZXhlY3V0b3IgOmFzIGV4ZWN1dG9yXV0pCiAgICg6cmVxdWlyZSBbYmFja3R5cGUuc3Rvcm0gW2Rpc3J1cHRvciA6YXMgZGlzcnVwdG9yXSBbY2x1c3RlciA6YXMgY2x1c3Rlcl1dKQogICAoOnJlcXVpcmUgW2Nsb2p1cmUuc2V0IDphcyBzZXRdKQogICAoOnJlcXVpcmUgW2JhY2t0eXBlLnN0b3JtLm1lc3NhZ2luZy5sb2FkZXIgOmFzIG1zZy1sb2FkZXJdKQotICAoOmltcG9ydCBbamF2YS51dGlsLmNvbmN1cnJlbnQgRXhlY3V0b3JzXSkKKyAgKDppbXBvcnQgW2phdmEudXRpbC5jb25jdXJyZW50IEV4ZWN1dG9yc10KKyAgICAgICAgICAgW2JhY2t0eXBlLnN0b3JtLmhvb2tzIElXb3JrZXJIb29rIEJhc2VXb3JrZXJIb29rXSkKICAgKDppbXBvcnQgW2phdmEudXRpbCBBcnJheUxpc3QgSGFzaE1hcF0pCiAgICg6aW1wb3J0IFtiYWNrdHlwZS5zdG9ybS51dGlscyBVdGlscyBUcmFuc2ZlckRyYWluZXIgVGhyaWZ0VG9wb2xvZ3lVdGlscyBXb3JrZXJCYWNrcHJlc3N1cmVUaHJlYWQgRGlzcnVwdG9yUXVldWVdKQorICAoOmltcG9ydCBbYmFja3R5cGUuc3Rvcm0uZ3JvdXBpbmcgTG9hZE1hcHBpbmddKQogICAoOmltcG9ydCBbYmFja3R5cGUuc3Rvcm0ubWVzc2FnaW5nIFRyYW5zcG9ydEZhY3RvcnldKQogICAoOmltcG9ydCBbYmFja3R5cGUuc3Rvcm0ubWVzc2FnaW5nIFRhc2tNZXNzYWdlIElDb250ZXh0IElDb25uZWN0aW9uIENvbm5lY3Rpb25XaXRoU3RhdHVzIENvbm5lY3Rpb25XaXRoU3RhdHVzJFN0YXR1c10pCiAgICg6aW1wb3J0IFtiYWNrdHlwZS5zdG9ybS5kYWVtb24gU2h1dGRvd25hYmxlXSkKICAgKDppbXBvcnQgW2JhY2t0eXBlLnN0b3JtLnNlcmlhbGl6YXRpb24gS3J5b1R1cGxlU2VyaWFsaXplcl0pCiAgICg6aW1wb3J0IFtiYWNrdHlwZS5zdG9ybS5nZW5lcmF0ZWQgU3Rvcm1Ub3BvbG9neV0pCi0gICg6aW1wb3J0IFtiYWNrdHlwZS5zdG9ybS50dXBsZSBGaWVsZHNdKQorICAoOmltcG9ydCBbYmFja3R5cGUuc3Rvcm0udHVwbGUgQWRkcmVzc2VkVHVwbGUgRmllbGRzXSkKICAgKDppbXBvcnQgW2JhY2t0eXBlLnN0b3JtLnRhc2sgV29ya2VyVG9wb2xvZ3lDb250ZXh0XSkKICAgKDppbXBvcnQgW2JhY2t0eXBlLnN0b3JtIENvbnN0YW50c10pCiAgICg6aW1wb3J0IFtiYWNrdHlwZS5zdG9ybS5zZWN1cml0eS5hdXRoIEF1dGhVdGlsc10pCiAgICg6aW1wb3J0IFtqYXZheC5zZWN1cml0eS5hdXRoIFN1YmplY3RdKQogICAoOmltcG9ydCBbamF2YS5zZWN1cml0eSBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uXSkKKyAgKDppbXBvcnQgW29yZy5hcGFjaGUubG9nZ2luZy5sb2c0aiBMb2dNYW5hZ2VyXSkKKyAgKDppbXBvcnQgW29yZy5hcGFjaGUubG9nZ2luZy5sb2c0aiBMZXZlbF0pCisgICg6aW1wb3J0IFtvcmcuYXBhY2hlLmxvZ2dpbmcubG9nNGouY29yZS5jb25maWcgTG9nZ2VyQ29uZmlnXSkKKyAgKDppbXBvcnQgW2JhY2t0eXBlLnN0b3JtLmdlbmVyYXRlZCBMb2dDb25maWcgTG9nTGV2ZWxBY3Rpb25dKQogICAoOmdlbi1jbGFzcykpCiAKIChkZWZtdWx0aSBtay1zdWljaWRlLWZuIGNsdXN0ZXItbW9kZSkKQEAgLTk2LDEwICsxMDQsMTUgQEAKICAgICAgICAgZmxhdHRlbgogICAgICAgICBzZXQgKSkpCiAKKyhkZWZuIGdldC1kZXN0CisgIFteQWRkcmVzc2VkVHVwbGUgYWRkcmVzc2VkLXR1cGxlXQorICAiZ2V0IHRoZSBkZXN0aW5hdGlvbiBmb3IgYW4gQWRkcmVzc2VkVHVwbGUiCisgICguZ2V0RGVzdCBhZGRyZXNzZWQtdHVwbGUpKQorCiAoZGVmbiBtay10cmFuc2Zlci1sb2NhbC1mbiBbd29ya2VyXQogICAobGV0IFtzaG9ydC1leGVjdXRvci1yZWNlaXZlLXF1ZXVlLW1hcCAoOnNob3J0LWV4ZWN1dG9yLXJlY2VpdmUtcXVldWUtbWFwIHdvcmtlcikKICAgICAgICAgdGFzay0+c2hvcnQtZXhlY3V0b3IgKDp0YXNrLT5zaG9ydC1leGVjdXRvciB3b3JrZXIpCi0gICAgICAgIHRhc2stZ2V0dGVyIChjb21wICMoZ2V0IHRhc2stPnNob3J0LWV4ZWN1dG9yICUpIGZhc3QtZmlyc3QpXQorICAgICAgICB0YXNrLWdldHRlciAoY29tcCAjKGdldCB0YXNrLT5zaG9ydC1leGVjdXRvciAlKSBnZXQtZGVzdCldCiAgICAgKGZuIFt0dXBsZS1iYXRjaF0KICAgICAgIChsZXQgW2dyb3VwZWQgKGZhc3QtZ3JvdXAtYnkgdGFzay1nZXR0ZXIgdHVwbGUtYmF0Y2gpXQogICAgICAgICAoZmFzdC1tYXAtaXRlciBbW3Nob3J0LWV4ZWN1dG9yIHBhaXJzXSBncm91cGVkXQpAQCAtMTIzLDEyICsxMzYsMTMgQEAKICAgICAgICAgICAgIHBvcnQgKDpwb3J0IHdvcmtlcikKICAgICAgICAgICAgIHN0b3JtLWNsdXN0ZXItc3RhdGUgKDpzdG9ybS1jbHVzdGVyLXN0YXRlIHdvcmtlcikKICAgICAgICAgICAgIHByZXYtYmFja3ByZXNzdXJlLWZsYWcgQCg6YmFja3ByZXNzdXJlIHdvcmtlcildCi0gICAgICAgIChpZiBleGVjdXRvcnMgCi0gICAgICAgICAgKGlmIChyZWR1Y2UgIyhvciAlMSAlMikgKG1hcCAjKC5nZXQtYmFja3ByZXNzdXJlLWZsYWcgJTEpIGV4ZWN1dG9ycykpCi0gICAgICAgICAgICAocmVzZXQhICg6YmFja3ByZXNzdXJlIHdvcmtlcikgdHJ1ZSkgICA7OyBhdCBsZWFzdCBvbmUgZXhlY3V0b3IgaGFzIHNldCBiYWNrcHJlc3N1cmUKLSAgICAgICAgICAgIChyZXNldCEgKDpiYWNrcHJlc3N1cmUgd29ya2VyKSBmYWxzZSkpKSA7OyBubyBleGVjdXRvciBoYXMgYmFja3ByZXNzdXJlIHNldAorICAgICAgICAod2hlbiBleGVjdXRvcnMKKyAgICAgICAgICAocmVzZXQhICg6YmFja3ByZXNzdXJlIHdvcmtlcikKKyAgICAgICAgICAgICAgICAgIChvciBAKDp0cmFuc2Zlci1iYWNrcHJlc3N1cmUgd29ya2VyKQorICAgICAgICAgICAgICAgICAgICAgIChyZWR1Y2UgIyhvciAlMSAlMikgKG1hcCAjKC5nZXQtYmFja3ByZXNzdXJlLWZsYWcgJTEpIGV4ZWN1dG9ycykpKSkpCiAgICAgICAgIDs7IHVwZGF0ZSB0aGUgd29ya2VyJ3MgYmFja3ByZXNzdXJlIGZsYWcgdG8gem9va2VlcGVyIG9ubHkgd2hlbiBpdCBoYXMgY2hhbmdlZAotICAgICAgICAoaWYgKG5vdD0gcHJldi1iYWNrcHJlc3N1cmUtZmxhZyBAKDpiYWNrcHJlc3N1cmUgd29ya2VyKSkKKyAgICAgICAgKGxvZy1kZWJ1ZyAiQlAgIiBAKDpiYWNrcHJlc3N1cmUgd29ya2VyKSAiIFdBUyAiIHByZXYtYmFja3ByZXNzdXJlLWZsYWcpCisgICAgICAgICh3aGVuIChub3Q9IHByZXYtYmFja3ByZXNzdXJlLWZsYWcgQCg6YmFja3ByZXNzdXJlIHdvcmtlcikpCiAgICAgICAgICAgKC53b3JrZXItYmFja3ByZXNzdXJlISBzdG9ybS1jbHVzdGVyLXN0YXRlIHN0b3JtLWlkIGFzc2lnbm1lbnQtaWQgcG9ydCBAKDpiYWNrcHJlc3N1cmUgd29ya2VyKSkpCiAgICAgICAgICkpKSkKIApAQCAtMTM3LDE0ICsxNTEsMTEgQEAKICAgY2hlY2sgaGlnaFdhdGVyTWFyayBhbmQgbG93V2F0ZXJNYXJrIGZvciBiYWNrcHJlc3N1cmUiCiAgIChkaXNydXB0b3IvZGlzcnVwdG9yLWJhY2twcmVzc3VyZS1oYW5kbGVyCiAgICAgKGZuIFtdCi0gICAgICAiV2hlbiB3b3JrZXIncyBxdWV1ZSBpcyBhYm92ZSBoaWdoV2F0ZXJNYXJrLCB3ZSBzZXQgaXRzIGJhY2twcmVzc3VyZSBmbGFnIgotICAgICAgKGlmIChub3QgQCg6YmFja3ByZXNzdXJlIHdvcmtlcikpCi0gICAgICAgIChkbyAocmVzZXQhICg6YmFja3ByZXNzdXJlIHdvcmtlcikgdHJ1ZSkKLSAgICAgICAgICAgIChXb3JrZXJCYWNrcHJlc3N1cmVUaHJlYWQvbm90aWZ5QmFja3ByZXNzdXJlQ2hlY2tlciAoOmJhY2twcmVzc3VyZS10cmlnZ2VyIHdvcmtlcikpKSkpICA7OyBzZXQgYmFja3ByZXNzdXJlIG5vIG1hdHRlciBob3cgdGhlIGV4ZWN1dG9ycyBhcmUKKyAgICAgIChyZXNldCEgKDp0cmFuc2Zlci1iYWNrcHJlc3N1cmUgd29ya2VyKSB0cnVlKQorICAgICAgKFdvcmtlckJhY2twcmVzc3VyZVRocmVhZC9ub3RpZnlCYWNrcHJlc3N1cmVDaGVja2VyICg6YmFja3ByZXNzdXJlLXRyaWdnZXIgd29ya2VyKSkpCiAgICAgKGZuIFtdCi0gICAgICAiSWYgd29ya2VyJ3MgcXVldWUgaXMgYmVsb3cgbG93IHdhdGVybWFyaywgd2UgZG8gbm90aGluZyBzaW5jZSB3ZSB3YW50IHRoZQotICAgICAgV29ya2VyQmFja1ByZXNzdXJlVGhyZWFkIHRvIGFsc28gY2hlY2sgZm9yIGFsbCB0aGUgZXhlY3V0b3JzJyBzdGF0dXMiCi0gICAgICApKSkKKyAgICAgIChyZXNldCEgKDp0cmFuc2Zlci1iYWNrcHJlc3N1cmUgd29ya2VyKSBmYWxzZSkKKyAgICAgIChXb3JrZXJCYWNrcHJlc3N1cmVUaHJlYWQvbm90aWZ5QmFja3ByZXNzdXJlQ2hlY2tlciAoOmJhY2twcmVzc3VyZS10cmlnZ2VyIHdvcmtlcikpKSkpCiAKIChkZWZuIG1rLXRyYW5zZmVyLWZuIFt3b3JrZXJdCiAgIChsZXQgW2xvY2FsLXRhc2tzICgtPiB3b3JrZXIgOnRhc2staWRzIHNldCkKQEAgLTE1NSwyNCArMTY2LDI2IEBACiAKICAgICAgICAgdHJhbnNmZXItZm4KICAgICAgICAgICAoZm4gW15LcnlvVHVwbGVTZXJpYWxpemVyIHNlcmlhbGl6ZXIgdHVwbGUtYmF0Y2hdCi0gICAgICAgICAgICAobGV0IFtsb2NhbCAoQXJyYXlMaXN0LikKLSAgICAgICAgICAgICAgICAgIHJlbW90ZU1hcCAoSGFzaE1hcC4pXQotICAgICAgICAgICAgICAoZmFzdC1saXN0LWl0ZXIgW1t0YXNrIHR1cGxlIDphcyBwYWlyXSB0dXBsZS1iYXRjaF0KLSAgICAgICAgICAgICAgICAoaWYgKGxvY2FsLXRhc2tzIHRhc2spCi0gICAgICAgICAgICAgICAgICAoLmFkZCBsb2NhbCBwYWlyKQorICAgICAgICAgICAgKGxldCBbXkFycmF5TGlzdCBsb2NhbCAoQXJyYXlMaXN0LikKKyAgICAgICAgICAgICAgICAgIF5IYXNoTWFwIHJlbW90ZU1hcCAoSGFzaE1hcC4pXQorICAgICAgICAgICAgICAoZmFzdC1saXN0LWl0ZXIgW15BZGRyZXNzZWRUdXBsZSBhZGRyZXNzZWQtdHVwbGUgdHVwbGUtYmF0Y2hdCisgICAgICAgICAgICAgICAgKGxldCBbdGFzayAoLmdldERlc3QgYWRkcmVzc2VkLXR1cGxlKQorICAgICAgICAgICAgICAgICAgICAgIHR1cGxlICguZ2V0VHVwbGUgYWRkcmVzc2VkLXR1cGxlKV0KKyAgICAgICAgICAgICAgICAgIChpZiAobG9jYWwtdGFza3MgdGFzaykKKyAgICAgICAgICAgICAgICAgICAgKC5hZGQgbG9jYWwgYWRkcmVzc2VkLXR1cGxlKQogCi0gICAgICAgICAgICAgICAgICA7O1VzaW5nIGphdmEgb2JqZWN0cyBkaXJlY3RseSB0byBhdm9pZCBwZXJmb3JtYW5jZSBpc3N1ZXMgaW4gamF2YSBjb2RlCi0gICAgICAgICAgICAgICAgICAoZG8KLSAgICAgICAgICAgICAgICAgICAgKHdoZW4gKG5vdCAoLmdldCByZW1vdGVNYXAgdGFzaykpCi0gICAgICAgICAgICAgICAgICAgICAgKC5wdXQgcmVtb3RlTWFwIHRhc2sgKEFycmF5TGlzdC4pKSkKLSAgICAgICAgICAgICAgICAgICAgKGxldCBbcmVtb3RlICguZ2V0IHJlbW90ZU1hcCB0YXNrKV0KLSAgICAgICAgICAgICAgICAgICAgICAoaWYgKG5vdC1uaWw/IHRhc2spCi0gICAgICAgICAgICAgICAgICAgICAgICAoLmFkZCByZW1vdGUgKFRhc2tNZXNzYWdlLiB0YXNrICguc2VyaWFsaXplIHNlcmlhbGl6ZXIgdHVwbGUpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIChsb2ctd2FybiAiQ2FuJ3QgdHJhbnNmZXIgdHVwbGUgLSB0YXNrIHZhbHVlIGlzIG5pbC4gdHVwbGUgdHlwZTogIiAocHItc3RyICh0eXBlIHR1cGxlKSkgIiBhbmQgaW5mb3JtYXRpb246ICIgKHByLXN0ciB0dXBsZSkpKQotICAgICAgICAgICAgICAgICAgICAgKSkpKQorICAgICAgICAgICAgICAgICAgICA7O1VzaW5nIGphdmEgb2JqZWN0cyBkaXJlY3RseSB0byBhdm9pZCBwZXJmb3JtYW5jZSBpc3N1ZXMgaW4gamF2YSBjb2RlCisgICAgICAgICAgICAgICAgICAgIChkbworICAgICAgICAgICAgICAgICAgICAgICh3aGVuIChub3QgKC5nZXQgcmVtb3RlTWFwIHRhc2spKQorICAgICAgICAgICAgICAgICAgICAgICAgKC5wdXQgcmVtb3RlTWFwIHRhc2sgKEFycmF5TGlzdC4pKSkKKyAgICAgICAgICAgICAgICAgICAgICAobGV0IFteQXJyYXlMaXN0IHJlbW90ZSAoLmdldCByZW1vdGVNYXAgdGFzayldCisgICAgICAgICAgICAgICAgICAgICAgICAoaWYgKG5vdC1uaWw/IHRhc2spCisgICAgICAgICAgICAgICAgICAgICAgICAgICguYWRkIHJlbW90ZSAoVGFza01lc3NhZ2UuIHRhc2sgXmJ5dGVzICguc2VyaWFsaXplIHNlcmlhbGl6ZXIgdHVwbGUpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvZy13YXJuICJDYW4ndCB0cmFuc2ZlciB0dXBsZSAtIHRhc2sgdmFsdWUgaXMgbmlsLiB0dXBsZSB0eXBlOiAiIChwci1zdHIgKHR5cGUgdHVwbGUpKSAiIGFuZCBpbmZvcm1hdGlvbjogIiAocHItc3RyIHR1cGxlKSkpCisgICAgICAgICAgICAgICAgICAgICAgICkpKSkpCiAKLSAgICAgICAgICAgICAgKGxvY2FsLXRyYW5zZmVyIGxvY2FsKQotICAgICAgICAgICAgICAoZGlzcnVwdG9yL3B1Ymxpc2ggdHJhbnNmZXItcXVldWUgcmVtb3RlTWFwKSkpXQorICAgICAgICAgICAgICAod2hlbiAobm90ICguaXNFbXB0eSBsb2NhbCkpIChsb2NhbC10cmFuc2ZlciBsb2NhbCkpCisgICAgICAgICAgICAgICh3aGVuIChub3QgKC5pc0VtcHR5IHJlbW90ZU1hcCkpIChkaXNydXB0b3IvcHVibGlzaCB0cmFuc2Zlci1xdWV1ZSByZW1vdGVNYXApKSkpXQogICAgIChpZiB0cnktc2VyaWFsaXplLWxvY2FsCiAgICAgICAoZG8KICAgICAgICAgKGxvZy13YXJuICJXSUxMIFRSWSBUTyBTRVJJQUxJWkUgQUxMIFRVUExFUyAoVHVybiBvZmYgIiBUT1BPTE9HWS1URVNUSU5HLUFMV0FZUy1UUlktU0VSSUFMSVpFICIgZm9yIHByb2R1Y3Rpb24pIikKQEAgLTE4Nyw3ICsyMDAsOCBAQAogICAgICAgIChtYXAgKGZuIFtlXSBbZSAoZGlzcnVwdG9yL2Rpc3J1cHRvci1xdWV1ZSAoc3RyICJyZWNlaXZlLXF1ZXVlIiBlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3Rvcm0tY29uZiBUT1BPTE9HWS1FWEVDVVRPUi1SRUNFSVZFLUJVRkZFUi1TSVpFKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3Rvcm0tY29uZiBUT1BPTE9HWS1ESVNSVVBUT1ItV0FJVC1USU1FT1VULU1JTExJUykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOndhaXQtc3RyYXRlZ3kgKHN0b3JtLWNvbmYgVE9QT0xPR1ktRElTUlVQVE9SLVdBSVQtU1RSQVRFR1kpKV0pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6YmF0Y2gtc2l6ZSAoc3Rvcm0tY29uZiBUT1BPTE9HWS1ESVNSVVBUT1ItQkFUQ0gtU0laRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmJhdGNoLXRpbWVvdXQgKHN0b3JtLWNvbmYgVE9QT0xPR1ktRElTUlVQVE9SLUJBVENILVRJTUVPVVQtTUlMTElTKSldKSkKICAgICAgICAoaW50byB7fSkKICAgICAgICApKQogCkBAIC0yMjksNyArMjQzLDggQEAKICAgICAgICAgZXhlY3V0b3JzIChzZXQgKHJlYWQtd29ya2VyLWV4ZWN1dG9ycyBzdG9ybS1jb25mIHN0b3JtLWNsdXN0ZXItc3RhdGUgc3Rvcm0taWQgYXNzaWdubWVudC1pZCBwb3J0IGFzc2lnbm1lbnQtdmVyc2lvbnMpKQogICAgICAgICB0cmFuc2Zlci1xdWV1ZSAoZGlzcnVwdG9yL2Rpc3J1cHRvci1xdWV1ZSAid29ya2VyLXRyYW5zZmVyLXF1ZXVlIiAoc3Rvcm0tY29uZiBUT1BPTE9HWS1UUkFOU0ZFUi1CVUZGRVItU0laRSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0b3JtLWNvbmYgVE9QT0xPR1ktRElTUlVQVE9SLVdBSVQtVElNRU9VVC1NSUxMSVMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDp3YWl0LXN0cmF0ZWd5IChzdG9ybS1jb25mIFRPUE9MT0dZLURJU1JVUFRPUi1XQUlULVNUUkFURUdZKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmJhdGNoLXNpemUgKHN0b3JtLWNvbmYgVE9QT0xPR1ktRElTUlVQVE9SLUJBVENILVNJWkUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpiYXRjaC10aW1lb3V0IChzdG9ybS1jb25mIFRPUE9MT0dZLURJU1JVUFRPUi1CQVRDSC1USU1FT1VULU1JTExJUykpCiAgICAgICAgIGV4ZWN1dG9yLXJlY2VpdmUtcXVldWUtbWFwIChtay1yZWNlaXZlLXF1ZXVlLW1hcCBzdG9ybS1jb25mIGV4ZWN1dG9ycykKIAogICAgICAgICByZWNlaXZlLXF1ZXVlLW1hcCAoLT4+IGV4ZWN1dG9yLXJlY2VpdmUtcXVldWUtbWFwCkBAIC0yNjMsOCArMjc4LDEwIEBACiAgICAgICA6dG9wb2xvZ3kgdG9wb2xvZ3kKICAgICAgIDpzeXN0ZW0tdG9wb2xvZ3kgKHN5c3RlbS10b3BvbG9neSEgc3Rvcm0tY29uZiB0b3BvbG9neSkKICAgICAgIDpoZWFydGJlYXQtdGltZXIgKG1rLWhhbHRpbmctdGltZXIgImhlYXJ0YmVhdC10aW1lciIpCisgICAgICA6cmVmcmVzaC1sb2FkLXRpbWVyIChtay1oYWx0aW5nLXRpbWVyICJyZWZyZXNoLWxvYWQtdGltZXIiKQogICAgICAgOnJlZnJlc2gtY29ubmVjdGlvbnMtdGltZXIgKG1rLWhhbHRpbmctdGltZXIgInJlZnJlc2gtY29ubmVjdGlvbnMtdGltZXIiKQogICAgICAgOnJlZnJlc2gtY3JlZGVudGlhbHMtdGltZXIgKG1rLWhhbHRpbmctdGltZXIgInJlZnJlc2gtY3JlZGVudGlhbHMtdGltZXIiKQorICAgICAgOnJlc2V0LWxvZy1sZXZlbHMtdGltZXIgKG1rLWhhbHRpbmctdGltZXIgInJlc2V0LWxvZy1sZXZlbHMtdGltZXIiKQogICAgICAgOnJlZnJlc2gtYWN0aXZlLXRpbWVyIChtay1oYWx0aW5nLXRpbWVyICJyZWZyZXNoLWFjdGl2ZS10aW1lciIpCiAgICAgICA6ZXhlY3V0b3ItaGVhcnRiZWF0LXRpbWVyIChtay1oYWx0aW5nLXRpbWVyICJleGVjdXRvci1oZWFydGJlYXQtdGltZXIiKQogICAgICAgOnVzZXItdGltZXIgKG1rLWhhbHRpbmctdGltZXIgInVzZXItdGltZXIiKQpAQCAtMjg2LDEwICszMDMsMTEgQEAKICAgICAgIDpkZWZhdWx0LXNoYXJlZC1yZXNvdXJjZXMgKG1rLWRlZmF1bHQtcmVzb3VyY2VzIDw+KQogICAgICAgOnVzZXItc2hhcmVkLXJlc291cmNlcyAobWstdXNlci1yZXNvdXJjZXMgPD4pCiAgICAgICA6dHJhbnNmZXItbG9jYWwtZm4gKG1rLXRyYW5zZmVyLWxvY2FsLWZuIDw+KQotICAgICAgOnJlY2VpdmVyLXRocmVhZC1jb3VudCAoZ2V0IHN0b3JtLWNvbmYgV09SS0VSLVJFQ0VJVkVSLVRIUkVBRC1DT1VOVCkKICAgICAgIDp0cmFuc2Zlci1mbiAobWstdHJhbnNmZXItZm4gPD4pCisgICAgICA6bG9hZC1tYXBwaW5nIChMb2FkTWFwcGluZy4pCiAgICAgICA6YXNzaWdubWVudC12ZXJzaW9ucyBhc3NpZ25tZW50LXZlcnNpb25zCiAgICAgICA6YmFja3ByZXNzdXJlIChhdG9tIGZhbHNlKSA7OyB3aGV0aGVyIHRoaXMgd29ya2VyIGlzIGdvaW5nIHNsb3cKKyAgICAgIDp0cmFuc2Zlci1iYWNrcHJlc3N1cmUgKGF0b20gZmFsc2UpIDs7IGlmIHRoZSB0cmFuc2ZlciBxdWV1ZSBpcyBiYWNrZWQtdXAKICAgICAgIDpiYWNrcHJlc3N1cmUtdHJpZ2dlciAoYXRvbSBmYWxzZSkgOzsgYSB0cmlnZ2VyIGZvciBzeW5jaHJvbml6YXRpb24gd2l0aCBleGVjdXRvcnMKICAgICAgIDp0aHJvdHRsZS1vbiAoYXRvbSBmYWxzZSkgOzsgd2hldGhlciB0aHJvdHRsZSBpcyBhY3RpdmF0ZWQgZm9yIHNwb3V0cwogICAgICAgKSkpCkBAIC0zMDIsNiArMzIwLDI4IEBACiAgICAgW25vZGUgKEludGVnZXIvdmFsdWVPZiBwb3J0LXN0cildCiAgICAgKSkKIAorKGRlZiBMT0FELVJFRlJFU0gtSU5URVJWQUwtTVMgNTAwMCkKKworKGRlZm4gbWstcmVmcmVzaC1sb2FkIFt3b3JrZXJdCisgIChsZXQgW2xvY2FsLXRhc2tzIChzZXQgKDp0YXNrLWlkcyB3b3JrZXIpKQorICAgICAgICByZW1vdGUtdGFza3MgKHNldC9kaWZmZXJlbmNlICh3b3JrZXItb3V0Ym91bmQtdGFza3Mgd29ya2VyKSBsb2NhbC10YXNrcykKKyAgICAgICAgc2hvcnQtZXhlY3V0b3ItcmVjZWl2ZS1xdWV1ZS1tYXAgKDpzaG9ydC1leGVjdXRvci1yZWNlaXZlLXF1ZXVlLW1hcCB3b3JrZXIpCisgICAgICAgIG5leHQtdXBkYXRlIChhdG9tIDApXQorICAgIChmbiB0aGlzCisgICAgICAoW10KKyAgICAgICAgKGxldCBbXkxvYWRNYXBwaW5nIGxvYWQtbWFwcGluZyAoOmxvYWQtbWFwcGluZyB3b3JrZXIpCisgICAgICAgICAgICAgIGxvY2FsLXBvcCAobWFwLXZhbCAoZm4gW3F1ZXVlXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGV0IFtxLW1ldHJpY3MgKC5nZXRNZXRyaWNzIHF1ZXVlKV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLyAoZG91YmxlICgucG9wdWxhdGlvbiBxLW1ldHJpY3MpKSAoLmNhcGFjaXR5IHEtbWV0cmljcykpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0LWV4ZWN1dG9yLXJlY2VpdmUtcXVldWUtbWFwKQorICAgICAgICAgICAgICByZW1vdGUtbG9hZCAocmVkdWNlIG1lcmdlIChmb3IgW1tucCBjb25uXSBAKDpjYWNoZWQtbm9kZStwb3J0LT5zb2NrZXQgd29ya2VyKV0gKGludG8ge30gKC5nZXRMb2FkIGNvbm4gcmVtb3RlLXRhc2tzKSkpKQorICAgICAgICAgICAgICBub3cgKFN5c3RlbS9jdXJyZW50VGltZU1pbGxpcyldCisgICAgICAgICAgKC5zZXRMb2NhbCBsb2FkLW1hcHBpbmcgbG9jYWwtcG9wKQorICAgICAgICAgICguc2V0UmVtb3RlIGxvYWQtbWFwcGluZyByZW1vdGUtbG9hZCkKKyAgICAgICAgICAod2hlbiAoPiBub3cgQG5leHQtdXBkYXRlKQorICAgICAgICAgICAgKC5zZW5kTG9hZE1ldHJpY3MgKDpyZWNlaXZlciB3b3JrZXIpIGxvY2FsLXBvcCkKKyAgICAgICAgICAgIChyZXNldCEgbmV4dC11cGRhdGUgKCsgTE9BRC1SRUZSRVNILUlOVEVSVkFMLU1TIG5vdykpKSkpKSkpCisKIChkZWZuIG1rLXJlZnJlc2gtY29ubmVjdGlvbnMgW3dvcmtlcl0KICAgKGxldCBbb3V0Ym91bmQtdGFza3MgKHdvcmtlci1vdXRib3VuZC10YXNrcyB3b3JrZXIpCiAgICAgICAgIGNvbmYgKDpjb25mIHdvcmtlcikKQEAgLTQxNywxNiArNDU3LDEyIEBACiAgICAgICAgICAgKHNjaGVkdWxlIHRpbWVyIHJlY3VyLXNlY3MgdGhpcyA6Y2hlY2stYWN0aXZlIGZhbHNlKQogICAgICAgICAgICAgKSkpKSkKIAotKGRlZm4gbGF1bmNoLXJlY2VpdmUtdGhyZWFkIFt3b3JrZXJdCi0gIChsb2ctbWVzc2FnZSAiTGF1bmNoaW5nIHJlY2VpdmUtdGhyZWFkIGZvciAiICg6YXNzaWdubWVudC1pZCB3b3JrZXIpICI6IiAoOnBvcnQgd29ya2VyKSkKLSAgKG1zZy1sb2FkZXIvbGF1bmNoLXJlY2VpdmUtdGhyZWFkIQotICAgICg6bXEtY29udGV4dCB3b3JrZXIpCi0gICAgKDpyZWNlaXZlciB3b3JrZXIpCi0gICAgKDpzdG9ybS1pZCB3b3JrZXIpCi0gICAgKDpyZWNlaXZlci10aHJlYWQtY291bnQgd29ya2VyKQotICAgICg6cG9ydCB3b3JrZXIpCi0gICAgKDp0cmFuc2Zlci1sb2NhbC1mbiB3b3JrZXIpCi0gICAgOmtpbGwtZm4gKGZuIFt0XSAoZXhpdC1wcm9jZXNzISAxMSkpKSkKKyhkZWZuIHJlZ2lzdGVyLWNhbGxiYWNrcyBbd29ya2VyXQorICAobG9nLW1lc3NhZ2UgIlJlZ2lzdGVyaW5nIElDb25uZWN0aW9uQ2FsbGJhY2tzIGZvciAiICg6YXNzaWdubWVudC1pZCB3b3JrZXIpICI6IiAoOnBvcnQgd29ya2VyKSkKKyAgKG1zZy1sb2FkZXIvcmVnaXN0ZXItY2FsbGJhY2sgKDp0cmFuc2Zlci1sb2NhbC1mbiB3b3JrZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg6cmVjZWl2ZXIgd29ya2VyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoOnN0b3JtLWNvbmYgd29ya2VyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAod29ya2VyLWNvbnRleHQgd29ya2VyKSkpCiAKIChkZWZuLSBjbG9zZS1yZXNvdXJjZXMgW3dvcmtlcl0KICAgKGxldCBbZHIgKDpkZWZhdWx0LXNoYXJlZC1yZXNvdXJjZXMgd29ya2VyKV0KQEAgLTQzNCwxMCArNDcwLDEwMiBAQAogICAgICguc2h1dGRvd25Ob3cgKGdldCBkciBXb3JrZXJUb3BvbG9neUNvbnRleHQvU0hBUkVEX0VYRUNVVE9SKSkKICAgICAobG9nLW1lc3NhZ2UgIlNodXQgZG93biBkZWZhdWx0IHJlc291cmNlcyIpKSkKIAotKGRlZm4tIG92ZXJyaWRlLWxvZ2luLWNvbmZpZy13aXRoLXN5c3RlbS1wcm9wZXJ0eSBbY29uZl0KLSAgKGlmLWxldCBbbG9naW5fY29uZl9maWxlIChTeXN0ZW0vZ2V0UHJvcGVydHkgImphdmEuc2VjdXJpdHkuYXV0aC5sb2dpbi5jb25maWciKV0KLSAgICAoYXNzb2MgY29uZiAiamF2YS5zZWN1cml0eS5hdXRoLmxvZ2luLmNvbmZpZyIgbG9naW5fY29uZl9maWxlKQotICAgIGNvbmYpKQorKGRlZm4tIGdldC1sb2dnZXItbGV2ZWxzIFtdCisgIChpbnRvIHt9CisgICAgKGxldCBbbG9nZ2VyLWNvbmZpZyAoLmdldENvbmZpZ3VyYXRpb24gKExvZ01hbmFnZXIvZ2V0Q29udGV4dCBmYWxzZSkpXQorICAgICAgKGZvciBbW2xvZ2dlci1uYW1lIGxvZ2dlcl0gKC5nZXRMb2dnZXJzIGxvZ2dlci1jb25maWcpXQorICAgICAgICB7bG9nZ2VyLW5hbWUgKC5nZXRMZXZlbCBsb2dnZXIpfSkpKSkKKworKGRlZm4gc2V0LWxvZ2dlci1sZXZlbCBbbG9nZ2VyLWNvbnRleHQgbG9nZ2VyLW5hbWUgbmV3LWxldmVsXQorICAobGV0IFtjb25maWcgKC5nZXRDb25maWd1cmF0aW9uIGxvZ2dlci1jb250ZXh0KQorICAgICAgICBsb2dnZXItY29uZmlnICguZ2V0TG9nZ2VyQ29uZmlnIGNvbmZpZyBsb2dnZXItbmFtZSldCisgICAgKGlmIChub3QgKD0gKC5nZXROYW1lIGxvZ2dlci1jb25maWcpIGxvZ2dlci1uYW1lKSkKKyAgICAgIDs7IGNyZWF0ZSBhIG5ldyBjb25maWcuIE1ha2UgaXQgYWRkaXRpdmUgKHRydWUpIHMudC4gaW5oZXJpdAorICAgICAgOzsgcGFyZW50cyBhcHBlbmRlcnMKKyAgICAgIChsZXQgW25ldy1sb2dnZXItY29uZmlnIChMb2dnZXJDb25maWcuIGxvZ2dlci1uYW1lIG5ldy1sZXZlbCB0cnVlKV0KKyAgICAgICAgKGxvZy1tZXNzYWdlICJBZGRpbmcgY29uZmlnIGZvcjogIiBuZXctbG9nZ2VyLWNvbmZpZyAiIHdpdGggbGV2ZWw6ICIgbmV3LWxldmVsKQorICAgICAgICAoLmFkZExvZ2dlciBjb25maWcgbG9nZ2VyLW5hbWUgbmV3LWxvZ2dlci1jb25maWcpKQorICAgICAgKGRvCisgICAgICAgIChsb2ctbWVzc2FnZSAiU2V0dGluZyAiIGxvZ2dlci1jb25maWcgIiBsb2cgbGV2ZWwgdG86ICIgbmV3LWxldmVsKQorICAgICAgICAoLnNldExldmVsIGxvZ2dlci1jb25maWcgbmV3LWxldmVsKSkpKSkKKworOzsgZnVuY3Rpb24gY2FsbGVkIG9uIHRpbWVyIHRvIHJlc2V0IGxvZyBsZXZlbHMgbGFzdCBzZXQgdG8gREVCVUcKKzs7IGFsc28gY2FsbGVkIGZyb20gcHJvY2Vzcy1sb2ctY29uZmlnLWNoYW5nZQorKGRlZm4gcmVzZXQtbG9nLWxldmVscyBbbGF0ZXN0LWxvZy1jb25maWctYXRvbV0KKyAgKGxldCBbbGF0ZXN0LWxvZy1jb25maWcgQGxhdGVzdC1sb2ctY29uZmlnLWF0b20KKyAgICAgICAgbG9nZ2VyLWNvbnRleHQgKExvZ01hbmFnZXIvZ2V0Q29udGV4dCBmYWxzZSldCisgICAgKGRvc2VxIFtbbG9nZ2VyLW5hbWUgbG9nZ2VyLXNldHRpbmddIChzb3J0IGxhdGVzdC1sb2ctY29uZmlnKV0KKyAgICAgIChsZXQgW3RpbWVvdXQgKDp0aW1lb3V0IGxvZ2dlci1zZXR0aW5nKQorICAgICAgICAgICAgdGFyZ2V0LWxvZy1sZXZlbCAoOnRhcmdldC1sb2ctbGV2ZWwgbG9nZ2VyLXNldHRpbmcpCisgICAgICAgICAgICByZXNldC1sb2ctbGV2ZWwgKDpyZXNldC1sb2ctbGV2ZWwgbG9nZ2VyLXNldHRpbmcpXQorICAgICAgICAod2hlbiAoPiAoY29lcmNlL3RvLWxvbmcgKHRpbWUvbm93KSkgdGltZW91dCkKKyAgICAgICAgICAobG9nLW1lc3NhZ2UgbG9nZ2VyLW5hbWUgIjogUmVzZXR0aW5nIGxldmVsIHRvICIgcmVzZXQtbG9nLWxldmVsKSAKKyAgICAgICAgICAoc2V0LWxvZ2dlci1sZXZlbCBsb2dnZXItY29udGV4dCBsb2dnZXItbmFtZSByZXNldC1sb2ctbGV2ZWwpCisgICAgICAgICAgKHN3YXAhIGxhdGVzdC1sb2ctY29uZmlnLWF0b20KKyAgICAgICAgICAgIChmbiBbcHJldl0KKyAgICAgICAgICAgICAgKGRpc3NvYyBwcmV2IGxvZ2dlci1uYW1lKSkpKSkpCisgICAgKC51cGRhdGVMb2dnZXJzIGxvZ2dlci1jb250ZXh0KSkpCisKKzs7IHdoZW4gYSBuZXcgbG9nIGxldmVsIGlzIHJlY2VpdmVkIGZyb20gem9va2VlcGVyLCB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZAorKGRlZm4gcHJvY2Vzcy1sb2ctY29uZmlnLWNoYW5nZSBbbGF0ZXN0LWxvZy1jb25maWcgb3JpZ2luYWwtbG9nLWxldmVscyBsb2ctY29uZmlnXQorICAod2hlbiBsb2ctY29uZmlnCisgICAgKGxvZy1kZWJ1ZyAiUHJvY2Vzc2luZyByZWNlaXZlZCBsb2cgY29uZmlnOiAiIGxvZy1jb25maWcpCisgICAgOzsgbWVyZ2UgbG9nIGNvbmZpZ3MgdG9nZXRoZXIKKyAgICAobGV0IFtsb2dnZXJzICguZ2V0X25hbWVkX2xvZ2dlcl9sZXZlbCBsb2ctY29uZmlnKQorICAgICAgICAgIGxvZ2dlci1jb250ZXh0IChMb2dNYW5hZ2VyL2dldENvbnRleHQgZmFsc2UpXQorICAgICAgKGRlZiBuZXctbG9nLWNvbmZpZ3MKKyAgICAgICAgKGludG8ge30KKyAgICAgICAgIDs7IG1lcmdlIG5hbWVkIGxvZyBsZXZlbHMKKyAgICAgICAgIChmb3IgW1ttc2ctbG9nZ2VyLW5hbWUgbG9nZ2VyLWxldmVsXSBsb2dnZXJzXQorICAgICAgICAgICAobGV0IFtsb2dnZXItbmFtZSAoaWYgKD0gbXNnLWxvZ2dlci1uYW1lICJST09UIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nTWFuYWdlci9ST09UX0xPR0dFUl9OQU1FCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZy1sb2dnZXItbmFtZSldCisgICAgICAgICAgICAgOzsgdGhlIG5ldy10aW1lb3V0cyBtYXAgbm93IGNvbnRhaW5zIGxvZ2dlciA9PiB0aW1lb3V0IAorICAgICAgICAgICAgICh3aGVuICguaXNfc2V0X3Jlc2V0X2xvZ19sZXZlbF90aW1lb3V0X2Vwb2NoIGxvZ2dlci1sZXZlbCkKKyAgICAgICAgICAgICAgIHtsb2dnZXItbmFtZSB7OmFjdGlvbiAoLmdldF9hY3Rpb24gbG9nZ2VyLWxldmVsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6dGFyZ2V0LWxvZy1sZXZlbCAoTGV2ZWwvdG9MZXZlbCAoLmdldF90YXJnZXRfbG9nX2xldmVsIGxvZ2dlci1sZXZlbCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpyZXNldC1sb2ctbGV2ZWwgKG9yICguZ2V0IEBvcmlnaW5hbC1sb2ctbGV2ZWxzIGxvZ2dlci1uYW1lKSAoTGV2ZWwvSU5GTykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDp0aW1lb3V0ICguZ2V0X3Jlc2V0X2xvZ19sZXZlbF90aW1lb3V0X2Vwb2NoIGxvZ2dlci1sZXZlbCl9fSkpKSkpCisKKyAgICAgIDs7IGxvb2sgZm9yIGRlbGV0ZWQgbG9nIHRpbWVvdXRzCisgICAgICAoZG9zZXEgW1tsb2dnZXItbmFtZSBsb2dnZXItdmFsXSAoc29ydCBAbGF0ZXN0LWxvZy1jb25maWcpXQorICAgICAgICAod2hlbiAobm90IChjb250YWlucz8gbmV3LWxvZy1jb25maWdzIGxvZ2dlci1uYW1lKSkKKyAgICAgICAgICA7OyBpZiB3ZSBoYWQgYSB0aW1lb3V0LCBidXQgdGhlIHRpbWVvdXQgaXMgbm8gbG9uZ2VyIGFjdGl2ZQorICAgICAgICAgIChzZXQtbG9nZ2VyLWxldmVsCisgICAgICAgICAgICBsb2dnZXItY29udGV4dCBsb2dnZXItbmFtZSAoOnJlc2V0LWxvZy1sZXZlbCBsb2dnZXItdmFsKSkpKQorCisgICAgICA7OyBhcHBseSBuZXcgbG9nIHNldHRpbmdzIHdlIGp1c3QgcmVjZWl2ZWQKKyAgICAgIDs7IHRoZSBtZXJnZWQgY29uZmlncyBhcmUgb25seSBmb3IgdGhlIHJlc2V0IGxvZ2ljCisgICAgICAoZG9zZXEgW1ttc2ctbG9nZ2VyLW5hbWUgbG9nZ2VyLWxldmVsXSAoc29ydCAoaW50byB7fSAoLmdldF9uYW1lZF9sb2dnZXJfbGV2ZWwgbG9nLWNvbmZpZykpKV0KKyAgICAgICAgKGxldCBbbG9nZ2VyLW5hbWUgKGlmICg9IG1zZy1sb2dnZXItbmFtZSAiUk9PVCIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZ01hbmFnZXIvUk9PVF9MT0dHRVJfTkFNRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtc2ctbG9nZ2VyLW5hbWUpCisgICAgICAgICAgICAgIGxldmVsIChMZXZlbC90b0xldmVsICguZ2V0X3RhcmdldF9sb2dfbGV2ZWwgbG9nZ2VyLWxldmVsKSkKKyAgICAgICAgICAgICAgYWN0aW9uICguZ2V0X2FjdGlvbiBsb2dnZXItbGV2ZWwpXQorICAgICAgICAgIChpZiAoPSBhY3Rpb24gTG9nTGV2ZWxBY3Rpb24vVVBEQVRFKQorICAgICAgICAgICAgKHNldC1sb2dnZXItbGV2ZWwgbG9nZ2VyLWNvbnRleHQgbG9nZ2VyLW5hbWUgbGV2ZWwpKSkpCisgICAKKyAgICAgICgudXBkYXRlTG9nZ2VycyBsb2dnZXItY29udGV4dCkKKyAgICAgIChyZXNldCEgbGF0ZXN0LWxvZy1jb25maWcgbmV3LWxvZy1jb25maWdzKQorICAgICAgKGxvZy1kZWJ1ZyAiTmV3IG1lcmdlZCBsb2cgY29uZmlnIGlzICIgQGxhdGVzdC1sb2ctY29uZmlnKSkpKQorCisoZGVmbiBydW4td29ya2VyLXN0YXJ0LWhvb2tzIFt3b3JrZXJdCisgIChsZXQgW3RvcG9sb2d5ICg6dG9wb2xvZ3kgd29ya2VyKQorICAgICAgICB0b3BvLWNvbmYgKDpzdG9ybS1jb25mIHdvcmtlcikKKyAgICAgICAgd29ya2VyLXRvcG9sb2d5LWNvbnRleHQgKHdvcmtlci1jb250ZXh0IHdvcmtlcikKKyAgICAgICAgaG9va3MgKC5nZXRfd29ya2VyX2hvb2tzIHRvcG9sb2d5KV0KKyAgICAoZG9mb3IgW2hvb2sgaG9va3NdCisgICAgICAobGV0IFtob29rLWJ5dGVzIChVdGlscy90b0J5dGVBcnJheSBob29rKQorICAgICAgICAgICAgZGVzZXItaG9vayAoVXRpbHMvamF2YURlc2VyaWFsaXplIGhvb2stYnl0ZXMgQmFzZVdvcmtlckhvb2spXQorICAgICAgICAoLnN0YXJ0IGRlc2VyLWhvb2sgdG9wby1jb25mIHdvcmtlci10b3BvbG9neS1jb250ZXh0KSkpKSkKKworKGRlZm4gcnVuLXdvcmtlci1zaHV0ZG93bi1ob29rcyBbd29ya2VyXQorICAobGV0IFt0b3BvbG9neSAoOnRvcG9sb2d5IHdvcmtlcikKKyAgICAgICAgaG9va3MgKC5nZXRfd29ya2VyX2hvb2tzIHRvcG9sb2d5KV0KKyAgICAoZG9mb3IgW2hvb2sgaG9va3NdCisgICAgICAobGV0IFtob29rLWJ5dGVzIChVdGlscy90b0J5dGVBcnJheSBob29rKQorICAgICAgICAgICAgZGVzZXItaG9vayAoVXRpbHMvamF2YURlc2VyaWFsaXplIGhvb2stYnl0ZXMgQmFzZVdvcmtlckhvb2spXQorICAgICAgICAoLnNodXRkb3duIGRlc2VyLWhvb2spKSkpKQogCiA7OyBUT0RPOiBzaG91bGQgd29ya2VyIGV2ZW4gdGFrZSB0aGUgc3Rvcm0taWQgYXMgaW5wdXQ/IHRoaXMgc2hvdWxkIGJlCiA7OyBkZWR1Y2FibGUgZnJvbSBjbHVzdGVyIHN0YXRlIChieSBzZWFyY2hpbmcgdGhyb3VnaCBhc3NpZ25tZW50cykKQEAgLTQ1MSw3ICs1NzksMTYgQEAKICAgOzsgYmVjYXVzZSBpbiBsb2NhbCBtb2RlLCBpdHMgbm90IGEgc2VwYXJhdGUKICAgOzsgcHJvY2Vzcy4gc3VwZXJ2aXNvciB3aWxsIHJlZ2lzdGVyIGl0IGluIHRoaXMgY2FzZQogICAod2hlbiAoPSA6ZGlzdHJpYnV0ZWQgKGNsdXN0ZXItbW9kZSBjb25mKSkKLSAgICAodG91Y2ggKHdvcmtlci1waWQtcGF0aCBjb25mIHdvcmtlci1pZCAocHJvY2Vzcy1waWQpKSkpCisgICAgKGxldCBbcGlkIChwcm9jZXNzLXBpZCldCisgICAgICAodG91Y2ggKHdvcmtlci1waWQtcGF0aCBjb25mIHdvcmtlci1pZCBwaWQpKQorICAgICAgKHNwaXQgKHdvcmtlci1hcnRpZmFjdHMtcGlkLXBhdGggY29uZiBzdG9ybS1pZCBwb3J0KSBwaWQpKSkKKworICAoZGVjbGFyZSBlc3RhYmxpc2gtbG9nLXNldHRpbmctY2FsbGJhY2spCisKKyAgOzsgc3RhcnQgb3V0IHdpdGggZW1wdHkgbGlzdCBvZiB0aW1lb3V0cyAKKyAgKGRlZiBsYXRlc3QtbG9nLWNvbmZpZyAoYXRvbSB7fSkpCisgIChkZWYgb3JpZ2luYWwtbG9nLWxldmVscyAoYXRvbSB7fSkpCisKICAgKGxldCBbc3Rvcm0tY29uZiAocmVhZC1zdXBlcnZpc29yLXN0b3JtLWNvbmYgY29uZiBzdG9ybS1pZCkKICAgICAgICAgc3Rvcm0tY29uZiAob3ZlcnJpZGUtbG9naW4tY29uZmlnLXdpdGgtc3lzdGVtLXByb3BlcnR5IHN0b3JtLWNvbmYpCiAgICAgICAgIGFjbHMgKFV0aWxzL2dldFdvcmtlckFDTCBzdG9ybS1jb25mKQpAQCAtNDc1LDkgKzYxMiwxMCBAQAogICAgICAgICBfIChzY2hlZHVsZS1yZWN1cnJpbmcgKDpoZWFydGJlYXQtdGltZXIgd29ya2VyKSAwIChjb25mIFdPUktFUi1IRUFSVEJFQVQtRlJFUVVFTkNZLVNFQ1MpIGhlYXJ0YmVhdC1mbikKICAgICAgICAgXyAoc2NoZWR1bGUtcmVjdXJyaW5nICg6ZXhlY3V0b3ItaGVhcnRiZWF0LXRpbWVyIHdvcmtlcikgMCAoY29uZiBUQVNLLUhFQVJUQkVBVC1GUkVRVUVOQ1ktU0VDUykgIyhkby1leGVjdXRvci1oZWFydGJlYXRzIHdvcmtlciA6ZXhlY3V0b3JzIEBleGVjdXRvcnMpKQogCi0gICAgICAgIHJlY2VpdmUtdGhyZWFkLXNodXRkb3duIChsYXVuY2gtcmVjZWl2ZS10aHJlYWQgd29ya2VyKQorICAgICAgICBfIChyZWdpc3Rlci1jYWxsYmFja3Mgd29ya2VyKQogCiAgICAgICAgIHJlZnJlc2gtY29ubmVjdGlvbnMgKG1rLXJlZnJlc2gtY29ubmVjdGlvbnMgd29ya2VyKQorICAgICAgICByZWZyZXNoLWxvYWQgKG1rLXJlZnJlc2gtbG9hZCB3b3JrZXIpCiAKICAgICAgICAgXyAocmVmcmVzaC1jb25uZWN0aW9ucyBuaWwpCiAKQEAgLTQ4NSw2ICs2MjMsNyBAQAogCiAgICAgICAgIF8gKHJlZnJlc2gtc3Rvcm0tYWN0aXZlIHdvcmtlciBuaWwpCiAKKyAgICAgICAgXyAocnVuLXdvcmtlci1zdGFydC1ob29rcyB3b3JrZXIpCiAKICAgICAgICAgXyAocmVzZXQhIGV4ZWN1dG9ycyAoZG9mb3IgW2UgKDpleGVjdXRvcnMgd29ya2VyKV0gKGV4ZWN1dG9yL21rLWV4ZWN1dG9yIHdvcmtlciBlIGluaXRpYWwtY3JlZGVudGlhbHMpKSkKIApAQCAtNTEzLDkgKzY1Miw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgOzsgdGhpcyB3aWxsIGRvIGJlc3QgZWZmb3J0IGZsdXNoaW5nIHNpbmNlIHRoZSBsaW5nZXIgcGVyaW9kCiAgICAgICAgICAgICAgICAgICAgICAgOzsgd2FzIHNldCBvbiBjcmVhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICguY2xvc2Ugc29ja2V0KSkKLSAgICAgICAgICAgICAgICAgICAgKGxvZy1tZXNzYWdlICJTaHV0dGluZyBkb3duIHJlY2VpdmUgdGhyZWFkIikKLSAgICAgICAgICAgICAgICAgICAgKHJlY2VpdmUtdGhyZWFkLXNodXRkb3duKQotICAgICAgICAgICAgICAgICAgICAobG9nLW1lc3NhZ2UgIlNodXQgZG93biByZWNlaXZlIHRocmVhZCIpCiAgICAgICAgICAgICAgICAgICAgIChsb2ctbWVzc2FnZSAiVGVybWluYXRpbmcgbWVzc2FnaW5nIGNvbnRleHQiKQogICAgICAgICAgICAgICAgICAgICAobG9nLW1lc3NhZ2UgIlNodXR0aW5nIGRvd24gZXhlY3V0b3JzIikKICAgICAgICAgICAgICAgICAgICAgKGRvc2VxIFtleGVjdXRvciBAZXhlY3V0b3JzXSAoLnNodXRkb3duIGV4ZWN1dG9yKSkKQEAgLTUzOSwxMCArNjc1LDEyIEBACiAgICAgICAgICAgICAgICAgICAgIChjYW5jZWwtdGltZXIgKDpyZWZyZXNoLWFjdGl2ZS10aW1lciB3b3JrZXIpKQogICAgICAgICAgICAgICAgICAgICAoY2FuY2VsLXRpbWVyICg6ZXhlY3V0b3ItaGVhcnRiZWF0LXRpbWVyIHdvcmtlcikpCiAgICAgICAgICAgICAgICAgICAgIChjYW5jZWwtdGltZXIgKDp1c2VyLXRpbWVyIHdvcmtlcikpCisgICAgICAgICAgICAgICAgICAgIChjYW5jZWwtdGltZXIgKDpyZWZyZXNoLWxvYWQtdGltZXIgd29ya2VyKSkKIAogICAgICAgICAgICAgICAgICAgICAoY2xvc2UtcmVzb3VyY2VzIHdvcmtlcikKIAotICAgICAgICAgICAgICAgICAgICA7OyBUT0RPOiBoZXJlIG5lZWQgdG8gaW52b2tlIHRoZSAic2h1dGRvd24iIG1ldGhvZCBvZiBXb3JrZXJIb29rCisgICAgICAgICAgICAgICAgICAgIChsb2ctbWVzc2FnZSAiVHJpZ2dlciBhbnkgd29ya2VyIHNodXRkb3duIGhvb2tzIikKKyAgICAgICAgICAgICAgICAgICAgKHJ1bi13b3JrZXItc2h1dGRvd24taG9va3Mgd29ya2VyKQogCiAgICAgICAgICAgICAgICAgICAgICgucmVtb3ZlLXdvcmtlci1oZWFydGJlYXQhICg6c3Rvcm0tY2x1c3Rlci1zdGF0ZSB3b3JrZXIpIHN0b3JtLWlkIGFzc2lnbm1lbnQtaWQgcG9ydCkKICAgICAgICAgICAgICAgICAgICAgKGxvZy1tZXNzYWdlICJEaXNjb25uZWN0aW5nIGZyb20gc3Rvcm0gY2x1c3RlciBzdGF0ZSBjb250ZXh0IikKQEAgLTU1OSw2ICs2OTcsNyBAQAogICAgICAgICAgICAgICAgKGFuZAogICAgICAgICAgICAgICAgICAodGltZXItd2FpdGluZz8gKDpoZWFydGJlYXQtdGltZXIgd29ya2VyKSkKICAgICAgICAgICAgICAgICAgKHRpbWVyLXdhaXRpbmc/ICg6cmVmcmVzaC1jb25uZWN0aW9ucy10aW1lciB3b3JrZXIpKQorICAgICAgICAgICAgICAgICAodGltZXItd2FpdGluZz8gKDpyZWZyZXNoLWxvYWQtdGltZXIgd29ya2VyKSkKICAgICAgICAgICAgICAgICAgKHRpbWVyLXdhaXRpbmc/ICg6cmVmcmVzaC1jcmVkZW50aWFscy10aW1lciB3b3JrZXIpKQogICAgICAgICAgICAgICAgICAodGltZXItd2FpdGluZz8gKDpyZWZyZXNoLWFjdGl2ZS10aW1lciB3b3JrZXIpKQogICAgICAgICAgICAgICAgICAodGltZXItd2FpdGluZz8gKDpleGVjdXRvci1oZWFydGJlYXQtdGltZXIgd29ya2VyKSkKQEAgLTU3NywxNCArNzE2LDI5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxldCBbdGhyb3R0bGUtb24gKC50b3BvbG9neS1iYWNrcHJlc3N1cmUgKDpzdG9ybS1jbHVzdGVyLXN0YXRlIHdvcmtlcikgc3Rvcm0taWQgY2IpXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlc2V0ISAoOnRocm90dGxlLW9uIHdvcmtlcikgdGhyb3R0bGUtb24pKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3LXRocm90dGxlLW9uICgudG9wb2xvZ3ktYmFja3ByZXNzdXJlICg6c3Rvcm0tY2x1c3Rlci1zdGF0ZSB3b3JrZXIpIHN0b3JtLWlkIGNhbGxiYWNrKV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXNldCEgKDp0aHJvdHRsZS1vbiB3b3JrZXIpIG5ldy10aHJvdHRsZS1vbikpKV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXNldCEgKDp0aHJvdHRsZS1vbiB3b3JrZXIpIG5ldy10aHJvdHRsZS1vbikpKQorICAgICAgICBjaGVjay1sb2ctY29uZmlnLWNoYW5nZWQgKGZuIFtdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxldCBbbG9nLWNvbmZpZyAoLnRvcG9sb2d5LWxvZy1jb25maWcgKDpzdG9ybS1jbHVzdGVyLXN0YXRlIHdvcmtlcikgc3Rvcm0taWQgbmlsKV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwcm9jZXNzLWxvZy1jb25maWctY2hhbmdlIGxhdGVzdC1sb2ctY29uZmlnIG9yaWdpbmFsLWxvZy1sZXZlbHMgbG9nLWNvbmZpZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlc3RhYmxpc2gtbG9nLXNldHRpbmctY2FsbGJhY2spKSldCisgICAgKHJlc2V0ISBvcmlnaW5hbC1sb2ctbGV2ZWxzIChnZXQtbG9nZ2VyLWxldmVscykpCisgICAgKGxvZy1tZXNzYWdlICJTdGFydGVkIHdpdGggbG9nIGxldmVsczogIiBAb3JpZ2luYWwtbG9nLWxldmVscykKKyAgCisgICAgKGRlZm4gZXN0YWJsaXNoLWxvZy1zZXR0aW5nLWNhbGxiYWNrIFtdCisgICAgICAoLnRvcG9sb2d5LWxvZy1jb25maWcgKDpzdG9ybS1jbHVzdGVyLXN0YXRlIHdvcmtlcikgc3Rvcm0taWQgKGZuIFthcmdzXSAoY2hlY2stbG9nLWNvbmZpZy1jaGFuZ2VkKSkpKQorCisgICAgKGVzdGFibGlzaC1sb2ctc2V0dGluZy1jYWxsYmFjaykKICAgICAoLmNyZWRlbnRpYWxzICg6c3Rvcm0tY2x1c3Rlci1zdGF0ZSB3b3JrZXIpIHN0b3JtLWlkIChmbiBbYXJnc10gKGNoZWNrLWNyZWRlbnRpYWxzLWNoYW5nZWQpKSkKICAgICAoc2NoZWR1bGUtcmVjdXJyaW5nICg6cmVmcmVzaC1jcmVkZW50aWFscy10aW1lciB3b3JrZXIpIDAgKGNvbmYgVEFTSy1DUkVERU5USUFMUy1QT0xMLVNFQ1MpCiAgICAgICAgICAgICAgICAgICAgICAgICAoZm4gWyYgYXJnc10KICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoZWNrLWNyZWRlbnRpYWxzLWNoYW5nZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgIChpZiAoKDpzdG9ybS1jb25mIHdvcmtlcikgVE9QT0xPR1ktQkFDS1BSRVNTVVJFLUVOQUJMRSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hlY2stdGhyb3R0bGUtY2hhbmdlZCkpKSkKKyAgICA7OyBUaGUgaml0dGVyIGFsbG93cyB0aGUgY2xpZW50cyB0byBnZXQgdGhlIGRhdGEgYXQgZGlmZmVyZW50IHRpbWVzLCBhbmQgYXZvaWRzIHRodW5kZXJpbmcgaGVyZAorICAgICh3aGVuLW5vdCAoLmdldCBjb25mIFRPUE9MT0dZLURJU0FCTEUtTE9BREFXQVJFLU1FU1NBR0lORykKKyAgICAgIChzY2hlZHVsZS1yZWN1cnJpbmctd2l0aC1qaXR0ZXIgKDpyZWZyZXNoLWxvYWQtdGltZXIgd29ya2VyKSAwIDEgNTAwIHJlZnJlc2gtbG9hZCkpCiAgICAgKHNjaGVkdWxlLXJlY3VycmluZyAoOnJlZnJlc2gtY29ubmVjdGlvbnMtdGltZXIgd29ya2VyKSAwIChjb25mIFRBU0stUkVGUkVTSC1QT0xMLVNFQ1MpIHJlZnJlc2gtY29ubmVjdGlvbnMpCisgICAgKHNjaGVkdWxlLXJlY3VycmluZyAoOnJlc2V0LWxvZy1sZXZlbHMtdGltZXIgd29ya2VyKSAwIChjb25mIFdPUktFUi1MT0ctTEVWRUwtUkVTRVQtUE9MTC1TRUNTKSAoZm4gW10gKHJlc2V0LWxvZy1sZXZlbHMgbGF0ZXN0LWxvZy1jb25maWcpKSkKICAgICAoc2NoZWR1bGUtcmVjdXJyaW5nICg6cmVmcmVzaC1hY3RpdmUtdGltZXIgd29ya2VyKSAwIChjb25mIFRBU0stUkVGUkVTSC1QT0xMLVNFQ1MpIChwYXJ0aWFsIHJlZnJlc2gtc3Rvcm0tYWN0aXZlIHdvcmtlcikpCiAKICAgICAobG9nLW1lc3NhZ2UgIldvcmtlciBoYXMgdG9wb2xvZ3kgY29uZmlnICIgKHJlZGFjdC12YWx1ZSAoOnN0b3JtLWNvbmYgd29ya2VyKSBTVE9STS1aT09LRUVQRVItVE9QT0xPR1ktQVVUSC1QQVlMT0FEKSkKQEAgLTYwNSw0ICs3NTksNCBAQAogICAgIChzZXR1cC1kZWZhdWx0LXVuY2F1Z2h0LWV4Y2VwdGlvbi1oYW5kbGVyKQogICAgICh2YWxpZGF0ZS1kaXN0cmlidXRlZC1tb2RlISBjb25mKQogICAgIChsZXQgW3dvcmtlciAobWstd29ya2VyIGNvbmYgbmlsIHN0b3JtLWlkIGFzc2lnbm1lbnQtaWQgKEludGVnZXIvcGFyc2VJbnQgcG9ydC1zdHIpIHdvcmtlci1pZCldCi0gICAgICAoYWRkLXNodXRkb3duLWhvb2std2l0aC1mb3JjZS1raWxsLWluLTEtc2VjICMoLnNodXRkb3duIHdvcmtlcikpKSkpCisgICAgICAoYWRkLXNodXRkb3duLWhvb2std2l0aC1mb3JjZS1raWxsLWluLTEtc2VjICMoLnNodXRkb3duIHdvcmtlcikpKSkpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvY2xqL2JhY2t0eXBlL3N0b3JtL2Rpc3J1cHRvci5jbGogYi9zdG9ybS1jb3JlL3NyYy9jbGovYmFja3R5cGUvc3Rvcm0vZGlzcnVwdG9yLmNsagppbmRleCAyNWUwMDUwLi5iYmZlMDQ4IDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9jbGovYmFja3R5cGUvc3Rvcm0vZGlzcnVwdG9yLmNsagorKysgYi9zdG9ybS1jb3JlL3NyYy9jbGovYmFja3R5cGUvc3Rvcm0vZGlzcnVwdG9yLmNsagpAQCAtMTYsMzkgKzE2LDIxIEBACiAKIChucyBiYWNrdHlwZS5zdG9ybS5kaXNydXB0b3IKICAgKDppbXBvcnQgW2JhY2t0eXBlLnN0b3JtLnV0aWxzIERpc3J1cHRvclF1ZXVlIFdvcmtlckJhY2twcmVzc3VyZUNhbGxiYWNrIERpc3J1cHRvckJhY2twcmVzc3VyZUNhbGxiYWNrXSkKLSAgKDppbXBvcnQgW2NvbS5sbWF4LmRpc3J1cHRvciBNdWx0aVRocmVhZGVkQ2xhaW1TdHJhdGVneSBTaW5nbGVUaHJlYWRlZENsYWltU3RyYXRlZ3kKLSAgICAgICAgICAgIEJsb2NraW5nV2FpdFN0cmF0ZWd5IFNsZWVwaW5nV2FpdFN0cmF0ZWd5IFlpZWxkaW5nV2FpdFN0cmF0ZWd5Ci0gICAgICAgICAgICBCdXN5U3BpbldhaXRTdHJhdGVneV0pCisgICg6aW1wb3J0IFtjb20ubG1heC5kaXNydXB0b3IuZHNsIFByb2R1Y2VyVHlwZV0pCiAgICg6cmVxdWlyZSBbY2xvanVyZSBbc3RyaW5nIDphcyBzdHJdXSkKICAgKDpyZXF1aXJlIFtjbG9qdXJlIFtzZXQgOmFzIHNldF1dKQogICAoOnVzZSBbY2xvanVyZSB3YWxrXSkKICAgKDp1c2UgW2JhY2t0eXBlLnN0b3JtIHV0aWwgbG9nXSkpCiAKLShkZWYgQ0xBSU0tU1RSQVRFR1kKLSAgezptdWx0aS10aHJlYWRlZCAoZm4gW3NpemVdIChNdWx0aVRocmVhZGVkQ2xhaW1TdHJhdGVneS4gKGludCBzaXplKSkpCi0gICA6c2luZ2xlLXRocmVhZGVkIChmbiBbc2l6ZV0gKFNpbmdsZVRocmVhZGVkQ2xhaW1TdHJhdGVneS4gKGludCBzaXplKSkpfSkKKyhkZWYgUFJPRFVDRVItVFlQRQorICB7Om11bHRpLXRocmVhZGVkIFByb2R1Y2VyVHlwZS9NVUxUSQorICAgOnNpbmdsZS10aHJlYWRlZCBQcm9kdWNlclR5cGUvU0lOR0xFfSkKIAotKGRlZiBXQUlULVNUUkFURUdZCi0gIHs6YmxvY2sgKGZuIFtdIChCbG9ja2luZ1dhaXRTdHJhdGVneS4pKQotICAgOnlpZWxkIChmbiBbXSAoWWllbGRpbmdXYWl0U3RyYXRlZ3kuKSkKLSAgIDpzbGVlcCAoZm4gW10gKFNsZWVwaW5nV2FpdFN0cmF0ZWd5LikpCi0gICA6c3BpbiAoZm4gW10gKEJ1c3lTcGluV2FpdFN0cmF0ZWd5LikpfSkKLQotKGRlZm4tIG1rLXdhaXQtc3RyYXRlZ3kKLSAgW3NwZWNdCi0gIChpZiAoa2V5d29yZD8gc3BlYykKLSAgICAoKFdBSVQtU1RSQVRFR1kgc3BlYykpCi0gICAgKC0+IChzdHIgc3BlYykgbmV3LWluc3RhbmNlKSkpCi0KLTs7IDpibG9jayBzdHJhdGVneSByZXF1aXJlcyB1c2luZyBhIHRpbWVvdXQgb24gd2FpdEZvciAoaW1wbGVtZW50ZWQgaW4gRGlzcnVwdG9yUXVldWUpLCBhcyBzb21ldGltZXMgdGhlIGNvbnN1bWVyIHN0YXlzIGJsb2NrZWQgZXZlbiB3aGVuIHRoZXJlJ3MgYW4gaXRlbSBvbiB0aGUgcXVldWUuCi07OyBUaGlzIHdvdWxkIG1hbmlmZXN0IGl0c2VsZiBpbiBUcmlkZW50IHdoZW4gZG9pbmcgMSBiYXRjaCBhdCBhIHRpbWUgcHJvY2Vzc2luZywgYW5kIHRoZSBhY2tfaW5pdCBtZXNzYWdlCi07OyB3b3VsZG4ndCBtYWtlIGl0IHRvIHRoZSBhY2tlciB1bnRpbCB0aGUgYmF0Y2ggdGltZWQgb3V0IGFuZCBhbm90aGVyIHR1cGxlIHdhcyBwbGF5ZWQgaW50byB0aGUgcXVldWUsCi07OyB1bmJsb2NraW5nIHRoZSBjb25zdW1lcgogKGRlZm5rIGRpc3J1cHRvci1xdWV1ZQotICBbXlN0cmluZyBxdWV1ZS1uYW1lIGJ1ZmZlci1zaXplIHRpbWVvdXQgOmNsYWltLXN0cmF0ZWd5IDptdWx0aS10aHJlYWRlZCA6d2FpdC1zdHJhdGVneSA6YmxvY2tdCisgIFteU3RyaW5nIHF1ZXVlLW5hbWUgYnVmZmVyLXNpemUgdGltZW91dCA6cHJvZHVjZXItdHlwZSA6bXVsdGktdGhyZWFkZWQgOmJhdGNoLXNpemUgMTAwIDpiYXRjaC10aW1lb3V0IDFdCiAgIChEaXNydXB0b3JRdWV1ZS4gcXVldWUtbmFtZQotICAgICAgICAgICAgICAgICAgICgoQ0xBSU0tU1RSQVRFR1kgY2xhaW0tc3RyYXRlZ3kpIGJ1ZmZlci1zaXplKQotICAgICAgICAgICAgICAgICAgIChtay13YWl0LXN0cmF0ZWd5IHdhaXQtc3RyYXRlZ3kpIHRpbWVvdXQpKQorICAgICAgICAgICAgICAgICAgIChQUk9EVUNFUi1UWVBFIHByb2R1Y2VyLXR5cGUpIGJ1ZmZlci1zaXplCisgICAgICAgICAgICAgICAgICAgdGltZW91dCBiYXRjaC1zaXplIGJhdGNoLXRpbWVvdXQpKQogCiAoZGVmbiBjbG9qdXJlLWhhbmRsZXIKICAgW2Fmbl0KQEAgLTc5LDE0ICs2MSw4IEBACiAgIGAoY2xvanVyZS1oYW5kbGVyIChmbiB+QGFyZ3MpKSkKIAogKGRlZm4gcHVibGlzaAotICAoW15EaXNydXB0b3JRdWV1ZSBxIG8gYmxvY2s/XQotICAgKC5wdWJsaXNoIHEgbyBibG9jaz8pKQotICAoW3Egb10KLSAgIChwdWJsaXNoIHEgbyB0cnVlKSkpCi0KLShkZWZuIHRyeS1wdWJsaXNoCiAgIFteRGlzcnVwdG9yUXVldWUgcSBvXQotICAoLnRyeVB1Ymxpc2ggcSBvKSkKKyAgKC5wdWJsaXNoIHEgbykpCiAKIChkZWZuIGNvbnN1bWUtYmF0Y2gKICAgW15EaXNydXB0b3JRdWV1ZSBxdWV1ZSBoYW5kbGVyXQpAQCAtOTYsMTAgKzcyLDYgQEAKICAgW15EaXNydXB0b3JRdWV1ZSBxdWV1ZSBoYW5kbGVyXQogICAoLmNvbnN1bWVCYXRjaFdoZW5BdmFpbGFibGUgcXVldWUgaGFuZGxlcikpCiAKLShkZWZuIGNvbnN1bWVyLXN0YXJ0ZWQhCi0gIFteRGlzcnVwdG9yUXVldWUgcXVldWVdCi0gICguY29uc3VtZXJTdGFydGVkIHF1ZXVlKSkKLQogKGRlZm4gaGFsdC13aXRoLWludGVycnVwdCEKICAgW15EaXNydXB0b3JRdWV1ZSBxdWV1ZV0KICAgKC5oYWx0V2l0aEludGVycnVwdCBxdWV1ZSkpCkBAIC0xMDcsMTEgKzc5LDEwIEBACiAoZGVmbmsgY29uc3VtZS1sb29wKgogICBbXkRpc3J1cHRvclF1ZXVlIHF1ZXVlIGhhbmRsZXIKICAgIDpraWxsLWZuIChmbiBbZXJyb3JdIChleGl0LXByb2Nlc3MhIDEgIkFzeW5jIGxvb3AgZGllZCEiKSldCi0gIChsZXQgW3JldCAoYXN5bmMtbG9vcAotICAgICAgICAgICAgICAoZm4gW10gKGNvbnN1bWUtYmF0Y2gtd2hlbi1hdmFpbGFibGUgcXVldWUgaGFuZGxlcikgMCkKLSAgICAgICAgICAgICAgOmtpbGwtZm4ga2lsbC1mbgotICAgICAgICAgICAgICA6dGhyZWFkLW5hbWUgKC5nZXROYW1lIHF1ZXVlKSldCi0gICAgIChjb25zdW1lci1zdGFydGVkISBxdWV1ZSkgcmV0KSkKKyAgKGFzeW5jLWxvb3AKKyAgICAgICAgICAoZm4gW10gKGNvbnN1bWUtYmF0Y2gtd2hlbi1hdmFpbGFibGUgcXVldWUgaGFuZGxlcikgMCkKKyAgICAgICAgICA6a2lsbC1mbiBraWxsLWZuCisgICAgICAgICAgOnRocmVhZC1uYW1lICguZ2V0TmFtZSBxdWV1ZSkpKQogCiAoZGVmbWFjcm8gY29uc3VtZS1sb29wIFtxdWV1ZSAmIGhhbmRsZXItYXJnc10KICAgYChsZXQgW2hhbmRsZXIjIChoYW5kbGVyIH5AaGFuZGxlci1hcmdzKV0KZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2Nsai9iYWNrdHlwZS9zdG9ybS9sb2NhbF9zdGF0ZS5jbGogYi9zdG9ybS1jb3JlL3NyYy9jbGovYmFja3R5cGUvc3Rvcm0vbG9jYWxfc3RhdGUuY2xqCmluZGV4IDQxZTM2NzUuLmJmOTU2N2QgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2Nsai9iYWNrdHlwZS9zdG9ybS9sb2NhbF9zdGF0ZS5jbGoKKysrIGIvc3Rvcm0tY29yZS9zcmMvY2xqL2JhY2t0eXBlL3N0b3JtL2xvY2FsX3N0YXRlLmNsagpAQCAtMTksMTMgKzE5LDM4IEBACiAgICAgICAgICAgICBJbnZhbGlkVG9wb2xvZ3lFeGNlcHRpb24gR2xvYmFsU3RyZWFtSWQKICAgICAgICAgICAgIExTU3VwZXJ2aXNvcklkIExTQXBwcm92ZWRXb3JrZXJzCiAgICAgICAgICAgICBMU1N1cGVydmlzb3JBc3NpZ25tZW50cyBMb2NhbEFzc2lnbm1lbnQKLSAgICAgICAgICAgIEV4ZWN1dG9ySW5mbyBMU1dvcmtlckhlYXJ0YmVhdF0pCisgICAgICAgICAgICBFeGVjdXRvckluZm8gTFNXb3JrZXJIZWFydGJlYXQKKyAgICAgICAgICAgIExTVG9wb0hpc3RvcnkgTFNUb3BvSGlzdG9yeUxpc3QKKyAgICAgICAgICAgIFdvcmtlclJlc291cmNlc10pCiAgICg6aW1wb3J0IFtiYWNrdHlwZS5zdG9ybS51dGlscyBMb2NhbFN0YXRlXSkpCiAKIChkZWYgTFMtV09SS0VSLUhFQVJUQkVBVCAid29ya2VyLWhlYXJ0YmVhdCIpCiAoZGVmIExTLUlEICJzdXBlcnZpc29yLWlkIikKIChkZWYgTFMtTE9DQUwtQVNTSUdOTUVOVFMgImxvY2FsLWFzc2lnbm1lbnRzIikKIChkZWYgTFMtQVBQUk9WRUQtV09SS0VSUyAiYXBwcm92ZWQtd29ya2VycyIpCisoZGVmIExTLVRPUE8tSElTVE9SWSAidG9wby1oaXN0IikKKworKGRlZm4gLT5MU1RvcG9IaXN0b3J5CisgIFt7dG9wb2lkIDp0b3BvaWQgdGltZXN0YW1wIDp0aW1lc3RhbXAgdXNlcnMgOnVzZXJzIGdyb3VwcyA6Z3JvdXBzfV0KKyAgKExTVG9wb0hpc3RvcnkuIHRvcG9pZCB0aW1lc3RhbXAgdXNlcnMgZ3JvdXBzKSkKKworKGRlZm4gLT50b3BvLWhpc3RvcnkKKyAgW3RocmlmdC10b3BvLWhpc3RdCisgIHsKKyAgICA6dG9wb2lkICguZ2V0X3RvcG9sb2d5X2lkIHRocmlmdC10b3BvLWhpc3QpCisgICAgOnRpbWVzdGFtcCAoLmdldF90aW1lX3N0YW1wIHRocmlmdC10b3BvLWhpc3QpCisgICAgOnVzZXJzICguZ2V0X3VzZXJzIHRocmlmdC10b3BvLWhpc3QpCisgICAgOmdyb3VwcyAoLmdldF9ncm91cHMgdGhyaWZ0LXRvcG8taGlzdCl9KQorCisoZGVmbiBscy10b3BvLWhpc3QhCisgIFteTG9jYWxTdGF0ZSBsb2NhbC1zdGF0ZSBoaXN0LWxpc3RdCisgICgucHV0IGxvY2FsLXN0YXRlIExTLVRPUE8tSElTVE9SWQorICAgIChMU1RvcG9IaXN0b3J5TGlzdC4gKG1hcCAtPkxTVG9wb0hpc3RvcnkgaGlzdC1saXN0KSkpKQorCisoZGVmbiBscy10b3BvLWhpc3QKKyAgW15Mb2NhbFN0YXRlIGxvY2FsLXN0YXRlXQorICAoaWYtbGV0IFt0aHJpZnQtaGlzdC1saXN0ICguZ2V0IGxvY2FsLXN0YXRlIExTLVRPUE8tSElTVE9SWSldCisgICAgKG1hcCAtPnRvcG8taGlzdG9yeSAoLmdldF90b3BvX2hpc3RvcnkgdGhyaWZ0LWhpc3QtbGlzdCkpKSkKIAogKGRlZm4gbHMtc3VwZXJ2aXNvci1pZCEKICAgW15Mb2NhbFN0YXRlIGxvY2FsLXN0YXRlIF5TdHJpbmcgaWRdCkBAIC01OSwxOCArODQsMjUgQEAKICAgICAgIFsoLmdldF90YXNrX3N0YXJ0IGV4ZWMtaW5mbykgKC5nZXRfdGFza19lbmQgZXhlYy1pbmZvKV0pKSkKIAogKGRlZm4gLT5Mb2NhbEFzc2lnbm1lbnQKLSAgW3tzdG9ybS1pZCA6c3Rvcm0taWQgZXhlY3V0b3JzIDpleGVjdXRvcnN9XQotICAoTG9jYWxBc3NpZ25tZW50LiBzdG9ybS1pZCAoLT5FeGVjdXRvckluZm8tbGlzdCBleGVjdXRvcnMpKSkKKyAgW3tzdG9ybS1pZCA6c3Rvcm0taWQgZXhlY3V0b3JzIDpleGVjdXRvcnMgcmVzb3VyY2VzIDpyZXNvdXJjZXN9XQorICAobGV0IFthc3NpZ25tZW50IChMb2NhbEFzc2lnbm1lbnQuIHN0b3JtLWlkICgtPkV4ZWN1dG9ySW5mby1saXN0IGV4ZWN1dG9ycykpXQorICAgIChpZiByZXNvdXJjZXMgKC5zZXRfcmVzb3VyY2VzIGFzc2lnbm1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZG90byAoV29ya2VyUmVzb3VyY2VzLiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLnNldF9tZW1fb25faGVhcCAoZmlyc3QgcmVzb3VyY2VzKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICguc2V0X21lbV9vZmZfaGVhcCAoc2Vjb25kIHJlc291cmNlcykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLnNldF9jcHUgKGxhc3QgcmVzb3VyY2VzKSkpKSkKKyAgICBhc3NpZ25tZW50KSkKIAogKGRlZm4gbWstbG9jYWwtYXNzaWdubWVudAotICBbc3Rvcm0taWQgZXhlY3V0b3JzXQotICB7OnN0b3JtLWlkIHN0b3JtLWlkIDpleGVjdXRvcnMgZXhlY3V0b3JzfSkKKyAgW3N0b3JtLWlkIGV4ZWN1dG9ycyByZXNvdXJjZXNdCisgIHs6c3Rvcm0taWQgc3Rvcm0taWQgOmV4ZWN1dG9ycyBleGVjdXRvcnMgOnJlc291cmNlcyByZXNvdXJjZXN9KQogCiAoZGVmbiAtPmxvY2FsLWFzc2lnbm1lbnQKICAgW15Mb2NhbEFzc2lnbm1lbnQgdGhyaWZ0LWxvY2FsLWFzc2lnbm1lbnRdCiAgICAgKG1rLWxvY2FsLWFzc2lnbm1lbnQKICAgICAgICguZ2V0X3RvcG9sb2d5X2lkIHRocmlmdC1sb2NhbC1hc3NpZ25tZW50KQotICAgICAgKC0+ZXhlY3V0b3ItbGlzdCAoLmdldF9leGVjdXRvcnMgdGhyaWZ0LWxvY2FsLWFzc2lnbm1lbnQpKSkpCisgICAgICAoLT5leGVjdXRvci1saXN0ICguZ2V0X2V4ZWN1dG9ycyB0aHJpZnQtbG9jYWwtYXNzaWdubWVudCkpCisgICAgICAoLmdldF9yZXNvdXJjZXMgdGhyaWZ0LWxvY2FsLWFzc2lnbm1lbnQpKSkKIAogKGRlZm4gbHMtbG9jYWwtYXNzaWdubWVudHMhCiAgIFteTG9jYWxTdGF0ZSBsb2NhbC1zdGF0ZSBhc3NpZ25tZW50c10KZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2Nsai9iYWNrdHlwZS9zdG9ybS9sb2cuY2xqIGIvc3Rvcm0tY29yZS9zcmMvY2xqL2JhY2t0eXBlL3N0b3JtL2xvZy5jbGoKaW5kZXggMGZjZjgyMi4uYWJlOWIzMiAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvY2xqL2JhY2t0eXBlL3N0b3JtL2xvZy5jbGoKKysrIGIvc3Rvcm0tY29yZS9zcmMvY2xqL2JhY2t0eXBlL3N0b3JtL2xvZy5jbGoKQEAgLTE1LDcgKzE1LDkgQEAKIDs7IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAobnMgYmFja3R5cGUuc3Rvcm0ubG9nCi0gICg6cmVxdWlyZSBbY2xvanVyZS50b29scyBbbG9nZ2luZyA6YXMgbG9nXV0pKQorICAoOnJlcXVpcmUgW2Nsb2p1cmUudG9vbHMubG9nZ2luZyA6YXMgbG9nXSkKKyAgKDp1c2UgW2Nsb2p1cmUgcHByaW50XSkKKyAgKDppbXBvcnQgW2phdmEuaW8gU3RyaW5nV3JpdGVyXSkpCiAKIChkZWZtYWNybyBsb2ctbWVzc2FnZQogICBbJiBhcmdzXQpAQCAtNDQsMyArNDYsMTEgQEAKIChkZWZuIGxvZy1zdHJlYW0KICAgWyYgYXJnc10KICAgKGFwcGx5IGxvZy9sb2ctc3RyZWFtIGFyZ3MpKQorCisoZGVmbWFjcm8gbG9nLXBwcmludAorICBbJiBhcmdzXQorICBgKGxldCBbXlN0cmluZ1dyaXRlciB3cml0ZXIjIChTdHJpbmdXcml0ZXIuKV0KKyAgICAgKGRvYWxsCisgICAgICAgKGZvciBbb2JqZWN0IyBbfkBhcmdzXV0KKyAgICAgICAgIChwcHJpbnQgb2JqZWN0IyB3cml0ZXIjKSkpCisgICAgIChsb2ctbWVzc2FnZSAiXG4iIHdyaXRlciMpKSkKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2Nsai9iYWNrdHlwZS9zdG9ybS9tZXNzYWdpbmcvbG9hZGVyLmNsaiBiL3N0b3JtLWNvcmUvc3JjL2Nsai9iYWNrdHlwZS9zdG9ybS9tZXNzYWdpbmcvbG9hZGVyLmNsagppbmRleCBjMTU0ZWQ4Li43MmRkMzgyIDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9jbGovYmFja3R5cGUvc3Rvcm0vbWVzc2FnaW5nL2xvYWRlci5jbGoKKysrIGIvc3Rvcm0tY29yZS9zcmMvY2xqL2JhY2t0eXBlL3N0b3JtL21lc3NhZ2luZy9sb2FkZXIuY2xqCkBAIC0xNCw3MSArMTQsMjEgQEAKIDs7IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIDs7IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKG5zIGJhY2t0eXBlLnN0b3JtLm1lc3NhZ2luZy5sb2FkZXIKLSAgKDp1c2UgW2JhY2t0eXBlLnN0b3JtIHV0aWwgbG9nXSkKLSAgKDppbXBvcnQgW2phdmEudXRpbCBBcnJheUxpc3QgSXRlcmF0b3JdKQotICAoOmltcG9ydCBbYmFja3R5cGUuc3Rvcm0ubWVzc2FnaW5nIElDb250ZXh0IElDb25uZWN0aW9uIFRhc2tNZXNzYWdlXSkKLSAgKDppbXBvcnQgW2JhY2t0eXBlLnN0b3JtLnV0aWxzIERpc3J1cHRvclF1ZXVlIE11dGFibGVPYmplY3RdKQotICAoOnJlcXVpcmUgW2JhY2t0eXBlLnN0b3JtLm1lc3NhZ2luZyBbbG9jYWwgOmFzIGxvY2FsXV0pCi0gICg6cmVxdWlyZSBbYmFja3R5cGUuc3Rvcm0gW2Rpc3J1cHRvciA6YXMgZGlzcnVwdG9yXV0pKQorICAoOmltcG9ydCBbYmFja3R5cGUuc3Rvcm0ubWVzc2FnaW5nIElDb25uZWN0aW9uIERlc2VyaWFsaXppbmdDb25uZWN0aW9uQ2FsbGJhY2tdKQorICAoOnJlcXVpcmUgW2JhY2t0eXBlLnN0b3JtLm1lc3NhZ2luZyBbbG9jYWwgOmFzIGxvY2FsXV0pKQogCiAoZGVmbiBtay1sb2NhbC1jb250ZXh0IFtdCiAgIChsb2NhbC9tay1jb250ZXh0KSkKIAotKGRlZm4tIG1rLXJlY2VpdmUtdGhyZWFkIFtzdG9ybS1pZCBwb3J0IHRyYW5zZmVyLWxvY2FsLWZuICBkYWVtb24ga2lsbC1mbiBwcmlvcml0eSBzb2NrZXQgdGhyZWFkLWlkXQotICAgIChhc3luYy1sb29wCi0gICAgICAgKGZuIFtdCi0gICAgICAgICAobG9nLW1lc3NhZ2UgIlN0YXJ0aW5nIHJlY2VpdmUtdGhyZWFkOiBbc3Rvcm1JZDogIiBzdG9ybS1pZCAiLCBwb3J0OiAiIHBvcnQgIiwgdGhyZWFkLWlkOiAiIHRocmVhZC1pZCAgIiBdIikKLSAgICAgICAgIChmbiBbXQotICAgICAgICAgICAobGV0IFtiYXRjaGVkIChBcnJheUxpc3QuKQotICAgICAgICAgICAgICAgICBeSXRlcmF0b3IgaXRlciAoLnJlY3YgXklDb25uZWN0aW9uIHNvY2tldCAwIHRocmVhZC1pZCkKLSAgICAgICAgICAgICAgICAgY2xvc2VkIChhdG9tIGZhbHNlKV0KLSAgICAgICAgICAgICAod2hlbiBpdGVyCi0gICAgICAgICAgICAgICAod2hpbGUgKGFuZCAobm90IEBjbG9zZWQpICguaGFzTmV4dCBpdGVyKSkgCi0gICAgICAgICAgICAgICAgICAobGV0IFtwYWNrZXQgKC5uZXh0IGl0ZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICB0YXNrIChpZiBwYWNrZXQgKC50YXNrIF5UYXNrTWVzc2FnZSBwYWNrZXQpKQotICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSAoaWYgcGFja2V0ICgubWVzc2FnZSBeVGFza01lc3NhZ2UgcGFja2V0KSldCi0gICAgICAgICAgICAgICAgICAgICAgKGlmICg9IHRhc2sgLTEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgKGRvIChsb2ctbWVzc2FnZSAiUmVjZWl2aW5nLXRocmVhZDpbIiBzdG9ybS1pZCAiLCAiIHBvcnQgIl0gcmVjZWl2ZWQgc2h1dGRvd24gbm90aWNlIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICguY2xvc2Ugc29ja2V0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlc2V0ISBjbG9zZWQgIHRydWUpKQotICAgICAgICAgICAgICAgICAgICAgICAgICh3aGVuIHBhY2tldCAoLmFkZCBiYXRjaGVkIFt0YXNrIG1lc3NhZ2VdKSkpKSkpCi0gICAgICAgICAgICAgCi0gICAgICAgICAgICAgKHdoZW4gKG5vdCBAY2xvc2VkKQotICAgICAgICAgICAgICAgKGRvCi0gICAgICAgICAgICAgICAgIChpZiAoPiAoLnNpemUgYmF0Y2hlZCkgMCkKLSAgICAgICAgICAgICAgICAgICAodHJhbnNmZXItbG9jYWwtZm4gYmF0Y2hlZCkpCi0gICAgICAgICAgICAgICAgIDApKSkpKQotICAgICAgICAgOmZhY3Rvcnk/IHRydWUKLSAgICAgICAgIDpkYWVtb24gZGFlbW9uCi0gICAgICAgICA6a2lsbC1mbiBraWxsLWZuCi0gICAgICAgICA6cHJpb3JpdHkgcHJpb3JpdHkKLSAgICAgICAgIDp0aHJlYWQtbmFtZSAoc3RyICJ3b3JrZXItcmVjZWl2ZXItdGhyZWFkLSIgdGhyZWFkLWlkKSkpCisoZGVmbi0gbWstY29ubmVjdGlvbi1jYWxsYmFjaworICAibWFrZSBhbiBJQ29ubmVjdGlvbkNhbGxiYWNrIgorICBbdHJhbnNmZXItbG9jYWwtZm4gc3Rvcm0tY29uZiB3b3JrZXItY29udGV4dF0KKyAgKERlc2VyaWFsaXppbmdDb25uZWN0aW9uQ2FsbGJhY2suIHN0b3JtLWNvbmYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlci1jb250ZXh0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm4gW2JhdGNoXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHJhbnNmZXItbG9jYWwtZm4gYmF0Y2gpKSkpCiAKLShkZWZuLSBtay1yZWNlaXZlLXRocmVhZHMgW3N0b3JtLWlkIHBvcnQgdHJhbnNmZXItbG9jYWwtZm4gIGRhZW1vbiBraWxsLWZuIHByaW9yaXR5IHNvY2tldCB0aHJlYWQtY291bnRdCi0gIChpbnRvIFtdIChmb3IgW3RocmVhZC1pZCAocmFuZ2UgdGhyZWFkLWNvdW50KV0gCi0gICAgICAgICAgICAgKG1rLXJlY2VpdmUtdGhyZWFkIHN0b3JtLWlkIHBvcnQgdHJhbnNmZXItbG9jYWwtZm4gIGRhZW1vbiBraWxsLWZuIHByaW9yaXR5IHNvY2tldCB0aHJlYWQtaWQpKSkpCi0KLQotKGRlZm5rIGxhdW5jaC1yZWNlaXZlLXRocmVhZCEKLSAgW2NvbnRleHQgc29ja2V0IHN0b3JtLWlkIHJlY2VpdmVyLXRocmVhZC1jb3VudCBwb3J0IHRyYW5zZmVyLWxvY2FsLWZuCi0gICA6ZGFlbW9uIHRydWUKLSAgIDpraWxsLWZuIChmbiBbdF0gKFN5c3RlbS9leGl0IDEpKQotICAgOnByaW9yaXR5IFRocmVhZC9OT1JNX1BSSU9SSVRZXQotICAobGV0IFtsb2NhbC1ob3N0bmFtZSAobWVtb2l6ZWQtbG9jYWwtaG9zdG5hbWUpCi0gICAgICAgIHRocmVhZC1jb3VudCAoaWYgcmVjZWl2ZXItdGhyZWFkLWNvdW50IHJlY2VpdmVyLXRocmVhZC1jb3VudCAxKQotICAgICAgICB2dGhyZWFkcyAobWstcmVjZWl2ZS10aHJlYWRzIHN0b3JtLWlkIHBvcnQgdHJhbnNmZXItbG9jYWwtZm4gZGFlbW9uIGtpbGwtZm4gcHJpb3JpdHkgc29ja2V0IHRocmVhZC1jb3VudCldCi0gICAgKGZuIFtdCi0gICAgICAobGV0IFtraWxsLXNvY2tldCAoLmNvbm5lY3QgXklDb250ZXh0IGNvbnRleHQgc3Rvcm0taWQgbG9jYWwtaG9zdG5hbWUgcG9ydCldCi0gICAgICAgIChsb2ctbWVzc2FnZSAiU2h1dHRpbmcgZG93biByZWNlaXZpbmctdGhyZWFkOiBbIiBzdG9ybS1pZCAiLCAiIHBvcnQgIl0iKQotICAgICAgICAoLnNlbmQgXklDb25uZWN0aW9uIGtpbGwtc29ja2V0Ci0gICAgICAgICAgICAgICAgICAtMSAoYnl0ZS1hcnJheSBbXSkpCi0gICAgICAgIAotICAgICAgICAoLmNsb3NlIF5JQ29ubmVjdGlvbiBraWxsLXNvY2tldCkKLSAgICAgICAgCi0gICAgICAgIChsb2ctbWVzc2FnZSAiV2FpdGluZyBmb3IgcmVjZWl2aW5nLXRocmVhZDpbIiBzdG9ybS1pZCAiLCAiIHBvcnQgIl0gdG8gZGllIikKLSAgICAgICAgCi0gICAgICAgIChmb3IgW3RocmVhZC1pZCAocmFuZ2UgdGhyZWFkLWNvdW50KV0gCi0gICAgICAgICAgICAgKC5qb2luICh2dGhyZWFkcyB0aHJlYWQtaWQpKSkKLSAgICAgICAgCi0gICAgICAgIChsb2ctbWVzc2FnZSAiU2h1dGRvd24gcmVjZWl2aW5nLXRocmVhZDogWyIgc3Rvcm0taWQgIiwgIiBwb3J0ICJdIikKLSAgICAgICAgKSkpKQorKGRlZm4gcmVnaXN0ZXItY2FsbGJhY2sKKyAgInJlZ2lzdGVyIHRoZSBsb2NhbC10cmFuc2Zlci1mbiB3aXRoIHRoZSBzZXJ2ZXIiCisgIFt0cmFuc2Zlci1sb2NhbC1mbiBeSUNvbm5lY3Rpb24gc29ja2V0IHN0b3JtLWNvbmYgd29ya2VyLWNvbnRleHRdCisgICgucmVnaXN0ZXJSZWN2IHNvY2tldCAobWstY29ubmVjdGlvbi1jYWxsYmFjayB0cmFuc2Zlci1sb2NhbC1mbiBzdG9ybS1jb25mIHdvcmtlci1jb250ZXh0KSkpCmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9jbGovYmFja3R5cGUvc3Rvcm0vbWVzc2FnaW5nL2xvY2FsLmNsaiBiL3N0b3JtLWNvcmUvc3JjL2Nsai9iYWNrdHlwZS9zdG9ybS9tZXNzYWdpbmcvbG9jYWwuY2xqCmluZGV4IDRhYTY3YWIuLmI5OWE3N2EgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2Nsai9iYWNrdHlwZS9zdG9ybS9tZXNzYWdpbmcvbG9jYWwuY2xqCisrKyBiL3N0b3JtLWNvcmUvc3JjL2Nsai9iYWNrdHlwZS9zdG9ybS9tZXNzYWdpbmcvbG9jYWwuY2xqCkBAIC0xNCw2MCArMTQsMTAgQEAKIDs7IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIDs7IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogKG5zIGJhY2t0eXBlLnN0b3JtLm1lc3NhZ2luZy5sb2NhbAotICAoOnJlZmVyLWNsb2p1cmUgOmV4Y2x1ZGUgW3NlbmRdKQotICAoOnVzZSBbYmFja3R5cGUuc3Rvcm0gbG9nXSkKLSAgKDppbXBvcnQgW2JhY2t0eXBlLnN0b3JtLm1lc3NhZ2luZyBJQ29udGV4dCBJQ29ubmVjdGlvbiBUYXNrTWVzc2FnZV0pCi0gICg6aW1wb3J0IFtqYXZhLnV0aWwuY29uY3VycmVudCBMaW5rZWRCbG9ja2luZ1F1ZXVlXSkKLSAgKDppbXBvcnQgW2phdmEudXRpbCBNYXAgSXRlcmF0b3JdKQotICAoOmltcG9ydCBbamF2YS51dGlsIEl0ZXJhdG9yIEFycmF5TGlzdF0pCi0gICg6Z2VuLWNsYXNzKSkKLQotKGRlZm4gYWRkLXF1ZXVlISBbcXVldWVzLW1hcCBsb2NrIHN0b3JtLWlkIHBvcnRdCi0gIChsZXQgW2lkIChzdHIgc3Rvcm0taWQgIi0iIHBvcnQpXQotICAgIChsb2NraW5nIGxvY2sKLSAgICAgICh3aGVuLW5vdCAoY29udGFpbnM/IEBxdWV1ZXMtbWFwIGlkKQotICAgICAgICAoc3dhcCEgcXVldWVzLW1hcCBhc3NvYyBpZCAoTGlua2VkQmxvY2tpbmdRdWV1ZS4pKSkpCi0gICAgKEBxdWV1ZXMtbWFwIGlkKSkpCi0KLShkZWZ0eXBlIExvY2FsQ29ubmVjdGlvbiBbc3Rvcm0taWQgcG9ydCBxdWV1ZXMtbWFwIGxvY2sgcXVldWVdCi0gIElDb25uZWN0aW9uCi0gICheSXRlcmF0b3IgcmVjdiBbdGhpcyBeaW50IGZsYWdzIF5pbnQgY2xpZW50SWRdCi0gICAgKHdoZW4tbm90IHF1ZXVlCi0gICAgICAodGhyb3cgKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi4gIkNhbm5vdCByZWNlaXZlIG9uIHRoaXMgc29ja2V0IikpKQotICAgIChsZXQgW3JldCAoQXJyYXlMaXN0LikKLSAgICAgICAgICBtc2cgKGlmICg9IGZsYWdzIDEpICgucG9sbCBxdWV1ZSkgKC50YWtlIHF1ZXVlKSldCi0gICAgICAoaWYgbXNnCi0gICAgICAgIChkbyAKLSAgICAgICAgICAoLmFkZCByZXQgbXNnKQotICAgICAgICAgICguaXRlcmF0b3IgcmV0KSkKLSAgICAgICAgbmlsKSkpCi0gIChedm9pZCBzZW5kIFt0aGlzIF5pbnQgdGFza0lkIF5ieXRlcyBwYXlsb2FkXQotICAgIChsZXQgW3NlbmQtcXVldWUgKGFkZC1xdWV1ZSEgcXVldWVzLW1hcCBsb2NrIHN0b3JtLWlkIHBvcnQpXQotICAgICAgKC5wdXQgc2VuZC1xdWV1ZSAoVGFza01lc3NhZ2UuIHRhc2tJZCBwYXlsb2FkKSkKLSAgICAgICkpCi0gIChedm9pZCBzZW5kIFt0aGlzIF5JdGVyYXRvciBpdGVyXQotICAgIChsZXQgW3NlbmQtcXVldWUgKGFkZC1xdWV1ZSEgcXVldWVzLW1hcCBsb2NrIHN0b3JtLWlkIHBvcnQpXQotICAgICAgKHdoaWxlICguaGFzTmV4dCBpdGVyKSAKLSAgICAgICAgICgucHV0IHNlbmQtcXVldWUgKC5uZXh0IGl0ZXIpKSkKLSAgICAgICkpCi0gIChedm9pZCBjbG9zZSBbdGhpc10KLSAgICApKQotCi0KLShkZWZ0eXBlIExvY2FsQ29udGV4dCBbXns6dW5zeW5jaHJvbml6ZWQtbXV0YWJsZSB0cnVlfSBxdWV1ZXMtbWFwCi0gICAgICAgICAgICAgICAgICAgICAgIF57OnVuc3luY2hyb25pemVkLW11dGFibGUgdHJ1ZX0gbG9ja10KLSAgSUNvbnRleHQKLSAgKF52b2lkIHByZXBhcmUgW3RoaXMgXk1hcCBzdG9ybS1jb25mXQotICAgIChzZXQhIHF1ZXVlcy1tYXAgKGF0b20ge30pKQotICAgIChzZXQhIGxvY2sgKE9iamVjdC4pKSkKLSAgKF5JQ29ubmVjdGlvbiBiaW5kIFt0aGlzIF5TdHJpbmcgc3Rvcm0taWQgXmludCBwb3J0XQotICAgIChMb2NhbENvbm5lY3Rpb24uIHN0b3JtLWlkIHBvcnQgcXVldWVzLW1hcCBsb2NrIChhZGQtcXVldWUhIHF1ZXVlcy1tYXAgbG9jayBzdG9ybS1pZCBwb3J0KSkpCi0gICheSUNvbm5lY3Rpb24gY29ubmVjdCBbdGhpcyBeU3RyaW5nIHN0b3JtLWlkIF5TdHJpbmcgaG9zdCBeaW50IHBvcnRdCi0gICAgKExvY2FsQ29ubmVjdGlvbi4gc3Rvcm0taWQgcG9ydCBxdWV1ZXMtbWFwIGxvY2sgbmlsKSkKLSAgKF52b2lkIHRlcm0gW3RoaXNdCi0gICAgKSkKKyAgKDppbXBvcnQgW2JhY2t0eXBlLnN0b3JtLm1lc3NhZ2luZyBJQ29udGV4dF0pCisgICg6aW1wb3J0IFtiYWNrdHlwZS5zdG9ybS5tZXNzYWdpbmcubG9jYWwgQ29udGV4dF0pKQogCiAoZGVmbiBtay1jb250ZXh0IFtdIAotICAobGV0IFtjb250ZXh0ICAoTG9jYWxDb250ZXh0LiBuaWwgbmlsKV0KKyAgKGxldCBbY29udGV4dCAgKENvbnRleHQuKV0KICAgICAoLnByZXBhcmUgXklDb250ZXh0IGNvbnRleHQgbmlsKQogICAgIGNvbnRleHQpKQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvY2xqL2JhY2t0eXBlL3N0b3JtL3N0YXRzLmNsaiBiL3N0b3JtLWNvcmUvc3JjL2Nsai9iYWNrdHlwZS9zdG9ybS9zdGF0cy5jbGoKaW5kZXggZGI4OTMwYy4uZWE0ZWZlNCAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvY2xqL2JhY2t0eXBlL3N0b3JtL3N0YXRzLmNsagorKysgYi9zdG9ybS1jb3JlL3NyYy9jbGovYmFja3R5cGUvc3Rvcm0vc3RhdHMuY2xqCkBAIC0xNywyMzYgKzE3LDE0NCBAQAogKG5zIGJhY2t0eXBlLnN0b3JtLnN0YXRzCiAgICg6aW1wb3J0IFtiYWNrdHlwZS5zdG9ybS5nZW5lcmF0ZWQgTmltYnVzIE5pbWJ1cyRQcm9jZXNzb3IgTmltYnVzJElmYWNlIFN0b3JtVG9wb2xvZ3kgU2hlbGxDb21wb25lbnQKICAgICAgICAgICAgIE5vdEFsaXZlRXhjZXB0aW9uIEFscmVhZHlBbGl2ZUV4Y2VwdGlvbiBJbnZhbGlkVG9wb2xvZ3lFeGNlcHRpb24gR2xvYmFsU3RyZWFtSWQKLSAgICAgICAgICAgIENsdXN0ZXJTdW1tYXJ5IFRvcG9sb2d5SW5mbyBUb3BvbG9neVN1bW1hcnkgRXhlY3V0b3JTdW1tYXJ5IEV4ZWN1dG9yU3RhdHMgRXhlY3V0b3JTcGVjaWZpY1N0YXRzCi0gICAgICAgICAgICBTcG91dFN0YXRzIEJvbHRTdGF0cyBFcnJvckluZm8gU3VwZXJ2aXNvclN1bW1hcnldKQotICAoOnVzZSBbYmFja3R5cGUuc3Rvcm0gdXRpbCBsb2ddKQorICAgICAgICAgICAgQ2x1c3RlclN1bW1hcnkgVG9wb2xvZ3lJbmZvIFRvcG9sb2d5U3VtbWFyeSBFeGVjdXRvckluZm8gRXhlY3V0b3JTdW1tYXJ5IEV4ZWN1dG9yU3RhdHMKKyAgICAgICAgICAgIEV4ZWN1dG9yU3BlY2lmaWNTdGF0cyBTcG91dFN0YXRzIEJvbHRTdGF0cyBFcnJvckluZm8KKyAgICAgICAgICAgIFN1cGVydmlzb3JTdW1tYXJ5IENvbW1vbkFnZ3JlZ2F0ZVN0YXRzIENvbXBvbmVudEFnZ3JlZ2F0ZVN0YXRzCisgICAgICAgICAgICBDb21wb25lbnRQYWdlSW5mbyBDb21wb25lbnRUeXBlIEJvbHRBZ2dyZWdhdGVTdGF0cworICAgICAgICAgICAgRXhlY3V0b3JBZ2dyZWdhdGVTdGF0cyBTcGVjaWZpY0FnZ3JlZ2F0ZVN0YXRzCisgICAgICAgICAgICBTcG91dEFnZ3JlZ2F0ZVN0YXRzIFRvcG9sb2d5UGFnZUluZm8gVG9wb2xvZ3lTdGF0c10pCisgICg6aW1wb3J0IFtiYWNrdHlwZS5zdG9ybS51dGlscyBVdGlsc10pCisgICg6aW1wb3J0IFtiYWNrdHlwZS5zdG9ybS5tZXRyaWMuaW50ZXJuYWwgTXVsdGlDb3VudFN0YXRBbmRNZXRyaWMgTXVsdGlMYXRlbmN5U3RhdEFuZE1ldHJpY10pCisgICg6dXNlIFtiYWNrdHlwZS5zdG9ybSBsb2cgdXRpbF0pCiAgICg6dXNlIFtjbG9qdXJlLm1hdGgubnVtZXJpYy10b3dlciA6b25seSBbY2VpbF1dKSkKIAotOztUT0RPOiBjb25zaWRlciByZXBsYWNpbmcgdGhpcyB3aXRoIHNvbWUgc29ydCBvZiBSUkQKLQotKGRlZm4gY3Vyci10aW1lLWJ1Y2tldAotICBbXkludGVnZXIgdGltZS1zZWNzIF5JbnRlZ2VyIGJ1Y2tldC1zaXplLXNlY3NdCi0gICgqIGJ1Y2tldC1zaXplLXNlY3MgKHVuY2hlY2tlZC1kaXZpZGUtaW50IHRpbWUtc2VjcyBidWNrZXQtc2l6ZS1zZWNzKSkpCi0KLShkZWZyZWNvcmQgUm9sbGluZ1dpbmRvdwotICBbdXBkYXRlciBtZXJnZXIgZXh0cmFjdG9yIGJ1Y2tldC1zaXplLXNlY3MgbnVtLWJ1Y2tldHMgYnVja2V0c10pCi0KLShkZWZuIHJvbGxpbmctd2luZG93Ci0gIFt1cGRhdGVyIG1lcmdlciBleHRyYWN0b3IgYnVja2V0LXNpemUtc2VjcyBudW0tYnVja2V0c10KLSAgKFJvbGxpbmdXaW5kb3cuIHVwZGF0ZXIgbWVyZ2VyIGV4dHJhY3RvciBidWNrZXQtc2l6ZS1zZWNzIG51bS1idWNrZXRzIHt9KSkKLQotKGRlZm4gdXBkYXRlLXJvbGxpbmctd2luZG93Ci0gIChbXlJvbGxpbmdXaW5kb3cgcncgdGltZS1zZWNzICYgYXJnc10KLSAgIDs7IHRoaXMgaXMgMi41eCBmYXN0ZXIgdGhhbiB1c2luZyB1cGRhdGUtaW4uLi4KLSAgIChsZXQgW3RpbWUtYnVja2V0IChjdXJyLXRpbWUtYnVja2V0IHRpbWUtc2VjcyAoOmJ1Y2tldC1zaXplLXNlY3MgcncpKQotICAgICAgICAgYnVja2V0cyAoOmJ1Y2tldHMgcncpCi0gICAgICAgICBjdXJyIChnZXQgYnVja2V0cyB0aW1lLWJ1Y2tldCkKLSAgICAgICAgIGN1cnIgKGFwcGx5ICg6dXBkYXRlciBydykgY3VyciBhcmdzKV0KLSAgICAgKGFzc29jIHJ3IDpidWNrZXRzIChhc3NvYyBidWNrZXRzIHRpbWUtYnVja2V0IGN1cnIpKSkpKQotCi0oZGVmbiB2YWx1ZS1yb2xsaW5nLXdpbmRvdwotICBbXlJvbGxpbmdXaW5kb3cgcnddCi0gICgoOmV4dHJhY3RvciBydykKLSAgIChsZXQgW3ZhbHVlcyAodmFscyAoOmJ1Y2tldHMgcncpKV0KLSAgICAgKGFwcGx5ICg6bWVyZ2VyIHJ3KSB2YWx1ZXMpKSkpCi0KLShkZWZuIGNsZWFudXAtcm9sbGluZy13aW5kb3cKLSAgW15Sb2xsaW5nV2luZG93IHJ3XQotICAobGV0IFtidWNrZXRzICg6YnVja2V0cyBydykKLSAgICAgICAgY3V0b2ZmICgtIChjdXJyZW50LXRpbWUtc2VjcykKLSAgICAgICAgICAgICAgICAgICgqICg6bnVtLWJ1Y2tldHMgcncpCi0gICAgICAgICAgICAgICAgICAgICAoOmJ1Y2tldC1zaXplLXNlY3MgcncpKSkKLSAgICAgICAgdG8tcmVtb3ZlIChmaWx0ZXIgIyg8ICUgY3V0b2ZmKSAoa2V5cyBidWNrZXRzKSkKLSAgICAgICAgYnVja2V0cyAoYXBwbHkgZGlzc29jIGJ1Y2tldHMgdG8tcmVtb3ZlKV0KLSAgICAoYXNzb2MgcncgOmJ1Y2tldHMgYnVja2V0cykpKQotCi0oZGVmbiByb2xsaW5nLXdpbmRvdy1zaXplCi0gIFteUm9sbGluZ1dpbmRvdyByd10KLSAgKCogKDpidWNrZXQtc2l6ZS1zZWNzIHJ3KSAoOm51bS1idWNrZXRzIHJ3KSkpCi0KLShkZWZyZWNvcmQgUm9sbGluZ1dpbmRvd1NldCBbdXBkYXRlciBleHRyYWN0b3Igd2luZG93cyBhbGwtdGltZV0pCi0KLShkZWZuIHJvbGxpbmctd2luZG93LXNldCBbdXBkYXRlciBtZXJnZXIgZXh0cmFjdG9yIG51bS1idWNrZXRzICYgYnVja2V0LXNpemVzXQotICAoUm9sbGluZ1dpbmRvd1NldC4gdXBkYXRlciBleHRyYWN0b3IgKGRvZm9yIFtzIGJ1Y2tldC1zaXplc10gKHJvbGxpbmctd2luZG93IHVwZGF0ZXIgbWVyZ2VyIGV4dHJhY3RvciBzIG51bS1idWNrZXRzKSkgbmlsKQotICApCi0KLShkZWZuIHVwZGF0ZS1yb2xsaW5nLXdpbmRvdy1zZXQKLSAgKFteUm9sbGluZ1dpbmRvd1NldCByd3MgJiBhcmdzXQotICAgKGxldCBbbm93IChjdXJyZW50LXRpbWUtc2VjcykKLSAgICAgICAgIG5ldy13aW5kb3dzIChkb2ZvciBbdyAoOndpbmRvd3MgcndzKV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXBwbHkgdXBkYXRlLXJvbGxpbmctd2luZG93IHcgbm93IGFyZ3MpKV0KLSAgICAgKGFzc29jIHJ3cwotICAgICAgIDp3aW5kb3dzIG5ldy13aW5kb3dzCi0gICAgICAgOmFsbC10aW1lIChhcHBseSAoOnVwZGF0ZXIgcndzKSAoOmFsbC10aW1lIHJ3cykgYXJncykpKSkpCi0KLShkZWZuIGNsZWFudXAtcm9sbGluZy13aW5kb3ctc2V0Ci0gIChbXlJvbGxpbmdXaW5kb3dTZXQgcndzXQotICAgKGxldCBbd2luZG93cyAoOndpbmRvd3MgcndzKV0KLSAgICAgKGFzc29jIHJ3cyA6d2luZG93cyAobWFwIGNsZWFudXAtcm9sbGluZy13aW5kb3cgd2luZG93cykpKSkpCi0KLShkZWZuIHZhbHVlLXJvbGxpbmctd2luZG93LXNldAotICBbXlJvbGxpbmdXaW5kb3dTZXQgcndzXQotICAobWVyZ2UKLSAgICAoaW50byB7fQotICAgICAgICAgIChmb3IgW3cgKDp3aW5kb3dzIHJ3cyldCi0gICAgICAgICAgICB7KHJvbGxpbmctd2luZG93LXNpemUgdykgKHZhbHVlLXJvbGxpbmctd2luZG93IHcpfQotICAgICAgICAgICAgKSkKLSAgICB7OmFsbC10aW1lICgoOmV4dHJhY3RvciByd3MpICg6YWxsLXRpbWUgcndzKSl9KSkKLQotKGRlZm4tIGluY3ItdmFsCi0gIChbYW1hcCBrZXldCi0gICAoaW5jci12YWwgYW1hcCBrZXkgMSkpCi0gIChbYW1hcCBrZXkgYW10XQotICAgKGxldCBbdmFsIChnZXQgYW1hcCBrZXkgKGxvbmcgMCkpXQotICAgICAoYXNzb2MgYW1hcCBrZXkgKCsgdmFsIGFtdCkpKSkpCi0KLShkZWZuLSB1cGRhdGUtYXZnCi0gIFtjdXJyIHZhbF0KLSAgKGlmIGN1cnIKLSAgICBbKCsgKGZpcnN0IGN1cnIpIHZhbCkgKGluYyAoc2Vjb25kIGN1cnIpKV0KLSAgICBbdmFsIChsb25nIDEpXSkpCi0KLShkZWZuLSBtZXJnZS1hdmcKLSAgWyYgYXZnXQotICBbKGFwcGx5ICsgKG1hcCBmaXJzdCBhdmcpKQotICAgKGFwcGx5ICsgKG1hcCBzZWNvbmQgYXZnKSkKLSAgIF0pCi0KLShkZWZuLSBleHRyYWN0LWF2ZwotICBbcGFpcl0KLSAgKGRvdWJsZSAoLyAoZmlyc3QgcGFpcikgKHNlY29uZCBwYWlyKSkpKQotCi0oZGVmbi0gdXBkYXRlLWtleWVkLWF2ZwotICBbYW1hcCBrZXkgdmFsXQotICAoYXNzb2MgYW1hcCBrZXkgKHVwZGF0ZS1hdmcgKGdldCBhbWFwIGtleSkgdmFsKSkpCi0KLShkZWZuLSBtZXJnZS1rZXllZC1hdmcgWyYgdmFsc10KLSAgKGFwcGx5IG1lcmdlLXdpdGggbWVyZ2UtYXZnIHZhbHMpKQotCi0oZGVmbi0gZXh0cmFjdC1rZXllZC1hdmcgW3ZhbHNdCi0gIChtYXAtdmFsIGV4dHJhY3QtYXZnIHZhbHMpKQotCi0oZGVmbi0gY291bnRlci1leHRyYWN0IFt2XQotICAoaWYgdiB2IHt9KSkKLQotKGRlZm4ga2V5ZWQtY291bnRlci1yb2xsaW5nLXdpbmRvdy1zZXQKLSAgW251bS1idWNrZXRzICYgYnVja2V0LXNpemVzXQotICAoYXBwbHkgcm9sbGluZy13aW5kb3ctc2V0IGluY3ItdmFsIChwYXJ0aWFsIG1lcmdlLXdpdGggKykgY291bnRlci1leHRyYWN0IG51bS1idWNrZXRzIGJ1Y2tldC1zaXplcykpCi0KLShkZWZuIGF2Zy1yb2xsaW5nLXdpbmRvdy1zZXQKLSAgW251bS1idWNrZXRzICYgYnVja2V0LXNpemVzXQotICAoYXBwbHkgcm9sbGluZy13aW5kb3ctc2V0IHVwZGF0ZS1hdmcgbWVyZ2UtYXZnIGV4dHJhY3QtYXZnIG51bS1idWNrZXRzIGJ1Y2tldC1zaXplcykpCi0KLShkZWZuIGtleWVkLWF2Zy1yb2xsaW5nLXdpbmRvdy1zZXQKLSAgW251bS1idWNrZXRzICYgYnVja2V0LXNpemVzXQotICAoYXBwbHkgcm9sbGluZy13aW5kb3ctc2V0IHVwZGF0ZS1rZXllZC1hdmcgbWVyZ2Uta2V5ZWQtYXZnIGV4dHJhY3Qta2V5ZWQtYXZnIG51bS1idWNrZXRzIGJ1Y2tldC1zaXplcykpCi0KLTs7IChkZWZuIGNob29zZS1idWNrZXQgW3ZhbCBidWNrZXRzXQotOzsgICAobGV0IFtyZXQgKGZpbmQtZmlyc3QgIyg8PSB2YWwgJSkgYnVja2V0cyldCi07OyAgICAgKGlmIHJldAotOzsgICAgICAgcmV0Ci07OyAgICAgICAoKiAxMCAoZmlyc3QgYnVja2V0cykpKQotOzsgICAgICkpCi0KLTs7IDs7IGJ1Y2tldHMgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDkKLTs7IChkZWZuIHRvLXByb3BvcnRpb25hbC1idWNrZXQKLTs7ICAgIk1hcHMgdG8gYSBidWNrZXQgaW4gdGhlIHZhbHVlcyBvcmRlciBvZiBtYWduaXR1ZGUuIFNvIGlmIGJ1Y2tldHMgYXJlIFsxIDIgNV0sCi07OyAgICAzIC0+IDUKLTs7ICAgIDcgLT4gMTAKLTs7ICAgIDEyMzQgLT4gMjAwMAotOzsgICAgZXRjLiIKLTs7ICAgW3ZhbCBidWNrZXRzXQotOzsgICAoY29uZCAoPSAwIHZhbCkgMAotOzsgICAgICAgICAoYmV0d2Vlbj8gdmFsIDEgOSkgKGNob29zZS1idWNrZXQgdmFsIGJ1Y2tldHMpCi07OyAgICAgICAgIDplbHNlICgqIDEwICh0by1wcm9wb3J0aW9uYWwtYnVja2V0IChjZWlsICgvIHZhbCAxMCkpCi07OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1Y2tldHMpKSkpCisoZGVmIFRFTi1NSU4tSU4tU0VDT05EUyAoKiAxMCA2MCkpCiAKIChkZWYgQ09NTU9OLUZJRUxEUyBbOmVtaXR0ZWQgOnRyYW5zZmVycmVkXSkKLShkZWZyZWNvcmQgQ29tbW9uU3RhdHMgW2VtaXR0ZWQgdHJhbnNmZXJyZWQgcmF0ZV0pCisoZGVmcmVjb3JkIENvbW1vblN0YXRzIFteTXVsdGlDb3VudFN0YXRBbmRNZXRyaWMgZW1pdHRlZAorICAgICAgICAgICAgICAgICAgICAgICAgXk11bHRpQ291bnRTdGF0QW5kTWV0cmljIHRyYW5zZmVycmVkCisgICAgICAgICAgICAgICAgICAgICAgICByYXRlXSkKIAogKGRlZiBCT0xULUZJRUxEUyBbOmFja2VkIDpmYWlsZWQgOnByb2Nlc3MtbGF0ZW5jaWVzIDpleGVjdXRlZCA6ZXhlY3V0ZS1sYXRlbmNpZXNdKQogOzthY2tlZCBhbmQgZmFpbGVkIGNvdW50IGluZGl2aWR1YWwgdHVwbGVzCi0oZGVmcmVjb3JkIEJvbHRFeGVjdXRvclN0YXRzIFtjb21tb24gYWNrZWQgZmFpbGVkIHByb2Nlc3MtbGF0ZW5jaWVzIGV4ZWN1dGVkIGV4ZWN1dGUtbGF0ZW5jaWVzXSkKKyhkZWZyZWNvcmQgQm9sdEV4ZWN1dG9yU3RhdHMgW15Db21tb25TdGF0cyBjb21tb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5NdWx0aUNvdW50U3RhdEFuZE1ldHJpYyBhY2tlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXk11bHRpQ291bnRTdGF0QW5kTWV0cmljIGZhaWxlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXk11bHRpTGF0ZW5jeVN0YXRBbmRNZXRyaWMgcHJvY2Vzcy1sYXRlbmNpZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5NdWx0aUNvdW50U3RhdEFuZE1ldHJpYyBleGVjdXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXk11bHRpTGF0ZW5jeVN0YXRBbmRNZXRyaWMgZXhlY3V0ZS1sYXRlbmNpZXNdKQogCiAoZGVmIFNQT1VULUZJRUxEUyBbOmFja2VkIDpmYWlsZWQgOmNvbXBsZXRlLWxhdGVuY2llc10pCiA7O2Fja2VkIGFuZCBmYWlsZWQgY291bnQgdHVwbGUgY29tcGxldGlvbgotKGRlZnJlY29yZCBTcG91dEV4ZWN1dG9yU3RhdHMgW2NvbW1vbiBhY2tlZCBmYWlsZWQgY29tcGxldGUtbGF0ZW5jaWVzXSkKKyhkZWZyZWNvcmQgU3BvdXRFeGVjdXRvclN0YXRzIFteQ29tbW9uU3RhdHMgY29tbW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXk11bHRpQ291bnRTdGF0QW5kTWV0cmljIGFja2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXk11bHRpQ291bnRTdGF0QW5kTWV0cmljIGZhaWxlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5NdWx0aUxhdGVuY3lTdGF0QW5kTWV0cmljIGNvbXBsZXRlLWxhdGVuY2llc10pCiAKIChkZWYgTlVNLVNUQVQtQlVDS0VUUyAyMCkKLTs7IDEwIG1pbnV0ZXMsIDMgaG91cnMsIDEgZGF5Ci0oZGVmIFNUQVQtQlVDS0VUUyBbMzAgNTQwIDQzMjBdKQogCiAoZGVmbi0gbWstY29tbW9uLXN0YXRzCiAgIFtyYXRlXQogICAoQ29tbW9uU3RhdHMuCi0gICAgKGF0b20gKGFwcGx5IGtleWVkLWNvdW50ZXItcm9sbGluZy13aW5kb3ctc2V0IE5VTS1TVEFULUJVQ0tFVFMgU1RBVC1CVUNLRVRTKSkKLSAgICAoYXRvbSAoYXBwbHkga2V5ZWQtY291bnRlci1yb2xsaW5nLXdpbmRvdy1zZXQgTlVNLVNUQVQtQlVDS0VUUyBTVEFULUJVQ0tFVFMpKQorICAgIChNdWx0aUNvdW50U3RhdEFuZE1ldHJpYy4gTlVNLVNUQVQtQlVDS0VUUykKKyAgICAoTXVsdGlDb3VudFN0YXRBbmRNZXRyaWMuIE5VTS1TVEFULUJVQ0tFVFMpCiAgICAgcmF0ZSkpCiAKIChkZWZuIG1rLWJvbHQtc3RhdHMKICAgW3JhdGVdCiAgIChCb2x0RXhlY3V0b3JTdGF0cy4KICAgICAobWstY29tbW9uLXN0YXRzIHJhdGUpCi0gICAgKGF0b20gKGFwcGx5IGtleWVkLWNvdW50ZXItcm9sbGluZy13aW5kb3ctc2V0IE5VTS1TVEFULUJVQ0tFVFMgU1RBVC1CVUNLRVRTKSkKLSAgICAoYXRvbSAoYXBwbHkga2V5ZWQtY291bnRlci1yb2xsaW5nLXdpbmRvdy1zZXQgTlVNLVNUQVQtQlVDS0VUUyBTVEFULUJVQ0tFVFMpKQotICAgIChhdG9tIChhcHBseSBrZXllZC1hdmctcm9sbGluZy13aW5kb3ctc2V0IE5VTS1TVEFULUJVQ0tFVFMgU1RBVC1CVUNLRVRTKSkKLSAgICAoYXRvbSAoYXBwbHkga2V5ZWQtY291bnRlci1yb2xsaW5nLXdpbmRvdy1zZXQgTlVNLVNUQVQtQlVDS0VUUyBTVEFULUJVQ0tFVFMpKQotICAgIChhdG9tIChhcHBseSBrZXllZC1hdmctcm9sbGluZy13aW5kb3ctc2V0IE5VTS1TVEFULUJVQ0tFVFMgU1RBVC1CVUNLRVRTKSkpKQorICAgIChNdWx0aUNvdW50U3RhdEFuZE1ldHJpYy4gTlVNLVNUQVQtQlVDS0VUUykKKyAgICAoTXVsdGlDb3VudFN0YXRBbmRNZXRyaWMuIE5VTS1TVEFULUJVQ0tFVFMpCisgICAgKE11bHRpTGF0ZW5jeVN0YXRBbmRNZXRyaWMuIE5VTS1TVEFULUJVQ0tFVFMpCisgICAgKE11bHRpQ291bnRTdGF0QW5kTWV0cmljLiBOVU0tU1RBVC1CVUNLRVRTKQorICAgIChNdWx0aUxhdGVuY3lTdGF0QW5kTWV0cmljLiBOVU0tU1RBVC1CVUNLRVRTKSkpCiAKIChkZWZuIG1rLXNwb3V0LXN0YXRzCiAgIFtyYXRlXQogICAoU3BvdXRFeGVjdXRvclN0YXRzLgogICAgIChtay1jb21tb24tc3RhdHMgcmF0ZSkKLSAgICAoYXRvbSAoYXBwbHkga2V5ZWQtY291bnRlci1yb2xsaW5nLXdpbmRvdy1zZXQgTlVNLVNUQVQtQlVDS0VUUyBTVEFULUJVQ0tFVFMpKQotICAgIChhdG9tIChhcHBseSBrZXllZC1jb3VudGVyLXJvbGxpbmctd2luZG93LXNldCBOVU0tU1RBVC1CVUNLRVRTIFNUQVQtQlVDS0VUUykpCi0gICAgKGF0b20gKGFwcGx5IGtleWVkLWF2Zy1yb2xsaW5nLXdpbmRvdy1zZXQgTlVNLVNUQVQtQlVDS0VUUyBTVEFULUJVQ0tFVFMpKSkpCi0KLShkZWZtYWNybyB1cGRhdGUtZXhlY3V0b3Itc3RhdCEKLSAgW3N0YXRzIHBhdGggJiBhcmdzXQotICAobGV0IFtwYXRoIChjb2xsZWN0aWZ5IHBhdGgpXQotICAgIGAoc3dhcCEgKC0+IH5zdGF0cyB+QHBhdGgpIHVwZGF0ZS1yb2xsaW5nLXdpbmRvdy1zZXQgfkBhcmdzKSkpCisgICAgKE11bHRpQ291bnRTdGF0QW5kTWV0cmljLiBOVU0tU1RBVC1CVUNLRVRTKQorICAgIChNdWx0aUNvdW50U3RhdEFuZE1ldHJpYy4gTlVNLVNUQVQtQlVDS0VUUykKKyAgICAoTXVsdGlMYXRlbmN5U3RhdEFuZE1ldHJpYy4gTlVNLVNUQVQtQlVDS0VUUykpKQogCiAoZGVmbWFjcm8gc3RhdHMtcmF0ZQogICBbc3RhdHNdCiAgIGAoLT4gfnN0YXRzIDpjb21tb24gOnJhdGUpKQogCisoZGVmbWFjcm8gc3RhdHMtZW1pdHRlZAorICBbc3RhdHNdCisgIGAoLT4gfnN0YXRzIDpjb21tb24gOmVtaXR0ZWQpKQorCisoZGVmbWFjcm8gc3RhdHMtdHJhbnNmZXJyZWQKKyAgW3N0YXRzXQorICBgKC0+IH5zdGF0cyA6Y29tbW9uIDp0cmFuc2ZlcnJlZCkpCisKKyhkZWZtYWNybyBzdGF0cy1leGVjdXRlZAorICBbc3RhdHNdCisgIGAoOmV4ZWN1dGVkIH5zdGF0cykpCisKKyhkZWZtYWNybyBzdGF0cy1hY2tlZAorICBbc3RhdHNdCisgIGAoOmFja2VkIH5zdGF0cykpCisKKyhkZWZtYWNybyBzdGF0cy1mYWlsZWQKKyAgW3N0YXRzXQorICBgKDpmYWlsZWQgfnN0YXRzKSkKKworKGRlZm1hY3JvIHN0YXRzLWV4ZWN1dGUtbGF0ZW5jaWVzCisgIFtzdGF0c10KKyAgYCg6ZXhlY3V0ZS1sYXRlbmNpZXMgfnN0YXRzKSkKKworKGRlZm1hY3JvIHN0YXRzLXByb2Nlc3MtbGF0ZW5jaWVzCisgIFtzdGF0c10KKyAgYCg6cHJvY2Vzcy1sYXRlbmNpZXMgfnN0YXRzKSkKKworKGRlZm1hY3JvIHN0YXRzLWNvbXBsZXRlLWxhdGVuY2llcworICBbc3RhdHNdCisgIGAoOmNvbXBsZXRlLWxhdGVuY2llcyB+c3RhdHMpKQorCiAoZGVmbiBlbWl0dGVkLXR1cGxlIQogICBbc3RhdHMgc3RyZWFtXQotICAodXBkYXRlLWV4ZWN1dG9yLXN0YXQhIHN0YXRzIFs6Y29tbW9uIDplbWl0dGVkXSBzdHJlYW0gKHN0YXRzLXJhdGUgc3RhdHMpKSkKKyAgKC5pbmNCeSBeTXVsdGlDb3VudFN0YXRBbmRNZXRyaWMgKHN0YXRzLWVtaXR0ZWQgc3RhdHMpIF5PYmplY3Qgc3RyZWFtIF5sb25nIChzdGF0cy1yYXRlIHN0YXRzKSkpCiAKIChkZWZuIHRyYW5zZmVycmVkLXR1cGxlcyEKICAgW3N0YXRzIHN0cmVhbSBhbXRdCi0gICh1cGRhdGUtZXhlY3V0b3Itc3RhdCEgc3RhdHMgWzpjb21tb24gOnRyYW5zZmVycmVkXSBzdHJlYW0gKCogKHN0YXRzLXJhdGUgc3RhdHMpIGFtdCkpKQorICAoLmluY0J5IF5NdWx0aUNvdW50U3RhdEFuZE1ldHJpYyAoc3RhdHMtdHJhbnNmZXJyZWQgc3RhdHMpIF5PYmplY3Qgc3RyZWFtIF5sb25nICgqIChzdGF0cy1yYXRlIHN0YXRzKSBhbXQpKSkKIAogKGRlZm4gYm9sdC1leGVjdXRlLXR1cGxlIQogICBbXkJvbHRFeGVjdXRvclN0YXRzIHN0YXRzIGNvbXBvbmVudCBzdHJlYW0gbGF0ZW5jeS1tc10KLSAgKGxldCBba2V5IFtjb21wb25lbnQgc3RyZWFtXV0KLSAgICAodXBkYXRlLWV4ZWN1dG9yLXN0YXQhIHN0YXRzIDpleGVjdXRlZCBrZXkgKHN0YXRzLXJhdGUgc3RhdHMpKQotICAgICh1cGRhdGUtZXhlY3V0b3Itc3RhdCEgc3RhdHMgOmV4ZWN1dGUtbGF0ZW5jaWVzIGtleSBsYXRlbmN5LW1zKSkpCisgIChsZXQgW2tleSBbY29tcG9uZW50IHN0cmVhbV0KKyAgICAgICAgXk11bHRpQ291bnRTdGF0QW5kTWV0cmljIGV4ZWN1dGVkIChzdGF0cy1leGVjdXRlZCBzdGF0cykKKyAgICAgICAgXk11bHRpTGF0ZW5jeVN0YXRBbmRNZXRyaWMgZXhlYy1sYXQgKHN0YXRzLWV4ZWN1dGUtbGF0ZW5jaWVzIHN0YXRzKV0KKyAgICAoLmluY0J5IGV4ZWN1dGVkIGtleSAoc3RhdHMtcmF0ZSBzdGF0cykpCisgICAgKC5yZWNvcmQgZXhlYy1sYXQga2V5IGxhdGVuY3ktbXMpKSkKIAogKGRlZm4gYm9sdC1hY2tlZC10dXBsZSEKICAgW15Cb2x0RXhlY3V0b3JTdGF0cyBzdGF0cyBjb21wb25lbnQgc3RyZWFtIGxhdGVuY3ktbXNdCi0gIChsZXQgW2tleSBbY29tcG9uZW50IHN0cmVhbV1dCi0gICAgKHVwZGF0ZS1leGVjdXRvci1zdGF0ISBzdGF0cyA6YWNrZWQga2V5IChzdGF0cy1yYXRlIHN0YXRzKSkKLSAgICAodXBkYXRlLWV4ZWN1dG9yLXN0YXQhIHN0YXRzIDpwcm9jZXNzLWxhdGVuY2llcyBrZXkgbGF0ZW5jeS1tcykpKQorICAobGV0IFtrZXkgW2NvbXBvbmVudCBzdHJlYW1dCisgICAgICAgIF5NdWx0aUNvdW50U3RhdEFuZE1ldHJpYyBhY2tlZCAoc3RhdHMtYWNrZWQgc3RhdHMpCisgICAgICAgIF5NdWx0aUxhdGVuY3lTdGF0QW5kTWV0cmljIHByb2Nlc3MtbGF0IChzdGF0cy1wcm9jZXNzLWxhdGVuY2llcyBzdGF0cyldCisgICAgKC5pbmNCeSBhY2tlZCBrZXkgKHN0YXRzLXJhdGUgc3RhdHMpKQorICAgICgucmVjb3JkIHByb2Nlc3MtbGF0IGtleSBsYXRlbmN5LW1zKSkpCiAKIChkZWZuIGJvbHQtZmFpbGVkLXR1cGxlIQogICBbXkJvbHRFeGVjdXRvclN0YXRzIHN0YXRzIGNvbXBvbmVudCBzdHJlYW0gbGF0ZW5jeS1tc10KLSAgKGxldCBba2V5IFtjb21wb25lbnQgc3RyZWFtXV0KLSAgICAodXBkYXRlLWV4ZWN1dG9yLXN0YXQhIHN0YXRzIDpmYWlsZWQga2V5IChzdGF0cy1yYXRlIHN0YXRzKSkpKQorICAobGV0IFtrZXkgW2NvbXBvbmVudCBzdHJlYW1dCisgICAgICAgIF5NdWx0aUNvdW50U3RhdEFuZE1ldHJpYyBmYWlsZWQgKHN0YXRzLWZhaWxlZCBzdGF0cyldCisgICAgKC5pbmNCeSBmYWlsZWQga2V5IChzdGF0cy1yYXRlIHN0YXRzKSkpKQogCiAoZGVmbiBzcG91dC1hY2tlZC10dXBsZSEKICAgW15TcG91dEV4ZWN1dG9yU3RhdHMgc3RhdHMgc3RyZWFtIGxhdGVuY3ktbXNdCi0gICh1cGRhdGUtZXhlY3V0b3Itc3RhdCEgc3RhdHMgOmFja2VkIHN0cmVhbSAoc3RhdHMtcmF0ZSBzdGF0cykpCi0gICh1cGRhdGUtZXhlY3V0b3Itc3RhdCEgc3RhdHMgOmNvbXBsZXRlLWxhdGVuY2llcyBzdHJlYW0gbGF0ZW5jeS1tcykpCisgICguaW5jQnkgXk11bHRpQ291bnRTdGF0QW5kTWV0cmljIChzdGF0cy1hY2tlZCBzdGF0cykgc3RyZWFtIChzdGF0cy1yYXRlIHN0YXRzKSkKKyAgKC5yZWNvcmQgXk11bHRpTGF0ZW5jeVN0YXRBbmRNZXRyaWMgKHN0YXRzLWNvbXBsZXRlLWxhdGVuY2llcyBzdGF0cykgc3RyZWFtIGxhdGVuY3ktbXMpKQogCiAoZGVmbiBzcG91dC1mYWlsZWQtdHVwbGUhCiAgIFteU3BvdXRFeGVjdXRvclN0YXRzIHN0YXRzIHN0cmVhbSBsYXRlbmN5LW1zXQotICAodXBkYXRlLWV4ZWN1dG9yLXN0YXQhIHN0YXRzIDpmYWlsZWQgc3RyZWFtIChzdGF0cy1yYXRlIHN0YXRzKSkKLSAgKQorICAoLmluY0J5IF5NdWx0aUNvdW50U3RhdEFuZE1ldHJpYyAoc3RhdHMtZmFpbGVkIHN0YXRzKSBzdHJlYW0gKHN0YXRzLXJhdGUgc3RhdHMpKSkKIAogKGRlZm4tIGNsZWFudXAtc3RhdCEgW3N0YXRdCi0gIChzd2FwISBzdGF0IGNsZWFudXAtcm9sbGluZy13aW5kb3ctc2V0KSkKKyAgKC5jbG9zZSBzdGF0KSkKIAogKGRlZm4tIGNsZWFudXAtY29tbW9uLXN0YXRzIQogICBbXkNvbW1vblN0YXRzIHN0YXRzXQpAQCAtMjY4LDcgKzE3Niw5IEBACiAoZGVmbi0gdmFsdWUtc3RhdHMKICAgW3N0YXRzIGZpZWxkc10KICAgKGludG8ge30gKGRvZm9yIFtmIGZpZWxkc10KLSAgICAgICAgICAgICAgICAgIFtmICh2YWx1ZS1yb2xsaW5nLXdpbmRvdy1zZXQgQChmIHN0YXRzKSldKSkpCisgICAgICAgICAgICAgICAgICBbZiAoaWYgKGluc3RhbmNlPyBNdWx0aUNvdW50U3RhdEFuZE1ldHJpYyAoZiBzdGF0cykpCisgICAgICAgICAgICAgICAgICAgICAgICAgKC5nZXRUaW1lQ291bnRzIF5NdWx0aUNvdW50U3RhdEFuZE1ldHJpYyAoZiBzdGF0cykpCisgICAgICAgICAgICAgICAgICAgICAgICAgKC5nZXRUaW1lTGF0QXZnIF5NdWx0aUxhdGVuY3lTdGF0QW5kTWV0cmljIChmIHN0YXRzKSkpXSkpKQogCiAoZGVmbi0gdmFsdWUtY29tbW9uLXN0YXRzCiAgIFteQ29tbW9uU3RhdHMgc3RhdHNdCkBAIC0zMjIsMTYgKzIzMiwxNiBAQAogICBbKC5nZXRfY29tcG9uZW50SWQgZ2xvYmFsLXN0cmVhbS1pZCkgKC5nZXRfc3RyZWFtSWQgZ2xvYmFsLXN0cmVhbS1pZCldKQogCiAoZGVmbWV0aG9kIGNsb2p1cmlmeS1zcGVjaWZpYy1zdGF0cyBCb2x0U3RhdHMgW15Cb2x0U3RhdHMgc3RhdHNdCi0gIFsod2luZG93LXNldC1jb252ZXJ0ZXIgKC5nZXRfYWNrZWQgc3RhdHMpIGZyb20tZ2xvYmFsLXN0cmVhbS1pZCBzeW1ib2wpCi0gICAod2luZG93LXNldC1jb252ZXJ0ZXIgKC5nZXRfZmFpbGVkIHN0YXRzKSBmcm9tLWdsb2JhbC1zdHJlYW0taWQgc3ltYm9sKQotICAgKHdpbmRvdy1zZXQtY29udmVydGVyICguZ2V0X3Byb2Nlc3NfbXNfYXZnIHN0YXRzKSBmcm9tLWdsb2JhbC1zdHJlYW0taWQgc3ltYm9sKQotICAgKHdpbmRvdy1zZXQtY29udmVydGVyICguZ2V0X2V4ZWN1dGVkIHN0YXRzKSBmcm9tLWdsb2JhbC1zdHJlYW0taWQgc3ltYm9sKQotICAgKHdpbmRvdy1zZXQtY29udmVydGVyICguZ2V0X2V4ZWN1dGVfbXNfYXZnIHN0YXRzKSBmcm9tLWdsb2JhbC1zdHJlYW0taWQgc3ltYm9sKV0pCisgIFsod2luZG93LXNldC1jb252ZXJ0ZXIgKC5nZXRfYWNrZWQgc3RhdHMpIGZyb20tZ2xvYmFsLXN0cmVhbS1pZCBpZGVudGl0eSkKKyAgICh3aW5kb3ctc2V0LWNvbnZlcnRlciAoLmdldF9mYWlsZWQgc3RhdHMpIGZyb20tZ2xvYmFsLXN0cmVhbS1pZCBpZGVudGl0eSkKKyAgICh3aW5kb3ctc2V0LWNvbnZlcnRlciAoLmdldF9wcm9jZXNzX21zX2F2ZyBzdGF0cykgZnJvbS1nbG9iYWwtc3RyZWFtLWlkIGlkZW50aXR5KQorICAgKHdpbmRvdy1zZXQtY29udmVydGVyICguZ2V0X2V4ZWN1dGVkIHN0YXRzKSBmcm9tLWdsb2JhbC1zdHJlYW0taWQgaWRlbnRpdHkpCisgICAod2luZG93LXNldC1jb252ZXJ0ZXIgKC5nZXRfZXhlY3V0ZV9tc19hdmcgc3RhdHMpIGZyb20tZ2xvYmFsLXN0cmVhbS1pZCBpZGVudGl0eSldKQogCiAoZGVmbWV0aG9kIGNsb2p1cmlmeS1zcGVjaWZpYy1zdGF0cyBTcG91dFN0YXRzIFteU3BvdXRTdGF0cyBzdGF0c10KLSAgWyh3aW5kb3ctc2V0LWNvbnZlcnRlciAoLmdldF9hY2tlZCBzdGF0cykgc3ltYm9sKQotICAgKHdpbmRvdy1zZXQtY29udmVydGVyICguZ2V0X2ZhaWxlZCBzdGF0cykgc3ltYm9sKQotICAgKHdpbmRvdy1zZXQtY29udmVydGVyICguZ2V0X2NvbXBsZXRlX21zX2F2ZyBzdGF0cykgc3ltYm9sKV0pCisgIFsoLmdldF9hY2tlZCBzdGF0cykKKyAgICguZ2V0X2ZhaWxlZCBzdGF0cykKKyAgICguZ2V0X2NvbXBsZXRlX21zX2F2ZyBzdGF0cyldKQogCiAKIChkZWZuIGNsb2p1cmlmeS1leGVjdXRvci1zdGF0cwpAQCAtMzQwLDcgKzI1MCw5IEBACiAgICAgICAgICBpc19ib2x0PyAoLmlzX3NldF9ib2x0IHNwZWNpZmljLXN0YXRzKQogICAgICAgICAgc3BlY2lmaWMtc3RhdHMgKGlmIGlzX2JvbHQ/ICguZ2V0X2JvbHQgc3BlY2lmaWMtc3RhdHMpICguZ2V0X3Nwb3V0IHNwZWNpZmljLXN0YXRzKSkKICAgICAgICAgIHNwZWNpZmljLXN0YXRzIChjbG9qdXJpZnktc3BlY2lmaWMtc3RhdHMgc3BlY2lmaWMtc3RhdHMpCi0gICAgICAgICBjb21tb24tc3RhdHMgKENvbW1vblN0YXRzLiAod2luZG93LXNldC1jb252ZXJ0ZXIgKC5nZXRfZW1pdHRlZCBzdGF0cykgc3ltYm9sKSAod2luZG93LXNldC1jb252ZXJ0ZXIgKC5nZXRfdHJhbnNmZXJyZWQgc3RhdHMpIHN5bWJvbCkgKC5nZXRfcmF0ZSBzdGF0cykpXQorICAgICAgICAgY29tbW9uLXN0YXRzIChDb21tb25TdGF0cy4gKC5nZXRfZW1pdHRlZCBzdGF0cykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICguZ2V0X3RyYW5zZmVycmVkIHN0YXRzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC5nZXRfcmF0ZSBzdGF0cykpXQogICAgIChpZiBpc19ib2x0PwogICAgICAgOyB3b3JrZXIgaGVhcnQgYmVhdCBkb2VzIG5vdCBzdG9yZSB0aGUgQm9sdEV4ZWN1dG9yU3RhdHMgb3IgU3BvdXRFeGVjdXRvclN0YXRzICwgaW5zdGVhZCBpdCBzdG9yZXMgdGhlIHJlc3VsdCByZXR1cm5lZCBieSByZW5kZXItc3RhdHMhCiAgICAgICA7IHdoaWNoIGZsYXR0ZW5zIHRoZSBCb2x0RXhlY3V0b3JTdGF0cy9TcG91dEV4ZWN1dG9yU3RhdHMgYnkgZXh0cmFjdGluZyB2YWx1ZXMgZnJvbSBhbGwgYXRvbXMgYW5kIG1lcmdpbmcgYWxsIHZhbHVlcyBpbnNpZGUgOmNvbW1vbiB0byB0b3AKQEAgLTM3Myw0ICsyODUsMTIzNyBAQAogICAgIChFeGVjdXRvclN0YXRzLiAod2luZG93LXNldC1jb252ZXJ0ZXIgKDplbWl0dGVkIHN0YXRzKSBzdHIpCiAgICAgICAod2luZG93LXNldC1jb252ZXJ0ZXIgKDp0cmFuc2ZlcnJlZCBzdGF0cykgc3RyKQogICAgICAgc3BlY2lmaWMtc3RhdHMKLSAgICAgIHJhdGUpKSkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisgICAgICByYXRlKSkpCisKKyhkZWZuIHZhbGlkLW51bWJlcj8KKyAgIlJldHVybnMgdHJ1ZSBpZiB4IGlzIGEgbnVtYmVyIHRoYXQgaXMgbm90IE5hTiBvciBJbmZpbml0eSwgZmFsc2Ugb3RoZXJ3aXNlIgorICBbeF0KKyAgKGFuZCAobnVtYmVyPyB4KQorICAgICAgIChub3QgKERvdWJsZS9pc05hTiB4KSkKKyAgICAgICAobm90IChEb3VibGUvaXNJbmZpbml0ZSB4KSkpKQorCisoZGVmbiBhcHBseS1kZWZhdWx0CisgIFtmIGRlZmF1bHRpbmctZm4gJiBhcmdzXQorICAoYXBwbHkgZiAobWFwIGRlZmF1bHRpbmctZm4gYXJncykpKQorCisoZGVmbiBhcHBseS1vci0wCisgIFtmICYgYXJnc10KKyAgKGFwcGx5IGFwcGx5LWRlZmF1bHQKKyAgICAgICAgIGYKKyAgICAgICAgICMoaWYgKHZhbGlkLW51bWJlcj8gJSkgJSAwKQorICAgICAgICAgYXJncykpCisKKyhkZWZuIHN1bS1vci0wCisgIFsmIGFyZ3NdCisgIChhcHBseSBhcHBseS1vci0wICsgYXJncykpCisKKyhkZWZuIHByb2R1Y3Qtb3ItMAorICBbJiBhcmdzXQorICAoYXBwbHkgYXBwbHktb3ItMCAqIGFyZ3MpKQorCisoZGVmbiBtYXgtb3ItMAorICBbJiBhcmdzXQorICAoYXBwbHkgYXBwbHktb3ItMCBtYXggYXJncykpCisKKyhkZWZuLSBhZ2ctYm9sdC1sYXQtYW5kLWNvdW50CisgICJBZ2dyZWdhdGVzIG51bWJlciBleGVjdXRlZCwgcHJvY2VzcyBsYXRlbmN5LCBhbmQgZXhlY3V0ZSBsYXRlbmN5IGFjcm9zcyBhbGwKKyAgc3RyZWFtcy4iCisgIFtpZGstPmV4ZWMtYXZnIGlkay0+cHJvYy1hdmcgaWRrLT5udW0tZXhlY3V0ZWRdCisgIChsZXRmbiBbKHdlaWdodC1hdmcgW1tpZCBhdmddXQorICAgICAgICAgICAgKGxldCBbbnVtLWUgKGdldCBpZGstPm51bS1leGVjdXRlZCBpZCldCisgICAgICAgICAgICAgIChwcm9kdWN0LW9yLTAgYXZnIG51bS1lKSkpXQorICAgIHs6ZXhlY3V0ZUxhdGVuY3lUb3RhbCAoc3VtIChtYXAgd2VpZ2h0LWF2ZyBpZGstPmV4ZWMtYXZnKSkKKyAgICAgOnByb2Nlc3NMYXRlbmN5VG90YWwgKHN1bSAobWFwIHdlaWdodC1hdmcgaWRrLT5wcm9jLWF2ZykpCisgICAgIDpleGVjdXRlZCAoc3VtICh2YWxzIGlkay0+bnVtLWV4ZWN1dGVkKSl9KSkKKworKGRlZm4tIGFnZy1zcG91dC1sYXQtYW5kLWNvdW50CisgICJBZ2dyZWdhdGVzIG51bWJlciBhY2tlZCBhbmQgY29tcGxldGUgbGF0ZW5jaWVzIGFjcm9zcyBhbGwgc3RyZWFtcy4iCisgIFtzaWQtPmNvbXAtYXZnIHNpZC0+bnVtLWFja2VkXQorICAobGV0Zm4gWyh3ZWlnaHQtYXZnIFtbaWQgYXZnXV0KKyAgICAgICAgICAgIChwcm9kdWN0LW9yLTAgYXZnIChnZXQgc2lkLT5udW0tYWNrZWQgaWQpKSldCisgICAgezpjb21wbGV0ZUxhdGVuY3lUb3RhbCAoc3VtIChtYXAgd2VpZ2h0LWF2ZyBzaWQtPmNvbXAtYXZnKSkKKyAgICAgOmFja2VkIChzdW0gKHZhbHMgc2lkLT5udW0tYWNrZWQpKX0pKQorCisoZGVmbiBhZGQtcGFpcnMKKyAgKFtdIFswIDBdKQorICAoW1thMSBhMl0gW2IxIGIyXV0KKyAgIFsoKyBhMSBiMSkgKCsgYTIgYjIpXSkpCisKKyhkZWZuIG1rLWluY2x1ZGUtc3lzLWZuCisgIFtpbmNsdWRlLXN5cz9dCisgIChpZiBpbmNsdWRlLXN5cz8KKyAgICAoZm4gW19dIHRydWUpCisgICAgKGZuIFtzdHJlYW1dIChhbmQgKHN0cmluZz8gc3RyZWFtKSAobm90IChVdGlscy9pc1N5c3RlbUlkIHN0cmVhbSkpKSkpKQorCisoZGVmbiBtay1pbmNsdWRlLXN5cy1maWx0ZXIKKyAgIlJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGluY2x1ZGVzIG9yIGV4Y2x1ZGVzIG1hcCBlbnRyaWVzIHdob3NlIGtleXMgYXJlCisgIHN5c3RlbSBpZHMuIgorICBbaW5jbHVkZS1zeXM/XQorICAoaWYgaW5jbHVkZS1zeXM/CisgICAgaWRlbnRpdHkKKyAgICAocGFydGlhbCBmaWx0ZXIta2V5IChtay1pbmNsdWRlLXN5cy1mbiBmYWxzZSkpKSkKKworKGRlZm4tIGFnZy1ib2x0LXN0cmVhbXMtbGF0LWFuZC1jb3VudAorICAiQWdncmVnYXRlcyBudW1iZXIgZXhlY3V0ZWQgYW5kIHByb2Nlc3MgJiBleGVjdXRlIGxhdGVuY2llcy4iCisgIFtpZGstPmV4ZWMtYXZnIGlkay0+cHJvYy1hdmcgaWRrLT5leGVjdXRlZF0KKyAgKGxldGZuIFsod2VpZ2h0LWF2ZyBbaWQgYXZnXQorICAgICAgICAgICAgKGxldCBbbnVtLWUgKGlkay0+ZXhlY3V0ZWQgaWQpXQorICAgICAgICAgICAgICAocHJvZHVjdC1vci0wIGF2ZyBudW0tZSkpKV0KKyAgICAoaW50byB7fQorICAgICAgKGZvciBbayAoa2V5cyBpZGstPmV4ZWMtYXZnKV0KKyAgICAgICAgW2sgezpleGVjdXRlTGF0ZW5jeVRvdGFsICh3ZWlnaHQtYXZnIGsgKGdldCBpZGstPmV4ZWMtYXZnIGspKQorICAgICAgICAgICAgOnByb2Nlc3NMYXRlbmN5VG90YWwgKHdlaWdodC1hdmcgayAoZ2V0IGlkay0+cHJvYy1hdmcgaykpCisgICAgICAgICAgICA6ZXhlY3V0ZWQgKGlkay0+ZXhlY3V0ZWQgayl9XSkpKSkKKworKGRlZm4tIGFnZy1zcG91dC1zdHJlYW1zLWxhdC1hbmQtY291bnQKKyAgIkFnZ3JlZ2F0ZXMgbnVtYmVyIGFja2VkIGFuZCBjb21wbGV0ZSBsYXRlbmNpZXMuIgorICBbaWRrLT5jb21wLWF2ZyBpZGstPmFja2VkXQorICAobGV0Zm4gWyh3ZWlnaHQtYXZnIFtpZCBhdmddCisgICAgICAgICAgICAobGV0IFtudW0tZSAoZ2V0IGlkay0+YWNrZWQgaWQpXQorICAgICAgICAgICAgICAocHJvZHVjdC1vci0wIGF2ZyBudW0tZSkpKV0KKyAgICAoaW50byB7fQorICAgICAgKGZvciBbayAoa2V5cyBpZGstPmNvbXAtYXZnKV0KKyAgICAgICAgW2sgezpjb21wbGV0ZUxhdGVuY3lUb3RhbCAod2VpZ2h0LWF2ZyBrIChnZXQgaWRrLT5jb21wLWF2ZyBrKSkKKyAgICAgICAgICAgIDphY2tlZCAoZ2V0IGlkay0+YWNrZWQgayl9XSkpKSkKKworKGRlZm4gc3dhcC1tYXAtb3JkZXIKKyAgIkZvciBhIG5lc3RlZCBtYXAsIHJlYXJyYW5nZSBkYXRhIHN1Y2ggdGhhdCB0aGUgdG9wLWxldmVsIGtleXMgYmVjb21lIHRoZQorICBuZXN0ZWQgbWFwJ3Mga2V5cyBhbmQgdmljZSB2ZXJzYS4KKyAgRXhhbXBsZToKKyAgezphIHs6WCA6YmFuYW5hLCA6WSA6cGVhcn0sIDpiIHs6WCA6YXBwbGUsIDpZIDpvcmFuZ2V9fQorICAtPiB7OlkgezphIDpwZWFyLCA6YiA6b3JhbmdlfSwgOlggezphIDpiYW5hbmEsIDpiIDphcHBsZX19IgorICBbbV0KKyAgKGFwcGx5IG1lcmdlLXdpdGgKKyAgICAgICAgIG1lcmdlCisgICAgICAgICAobWFwIChmbiBbW2sgdl1dCisgICAgICAgICAgICAgICAgKGludG8ge30KKyAgICAgICAgICAgICAgICAgICAgICAoZm9yIFtbazIgdjJdIHZdCisgICAgICAgICAgICAgICAgICAgICAgICBbazIge2sgdjJ9XSkpKQorICAgICAgICAgICAgICBtKSkpCisKKyhkZWZuLSBjb21wdXRlLWFnZy1jYXBhY2l0eQorICAiQ29tcHV0ZXMgdGhlIGNhcGFjaXR5IG1ldHJpYyBmb3Igb25lIGV4ZWN1dG9yIGdpdmVuIGl0cyBoZWFydGJlYXQgZGF0YSBhbmQKKyAgdXB0aW1lLiIKKyAgW20gdXB0aW1lXQorICAod2hlbiB1cHRpbWUKKyAgICAoLT4+CisgICAgICA7OyBGb3IgZWFjaCBzdHJlYW0sIGNyZWF0ZSB3ZWlnaHRlZCBhdmVyYWdlcyBhbmQgY291bnRzLgorICAgICAgKG1lcmdlLXdpdGggKGZuIHdlaWdodGVkLWF2Zytjb3VudC1mbgorICAgICAgICAgICAgICAgICAgICBbYXZnIGNudF0KKyAgICAgICAgICAgICAgICAgICAgWygqIGF2ZyBjbnQpIGNudF0pCisgICAgICAgICAgICAgICAgICAoZ2V0ICg6ZXhlY3V0ZS1sYXRlbmNpZXMgbSkgKHN0ciBURU4tTUlOLUlOLVNFQ09ORFMpKQorICAgICAgICAgICAgICAgICAgKGdldCAoOmV4ZWN1dGVkIG0pIChzdHIgVEVOLU1JTi1JTi1TRUNPTkRTKSkpCisgICAgICB2YWxzIDs7IElnbm9yZSB0aGUgc3RyZWFtIGlkcy4KKyAgICAgIChyZWR1Y2UgYWRkLXBhaXJzCisgICAgICAgICAgICAgIFswLiAwXSkgOzsgQ29tYmluZSB3ZWlnaHRlZCBhdmVyYWdlcyBhbmQgY291bnRzLgorICAgICAgKChmbiBbW3dlaWdodGVkLWF2ZyBjbnRdXQorICAgICAgICAoZGl2IHdlaWdodGVkLWF2ZyAoKiAxMDAwIChtaW4gdXB0aW1lIFRFTi1NSU4tSU4tU0VDT05EUykpKSkpKSkpCisKKyhkZWZuIGFnZy1wcmUtbWVyZ2UtY29tcC1wYWdlLWJvbHQKKyAgW3tleGVjLWlkIDpleGVjLWlkCisgICAgaG9zdCA6aG9zdAorICAgIHBvcnQgOnBvcnQKKyAgICB1cHRpbWUgOnVwdGltZQorICAgIGNvbXAtaWQgOmNvbXAtaWQKKyAgICBudW0tdGFza3MgOm51bS10YXNrcworICAgIHN0YXRrLT53LT5zaWQtPm51bSA6c3RhdHN9CisgICB3aW5kb3cKKyAgIGluY2x1ZGUtc3lzP10KKyAgKGxldCBbc3RyLWtleSAocGFydGlhbCBtYXAta2V5IHN0cikKKyAgICAgICAgaGFuZGxlLXN5cy1jb21wb25lbnRzLWZuIChtay1pbmNsdWRlLXN5cy1maWx0ZXIgaW5jbHVkZS1zeXM/KV0KKyAgICB7OmV4ZWN1dG9yLWlkIGV4ZWMtaWQsCisgICAgIDpob3N0IGhvc3QsCisgICAgIDpwb3J0IHBvcnQsCisgICAgIDp1cHRpbWUgdXB0aW1lLAorICAgICA6bnVtLWV4ZWN1dG9ycyAxLAorICAgICA6bnVtLXRhc2tzIG51bS10YXNrcywKKyAgICAgOmNhcGFjaXR5IChjb21wdXRlLWFnZy1jYXBhY2l0eSBzdGF0ay0+dy0+c2lkLT5udW0gdXB0aW1lKQorICAgICA6Y2lkK3NpZC0+aW5wdXQtc3RhdHMKKyAgICAgKG1lcmdlLXdpdGgKKyAgICAgICBtZXJnZQorICAgICAgIChzd2FwLW1hcC1vcmRlcgorICAgICAgICAgezphY2tlZCAoLT4gc3RhdGstPnctPnNpZC0+bnVtCisgICAgICAgICAgICAgICAgICAgICA6YWNrZWQKKyAgICAgICAgICAgICAgICAgICAgIHN0ci1rZXkKKyAgICAgICAgICAgICAgICAgICAgIChnZXQgd2luZG93KSkKKyAgICAgICAgICA6ZmFpbGVkICgtPiBzdGF0ay0+dy0+c2lkLT5udW0KKyAgICAgICAgICAgICAgICAgICAgICA6ZmFpbGVkCisgICAgICAgICAgICAgICAgICAgICAgc3RyLWtleQorICAgICAgICAgICAgICAgICAgICAgIChnZXQgd2luZG93KSl9KQorICAgICAgIChhZ2ctYm9sdC1zdHJlYW1zLWxhdC1hbmQtY291bnQgKC0+IHN0YXRrLT53LT5zaWQtPm51bQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpleGVjdXRlLWxhdGVuY2llcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ci1rZXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2V0IHdpbmRvdykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLT4gc3RhdGstPnctPnNpZC0+bnVtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOnByb2Nlc3MtbGF0ZW5jaWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyLWtleQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnZXQgd2luZG93KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtPiBzdGF0ay0+dy0+c2lkLT5udW0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ZXhlY3V0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIta2V5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdldCB3aW5kb3cpKSkpLAorICAgICA6c2lkLT5vdXRwdXQtc3RhdHMKKyAgICAgKHN3YXAtbWFwLW9yZGVyCisgICAgICAgezplbWl0dGVkICgtPiBzdGF0ay0+dy0+c2lkLT5udW0KKyAgICAgICAgICAgICAgICAgICAgIDplbWl0dGVkCisgICAgICAgICAgICAgICAgICAgICBzdHIta2V5CisgICAgICAgICAgICAgICAgICAgICAoZ2V0IHdpbmRvdykKKyAgICAgICAgICAgICAgICAgICAgIGhhbmRsZS1zeXMtY29tcG9uZW50cy1mbikKKyAgICAgICAgOnRyYW5zZmVycmVkICgtPiBzdGF0ay0+dy0+c2lkLT5udW0KKyAgICAgICAgICAgICAgICAgICAgICAgICA6dHJhbnNmZXJyZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHIta2V5CisgICAgICAgICAgICAgICAgICAgICAgICAgKGdldCB3aW5kb3cpCisgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLXN5cy1jb21wb25lbnRzLWZuKX0pfSkpCisKKyhkZWZuIGFnZy1wcmUtbWVyZ2UtY29tcC1wYWdlLXNwb3V0CisgIFt7ZXhlYy1pZCA6ZXhlYy1pZAorICAgIGhvc3QgOmhvc3QKKyAgICBwb3J0IDpwb3J0CisgICAgdXB0aW1lIDp1cHRpbWUKKyAgICBjb21wLWlkIDpjb21wLWlkCisgICAgbnVtLXRhc2tzIDpudW0tdGFza3MKKyAgICBzdGF0ay0+dy0+c2lkLT5udW0gOnN0YXRzfQorICAgd2luZG93CisgICBpbmNsdWRlLXN5cz9dCisgIChsZXQgW3N0ci1rZXkgKHBhcnRpYWwgbWFwLWtleSBzdHIpCisgICAgICAgIGhhbmRsZS1zeXMtY29tcG9uZW50cy1mbiAobWstaW5jbHVkZS1zeXMtZmlsdGVyIGluY2x1ZGUtc3lzPyldCisgICAgezpleGVjdXRvci1pZCBleGVjLWlkLAorICAgICA6aG9zdCBob3N0LAorICAgICA6cG9ydCBwb3J0LAorICAgICA6dXB0aW1lIHVwdGltZSwKKyAgICAgOm51bS1leGVjdXRvcnMgMSwKKyAgICAgOm51bS10YXNrcyBudW0tdGFza3MsCisgICAgIDpzaWQtPm91dHB1dC1zdGF0cworICAgICAobWVyZ2Utd2l0aAorICAgICAgIG1lcmdlCisgICAgICAgKGFnZy1zcG91dC1zdHJlYW1zLWxhdC1hbmQtY291bnQgKC0+IHN0YXRrLT53LT5zaWQtPm51bQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Y29tcGxldGUtbGF0ZW5jaWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ci1rZXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdldCB3aW5kb3cpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtPiBzdGF0ay0+dy0+c2lkLT5udW0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmFja2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ci1rZXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdldCB3aW5kb3cpKSkKKyAgICAgICAoc3dhcC1tYXAtb3JkZXIKKyAgICAgICAgIHs6YWNrZWQgKC0+IHN0YXRrLT53LT5zaWQtPm51bQorICAgICAgICAgICAgICAgICAgICAgOmFja2VkCisgICAgICAgICAgICAgICAgICAgICBzdHIta2V5CisgICAgICAgICAgICAgICAgICAgICAoZ2V0IHdpbmRvdykpCisgICAgICAgICAgOmZhaWxlZCAoLT4gc3RhdGstPnctPnNpZC0+bnVtCisgICAgICAgICAgICAgICAgICAgICAgOmZhaWxlZAorICAgICAgICAgICAgICAgICAgICAgIHN0ci1rZXkKKyAgICAgICAgICAgICAgICAgICAgICAoZ2V0IHdpbmRvdykpCisgICAgICAgICAgOmVtaXR0ZWQgKC0+IHN0YXRrLT53LT5zaWQtPm51bQorICAgICAgICAgICAgICAgICAgICAgICA6ZW1pdHRlZAorICAgICAgICAgICAgICAgICAgICAgICBzdHIta2V5CisgICAgICAgICAgICAgICAgICAgICAgIChnZXQgd2luZG93KQorICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGUtc3lzLWNvbXBvbmVudHMtZm4pCisgICAgICAgICAgOnRyYW5zZmVycmVkICgtPiBzdGF0ay0+dy0+c2lkLT5udW0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDp0cmFuc2ZlcnJlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyLWtleQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdldCB3aW5kb3cpCisgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGUtc3lzLWNvbXBvbmVudHMtZm4pfSkpfSkpCisKKyhkZWZuIGFnZy1wcmUtbWVyZ2UtdG9wby1wYWdlLWJvbHQKKyAgW3tjb21wLWlkIDpjb21wLWlkCisgICAgbnVtLXRhc2tzIDpudW0tdGFza3MKKyAgICBzdGF0ay0+dy0+c2lkLT5udW0gOnN0YXRzCisgICAgdXB0aW1lIDp1cHRpbWV9CisgICB3aW5kb3cKKyAgIGluY2x1ZGUtc3lzP10KKyAgKGxldCBbc3RyLWtleSAocGFydGlhbCBtYXAta2V5IHN0cikKKyAgICAgICAgaGFuZGxlLXN5cy1jb21wb25lbnRzLWZuIChtay1pbmNsdWRlLXN5cy1maWx0ZXIgaW5jbHVkZS1zeXM/KV0KKyAgICB7Y29tcC1pZAorICAgICAobWVyZ2UKKyAgICAgICAoYWdnLWJvbHQtbGF0LWFuZC1jb3VudCAoLT4gc3RhdGstPnctPnNpZC0+bnVtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpleGVjdXRlLWxhdGVuY2llcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIta2V5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnZXQgd2luZG93KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLT4gc3RhdGstPnctPnNpZC0+bnVtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpwcm9jZXNzLWxhdGVuY2llcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIta2V5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnZXQgd2luZG93KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLT4gc3RhdGstPnctPnNpZC0+bnVtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpleGVjdXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIta2V5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnZXQgd2luZG93KSkpCisgICAgICAgezpudW0tZXhlY3V0b3JzIDEKKyAgICAgICAgOm51bS10YXNrcyBudW0tdGFza3MKKyAgICAgICAgOmVtaXR0ZWQgKC0+IHN0YXRrLT53LT5zaWQtPm51bQorICAgICAgICAgICAgICAgICAgICAgOmVtaXR0ZWQKKyAgICAgICAgICAgICAgICAgICAgIHN0ci1rZXkKKyAgICAgICAgICAgICAgICAgICAgIChnZXQgd2luZG93KQorICAgICAgICAgICAgICAgICAgICAgaGFuZGxlLXN5cy1jb21wb25lbnRzLWZuCisgICAgICAgICAgICAgICAgICAgICB2YWxzCisgICAgICAgICAgICAgICAgICAgICBzdW0pCisgICAgICAgIDp0cmFuc2ZlcnJlZCAoLT4gc3RhdGstPnctPnNpZC0+bnVtCisgICAgICAgICAgICAgICAgICAgICAgICAgOnRyYW5zZmVycmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RyLWtleQorICAgICAgICAgICAgICAgICAgICAgICAgIChnZXQgd2luZG93KQorICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZS1zeXMtY29tcG9uZW50cy1mbgorICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHMKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdW0pCisgICAgICAgIDpjYXBhY2l0eSAoY29tcHV0ZS1hZ2ctY2FwYWNpdHkgc3RhdGstPnctPnNpZC0+bnVtIHVwdGltZSkKKyAgICAgICAgOmFja2VkICgtPiBzdGF0ay0+dy0+c2lkLT5udW0KKyAgICAgICAgICAgICAgICAgICA6YWNrZWQKKyAgICAgICAgICAgICAgICAgICBzdHIta2V5CisgICAgICAgICAgICAgICAgICAgKGdldCB3aW5kb3cpCisgICAgICAgICAgICAgICAgICAgdmFscworICAgICAgICAgICAgICAgICAgIHN1bSkKKyAgICAgICAgOmZhaWxlZCAoLT4gc3RhdGstPnctPnNpZC0+bnVtCisgICAgICAgICAgICAgICAgICAgIDpmYWlsZWQKKyAgICAgICAgICAgICAgICAgICAgc3RyLWtleQorICAgICAgICAgICAgICAgICAgICAoZ2V0IHdpbmRvdykKKyAgICAgICAgICAgICAgICAgICAgdmFscworICAgICAgICAgICAgICAgICAgICBzdW0pfSl9KSkKKworKGRlZm4gYWdnLXByZS1tZXJnZS10b3BvLXBhZ2Utc3BvdXQKKyAgW3tjb21wLWlkIDpjb21wLWlkCisgICAgbnVtLXRhc2tzIDpudW0tdGFza3MKKyAgICBzdGF0ay0+dy0+c2lkLT5udW0gOnN0YXRzfQorICAgd2luZG93CisgICBpbmNsdWRlLXN5cz9dCisgIChsZXQgW3N0ci1rZXkgKHBhcnRpYWwgbWFwLWtleSBzdHIpCisgICAgICAgIGhhbmRsZS1zeXMtY29tcG9uZW50cy1mbiAobWstaW5jbHVkZS1zeXMtZmlsdGVyIGluY2x1ZGUtc3lzPyldCisgICAge2NvbXAtaWQKKyAgICAgKG1lcmdlCisgICAgICAgKGFnZy1zcG91dC1sYXQtYW5kLWNvdW50ICgtPiBzdGF0ay0+dy0+c2lkLT5udW0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpjb21wbGV0ZS1sYXRlbmNpZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ci1rZXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnZXQgd2luZG93KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0+IHN0YXRrLT53LT5zaWQtPm51bQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmFja2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIta2V5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2V0IHdpbmRvdykpKQorICAgICAgIHs6bnVtLWV4ZWN1dG9ycyAxCisgICAgICAgIDpudW0tdGFza3MgbnVtLXRhc2tzCisgICAgICAgIDplbWl0dGVkICgtPiBzdGF0ay0+dy0+c2lkLT5udW0KKyAgICAgICAgICAgICAgICAgICAgIDplbWl0dGVkCisgICAgICAgICAgICAgICAgICAgICBzdHIta2V5CisgICAgICAgICAgICAgICAgICAgICAoZ2V0IHdpbmRvdykKKyAgICAgICAgICAgICAgICAgICAgIGhhbmRsZS1zeXMtY29tcG9uZW50cy1mbgorICAgICAgICAgICAgICAgICAgICAgdmFscworICAgICAgICAgICAgICAgICAgICAgc3VtKQorICAgICAgICA6dHJhbnNmZXJyZWQgKC0+IHN0YXRrLT53LT5zaWQtPm51bQorICAgICAgICAgICAgICAgICAgICAgICAgIDp0cmFuc2ZlcnJlZAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ci1rZXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAoZ2V0IHdpbmRvdykKKyAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGUtc3lzLWNvbXBvbmVudHMtZm4KKyAgICAgICAgICAgICAgICAgICAgICAgICB2YWxzCisgICAgICAgICAgICAgICAgICAgICAgICAgc3VtKQorICAgICAgICA6ZmFpbGVkICgtPiBzdGF0ay0+dy0+c2lkLT5udW0KKyAgICAgICAgICAgICAgICAgICAgOmZhaWxlZAorICAgICAgICAgICAgICAgICAgICBzdHIta2V5CisgICAgICAgICAgICAgICAgICAgIChnZXQgd2luZG93KQorICAgICAgICAgICAgICAgICAgICB2YWxzCisgICAgICAgICAgICAgICAgICAgIHN1bSl9KX0pKQorCisoZGVmbiBtZXJnZS1hZ2ctY29tcC1zdGF0cy1jb21wLXBhZ2UtYm9sdAorICBbe2FjYy1pbiA6Y2lkK3NpZC0+aW5wdXQtc3RhdHMKKyAgICBhY2Mtb3V0IDpzaWQtPm91dHB1dC1zdGF0cworICAgIDphcyBhY2MtYm9sdC1zdGF0c30KKyAgIHtib2x0LWluIDpjaWQrc2lkLT5pbnB1dC1zdGF0cworICAgIGJvbHQtb3V0IDpzaWQtPm91dHB1dC1zdGF0cworICAgIDphcyBib2x0LXN0YXRzfV0KKyAgezpudW0tZXhlY3V0b3JzIChpbmMgKG9yICg6bnVtLWV4ZWN1dG9ycyBhY2MtYm9sdC1zdGF0cykgMCkpLAorICAgOm51bS10YXNrcyAoc3VtLW9yLTAgKDpudW0tdGFza3MgYWNjLWJvbHQtc3RhdHMpICg6bnVtLXRhc2tzIGJvbHQtc3RhdHMpKSwKKyAgIDpzaWQtPm91dHB1dC1zdGF0cyAobWVyZ2Utd2l0aCAocGFydGlhbCBtZXJnZS13aXRoIHN1bS1vci0wKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjYy1vdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2x0LW91dCksCisgICA6Y2lkK3NpZC0+aW5wdXQtc3RhdHMgKG1lcmdlLXdpdGggKHBhcnRpYWwgbWVyZ2Utd2l0aCBzdW0tb3ItMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2MtaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2x0LWluKSwKKyAgIDpleGVjdXRvci1zdGF0cworICAgKGxldCBbc3VtLXN0cmVhbXMgKGZuIFttIGtdICgtPj4gbSB2YWxzIChtYXAgaykgKGFwcGx5IHN1bS1vci0wKSkpCisgICAgICAgICBleGVjdXRlZCAoc3VtLXN0cmVhbXMgYm9sdC1pbiA6ZXhlY3V0ZWQpXQorICAgICAoY29uaiAoOmV4ZWN1dG9yLXN0YXRzIGFjYy1ib2x0LXN0YXRzKQorICAgICAgICAgICAobWVyZ2UKKyAgICAgICAgICAgICAoc2VsZWN0LWtleXMgYm9sdC1zdGF0cworICAgICAgICAgICAgICAgICAgICAgICAgICBbOmV4ZWN1dG9yLWlkIDp1cHRpbWUgOmhvc3QgOnBvcnQgOmNhcGFjaXR5XSkKKyAgICAgICAgICAgICB7OmVtaXR0ZWQgKHN1bS1zdHJlYW1zIGJvbHQtb3V0IDplbWl0dGVkKQorICAgICAgICAgICAgICA6dHJhbnNmZXJyZWQgKHN1bS1zdHJlYW1zIGJvbHQtb3V0IDp0cmFuc2ZlcnJlZCkKKyAgICAgICAgICAgICAgOmFja2VkIChzdW0tc3RyZWFtcyBib2x0LWluIDphY2tlZCkKKyAgICAgICAgICAgICAgOmZhaWxlZCAoc3VtLXN0cmVhbXMgYm9sdC1pbiA6ZmFpbGVkKQorICAgICAgICAgICAgICA6ZXhlY3V0ZWQgZXhlY3V0ZWR9CisgICAgICAgICAgICAgKC0+PgorICAgICAgICAgICAgICAgKGlmIChhbmQgZXhlY3V0ZWQgKHBvcz8gZXhlY3V0ZWQpKQorICAgICAgICAgICAgICAgICBbKGRpdiAoc3VtLXN0cmVhbXMgYm9sdC1pbiA6ZXhlY3V0ZUxhdGVuY3lUb3RhbCkgZXhlY3V0ZWQpCisgICAgICAgICAgICAgICAgICAoZGl2IChzdW0tc3RyZWFtcyBib2x0LWluIDpwcm9jZXNzTGF0ZW5jeVRvdGFsKSBleGVjdXRlZCldCisgICAgICAgICAgICAgICAgIFtuaWwgbmlsXSkKKyAgICAgICAgICAgICAgIChtYXBjYXQgdmVjdG9yIFs6ZXhlY3V0ZS1sYXRlbmN5IDpwcm9jZXNzLWxhdGVuY3ldKQorICAgICAgICAgICAgICAgKGFwcGx5IGFzc29jIHt9KSkpKSl9KQorCisoZGVmbiBtZXJnZS1hZ2ctY29tcC1zdGF0cy1jb21wLXBhZ2Utc3BvdXQKKyAgW3thY2Mtb3V0IDpzaWQtPm91dHB1dC1zdGF0cworICAgIDphcyBhY2Mtc3BvdXQtc3RhdHN9CisgICB7c3BvdXQtb3V0IDpzaWQtPm91dHB1dC1zdGF0cworICAgIDphcyBzcG91dC1zdGF0c31dCisgIHs6bnVtLWV4ZWN1dG9ycyAoaW5jIChvciAoOm51bS1leGVjdXRvcnMgYWNjLXNwb3V0LXN0YXRzKSAwKSksCisgICA6bnVtLXRhc2tzIChzdW0tb3ItMCAoOm51bS10YXNrcyBhY2Mtc3BvdXQtc3RhdHMpICg6bnVtLXRhc2tzIHNwb3V0LXN0YXRzKSksCisgICA6c2lkLT5vdXRwdXQtc3RhdHMgKG1lcmdlLXdpdGggKHBhcnRpYWwgbWVyZ2Utd2l0aCBzdW0tb3ItMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2Mtb3V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BvdXQtb3V0KSwKKyAgIDpleGVjdXRvci1zdGF0cworICAgKGxldCBbc3VtLXN0cmVhbXMgKGZuIFttIGtdICgtPj4gbSB2YWxzIChtYXAgaykgKGFwcGx5IHN1bS1vci0wKSkpCisgICAgICAgICBhY2tlZCAoc3VtLXN0cmVhbXMgc3BvdXQtb3V0IDphY2tlZCldCisgICAgIChjb25qICg6ZXhlY3V0b3Itc3RhdHMgYWNjLXNwb3V0LXN0YXRzKQorICAgICAgICAgICAobWVyZ2UKKyAgICAgICAgICAgICAoc2VsZWN0LWtleXMgc3BvdXQtc3RhdHMgWzpleGVjdXRvci1pZCA6dXB0aW1lIDpob3N0IDpwb3J0XSkKKyAgICAgICAgICAgICB7OmVtaXR0ZWQgKHN1bS1zdHJlYW1zIHNwb3V0LW91dCA6ZW1pdHRlZCkKKyAgICAgICAgICAgICAgOnRyYW5zZmVycmVkIChzdW0tc3RyZWFtcyBzcG91dC1vdXQgOnRyYW5zZmVycmVkKQorICAgICAgICAgICAgICA6YWNrZWQgYWNrZWQKKyAgICAgICAgICAgICAgOmZhaWxlZCAoc3VtLXN0cmVhbXMgc3BvdXQtb3V0IDpmYWlsZWQpfQorICAgICAgICAgICAgIHs6Y29tcGxldGUtbGF0ZW5jeSAoaWYgKGFuZCBhY2tlZCAocG9zPyBhY2tlZCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRpdiAoc3VtLXN0cmVhbXMgc3BvdXQtb3V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmNvbXBsZXRlTGF0ZW5jeVRvdGFsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWNrZWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmlsKX0pKSl9KQorCisoZGVmbiBtZXJnZS1hZ2ctY29tcC1zdGF0cy10b3BvLXBhZ2UtYm9sdAorICBbYWNjLWJvbHQtc3RhdHMgYm9sdC1zdGF0c10KKyAgezpudW0tZXhlY3V0b3JzIChpbmMgKG9yICg6bnVtLWV4ZWN1dG9ycyBhY2MtYm9sdC1zdGF0cykgMCkpCisgICA6bnVtLXRhc2tzIChzdW0tb3ItMCAoOm51bS10YXNrcyBhY2MtYm9sdC1zdGF0cykgKDpudW0tdGFza3MgYm9sdC1zdGF0cykpCisgICA6ZW1pdHRlZCAoc3VtLW9yLTAgKDplbWl0dGVkIGFjYy1ib2x0LXN0YXRzKSAoOmVtaXR0ZWQgYm9sdC1zdGF0cykpCisgICA6dHJhbnNmZXJyZWQgKHN1bS1vci0wICg6dHJhbnNmZXJyZWQgYWNjLWJvbHQtc3RhdHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICg6dHJhbnNmZXJyZWQgYm9sdC1zdGF0cykpCisgICA6Y2FwYWNpdHkgKG1heC1vci0wICg6Y2FwYWNpdHkgYWNjLWJvbHQtc3RhdHMpICg6Y2FwYWNpdHkgYm9sdC1zdGF0cykpCisgICA7OyBXZSBzdW0gYXZlcmFnZSBsYXRlbmN5IHRvdGFscyBoZXJlIHRvIGF2b2lkIGRpdmlkaW5nIGF0IGVhY2ggc3RlcC4KKyAgIDs7IENvbXB1dGUgdGhlIGF2ZXJhZ2UgbGF0ZW5jaWVzIGJ5IGRpdmlkaW5nIHRoZSB0b3RhbCBieSB0aGUgY291bnQuCisgICA6ZXhlY3V0ZUxhdGVuY3lUb3RhbCAoc3VtLW9yLTAgKDpleGVjdXRlTGF0ZW5jeVRvdGFsIGFjYy1ib2x0LXN0YXRzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg6ZXhlY3V0ZUxhdGVuY3lUb3RhbCBib2x0LXN0YXRzKSkKKyAgIDpwcm9jZXNzTGF0ZW5jeVRvdGFsIChzdW0tb3ItMCAoOnByb2Nlc3NMYXRlbmN5VG90YWwgYWNjLWJvbHQtc3RhdHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDpwcm9jZXNzTGF0ZW5jeVRvdGFsIGJvbHQtc3RhdHMpKQorICAgOmV4ZWN1dGVkIChzdW0tb3ItMCAoOmV4ZWN1dGVkIGFjYy1ib2x0LXN0YXRzKSAoOmV4ZWN1dGVkIGJvbHQtc3RhdHMpKQorICAgOmFja2VkIChzdW0tb3ItMCAoOmFja2VkIGFjYy1ib2x0LXN0YXRzKSAoOmFja2VkIGJvbHQtc3RhdHMpKQorICAgOmZhaWxlZCAoc3VtLW9yLTAgKDpmYWlsZWQgYWNjLWJvbHQtc3RhdHMpICg6ZmFpbGVkIGJvbHQtc3RhdHMpKX0pCisKKyhkZWZuIG1lcmdlLWFnZy1jb21wLXN0YXRzLXRvcG8tcGFnZS1zcG91dAorICBbYWNjLXNwb3V0LXN0YXRzIHNwb3V0LXN0YXRzXQorICB7Om51bS1leGVjdXRvcnMgKGluYyAob3IgKDpudW0tZXhlY3V0b3JzIGFjYy1zcG91dC1zdGF0cykgMCkpCisgICA6bnVtLXRhc2tzIChzdW0tb3ItMCAoOm51bS10YXNrcyBhY2Mtc3BvdXQtc3RhdHMpICg6bnVtLXRhc2tzIHNwb3V0LXN0YXRzKSkKKyAgIDplbWl0dGVkIChzdW0tb3ItMCAoOmVtaXR0ZWQgYWNjLXNwb3V0LXN0YXRzKSAoOmVtaXR0ZWQgc3BvdXQtc3RhdHMpKQorICAgOnRyYW5zZmVycmVkIChzdW0tb3ItMCAoOnRyYW5zZmVycmVkIGFjYy1zcG91dC1zdGF0cykgKDp0cmFuc2ZlcnJlZCBzcG91dC1zdGF0cykpCisgICA7OyBXZSBzdW0gYXZlcmFnZSBsYXRlbmN5IHRvdGFscyBoZXJlIHRvIGF2b2lkIGRpdmlkaW5nIGF0IGVhY2ggc3RlcC4KKyAgIDs7IENvbXB1dGUgdGhlIGF2ZXJhZ2UgbGF0ZW5jaWVzIGJ5IGRpdmlkaW5nIHRoZSB0b3RhbCBieSB0aGUgY291bnQuCisgICA6Y29tcGxldGVMYXRlbmN5VG90YWwgKHN1bS1vci0wICg6Y29tcGxldGVMYXRlbmN5VG90YWwgYWNjLXNwb3V0LXN0YXRzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICg6Y29tcGxldGVMYXRlbmN5VG90YWwgc3BvdXQtc3RhdHMpKQorICAgOmFja2VkIChzdW0tb3ItMCAoOmFja2VkIGFjYy1zcG91dC1zdGF0cykgKDphY2tlZCBzcG91dC1zdGF0cykpCisgICA6ZmFpbGVkIChzdW0tb3ItMCAoOmZhaWxlZCBhY2Mtc3BvdXQtc3RhdHMpICg6ZmFpbGVkIHNwb3V0LXN0YXRzKSl9KQorCisoZGVmbiBhZ2dyZWdhdGUtY291bnQtc3RyZWFtcworICBbc3RhdHNdCisgICgtPj4gc3RhdHMKKyAgICAgICAobWFwLXZhbCAjKHJlZHVjZSArICh2YWxzICUpKSkpKQorCisoZGVmbi0gYWdnLXRvcG8tZXhlYy1zdGF0cyoKKyAgIkEgaGVscGVyIGZ1bmN0aW9uIHRoYXQgZG9lcyB0aGUgY29tbW9uIHdvcmsgdG8gYWdncmVnYXRlIHN0YXRzIG9mIG9uZQorICBleGVjdXRvciB3aXRoIHRoZSBnaXZlbiBtYXAgZm9yIHRoZSB0b3BvbG9neSBwYWdlLiIKKyAgW3dpbmRvdworICAgaW5jbHVkZS1zeXM/CisgICB7OmtleXMgW3dvcmtlcnMtc2V0CisgICAgICAgICAgIGJvbHQtaWQtPnN0YXRzCisgICAgICAgICAgIHNwb3V0LWlkLT5zdGF0cworICAgICAgICAgICB3aW5kb3ctPmVtaXR0ZWQKKyAgICAgICAgICAgd2luZG93LT50cmFuc2ZlcnJlZAorICAgICAgICAgICB3aW5kb3ctPmNvbXAtbGF0LXdndC1hdmcKKyAgICAgICAgICAgd2luZG93LT5hY2tlZAorICAgICAgICAgICB3aW5kb3ctPmZhaWxlZF0gOmFzIGFjYy1zdGF0c30KKyAgIHs6a2V5cyBbc3RhdHNdIDphcyBuZXctZGF0YX0KKyAgIHByZS1tZXJnZS1mbgorICAgbWVyZ2UtZm4KKyAgIGNvbXAta2V5XQorICAobGV0IFtjaWQtPnN0YXRrLT5udW0gKHByZS1tZXJnZS1mbiBuZXctZGF0YSB3aW5kb3cgaW5jbHVkZS1zeXM/KQorICAgICAgICB7dy0+Y29tcExhdFdndEF2ZyA6Y29tcGxldGVMYXRlbmN5VG90YWwKKyAgICAgICAgIHctPmFja2VkIDphY2tlZH0KKyAgICAgICAgICAoaWYgKDpjb21wbGV0ZS1sYXRlbmNpZXMgc3RhdHMpCisgICAgICAgICAgICAoc3dhcC1tYXAtb3JkZXIKKyAgICAgICAgICAgICAgKGludG8ge30KKyAgICAgICAgICAgICAgICAgICAgKGZvciBbdyAoa2V5cyAoOmFja2VkIHN0YXRzKSldCisgICAgICAgICAgICAgICAgICAgICAgICAgW3cgKGFnZy1zcG91dC1sYXQtYW5kLWNvdW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2V0ICg6Y29tcGxldGUtbGF0ZW5jaWVzIHN0YXRzKSB3KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdldCAoOmFja2VkIHN0YXRzKSB3KSldKSkpCisgICAgICAgICAgICB7OmNvbXBsZXRlTGF0ZW5jeVRvdGFsIG5pbAorICAgICAgICAgICAgIDphY2tzIChhZ2dyZWdhdGUtY291bnQtc3RyZWFtcyAoOmFja2VkIHN0YXRzKSl9KQorICAgICAgICBoYW5kbGUtc3lzLWNvbXBvbmVudHMtZm4gKG1rLWluY2x1ZGUtc3lzLWZpbHRlciBpbmNsdWRlLXN5cz8pXQorICAgIChhc3NvYyB7OndvcmtlcnMtc2V0IChjb25qIHdvcmtlcnMtc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyg6aG9zdCBuZXctZGF0YSkgKDpwb3J0IG5ldy1kYXRhKV0pCisgICAgICAgICAgICA6Ym9sdC1pZC0+c3RhdHMgYm9sdC1pZC0+c3RhdHMKKyAgICAgICAgICAgIDpzcG91dC1pZC0+c3RhdHMgc3BvdXQtaWQtPnN0YXRzCisgICAgICAgICAgICA6d2luZG93LT5lbWl0dGVkICgtPj4gKDplbWl0dGVkIHN0YXRzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXAtdmFsIGhhbmRsZS1zeXMtY29tcG9uZW50cy1mbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZ2dyZWdhdGUtY291bnQtc3RyZWFtcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtZXJnZS13aXRoICsgd2luZG93LT5lbWl0dGVkKSkKKyAgICAgICAgICAgIDp3aW5kb3ctPnRyYW5zZmVycmVkICgtPj4gKDp0cmFuc2ZlcnJlZCBzdGF0cykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hcC12YWwgaGFuZGxlLXN5cy1jb21wb25lbnRzLWZuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZ2dyZWdhdGUtY291bnQtc3RyZWFtcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWVyZ2Utd2l0aCArIHdpbmRvdy0+dHJhbnNmZXJyZWQpKQorICAgICAgICAgICAgOndpbmRvdy0+Y29tcC1sYXQtd2d0LWF2ZyAobWVyZ2Utd2l0aCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy0+Y29tcC1sYXQtd2d0LWF2ZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3LT5jb21wTGF0V2d0QXZnKQorICAgICAgICAgICAgOndpbmRvdy0+YWNrZWQgKGlmICg9IDpzcG91dCAoOnR5cGUgc3RhdHMpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWVyZ2Utd2l0aCArIHdpbmRvdy0+YWNrZWQgdy0+YWNrZWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy0+YWNrZWQpCisgICAgICAgICAgICA6d2luZG93LT5mYWlsZWQgKGlmICg9IDpzcG91dCAoOnR5cGUgc3RhdHMpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0+PiAoOmZhaWxlZCBzdGF0cykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdncmVnYXRlLWNvdW50LXN0cmVhbXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1lcmdlLXdpdGggKyB3aW5kb3ctPmZhaWxlZCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3ctPmZhaWxlZCl9CisgICAgICAgICAgIGNvbXAta2V5IChtZXJnZS13aXRoIG1lcmdlLWZuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhY2Mtc3RhdHMgY29tcC1rZXkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNpZC0+c3RhdGstPm51bSkKKyAgICAgICAgICAgOnR5cGUgKDp0eXBlIHN0YXRzKSkpKQorCisoZGVmbXVsdGkgYWdnLXRvcG8tZXhlYy1zdGF0cworICAiQ29tYmluZXMgdGhlIGFnZ3JlZ2F0ZSBzdGF0cyBvZiBvbmUgZXhlY3V0b3Igd2l0aCB0aGUgZ2l2ZW4gbWFwLCBzZWxlY3RpbmcKKyAgdGhlIGFwcHJvcHJpYXRlIHdpbmRvdyBhbmQgaW5jbHVkaW5nIHN5c3RlbSBjb21wb25lbnRzIGFzIHNwZWNpZmllZC4iCisgIChmbiBkaXNwYXRjaC1mbiBbJiBhcmdzXSAoOnR5cGUgKGxhc3QgYXJncykpKSkKKworKGRlZm1ldGhvZCBhZ2ctdG9wby1leGVjLXN0YXRzIDpib2x0CisgIFt3aW5kb3cgaW5jbHVkZS1zeXM/IGFjYy1zdGF0cyBuZXctZGF0YV0KKyAgKGFnZy10b3BvLWV4ZWMtc3RhdHMqIHdpbmRvdworICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZS1zeXM/CisgICAgICAgICAgICAgICAgICAgICAgICBhY2Mtc3RhdHMKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldy1kYXRhCisgICAgICAgICAgICAgICAgICAgICAgICBhZ2ctcHJlLW1lcmdlLXRvcG8tcGFnZS1ib2x0CisgICAgICAgICAgICAgICAgICAgICAgICBtZXJnZS1hZ2ctY29tcC1zdGF0cy10b3BvLXBhZ2UtYm9sdAorICAgICAgICAgICAgICAgICAgICAgICAgOmJvbHQtaWQtPnN0YXRzKSkKKworKGRlZm1ldGhvZCBhZ2ctdG9wby1leGVjLXN0YXRzIDpzcG91dAorICBbd2luZG93IGluY2x1ZGUtc3lzPyBhY2Mtc3RhdHMgbmV3LWRhdGFdCisgIChhZ2ctdG9wby1leGVjLXN0YXRzKiB3aW5kb3cKKyAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUtc3lzPworICAgICAgICAgICAgICAgICAgICAgICAgYWNjLXN0YXRzCisgICAgICAgICAgICAgICAgICAgICAgICBuZXctZGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgYWdnLXByZS1tZXJnZS10b3BvLXBhZ2Utc3BvdXQKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lcmdlLWFnZy1jb21wLXN0YXRzLXRvcG8tcGFnZS1zcG91dAorICAgICAgICAgICAgICAgICAgICAgICAgOnNwb3V0LWlkLT5zdGF0cykpCisKKyhkZWZtZXRob2QgYWdnLXRvcG8tZXhlYy1zdGF0cyA6ZGVmYXVsdCBbXyBfIGFjYy1zdGF0cyBfXSBhY2Mtc3RhdHMpCisKKyhkZWZuIGdldC1sYXN0LWVycm9yCisgIFtzdG9ybS1jbHVzdGVyLXN0YXRlIHN0b3JtLWlkIGNvbXBvbmVudC1pZF0KKyAgKGlmLWxldCBbZSAoLmxhc3QtZXJyb3Igc3Rvcm0tY2x1c3Rlci1zdGF0ZSBzdG9ybS1pZCBjb21wb25lbnQtaWQpXQorICAgIChFcnJvckluZm8uICg6ZXJyb3IgZSkgKDp0aW1lLXNlY3MgZSkpKSkKKworKGRlZm4gY29tcG9uZW50LXR5cGUKKyAgIlJldHVybnMgdGhlIGNvbXBvbmVudCB0eXBlIChlaXRoZXIgOmJvbHQgb3IgOnNwb3V0KSBmb3IgYSBnaXZlbgorICB0b3BvbG9neSBhbmQgY29tcG9uZW50IGlkLiBSZXR1cm5zIG5pbCBpZiBub3QgZm91bmQuIgorICBbXlN0b3JtVG9wb2xvZ3kgdG9wb2xvZ3kgaWRdCisgIChsZXQgW2JvbHRzICguZ2V0X2JvbHRzIHRvcG9sb2d5KQorICAgICAgICBzcG91dHMgKC5nZXRfc3BvdXRzIHRvcG9sb2d5KV0KKyAgICAoY29uZAorICAgICAgKFV0aWxzL2lzU3lzdGVtSWQgaWQpIDpib2x0CisgICAgICAoLmNvbnRhaW5zS2V5IGJvbHRzIGlkKSA6Ym9sdAorICAgICAgKC5jb250YWluc0tleSBzcG91dHMgaWQpIDpzcG91dCkpKQorCisoZGVmbiBleHRyYWN0LW5vZGVpbmZvcy1mcm9tLWhiLWZvci1jb21wCisgIChbZXhlYy0+aG9zdCtwb3J0IHRhc2stPmNvbXBvbmVudCBpbmNsdWRlLXN5cz8gY29tcC1pZF0KKyAgIChkaXN0aW5jdCAoZm9yIFtbW3N0YXJ0IGVuZCA6YXMgZXhlY3V0b3JdIFtob3N0IHBvcnRdXSBleGVjLT5ob3N0K3BvcnQKKyAgICAgICAgIDpsZXQgW2lkICh0YXNrLT5jb21wb25lbnQgc3RhcnQpXQorICAgICAgICAgOndoZW4gKGFuZCAob3IgKG5pbD8gY29tcC1pZCkgKD0gY29tcC1pZCBpZCkpCisgICAgICAgICAgICAgICAgIChvciBpbmNsdWRlLXN5cz8gKG5vdCAoVXRpbHMvaXNTeXN0ZW1JZCBpZCkpKSldCisgICAgIHs6aG9zdCBob3N0CisgICAgICA6cG9ydCBwb3J0fSkpKSkKKworKGRlZm4gZXh0cmFjdC1kYXRhLWZyb20taGIKKyAgKFtleGVjLT5ob3N0K3BvcnQgdGFzay0+Y29tcG9uZW50IGJlYXRzIGluY2x1ZGUtc3lzPyB0b3BvbG9neSBjb21wLWlkXQorICAgKGZvciBbW1tzdGFydCBlbmQgOmFzIGV4ZWN1dG9yXSBbaG9zdCBwb3J0XV0gZXhlYy0+aG9zdCtwb3J0CisgICAgICAgICA6bGV0IFtiZWF0IChiZWF0cyBleGVjdXRvcikKKyAgICAgICAgICAgICAgIGlkICh0YXNrLT5jb21wb25lbnQgc3RhcnQpXQorICAgICAgICAgOndoZW4gKGFuZCAob3IgKG5pbD8gY29tcC1pZCkgKD0gY29tcC1pZCBpZCkpCisgICAgICAgICAgICAgICAgICAgIChvciBpbmNsdWRlLXN5cz8gKG5vdCAoVXRpbHMvaXNTeXN0ZW1JZCBpZCkpKSldCisgICAgIHs6ZXhlYy1pZCBleGVjdXRvcgorICAgICAgOmNvbXAtaWQgaWQKKyAgICAgIDpudW0tdGFza3MgKGNvdW50IChyYW5nZSBzdGFydCAoaW5jIGVuZCkpKQorICAgICAgOmhvc3QgaG9zdAorICAgICAgOnBvcnQgcG9ydAorICAgICAgOnVwdGltZSAoOnVwdGltZSBiZWF0KQorICAgICAgOnN0YXRzICg6c3RhdHMgYmVhdCkKKyAgICAgIDp0eXBlIChvciAoOnR5cGUgKDpzdGF0cyBiZWF0KSkKKyAgICAgICAgICAgICAgICAoY29tcG9uZW50LXR5cGUgdG9wb2xvZ3kgaWQpKX0pKQorICAoW2V4ZWMtPmhvc3QrcG9ydCB0YXNrLT5jb21wb25lbnQgYmVhdHMgaW5jbHVkZS1zeXM/IHRvcG9sb2d5XQorICAgIChleHRyYWN0LWRhdGEtZnJvbS1oYiBleGVjLT5ob3N0K3BvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGFzay0+Y29tcG9uZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgIGJlYXRzCisgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUtc3lzPworICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BvbG9neQorICAgICAgICAgICAgICAgICAgICAgICAgICBuaWwpKSkKKworKGRlZm4gYWdncmVnYXRlLXRvcG8tc3RhdHMKKyAgW3dpbmRvdyBpbmNsdWRlLXN5cz8gZGF0YV0KKyAgKGxldCBbaW5pdC12YWwgezp3b3JrZXJzLXNldCAje30KKyAgICAgICAgICAgICAgICAgIDpib2x0LWlkLT5zdGF0cyB7fQorICAgICAgICAgICAgICAgICAgOnNwb3V0LWlkLT5zdGF0cyB7fQorICAgICAgICAgICAgICAgICAgOndpbmRvdy0+ZW1pdHRlZCB7fQorICAgICAgICAgICAgICAgICAgOndpbmRvdy0+dHJhbnNmZXJyZWQge30KKyAgICAgICAgICAgICAgICAgIDp3aW5kb3ctPmNvbXAtbGF0LXdndC1hdmcge30KKyAgICAgICAgICAgICAgICAgIDp3aW5kb3ctPmFja2VkIHt9CisgICAgICAgICAgICAgICAgICA6d2luZG93LT5mYWlsZWQge319CisgICAgICAgIHJlZHVjZXItZm4gKHBhcnRpYWwgYWdnLXRvcG8tZXhlYy1zdGF0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUtc3lzPyldCisgICAgKHJlZHVjZSByZWR1Y2VyLWZuIGluaXQtdmFsIGRhdGEpKSkKKworKGRlZm4tIGNvbXB1dGUtd2VpZ2h0ZWQtYXZlcmFnZXMtcGVyLXdpbmRvdworICBbYWNjLWRhdGEgd2d0LWF2Zy1rZXkgZGl2aXNvci1rZXldCisgIChpbnRvIHt9IChmb3IgW1t3aW5kb3cgd2d0LWF2Z10gKHdndC1hdmcta2V5IGFjYy1kYXRhKQorICAgICAgICAgICAgICAgICA6bGV0IFtkaXZpc29yICgoZGl2aXNvci1rZXkgYWNjLWRhdGEpIHdpbmRvdyldCisgICAgICAgICAgICAgICAgIDp3aGVuIChhbmQgZGl2aXNvciAocG9zPyBkaXZpc29yKSldCisgICAgICAgICAgICAgWyhzdHIgd2luZG93KSAoZGl2IHdndC1hdmcgZGl2aXNvcildKSkpCisKKyhkZWZuLSBwb3N0LWFnZ3JlZ2F0ZS10b3BvLXN0YXRzCisgIFt0YXNrLT5jb21wb25lbnQgZXhlYy0+bm9kZStwb3J0IGxhc3QtZXJyLWZuIGFjYy1kYXRhXQorICB7Om51bS10YXNrcyAoY291bnQgdGFzay0+Y29tcG9uZW50KQorICAgOm51bS13b3JrZXJzIChjb3VudCAoOndvcmtlcnMtc2V0IGFjYy1kYXRhKSkKKyAgIDpudW0tZXhlY3V0b3JzIChjb3VudCBleGVjLT5ub2RlK3BvcnQpCisgICA6Ym9sdC1pZC0+c3RhdHMKKyAgICAgKGludG8ge30gKGZvciBbW2lkIG1dICg6Ym9sdC1pZC0+c3RhdHMgYWNjLWRhdGEpCisgICAgICAgICAgICAgICAgICAgIDpsZXQgW2V4ZWN1dGVkICg6ZXhlY3V0ZWQgbSldXQorICAgICAgICAgICAgICAgICAgICAgW2lkICgtPiBtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhc3NvYyA6ZXhlY3V0ZS1sYXRlbmN5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaWYgKGFuZCBleGVjdXRlZCAocG9zPyBleGVjdXRlZCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkaXYgKG9yICg6ZXhlY3V0ZUxhdGVuY3lUb3RhbCBtKSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOnByb2Nlc3MtbGF0ZW5jeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlmIChhbmQgZXhlY3V0ZWQgKHBvcz8gZXhlY3V0ZWQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGl2IChvciAoOnByb2Nlc3NMYXRlbmN5VG90YWwgbSkgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkaXNzb2MgOmV4ZWN1dGVMYXRlbmN5VG90YWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6cHJvY2Vzc0xhdGVuY3lUb3RhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFzc29jIDpsYXN0RXJyb3IgKGxhc3QtZXJyLWZuIGlkKSkpXSkpCisgICA6c3BvdXQtaWQtPnN0YXRzCisgICAgIChpbnRvIHt9IChmb3IgW1tpZCBtXSAoOnNwb3V0LWlkLT5zdGF0cyBhY2MtZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgOmxldCBbYWNrZWQgKDphY2tlZCBtKV1dCisgICAgICAgICAgICAgICAgICAgIFtpZCAoLT4gbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhc3NvYyA6Y29tcGxldGUtbGF0ZW5jeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaWYgKGFuZCBhY2tlZCAocG9zPyBhY2tlZCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRpdiAoOmNvbXBsZXRlTGF0ZW5jeVRvdGFsIG0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoOmFja2VkIG0pKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkaXNzb2MgOmNvbXBsZXRlTGF0ZW5jeVRvdGFsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhc3NvYyA6bGFzdEVycm9yIChsYXN0LWVyci1mbiBpZCkpKV0pKQorICAgOndpbmRvdy0+ZW1pdHRlZCAobWFwLWtleSBzdHIgKDp3aW5kb3ctPmVtaXR0ZWQgYWNjLWRhdGEpKQorICAgOndpbmRvdy0+dHJhbnNmZXJyZWQgKG1hcC1rZXkgc3RyICg6d2luZG93LT50cmFuc2ZlcnJlZCBhY2MtZGF0YSkpCisgICA6d2luZG93LT5jb21wbGV0ZS1sYXRlbmN5CisgICAgIChjb21wdXRlLXdlaWdodGVkLWF2ZXJhZ2VzLXBlci13aW5kb3cgYWNjLWRhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6d2luZG93LT5jb21wLWxhdC13Z3QtYXZnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOndpbmRvdy0+YWNrZWQpCisgICA6d2luZG93LT5hY2tlZCAobWFwLWtleSBzdHIgKDp3aW5kb3ctPmFja2VkIGFjYy1kYXRhKSkKKyAgIDp3aW5kb3ctPmZhaWxlZCAobWFwLWtleSBzdHIgKDp3aW5kb3ctPmZhaWxlZCBhY2MtZGF0YSkpfSkKKworKGRlZm4tIHRocmlmdGlmeS1jb21tb24tYWdnLXN0YXRzCisgIFteQ29tcG9uZW50QWdncmVnYXRlU3RhdHMgcworICAgezprZXlzIFtudW0tdGFza3MKKyAgICAgICAgICAgZW1pdHRlZAorICAgICAgICAgICB0cmFuc2ZlcnJlZAorICAgICAgICAgICBhY2tlZAorICAgICAgICAgICBmYWlsZWQKKyAgICAgICAgICAgbnVtLWV4ZWN1dG9yc10gOmFzIHN0YXRrLT5udW19XQorICAobGV0IFtjYXMgKENvbW1vbkFnZ3JlZ2F0ZVN0YXRzLildCisgICAgKGFuZCBudW0tZXhlY3V0b3JzICguc2V0X251bV9leGVjdXRvcnMgY2FzIG51bS1leGVjdXRvcnMpKQorICAgIChhbmQgbnVtLXRhc2tzICguc2V0X251bV90YXNrcyBjYXMgbnVtLXRhc2tzKSkKKyAgICAoYW5kIGVtaXR0ZWQgKC5zZXRfZW1pdHRlZCBjYXMgZW1pdHRlZCkpCisgICAgKGFuZCB0cmFuc2ZlcnJlZCAoLnNldF90cmFuc2ZlcnJlZCBjYXMgdHJhbnNmZXJyZWQpKQorICAgIChhbmQgYWNrZWQgKC5zZXRfYWNrZWQgY2FzIGFja2VkKSkKKyAgICAoYW5kIGZhaWxlZCAoLnNldF9mYWlsZWQgY2FzIGZhaWxlZCkpCisgICAgKC5zZXRfY29tbW9uX3N0YXRzIHMgY2FzKSkpCisKKyhkZWZuIHRocmlmdGlmeS1ib2x0LWFnZy1zdGF0cworICBbc3RhdGstPm51bV0KKyAgKGxldCBbezprZXlzIFtsYXN0RXJyb3IKKyAgICAgICAgICAgICAgICBleGVjdXRlLWxhdGVuY3kKKyAgICAgICAgICAgICAgICBwcm9jZXNzLWxhdGVuY3kKKyAgICAgICAgICAgICAgICBleGVjdXRlZAorICAgICAgICAgICAgICAgIGNhcGFjaXR5XX0gc3RhdGstPm51bQorICAgICAgICBzIChDb21wb25lbnRBZ2dyZWdhdGVTdGF0cy4pXQorICAgICguc2V0X3R5cGUgcyBDb21wb25lbnRUeXBlL0JPTFQpCisgICAgKGFuZCBsYXN0RXJyb3IgKC5zZXRfbGFzdF9lcnJvciBzIGxhc3RFcnJvcikpCisgICAgKHRocmlmdGlmeS1jb21tb24tYWdnLXN0YXRzIHMgc3RhdGstPm51bSkKKyAgICAoLnNldF9zcGVjaWZpY19zdGF0cyBzCisgICAgICAoU3BlY2lmaWNBZ2dyZWdhdGVTdGF0cy9ib2x0CisgICAgICAgIChsZXQgW2JhcyAoQm9sdEFnZ3JlZ2F0ZVN0YXRzLildCisgICAgICAgICAgKGFuZCBleGVjdXRlLWxhdGVuY3kgKC5zZXRfZXhlY3V0ZV9sYXRlbmN5X21zIGJhcyBleGVjdXRlLWxhdGVuY3kpKQorICAgICAgICAgIChhbmQgcHJvY2Vzcy1sYXRlbmN5ICguc2V0X3Byb2Nlc3NfbGF0ZW5jeV9tcyBiYXMgcHJvY2Vzcy1sYXRlbmN5KSkKKyAgICAgICAgICAoYW5kIGV4ZWN1dGVkICguc2V0X2V4ZWN1dGVkIGJhcyBleGVjdXRlZCkpCisgICAgICAgICAgKGFuZCBjYXBhY2l0eSAoLnNldF9jYXBhY2l0eSBiYXMgY2FwYWNpdHkpKQorICAgICAgICAgIGJhcykpKQorICAgIHMpKQorCisoZGVmbiB0aHJpZnRpZnktc3BvdXQtYWdnLXN0YXRzCisgIFtzdGF0ay0+bnVtXQorICAobGV0IFt7OmtleXMgW2xhc3RFcnJvcgorICAgICAgICAgICAgICAgIGNvbXBsZXRlLWxhdGVuY3ldfSBzdGF0ay0+bnVtCisgICAgICAgIHMgKENvbXBvbmVudEFnZ3JlZ2F0ZVN0YXRzLildCisgICAgKC5zZXRfdHlwZSBzIENvbXBvbmVudFR5cGUvU1BPVVQpCisgICAgKGFuZCBsYXN0RXJyb3IgKC5zZXRfbGFzdF9lcnJvciBzIGxhc3RFcnJvcikpCisgICAgKHRocmlmdGlmeS1jb21tb24tYWdnLXN0YXRzIHMgc3RhdGstPm51bSkKKyAgICAoLnNldF9zcGVjaWZpY19zdGF0cyBzCisgICAgICAoU3BlY2lmaWNBZ2dyZWdhdGVTdGF0cy9zcG91dAorICAgICAgICAobGV0IFtzYXMgKFNwb3V0QWdncmVnYXRlU3RhdHMuKV0KKyAgICAgICAgICAoYW5kIGNvbXBsZXRlLWxhdGVuY3kgKC5zZXRfY29tcGxldGVfbGF0ZW5jeV9tcyBzYXMgY29tcGxldGUtbGF0ZW5jeSkpCisgICAgICAgICAgc2FzKSkpCisgICAgcykpCisKKyhkZWZuIHRocmlmdGlmeS10b3BvLXBhZ2UtZGF0YQorICBbdG9wb2xvZ3ktaWQgZGF0YV0KKyAgKGxldCBbezprZXlzIFtudW0tdGFza3MKKyAgICAgICAgICAgICAgICBudW0td29ya2VycworICAgICAgICAgICAgICAgIG51bS1leGVjdXRvcnMKKyAgICAgICAgICAgICAgICBzcG91dC1pZC0+c3RhdHMKKyAgICAgICAgICAgICAgICBib2x0LWlkLT5zdGF0cworICAgICAgICAgICAgICAgIHdpbmRvdy0+ZW1pdHRlZAorICAgICAgICAgICAgICAgIHdpbmRvdy0+dHJhbnNmZXJyZWQKKyAgICAgICAgICAgICAgICB3aW5kb3ctPmNvbXBsZXRlLWxhdGVuY3kKKyAgICAgICAgICAgICAgICB3aW5kb3ctPmFja2VkCisgICAgICAgICAgICAgICAgd2luZG93LT5mYWlsZWRdfSBkYXRhCisgICAgICAgIHNwb3V0LWFnZy1zdGF0cyAoaW50byB7fQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvciBbW2lkIG1dIHNwb3V0LWlkLT5zdGF0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmxldCBbbSAoYXNzb2MgbSA6dHlwZSA6c3BvdXQpXV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhyaWZ0aWZ5LXNwb3V0LWFnZy1zdGF0cyBtKV0pKQorICAgICAgICBib2x0LWFnZy1zdGF0cyAoaW50byB7fQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZm9yIFtbaWQgbV0gYm9sdC1pZC0+c3RhdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmxldCBbbSAoYXNzb2MgbSA6dHlwZSA6Ym9sdCldXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRocmlmdGlmeS1ib2x0LWFnZy1zdGF0cyBtKV0pKQorICAgICAgICB0b3BvbG9neS1zdGF0cyAoZG90byAoVG9wb2xvZ3lTdGF0cy4pCisgICAgICAgICAgICAgICAgICAgICAgICAgKC5zZXRfd2luZG93X3RvX2VtaXR0ZWQgd2luZG93LT5lbWl0dGVkKQorICAgICAgICAgICAgICAgICAgICAgICAgICguc2V0X3dpbmRvd190b190cmFuc2ZlcnJlZCB3aW5kb3ctPnRyYW5zZmVycmVkKQorICAgICAgICAgICAgICAgICAgICAgICAgICguc2V0X3dpbmRvd190b19jb21wbGV0ZV9sYXRlbmNpZXNfbXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy0+Y29tcGxldGUtbGF0ZW5jeSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAoLnNldF93aW5kb3dfdG9fYWNrZWQgd2luZG93LT5hY2tlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAoLnNldF93aW5kb3dfdG9fZmFpbGVkIHdpbmRvdy0+ZmFpbGVkKSkKKyAgICAgIHRvcG8tcGFnZS1pbmZvIChkb3RvIChUb3BvbG9neVBhZ2VJbmZvLiB0b3BvbG9neS1pZCkKKyAgICAgICAgICAgICAgICAgICAgICAgKC5zZXRfbnVtX3Rhc2tzIG51bS10YXNrcykKKyAgICAgICAgICAgICAgICAgICAgICAgKC5zZXRfbnVtX3dvcmtlcnMgbnVtLXdvcmtlcnMpCisgICAgICAgICAgICAgICAgICAgICAgICguc2V0X251bV9leGVjdXRvcnMgbnVtLWV4ZWN1dG9ycykKKyAgICAgICAgICAgICAgICAgICAgICAgKC5zZXRfaWRfdG9fc3BvdXRfYWdnX3N0YXRzIHNwb3V0LWFnZy1zdGF0cykKKyAgICAgICAgICAgICAgICAgICAgICAgKC5zZXRfaWRfdG9fYm9sdF9hZ2dfc3RhdHMgYm9sdC1hZ2ctc3RhdHMpCisgICAgICAgICAgICAgICAgICAgICAgICguc2V0X3RvcG9sb2d5X3N0YXRzIHRvcG9sb2d5LXN0YXRzKSldCisgICAgdG9wby1wYWdlLWluZm8pKQorCisoZGVmbiBhZ2ctdG9wby1leGVjcy1zdGF0cworICAiQWdncmVnYXRlIHZhcmlvdXMgZXhlY3V0b3Igc3RhdGlzdGljcyBmb3IgYSB0b3BvbG9neSBmcm9tIHRoZSBnaXZlbgorICBoZWFydGJlYXRzLiIKKyAgW3RvcG9sb2d5LWlkCisgICBleGVjLT5ub2RlK3BvcnQKKyAgIHRhc2stPmNvbXBvbmVudAorICAgYmVhdHMKKyAgIHRvcG9sb2d5CisgICB3aW5kb3cKKyAgIGluY2x1ZGUtc3lzPworICAgbGFzdC1lcnItZm5dCisgICgtPj4gOzsgVGhpcyBpdGVyYXRlcyBvdmVyIGVhY2ggZXhlY3V0b3Igb25lIHRpbWUsIGJlY2F1c2Ugb2YgbGF6eSBldmFsdWF0aW9uLgorICAgIChleHRyYWN0LWRhdGEtZnJvbS1oYiBleGVjLT5ub2RlK3BvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGFzay0+Y29tcG9uZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgIGJlYXRzCisgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUtc3lzPworICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BvbG9neSkKKyAgICAoYWdncmVnYXRlLXRvcG8tc3RhdHMgd2luZG93IGluY2x1ZGUtc3lzPykKKyAgICAocG9zdC1hZ2dyZWdhdGUtdG9wby1zdGF0cyB0YXNrLT5jb21wb25lbnQgZXhlYy0+bm9kZStwb3J0IGxhc3QtZXJyLWZuKQorICAgICh0aHJpZnRpZnktdG9wby1wYWdlLWRhdGEgdG9wb2xvZ3ktaWQpKSkKKworKGRlZm4tIGFnZy1ib2x0LWV4ZWMtd2luLXN0YXRzCisgICJBIGhlbHBlciBmdW5jdGlvbiB0aGF0IGFnZ3JlZ2F0ZXMgd2luZG93ZWQgc3RhdHMgZnJvbSBvbmUgYm9sdCBleGVjdXRvci4iCisgIFthY2Mtc3RhdHMgbmV3LXN0YXRzIGluY2x1ZGUtc3lzP10KKyAgKGxldCBbe3ctPmV4ZWNMYXRXZ3RBdmcgOmV4ZWN1dGVMYXRlbmN5VG90YWwKKyAgICAgICAgIHctPnByb2NMYXRXZ3RBdmcgOnByb2Nlc3NMYXRlbmN5VG90YWwKKyAgICAgICAgIHctPmV4ZWN1dGVkIDpleGVjdXRlZH0KKyAgICAgICAgICAoc3dhcC1tYXAtb3JkZXIKKyAgICAgICAgICAgIChpbnRvIHt9IChmb3IgW3cgKGtleXMgKDpleGVjdXRlZCBuZXctc3RhdHMpKV0KKyAgICAgICAgICAgICAgICAgICAgICAgW3cgKGFnZy1ib2x0LWxhdC1hbmQtY291bnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2V0ICg6ZXhlY3V0ZS1sYXRlbmNpZXMgbmV3LXN0YXRzKSB3KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnZXQgKDpwcm9jZXNzLWxhdGVuY2llcyBuZXctc3RhdHMpIHcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdldCAoOmV4ZWN1dGVkIG5ldy1zdGF0cykgdykpXSkpKQorICAgICAgICBoYW5kbGUtc3lzLWNvbXBvbmVudHMtZm4gKG1rLWluY2x1ZGUtc3lzLWZpbHRlciBpbmNsdWRlLXN5cz8pXQorICAgIHs6d2luZG93LT5lbWl0dGVkICgtPj4gKDplbWl0dGVkIG5ldy1zdGF0cykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXAtdmFsIGhhbmRsZS1zeXMtY29tcG9uZW50cy1mbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFnZ3JlZ2F0ZS1jb3VudC1zdHJlYW1zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAobWVyZ2Utd2l0aCArICg6d2luZG93LT5lbWl0dGVkIGFjYy1zdGF0cykpKQorICAgICA6d2luZG93LT50cmFuc2ZlcnJlZCAoLT4+ICg6dHJhbnNmZXJyZWQgbmV3LXN0YXRzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXAtdmFsIGhhbmRsZS1zeXMtY29tcG9uZW50cy1mbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZ2dyZWdhdGUtY291bnQtc3RyZWFtcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtZXJnZS13aXRoICsgKDp3aW5kb3ctPnRyYW5zZmVycmVkIGFjYy1zdGF0cykpKQorICAgICA6d2luZG93LT5leGVjLWxhdC13Z3QtYXZnIChtZXJnZS13aXRoICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoOndpbmRvdy0+ZXhlYy1sYXQtd2d0LWF2ZyBhY2Mtc3RhdHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdy0+ZXhlY0xhdFdndEF2ZykKKyAgICAgOndpbmRvdy0+cHJvYy1sYXQtd2d0LWF2ZyAobWVyZ2Utd2l0aCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDp3aW5kb3ctPnByb2MtbGF0LXdndC1hdmcgYWNjLXN0YXRzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHctPnByb2NMYXRXZ3RBdmcpCisgICAgIDp3aW5kb3ctPmV4ZWN1dGVkIChtZXJnZS13aXRoICsgKDp3aW5kb3ctPmV4ZWN1dGVkIGFjYy1zdGF0cykgdy0+ZXhlY3V0ZWQpCisgICAgIDp3aW5kb3ctPmFja2VkICgtPj4gKDphY2tlZCBuZXctc3RhdHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgYWdncmVnYXRlLWNvdW50LXN0cmVhbXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAobWVyZ2Utd2l0aCArICg6d2luZG93LT5hY2tlZCBhY2Mtc3RhdHMpKSkKKyAgICAgOndpbmRvdy0+ZmFpbGVkICgtPj4gKDpmYWlsZWQgbmV3LXN0YXRzKQorICAgICAgICAgICAgICAgICAgICAgICAgICBhZ2dyZWdhdGUtY291bnQtc3RyZWFtcworICAgICAgICAgICAgICAgICAgICAgICAgICAobWVyZ2Utd2l0aCArICg6d2luZG93LT5mYWlsZWQgYWNjLXN0YXRzKSkpfSkpCisKKyhkZWZuLSBhZ2ctc3BvdXQtZXhlYy13aW4tc3RhdHMKKyAgIkEgaGVscGVyIGZ1bmN0aW9uIHRoYXQgYWdncmVnYXRlcyB3aW5kb3dlZCBzdGF0cyBmcm9tIG9uZSBzcG91dCBleGVjdXRvci4iCisgIFthY2Mtc3RhdHMgbmV3LXN0YXRzIGluY2x1ZGUtc3lzP10KKyAgKGxldCBbe3ctPmNvbXBMYXRXZ3RBdmcgOmNvbXBsZXRlTGF0ZW5jeVRvdGFsCisgICAgICAgICB3LT5hY2tlZCA6YWNrZWR9CisgICAgICAgICAgKHN3YXAtbWFwLW9yZGVyCisgICAgICAgICAgICAoaW50byB7fSAoZm9yIFt3IChrZXlzICg6YWNrZWQgbmV3LXN0YXRzKSldCisgICAgICAgICAgICAgICAgICAgICAgIFt3IChhZ2ctc3BvdXQtbGF0LWFuZC1jb3VudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnZXQgKDpjb21wbGV0ZS1sYXRlbmNpZXMgbmV3LXN0YXRzKSB3KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChnZXQgKDphY2tlZCBuZXctc3RhdHMpIHcpKV0pKSkKKyAgICAgICAgaGFuZGxlLXN5cy1jb21wb25lbnRzLWZuIChtay1pbmNsdWRlLXN5cy1maWx0ZXIgaW5jbHVkZS1zeXM/KV0KKyAgICB7OndpbmRvdy0+ZW1pdHRlZCAoLT4+ICg6ZW1pdHRlZCBuZXctc3RhdHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAobWFwLXZhbCBoYW5kbGUtc3lzLWNvbXBvbmVudHMtZm4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhZ2dyZWdhdGUtY291bnQtc3RyZWFtcworICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1lcmdlLXdpdGggKyAoOndpbmRvdy0+ZW1pdHRlZCBhY2Mtc3RhdHMpKSkKKyAgICAgOndpbmRvdy0+dHJhbnNmZXJyZWQgKC0+PiAoOnRyYW5zZmVycmVkIG5ldy1zdGF0cykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWFwLXZhbCBoYW5kbGUtc3lzLWNvbXBvbmVudHMtZm4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdncmVnYXRlLWNvdW50LXN0cmVhbXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWVyZ2Utd2l0aCArICg6d2luZG93LT50cmFuc2ZlcnJlZCBhY2Mtc3RhdHMpKSkKKyAgICAgOndpbmRvdy0+Y29tcC1sYXQtd2d0LWF2ZyAobWVyZ2Utd2l0aCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDp3aW5kb3ctPmNvbXAtbGF0LXdndC1hdmcgYWNjLXN0YXRzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHctPmNvbXBMYXRXZ3RBdmcpCisgICAgIDp3aW5kb3ctPmFja2VkICgtPj4gKDphY2tlZCBuZXctc3RhdHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgYWdncmVnYXRlLWNvdW50LXN0cmVhbXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAobWVyZ2Utd2l0aCArICg6d2luZG93LT5hY2tlZCBhY2Mtc3RhdHMpKSkKKyAgICAgOndpbmRvdy0+ZmFpbGVkICgtPj4gKDpmYWlsZWQgbmV3LXN0YXRzKQorICAgICAgICAgICAgICAgICAgICAgICAgICBhZ2dyZWdhdGUtY291bnQtc3RyZWFtcworICAgICAgICAgICAgICAgICAgICAgICAgICAobWVyZ2Utd2l0aCArICg6d2luZG93LT5mYWlsZWQgYWNjLXN0YXRzKSkpfSkpCisKKyhkZWZtdWx0aSBhZ2ctY29tcC1leGVjLXN0YXRzCisgICJDb21iaW5lcyB0aGUgYWdncmVnYXRlIHN0YXRzIG9mIG9uZSBleGVjdXRvciB3aXRoIHRoZSBnaXZlbiBtYXAsIHNlbGVjdGluZworICB0aGUgYXBwcm9wcmlhdGUgd2luZG93IGFuZCBpbmNsdWRpbmcgc3lzdGVtIGNvbXBvbmVudHMgYXMgc3BlY2lmaWVkLiIKKyAgKGZuIGRpc3BhdGNoLWZuIFtfIF8gaW5pdC12YWwgX10gKDp0eXBlIGluaXQtdmFsKSkpCisKKyhkZWZtZXRob2QgYWdnLWNvbXAtZXhlYy1zdGF0cyA6Ym9sdAorICBbd2luZG93IGluY2x1ZGUtc3lzPyBhY2Mtc3RhdHMgbmV3LWRhdGFdCisgIChhc3NvYyAoYWdnLWJvbHQtZXhlYy13aW4tc3RhdHMgYWNjLXN0YXRzICg6c3RhdHMgbmV3LWRhdGEpIGluY2x1ZGUtc3lzPykKKyAgICAgICAgIDpzdGF0cyAobWVyZ2UtYWdnLWNvbXAtc3RhdHMtY29tcC1wYWdlLWJvbHQKKyAgICAgICAgICAgICAgICAgICg6c3RhdHMgYWNjLXN0YXRzKQorICAgICAgICAgICAgICAgICAgKGFnZy1wcmUtbWVyZ2UtY29tcC1wYWdlLWJvbHQgbmV3LWRhdGEgd2luZG93IGluY2x1ZGUtc3lzPykpCisgICAgICAgICA6dHlwZSA6Ym9sdCkpCisKKyhkZWZtZXRob2QgYWdnLWNvbXAtZXhlYy1zdGF0cyA6c3BvdXQKKyAgW3dpbmRvdyBpbmNsdWRlLXN5cz8gYWNjLXN0YXRzIG5ldy1kYXRhXQorICAoYXNzb2MgKGFnZy1zcG91dC1leGVjLXdpbi1zdGF0cyBhY2Mtc3RhdHMgKDpzdGF0cyBuZXctZGF0YSkgaW5jbHVkZS1zeXM/KQorICAgICAgICAgOnN0YXRzIChtZXJnZS1hZ2ctY29tcC1zdGF0cy1jb21wLXBhZ2Utc3BvdXQKKyAgICAgICAgICAgICAgICAgICg6c3RhdHMgYWNjLXN0YXRzKQorICAgICAgICAgICAgICAgICAgKGFnZy1wcmUtbWVyZ2UtY29tcC1wYWdlLXNwb3V0IG5ldy1kYXRhIHdpbmRvdyBpbmNsdWRlLXN5cz8pKQorICAgICAgICAgOnR5cGUgOnNwb3V0KSkKKworKGRlZm4tIGFnZ3JlZ2F0ZS1jb21wLXN0YXRzKgorICBbd2luZG93IGluY2x1ZGUtc3lzPyBkYXRhIGluaXQtdmFsXQorICAoLT4gKHBhcnRpYWwgYWdnLWNvbXAtZXhlYy1zdGF0cworICAgICAgICAgICAgICAgd2luZG93CisgICAgICAgICAgICAgICBpbmNsdWRlLXN5cz8pCisgICAgICAocmVkdWNlIGluaXQtdmFsIGRhdGEpKSkKKworKGRlZm11bHRpIGFnZ3JlZ2F0ZS1jb21wLXN0YXRzCisgIChmbiBkaXNwYXRjaC1mbiBbJiBhcmdzXSAoLT4gYXJncyBsYXN0IGZpcnN0IDp0eXBlKSkpCisKKyhkZWZtZXRob2QgYWdncmVnYXRlLWNvbXAtc3RhdHMgOmJvbHQKKyAgWyYgYXJnc10KKyAgKGxldCBbaW5pdC12YWwgezp0eXBlIDpib2x0CisgICAgICAgICAgICAgICAgICA6Y2lkK3NpZC0+aW5wdXQtc3RhdHMge30KKyAgICAgICAgICAgICAgICAgIDpzaWQtPm91dHB1dC1zdGF0cyB7fQorICAgICAgICAgICAgICAgICAgOmV4ZWN1dG9yLXN0YXRzIFtdCisgICAgICAgICAgICAgICAgICA6d2luZG93LT5lbWl0dGVkIHt9CisgICAgICAgICAgICAgICAgICA6d2luZG93LT50cmFuc2ZlcnJlZCB7fQorICAgICAgICAgICAgICAgICAgOndpbmRvdy0+ZXhlYy1sYXQtd2d0LWF2ZyB7fQorICAgICAgICAgICAgICAgICAgOndpbmRvdy0+ZXhlY3V0ZWQge30KKyAgICAgICAgICAgICAgICAgIDp3aW5kb3ctPnByb2MtbGF0LXdndC1hdmcge30KKyAgICAgICAgICAgICAgICAgIDp3aW5kb3ctPmFja2VkIHt9CisgICAgICAgICAgICAgICAgICA6d2luZG93LT5mYWlsZWQge319XQorICAgIChhcHBseSBhZ2dyZWdhdGUtY29tcC1zdGF0cyogKGNvbmNhdCBhcmdzIChsaXN0IGluaXQtdmFsKSkpKSkKKworKGRlZm1ldGhvZCBhZ2dyZWdhdGUtY29tcC1zdGF0cyA6c3BvdXQKKyAgWyYgYXJnc10KKyAgKGxldCBbaW5pdC12YWwgezp0eXBlIDpzcG91dAorICAgICAgICAgICAgICAgICAgOnNpZC0+b3V0cHV0LXN0YXRzIHt9CisgICAgICAgICAgICAgICAgICA6ZXhlY3V0b3Itc3RhdHMgW10KKyAgICAgICAgICAgICAgICAgIDp3aW5kb3ctPmVtaXR0ZWQge30KKyAgICAgICAgICAgICAgICAgIDp3aW5kb3ctPnRyYW5zZmVycmVkIHt9CisgICAgICAgICAgICAgICAgICA6d2luZG93LT5jb21wLWxhdC13Z3QtYXZnIHt9CisgICAgICAgICAgICAgICAgICA6d2luZG93LT5hY2tlZCB7fQorICAgICAgICAgICAgICAgICAgOndpbmRvdy0+ZmFpbGVkIHt9fV0KKyAgICAoYXBwbHkgYWdncmVnYXRlLWNvbXAtc3RhdHMqIChjb25jYXQgYXJncyAobGlzdCBpbml0LXZhbCkpKSkpCisKKyhkZWZtZXRob2QgYWdncmVnYXRlLWNvbXAtc3RhdHMgOmRlZmF1bHQgWyYgX10ge30pCisKKyhkZWZtdWx0aSBwb3N0LWFnZ3JlZ2F0ZS1jb21wLXN0YXRzCisgIChmbiBbXyBfIGRhdGFdICg6dHlwZSBkYXRhKSkpCisKKyhkZWZtZXRob2QgcG9zdC1hZ2dyZWdhdGUtY29tcC1zdGF0cyA6Ym9sdAorICBbdGFzay0+Y29tcG9uZW50CisgICBleGVjLT5ob3N0K3BvcnQKKyAgIHt7aS1zdGF0cyA6Y2lkK3NpZC0+aW5wdXQtc3RhdHMKKyAgICAgby1zdGF0cyA6c2lkLT5vdXRwdXQtc3RhdHMKKyAgICAgbnVtLXRhc2tzIDpudW0tdGFza3MKKyAgICAgbnVtLWV4ZWN1dG9ycyA6bnVtLWV4ZWN1dG9yc30gOnN0YXRzCisgICAgY29tcC10eXBlIDp0eXBlIDphcyBhY2MtZGF0YX1dCisgIHs6dHlwZSBjb21wLXR5cGUKKyAgIDpudW0tdGFza3MgbnVtLXRhc2tzCisgICA6bnVtLWV4ZWN1dG9ycyBudW0tZXhlY3V0b3JzCisgICA6Y2lkK3NpZC0+aW5wdXQtc3RhdHMKKyAgICgtPj4gaS1zdGF0cworICAgICAgICAobWFwLXZhbCAoZm4gW21dCisgICAgICAgICAgICAgICAgICAgICAobGV0IFtleGVjdXRlZCAoOmV4ZWN1dGVkIG0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRzIChpZiAoYW5kIGV4ZWN1dGVkIChwb3M/IGV4ZWN1dGVkKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7OmV4ZWN1dGUtbGF0ZW5jeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGl2IChvciAoOmV4ZWN1dGVMYXRlbmN5VG90YWwgbSkgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOnByb2Nlc3MtbGF0ZW5jeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGl2IChvciAoOnByb2Nlc3NMYXRlbmN5VG90YWwgbSkgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRlZCl9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezpleGVjdXRlLWxhdGVuY3kgMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6cHJvY2Vzcy1sYXRlbmN5IDB9KV0KKyAgICAgICAgICAgICAgICAgICAgICAgKC0+IG0gKG1lcmdlIGxhdHMpIChkaXNzb2MgOmV4ZWN1dGVMYXRlbmN5VG90YWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOnByb2Nlc3NMYXRlbmN5VG90YWwpKSkpKSkKKyAgIDpzaWQtPm91dHB1dC1zdGF0cyBvLXN0YXRzCisgICA6ZXhlY3V0b3Itc3RhdHMgKDpleGVjdXRvci1zdGF0cyAoOnN0YXRzIGFjYy1kYXRhKSkKKyAgIDp3aW5kb3ctPmVtaXR0ZWQgKG1hcC1rZXkgc3RyICg6d2luZG93LT5lbWl0dGVkIGFjYy1kYXRhKSkKKyAgIDp3aW5kb3ctPnRyYW5zZmVycmVkIChtYXAta2V5IHN0ciAoOndpbmRvdy0+dHJhbnNmZXJyZWQgYWNjLWRhdGEpKQorICAgOndpbmRvdy0+ZXhlY3V0ZS1sYXRlbmN5CisgICAgIChjb21wdXRlLXdlaWdodGVkLWF2ZXJhZ2VzLXBlci13aW5kb3cgYWNjLWRhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6d2luZG93LT5leGVjLWxhdC13Z3QtYXZnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOndpbmRvdy0+ZXhlY3V0ZWQpCisgICA6d2luZG93LT5leGVjdXRlZCAobWFwLWtleSBzdHIgKDp3aW5kb3ctPmV4ZWN1dGVkIGFjYy1kYXRhKSkKKyAgIDp3aW5kb3ctPnByb2Nlc3MtbGF0ZW5jeQorICAgICAoY29tcHV0ZS13ZWlnaHRlZC1hdmVyYWdlcy1wZXItd2luZG93IGFjYy1kYXRhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOndpbmRvdy0+cHJvYy1sYXQtd2d0LWF2ZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDp3aW5kb3ctPmV4ZWN1dGVkKQorICAgOndpbmRvdy0+YWNrZWQgKG1hcC1rZXkgc3RyICg6d2luZG93LT5hY2tlZCBhY2MtZGF0YSkpCisgICA6d2luZG93LT5mYWlsZWQgKG1hcC1rZXkgc3RyICg6d2luZG93LT5mYWlsZWQgYWNjLWRhdGEpKX0pCisKKyhkZWZtZXRob2QgcG9zdC1hZ2dyZWdhdGUtY29tcC1zdGF0cyA6c3BvdXQKKyAgW3Rhc2stPmNvbXBvbmVudAorICAgZXhlYy0+aG9zdCtwb3J0CisgICB7e28tc3RhdHMgOnNpZC0+b3V0cHV0LXN0YXRzCisgICAgIG51bS10YXNrcyA6bnVtLXRhc2tzCisgICAgIG51bS1leGVjdXRvcnMgOm51bS1leGVjdXRvcnN9IDpzdGF0cworICAgIGNvbXAtdHlwZSA6dHlwZSA6YXMgYWNjLWRhdGF9XQorICB7OnR5cGUgY29tcC10eXBlCisgICA6bnVtLXRhc2tzIG51bS10YXNrcworICAgOm51bS1leGVjdXRvcnMgbnVtLWV4ZWN1dG9ycworICAgOnNpZC0+b3V0cHV0LXN0YXRzCisgICAoLT4+IG8tc3RhdHMKKyAgICAgICAgKG1hcC12YWwgKGZuIFttXQorICAgICAgICAgICAgICAgICAgICAgKGxldCBbYWNrZWQgKDphY2tlZCBtKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0IChpZiAoYW5kIGFja2VkIChwb3M/IGFja2VkKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs6Y29tcGxldGUtbGF0ZW5jeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkaXYgKG9yICg6Y29tcGxldGVMYXRlbmN5VG90YWwgbSkgMCkgYWNrZWQpfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezpjb21wbGV0ZS1sYXRlbmN5IDB9KV0KKyAgICAgICAgICAgICAgICAgICAgICAgKC0+IG0gKG1lcmdlIGxhdCkgKGRpc3NvYyA6Y29tcGxldGVMYXRlbmN5VG90YWwpKSkpKSkKKyAgIDpleGVjdXRvci1zdGF0cyAoOmV4ZWN1dG9yLXN0YXRzICg6c3RhdHMgYWNjLWRhdGEpKQorICAgOndpbmRvdy0+ZW1pdHRlZCAobWFwLWtleSBzdHIgKDp3aW5kb3ctPmVtaXR0ZWQgYWNjLWRhdGEpKQorICAgOndpbmRvdy0+dHJhbnNmZXJyZWQgKG1hcC1rZXkgc3RyICg6d2luZG93LT50cmFuc2ZlcnJlZCBhY2MtZGF0YSkpCisgICA6d2luZG93LT5jb21wbGV0ZS1sYXRlbmN5CisgICAgIChjb21wdXRlLXdlaWdodGVkLWF2ZXJhZ2VzLXBlci13aW5kb3cgYWNjLWRhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6d2luZG93LT5jb21wLWxhdC13Z3QtYXZnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOndpbmRvdy0+YWNrZWQpCisgICA6d2luZG93LT5hY2tlZCAobWFwLWtleSBzdHIgKDp3aW5kb3ctPmFja2VkIGFjYy1kYXRhKSkKKyAgIDp3aW5kb3ctPmZhaWxlZCAobWFwLWtleSBzdHIgKDp3aW5kb3ctPmZhaWxlZCBhY2MtZGF0YSkpfSkKKworKGRlZm1ldGhvZCBwb3N0LWFnZ3JlZ2F0ZS1jb21wLXN0YXRzIDpkZWZhdWx0IFsmIF9dIHt9KQorCisoZGVmbiB0aHJpZnRpZnktZXhlYy1hZ2ctc3RhdHMKKyAgW2NvbXAtaWQgY29tcC10eXBlIHs6a2V5cyBbZXhlY3V0b3ItaWQgaG9zdCBwb3J0IHVwdGltZV0gOmFzIHN0YXRzfV0KKyAgKGRvdG8gKEV4ZWN1dG9yQWdncmVnYXRlU3RhdHMuKQorICAgICguc2V0X2V4ZWNfc3VtbWFyeSAoRXhlY3V0b3JTdW1tYXJ5LiAoYXBwbHkgIyhFeGVjdXRvckluZm8uICUxICUyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0b3ItaWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXAtaWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvciB1cHRpbWUgMCkpKQorICAgICguc2V0X3N0YXRzICgoY29uZHAgPSBjb21wLXR5cGUKKyAgICAgICAgICAgICAgICAgICA6Ym9sdCB0aHJpZnRpZnktYm9sdC1hZ2ctc3RhdHMKKyAgICAgICAgICAgICAgICAgICA6c3BvdXQgdGhyaWZ0aWZ5LXNwb3V0LWFnZy1zdGF0cykgc3RhdHMpKSkpCisKKyhkZWZuLSB0aHJpZnRpZnktYm9sdC1pbnB1dC1zdGF0cworICBbY2lkK3NpZC0+aW5wdXQtc3RhdHNdCisgIChpbnRvIHt9IChmb3IgW1tjaWQrc2lkIGlucHV0LXN0YXRzXSBjaWQrc2lkLT5pbnB1dC1zdGF0c10KKyAgICAgICAgICAgICBbKHRvLWdsb2JhbC1zdHJlYW0taWQgY2lkK3NpZCkKKyAgICAgICAgICAgICAgKHRocmlmdGlmeS1ib2x0LWFnZy1zdGF0cyBpbnB1dC1zdGF0cyldKSkpCisKKyhkZWZuLSB0aHJpZnRpZnktYm9sdC1vdXRwdXQtc3RhdHMKKyAgW3NpZC0+b3V0cHV0LXN0YXRzXQorICAobWFwLXZhbCB0aHJpZnRpZnktYm9sdC1hZ2ctc3RhdHMgc2lkLT5vdXRwdXQtc3RhdHMpKQorCisoZGVmbi0gdGhyaWZ0aWZ5LXNwb3V0LW91dHB1dC1zdGF0cworICBbc2lkLT5vdXRwdXQtc3RhdHNdCisgIChtYXAtdmFsIHRocmlmdGlmeS1zcG91dC1hZ2ctc3RhdHMgc2lkLT5vdXRwdXQtc3RhdHMpKQorCisoZGVmbiB0aHJpZnRpZnktY29tcC1wYWdlLWRhdGEKKyAgW3RvcG8taWQgdG9wb2xvZ3kgY29tcC1pZCBkYXRhXQorICAobGV0IFt3LT5zdGF0cyAoc3dhcC1tYXAtb3JkZXIKKyAgICAgICAgICAgICAgICAgICAobWVyZ2UKKyAgICAgICAgICAgICAgICAgICAgIHs6ZW1pdHRlZCAoOndpbmRvdy0+ZW1pdHRlZCBkYXRhKQorICAgICAgICAgICAgICAgICAgICAgIDp0cmFuc2ZlcnJlZCAoOndpbmRvdy0+dHJhbnNmZXJyZWQgZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgICA6YWNrZWQgKDp3aW5kb3ctPmFja2VkIGRhdGEpCisgICAgICAgICAgICAgICAgICAgICAgOmZhaWxlZCAoOndpbmRvdy0+ZmFpbGVkIGRhdGEpfQorICAgICAgICAgICAgICAgICAgICAgKGNvbmRwID0gKDp0eXBlIGRhdGEpCisgICAgICAgICAgICAgICAgICAgICAgIDpib2x0IHs6ZXhlY3V0ZS1sYXRlbmN5ICg6d2luZG93LT5leGVjdXRlLWxhdGVuY3kgZGF0YSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpwcm9jZXNzLWxhdGVuY3kgKDp3aW5kb3ctPnByb2Nlc3MtbGF0ZW5jeSBkYXRhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmV4ZWN1dGVkICg6d2luZG93LT5leGVjdXRlZCBkYXRhKX0KKyAgICAgICAgICAgICAgICAgICAgICAgOnNwb3V0IHs6Y29tcGxldGUtbGF0ZW5jeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg6d2luZG93LT5jb21wbGV0ZS1sYXRlbmN5IGRhdGEpfQorICAgICAgICAgICAgICAgICAgICAgICB7fSkpKSA7IGRlZmF1bHQKKyAgICAgICAgW2NvbXBUeXBlIGV4ZWMtc3RhdHMgdy0+c3RhdHMgZ3NpZC0+aW5wdXQtc3RhdHMgc2lkLT5vdXRwdXQtc3RhdHNdCisgICAgICAgICAgKGNvbmRwID0gKGNvbXBvbmVudC10eXBlIHRvcG9sb2d5IGNvbXAtaWQpCisgICAgICAgICAgICA6Ym9sdCBbQ29tcG9uZW50VHlwZS9CT0xUCisgICAgICAgICAgICAgICAgICAgKC0+CisgICAgICAgICAgICAgICAgICAgICAocGFydGlhbCB0aHJpZnRpZnktZXhlYy1hZ2ctc3RhdHMgY29tcC1pZCA6Ym9sdCkKKyAgICAgICAgICAgICAgICAgICAgIChtYXAgKDpleGVjdXRvci1zdGF0cyBkYXRhKSkpCisgICAgICAgICAgICAgICAgICAgKG1hcC12YWwgdGhyaWZ0aWZ5LWJvbHQtYWdnLXN0YXRzIHctPnN0YXRzKQorICAgICAgICAgICAgICAgICAgICh0aHJpZnRpZnktYm9sdC1pbnB1dC1zdGF0cyAoOmNpZCtzaWQtPmlucHV0LXN0YXRzIGRhdGEpKQorICAgICAgICAgICAgICAgICAgICh0aHJpZnRpZnktYm9sdC1vdXRwdXQtc3RhdHMgKDpzaWQtPm91dHB1dC1zdGF0cyBkYXRhKSldCisgICAgICAgICAgICA6c3BvdXQgW0NvbXBvbmVudFR5cGUvU1BPVVQKKyAgICAgICAgICAgICAgICAgICAgKC0+CisgICAgICAgICAgICAgICAgICAgICAgKHBhcnRpYWwgdGhyaWZ0aWZ5LWV4ZWMtYWdnLXN0YXRzIGNvbXAtaWQgOnNwb3V0KQorICAgICAgICAgICAgICAgICAgICAgIChtYXAgKDpleGVjdXRvci1zdGF0cyBkYXRhKSkpCisgICAgICAgICAgICAgICAgICAgIChtYXAtdmFsIHRocmlmdGlmeS1zcG91dC1hZ2ctc3RhdHMgdy0+c3RhdHMpCisgICAgICAgICAgICAgICAgICAgIG5pbCA7OyBzcG91dHMgZG8gbm90IGhhdmUgaW5wdXQgc3RhdHMKKyAgICAgICAgICAgICAgICAgICAgKHRocmlmdGlmeS1zcG91dC1vdXRwdXQtc3RhdHMgKDpzaWQtPm91dHB1dC1zdGF0cyBkYXRhKSldKSwKKyAgICAgICAgbnVtLWV4ZWN1dG9ycyAoOm51bS1leGVjdXRvcnMgZGF0YSkKKyAgICAgICAgbnVtLXRhc2tzICg6bnVtLXRhc2tzIGRhdGEpCisgICAgICAgIHJldCAoZG90byAoQ29tcG9uZW50UGFnZUluZm8uIGNvbXAtaWQgY29tcFR5cGUpCisgICAgICAgICAgICAgICguc2V0X3RvcG9sb2d5X2lkIHRvcG8taWQpCisgICAgICAgICAgICAgICguc2V0X3RvcG9sb2d5X25hbWUgbmlsKQorICAgICAgICAgICAgICAoLnNldF93aW5kb3dfdG9fc3RhdHMgdy0+c3RhdHMpCisgICAgICAgICAgICAgICguc2V0X3NpZF90b19vdXRwdXRfc3RhdHMgc2lkLT5vdXRwdXQtc3RhdHMpCisgICAgICAgICAgICAgICguc2V0X2V4ZWNfc3RhdHMgZXhlYy1zdGF0cykpXQorICAgIChhbmQgbnVtLWV4ZWN1dG9ycyAoLnNldF9udW1fZXhlY3V0b3JzIHJldCBudW0tZXhlY3V0b3JzKSkKKyAgICAoYW5kIG51bS10YXNrcyAoLnNldF9udW1fdGFza3MgcmV0IG51bS10YXNrcykpCisgICAgKGFuZCBnc2lkLT5pbnB1dC1zdGF0cworICAgICAgICAgKC5zZXRfZ3NpZF90b19pbnB1dF9zdGF0cyByZXQgZ3NpZC0+aW5wdXQtc3RhdHMpKQorICAgIHJldCkpCisKKyhkZWZuIGFnZy1jb21wLWV4ZWNzLXN0YXRzCisgICJBZ2dyZWdhdGUgdmFyaW91cyBleGVjdXRvciBzdGF0aXN0aWNzIGZvciBhIGNvbXBvbmVudCBmcm9tIHRoZSBnaXZlbgorICBoZWFydGJlYXRzLiIKKyAgW2V4ZWMtPmhvc3QrcG9ydAorICAgdGFzay0+Y29tcG9uZW50CisgICBiZWF0cworICAgd2luZG93CisgICBpbmNsdWRlLXN5cz8KKyAgIHRvcG9sb2d5LWlkCisgICB0b3BvbG9neQorICAgY29tcG9uZW50LWlkXQorICAoLT4+IDs7IFRoaXMgaXRlcmF0ZXMgb3ZlciBlYWNoIGV4ZWN1dG9yIG9uZSB0aW1lLCBiZWNhdXNlIG9mIGxhenkgZXZhbHVhdGlvbi4KKyAgICAoZXh0cmFjdC1kYXRhLWZyb20taGIgZXhlYy0+aG9zdCtwb3J0CisgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2stPmNvbXBvbmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICBiZWF0cworICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlLXN5cz8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wb2xvZ3kKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LWlkKQorICAgIChhZ2dyZWdhdGUtY29tcC1zdGF0cyB3aW5kb3cgaW5jbHVkZS1zeXM/KQorICAgIChwb3N0LWFnZ3JlZ2F0ZS1jb21wLXN0YXRzIHRhc2stPmNvbXBvbmVudCBleGVjLT5ob3N0K3BvcnQpCisgICAgKHRocmlmdGlmeS1jb21wLXBhZ2UtZGF0YSB0b3BvbG9neS1pZCB0b3BvbG9neSBjb21wb25lbnQtaWQpKSkKKworKGRlZm4gZXhwYW5kLWF2ZXJhZ2VzCisgIFthdmcgY291bnRzXQorICAobGV0IFthdmcgKGNsb2p1cmlmeS1zdHJ1Y3R1cmUgYXZnKQorICAgICAgICBjb3VudHMgKGNsb2p1cmlmeS1zdHJ1Y3R1cmUgY291bnRzKV0KKyAgICAoaW50byB7fQorICAgICAgICAgIChmb3IgW1tzbGljZSBzdHJlYW1zXSBjb3VudHNdCisgICAgICAgICAgICBbc2xpY2UKKyAgICAgICAgICAgICAoaW50byB7fQorICAgICAgICAgICAgICAgICAgIChmb3IgW1tzdHJlYW0gY10gc3RyZWFtc10KKyAgICAgICAgICAgICAgICAgICAgIFtzdHJlYW0KKyAgICAgICAgICAgICAgICAgICAgICBbKCogYyAoZ2V0LWluIGF2ZyBbc2xpY2Ugc3RyZWFtXSkpCisgICAgICAgICAgICAgICAgICAgICAgIGNdXQorICAgICAgICAgICAgICAgICAgICAgKSldKSkpKQorCisoZGVmbiBleHBhbmQtYXZlcmFnZXMtc2VxCisgIFthdmVyYWdlLXNlcSBjb3VudHMtc2VxXQorICAoLT4+IChtYXAgdmVjdG9yIGF2ZXJhZ2Utc2VxIGNvdW50cy1zZXEpCisgICAgICAgKG1hcCAjKGFwcGx5IGV4cGFuZC1hdmVyYWdlcyAlKSkKKyAgICAgICAoYXBwbHkgbWVyZ2Utd2l0aCAoZm4gW3MxIHMyXSAobWVyZ2Utd2l0aCBhZGQtcGFpcnMgczEgczIpKSkpKQorCisoZGVmbi0gdmFsLWF2ZworICBbW3QgY11dCisgIChpZiAoPSB0IDApIDAKKyAgICAoZG91YmxlICgvIHQgYykpKSkKKworKGRlZm4gYWdncmVnYXRlLWF2ZXJhZ2VzCisgIFthdmVyYWdlLXNlcSBjb3VudHMtc2VxXQorICAoLT4+IChleHBhbmQtYXZlcmFnZXMtc2VxIGF2ZXJhZ2Utc2VxIGNvdW50cy1zZXEpCisgICAgICAgKG1hcC12YWwKKyAgICAgICAgIChmbiBbc10KKyAgICAgICAgICAgKG1hcC12YWwgdmFsLWF2ZyBzKSkpKSkKKworKGRlZm4gYWdncmVnYXRlLWF2Zy1zdHJlYW1zCisgIFthdmcgY291bnRzXQorICAobGV0IFtleHBhbmRlZCAoZXhwYW5kLWF2ZXJhZ2VzIGF2ZyBjb3VudHMpXQorICAgICgtPj4gZXhwYW5kZWQKKyAgICAgICAgIChtYXAtdmFsICMocmVkdWNlIGFkZC1wYWlycyAodmFscyAlKSkpCisgICAgICAgICAobWFwLXZhbCB2YWwtYXZnKSkpKQorCisoZGVmbiBwcmUtcHJvY2VzcworICBbc3RyZWFtLXN1bW1hcnkgaW5jbHVkZS1zeXM/XQorICAobGV0IFtmaWx0ZXItZm4gKG1rLWluY2x1ZGUtc3lzLWZuIGluY2x1ZGUtc3lzPykKKyAgICAgICAgZW1pdHRlZCAoOmVtaXR0ZWQgc3RyZWFtLXN1bW1hcnkpCisgICAgICAgIGVtaXR0ZWQgKGludG8ge30gKGZvciBbW3dpbmRvdyBzdGF0XSBlbWl0dGVkXQorICAgICAgICAgICAgICAgICAgICAgICAgICAge3dpbmRvdyAoZmlsdGVyLWtleSBmaWx0ZXItZm4gc3RhdCl9KSkKKyAgICAgICAgdHJhbnNmZXJyZWQgKDp0cmFuc2ZlcnJlZCBzdHJlYW0tc3VtbWFyeSkKKyAgICAgICAgdHJhbnNmZXJyZWQgKGludG8ge30gKGZvciBbW3dpbmRvdyBzdGF0XSB0cmFuc2ZlcnJlZF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7d2luZG93IChmaWx0ZXIta2V5IGZpbHRlci1mbiBzdGF0KX0pKQorICAgICAgICBzdHJlYW0tc3VtbWFyeSAoLT4gc3RyZWFtLXN1bW1hcnkgKGRpc3NvYyA6ZW1pdHRlZCkgKGFzc29jIDplbWl0dGVkIGVtaXR0ZWQpKQorICAgICAgICBzdHJlYW0tc3VtbWFyeSAoLT4gc3RyZWFtLXN1bW1hcnkgKGRpc3NvYyA6dHJhbnNmZXJyZWQpIChhc3NvYyA6dHJhbnNmZXJyZWQgdHJhbnNmZXJyZWQpKV0KKyAgICBzdHJlYW0tc3VtbWFyeSkpCisKKyhkZWZuIGFnZ3JlZ2F0ZS1jb3VudHMKKyAgW2NvdW50cy1zZXFdCisgICgtPj4gY291bnRzLXNlcQorICAgICAgIChtYXAgY2xvanVyaWZ5LXN0cnVjdHVyZSkKKyAgICAgICAoYXBwbHkgbWVyZ2Utd2l0aAorICAgICAgICAgICAgICAoZm4gW3MxIHMyXQorICAgICAgICAgICAgICAgIChtZXJnZS13aXRoICsgczEgczIpKSkpKQorCisoZGVmbiBhZ2dyZWdhdGUtY29tbW9uLXN0YXRzCisgIFtzdGF0cy1zZXFdCisgIHs6ZW1pdHRlZCAoYWdncmVnYXRlLWNvdW50cyAobWFwICMoLmdldF9lbWl0dGVkIF5FeGVjdXRvclN0YXRzICUpIHN0YXRzLXNlcSkpCisgICA6dHJhbnNmZXJyZWQgKGFnZ3JlZ2F0ZS1jb3VudHMgKG1hcCAjKC5nZXRfdHJhbnNmZXJyZWQgXkV4ZWN1dG9yU3RhdHMgJSkgc3RhdHMtc2VxKSl9KQorCisoZGVmbiBhZ2dyZWdhdGUtYm9sdC1zdGF0cworICBbc3RhdHMtc2VxIGluY2x1ZGUtc3lzP10KKyAgKGxldCBbc3RhdHMtc2VxIChjb2xsZWN0aWZ5IHN0YXRzLXNlcSldCisgICAgKG1lcmdlIChwcmUtcHJvY2VzcyAoYWdncmVnYXRlLWNvbW1vbi1zdGF0cyBzdGF0cy1zZXEpIGluY2x1ZGUtc3lzPykKKyAgICAgICAgICAgezphY2tlZAorICAgICAgICAgICAgKGFnZ3JlZ2F0ZS1jb3VudHMgKG1hcCAjKC4uIF5FeGVjdXRvclN0YXRzICUgZ2V0X3NwZWNpZmljIGdldF9ib2x0IGdldF9hY2tlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHMtc2VxKSkKKyAgICAgICAgICAgIDpmYWlsZWQKKyAgICAgICAgICAgIChhZ2dyZWdhdGUtY291bnRzIChtYXAgIyguLiBeRXhlY3V0b3JTdGF0cyAlIGdldF9zcGVjaWZpYyBnZXRfYm9sdCBnZXRfZmFpbGVkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0cy1zZXEpKQorICAgICAgICAgICAgOmV4ZWN1dGVkCisgICAgICAgICAgICAoYWdncmVnYXRlLWNvdW50cyAobWFwICMoLi4gXkV4ZWN1dG9yU3RhdHMgJSBnZXRfc3BlY2lmaWMgZ2V0X2JvbHQgZ2V0X2V4ZWN1dGVkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0cy1zZXEpKQorICAgICAgICAgICAgOnByb2Nlc3MtbGF0ZW5jaWVzCisgICAgICAgICAgICAoYWdncmVnYXRlLWF2ZXJhZ2VzIChtYXAgIyguLiBeRXhlY3V0b3JTdGF0cyAlIGdldF9zcGVjaWZpYyBnZXRfYm9sdCBnZXRfcHJvY2Vzc19tc19hdmcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHMtc2VxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWFwICMoLi4gXkV4ZWN1dG9yU3RhdHMgJSBnZXRfc3BlY2lmaWMgZ2V0X2JvbHQgZ2V0X2Fja2VkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRzLXNlcSkpCisgICAgICAgICAgICA6ZXhlY3V0ZS1sYXRlbmNpZXMKKyAgICAgICAgICAgIChhZ2dyZWdhdGUtYXZlcmFnZXMgKG1hcCAjKC4uIF5FeGVjdXRvclN0YXRzICUgZ2V0X3NwZWNpZmljIGdldF9ib2x0IGdldF9leGVjdXRlX21zX2F2ZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0cy1zZXEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXAgIyguLiBeRXhlY3V0b3JTdGF0cyAlIGdldF9zcGVjaWZpYyBnZXRfYm9sdCBnZXRfZXhlY3V0ZWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHMtc2VxKSl9KSkpCisKKyhkZWZuIGFnZ3JlZ2F0ZS1zcG91dC1zdGF0cworICBbc3RhdHMtc2VxIGluY2x1ZGUtc3lzP10KKyAgKGxldCBbc3RhdHMtc2VxIChjb2xsZWN0aWZ5IHN0YXRzLXNlcSldCisgICAgKG1lcmdlIChwcmUtcHJvY2VzcyAoYWdncmVnYXRlLWNvbW1vbi1zdGF0cyBzdGF0cy1zZXEpIGluY2x1ZGUtc3lzPykKKyAgICAgICAgICAgezphY2tlZAorICAgICAgICAgICAgKGFnZ3JlZ2F0ZS1jb3VudHMgKG1hcCAjKC4uIF5FeGVjdXRvclN0YXRzICUgZ2V0X3NwZWNpZmljIGdldF9zcG91dCBnZXRfYWNrZWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRzLXNlcSkpCisgICAgICAgICAgICA6ZmFpbGVkCisgICAgICAgICAgICAoYWdncmVnYXRlLWNvdW50cyAobWFwICMoLi4gXkV4ZWN1dG9yU3RhdHMgJSBnZXRfc3BlY2lmaWMgZ2V0X3Nwb3V0IGdldF9mYWlsZWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRzLXNlcSkpCisgICAgICAgICAgICA6Y29tcGxldGUtbGF0ZW5jaWVzCisgICAgICAgICAgICAoYWdncmVnYXRlLWF2ZXJhZ2VzIChtYXAgIyguLiBeRXhlY3V0b3JTdGF0cyAlIGdldF9zcGVjaWZpYyBnZXRfc3BvdXQgZ2V0X2NvbXBsZXRlX21zX2F2ZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0cy1zZXEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXAgIyguLiBeRXhlY3V0b3JTdGF0cyAlIGdldF9zcGVjaWZpYyBnZXRfc3BvdXQgZ2V0X2Fja2VkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRzLXNlcSkpfSkpKQorCisoZGVmbiBnZXQtZmlsbGVkLXN0YXRzCisgIFtzdW1tc10KKyAgKC0+PiBzdW1tcworICAgICAgIChtYXAgIyguZ2V0X3N0YXRzIF5FeGVjdXRvclN1bW1hcnkgJSkpCisgICAgICAgKGZpbHRlciBub3QtbmlsPykpKQorCisoZGVmbiBhZ2dyZWdhdGUtc3BvdXQtc3RyZWFtcworICBbc3RhdHNdCisgIHs6YWNrZWQgKGFnZ3JlZ2F0ZS1jb3VudC1zdHJlYW1zICg6YWNrZWQgc3RhdHMpKQorICAgOmZhaWxlZCAoYWdncmVnYXRlLWNvdW50LXN0cmVhbXMgKDpmYWlsZWQgc3RhdHMpKQorICAgOmVtaXR0ZWQgKGFnZ3JlZ2F0ZS1jb3VudC1zdHJlYW1zICg6ZW1pdHRlZCBzdGF0cykpCisgICA6dHJhbnNmZXJyZWQgKGFnZ3JlZ2F0ZS1jb3VudC1zdHJlYW1zICg6dHJhbnNmZXJyZWQgc3RhdHMpKQorICAgOmNvbXBsZXRlLWxhdGVuY2llcyAoYWdncmVnYXRlLWF2Zy1zdHJlYW1zICg6Y29tcGxldGUtbGF0ZW5jaWVzIHN0YXRzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg6YWNrZWQgc3RhdHMpKX0pCisKKyhkZWZuIHNwb3V0LXN0cmVhbXMtc3RhdHMKKyAgW3N1bW1zIGluY2x1ZGUtc3lzP10KKyAgKGxldCBbc3RhdHMtc2VxIChnZXQtZmlsbGVkLXN0YXRzIHN1bW1zKV0KKyAgICAoYWdncmVnYXRlLXNwb3V0LXN0cmVhbXMKKyAgICAgIChhZ2dyZWdhdGUtc3BvdXQtc3RhdHMKKyAgICAgICAgc3RhdHMtc2VxIGluY2x1ZGUtc3lzPykpKSkKKworKGRlZm4gYWdncmVnYXRlLWJvbHQtc3RyZWFtcworICBbc3RhdHNdCisgIHs6YWNrZWQgKGFnZ3JlZ2F0ZS1jb3VudC1zdHJlYW1zICg6YWNrZWQgc3RhdHMpKQorICAgOmZhaWxlZCAoYWdncmVnYXRlLWNvdW50LXN0cmVhbXMgKDpmYWlsZWQgc3RhdHMpKQorICAgOmVtaXR0ZWQgKGFnZ3JlZ2F0ZS1jb3VudC1zdHJlYW1zICg6ZW1pdHRlZCBzdGF0cykpCisgICA6dHJhbnNmZXJyZWQgKGFnZ3JlZ2F0ZS1jb3VudC1zdHJlYW1zICg6dHJhbnNmZXJyZWQgc3RhdHMpKQorICAgOnByb2Nlc3MtbGF0ZW5jaWVzIChhZ2dyZWdhdGUtYXZnLXN0cmVhbXMgKDpwcm9jZXNzLWxhdGVuY2llcyBzdGF0cykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg6YWNrZWQgc3RhdHMpKQorICAgOmV4ZWN1dGVkIChhZ2dyZWdhdGUtY291bnQtc3RyZWFtcyAoOmV4ZWN1dGVkIHN0YXRzKSkKKyAgIDpleGVjdXRlLWxhdGVuY2llcyAoYWdncmVnYXRlLWF2Zy1zdHJlYW1zICg6ZXhlY3V0ZS1sYXRlbmNpZXMgc3RhdHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoOmV4ZWN1dGVkIHN0YXRzKSl9KQorCisoZGVmbiBjb21wdXRlLWV4ZWN1dG9yLWNhcGFjaXR5CisgIFteRXhlY3V0b3JTdW1tYXJ5IGVdCisgIChsZXQgW3N0YXRzICguZ2V0X3N0YXRzIGUpCisgICAgICAgIHN0YXRzIChpZiBzdGF0cworICAgICAgICAgICAgICAgICgtPiBzdGF0cworICAgICAgICAgICAgICAgICAgICAoYWdncmVnYXRlLWJvbHQtc3RhdHMgdHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgKGFnZ3JlZ2F0ZS1ib2x0LXN0cmVhbXMpCisgICAgICAgICAgICAgICAgICAgIHN3YXAtbWFwLW9yZGVyCisgICAgICAgICAgICAgICAgICAgIChnZXQgKHN0ciBURU4tTUlOLUlOLVNFQ09ORFMpKSkpCisgICAgICAgIHVwdGltZSAobmlsLXRvLXplcm8gKC5nZXRfdXB0aW1lX3NlY3MgZSkpCisgICAgICAgIHdpbmRvdyAoaWYgKDwgdXB0aW1lIFRFTi1NSU4tSU4tU0VDT05EUykgdXB0aW1lIFRFTi1NSU4tSU4tU0VDT05EUykKKyAgICAgICAgZXhlY3V0ZWQgKC0+IHN0YXRzIDpleGVjdXRlZCBuaWwtdG8temVybykKKyAgICAgICAgbGF0ZW5jeSAoLT4gc3RhdHMgOmV4ZWN1dGUtbGF0ZW5jaWVzIG5pbC10by16ZXJvKV0KKyAgICAoaWYgKD4gd2luZG93IDApCisgICAgICAoZGl2ICgqIGV4ZWN1dGVkIGxhdGVuY3kpICgqIDEwMDAgd2luZG93KSkpKSkKKworKGRlZm4gYm9sdC1zdHJlYW1zLXN0YXRzCisgIFtzdW1tcyBpbmNsdWRlLXN5cz9dCisgIChsZXQgW3N0YXRzLXNlcSAoZ2V0LWZpbGxlZC1zdGF0cyBzdW1tcyldCisgICAgKGFnZ3JlZ2F0ZS1ib2x0LXN0cmVhbXMKKyAgICAgIChhZ2dyZWdhdGUtYm9sdC1zdGF0cworICAgICAgICBzdGF0cy1zZXEgaW5jbHVkZS1zeXM/KSkpKQorCisoZGVmbiB0b3RhbC1hZ2dyZWdhdGUtc3RhdHMKKyAgW3Nwb3V0LXN1bW1zIGJvbHQtc3VtbXMgaW5jbHVkZS1zeXM/XQorICAobGV0IFtzcG91dC1zdGF0cyAoZ2V0LWZpbGxlZC1zdGF0cyBzcG91dC1zdW1tcykKKyAgICAgICAgYm9sdC1zdGF0cyAoZ2V0LWZpbGxlZC1zdGF0cyBib2x0LXN1bW1zKQorICAgICAgICBhZ2ctc3BvdXQtc3RhdHMgKC0+IHNwb3V0LXN0YXRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFnZ3JlZ2F0ZS1zcG91dC1zdGF0cyBpbmNsdWRlLXN5cz8pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdncmVnYXRlLXNwb3V0LXN0cmVhbXMpCisgICAgICAgIGFnZy1ib2x0LXN0YXRzICgtPiBib2x0LXN0YXRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWdncmVnYXRlLWJvbHQtc3RhdHMgaW5jbHVkZS1zeXM/KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdncmVnYXRlLWJvbHQtc3RyZWFtcyldCisgICAgKG1lcmdlLXdpdGgKKyAgICAgIChmbiBbczEgczJdCisgICAgICAgIChtZXJnZS13aXRoICsgczEgczIpKQorICAgICAgKHNlbGVjdC1rZXlzCisgICAgICAgIGFnZy1ib2x0LXN0YXRzCisgICAgICAgIDs7IEluY2x1ZGUgb25seSBrZXlzIHRoYXQgd2lsbCBiZSB1c2VkLiAgV2Ugd2FudCB0byBjb3VudCBhY2tlZCBhbmQKKyAgICAgICAgOzsgZmFpbGVkIG9ubHkgZm9yIHRoZSAidHVwbGUgdHJlZXMsIiBzbyB3ZSBkbyBub3QgaW5jbHVkZSB0aG9zZSBrZXlzCisgICAgICAgIDs7IGZyb20gdGhlIGJvbHQgZXhlY3V0b3JzLgorICAgICAgICBbOmVtaXR0ZWQgOnRyYW5zZmVycmVkXSkKKyAgICAgIGFnZy1zcG91dC1zdGF0cykpKQorCisoZGVmbiBlcnJvci1zdWJzZXQKKyAgW2Vycm9yLXN0cl0KKyAgKGFwcGx5IHN0ciAodGFrZSAyMDAgZXJyb3Itc3RyKSkpCisKKyhkZWZuIG1vc3QtcmVjZW50LWVycm9yCisgIFtlcnJvcnMtbGlzdF0KKyAgKGxldCBbZXJyb3IgKC0+PiBlcnJvcnMtbGlzdAorICAgICAgICAgICAgICAgICAgIChzb3J0LWJ5ICMoLmdldF9lcnJvcl90aW1lX3NlY3MgXkVycm9ySW5mbyAlKSkKKyAgICAgICAgICAgICAgICAgICByZXZlcnNlCisgICAgICAgICAgICAgICAgICAgZmlyc3QpXQorICAgIChpZiBlcnJvcgorICAgICAgKGVycm9yLXN1YnNldCAoLmdldF9lcnJvciBeRXJyb3JJbmZvIGVycm9yKSkKKyAgICAgICIiKSkpCisKKyhkZWZuIGZsb2F0LXN0ciBbbl0KKyAgKGlmIG4KKyAgICAoZm9ybWF0ICIlLjNmIiAoZmxvYXQgbikpCisgICAgIjAiKSkKKworKGRlZm4gY29tcHV0ZS1ib2x0LWNhcGFjaXR5CisgIFtleGVjdXRvcnNdCisgICgtPj4gZXhlY3V0b3JzCisgICAgICAgKG1hcCBjb21wdXRlLWV4ZWN1dG9yLWNhcGFjaXR5KQorICAgICAgIChtYXAgbmlsLXRvLXplcm8pCisgICAgICAgKGFwcGx5IG1heCkpKQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvY2xqL2JhY2t0eXBlL3N0b3JtL3Rlc3RpbmcuY2xqIGIvc3Rvcm0tY29yZS9zcmMvY2xqL2JhY2t0eXBlL3N0b3JtL3Rlc3RpbmcuY2xqCmluZGV4IGIwYzY2MzcuLjJjOThiMDcgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2Nsai9iYWNrdHlwZS9zdG9ybS90ZXN0aW5nLmNsagorKysgYi9zdG9ybS1jb3JlL3NyYy9jbGovYmFja3R5cGUvc3Rvcm0vdGVzdGluZy5jbGoKQEAgLTI4MSwyNSArMjgxLDQyIEBACiAgICAgKHRocm93IChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uICJUb3BvbG9neSBjb25mIGlzIG5vdCBqc29uLXNlcmlhbGl6YWJsZSIpKSkKICAgKC5zdWJtaXRUb3BvbG9neVdpdGhPcHRzIG5pbWJ1cyBzdG9ybS1uYW1lIG5pbCAodG8tanNvbiBjb25mKSB0b3BvbG9neSBzdWJtaXQtb3B0cykpCiAKLShkZWZuIG1vY2tlZC1jb21wdXRlLW5ldy10b3BvbG9neS0+ZXhlY3V0b3ItPm5vZGUrcG9ydCBbc3Rvcm0tbmFtZSBleGVjdXRvci0+bm9kZStwb3J0XQotICAoZm4gW25pbWJ1cyBleGlzdGluZy1hc3NpZ25tZW50cyB0b3BvbG9naWVzIHNjcmF0Y2gtdG9wb2xvZ3ktaWRdCi0gICAgKGxldCBbdG9wb2xvZ3kgKC5nZXRCeU5hbWUgdG9wb2xvZ2llcyBzdG9ybS1uYW1lKQotICAgICAgICAgIHRvcG9sb2d5LWlkICguZ2V0SWQgdG9wb2xvZ3kpCisoZGVmbiBtb2NrZWQtY29udmVydC1hc3NpZ25tZW50cy10by13b3JrZXItPnJlc291cmNlcyBbc3Rvcm0tY2x1c3Rlci1zdGF0ZSBzdG9ybS1uYW1lIHdvcmtlci0+cmVzb3VyY2VzXQorICAoZm4gW2V4aXN0aW5nLWFzc2lnbm1lbnRzXQorICAgIChsZXQgW3RvcG9sb2d5LWlkIChjb21tb24vZ2V0LXN0b3JtLWlkIHN0b3JtLWNsdXN0ZXItc3RhdGUgc3Rvcm0tbmFtZSkKKyAgICAgICAgICBleGlzdGluZy1hc3NpZ25tZW50cyAoaW50byB7fSAoZm9yIFtbdGlkIGFzc2lnbm1lbnRdIGV4aXN0aW5nLWFzc2lnbm1lbnRzXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3RpZCAoOndvcmtlci0+cmVzb3VyY2VzIGFzc2lnbm1lbnQpfSkpCisgICAgICAgICAgbmV3LWFzc2lnbm1lbnRzIChhc3NvYyBleGlzdGluZy1hc3NpZ25tZW50cyB0b3BvbG9neS1pZCB3b3JrZXItPnJlc291cmNlcyldCisgICAgICBuZXctYXNzaWdubWVudHMpKSkKKworKGRlZm4gbW9ja2VkLWNvbXB1dGUtbmV3LXRvcG9sb2d5LT5leGVjdXRvci0+bm9kZStwb3J0IFtzdG9ybS1jbHVzdGVyLXN0YXRlIHN0b3JtLW5hbWUgZXhlY3V0b3ItPm5vZGUrcG9ydF0KKyAgKGZuIFtuZXctc2NoZWR1bGVyLWFzc2lnbm1lbnRzIGV4aXN0aW5nLWFzc2lnbm1lbnRzXQorICAgIChsZXQgW3RvcG9sb2d5LWlkIChjb21tb24vZ2V0LXN0b3JtLWlkIHN0b3JtLWNsdXN0ZXItc3RhdGUgc3Rvcm0tbmFtZSkKICAgICAgICAgICBleGlzdGluZy1hc3NpZ25tZW50cyAoaW50byB7fSAoZm9yIFtbdGlkIGFzc2lnbm1lbnRdIGV4aXN0aW5nLWFzc2lnbm1lbnRzXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3RpZCAoOmV4ZWN1dG9yLT5ub2RlK3BvcnQgYXNzaWdubWVudCl9KSkKICAgICAgICAgICBuZXctYXNzaWdubWVudHMgKGFzc29jIGV4aXN0aW5nLWFzc2lnbm1lbnRzIHRvcG9sb2d5LWlkIGV4ZWN1dG9yLT5ub2RlK3BvcnQpXQogICAgICAgbmV3LWFzc2lnbm1lbnRzKSkpCiAKKyhkZWZuIG1vY2tlZC1jb21wdXRlLW5ldy1zY2hlZHVsZXItYXNzaWdubWVudHMgW10KKyAgKGZuIFtuaW1idXMgZXhpc3RpbmctYXNzaWdubWVudHMgdG9wb2xvZ2llcyBzY3JhdGNoLXRvcG9sb2d5LWlkXQorICAgIGV4aXN0aW5nLWFzc2lnbm1lbnRzKSkKKwogKGRlZm4gc3VibWl0LW1vY2tlZC1hc3NpZ25tZW50Ci0gIFtuaW1idXMgc3Rvcm0tbmFtZSBjb25mIHRvcG9sb2d5IHRhc2stPmNvbXBvbmVudCBleGVjdXRvci0+bm9kZStwb3J0XQorICBbbmltYnVzIHN0b3JtLWNsdXN0ZXItc3RhdGUgc3Rvcm0tbmFtZSBjb25mIHRvcG9sb2d5IHRhc2stPmNvbXBvbmVudCBleGVjdXRvci0+bm9kZStwb3J0IHdvcmtlci0+cmVzb3VyY2VzXQogICAod2l0aC12YXItcm9vdHMgW2NvbW1vbi9zdG9ybS10YXNrLWluZm8gKGZuIFsmIGlnbm9yZWRdIHRhc2stPmNvbXBvbmVudCkKKyAgICAgICAgICAgICAgICAgICBuaW1idXMvY29tcHV0ZS1uZXctc2NoZWR1bGVyLWFzc2lnbm1lbnRzIChtb2NrZWQtY29tcHV0ZS1uZXctc2NoZWR1bGVyLWFzc2lnbm1lbnRzKQorICAgICAgICAgICAgICAgICAgIG5pbWJ1cy9jb252ZXJ0LWFzc2lnbm1lbnRzLXRvLXdvcmtlci0+cmVzb3VyY2VzIChtb2NrZWQtY29udmVydC1hc3NpZ25tZW50cy10by13b3JrZXItPnJlc291cmNlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JtLWNsdXN0ZXItc3RhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9ybS1uYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VyLT5yZXNvdXJjZXMpCiAgICAgICAgICAgICAgICAgICAgbmltYnVzL2NvbXB1dGUtbmV3LXRvcG9sb2d5LT5leGVjdXRvci0+bm9kZStwb3J0IChtb2NrZWQtY29tcHV0ZS1uZXctdG9wb2xvZ3ktPmV4ZWN1dG9yLT5ub2RlK3BvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9ybS1jbHVzdGVyLXN0YXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rvcm0tbmFtZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dG9yLT5ub2RlK3BvcnQpXQotICAgICAgICAgICAgICAgICAgKHN1Ym1pdC1sb2NhbC10b3BvbG9neSBuaW1idXMgc3Rvcm0tbmFtZSBjb25mIHRvcG9sb2d5KSkpCisgICAgKHN1Ym1pdC1sb2NhbC10b3BvbG9neSBuaW1idXMgc3Rvcm0tbmFtZSBjb25mIHRvcG9sb2d5KSkpCiAKIChkZWZuIG1rLWNhcHR1cmUtbGF1bmNoLWZuIFtjYXB0dXJlLWF0b21dCi0gIChmbiBbc3VwZXJ2aXNvciBzdG9ybS1pZCBwb3J0IHdvcmtlci1pZF0KKyAgKGZuIFtzdXBlcnZpc29yIHN0b3JtLWlkIHBvcnQgd29ya2VyLWlkIG1lbS1vbmhlYXBdCiAgICAgKGxldCBbc3VwZXJ2aXNvci1pZCAoOnN1cGVydmlzb3ItaWQgc3VwZXJ2aXNvcikKICAgICAgICAgICBjb25mICg6Y29uZiBzdXBlcnZpc29yKQogICAgICAgICAgIGV4aXN0aW5nIChnZXQgQGNhcHR1cmUtYXRvbSBbc3VwZXJ2aXNvci1pZCBwb3J0XSBbXSldCkBAIC00OTgsNiArNTE1LDcgQEAKICAgICAgIChzdGFydHVwIHNwb3V0KSkKIAogICAgIChzdWJtaXQtbG9jYWwtdG9wb2xvZ3kgKDpuaW1idXMgY2x1c3Rlci1tYXApIHN0b3JtLW5hbWUgc3Rvcm0tY29uZiB0b3BvbG9neSkKKyAgICAoYWR2YW5jZS1jbHVzdGVyLXRpbWUgY2x1c3Rlci1tYXAgMTEpCiAKICAgICAobGV0IFtzdG9ybS1pZCAoY29tbW9uL2dldC1zdG9ybS1pZCBzdGF0ZSBzdG9ybS1uYW1lKV0KICAgICAgIDs7R2l2ZSB0aGUgdG9wb2xvZ3kgdGltZSB0byBjb21lIHVwIHdpdGhvdXQgdXNpbmcgaXQgdG8gd2FpdCBmb3IgdGhlIHNwb3V0cyB0byBjb21wbGV0ZQpAQCAtNTk0LDcgKzYxMiw3IEBACiAgICAgICAgICAgICAgICAgOzsgKGxvZy1tZXNzYWdlICJUcmFuc2ZlcnJpbmc6ICIgdHJhbnNmZXItYXJncyMpCiAgICAgICAgICAgICAgICAgKGluY3JlbWVudC1nbG9iYWwhIGlkIyAidHJhbnNmZXJyZWQiIDEpCiAgICAgICAgICAgICAgICAgKGFwcGx5IHRyYW5zZmVycmVyIyBhcmdzMiMpKSkpKV0KLSAgICAgICAod2l0aC1sb2NhbC1jbHVzdGVyIFt+Y2x1c3Rlci1zeW0gfkBjbHVzdGVyLWFyZ3NdCisgICAgICAgKHdpdGgtc2ltdWxhdGVkLXRpbWUtbG9jYWwtY2x1c3RlciBbfmNsdXN0ZXItc3ltIH5AY2x1c3Rlci1hcmdzXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxldCBbfmNsdXN0ZXItc3ltIChhc3NvYy10cmFjay1pZCB+Y2x1c3Rlci1zeW0gaWQjKV0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfkBib2R5KSkpCiAgICAgIChSZWdpc3RlcmVkR2xvYmFsU3RhdGUvY2xlYXJTdGF0ZSBpZCMpKSkKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2Nsai9iYWNrdHlwZS9zdG9ybS90aW1lci5jbGogYi9zdG9ybS1jb3JlL3NyYy9jbGovYmFja3R5cGUvc3Rvcm0vdGltZXIuY2xqCmluZGV4IDJjNzZjZTIuLmI1ZjczZjcgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2Nsai9iYWNrdHlwZS9zdG9ybS90aW1lci5jbGoKKysrIGIvc3Rvcm0tY29yZS9zcmMvY2xqL2JhY2t0eXBlL3N0b3JtL3RpbWVyLmNsagpAQCAtMTYsNyArMTYsNyBAQAogCiAobnMgYmFja3R5cGUuc3Rvcm0udGltZXIKICAgKDppbXBvcnQgW2JhY2t0eXBlLnN0b3JtLnV0aWxzIFRpbWVdKQotICAoOmltcG9ydCBbamF2YS51dGlsIFByaW9yaXR5UXVldWUgQ29tcGFyYXRvcl0pCisgICg6aW1wb3J0IFtqYXZhLnV0aWwgUHJpb3JpdHlRdWV1ZSBDb21wYXJhdG9yIFJhbmRvbV0pCiAgICg6aW1wb3J0IFtqYXZhLnV0aWwuY29uY3VycmVudCBTZW1hcGhvcmVdKQogICAoOnVzZSBbYmFja3R5cGUuc3Rvcm0gdXRpbCBsb2ddKSkKIApAQCAtNzksNiArNzksNyBAQAogICAgICA6cXVldWUgcXVldWUKICAgICAgOmFjdGl2ZSBhY3RpdmUKICAgICAgOmxvY2sgbG9jaworICAgICA6cmFuZG9tIChSYW5kb20uKQogICAgICA6Y2FuY2VsLW5vdGlmaWVyIG5vdGlmaWVyfSkpCiAKIChkZWZuLSBjaGVjay1hY3RpdmUhCkBAIC04NywxMiArODgsMTQgQEAKICAgICAodGhyb3cgKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbi4gIlRpbWVyIGlzIG5vdCBhY3RpdmUiKSkpKQogCiAoZGVmbmsgc2NoZWR1bGUKLSAgW3RpbWVyIGRlbGF5LXNlY3MgYWZuIDpjaGVjay1hY3RpdmUgdHJ1ZV0KKyAgW3RpbWVyIGRlbGF5LXNlY3MgYWZuIDpjaGVjay1hY3RpdmUgdHJ1ZSA6aml0dGVyLW1zIDBdCiAgICh3aGVuIGNoZWNrLWFjdGl2ZSAoY2hlY2stYWN0aXZlISB0aW1lcikpCiAgIChsZXQgW2lkICh1dWlkKQotICAgICAgICBeUHJpb3JpdHlRdWV1ZSBxdWV1ZSAoOnF1ZXVlIHRpbWVyKV0KKyAgICAgICAgXlByaW9yaXR5UXVldWUgcXVldWUgKDpxdWV1ZSB0aW1lcikKKyAgICAgICAgZW5kLXRpbWUtbXMgKCsgKGN1cnJlbnQtdGltZS1taWxsaXMpIChzZWNzLXRvLW1pbGxpcy1sb25nIGRlbGF5LXNlY3MpKQorICAgICAgICBlbmQtdGltZS1tcyAoaWYgKDwgMCBqaXR0ZXItbXMpICgrICgubmV4dEludCAoOnJhbmRvbSB0aW1lcikgaml0dGVyLW1zKSBlbmQtdGltZS1tcykgZW5kLXRpbWUtbXMpXQogICAgIChsb2NraW5nICg6bG9jayB0aW1lcikKLSAgICAgICguYWRkIHF1ZXVlIFsoKyAoY3VycmVudC10aW1lLW1pbGxpcykgKHNlY3MtdG8tbWlsbGlzLWxvbmcgZGVsYXktc2VjcykpIGFmbiBpZF0pKSkpCisgICAgICAoLmFkZCBxdWV1ZSBbZW5kLXRpbWUtbXMgYWZuIGlkXSkpKSkKIAogKGRlZm4gc2NoZWR1bGUtcmVjdXJyaW5nCiAgIFt0aW1lciBkZWxheS1zZWNzIHJlY3VyLXNlY3MgYWZuXQpAQCAtMTAzLDYgKzEwNiwxNSBAQAogICAgICAgICAgICAgICA7IFRoaXMgYXZvaWRzIGEgcmFjZSBjb25kaXRpb24gd2l0aCBjYW5jZWwtdGltZXIuCiAgICAgICAgICAgICAgIChzY2hlZHVsZSB0aW1lciByZWN1ci1zZWNzIHRoaXMgOmNoZWNrLWFjdGl2ZSBmYWxzZSkpKSkKIAorKGRlZm4gc2NoZWR1bGUtcmVjdXJyaW5nLXdpdGgtaml0dGVyCisgIFt0aW1lciBkZWxheS1zZWNzIHJlY3VyLXNlY3Mgaml0dGVyLW1zIGFmbl0KKyAgKHNjaGVkdWxlIHRpbWVyCisgICAgICAgICAgICBkZWxheS1zZWNzCisgICAgICAgICAgICAoZm4gdGhpcyBbXQorICAgICAgICAgICAgICAoYWZuKQorICAgICAgICAgICAgICA7IFRoaXMgYXZvaWRzIGEgcmFjZSBjb25kaXRpb24gd2l0aCBjYW5jZWwtdGltZXIuCisgICAgICAgICAgICAgIChzY2hlZHVsZSB0aW1lciByZWN1ci1zZWNzIHRoaXMgOmNoZWNrLWFjdGl2ZSBmYWxzZSA6aml0dGVyLW1zIGppdHRlci1tcykpKSkKKwogKGRlZm4gY2FuY2VsLXRpbWVyCiAgIFt0aW1lcl0KICAgKGNoZWNrLWFjdGl2ZSEgdGltZXIpCmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9jbGovYmFja3R5cGUvc3Rvcm0vdWkvY29yZS5jbGogYi9zdG9ybS1jb3JlL3NyYy9jbGovYmFja3R5cGUvc3Rvcm0vdWkvY29yZS5jbGoKaW5kZXggNDE0YmZiMS4uY2M2NjMyYSAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvY2xqL2JhY2t0eXBlL3N0b3JtL3VpL2NvcmUuY2xqCisrKyBiL3N0b3JtLWNvcmUvc3JjL2Nsai9iYWNrdHlwZS9zdG9ybS91aS9jb3JlLmNsagpAQCAtMjEsNDMgKzIxLDY3IEBACiAgICAgICAgIHJpbmcubWlkZGxld2FyZS5tdWx0aXBhcnQtcGFyYW1zKQogICAoOnVzZSBbcmluZy5taWRkbGV3YXJlLmpzb24gOm9ubHkgW3dyYXAtanNvbi1wYXJhbXNdXSkKICAgKDp1c2UgW2hpY2N1cCBjb3JlIHBhZ2UtaGVscGVyc10pCi0gICg6dXNlIFtiYWNrdHlwZS5zdG9ybSBjb25maWcgdXRpbCBsb2cgdHVwbGUgem9va2VlcGVyXSkKKyAgKDp1c2UgW2JhY2t0eXBlLnN0b3JtIGNvbmZpZyB1dGlsIGxvZyBzdGF0cyB0dXBsZSB6b29rZWVwZXIgY29udmVydGVyXSkKICAgKDp1c2UgW2JhY2t0eXBlLnN0b3JtLnVpIGhlbHBlcnNdKQogICAoOnVzZSBbYmFja3R5cGUuc3Rvcm0uZGFlbW9uIFtjb21tb24gOm9ubHkgW0FDS0VSLUNPTVBPTkVOVC1JRCBBQ0tFUi1JTklULVNUUkVBTS1JRCBBQ0tFUi1BQ0stU1RSRUFNLUlECi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNLRVItRkFJTC1TVFJFQU0tSUQgc3lzdGVtLWlkPyBtay1hdXRob3JpemF0aW9uLWhhbmRsZXJdXV0pCi0gICg6dXNlIFtjbG9qdXJlLnN0cmluZyA6b25seSBbYmxhbms/IGxvd2VyLWNhc2UgdHJpbV1dKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDS0VSLUZBSUwtU1RSRUFNLUlEIG1rLWF1dGhvcml6YXRpb24taGFuZGxlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LW1ldHJpY3MtcmVwb3J0ZXJzXV1dKQogICAoOmltcG9ydCBbYmFja3R5cGUuc3Rvcm0udXRpbHMgVXRpbHNdCiAgICAgICAgICAgIFtiYWNrdHlwZS5zdG9ybS5nZW5lcmF0ZWQgTmltYnVzU3VtbWFyeV0pCisgICg6dXNlIFtjbG9qdXJlLnN0cmluZyA6b25seSBbYmxhbms/IGxvd2VyLWNhc2UgdHJpbSBzcGxpdF1dKQogICAoOmltcG9ydCBbYmFja3R5cGUuc3Rvcm0uZ2VuZXJhdGVkIEV4ZWN1dG9yU3BlY2lmaWNTdGF0cwogICAgICAgICAgICAgRXhlY3V0b3JTdGF0cyBFeGVjdXRvclN1bW1hcnkgRXhlY3V0b3JJbmZvIFRvcG9sb2d5SW5mbyBTcG91dFN0YXRzIEJvbHRTdGF0cwogICAgICAgICAgICAgRXJyb3JJbmZvIENsdXN0ZXJTdW1tYXJ5IFN1cGVydmlzb3JTdW1tYXJ5IFRvcG9sb2d5U3VtbWFyeQogICAgICAgICAgICAgTmltYnVzJENsaWVudCBTdG9ybVRvcG9sb2d5IEdsb2JhbFN0cmVhbUlkIFJlYmFsYW5jZU9wdGlvbnMKLSAgICAgICAgICAgIEtpbGxPcHRpb25zIEdldEluZm9PcHRpb25zIE51bUVycm9yc0Nob2ljZSBEZWJ1Z09wdGlvbnNdKQorICAgICAgICAgICAgS2lsbE9wdGlvbnMgR2V0SW5mb09wdGlvbnMgTnVtRXJyb3JzQ2hvaWNlIERlYnVnT3B0aW9ucyBUb3BvbG9neVBhZ2VJbmZvCisgICAgICAgICAgICBUb3BvbG9neVN0YXRzIENvbW1vbkFnZ3JlZ2F0ZVN0YXRzIENvbXBvbmVudEFnZ3JlZ2F0ZVN0YXRzCisgICAgICAgICAgICBDb21wb25lbnRUeXBlIEJvbHRBZ2dyZWdhdGVTdGF0cyBTcG91dEFnZ3JlZ2F0ZVN0YXRzCisgICAgICAgICAgICBFeGVjdXRvckFnZ3JlZ2F0ZVN0YXRzIFNwZWNpZmljQWdncmVnYXRlU3RhdHMgQ29tcG9uZW50UGFnZUluZm8KKyAgICAgICAgICAgIExvZ0NvbmZpZyBMb2dMZXZlbCBMb2dMZXZlbEFjdGlvbl0pCiAgICg6aW1wb3J0IFtiYWNrdHlwZS5zdG9ybS5zZWN1cml0eS5hdXRoIEF1dGhVdGlscyBSZXFDb250ZXh0XSkKLSAgKDppbXBvcnQgW2JhY2t0eXBlLnN0b3JtLmdlbmVyYXRlZCBBdXRob3JpemF0aW9uRXhjZXB0aW9uXSkKKyAgKDppbXBvcnQgW2JhY2t0eXBlLnN0b3JtLmdlbmVyYXRlZCBBdXRob3JpemF0aW9uRXhjZXB0aW9uIFByb2ZpbGVSZXF1ZXN0IFByb2ZpbGVBY3Rpb24gTm9kZUluZm9dKQogICAoOmltcG9ydCBbYmFja3R5cGUuc3Rvcm0uc2VjdXJpdHkuYXV0aCBBdXRoVXRpbHNdKQogICAoOmltcG9ydCBbYmFja3R5cGUuc3Rvcm0udXRpbHMgVmVyc2lvbkluZm9dKQorICAoOmltcG9ydCBbYmFja3R5cGUuc3Rvcm0gQ29uZmlnXSkKICAgKDppbXBvcnQgW2phdmEuaW8gRmlsZV0pCiAgICg6cmVxdWlyZSBbY29tcG9qdXJlLnJvdXRlIDphcyByb3V0ZV0KICAgICAgICAgICAgIFtjb21wb2p1cmUuaGFuZGxlciA6YXMgaGFuZGxlcl0KICAgICAgICAgICAgIFtyaW5nLnV0aWwucmVzcG9uc2UgOmFzIHJlc3BdCiAgICAgICAgICAgICBbYmFja3R5cGUuc3Rvcm0gW3RocmlmdCA6YXMgdGhyaWZ0XV0pCisgICg6cmVxdWlyZSBbbWV0cmljcy5tZXRlcnMgOnJlZmVyIFtkZWZtZXRlciBtYXJrIV1dKQogICAoOmltcG9ydCBbb3JnLmFwYWNoZS5jb21tb25zLmxhbmcgU3RyaW5nRXNjYXBlVXRpbHNdKQorICAoOmltcG9ydCBbb3JnLmFwYWNoZS5sb2dnaW5nLmxvZzRqIExldmVsXSkKICAgKDpnZW4tY2xhc3MpKQogCiAoZGVmIF46ZHluYW1pYyAqU1RPUk0tQ09ORiogKHJlYWQtc3Rvcm0tY29uZmlnKSkKIChkZWYgXjpkeW5hbWljICpVSS1BQ0wtSEFORExFUiogKG1rLWF1dGhvcml6YXRpb24taGFuZGxlciAoKlNUT1JNLUNPTkYqIE5JTUJVUy1BVVRIT1JJWkVSKSAqU1RPUk0tQ09ORiopKQogKGRlZiBeOmR5bmFtaWMgKlVJLUlNUEVSU09OQVRJT04tSEFORExFUiogKG1rLWF1dGhvcml6YXRpb24taGFuZGxlciAoKlNUT1JNLUNPTkYqIE5JTUJVUy1JTVBFUlNPTkFUSU9OLUFVVEhPUklaRVIpICpTVE9STS1DT05GKikpCi0KIChkZWYgaHR0cC1jcmVkcy1oYW5kbGVyIChBdXRoVXRpbHMvR2V0VWlIdHRwQ3JlZGVudGlhbHNQbHVnaW4gKlNUT1JNLUNPTkYqKSkKIAotKGRlZm4gYXNzZXJ0LWF1dGhvcml6ZWQtdXNlcgotICAoW3NlcnZsZXQtcmVxdWVzdCBvcF0KLSAgICAoYXNzZXJ0LWF1dGhvcml6ZWQtdXNlciBzZXJ2bGV0LXJlcXVlc3Qgb3AgbmlsKSkKLSAgKFtzZXJ2bGV0LXJlcXVlc3Qgb3AgdG9wb2xvZ3ktY29uZl0KLSAgICAobGV0IFtjb250ZXh0IChSZXFDb250ZXh0L2NvbnRleHQpXQotICAgICAgKGlmIGh0dHAtY3JlZHMtaGFuZGxlciAoLnBvcHVsYXRlQ29udGV4dCBodHRwLWNyZWRzLWhhbmRsZXIgY29udGV4dCBzZXJ2bGV0LXJlcXVlc3QpKQorKGRlZm1ldGVyIHVpOm51bS1jbHVzdGVyLWNvbmZpZ3VyYXRpb24taHR0cC1yZXF1ZXN0cykKKyhkZWZtZXRlciB1aTpudW0tY2x1c3Rlci1zdW1tYXJ5LWh0dHAtcmVxdWVzdHMpCisoZGVmbWV0ZXIgdWk6bnVtLW5pbWJ1cy1zdW1tYXJ5LWh0dHAtcmVxdWVzdHMpCisoZGVmbWV0ZXIgdWk6bnVtLXN1cGVydmlzb3Itc3VtbWFyeS1odHRwLXJlcXVlc3RzKQorKGRlZm1ldGVyIHVpOm51bS1hbGwtdG9wb2xvZ2llcy1zdW1tYXJ5LWh0dHAtcmVxdWVzdHMpCisoZGVmbWV0ZXIgdWk6bnVtLXRvcG9sb2d5LXBhZ2UtaHR0cC1yZXF1ZXN0cykKKyhkZWZtZXRlciB1aTpudW0tYnVpbGQtdmlzdWFsaXphdGlvbi1odHRwLXJlcXVlc3RzKQorKGRlZm1ldGVyIHVpOm51bS1tay12aXN1YWxpemF0aW9uLWRhdGEtaHR0cC1yZXF1ZXN0cykKKyhkZWZtZXRlciB1aTpudW0tY29tcG9uZW50LXBhZ2UtaHR0cC1yZXF1ZXN0cykKKyhkZWZtZXRlciB1aTpudW0tbG9nLWNvbmZpZy1odHRwLXJlcXVlc3RzKQorKGRlZm1ldGVyIHVpOm51bS1hY3RpdmF0ZS10b3BvbG9neS1odHRwLXJlcXVlc3RzKQorKGRlZm1ldGVyIHVpOm51bS1kZWFjdGl2YXRlLXRvcG9sb2d5LWh0dHAtcmVxdWVzdHMpCisoZGVmbWV0ZXIgdWk6bnVtLWRlYnVnLXRvcG9sb2d5LWh0dHAtcmVxdWVzdHMpCisoZGVmbWV0ZXIgdWk6bnVtLWNvbXBvbmVudC1vcC1yZXNwb25zZS1odHRwLXJlcXVlc3RzKQorKGRlZm1ldGVyIHVpOm51bS10b3BvbG9neS1vcC1yZXNwb25zZS1odHRwLXJlcXVlc3RzKQorKGRlZm1ldGVyIHVpOm51bS10b3BvbG9neS1vcC1yZXNwb25zZS1odHRwLXJlcXVlc3RzKQorKGRlZm1ldGVyIHVpOm51bS10b3BvbG9neS1vcC1yZXNwb25zZS1odHRwLXJlcXVlc3RzKQorKGRlZm1ldGVyIHVpOm51bS1tYWluLXBhZ2UtaHR0cC1yZXF1ZXN0cykKIAorKGRlZm4gYXNzZXJ0LWF1dGhvcml6ZWQtdXNlcgorICAoW29wXQorICAgIChhc3NlcnQtYXV0aG9yaXplZC11c2VyIG9wIG5pbCkpCisgIChbb3AgdG9wb2xvZ3ktY29uZl0KKyAgICAobGV0IFtjb250ZXh0IChSZXFDb250ZXh0L2NvbnRleHQpXQogICAgICAgKGlmICguaXNJbXBlcnNvbmF0aW5nIGNvbnRleHQpCiAgICAgICAgIChpZiAqVUktSU1QRVJTT05BVElPTi1IQU5ETEVSKgogICAgICAgICAgICAgKGlmLW5vdCAoLnBlcm1pdCAqVUktSU1QRVJTT05BVElPTi1IQU5ETEVSKiBjb250ZXh0IG9wIHRvcG9sb2d5LWNvbmYpCkBAIC04MCw5NCArMTA0LDE4IEBACiAgICAgICAgICAgICh0aHJvdyAoQXV0aG9yaXphdGlvbkV4Y2VwdGlvbi4KICAgICAgICAgICAgICAgICAgICAoc3RyICJVSSByZXF1ZXN0ICciIG9wICInIGZvciAnIiB1c2VyICInIHVzZXIgaXMgbm90IGF1dGhvcml6ZWQiKSkpKSkpKSkpCiAKLShkZWZuIGdldC1maWxsZWQtc3RhdHMKLSAgW3N1bW1zXQotICAoLT4+IHN1bW1zCi0gICAgICAgKG1hcCAjKC5nZXRfc3RhdHMgXkV4ZWN1dG9yU3VtbWFyeSAlKSkKLSAgICAgICAoZmlsdGVyIG5vdC1uaWw/KSkpCiAKLShkZWZuIGNvbXBvbmVudC10eXBlCi0gICJSZXR1cm5zIHRoZSBjb21wb25lbnQgdHlwZSAoZWl0aGVyIDpib2x0IG9yIDpzcG91dCkgZm9yIGEgZ2l2ZW4KLSAgdG9wb2xvZ3kgYW5kIGNvbXBvbmVudCBpZC4gUmV0dXJucyBuaWwgaWYgbm90IGZvdW5kLiIKLSAgW15TdG9ybVRvcG9sb2d5IHRvcG9sb2d5IGlkXQotICAobGV0IFtib2x0cyAoLmdldF9ib2x0cyB0b3BvbG9neSkKLSAgICAgICAgc3BvdXRzICguZ2V0X3Nwb3V0cyB0b3BvbG9neSldCi0gICAgKGNvbmQKLSAgICAgICguY29udGFpbnNLZXkgYm9sdHMgaWQpIDpib2x0Ci0gICAgICAoLmNvbnRhaW5zS2V5IHNwb3V0cyBpZCkgOnNwb3V0KSkpCisoZGVmbiBhc3NlcnQtYXV0aG9yaXplZC1wcm9maWxlci1hY3Rpb24KKyAgW29wXQorICAoaWYtbm90ICgqU1RPUk0tQ09ORiogV09SS0VSLVBST0ZJTEVSLUVOQUJMRUQpCisgICAgKHRocm93IChBdXRob3JpemF0aW9uRXhjZXB0aW9uLgorICAgICAgICAgICAgIChzdHIgIlVJIHJlcXVlc3QgZm9yIHByb2ZpbGVyIGFjdGlvbiAnIiBvcCAiJyBpcyBkaXNhYmxlZC4iKSkpKSkKKwogCiAoZGVmbiBleGVjdXRvci1zdW1tYXJ5LXR5cGUKICAgW3RvcG9sb2d5IF5FeGVjdXRvclN1bW1hcnkgc10KICAgKGNvbXBvbmVudC10eXBlIHRvcG9sb2d5ICguZ2V0X2NvbXBvbmVudF9pZCBzKSkpCiAKLShkZWZuIGFkZC1wYWlycwotICAoW10gWzAgMF0pCi0gIChbW2ExIGEyXSBbYjEgYjJdXQotICAgWygrIGExIGIxKSAoKyBhMiBiMildKSkKLQotKGRlZm4gZXhwYW5kLWF2ZXJhZ2VzCi0gIFthdmcgY291bnRzXQotICAobGV0IFthdmcgKGNsb2p1cmlmeS1zdHJ1Y3R1cmUgYXZnKQotICAgICAgICBjb3VudHMgKGNsb2p1cmlmeS1zdHJ1Y3R1cmUgY291bnRzKV0KLSAgICAoaW50byB7fQotICAgICAgICAgIChmb3IgW1tzbGljZSBzdHJlYW1zXSBjb3VudHNdCi0gICAgICAgICAgICBbc2xpY2UKLSAgICAgICAgICAgICAoaW50byB7fQotICAgICAgICAgICAgICAgICAgIChmb3IgW1tzdHJlYW0gY10gc3RyZWFtc10KLSAgICAgICAgICAgICAgICAgICAgIFtzdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgICBbKCogYyAoZ2V0LWluIGF2ZyBbc2xpY2Ugc3RyZWFtXSkpCi0gICAgICAgICAgICAgICAgICAgICAgIGNdXQotICAgICAgICAgICAgICAgICAgICAgKSldKSkpKQotCi0oZGVmbiBleHBhbmQtYXZlcmFnZXMtc2VxCi0gIFthdmVyYWdlLXNlcSBjb3VudHMtc2VxXQotICAoLT4+IChtYXAgdmVjdG9yIGF2ZXJhZ2Utc2VxIGNvdW50cy1zZXEpCi0gICAgICAgKG1hcCAjKGFwcGx5IGV4cGFuZC1hdmVyYWdlcyAlKSkKLSAgICAgICAoYXBwbHkgbWVyZ2Utd2l0aCAoZm4gW3MxIHMyXSAobWVyZ2Utd2l0aCBhZGQtcGFpcnMgczEgczIpKSkpKQotCi0oZGVmbi0gdmFsLWF2ZwotICBbW3QgY11dCi0gIChpZiAoPSB0IDApIDAKLSAgICAoZG91YmxlICgvIHQgYykpKSkKLQotKGRlZm4gYWdncmVnYXRlLWF2ZXJhZ2VzCi0gIFthdmVyYWdlLXNlcSBjb3VudHMtc2VxXQotICAoLT4+IChleHBhbmQtYXZlcmFnZXMtc2VxIGF2ZXJhZ2Utc2VxIGNvdW50cy1zZXEpCi0gICAgICAgKG1hcC12YWwKLSAgICAgICAgIChmbiBbc10KLSAgICAgICAgICAgKG1hcC12YWwgdmFsLWF2ZyBzKSkpKSkKLQotKGRlZm4gYWdncmVnYXRlLWNvdW50cwotICBbY291bnRzLXNlcV0KLSAgKC0+PiBjb3VudHMtc2VxCi0gICAgICAgKG1hcCBjbG9qdXJpZnktc3RydWN0dXJlKQotICAgICAgIChhcHBseSBtZXJnZS13aXRoCi0gICAgICAgICAgICAgIChmbiBbczEgczJdCi0gICAgICAgICAgICAgICAgKG1lcmdlLXdpdGggKyBzMSBzMikpKSkpCi0KLShkZWZuIGFnZ3JlZ2F0ZS1hdmctc3RyZWFtcwotICBbYXZnIGNvdW50c10KLSAgKGxldCBbZXhwYW5kZWQgKGV4cGFuZC1hdmVyYWdlcyBhdmcgY291bnRzKV0KLSAgICAoLT4+IGV4cGFuZGVkCi0gICAgICAgICAobWFwLXZhbCAjKHJlZHVjZSBhZGQtcGFpcnMgKHZhbHMgJSkpKQotICAgICAgICAgKG1hcC12YWwgdmFsLWF2ZykpKSkKLQotKGRlZm4gYWdncmVnYXRlLWNvdW50LXN0cmVhbXMKLSAgW3N0YXRzXQotICAoLT4+IHN0YXRzCi0gICAgICAgKG1hcC12YWwgIyhyZWR1Y2UgKyAodmFscyAlKSkpKSkKLQotKGRlZm4gYWdncmVnYXRlLWNvbW1vbi1zdGF0cwotICBbc3RhdHMtc2VxXQotICB7OmVtaXR0ZWQgKGFnZ3JlZ2F0ZS1jb3VudHMgKG1hcCAjKC5nZXRfZW1pdHRlZCBeRXhlY3V0b3JTdGF0cyAlKSBzdGF0cy1zZXEpKQotICAgOnRyYW5zZmVycmVkIChhZ2dyZWdhdGUtY291bnRzIChtYXAgIyguZ2V0X3RyYW5zZmVycmVkIF5FeGVjdXRvclN0YXRzICUpIHN0YXRzLXNlcSkpfSkKLQotKGRlZm4gbWstaW5jbHVkZS1zeXMtZm4KLSAgW2luY2x1ZGUtc3lzP10KLSAgKGlmIGluY2x1ZGUtc3lzPwotICAgIChmbiBbX10gdHJ1ZSkKLSAgICAoZm4gW3N0cmVhbV0gKGFuZCAoc3RyaW5nPyBzdHJlYW0pIChub3QgKHN5c3RlbS1pZD8gc3RyZWFtKSkpKSkpCi0KIChkZWZuIGlzLWFjay1zdHJlYW0KICAgW3N0cmVhbV0KICAgKGxldCBbYWNrZXItc3RyZWFtcwpAQCAtMTc2LDgwICsxMjQsNiBAQAogICAgICAgICAgQUNLRVItRkFJTC1TVFJFQU0tSURdXQogICAgIChldmVyeT8gIyhub3Q9ICUxIHN0cmVhbSkgYWNrZXItc3RyZWFtcykpKQogCi0oZGVmbiBwcmUtcHJvY2VzcwotICBbc3RyZWFtLXN1bW1hcnkgaW5jbHVkZS1zeXM/XQotICAobGV0IFtmaWx0ZXItZm4gKG1rLWluY2x1ZGUtc3lzLWZuIGluY2x1ZGUtc3lzPykKLSAgICAgICAgZW1pdHRlZCAoOmVtaXR0ZWQgc3RyZWFtLXN1bW1hcnkpCi0gICAgICAgIGVtaXR0ZWQgKGludG8ge30gKGZvciBbW3dpbmRvdyBzdGF0XSBlbWl0dGVkXQotICAgICAgICAgICAgICAgICAgICAgICAgICAge3dpbmRvdyAoZmlsdGVyLWtleSBmaWx0ZXItZm4gc3RhdCl9KSkKLSAgICAgICAgdHJhbnNmZXJyZWQgKDp0cmFuc2ZlcnJlZCBzdHJlYW0tc3VtbWFyeSkKLSAgICAgICAgdHJhbnNmZXJyZWQgKGludG8ge30gKGZvciBbW3dpbmRvdyBzdGF0XSB0cmFuc2ZlcnJlZF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7d2luZG93IChmaWx0ZXIta2V5IGZpbHRlci1mbiBzdGF0KX0pKQotICAgICAgICBzdHJlYW0tc3VtbWFyeSAoLT4gc3RyZWFtLXN1bW1hcnkgKGRpc3NvYyA6ZW1pdHRlZCkgKGFzc29jIDplbWl0dGVkIGVtaXR0ZWQpKQotICAgICAgICBzdHJlYW0tc3VtbWFyeSAoLT4gc3RyZWFtLXN1bW1hcnkgKGRpc3NvYyA6dHJhbnNmZXJyZWQpIChhc3NvYyA6dHJhbnNmZXJyZWQgdHJhbnNmZXJyZWQpKV0KLSAgICBzdHJlYW0tc3VtbWFyeSkpCi0KLShkZWZuIGFnZ3JlZ2F0ZS1ib2x0LXN0YXRzCi0gIFtzdGF0cy1zZXEgaW5jbHVkZS1zeXM/XQotICAobGV0IFtzdGF0cy1zZXEgKGNvbGxlY3RpZnkgc3RhdHMtc2VxKV0KLSAgICAobWVyZ2UgKHByZS1wcm9jZXNzIChhZ2dyZWdhdGUtY29tbW9uLXN0YXRzIHN0YXRzLXNlcSkgaW5jbHVkZS1zeXM/KQotICAgICAgICAgICB7OmFja2VkCi0gICAgICAgICAgICAoYWdncmVnYXRlLWNvdW50cyAobWFwICMoLi4gXkV4ZWN1dG9yU3RhdHMgJSBnZXRfc3BlY2lmaWMgZ2V0X2JvbHQgZ2V0X2Fja2VkKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0cy1zZXEpKQotICAgICAgICAgICAgOmZhaWxlZAotICAgICAgICAgICAgKGFnZ3JlZ2F0ZS1jb3VudHMgKG1hcCAjKC4uIF5FeGVjdXRvclN0YXRzICUgZ2V0X3NwZWNpZmljIGdldF9ib2x0IGdldF9mYWlsZWQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRzLXNlcSkpCi0gICAgICAgICAgICA6ZXhlY3V0ZWQKLSAgICAgICAgICAgIChhZ2dyZWdhdGUtY291bnRzIChtYXAgIyguLiBeRXhlY3V0b3JTdGF0cyAlIGdldF9zcGVjaWZpYyBnZXRfYm9sdCBnZXRfZXhlY3V0ZWQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRzLXNlcSkpCi0gICAgICAgICAgICA6cHJvY2Vzcy1sYXRlbmNpZXMKLSAgICAgICAgICAgIChhZ2dyZWdhdGUtYXZlcmFnZXMgKG1hcCAjKC4uIF5FeGVjdXRvclN0YXRzICUgZ2V0X3NwZWNpZmljIGdldF9ib2x0IGdldF9wcm9jZXNzX21zX2F2ZykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0cy1zZXEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXAgIyguLiBeRXhlY3V0b3JTdGF0cyAlIGdldF9zcGVjaWZpYyBnZXRfYm9sdCBnZXRfYWNrZWQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHMtc2VxKSkKLSAgICAgICAgICAgIDpleGVjdXRlLWxhdGVuY2llcwotICAgICAgICAgICAgKGFnZ3JlZ2F0ZS1hdmVyYWdlcyAobWFwICMoLi4gXkV4ZWN1dG9yU3RhdHMgJSBnZXRfc3BlY2lmaWMgZ2V0X2JvbHQgZ2V0X2V4ZWN1dGVfbXNfYXZnKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRzLXNlcSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hcCAjKC4uIF5FeGVjdXRvclN0YXRzICUgZ2V0X3NwZWNpZmljIGdldF9ib2x0IGdldF9leGVjdXRlZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0cy1zZXEpKX0pKSkKLQotKGRlZm4gYWdncmVnYXRlLXNwb3V0LXN0YXRzCi0gIFtzdGF0cy1zZXEgaW5jbHVkZS1zeXM/XQotICAobGV0IFtzdGF0cy1zZXEgKGNvbGxlY3RpZnkgc3RhdHMtc2VxKV0KLSAgICAobWVyZ2UgKHByZS1wcm9jZXNzIChhZ2dyZWdhdGUtY29tbW9uLXN0YXRzIHN0YXRzLXNlcSkgaW5jbHVkZS1zeXM/KQotICAgICAgICAgICB7OmFja2VkCi0gICAgICAgICAgICAoYWdncmVnYXRlLWNvdW50cyAobWFwICMoLi4gXkV4ZWN1dG9yU3RhdHMgJSBnZXRfc3BlY2lmaWMgZ2V0X3Nwb3V0IGdldF9hY2tlZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHMtc2VxKSkKLSAgICAgICAgICAgIDpmYWlsZWQKLSAgICAgICAgICAgIChhZ2dyZWdhdGUtY291bnRzIChtYXAgIyguLiBeRXhlY3V0b3JTdGF0cyAlIGdldF9zcGVjaWZpYyBnZXRfc3BvdXQgZ2V0X2ZhaWxlZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHMtc2VxKSkKLSAgICAgICAgICAgIDpjb21wbGV0ZS1sYXRlbmNpZXMKLSAgICAgICAgICAgIChhZ2dyZWdhdGUtYXZlcmFnZXMgKG1hcCAjKC4uIF5FeGVjdXRvclN0YXRzICUgZ2V0X3NwZWNpZmljIGdldF9zcG91dCBnZXRfY29tcGxldGVfbXNfYXZnKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRzLXNlcSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hcCAjKC4uIF5FeGVjdXRvclN0YXRzICUgZ2V0X3NwZWNpZmljIGdldF9zcG91dCBnZXRfYWNrZWQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHMtc2VxKSl9KSkpCi0KLShkZWZuIGFnZ3JlZ2F0ZS1ib2x0LXN0cmVhbXMKLSAgW3N0YXRzXQotICB7OmFja2VkIChhZ2dyZWdhdGUtY291bnQtc3RyZWFtcyAoOmFja2VkIHN0YXRzKSkKLSAgIDpmYWlsZWQgKGFnZ3JlZ2F0ZS1jb3VudC1zdHJlYW1zICg6ZmFpbGVkIHN0YXRzKSkKLSAgIDplbWl0dGVkIChhZ2dyZWdhdGUtY291bnQtc3RyZWFtcyAoOmVtaXR0ZWQgc3RhdHMpKQotICAgOnRyYW5zZmVycmVkIChhZ2dyZWdhdGUtY291bnQtc3RyZWFtcyAoOnRyYW5zZmVycmVkIHN0YXRzKSkKLSAgIDpwcm9jZXNzLWxhdGVuY2llcyAoYWdncmVnYXRlLWF2Zy1zdHJlYW1zICg6cHJvY2Vzcy1sYXRlbmNpZXMgc3RhdHMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoOmFja2VkIHN0YXRzKSkKLSAgIDpleGVjdXRlZCAoYWdncmVnYXRlLWNvdW50LXN0cmVhbXMgKDpleGVjdXRlZCBzdGF0cykpCi0gICA6ZXhlY3V0ZS1sYXRlbmNpZXMgKGFnZ3JlZ2F0ZS1hdmctc3RyZWFtcyAoOmV4ZWN1dGUtbGF0ZW5jaWVzIHN0YXRzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDpleGVjdXRlZCBzdGF0cykpfSkKLQotKGRlZm4gYWdncmVnYXRlLXNwb3V0LXN0cmVhbXMKLSAgW3N0YXRzXQotICB7OmFja2VkIChhZ2dyZWdhdGUtY291bnQtc3RyZWFtcyAoOmFja2VkIHN0YXRzKSkKLSAgIDpmYWlsZWQgKGFnZ3JlZ2F0ZS1jb3VudC1zdHJlYW1zICg6ZmFpbGVkIHN0YXRzKSkKLSAgIDplbWl0dGVkIChhZ2dyZWdhdGUtY291bnQtc3RyZWFtcyAoOmVtaXR0ZWQgc3RhdHMpKQotICAgOnRyYW5zZmVycmVkIChhZ2dyZWdhdGUtY291bnQtc3RyZWFtcyAoOnRyYW5zZmVycmVkIHN0YXRzKSkKLSAgIDpjb21wbGV0ZS1sYXRlbmNpZXMgKGFnZ3JlZ2F0ZS1hdmctc3RyZWFtcyAoOmNvbXBsZXRlLWxhdGVuY2llcyBzdGF0cykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoOmFja2VkIHN0YXRzKSl9KQotCiAoZGVmbiBzcG91dC1zdW1tYXJ5PwogICBbdG9wb2xvZ3kgc10KICAgKD0gOnNwb3V0IChleGVjdXRvci1zdW1tYXJ5LXR5cGUgdG9wb2xvZ3kgcykpKQpAQCAtMjYzLDI5ICsxMzcsNiBAQAogICAobGV0IFtyZXQgKGdyb3VwLWJ5ICMoLmdldF9jb21wb25lbnRfaWQgXkV4ZWN1dG9yU3VtbWFyeSAlKSBzdW1tcyldCiAgICAgKGludG8gKHNvcnRlZC1tYXApIHJldCApKSkKIAotKGRlZm4gZXJyb3Itc3Vic2V0Ci0gIFtlcnJvci1zdHJdCi0gIChhcHBseSBzdHIgKHRha2UgMjAwIGVycm9yLXN0cikpKQotCi0oZGVmbiBtb3N0LXJlY2VudC1lcnJvcgotICBbZXJyb3JzLWxpc3RdCi0gIChsZXQgW2Vycm9yICgtPj4gZXJyb3JzLWxpc3QKLSAgICAgICAgICAgICAgICAgICAoc29ydC1ieSAjKC5nZXRfZXJyb3JfdGltZV9zZWNzIF5FcnJvckluZm8gJSkpCi0gICAgICAgICAgICAgICAgICAgcmV2ZXJzZQotICAgICAgICAgICAgICAgICAgIGZpcnN0KV0KLSAgICAgZXJyb3IpKQotCi0oZGVmbiBjb21wb25lbnQtdGFzay1zdW1tcwotICBbXlRvcG9sb2d5SW5mbyBzdW1tIHRvcG9sb2d5IGlkXQotICAobGV0IFtzcG91dC1zdW1tcyAoZmlsdGVyIChwYXJ0aWFsIHNwb3V0LXN1bW1hcnk/IHRvcG9sb2d5KSAoLmdldF9leGVjdXRvcnMgc3VtbSkpCi0gICAgICAgIGJvbHQtc3VtbXMgKGZpbHRlciAocGFydGlhbCBib2x0LXN1bW1hcnk/IHRvcG9sb2d5KSAoLmdldF9leGVjdXRvcnMgc3VtbSkpCi0gICAgICAgIHNwb3V0LWNvbXAtc3VtbXMgKGdyb3VwLWJ5LWNvbXAgc3BvdXQtc3VtbXMpCi0gICAgICAgIGJvbHQtY29tcC1zdW1tcyAoZ3JvdXAtYnktY29tcCBib2x0LXN1bW1zKQotICAgICAgICByZXQgKGlmIChjb250YWlucz8gc3BvdXQtY29tcC1zdW1tcyBpZCkKLSAgICAgICAgICAgICAgKHNwb3V0LWNvbXAtc3VtbXMgaWQpCi0gICAgICAgICAgICAgIChib2x0LWNvbXAtc3VtbXMgaWQpKV0KLSAgICAoc29ydC1ieSAjKC0+IF5FeGVjdXRvclN1bW1hcnkgJSAuZ2V0X2V4ZWN1dG9yX2luZm8gLmdldF90YXNrX3N0YXJ0KSByZXQpKSkKLQogKGRlZm4gbG9ndmlld2VyLWxpbmsgW2hvc3QgZm5hbWUgc2VjdXJlP10KICAgKGlmIChhbmQgc2VjdXJlPyAoKlNUT1JNLUNPTkYqIExPR1ZJRVdFUi1IVFRQUy1QT1JUKSkKICAgICAodXJsLWZvcm1hdCAiaHR0cHM6Ly8lczolcy9sb2c/ZmlsZT0lcyIKQEAgLTI5NSw2OSArMTQ2LDE4IEBACiAgICAgKHVybC1mb3JtYXQgImh0dHA6Ly8lczolcy9sb2c/ZmlsZT0lcyIKICAgICAgIGhvc3QKICAgICAgICgqU1RPUk0tQ09ORiogTE9HVklFV0VSLVBPUlQpCi0gICAgICBmbmFtZSkpCi0gICkKLQotKGRlZm4gZXhlY3V0b3ItaGFzLXRhc2staWQ/IFt0YXNrLWlkIGV4ZWN1dG9yLWluZm9dCi0gIChiZXR3ZWVuPyB0YXNrLWlkICguZ2V0X3Rhc2tfc3RhcnQgZXhlY3V0b3ItaW5mbykgKC5nZXRfdGFza19lbmQgZXhlY3V0b3ItaW5mbykpKQotCi0oZGVmbiBnZXQtaG9zdC1wb3J0IFt0YXNrLWlkIGV4ZWN1dG9yLXN1bW1zXQotICAobGV0IFtleC1zdW0gKHNvbWUgIyhpZiAoZXhlY3V0b3ItaGFzLXRhc2staWQ/IHRhc2staWQgKC5nZXRfZXhlY3V0b3JfaW5mbyAlKSkgJSkgZXhlY3V0b3Itc3VtbXMpXQotICAgIHs6aG9zdCAoLmdldF9ob3N0IGV4LXN1bSkgOnBvcnQgKC5nZXRfcG9ydCBleC1zdW0pfSkpCi0KLShkZWZuIGdldC1zb3J0ZWQtZXZlbnRsb2dnZXItdGFzay1pZHMgW2V4ZWN1dG9yLXN1bW1zXQotICAobGV0IFtleGVjdXRvci1pbmZvcyAobWFwICMoLmdldF9leGVjdXRvcl9pbmZvICUpIGV4ZWN1dG9yLXN1bW1zKV0KLSAgKHNvcnQgKGZsYXR0ZW4gKG1hcCAjKHJhbmdlICguZ2V0X3Rhc2tfc3RhcnQgJSkgKGluYyAoLmdldF90YXNrX2VuZCAlKSkpIGV4ZWN1dG9yLWluZm9zKSkpKSkKLQotKGRlZm4gZ2V0LWV2ZW50bG9nZ2VyLWV4ZWN1dG9yLXN1bW1zIFteVG9wb2xvZ3lJbmZvIHRvcG9sb2d5LWluZm8gdG9wb2xvZ3ldCi0gIChsZXQgW2JvbHQtc3VtbXMgKGZpbHRlciAocGFydGlhbCBib2x0LXN1bW1hcnk/IHRvcG9sb2d5KSAoLmdldF9leGVjdXRvcnMgdG9wb2xvZ3ktaW5mbykpXQotICAgICAgICAoKGdyb3VwLWJ5LWNvbXAgYm9sdC1zdW1tcykgIl9fZXZlbnRsb2dnZXIiKSkpCi0KLTsKLTsgVGhlIGV2ZW50bG9nZ2VyIHVzZXMgZmllbGRzIGdyb3VwaW5nIG9uIHRoZSBjb21wb25lbnQtaWQgc28gdGhhdCBldmVudHMgZnJvbSBzYW1lIGNvbXBvbmVudAotOyBhbHdheXMgZ29lcyB0byB0aGUgc2FtZSBldmVudCBsb2dnZXIgdGFzay4gSGVyZSB3ZSB1c2UgdGhlIHNhbWUgZmllbGRzIGdyb3VwaW5nCi07IHRvIGZpbmQgdGhlIGNvcnJlY3QgZXZlbnRsb2dnZXIgdGFzay4KLShkZWZuIGdldC1tYXBwZWQtdGFzay1pZCBbc29ydGVkLXRhc2staWRzIF5TdHJpbmcgY29tcG9uZW50LWlkXQotICAobnRoIHNvcnRlZC10YXNrLWlkcyAobW9kIChsaXN0LWhhc2gtY29kZSBbY29tcG9uZW50LWlkXSkgKGNvdW50IHNvcnRlZC10YXNrLWlkcykpKSkKKyAgICAgIGZuYW1lKSkpCiAKIChkZWZuIGV2ZW50LWxvZy1saW5rCi0gIFt0b3BvbG9neS1pZCBeVG9wb2xvZ3lJbmZvIHRvcG9sb2d5LWluZm8gdG9wb2xvZ3kgY29tcG9uZW50LWlkIHNlY3VyZT9dCi0gIChsZXQgW2V4ZWN1dG9yLXN1bW1zIChnZXQtZXZlbnRsb2dnZXItZXhlY3V0b3Itc3VtbXMgdG9wb2xvZ3ktaW5mbyB0b3BvbG9neSkKLSAgICAgICAgc29ydGVkLXRhc2staWRzIChnZXQtc29ydGVkLWV2ZW50bG9nZ2VyLXRhc2staWRzIGV4ZWN1dG9yLXN1bW1zKQotICAgICAgICBtYXBwZWQtdGFzay1pZCAoZ2V0LW1hcHBlZC10YXNrLWlkIHNvcnRlZC10YXNrLWlkcyBjb21wb25lbnQtaWQpCi0gICAgICAgIGhvc3QtcG9ydCAoZ2V0LWhvc3QtcG9ydCBtYXBwZWQtdGFzay1pZCBleGVjdXRvci1zdW1tcykKLSAgICAgICAgZm5hbWUgKGV2ZW50LWxvZ3MtZmlsZW5hbWUgdG9wb2xvZ3ktaWQgKGhvc3QtcG9ydCA6cG9ydCkpXQotICAgIChsb2d2aWV3ZXItbGluayAoaG9zdC1wb3J0IDpob3N0KSBmbmFtZSBzZWN1cmU/KSkpCisgIFt0b3BvbG9neS1pZCBjb21wb25lbnQtaWQgaG9zdCBwb3J0IHNlY3VyZT9dCisgIChsb2d2aWV3ZXItbGluayBob3N0IChldmVudC1sb2dzLWZpbGVuYW1lIHRvcG9sb2d5LWlkIHBvcnQpIHNlY3VyZT8pKQogCiAoZGVmbiB3b3JrZXItbG9nLWxpbmsgW2hvc3QgcG9ydCB0b3BvbG9neS1pZCBzZWN1cmU/XQogICAobGV0IFtmbmFtZSAobG9ncy1maWxlbmFtZSB0b3BvbG9neS1pZCBwb3J0KV0KICAgICAobG9ndmlld2VyLWxpbmsgaG9zdCBmbmFtZSBzZWN1cmU/KSkpCiAKIChkZWZuIG5pbWJ1cy1sb2ctbGluayBbaG9zdCBwb3J0XQotICAodXJsLWZvcm1hdCAiaHR0cDovLyVzOiVzL2xvZz9maWxlPW5pbWJ1cy5sb2ciIGhvc3QgKCpTVE9STS1DT05GKiBMT0dWSUVXRVItUE9SVCkgcG9ydCkpCi0KLShkZWZuIGNvbXB1dGUtZXhlY3V0b3ItY2FwYWNpdHkKLSAgW15FeGVjdXRvclN1bW1hcnkgZV0KLSAgKGxldCBbc3RhdHMgKC5nZXRfc3RhdHMgZSkKLSAgICAgICAgc3RhdHMgKGlmIHN0YXRzCi0gICAgICAgICAgICAgICAgKC0+IHN0YXRzCi0gICAgICAgICAgICAgICAgICAgIChhZ2dyZWdhdGUtYm9sdC1zdGF0cyB0cnVlKQotICAgICAgICAgICAgICAgICAgICAoYWdncmVnYXRlLWJvbHQtc3RyZWFtcykKLSAgICAgICAgICAgICAgICAgICAgc3dhcC1tYXAtb3JkZXIKLSAgICAgICAgICAgICAgICAgICAgKGdldCAiNjAwIikpKQotICAgICAgICB1cHRpbWUgKG5pbC10by16ZXJvICguZ2V0X3VwdGltZV9zZWNzIGUpKQotICAgICAgICB3aW5kb3cgKGlmICg8IHVwdGltZSA2MDApIHVwdGltZSA2MDApCi0gICAgICAgIGV4ZWN1dGVkICgtPiBzdGF0cyA6ZXhlY3V0ZWQgbmlsLXRvLXplcm8pCi0gICAgICAgIGxhdGVuY3kgKC0+IHN0YXRzIDpleGVjdXRlLWxhdGVuY2llcyBuaWwtdG8temVybyldCi0gICAgKGlmICg+IHdpbmRvdyAwKQotICAgICAgKGRpdiAoKiBleGVjdXRlZCBsYXRlbmN5KSAoKiAxMDAwIHdpbmRvdykpKSkpCi0KLShkZWZuIGNvbXB1dGUtYm9sdC1jYXBhY2l0eQotICBbZXhlY3V0b3JzXQotICAoLT4+IGV4ZWN1dG9ycwotICAgICAgIChtYXAgY29tcHV0ZS1leGVjdXRvci1jYXBhY2l0eSkKLSAgICAgICAobWFwIG5pbC10by16ZXJvKQotICAgICAgIChhcHBseSBtYXgpKSkKKyAgKHVybC1mb3JtYXQgImh0dHA6Ly8lczolcy9kYWVtb25sb2c/ZmlsZT1uaW1idXMubG9nIiBob3N0ICgqU1RPUk0tQ09ORiogTE9HVklFV0VSLVBPUlQpIHBvcnQpKQogCiAoZGVmbiBnZXQtZXJyb3ItdGltZQogICBbZXJyb3JdCkBAIC0zNzEsNyArMTcxLDcgQEAKICAgICAiIikpCiAKIChkZWZuIGdldC1lcnJvci1wb3J0Ci0gIFtlcnJvciBlcnJvci1ob3N0IHRvcC1pZF0KKyAgW2Vycm9yXQogICAoaWYgZXJyb3IKICAgICAoLmdldF9wb3J0IF5FcnJvckluZm8gZXJyb3IpCiAgICAgIiIpKQpAQCAtMzgyLDQwICsxODIsMTggQEAKICAgICAoLmdldF9ob3N0IF5FcnJvckluZm8gZXJyb3IpCiAgICAgIiIpKQogCi0oZGVmbiBzcG91dC1zdHJlYW1zLXN0YXRzCi0gIFtzdW1tcyBpbmNsdWRlLXN5cz9dCi0gIChsZXQgW3N0YXRzLXNlcSAoZ2V0LWZpbGxlZC1zdGF0cyBzdW1tcyldCi0gICAgKGFnZ3JlZ2F0ZS1zcG91dC1zdHJlYW1zCi0gICAgICAoYWdncmVnYXRlLXNwb3V0LXN0YXRzCi0gICAgICAgIHN0YXRzLXNlcSBpbmNsdWRlLXN5cz8pKSkpCisoZGVmbiBnZXQtZXJyb3ItdGltZQorICBbZXJyb3JdCisgIChpZiBlcnJvcgorICAgICguZ2V0X2Vycm9yX3RpbWVfc2VjcyBeRXJyb3JJbmZvIGVycm9yKQorICAgICIiKSkKIAotKGRlZm4gYm9sdC1zdHJlYW1zLXN0YXRzCi0gIFtzdW1tcyBpbmNsdWRlLXN5cz9dCi0gIChsZXQgW3N0YXRzLXNlcSAoZ2V0LWZpbGxlZC1zdGF0cyBzdW1tcyldCi0gICAgKGFnZ3JlZ2F0ZS1ib2x0LXN0cmVhbXMKLSAgICAgIChhZ2dyZWdhdGUtYm9sdC1zdGF0cwotICAgICAgICBzdGF0cy1zZXEgaW5jbHVkZS1zeXM/KSkpKQotCi0oZGVmbiB0b3RhbC1hZ2dyZWdhdGUtc3RhdHMKLSAgW3Nwb3V0LXN1bW1zIGJvbHQtc3VtbXMgaW5jbHVkZS1zeXM/XQotICAobGV0IFtzcG91dC1zdGF0cyAoZ2V0LWZpbGxlZC1zdGF0cyBzcG91dC1zdW1tcykKLSAgICAgICAgYm9sdC1zdGF0cyAoZ2V0LWZpbGxlZC1zdGF0cyBib2x0LXN1bW1zKQotICAgICAgICBhZ2ctc3BvdXQtc3RhdHMgKC0+IHNwb3V0LXN0YXRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFnZ3JlZ2F0ZS1zcG91dC1zdGF0cyBpbmNsdWRlLXN5cz8pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdncmVnYXRlLXNwb3V0LXN0cmVhbXMpCi0gICAgICAgIGFnZy1ib2x0LXN0YXRzICgtPiBib2x0LXN0YXRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoYWdncmVnYXRlLWJvbHQtc3RhdHMgaW5jbHVkZS1zeXM/KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdncmVnYXRlLWJvbHQtc3RyZWFtcyldCi0gICAgKG1lcmdlLXdpdGgKLSAgICAgIChmbiBbczEgczJdCi0gICAgICAgIChtZXJnZS13aXRoICsgczEgczIpKQotICAgICAgKHNlbGVjdC1rZXlzCi0gICAgICAgIGFnZy1ib2x0LXN0YXRzCi0gICAgICAgIDs7IEluY2x1ZGUgb25seSBrZXlzIHRoYXQgd2lsbCBiZSB1c2VkLiAgV2Ugd2FudCB0byBjb3VudCBhY2tlZCBhbmQKLSAgICAgICAgOzsgZmFpbGVkIG9ubHkgZm9yIHRoZSAidHVwbGUgdHJlZXMsIiBzbyB3ZSBkbyBub3QgaW5jbHVkZSB0aG9zZSBrZXlzCi0gICAgICAgIDs7IGZyb20gdGhlIGJvbHQgZXhlY3V0b3JzLgotICAgICAgICBbOmVtaXR0ZWQgOnRyYW5zZmVycmVkXSkKLSAgICAgIGFnZy1zcG91dC1zdGF0cykpKQorKGRlZm4gd29ya2VyLWR1bXAtbGluayBbaG9zdCBwb3J0IHRvcG9sb2d5LWlkXQorICAodXJsLWZvcm1hdCAiaHR0cDovLyVzOiVzL2R1bXBzLyVzLyVzIgorICAgICAgICAgICAgICAodXJsLWVuY29kZSBob3N0KQorICAgICAgICAgICAgICAoKlNUT1JNLUNPTkYqIExPR1ZJRVdFUi1QT1JUKQorICAgICAgICAgICAgICAodXJsLWVuY29kZSB0b3BvbG9neS1pZCkKKyAgICAgICAgICAgICAgKHN0ciAodXJsLWVuY29kZSBob3N0KSAiOiIgKHVybC1lbmNvZGUgcG9ydCkpKSkKIAogKGRlZm4gc3RhdHMtdGltZXMKICAgW3N0YXRzLW1hcF0KQEAgLTQzMSwxNiArMjA5LDYgQEAKICAgICAiQWxsIHRpbWUiCiAgICAgKHByZXR0eS11cHRpbWUtc2VjIHdpbmRvdykpKQogCi0oZGVmbiB0b3BvbG9neS1hY3Rpb24tYnV0dG9uCi0gIFtpZCBuYW1lIGFjdGlvbiBjb21tYW5kIGlzLXdhaXQgZGVmYXVsdC13YWl0IGVuYWJsZWRdCi0gIFs6aW5wdXQgezp0eXBlICJidXR0b24iCi0gICAgICAgICAgIDp2YWx1ZSBhY3Rpb24KLSAgICAgICAgICAgKGlmIGVuYWJsZWQgOmVuYWJsZWQgOmRpc2FibGVkKSAiIgotICAgICAgICAgICA6b25jbGljayAoc3RyICJjb25maXJtQWN0aW9uKCciCi0gICAgICAgICAgICAgICAgICAgICAgICAgKFN0cmluZ0VzY2FwZVV0aWxzL2VzY2FwZUphdmFTY3JpcHQgaWQpICInLCAnIgotICAgICAgICAgICAgICAgICAgICAgICAgIChTdHJpbmdFc2NhcGVVdGlscy9lc2NhcGVKYXZhU2NyaXB0IG5hbWUpICInLCAnIgotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgIicsICIgaXMtd2FpdCAiLCAiIGRlZmF1bHQtd2FpdCAiKSIpfV0pCi0KIChkZWZuIHNhbml0aXplLXN0cmVhbS1uYW1lCiAgIFtuYW1lXQogICAobGV0IFtzeW0tcmVnZXggIyIoPyFbQS1aYS16X1wtOlwuXSkuIl0KQEAgLTUxNiw2ICsyODQsMTIgQEAKICAgICAobWFwIChmbiBbcm93XQogICAgICAgICAgICB7OnJvdyByb3d9KSAocGFydGl0aW9uIDQgNCBuaWwgc3RyZWFtcykpKSkKIAorKGRlZm4tIGdldC10b3BvbG9neS1pbmZvCisgIChbXk5pbWJ1cyRDbGllbnQgbmltYnVzIGlkXQorICAgICguZ2V0VG9wb2xvZ3lJbmZvIG5pbWJ1cyBpZCkpCisgIChbXk5pbWJ1cyRDbGllbnQgbmltYnVzIGlkIG9wdGlvbnNdCisgICAgKC5nZXRUb3BvbG9neUluZm9XaXRoT3B0cyBuaW1idXMgaWQgb3B0aW9ucykpKQorCiAoZGVmbiBtay12aXN1YWxpemF0aW9uLWRhdGEKICAgW2lkIHdpbmRvdyBpbmNsdWRlLXN5cz9dCiAgICh0aHJpZnQvd2l0aC1jb25maWd1cmVkLW5pbWJ1cy1jb25uZWN0aW9uCkBAIC01MzQsOSArMzA4LDcgQEAKICAgICAgICAgICBzcG91dC1jb21wLXN1bW1zIChncm91cC1ieS1jb21wIHNwb3V0LXN1bW1zKQogICAgICAgICAgIGJvbHQtY29tcC1zdW1tcyAoZ3JvdXAtYnktY29tcCBib2x0LXN1bW1zKQogICAgICAgICAgIGJvbHQtY29tcC1zdW1tcyAoZmlsdGVyLWtleSAobWstaW5jbHVkZS1zeXMtZm4gaW5jbHVkZS1zeXM/KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2x0LWNvbXAtc3VtbXMpCi0gICAgICAgICAgdG9wb2xvZ3ktY29uZiAoZnJvbS1qc29uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICguZ2V0VG9wb2xvZ3lDb25mIF5OaW1idXMkQ2xpZW50IG5pbWJ1cyBpZCkpXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2x0LWNvbXAtc3VtbXMpXQogICAgICAgKHZpc3VhbGl6YXRpb24tZGF0YQogICAgICAgIChtZXJnZSAoaGFzaG1hcC10by1wZXJzaXN0ZW50IHNwb3V0cykKICAgICAgICAgICAgICAgKGhhc2htYXAtdG8tcGVyc2lzdGVudCBib2x0cykpCkBAIC01NzksNiArMzUxLDE0IEBACiAgICh0aHJpZnQvd2l0aC1jb25maWd1cmVkLW5pbWJ1cy1jb25uZWN0aW9uIG5pbWJ1cwogICAgICguZ2V0TmltYnVzQ29uZiBeTmltYnVzJENsaWVudCBuaW1idXMpKSkKIAorKGRlZm4gdG9wb2xvZ3ktaGlzdG9yeS1pbmZvCisgIChbdXNlcl0KKyAgICAodGhyaWZ0L3dpdGgtY29uZmlndXJlZC1uaW1idXMtY29ubmVjdGlvbiBuaW1idXMKKyAgICAgICh0b3BvbG9neS1oaXN0b3J5LWluZm8gKC5nZXRUb3BvbG9neUhpc3RvcnkgXk5pbWJ1cyRDbGllbnQgbmltYnVzIHVzZXIpIHVzZXIpKSkKKyAgKFtoaXN0b3J5IHVzZXJdCisgICAgeyJ0b3BvLWhpc3RvcnkiCisgICAgIChpbnRvIFtdICguZ2V0X3RvcG9faWRzIGhpc3RvcnkpKX0pKQorCiAoZGVmbiBjbHVzdGVyLXN1bW1hcnkKICAgKFt1c2VyXQogICAgICAodGhyaWZ0L3dpdGgtY29uZmlndXJlZC1uaW1idXMtY29ubmVjdGlvbiBuaW1idXMKQEAgLTYxMyw3ICszOTMsOCBAQAogICAgICAgIm5pbWJ1c0xvZ0xpbmsiIChuaW1idXMtbG9nLWxpbmsgaG9zdCBwb3J0KQogICAgICAgInN0YXR1cyIgIk9mZmxpbmUiCiAgICAgICAidmVyc2lvbiIgIk5vdCBhcHBsaWNhYmxlIgotICAgICAgIm5pbWJ1c1VwVGltZSIgIk5vdCBhcHBsaWNhYmxlIn0KKyAgICAgICJuaW1idXNVcFRpbWUiICJOb3QgYXBwbGljYWJsZSIKKyAgICAgICJuaW1idXNVcHRpbWVTZWNvbmRzIiAiTm90IGFwcGxpY2FibGUifQogICAgICkpCiAKIChkZWZuIG5pbWJ1cy1zdW1tYXJ5CkBAIC02MjgsMTQgKzQwOSwxNiBAQAogICAgICAgICAgIG9mZmxpbmUtbmltYnVzZXMtc3VtbWFyeSAobWFwICMoY29udmVydC10by1uaW1idXMtc3VtbWFyeSAlMSkgb2ZmbGluZS1uaW1idXNlcyldCiAgICAgICB7Im5pbWJ1c2VzIgogICAgICAgIChjb25jYXQgb2ZmbGluZS1uaW1idXNlcy1zdW1tYXJ5Ci0gICAgICAgKGZvciBbXk5pbWJ1c1N1bW1hcnkgbiBuaW1idXNlc10KKyAgICAgICAoZm9yIFteTmltYnVzU3VtbWFyeSBuIG5pbWJ1c2VzCisgICAgICAgICAgICAgOmxldCBbdXB0aW1lICguZ2V0X3VwdGltZV9zZWNzIG4pXV0KICAgICAgICAgIHsKICAgICAgICAgICAiaG9zdCIgKC5nZXRfaG9zdCBuKQogICAgICAgICAgICJwb3J0IiAoLmdldF9wb3J0IG4pCiAgICAgICAgICAgIm5pbWJ1c0xvZ0xpbmsiIChuaW1idXMtbG9nLWxpbmsgKC5nZXRfaG9zdCBuKSAoLmdldF9wb3J0IG4pKQogICAgICAgICAgICJzdGF0dXMiIChpZiAoLmlzX2lzTGVhZGVyIG4pICJMZWFkZXIiICJOb3QgYSBMZWFkZXIiKQogICAgICAgICAgICJ2ZXJzaW9uIiAoLmdldF92ZXJzaW9uIG4pCi0gICAgICAgICAgIm5pbWJ1c1VwVGltZSIgKHByZXR0eS11cHRpbWUtc2VjICguZ2V0X3VwdGltZV9zZWNzIG4pKX0pKX0pKSkKKyAgICAgICAgICAibmltYnVzVXBUaW1lIiAocHJldHR5LXVwdGltZS1zZWMgdXB0aW1lKQorICAgICAgICAgICJuaW1idXNVcFRpbWVTZWNvbmRzIiB1cHRpbWV9KSl9KSkpCiAKIChkZWZuIHN1cGVydmlzb3Itc3VtbWFyeQogICAoW10KQEAgLTY0OCw5ICs0MzEsMTUgQEAKICAgICAgIHsiaWQiICguZ2V0X3N1cGVydmlzb3JfaWQgcykKICAgICAgICAiaG9zdCIgKC5nZXRfaG9zdCBzKQogICAgICAgICJ1cHRpbWUiIChwcmV0dHktdXB0aW1lLXNlYyAoLmdldF91cHRpbWVfc2VjcyBzKSkKKyAgICAgICAidXB0aW1lU2Vjb25kcyIgKC5nZXRfdXB0aW1lX3NlY3MgcykKICAgICAgICAic2xvdHNUb3RhbCIgKC5nZXRfbnVtX3dvcmtlcnMgcykKICAgICAgICAic2xvdHNVc2VkIiAoLmdldF9udW1fdXNlZF93b3JrZXJzIHMpCi0gICAgICAgInZlcnNpb24iICguZ2V0X3ZlcnNpb24gcyl9KX0pKQorICAgICAgICJ0b3RhbE1lbSIgKGdldCAoLmdldF90b3RhbF9yZXNvdXJjZXMgcykgQ29uZmlnL1NVUEVSVklTT1JfTUVNT1JZX0NBUEFDSVRZX01CKQorICAgICAgICJ0b3RhbENwdSIgKGdldCAoLmdldF90b3RhbF9yZXNvdXJjZXMgcykgQ29uZmlnL1NVUEVSVklTT1JfQ1BVX0NBUEFDSVRZKQorICAgICAgICJ1c2VkTWVtIiAoLmdldF91c2VkX21lbSBzKQorICAgICAgICJ1c2VkQ3B1IiAoLmdldF91c2VkX2NwdSBzKQorICAgICAgICJ2ZXJzaW9uIiAoLmdldF92ZXJzaW9uIHMpfSkKKyAgICAic2NoZWR1bGVyRGlzcGxheVJlc291cmNlIiAoKlNUT1JNLUNPTkYqIENvbmZpZy9TQ0hFRFVMRVJfRElTUExBWV9SRVNPVVJDRSl9KSkKIAogKGRlZm4gYWxsLXRvcG9sb2dpZXMtc3VtbWFyeQogICAoW10KQEAgLTY2OCwxODUgKzQ1NywxODYgQEAKICAgICAgICAibmFtZSIgKC5nZXRfbmFtZSB0KQogICAgICAgICJzdGF0dXMiICguZ2V0X3N0YXR1cyB0KQogICAgICAgICJ1cHRpbWUiIChwcmV0dHktdXB0aW1lLXNlYyAoLmdldF91cHRpbWVfc2VjcyB0KSkKKyAgICAgICAidXB0aW1lU2Vjb25kcyIgKC5nZXRfdXB0aW1lX3NlY3MgdCkKICAgICAgICAidGFza3NUb3RhbCIgKC5nZXRfbnVtX3Rhc2tzIHQpCiAgICAgICAgIndvcmtlcnNUb3RhbCIgKC5nZXRfbnVtX3dvcmtlcnMgdCkKICAgICAgICAiZXhlY3V0b3JzVG90YWwiICguZ2V0X251bV9leGVjdXRvcnMgdCkKICAgICAgICAicmVwbGljYXRpb25Db3VudCIgKC5nZXRfcmVwbGljYXRpb25fY291bnQgdCkKLSAgICAgICAic2NoZWR1bGVySW5mbyIgKC5nZXRfc2NoZWRfc3RhdHVzIHQpfSl9KSkKKyAgICAgICAic2NoZWR1bGVySW5mbyIgKC5nZXRfc2NoZWRfc3RhdHVzIHQpCisgICAgICAgInJlcXVlc3RlZE1lbU9uSGVhcCIgKC5nZXRfcmVxdWVzdGVkX21lbW9uaGVhcCB0KQorICAgICAgICJyZXF1ZXN0ZWRNZW1PZmZIZWFwIiAoLmdldF9yZXF1ZXN0ZWRfbWVtb2ZmaGVhcCB0KQorICAgICAgICJyZXF1ZXN0ZWRUb3RhbE1lbSIgKCsgKC5nZXRfcmVxdWVzdGVkX21lbW9uaGVhcCB0KSAoLmdldF9yZXF1ZXN0ZWRfbWVtb2ZmaGVhcCB0KSkKKyAgICAgICAicmVxdWVzdGVkQ3B1IiAoLmdldF9yZXF1ZXN0ZWRfY3B1IHQpCisgICAgICAgImFzc2lnbmVkTWVtT25IZWFwIiAoLmdldF9hc3NpZ25lZF9tZW1vbmhlYXAgdCkKKyAgICAgICAiYXNzaWduZWRNZW1PZmZIZWFwIiAoLmdldF9hc3NpZ25lZF9tZW1vZmZoZWFwIHQpCisgICAgICAgImFzc2lnbmVkVG90YWxNZW0iICgrICguZ2V0X2Fzc2lnbmVkX21lbW9uaGVhcCB0KSAoLmdldF9hc3NpZ25lZF9tZW1vZmZoZWFwIHQpKQorICAgICAgICJhc3NpZ25lZENwdSIgKC5nZXRfYXNzaWduZWRfY3B1IHQpfSkKKyAgICAic2NoZWR1bGVyRGlzcGxheVJlc291cmNlIiAoKlNUT1JNLUNPTkYqIENvbmZpZy9TQ0hFRFVMRVJfRElTUExBWV9SRVNPVVJDRSl9KSkKIAotKGRlZm4gdG9wb2xvZ3ktc3RhdHMgW2lkIHdpbmRvdyBzdGF0c10KKyhkZWZuIHRvcG9sb2d5LXN0YXRzIFt3aW5kb3cgc3RhdHNdCiAgIChsZXQgW3RpbWVzIChzdGF0cy10aW1lcyAoOmVtaXR0ZWQgc3RhdHMpKQogICAgICAgICBkaXNwbGF5LW1hcCAoaW50byB7fSAoZm9yIFt0IHRpbWVzXSBbdCBwcmV0dHktdXB0aW1lLXNlY10pKQogICAgICAgICBkaXNwbGF5LW1hcCAoYXNzb2MgZGlzcGxheS1tYXAgIjphbGwtdGltZSIgKGZuIFtfXSAiQWxsIHRpbWUiKSldCi0gICAgKGZvciBbayAoY29uY2F0IHRpbWVzIFsiOmFsbC10aW1lIl0pCi0gICAgICAgICAgOmxldCBbZGlzcCAoKGRpc3BsYXktbWFwIGspIGspXV0KKyAgICAoZm9yIFt3IChjb25jYXQgdGltZXMgWyI6YWxsLXRpbWUiXSkKKyAgICAgICAgICA6bGV0IFtkaXNwICgoZGlzcGxheS1tYXAgdykgdyldXQogICAgICAgeyJ3aW5kb3dQcmV0dHkiIGRpc3AKLSAgICAgICAid2luZG93IiBrCi0gICAgICAgImVtaXR0ZWQiIChnZXQtaW4gc3RhdHMgWzplbWl0dGVkIGtdKQotICAgICAgICJ0cmFuc2ZlcnJlZCIgKGdldC1pbiBzdGF0cyBbOnRyYW5zZmVycmVkIGtdKQotICAgICAgICJjb21wbGV0ZUxhdGVuY3kiIChmbG9hdC1zdHIgKGdldC1pbiBzdGF0cyBbOmNvbXBsZXRlLWxhdGVuY2llcyBrXSkpCi0gICAgICAgImFja2VkIiAoZ2V0LWluIHN0YXRzIFs6YWNrZWQga10pCi0gICAgICAgImZhaWxlZCIgKGdldC1pbiBzdGF0cyBbOmZhaWxlZCBrXSl9KSkpCisgICAgICAgIndpbmRvdyIgdworICAgICAgICJlbWl0dGVkIiAoZ2V0LWluIHN0YXRzIFs6ZW1pdHRlZCB3XSkKKyAgICAgICAidHJhbnNmZXJyZWQiIChnZXQtaW4gc3RhdHMgWzp0cmFuc2ZlcnJlZCB3XSkKKyAgICAgICAiY29tcGxldGVMYXRlbmN5IiAoZmxvYXQtc3RyIChnZXQtaW4gc3RhdHMgWzpjb21wbGV0ZS1sYXRlbmNpZXMgd10pKQorICAgICAgICJhY2tlZCIgKGdldC1pbiBzdGF0cyBbOmFja2VkIHddKQorICAgICAgICJmYWlsZWQiIChnZXQtaW4gc3RhdHMgWzpmYWlsZWQgd10pfSkpKQogCi0oZGVmbiBzcG91dC1jb21wIFt0b3AtaWQgc3VtbS1tYXAgZXJyb3JzIHdpbmRvdyBpbmNsdWRlLXN5cz8gc2VjdXJlP10KLSAgKGZvciBbW2lkIHN1bW1zXSBzdW1tLW1hcAotICAgICAgICA6bGV0IFtzdGF0cy1zZXEgKGdldC1maWxsZWQtc3RhdHMgc3VtbXMpCi0gICAgICAgICAgICAgIHN0YXRzIChhZ2dyZWdhdGUtc3BvdXQtc3RyZWFtcwotICAgICAgICAgICAgICAgICAgICAgKGFnZ3JlZ2F0ZS1zcG91dC1zdGF0cwotICAgICAgICAgICAgICAgICAgICAgIHN0YXRzLXNlcSBpbmNsdWRlLXN5cz8pKQotICAgICAgICAgICAgICBsYXN0LWVycm9yIChtb3N0LXJlY2VudC1lcnJvciAoZ2V0IGVycm9ycyBpZCkpCi0gICAgICAgICAgICAgIGVycm9yLWhvc3QgKGdldC1lcnJvci1ob3N0IGxhc3QtZXJyb3IpCi0gICAgICAgICAgICAgIGVycm9yLXBvcnQgKGdldC1lcnJvci1wb3J0IGxhc3QtZXJyb3IgZXJyb3ItaG9zdCB0b3AtaWQpXV0KLSAgICB7InNwb3V0SWQiIGlkCi0gICAgICJlbmNvZGVkU3BvdXRJZCIgKHVybC1lbmNvZGUgaWQpCi0gICAgICJleGVjdXRvcnMiIChjb3VudCBzdW1tcykKLSAgICAgInRhc2tzIiAoc3VtLXRhc2tzIHN1bW1zKQotICAgICAiZW1pdHRlZCIgKGdldC1pbiBzdGF0cyBbOmVtaXR0ZWQgd2luZG93XSkKLSAgICAgInRyYW5zZmVycmVkIiAoZ2V0LWluIHN0YXRzIFs6dHJhbnNmZXJyZWQgd2luZG93XSkKLSAgICAgImNvbXBsZXRlTGF0ZW5jeSIgKGZsb2F0LXN0ciAoZ2V0LWluIHN0YXRzIFs6Y29tcGxldGUtbGF0ZW5jaWVzIHdpbmRvd10pKQotICAgICAiYWNrZWQiIChnZXQtaW4gc3RhdHMgWzphY2tlZCB3aW5kb3ddKQotICAgICAiZmFpbGVkIiAoZ2V0LWluIHN0YXRzIFs6ZmFpbGVkIHdpbmRvd10pCi0gICAgICJlcnJvckhvc3QiIGVycm9yLWhvc3QKLSAgICAgImVycm9yUG9ydCIgZXJyb3ItcG9ydAotICAgICAiZXJyb3JXb3JrZXJMb2dMaW5rIiAod29ya2VyLWxvZy1saW5rIGVycm9yLWhvc3QgZXJyb3ItcG9ydCB0b3AtaWQgc2VjdXJlPykKLSAgICAgImVycm9yTGFwc2VkU2VjcyIgKGdldC1lcnJvci10aW1lIGxhc3QtZXJyb3IpCi0gICAgICJsYXN0RXJyb3IiIChnZXQtZXJyb3ItZGF0YSBsYXN0LWVycm9yKQotICAgICAidGltZSIgKGlmIGxhc3QtZXJyb3IgKCogMTAwMCAobG9uZyAoLmdldF9lcnJvcl90aW1lX3NlY3MgXkVycm9ySW5mbyBsYXN0LWVycm9yKSkpKX0pKQorKGRlZm4gYnVpbGQtdmlzdWFsaXphdGlvbiBbaWQgd2luZG93IGluY2x1ZGUtc3lzP10KKyAgKHRocmlmdC93aXRoLWNvbmZpZ3VyZWQtbmltYnVzLWNvbm5lY3Rpb24gbmltYnVzCisgICAgKGxldCBbd2luZG93IChpZiB3aW5kb3cgd2luZG93ICI6YWxsLXRpbWUiKQorICAgICAgICAgIHRvcG9sb2d5LWluZm8gKC0+PiAoZG90bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChHZXRJbmZvT3B0aW9ucy4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC5zZXRfbnVtX2Vycl9jaG9pY2UgTnVtRXJyb3JzQ2hvaWNlL09ORSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICguZ2V0VG9wb2xvZ3lJbmZvV2l0aE9wdHMgXk5pbWJ1cyRDbGllbnQgbmltYnVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQpKQorICAgICAgICAgIHN0b3JtLXRvcG9sb2d5ICguZ2V0VG9wb2xvZ3kgXk5pbWJ1cyRDbGllbnQgbmltYnVzIGlkKQorICAgICAgICAgIHNwb3V0LWV4ZWN1dG9yLXN1bW1hcmllcyAoZmlsdGVyIChwYXJ0aWFsIHNwb3V0LXN1bW1hcnk/IHN0b3JtLXRvcG9sb2d5KSAoLmdldF9leGVjdXRvcnMgdG9wb2xvZ3ktaW5mbykpCisgICAgICAgICAgYm9sdC1leGVjdXRvci1zdW1tYXJpZXMgKGZpbHRlciAocGFydGlhbCBib2x0LXN1bW1hcnk/IHN0b3JtLXRvcG9sb2d5KSAoLmdldF9leGVjdXRvcnMgdG9wb2xvZ3ktaW5mbykpCisgICAgICAgICAgc3BvdXQtY29tcC1pZC0+ZXhlY3V0b3Itc3VtbWFyaWVzIChncm91cC1ieS1jb21wIHNwb3V0LWV4ZWN1dG9yLXN1bW1hcmllcykKKyAgICAgICAgICBib2x0LWNvbXAtaWQtPmV4ZWN1dG9yLXN1bW1hcmllcyAoZ3JvdXAtYnktY29tcCBib2x0LWV4ZWN1dG9yLXN1bW1hcmllcykKKyAgICAgICAgICBib2x0LWNvbXAtaWQtPmV4ZWN1dG9yLXN1bW1hcmllcyAoZmlsdGVyLWtleSAobWstaW5jbHVkZS1zeXMtZm4gaW5jbHVkZS1zeXM/KSBib2x0LWNvbXAtaWQtPmV4ZWN1dG9yLXN1bW1hcmllcykKKyAgICAgICAgICBpZC0+c3BvdXQtc3BlYyAoLmdldF9zcG91dHMgc3Rvcm0tdG9wb2xvZ3kpCisgICAgICAgICAgaWQtPmJvbHQgKC5nZXRfYm9sdHMgc3Rvcm0tdG9wb2xvZ3kpCisgICAgICAgICAgdmlzdWFsaXplci1kYXRhICh2aXN1YWxpemF0aW9uLWRhdGEgKG1lcmdlIChoYXNobWFwLXRvLXBlcnNpc3RlbnQgaWQtPnNwb3V0LXNwZWMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChoYXNobWFwLXRvLXBlcnNpc3RlbnQgaWQtPmJvbHQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwb3V0LWNvbXAtaWQtPmV4ZWN1dG9yLXN1bW1hcmllcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvbHQtY29tcC1pZC0+ZXhlY3V0b3Itc3VtbWFyaWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQpXQorICAgICAgIHsidmlzdWFsaXphdGlvblRhYmxlIiAoc3RyZWFtLWJveGVzIHZpc3VhbGl6ZXItZGF0YSl9KSkpCiAKLShkZWZuIGJvbHQtY29tcCBbdG9wLWlkIHN1bW0tbWFwIGVycm9ycyB3aW5kb3cgaW5jbHVkZS1zeXM/IHNlY3VyZT9dCi0gIChmb3IgW1tpZCBzdW1tc10gc3VtbS1tYXAKLSAgICAgICAgOmxldCBbc3RhdHMtc2VxIChnZXQtZmlsbGVkLXN0YXRzIHN1bW1zKQotICAgICAgICAgICAgICBzdGF0cyAoYWdncmVnYXRlLWJvbHQtc3RyZWFtcwotICAgICAgICAgICAgICAgICAgICAgKGFnZ3JlZ2F0ZS1ib2x0LXN0YXRzCi0gICAgICAgICAgICAgICAgICAgICAgc3RhdHMtc2VxIGluY2x1ZGUtc3lzPykpCi0gICAgICAgICAgICAgIGxhc3QtZXJyb3IgKG1vc3QtcmVjZW50LWVycm9yIChnZXQgZXJyb3JzIGlkKSkKLSAgICAgICAgICAgICAgZXJyb3ItaG9zdCAoZ2V0LWVycm9yLWhvc3QgbGFzdC1lcnJvcikKLSAgICAgICAgICAgICAgZXJyb3ItcG9ydCAoZ2V0LWVycm9yLXBvcnQgbGFzdC1lcnJvciBlcnJvci1ob3N0IHRvcC1pZCldXQotICAgIHsiYm9sdElkIiBpZAotICAgICAiZW5jb2RlZEJvbHRJZCIgKHVybC1lbmNvZGUgaWQpCi0gICAgICJleGVjdXRvcnMiIChjb3VudCBzdW1tcykKLSAgICAgInRhc2tzIiAoc3VtLXRhc2tzIHN1bW1zKQotICAgICAiZW1pdHRlZCIgKGdldC1pbiBzdGF0cyBbOmVtaXR0ZWQgd2luZG93XSkKLSAgICAgInRyYW5zZmVycmVkIiAoZ2V0LWluIHN0YXRzIFs6dHJhbnNmZXJyZWQgd2luZG93XSkKLSAgICAgImNhcGFjaXR5IiAoZmxvYXQtc3RyIChuaWwtdG8temVybyAoY29tcHV0ZS1ib2x0LWNhcGFjaXR5IHN1bW1zKSkpCi0gICAgICJleGVjdXRlTGF0ZW5jeSIgKGZsb2F0LXN0ciAoZ2V0LWluIHN0YXRzIFs6ZXhlY3V0ZS1sYXRlbmNpZXMgd2luZG93XSkpCi0gICAgICJleGVjdXRlZCIgKGdldC1pbiBzdGF0cyBbOmV4ZWN1dGVkIHdpbmRvd10pCi0gICAgICJwcm9jZXNzTGF0ZW5jeSIgKGZsb2F0LXN0ciAoZ2V0LWluIHN0YXRzIFs6cHJvY2Vzcy1sYXRlbmNpZXMgd2luZG93XSkpCi0gICAgICJhY2tlZCIgKGdldC1pbiBzdGF0cyBbOmFja2VkIHdpbmRvd10pCi0gICAgICJmYWlsZWQiIChnZXQtaW4gc3RhdHMgWzpmYWlsZWQgd2luZG93XSkKLSAgICAgImVycm9ySG9zdCIgZXJyb3ItaG9zdAotICAgICAiZXJyb3JQb3J0IiBlcnJvci1wb3J0Ci0gICAgICJlcnJvcldvcmtlckxvZ0xpbmsiICh3b3JrZXItbG9nLWxpbmsgZXJyb3ItaG9zdCBlcnJvci1wb3J0IHRvcC1pZCBzZWN1cmU/KQotICAgICAiZXJyb3JMYXBzZWRTZWNzIiAoZ2V0LWVycm9yLXRpbWUgbGFzdC1lcnJvcikKLSAgICAgImxhc3RFcnJvciIgKGdldC1lcnJvci1kYXRhIGxhc3QtZXJyb3IpCi0gICAgICJ0aW1lIiAoaWYgbGFzdC1lcnJvciAoKiAxMDAwIChsb25nICguZ2V0X2Vycm9yX3RpbWVfc2VjcyBeRXJyb3JJbmZvIGxhc3QtZXJyb3IpKSkpfSkpCisoZGVmbi0gZ2V0LWVycm9yLWpzb24KKyAgW3RvcG8taWQgZXJyb3ItaW5mbyBzZWN1cmU/XQorICAobGV0IFtob3N0IChnZXQtZXJyb3ItaG9zdCBlcnJvci1pbmZvKQorICAgICAgICBwb3J0IChnZXQtZXJyb3ItcG9ydCBlcnJvci1pbmZvKV0KKyAgICB7Imxhc3RFcnJvciIgKGdldC1lcnJvci1kYXRhIGVycm9yLWluZm8pCisgICAgICJlcnJvclRpbWUiIChnZXQtZXJyb3ItdGltZSBlcnJvci1pbmZvKQorICAgICAiZXJyb3JIb3N0IiBob3N0CisgICAgICJlcnJvclBvcnQiIHBvcnQKKyAgICAgImVycm9yTGFwc2VkU2VjcyIgKGdldC1lcnJvci10aW1lIGVycm9yLWluZm8pCisgICAgICJlcnJvcldvcmtlckxvZ0xpbmsiICh3b3JrZXItbG9nLWxpbmsgaG9zdCBwb3J0IHRvcG8taWQgc2VjdXJlPyl9KSkKIAotKGRlZm4gdG9wb2xvZ3ktc3VtbWFyeSBbXlRvcG9sb2d5SW5mbyBzdW1tXQotICAobGV0IFtleGVjdXRvcnMgKC5nZXRfZXhlY3V0b3JzIHN1bW0pCi0gICAgICAgIHdvcmtlcnMgKHNldCAoZm9yIFteRXhlY3V0b3JTdW1tYXJ5IGUgZXhlY3V0b3JzXQotICAgICAgICAgICAgICAgICAgICAgICBbKC5nZXRfaG9zdCBlKSAoLmdldF9wb3J0IGUpXSkpCi0gICAgICAgIHRvcG9sb2d5LWlkICguZ2V0X2lkIHN1bW0pCi0gICAgICAgIGRlYnVnLW9wdGlvbnMgKGdldCAoLmdldF9jb21wb25lbnRfZGVidWcgc3VtbSkgdG9wb2xvZ3ktaWQpXQotICAgICAgeyJpZCIgdG9wb2xvZ3ktaWQKLSAgICAgICAiZW5jb2RlZElkIiAodXJsLWVuY29kZSAoLmdldF9pZCBzdW1tKSkKLSAgICAgICAib3duZXIiICguZ2V0X293bmVyIHN1bW0pCi0gICAgICAgIm5hbWUiICguZ2V0X25hbWUgc3VtbSkKLSAgICAgICAic3RhdHVzIiAoLmdldF9zdGF0dXMgc3VtbSkKLSAgICAgICAidXB0aW1lIiAocHJldHR5LXVwdGltZS1zZWMgKC5nZXRfdXB0aW1lX3NlY3Mgc3VtbSkpCi0gICAgICAgInRhc2tzVG90YWwiIChzdW0tdGFza3MgZXhlY3V0b3JzKQotICAgICAgICJ3b3JrZXJzVG90YWwiIChjb3VudCB3b3JrZXJzKQotICAgICAgICJleGVjdXRvcnNUb3RhbCIgKGNvdW50IGV4ZWN1dG9ycykKLSAgICAgICAic2NoZWR1bGVySW5mbyIgKC5nZXRfc2NoZWRfc3RhdHVzIHN1bW0pCi0gICAgICAgImRlYnVnIiAoaWYgKG5vdC1uaWw/IGRlYnVnLW9wdGlvbnMpICguaXNfZW5hYmxlIGRlYnVnLW9wdGlvbnMpIGZhbHNlKQotICAgICAgICJzYW1wbGluZ1BjdCIgKGlmIChub3QtbmlsPyBkZWJ1Zy1vcHRpb25zKSAoLmdldF9zYW1wbGluZ3BjdCBkZWJ1Zy1vcHRpb25zKSAxMCkKLSAgICAgICAicmVwbGljYXRpb25Db3VudCIgKC5nZXRfcmVwbGljYXRpb25fY291bnQgc3VtbSl9KSkKKyhkZWZuLSBjb21tb24tYWdnLXN0YXRzLWpzb24KKyAgIlJldHVybnMgYSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIGEgY29tbW9uIGFnZ3JlZ2F0ZWQgc3RhdGlzdGljcy4iCisgIFteQ29tbW9uQWdncmVnYXRlU3RhdHMgY29tbW9uLXN0YXRzXQorICB7ImV4ZWN1dG9ycyIgKC5nZXRfbnVtX2V4ZWN1dG9ycyBjb21tb24tc3RhdHMpCisgICAidGFza3MiICguZ2V0X251bV90YXNrcyBjb21tb24tc3RhdHMpCisgICAiZW1pdHRlZCIgKC5nZXRfZW1pdHRlZCBjb21tb24tc3RhdHMpCisgICAidHJhbnNmZXJyZWQiICguZ2V0X3RyYW5zZmVycmVkIGNvbW1vbi1zdGF0cykKKyAgICJhY2tlZCIgKC5nZXRfYWNrZWQgY29tbW9uLXN0YXRzKQorICAgImZhaWxlZCIgKC5nZXRfZmFpbGVkIGNvbW1vbi1zdGF0cyl9KQogCi0oZGVmbiBzcG91dC1zdW1tYXJ5LWpzb24gW3RvcG9sb2d5LWlkIGlkIHN0YXRzIHdpbmRvd10KLSAgKGxldCBbdGltZXMgKHN0YXRzLXRpbWVzICg6ZW1pdHRlZCBzdGF0cykpCi0gICAgICAgIGRpc3BsYXktbWFwIChpbnRvIHt9IChmb3IgW3QgdGltZXNdIFt0IHByZXR0eS11cHRpbWUtc2VjXSkpCi0gICAgICAgIGRpc3BsYXktbWFwIChhc3NvYyBkaXNwbGF5LW1hcCAiOmFsbC10aW1lIiAoZm4gW19dICJBbGwgdGltZSIpKV0KLSAgICAgKGZvciBbayAoY29uY2F0IHRpbWVzIFsiOmFsbC10aW1lIl0pCi0gICAgICAgICAgIDpsZXQgW2Rpc3AgKChkaXNwbGF5LW1hcCBrKSBrKV1dCi0gICAgICAgeyJ3aW5kb3dQcmV0dHkiIGRpc3AKLSAgICAgICAgIndpbmRvdyIgawotICAgICAgICAiZW1pdHRlZCIgKGdldC1pbiBzdGF0cyBbOmVtaXR0ZWQga10pCi0gICAgICAgICJ0cmFuc2ZlcnJlZCIgKGdldC1pbiBzdGF0cyBbOnRyYW5zZmVycmVkIGtdKQotICAgICAgICAiY29tcGxldGVMYXRlbmN5IiAoZmxvYXQtc3RyIChnZXQtaW4gc3RhdHMgWzpjb21wbGV0ZS1sYXRlbmNpZXMga10pKQotICAgICAgICAiYWNrZWQiIChnZXQtaW4gc3RhdHMgWzphY2tlZCBrXSkKLSAgICAgICAgImZhaWxlZCIgKGdldC1pbiBzdGF0cyBbOmZhaWxlZCBrXSl9KSkpCisoZGVmbXVsdGkgY29tcC1hZ2ctc3RhdHMtanNvbgorICAiUmV0dXJucyBhIEpTT04gcmVwcmVzZW50YXRpb24gb2YgYWdncmVnYXRlZCBzdGF0aXN0aWNzLiIKKyAgKGZuIFtfIF8gW2lkIF5Db21wb25lbnRBZ2dyZWdhdGVTdGF0cyBzXV0gKC5nZXRfdHlwZSBzKSkpCisKKyhkZWZtZXRob2QgY29tcC1hZ2ctc3RhdHMtanNvbiBDb21wb25lbnRUeXBlL1NQT1VUCisgIFt0b3BvLWlkIHNlY3VyZT8gW2lkIF5Db21wb25lbnRBZ2dyZWdhdGVTdGF0cyBzXV0KKyAgKGxldCBbXlNwb3V0QWdncmVnYXRlU3RhdHMgc3MgKC4uIHMgZ2V0X3NwZWNpZmljX3N0YXRzIGdldF9zcG91dCkKKyAgICAgICAgY3MgKC5nZXRfY29tbW9uX3N0YXRzIHMpXQorICAgIChtZXJnZQorICAgICAgKGNvbW1vbi1hZ2ctc3RhdHMtanNvbiBjcykKKyAgICAgIChnZXQtZXJyb3ItanNvbiB0b3BvLWlkICguZ2V0X2xhc3RfZXJyb3Igcykgc2VjdXJlPykKKyAgICAgIHsic3BvdXRJZCIgaWQKKyAgICAgICAiZW5jb2RlZFNwb3V0SWQiICh1cmwtZW5jb2RlIGlkKQorICAgICAgICJjb21wbGV0ZUxhdGVuY3kiIChmbG9hdC1zdHIgKC5nZXRfY29tcGxldGVfbGF0ZW5jeV9tcyBzcykpfSkpKQorCisoZGVmbWV0aG9kIGNvbXAtYWdnLXN0YXRzLWpzb24gQ29tcG9uZW50VHlwZS9CT0xUCisgIFt0b3BvLWlkIHNlY3VyZT8gW2lkIF5Db21wb25lbnRBZ2dyZWdhdGVTdGF0cyBzXV0KKyAgKGxldCBbXkJvbHRBZ2dyZWdhdGVTdGF0cyBzcyAoLi4gcyBnZXRfc3BlY2lmaWNfc3RhdHMgZ2V0X2JvbHQpCisgICAgICAgIGNzICguZ2V0X2NvbW1vbl9zdGF0cyBzKV0KKyAgICAobWVyZ2UKKyAgICAgIChjb21tb24tYWdnLXN0YXRzLWpzb24gY3MpCisgICAgICAoZ2V0LWVycm9yLWpzb24gdG9wby1pZCAoLmdldF9sYXN0X2Vycm9yIHMpIHNlY3VyZT8pCisgICAgICB7ImJvbHRJZCIgaWQKKyAgICAgICAiZW5jb2RlZEJvbHRJZCIgKHVybC1lbmNvZGUgaWQpCisgICAgICAgImNhcGFjaXR5IiAoZmxvYXQtc3RyICguZ2V0X2NhcGFjaXR5IHNzKSkKKyAgICAgICAiZXhlY3V0ZUxhdGVuY3kiIChmbG9hdC1zdHIgKC5nZXRfZXhlY3V0ZV9sYXRlbmN5X21zIHNzKSkKKyAgICAgICAiZXhlY3V0ZWQiICguZ2V0X2V4ZWN1dGVkIHNzKQorICAgICAgICJwcm9jZXNzTGF0ZW5jeSIgKGZsb2F0LXN0ciAoLmdldF9wcm9jZXNzX2xhdGVuY3lfbXMgc3MpKX0pKSkKKworKGRlZm4tIHVucGFjay10b3BvbG9neS1wYWdlLWluZm8KKyAgIlVucGFja3MgdGhlIHNlcmlhbGl6ZWQgb2JqZWN0IHRvIGRhdGEgc3RydWN0dXJlcyIKKyAgW15Ub3BvbG9neVBhZ2VJbmZvIHRvcG8taW5mbyB3aW5kb3cgc2VjdXJlP10KKyAgKGxldCBbaWQgKC5nZXRfaWQgdG9wby1pbmZvKQorICAgICAgICBeVG9wb2xvZ3lTdGF0cyB0b3BvLXN0YXRzICguZ2V0X3RvcG9sb2d5X3N0YXRzIHRvcG8taW5mbykKKyAgICAgICAgc3RhdC0+d2luZG93LT5udW1iZXIKKyAgICAgICAgICB7OmVtaXR0ZWQgKC5nZXRfd2luZG93X3RvX2VtaXR0ZWQgdG9wby1zdGF0cykKKyAgICAgICAgICAgOnRyYW5zZmVycmVkICguZ2V0X3dpbmRvd190b190cmFuc2ZlcnJlZCB0b3BvLXN0YXRzKQorICAgICAgICAgICA6Y29tcGxldGUtbGF0ZW5jaWVzICguZ2V0X3dpbmRvd190b19jb21wbGV0ZV9sYXRlbmNpZXNfbXMgdG9wby1zdGF0cykKKyAgICAgICAgICAgOmFja2VkICguZ2V0X3dpbmRvd190b19hY2tlZCB0b3BvLXN0YXRzKQorICAgICAgICAgICA6ZmFpbGVkICguZ2V0X3dpbmRvd190b19mYWlsZWQgdG9wby1zdGF0cyl9CisgICAgICAgIHRvcG8tc3RhdHMgKHRvcG9sb2d5LXN0YXRzIHdpbmRvdyBzdGF0LT53aW5kb3ctPm51bWJlcikKKyAgICAgICAgW2RlYnVnRW5hYmxlZAorICAgICAgICAgc2FtcGxpbmdQY3RdIChpZi1sZXQgW2RlYnVnLW9wdHMgKC5nZXRfZGVidWdfb3B0aW9ucyB0b3BvLWluZm8pXQorICAgICAgICAgICAgICAgICAgICAgICAgWyguaXNfZW5hYmxlIGRlYnVnLW9wdHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgKC5nZXRfc2FtcGxpbmdwY3QgZGVidWctb3B0cyldKQorICAgICAgICB1cHRpbWUgKC5nZXRfdXB0aW1lX3NlY3MgdG9wby1pbmZvKV0KKyAgICB7ImlkIiBpZAorICAgICAiZW5jb2RlZElkIiAodXJsLWVuY29kZSBpZCkKKyAgICAgIm93bmVyIiAoLmdldF9vd25lciB0b3BvLWluZm8pCisgICAgICJuYW1lIiAoLmdldF9uYW1lIHRvcG8taW5mbykKKyAgICAgInN0YXR1cyIgKC5nZXRfc3RhdHVzIHRvcG8taW5mbykKKyAgICAgInVwdGltZSIgKHByZXR0eS11cHRpbWUtc2VjIHVwdGltZSkKKyAgICAgInVwdGltZVNlY29uZHMiIHVwdGltZQorICAgICAidGFza3NUb3RhbCIgKC5nZXRfbnVtX3Rhc2tzIHRvcG8taW5mbykKKyAgICAgIndvcmtlcnNUb3RhbCIgKC5nZXRfbnVtX3dvcmtlcnMgdG9wby1pbmZvKQorICAgICAiZXhlY3V0b3JzVG90YWwiICguZ2V0X251bV9leGVjdXRvcnMgdG9wby1pbmZvKQorICAgICAic2NoZWR1bGVySW5mbyIgKC5nZXRfc2NoZWRfc3RhdHVzIHRvcG8taW5mbykKKyAgICAgInJlcXVlc3RlZE1lbU9uSGVhcCIgKC5nZXRfcmVxdWVzdGVkX21lbW9uaGVhcCB0b3BvLWluZm8pCisgICAgICJyZXF1ZXN0ZWRNZW1PZmZIZWFwIiAoLmdldF9yZXF1ZXN0ZWRfbWVtb2ZmaGVhcCB0b3BvLWluZm8pCisgICAgICJyZXF1ZXN0ZWRDcHUiICguZ2V0X3JlcXVlc3RlZF9jcHUgdG9wby1pbmZvKQorICAgICAiYXNzaWduZWRNZW1PbkhlYXAiICguZ2V0X2Fzc2lnbmVkX21lbW9uaGVhcCB0b3BvLWluZm8pCisgICAgICJhc3NpZ25lZE1lbU9mZkhlYXAiICguZ2V0X2Fzc2lnbmVkX21lbW9mZmhlYXAgdG9wby1pbmZvKQorICAgICAiYXNzaWduZWRUb3RhbE1lbSIgKCsgKC5nZXRfYXNzaWduZWRfbWVtb25oZWFwIHRvcG8taW5mbykgKC5nZXRfYXNzaWduZWRfbWVtb2ZmaGVhcCB0b3BvLWluZm8pKQorICAgICAiYXNzaWduZWRDcHUiICguZ2V0X2Fzc2lnbmVkX2NwdSB0b3BvLWluZm8pCisgICAgICJ0b3BvbG9neVN0YXRzIiB0b3BvLXN0YXRzCisgICAgICJzcG91dHMiIChtYXAgKHBhcnRpYWwgY29tcC1hZ2ctc3RhdHMtanNvbiBpZCBzZWN1cmU/KQorICAgICAgICAgICAgICAgICAgICguZ2V0X2lkX3RvX3Nwb3V0X2FnZ19zdGF0cyB0b3BvLWluZm8pKQorICAgICAiYm9sdHMiIChtYXAgKHBhcnRpYWwgY29tcC1hZ2ctc3RhdHMtanNvbiBpZCBzZWN1cmU/KQorICAgICAgICAgICAgICAgICAgKC5nZXRfaWRfdG9fYm9sdF9hZ2dfc3RhdHMgdG9wby1pbmZvKSkKKyAgICAgImNvbmZpZ3VyYXRpb24iICguZ2V0X3RvcG9sb2d5X2NvbmYgdG9wby1pbmZvKQorICAgICAiZGVidWciIChvciBkZWJ1Z0VuYWJsZWQgZmFsc2UpCisgICAgICJzYW1wbGluZ1BjdCIgKG9yIHNhbXBsaW5nUGN0IDEwKQorICAgICAicmVwbGljYXRpb25Db3VudCIgKC5nZXRfcmVwbGljYXRpb25fY291bnQgdG9wby1pbmZvKX0pKQorCisoZGVmbiBleGVjLWhvc3QtcG9ydAorICBbZXhlY3V0b3JzXQorICAoZm9yIFteRXhlY3V0b3JTdW1tYXJ5IGUgZXhlY3V0b3JzXQorICAgIHsiaG9zdCIgKC5nZXRfaG9zdCBlKQorICAgICAicG9ydCIgKC5nZXRfcG9ydCBlKX0pKQorCisoZGVmbiB3b3JrZXItaG9zdC1wb3J0CisgICJHZXQgdGhlIHNldCBvZiBhbGwgd29ya2VyIGhvc3QvcG9ydHMiCisgIFtpZF0KKyAgKHRocmlmdC93aXRoLWNvbmZpZ3VyZWQtbmltYnVzLWNvbm5lY3Rpb24gbmltYnVzCisgICAgKGRpc3RpbmN0IChleGVjLWhvc3QtcG9ydCAoLmdldF9leGVjdXRvcnMgKGdldC10b3BvbG9neS1pbmZvIG5pbWJ1cyBpZCkpKSkpKQogCiAoZGVmbiB0b3BvbG9neS1wYWdlIFtpZCB3aW5kb3cgaW5jbHVkZS1zeXM/IHVzZXIgc2VjdXJlP10KICAgKHRocmlmdC93aXRoLWNvbmZpZ3VyZWQtbmltYnVzLWNvbm5lY3Rpb24gbmltYnVzCiAgICAgKGxldCBbd2luZG93IChpZiB3aW5kb3cgd2luZG93ICI6YWxsLXRpbWUiKQogICAgICAgICAgIHdpbmRvdy1oaW50ICh3aW5kb3ctaGludCB3aW5kb3cpCi0gICAgICAgICAgc3VtbSAoLT4+IChkb3RvCi0gICAgICAgICAgICAgICAgICAgICAgKEdldEluZm9PcHRpb25zLikKLSAgICAgICAgICAgICAgICAgICAgICAoLnNldF9udW1fZXJyX2Nob2ljZSBOdW1FcnJvcnNDaG9pY2UvT05FKSkKLSAgICAgICAgICAgICAgICAgICAgKC5nZXRUb3BvbG9neUluZm9XaXRoT3B0cyBeTmltYnVzJENsaWVudCBuaW1idXMgaWQpKQotICAgICAgICAgIHRvcG9sb2d5ICguZ2V0VG9wb2xvZ3kgXk5pbWJ1cyRDbGllbnQgbmltYnVzIGlkKQotICAgICAgICAgIHRvcG9sb2d5LWNvbmYgKGZyb20tanNvbiAoLmdldFRvcG9sb2d5Q29uZiBeTmltYnVzJENsaWVudCBuaW1idXMgaWQpKQotICAgICAgICAgIHNwb3V0LXN1bW1zIChmaWx0ZXIgKHBhcnRpYWwgc3BvdXQtc3VtbWFyeT8gdG9wb2xvZ3kpICguZ2V0X2V4ZWN1dG9ycyBzdW1tKSkKLSAgICAgICAgICBib2x0LXN1bW1zIChmaWx0ZXIgKHBhcnRpYWwgYm9sdC1zdW1tYXJ5PyB0b3BvbG9neSkgKC5nZXRfZXhlY3V0b3JzIHN1bW0pKQotICAgICAgICAgIHNwb3V0LWNvbXAtc3VtbXMgKGdyb3VwLWJ5LWNvbXAgc3BvdXQtc3VtbXMpCi0gICAgICAgICAgYm9sdC1jb21wLXN1bW1zIChncm91cC1ieS1jb21wIGJvbHQtc3VtbXMpCi0gICAgICAgICAgYm9sdC1jb21wLXN1bW1zIChmaWx0ZXIta2V5IChtay1pbmNsdWRlLXN5cy1mbiBpbmNsdWRlLXN5cz8pIGJvbHQtY29tcC1zdW1tcykKLSAgICAgICAgICBuYW1lICguZ2V0X25hbWUgc3VtbSkKLSAgICAgICAgICBzdGF0dXMgKC5nZXRfc3RhdHVzIHN1bW0pCi0gICAgICAgICAgbXNnLXRpbWVvdXQgKHRvcG9sb2d5LWNvbmYgVE9QT0xPR1ktTUVTU0FHRS1USU1FT1VULVNFQ1MpCi0gICAgICAgICAgc3BvdXRzICguZ2V0X3Nwb3V0cyB0b3BvbG9neSkKLSAgICAgICAgICBib2x0cyAoLmdldF9ib2x0cyB0b3BvbG9neSkKLSAgICAgICAgICByZXBsaWNhdGlvbi1jb3VudCAoLmdldF9yZXBsaWNhdGlvbl9jb3VudCBzdW1tKQotICAgICAgICAgIHZpc3VhbGl6ZXItZGF0YSAodmlzdWFsaXphdGlvbi1kYXRhIChtZXJnZSAoaGFzaG1hcC10by1wZXJzaXN0ZW50IHNwb3V0cykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGhhc2htYXAtdG8tcGVyc2lzdGVudCBib2x0cykpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BvdXQtY29tcC1zdW1tcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvbHQtY29tcC1zdW1tcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkKV0KKyAgICAgICAgICB0b3BvLXBhZ2UtaW5mbyAoLmdldFRvcG9sb2d5UGFnZUluZm8gXk5pbWJ1cyRDbGllbnQgbmltYnVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlLXN5cz8pCisgICAgICAgICAgdG9wb2xvZ3ktY29uZiAoZnJvbS1qc29uICguZ2V0X3RvcG9sb2d5X2NvbmYgdG9wby1wYWdlLWluZm8pKQorICAgICAgICAgIG1zZy10aW1lb3V0ICh0b3BvbG9neS1jb25mIFRPUE9MT0dZLU1FU1NBR0UtVElNRU9VVC1TRUNTKV0KICAgICAgIChtZXJnZQotICAgICAgICh0b3BvbG9neS1zdW1tYXJ5IHN1bW0pCisgICAgICAgKHVucGFjay10b3BvbG9neS1wYWdlLWluZm8gdG9wby1wYWdlLWluZm8gd2luZG93IHNlY3VyZT8pCiAgICAgICAgeyJ1c2VyIiB1c2VyCiAgICAgICAgICJ3aW5kb3ciIHdpbmRvdwogICAgICAgICAid2luZG93SGludCIgd2luZG93LWhpbnQKICAgICAgICAgIm1zZ1RpbWVvdXQiIG1zZy10aW1lb3V0Ci0gICAgICAgICJ0b3BvbG9neVN0YXRzIiAodG9wb2xvZ3ktc3RhdHMgaWQgd2luZG93ICh0b3RhbC1hZ2dyZWdhdGUtc3RhdHMgc3BvdXQtc3VtbXMgYm9sdC1zdW1tcyBpbmNsdWRlLXN5cz8pKQotICAgICAgICAic3BvdXRzIiAoc3BvdXQtY29tcCBpZCBzcG91dC1jb21wLXN1bW1zICguZ2V0X2Vycm9ycyBzdW1tKSB3aW5kb3cgaW5jbHVkZS1zeXM/IHNlY3VyZT8pCi0gICAgICAgICJib2x0cyIgKGJvbHQtY29tcCBpZCBib2x0LWNvbXAtc3VtbXMgKC5nZXRfZXJyb3JzIHN1bW0pIHdpbmRvdyBpbmNsdWRlLXN5cz8gc2VjdXJlPykKICAgICAgICAgImNvbmZpZ3VyYXRpb24iIHRvcG9sb2d5LWNvbmYKLSAgICAgICAgInZpc3VhbGl6YXRpb25UYWJsZSIgKHN0cmVhbS1ib3hlcyB2aXN1YWxpemVyLWRhdGEpCi0gICAgICAgICJyZXBsaWNhdGlvbkNvdW50IiByZXBsaWNhdGlvbi1jb3VudH0pKSkpCi0KLShkZWZuIHNwb3V0LW91dHB1dC1zdGF0cwotICBbc3RyZWFtLXN1bW1hcnkgd2luZG93XQotICAobGV0IFtzdHJlYW0tc3VtbWFyeSAobWFwLXZhbCBzd2FwLW1hcC1vcmRlciAoc3dhcC1tYXAtb3JkZXIgc3RyZWFtLXN1bW1hcnkpKV0KLSAgICAoZm9yIFtbcyBzdGF0c10gKHN0cmVhbS1zdW1tYXJ5IHdpbmRvdyldCi0gICAgICB7InN0cmVhbSIgcwotICAgICAgICJlbWl0dGVkIiAobmlsLXRvLXplcm8gKDplbWl0dGVkIHN0YXRzKSkKLSAgICAgICAidHJhbnNmZXJyZWQiIChuaWwtdG8temVybyAoOnRyYW5zZmVycmVkIHN0YXRzKSkKLSAgICAgICAiY29tcGxldGVMYXRlbmN5IiAoZmxvYXQtc3RyICg6Y29tcGxldGUtbGF0ZW5jaWVzIHN0YXRzKSkKLSAgICAgICAiYWNrZWQiIChuaWwtdG8temVybyAoOmFja2VkIHN0YXRzKSkKLSAgICAgICAiZmFpbGVkIiAobmlsLXRvLXplcm8gKDpmYWlsZWQgc3RhdHMpKX0pKSkKLQotKGRlZm4gc3BvdXQtZXhlY3V0b3Itc3RhdHMKLSAgW3RvcG9sb2d5LWlkIGV4ZWN1dG9ycyB3aW5kb3cgaW5jbHVkZS1zeXM/IHNlY3VyZT9dCi0gIChmb3IgW15FeGVjdXRvclN1bW1hcnkgZSBleGVjdXRvcnMKLSAgICAgICAgOmxldCBbc3RhdHMgKC5nZXRfc3RhdHMgZSkKLSAgICAgICAgICAgICAgc3RhdHMgKGlmIHN0YXRzCi0gICAgICAgICAgICAgICAgICAgICAgKC0+IHN0YXRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChhZ2dyZWdhdGUtc3BvdXQtc3RhdHMgaW5jbHVkZS1zeXM/KQotICAgICAgICAgICAgICAgICAgICAgICAgICBhZ2dyZWdhdGUtc3BvdXQtc3RyZWFtcwotICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwLW1hcC1vcmRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2V0IHdpbmRvdykpKV1dCi0gICAgeyJpZCIgKHByZXR0eS1leGVjdXRvci1pbmZvICguZ2V0X2V4ZWN1dG9yX2luZm8gZSkpCi0gICAgICJlbmNvZGVkSWQiICh1cmwtZW5jb2RlIChwcmV0dHktZXhlY3V0b3ItaW5mbyAoLmdldF9leGVjdXRvcl9pbmZvIGUpKSkKLSAgICAgInVwdGltZSIgKHByZXR0eS11cHRpbWUtc2VjICguZ2V0X3VwdGltZV9zZWNzIGUpKQotICAgICAiaG9zdCIgKC5nZXRfaG9zdCBlKQotICAgICAicG9ydCIgKC5nZXRfcG9ydCBlKQotICAgICAiZW1pdHRlZCIgKG5pbC10by16ZXJvICg6ZW1pdHRlZCBzdGF0cykpCi0gICAgICJ0cmFuc2ZlcnJlZCIgKG5pbC10by16ZXJvICg6dHJhbnNmZXJyZWQgc3RhdHMpKQotICAgICAiY29tcGxldGVMYXRlbmN5IiAoZmxvYXQtc3RyICg6Y29tcGxldGUtbGF0ZW5jaWVzIHN0YXRzKSkKLSAgICAgImFja2VkIiAobmlsLXRvLXplcm8gKDphY2tlZCBzdGF0cykpCi0gICAgICJmYWlsZWQiIChuaWwtdG8temVybyAoOmZhaWxlZCBzdGF0cykpCi0gICAgICJ3b3JrZXJMb2dMaW5rIiAod29ya2VyLWxvZy1saW5rICguZ2V0X2hvc3QgZSkgKC5nZXRfcG9ydCBlKSB0b3BvbG9neS1pZCBzZWN1cmU/KX0pKQorICAgICAgICAidmlzdWFsaXphdGlvblRhYmxlIiBbXQorICAgICAgICAic2NoZWR1bGVyRGlzcGxheVJlc291cmNlIiAoKlNUT1JNLUNPTkYqIENvbmZpZy9TQ0hFRFVMRVJfRElTUExBWV9SRVNPVVJDRSl9KSkpKQogCiAoZGVmbiBjb21wb25lbnQtZXJyb3JzCiAgIFtlcnJvcnMtbGlzdCB0b3BvbG9neS1pZCBzZWN1cmU/XQpAQCAtODU4LDE0MiArNjQ4LDI0OCBAQAogICAgICAgIHsidGltZSIgKCogMTAwMCAobG9uZyAoLmdldF9lcnJvcl90aW1lX3NlY3MgZSkpKQogICAgICAgICAiZXJyb3JIb3N0IiAoLmdldF9ob3N0IGUpCiAgICAgICAgICJlcnJvclBvcnQiICAoLmdldF9wb3J0IGUpCi0gICAgICAgICJlcnJvcldvcmtlckxvZ0xpbmsiICAod29ya2VyLWxvZy1saW5rICguZ2V0X2hvc3QgZSkgKC5nZXRfcG9ydCBlKSB0b3BvbG9neS1pZCBzZWN1cmU/KQorICAgICAgICAiZXJyb3JXb3JrZXJMb2dMaW5rIiAgKHdvcmtlci1sb2ctbGluayAoLmdldF9ob3N0IGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICguZ2V0X3BvcnQgZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wb2xvZ3ktaWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdXJlPykKICAgICAgICAgImVycm9yTGFwc2VkU2VjcyIgKGdldC1lcnJvci10aW1lIGUpCiAgICAgICAgICJlcnJvciIgKC5nZXRfZXJyb3IgZSl9KX0pKQogCi0oZGVmbiBzcG91dC1zdGF0cwotICBbd2luZG93IF5Ub3BvbG9neUluZm8gdG9wb2xvZ3ktaW5mbyBjb21wb25lbnQgZXhlY3V0b3JzIGluY2x1ZGUtc3lzPyBzZWN1cmU/XQotICAobGV0IFt3aW5kb3ctaGludCAoc3RyICIgKCIgKHdpbmRvdy1oaW50IHdpbmRvdykgIikiKQotICAgICAgICBzdGF0cyAoZ2V0LWZpbGxlZC1zdGF0cyBleGVjdXRvcnMpCi0gICAgICAgIHN0cmVhbS1zdW1tYXJ5ICgtPiBzdGF0cyAoYWdncmVnYXRlLXNwb3V0LXN0YXRzIGluY2x1ZGUtc3lzPykpCi0gICAgICAgIHN1bW1hcnkgKC0+IHN0cmVhbS1zdW1tYXJ5IGFnZ3JlZ2F0ZS1zcG91dC1zdHJlYW1zKV0KLSAgICB7InNwb3V0U3VtbWFyeSIgKHNwb3V0LXN1bW1hcnktanNvbgotICAgICAgICAgICAgICAgICAgICAgICguZ2V0X2lkIHRvcG9sb2d5LWluZm8pIGNvbXBvbmVudCBzdW1tYXJ5IHdpbmRvdykKLSAgICAgIm91dHB1dFN0YXRzIiAoc3BvdXQtb3V0cHV0LXN0YXRzIHN0cmVhbS1zdW1tYXJ5IHdpbmRvdykKLSAgICAgImV4ZWN1dG9yU3RhdHMiIChzcG91dC1leGVjdXRvci1zdGF0cyAoLmdldF9pZCB0b3BvbG9neS1pbmZvKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dG9ycyB3aW5kb3cgaW5jbHVkZS1zeXM/IHNlY3VyZT8pfSkpCisoZGVmbXVsdGkgdW5wYWNrLWNvbXAtYWdnLXN0YXQKKyAgKGZuIFtbXyBeQ29tcG9uZW50QWdncmVnYXRlU3RhdHMgc11dICguZ2V0X3R5cGUgcykpKQogCi0oZGVmbiBib2x0LXN1bW1hcnkKLSAgW3RvcG9sb2d5LWlkIGlkIHN0YXRzIHdpbmRvd10KLSAgKGxldCBbdGltZXMgKHN0YXRzLXRpbWVzICg6ZW1pdHRlZCBzdGF0cykpCi0gICAgICAgIGRpc3BsYXktbWFwIChpbnRvIHt9IChmb3IgW3QgdGltZXNdIFt0IHByZXR0eS11cHRpbWUtc2VjXSkpCi0gICAgICAgIGRpc3BsYXktbWFwIChhc3NvYyBkaXNwbGF5LW1hcCAiOmFsbC10aW1lIiAoZm4gW19dICJBbGwgdGltZSIpKV0KLSAgICAoZm9yIFtrIChjb25jYXQgdGltZXMgWyI6YWxsLXRpbWUiXSkKLSAgICAgICAgICA6bGV0IFtkaXNwICgoZGlzcGxheS1tYXAgaykgayldXQotICAgICAgeyJ3aW5kb3ciIGsKLSAgICAgICAid2luZG93UHJldHR5IiBkaXNwCi0gICAgICAgImVtaXR0ZWQiIChnZXQtaW4gc3RhdHMgWzplbWl0dGVkIGtdKQotICAgICAgICJ0cmFuc2ZlcnJlZCIgKGdldC1pbiBzdGF0cyBbOnRyYW5zZmVycmVkIGtdKQotICAgICAgICJleGVjdXRlTGF0ZW5jeSIgKGZsb2F0LXN0ciAoZ2V0LWluIHN0YXRzIFs6ZXhlY3V0ZS1sYXRlbmNpZXMga10pKQotICAgICAgICJleGVjdXRlZCIgKGdldC1pbiBzdGF0cyBbOmV4ZWN1dGVkIGtdKQotICAgICAgICJwcm9jZXNzTGF0ZW5jeSIgKGZsb2F0LXN0ciAoZ2V0LWluIHN0YXRzIFs6cHJvY2Vzcy1sYXRlbmNpZXMga10pKQotICAgICAgICJhY2tlZCIgKGdldC1pbiBzdGF0cyBbOmFja2VkIGtdKQotICAgICAgICJmYWlsZWQiIChnZXQtaW4gc3RhdHMgWzpmYWlsZWQga10pfSkpKQorKGRlZm1ldGhvZCB1bnBhY2stY29tcC1hZ2ctc3RhdCBDb21wb25lbnRUeXBlL0JPTFQKKyAgW1t3aW5kb3cgXkNvbXBvbmVudEFnZ3JlZ2F0ZVN0YXRzIHNdXQorICAobGV0IFteQ29tbW9uQWdncmVnYXRlU3RhdHMgY29tbS1zICguZ2V0X2NvbW1vbl9zdGF0cyBzKQorICAgICAgICBeU3BlY2lmaWNBZ2dyZWdhdGVTdGF0cyBzcGVjLXMgKC5nZXRfc3BlY2lmaWNfc3RhdHMgcykKKyAgICAgICAgXkJvbHRBZ2dyZWdhdGVTdGF0cyBib2x0LXMgKC5nZXRfYm9sdCBzcGVjLXMpXQorICAgIHsid2luZG93IiB3aW5kb3cKKyAgICAgIndpbmRvd1ByZXR0eSIgKHdpbmRvdy1oaW50IHdpbmRvdykKKyAgICAgImVtaXR0ZWQiICguZ2V0X2VtaXR0ZWQgY29tbS1zKQorICAgICAidHJhbnNmZXJyZWQiICguZ2V0X3RyYW5zZmVycmVkIGNvbW0tcykKKyAgICAgImFja2VkIiAoLmdldF9hY2tlZCBjb21tLXMpCisgICAgICJmYWlsZWQiICguZ2V0X2ZhaWxlZCBjb21tLXMpCisgICAgICJleGVjdXRlTGF0ZW5jeSIgKGZsb2F0LXN0ciAoLmdldF9leGVjdXRlX2xhdGVuY3lfbXMgYm9sdC1zKSkKKyAgICAgInByb2Nlc3NMYXRlbmN5IiAgKGZsb2F0LXN0ciAoLmdldF9wcm9jZXNzX2xhdGVuY3lfbXMgYm9sdC1zKSkKKyAgICAgImV4ZWN1dGVkIiAoLmdldF9leGVjdXRlZCBib2x0LXMpCisgICAgICJjYXBhY2l0eSIgKGZsb2F0LXN0ciAoLmdldF9jYXBhY2l0eSBib2x0LXMpKX0pKQogCi0oZGVmbiBib2x0LW91dHB1dC1zdGF0cwotICBbc3RyZWFtLXN1bW1hcnkgd2luZG93XQotICAobGV0IFtzdHJlYW0tc3VtbWFyeSAoLT4gc3RyZWFtLXN1bW1hcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXAtbWFwLW9yZGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2V0IHdpbmRvdykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3Qta2V5cyBbOmVtaXR0ZWQgOnRyYW5zZmVycmVkXSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3YXAtbWFwLW9yZGVyKV0KLSAgICAoZm9yIFtbcyBzdGF0c10gc3RyZWFtLXN1bW1hcnldCi0gICAgICB7InN0cmVhbSIgcwotICAgICAgICAiZW1pdHRlZCIgKG5pbC10by16ZXJvICg6ZW1pdHRlZCBzdGF0cykpCi0gICAgICAgICJ0cmFuc2ZlcnJlZCIgKG5pbC10by16ZXJvICg6dHJhbnNmZXJyZWQgc3RhdHMpKX0pKSkKKyhkZWZtZXRob2QgdW5wYWNrLWNvbXAtYWdnLXN0YXQgQ29tcG9uZW50VHlwZS9TUE9VVAorICBbW3dpbmRvdyBeQ29tcG9uZW50QWdncmVnYXRlU3RhdHMgc11dCisgIChsZXQgW15Db21tb25BZ2dyZWdhdGVTdGF0cyBjb21tLXMgKC5nZXRfY29tbW9uX3N0YXRzIHMpCisgICAgICAgIF5TcGVjaWZpY0FnZ3JlZ2F0ZVN0YXRzIHNwZWMtcyAoLmdldF9zcGVjaWZpY19zdGF0cyBzKQorICAgICAgICBeU3BvdXRBZ2dyZWdhdGVTdGF0cyBzcG91dC1zICguZ2V0X3Nwb3V0IHNwZWMtcyldCisgICAgeyJ3aW5kb3ciIHdpbmRvdworICAgICAid2luZG93UHJldHR5IiAod2luZG93LWhpbnQgd2luZG93KQorICAgICAiZW1pdHRlZCIgKC5nZXRfZW1pdHRlZCBjb21tLXMpCisgICAgICJ0cmFuc2ZlcnJlZCIgKC5nZXRfdHJhbnNmZXJyZWQgY29tbS1zKQorICAgICAiYWNrZWQiICguZ2V0X2Fja2VkIGNvbW0tcykKKyAgICAgImZhaWxlZCIgKC5nZXRfZmFpbGVkIGNvbW0tcykKKyAgICAgImNvbXBsZXRlTGF0ZW5jeSIgKGZsb2F0LXN0ciAoLmdldF9jb21wbGV0ZV9sYXRlbmN5X21zIHNwb3V0LXMpKX0pKQogCi0oZGVmbiBib2x0LWlucHV0LXN0YXRzCi0gIFtzdHJlYW0tc3VtbWFyeSB3aW5kb3ddCi0gIChsZXQgW3N0cmVhbS1zdW1tYXJ5Ci0gICAgICAgICgtPiBzdHJlYW0tc3VtbWFyeQotICAgICAgICAgICAgc3dhcC1tYXAtb3JkZXIKLSAgICAgICAgICAgIChnZXQgd2luZG93KQotICAgICAgICAgICAgKHNlbGVjdC1rZXlzIFs6YWNrZWQgOmZhaWxlZCA6cHJvY2Vzcy1sYXRlbmNpZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgOmV4ZWN1dGVkIDpleGVjdXRlLWxhdGVuY2llc10pCi0gICAgICAgICAgICBzd2FwLW1hcC1vcmRlcildCi0gICAgKGZvciBbW15HbG9iYWxTdHJlYW1JZCBzIHN0YXRzXSBzdHJlYW0tc3VtbWFyeV0KLSAgICAgIHsiY29tcG9uZW50IiAoLmdldF9jb21wb25lbnRJZCBzKQotICAgICAgICJlbmNvZGVkQ29tcG9uZW50IiAodXJsLWVuY29kZSAoLmdldF9jb21wb25lbnRJZCBzKSkKLSAgICAgICAic3RyZWFtIiAoLmdldF9zdHJlYW1JZCBzKQotICAgICAgICJleGVjdXRlTGF0ZW5jeSIgKGZsb2F0LXN0ciAoOmV4ZWN1dGUtbGF0ZW5jaWVzIHN0YXRzKSkKLSAgICAgICAicHJvY2Vzc0xhdGVuY3kiIChmbG9hdC1zdHIgKDpwcm9jZXNzLWxhdGVuY2llcyBzdGF0cykpCi0gICAgICAgImV4ZWN1dGVkIiAobmlsLXRvLXplcm8gKDpleGVjdXRlZCBzdGF0cykpCi0gICAgICAgImFja2VkIiAobmlsLXRvLXplcm8gKDphY2tlZCBzdGF0cykpCi0gICAgICAgImZhaWxlZCIgKG5pbC10by16ZXJvICg6ZmFpbGVkIHN0YXRzKSl9KSkpCisoZGVmbi0gdW5wYWNrLWJvbHQtaW5wdXQtc3RhdAorICBbW15HbG9iYWxTdHJlYW1JZCBzIF5Db21wb25lbnRBZ2dyZWdhdGVTdGF0cyBzdGF0c11dCisgIChsZXQgW15TcGVjaWZpY0FnZ3JlZ2F0ZVN0YXRzIHNhcyAoLmdldF9zcGVjaWZpY19zdGF0cyBzdGF0cykKKyAgICAgICAgXkJvbHRBZ2dyZWdhdGVTdGF0cyBiYXMgKC5nZXRfYm9sdCBzYXMpCisgICAgICAgIF5Db21tb25BZ2dyZWdhdGVTdGF0cyBjYXMgKC5nZXRfY29tbW9uX3N0YXRzIHN0YXRzKQorICAgICAgICBjb21wLWlkICguZ2V0X2NvbXBvbmVudElkIHMpXQorICAgIHsiY29tcG9uZW50IiBjb21wLWlkCisgICAgICJlbmNvZGVkQ29tcG9uZW50SWQiICh1cmwtZW5jb2RlIGNvbXAtaWQpCisgICAgICJzdHJlYW0iICguZ2V0X3N0cmVhbUlkIHMpCisgICAgICJleGVjdXRlTGF0ZW5jeSIgKGZsb2F0LXN0ciAoLmdldF9leGVjdXRlX2xhdGVuY3lfbXMgYmFzKSkKKyAgICAgInByb2Nlc3NMYXRlbmN5IiAoZmxvYXQtc3RyICguZ2V0X3Byb2Nlc3NfbGF0ZW5jeV9tcyBiYXMpKQorICAgICAiZXhlY3V0ZWQiIChuaWwtdG8temVybyAoLmdldF9leGVjdXRlZCBiYXMpKQorICAgICAiYWNrZWQiIChuaWwtdG8temVybyAoLmdldF9hY2tlZCBjYXMpKQorICAgICAiZmFpbGVkIiAobmlsLXRvLXplcm8gKC5nZXRfZmFpbGVkIGNhcykpfSkpCiAKLShkZWZuIGJvbHQtZXhlY3V0b3Itc3RhdHMKLSAgW3RvcG9sb2d5LWlkIGV4ZWN1dG9ycyB3aW5kb3cgaW5jbHVkZS1zeXM/IHNlY3VyZT9dCi0gIChmb3IgW15FeGVjdXRvclN1bW1hcnkgZSBleGVjdXRvcnMKLSAgICAgICAgOmxldCBbc3RhdHMgKC5nZXRfc3RhdHMgZSkKLSAgICAgICAgICAgICAgc3RhdHMgKGlmIHN0YXRzCi0gICAgICAgICAgICAgICAgICAgICAgKC0+IHN0YXRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChhZ2dyZWdhdGUtYm9sdC1zdGF0cyBpbmNsdWRlLXN5cz8pCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChhZ2dyZWdhdGUtYm9sdC1zdHJlYW1zKQotICAgICAgICAgICAgICAgICAgICAgICAgICBzd2FwLW1hcC1vcmRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAoZ2V0IHdpbmRvdykpKV1dCi0gICAgeyJpZCIgKHByZXR0eS1leGVjdXRvci1pbmZvICguZ2V0X2V4ZWN1dG9yX2luZm8gZSkpCi0gICAgICJlbmNvZGVkSWQiICh1cmwtZW5jb2RlIChwcmV0dHktZXhlY3V0b3ItaW5mbyAoLmdldF9leGVjdXRvcl9pbmZvIGUpKSkKLSAgICAgInVwdGltZSIgKHByZXR0eS11cHRpbWUtc2VjICguZ2V0X3VwdGltZV9zZWNzIGUpKQotICAgICAiaG9zdCIgKC5nZXRfaG9zdCBlKQotICAgICAicG9ydCIgKC5nZXRfcG9ydCBlKQotICAgICAiZW1pdHRlZCIgKG5pbC10by16ZXJvICg6ZW1pdHRlZCBzdGF0cykpCi0gICAgICJ0cmFuc2ZlcnJlZCIgKG5pbC10by16ZXJvICg6dHJhbnNmZXJyZWQgc3RhdHMpKQotICAgICAiY2FwYWNpdHkiIChmbG9hdC1zdHIgKG5pbC10by16ZXJvIChjb21wdXRlLWV4ZWN1dG9yLWNhcGFjaXR5IGUpKSkKLSAgICAgImV4ZWN1dGVMYXRlbmN5IiAoZmxvYXQtc3RyICg6ZXhlY3V0ZS1sYXRlbmNpZXMgc3RhdHMpKQotICAgICAiZXhlY3V0ZWQiIChuaWwtdG8temVybyAoOmV4ZWN1dGVkIHN0YXRzKSkKLSAgICAgInByb2Nlc3NMYXRlbmN5IiAoZmxvYXQtc3RyICg6cHJvY2Vzcy1sYXRlbmNpZXMgc3RhdHMpKQotICAgICAiYWNrZWQiIChuaWwtdG8temVybyAoOmFja2VkIHN0YXRzKSkKLSAgICAgImZhaWxlZCIgKG5pbC10by16ZXJvICg6ZmFpbGVkIHN0YXRzKSkKLSAgICAgIndvcmtlckxvZ0xpbmsiICh3b3JrZXItbG9nLWxpbmsgKC5nZXRfaG9zdCBlKSAoLmdldF9wb3J0IGUpIHRvcG9sb2d5LWlkIHNlY3VyZT8pfSkpCisoZGVmbXVsdGkgdW5wYWNrLWNvbXAtb3V0cHV0LXN0YXQKKyAgKGZuIFtbXyBeQ29tcG9uZW50QWdncmVnYXRlU3RhdHMgc11dICguZ2V0X3R5cGUgcykpKQogCi0oZGVmbiBib2x0LXN0YXRzCi0gIFt3aW5kb3cgXlRvcG9sb2d5SW5mbyB0b3BvbG9neS1pbmZvIGNvbXBvbmVudCBleGVjdXRvcnMgaW5jbHVkZS1zeXM/IHNlY3VyZT9dCi0gIChsZXQgW3dpbmRvdy1oaW50IChzdHIgIiAoIiAod2luZG93LWhpbnQgd2luZG93KSAiKSIpCi0gICAgICAgIHN0YXRzIChnZXQtZmlsbGVkLXN0YXRzIGV4ZWN1dG9ycykKLSAgICAgICAgc3RyZWFtLXN1bW1hcnkgKC0+IHN0YXRzIChhZ2dyZWdhdGUtYm9sdC1zdGF0cyBpbmNsdWRlLXN5cz8pKQotICAgICAgICBzdW1tYXJ5ICgtPiBzdHJlYW0tc3VtbWFyeSBhZ2dyZWdhdGUtYm9sdC1zdHJlYW1zKV0KLSAgICB7ImJvbHRTdGF0cyIgKGJvbHQtc3VtbWFyeSAoLmdldF9pZCB0b3BvbG9neS1pbmZvKSBjb21wb25lbnQgc3VtbWFyeSB3aW5kb3cpCi0gICAgICJpbnB1dFN0YXRzIiAoYm9sdC1pbnB1dC1zdGF0cyBzdHJlYW0tc3VtbWFyeSB3aW5kb3cpCi0gICAgICJvdXRwdXRTdGF0cyIgKGJvbHQtb3V0cHV0LXN0YXRzIHN0cmVhbS1zdW1tYXJ5IHdpbmRvdykKLSAgICAgImV4ZWN1dG9yU3RhdHMiIChib2x0LWV4ZWN1dG9yLXN0YXRzCi0gICAgICAgICAgICAgICAgICAgICAgICguZ2V0X2lkIHRvcG9sb2d5LWluZm8pIGV4ZWN1dG9ycyB3aW5kb3cgaW5jbHVkZS1zeXM/IHNlY3VyZT8pfSkpCisoZGVmbWV0aG9kIHVucGFjay1jb21wLW91dHB1dC1zdGF0IENvbXBvbmVudFR5cGUvQk9MVAorICBbW3N0cmVhbS1pZCBeQ29tcG9uZW50QWdncmVnYXRlU3RhdHMgc3RhdHNdXQorICAobGV0IFteQ29tbW9uQWdncmVnYXRlU3RhdHMgY2FzICguZ2V0X2NvbW1vbl9zdGF0cyBzdGF0cyldCisgICAgeyJzdHJlYW0iIHN0cmVhbS1pZAorICAgICAiZW1pdHRlZCIgKG5pbC10by16ZXJvICguZ2V0X2VtaXR0ZWQgY2FzKSkKKyAgICAgInRyYW5zZmVycmVkIiAobmlsLXRvLXplcm8gKC5nZXRfdHJhbnNmZXJyZWQgY2FzKSl9KSkKKworKGRlZm1ldGhvZCB1bnBhY2stY29tcC1vdXRwdXQtc3RhdCBDb21wb25lbnRUeXBlL1NQT1VUCisgIFtbc3RyZWFtLWlkIF5Db21wb25lbnRBZ2dyZWdhdGVTdGF0cyBzdGF0c11dCisgIChsZXQgW15Db21tb25BZ2dyZWdhdGVTdGF0cyBjYXMgKC5nZXRfY29tbW9uX3N0YXRzIHN0YXRzKQorICAgICAgICBeU3BlY2lmaWNBZ2dyZWdhdGVTdGF0cyBzcGVjLXMgKC5nZXRfc3BlY2lmaWNfc3RhdHMgc3RhdHMpCisgICAgICAgIF5TcG91dEFnZ3JlZ2F0ZVN0YXRzIHNwb3V0LXMgKC5nZXRfc3BvdXQgc3BlYy1zKV0KKyAgICB7InN0cmVhbSIgc3RyZWFtLWlkCisgICAgICJlbWl0dGVkIiAobmlsLXRvLXplcm8gKC5nZXRfZW1pdHRlZCBjYXMpKQorICAgICAidHJhbnNmZXJyZWQiIChuaWwtdG8temVybyAoLmdldF90cmFuc2ZlcnJlZCBjYXMpKQorICAgICAiY29tcGxldGVMYXRlbmN5IiAoZmxvYXQtc3RyICguZ2V0X2NvbXBsZXRlX2xhdGVuY3lfbXMgc3BvdXQtcykpCisgICAgICJhY2tlZCIgKG5pbC10by16ZXJvICguZ2V0X2Fja2VkIGNhcykpCisgICAgICJmYWlsZWQiIChuaWwtdG8temVybyAoLmdldF9mYWlsZWQgY2FzKSl9KSkKKworKGRlZm11bHRpIHVucGFjay1jb21wLWV4ZWMtc3RhdAorICAoZm4gW18gXyBeQ29tcG9uZW50QWdncmVnYXRlU3RhdHMgY2FzXSAoLmdldF90eXBlICguZ2V0X3N0YXRzIF5FeGVjdXRvckFnZ3JlZ2F0ZVN0YXRzIGNhcykpKSkKKworKGRlZm1ldGhvZCB1bnBhY2stY29tcC1leGVjLXN0YXQgQ29tcG9uZW50VHlwZS9CT0xUCisgIFt0b3BvbG9neS1pZCBzZWN1cmU/IF5FeGVjdXRvckFnZ3JlZ2F0ZVN0YXRzIGVhc10KKyAgKGxldCBbXkV4ZWN1dG9yU3VtbWFyeSBzdW1tICguZ2V0X2V4ZWNfc3VtbWFyeSBlYXMpCisgICAgICAgIF5FeGVjdXRvckluZm8gaW5mbyAoLmdldF9leGVjdXRvcl9pbmZvIHN1bW0pCisgICAgICAgIF5Db21wb25lbnRBZ2dyZWdhdGVTdGF0cyBzdGF0cyAoLmdldF9zdGF0cyBlYXMpCisgICAgICAgIF5TcGVjaWZpY0FnZ3JlZ2F0ZVN0YXRzIHNzICguZ2V0X3NwZWNpZmljX3N0YXRzIHN0YXRzKQorICAgICAgICBeQm9sdEFnZ3JlZ2F0ZVN0YXRzIGJhcyAoLmdldF9ib2x0IHNzKQorICAgICAgICBeQ29tbW9uQWdncmVnYXRlU3RhdHMgY2FzICguZ2V0X2NvbW1vbl9zdGF0cyBzdGF0cykKKyAgICAgICAgaG9zdCAoLmdldF9ob3N0IHN1bW0pCisgICAgICAgIHBvcnQgKC5nZXRfcG9ydCBzdW1tKQorICAgICAgICBleGVjLWlkIChwcmV0dHktZXhlY3V0b3ItaW5mbyBpbmZvKQorICAgICAgICB1cHRpbWUgKC5nZXRfdXB0aW1lX3NlY3Mgc3VtbSldCisgICAgeyJpZCIgZXhlYy1pZAorICAgICAiZW5jb2RlZElkIiAodXJsLWVuY29kZSBleGVjLWlkKQorICAgICAidXB0aW1lIiAocHJldHR5LXVwdGltZS1zZWMgdXB0aW1lKQorICAgICAidXB0aW1lU2Vjb25kcyIgdXB0aW1lCisgICAgICJob3N0IiBob3N0CisgICAgICJwb3J0IiBwb3J0CisgICAgICJlbWl0dGVkIiAobmlsLXRvLXplcm8gKC5nZXRfZW1pdHRlZCBjYXMpKQorICAgICAidHJhbnNmZXJyZWQiIChuaWwtdG8temVybyAoLmdldF90cmFuc2ZlcnJlZCBjYXMpKQorICAgICAiY2FwYWNpdHkiIChmbG9hdC1zdHIgKG5pbC10by16ZXJvICguZ2V0X2NhcGFjaXR5IGJhcykpKQorICAgICAiZXhlY3V0ZUxhdGVuY3kiIChmbG9hdC1zdHIgKC5nZXRfZXhlY3V0ZV9sYXRlbmN5X21zIGJhcykpCisgICAgICJleGVjdXRlZCIgKG5pbC10by16ZXJvICguZ2V0X2V4ZWN1dGVkIGJhcykpCisgICAgICJwcm9jZXNzTGF0ZW5jeSIgKGZsb2F0LXN0ciAoLmdldF9wcm9jZXNzX2xhdGVuY3lfbXMgYmFzKSkKKyAgICAgImFja2VkIiAobmlsLXRvLXplcm8gKC5nZXRfYWNrZWQgY2FzKSkKKyAgICAgImZhaWxlZCIgKG5pbC10by16ZXJvICguZ2V0X2ZhaWxlZCBjYXMpKQorICAgICAid29ya2VyTG9nTGluayIgKHdvcmtlci1sb2ctbGluayBob3N0IHBvcnQgdG9wb2xvZ3ktaWQgc2VjdXJlPyl9KSkKKworKGRlZm1ldGhvZCB1bnBhY2stY29tcC1leGVjLXN0YXQgQ29tcG9uZW50VHlwZS9TUE9VVAorICBbdG9wb2xvZ3ktaWQgc2VjdXJlPyBeRXhlY3V0b3JBZ2dyZWdhdGVTdGF0cyBlYXNdCisgIChsZXQgW15FeGVjdXRvclN1bW1hcnkgc3VtbSAoLmdldF9leGVjX3N1bW1hcnkgZWFzKQorICAgICAgICBeRXhlY3V0b3JJbmZvIGluZm8gKC5nZXRfZXhlY3V0b3JfaW5mbyBzdW1tKQorICAgICAgICBeQ29tcG9uZW50QWdncmVnYXRlU3RhdHMgc3RhdHMgKC5nZXRfc3RhdHMgZWFzKQorICAgICAgICBeU3BlY2lmaWNBZ2dyZWdhdGVTdGF0cyBzcyAoLmdldF9zcGVjaWZpY19zdGF0cyBzdGF0cykKKyAgICAgICAgXlNwb3V0QWdncmVnYXRlU3RhdHMgc2FzICguZ2V0X3Nwb3V0IHNzKQorICAgICAgICBeQ29tbW9uQWdncmVnYXRlU3RhdHMgY2FzICguZ2V0X2NvbW1vbl9zdGF0cyBzdGF0cykKKyAgICAgICAgaG9zdCAoLmdldF9ob3N0IHN1bW0pCisgICAgICAgIHBvcnQgKC5nZXRfcG9ydCBzdW1tKQorICAgICAgICBleGVjLWlkIChwcmV0dHktZXhlY3V0b3ItaW5mbyBpbmZvKQorICAgICAgICB1cHRpbWUgKC5nZXRfdXB0aW1lX3NlY3Mgc3VtbSldCisgICAgeyJpZCIgZXhlYy1pZAorICAgICAiZW5jb2RlZElkIiAodXJsLWVuY29kZSBleGVjLWlkKQorICAgICAidXB0aW1lIiAocHJldHR5LXVwdGltZS1zZWMgdXB0aW1lKQorICAgICAidXB0aW1lU2Vjb25kcyIgdXB0aW1lCisgICAgICJob3N0IiBob3N0CisgICAgICJwb3J0IiBwb3J0CisgICAgICJlbWl0dGVkIiAobmlsLXRvLXplcm8gKC5nZXRfZW1pdHRlZCBjYXMpKQorICAgICAidHJhbnNmZXJyZWQiIChuaWwtdG8temVybyAoLmdldF90cmFuc2ZlcnJlZCBjYXMpKQorICAgICAiY29tcGxldGVMYXRlbmN5IiAoZmxvYXQtc3RyICguZ2V0X2NvbXBsZXRlX2xhdGVuY3lfbXMgc2FzKSkKKyAgICAgImFja2VkIiAobmlsLXRvLXplcm8gKC5nZXRfYWNrZWQgY2FzKSkKKyAgICAgImZhaWxlZCIgKG5pbC10by16ZXJvICguZ2V0X2ZhaWxlZCBjYXMpKQorICAgICAid29ya2VyTG9nTGluayIgKHdvcmtlci1sb2ctbGluayBob3N0IHBvcnQgdG9wb2xvZ3ktaWQgc2VjdXJlPyl9KSkKKworKGRlZm11bHRpIHVucGFjay1jb21wb25lbnQtcGFnZS1pbmZvCisgICJVbnBhY2tzIGNvbXBvbmVudC1zcGVjaWZpYyBpbmZvIHRvIGNsb2p1cmUgZGF0YSBzdHJ1Y3R1cmVzIgorICAoZm4gW15Db21wb25lbnRQYWdlSW5mbyBpbmZvICYgX10KKyAgICAoLmdldF9jb21wb25lbnRfdHlwZSBpbmZvKSkpCisKKyhkZWZtZXRob2QgdW5wYWNrLWNvbXBvbmVudC1wYWdlLWluZm8gQ29tcG9uZW50VHlwZS9CT0xUCisgIFteQ29tcG9uZW50UGFnZUluZm8gaW5mbyB0b3BvbG9neS1pZCB3aW5kb3cgaW5jbHVkZS1zeXM/IHNlY3VyZT9dCisgIChtZXJnZQorICAgIHsiYm9sdFN0YXRzIiAobWFwIHVucGFjay1jb21wLWFnZy1zdGF0ICguZ2V0X3dpbmRvd190b19zdGF0cyBpbmZvKSkKKyAgICAgImlucHV0U3RhdHMiIChtYXAgdW5wYWNrLWJvbHQtaW5wdXQtc3RhdCAoLmdldF9nc2lkX3RvX2lucHV0X3N0YXRzIGluZm8pKQorICAgICAib3V0cHV0U3RhdHMiIChtYXAgdW5wYWNrLWNvbXAtb3V0cHV0LXN0YXQgKC5nZXRfc2lkX3RvX291dHB1dF9zdGF0cyBpbmZvKSkKKyAgICAgImV4ZWN1dG9yU3RhdHMiIChtYXAgKHBhcnRpYWwgdW5wYWNrLWNvbXAtZXhlYy1zdGF0IHRvcG9sb2d5LWlkIHNlY3VyZT8pCisgICAgICAgICAgICAgICAgICAgICAgICAgICguZ2V0X2V4ZWNfc3RhdHMgaW5mbykpfQorICAgICgtPiBpbmZvIC5nZXRfZXJyb3JzIChjb21wb25lbnQtZXJyb3JzIHRvcG9sb2d5LWlkIHNlY3VyZT8pKSkpCisKKyhkZWZtZXRob2QgdW5wYWNrLWNvbXBvbmVudC1wYWdlLWluZm8gQ29tcG9uZW50VHlwZS9TUE9VVAorICBbXkNvbXBvbmVudFBhZ2VJbmZvIGluZm8gdG9wb2xvZ3ktaWQgd2luZG93IGluY2x1ZGUtc3lzPyBzZWN1cmU/XQorICAobWVyZ2UKKyAgICB7InNwb3V0U3VtbWFyeSIgKG1hcCB1bnBhY2stY29tcC1hZ2ctc3RhdCAoLmdldF93aW5kb3dfdG9fc3RhdHMgaW5mbykpCisgICAgICJvdXRwdXRTdGF0cyIgKG1hcCB1bnBhY2stY29tcC1vdXRwdXQtc3RhdCAoLmdldF9zaWRfdG9fb3V0cHV0X3N0YXRzIGluZm8pKQorICAgICAiZXhlY3V0b3JTdGF0cyIgKG1hcCAocGFydGlhbCB1bnBhY2stY29tcC1leGVjLXN0YXQgdG9wb2xvZ3ktaWQgc2VjdXJlPykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKC5nZXRfZXhlY19zdGF0cyBpbmZvKSl9CisgICAgKC0+IGluZm8gLmdldF9lcnJvcnMgKGNvbXBvbmVudC1lcnJvcnMgdG9wb2xvZ3ktaWQgc2VjdXJlPykpKSkKKworKGRlZm4gZ2V0LWFjdGl2ZS1wcm9maWxlLWFjdGlvbnMKKyAgW25pbWJ1cyB0b3BvbG9neS1pZCBjb21wb25lbnRdCisgIChsZXQgW3Byb2ZpbGUtYWN0aW9ucyAgKC5nZXRDb21wb25lbnRQZW5kaW5nUHJvZmlsZUFjdGlvbnMgbmltYnVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcG9sb2d5LWlkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZmlsZUFjdGlvbi9KUFJPRklMRV9TVE9QKQorICAgICAgICBsYXRlc3QtcHJvZmlsZS1hY3Rpb25zIChtYXAgY2xvanVyaWZ5LXByb2ZpbGUtcmVxdWVzdCBwcm9maWxlLWFjdGlvbnMpCisgICAgICAgIGFjdGl2ZS1hY3Rpb25zIChtYXAgKGZuIFtwcm9maWxlLWFjdGlvbl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiaG9zdCIgKDpob3N0IHByb2ZpbGUtYWN0aW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwb3J0IiAoc3RyICg6cG9ydCBwcm9maWxlLWFjdGlvbikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImR1bXBsaW5rIiAod29ya2VyLWR1bXAtbGluayAoOmhvc3QgcHJvZmlsZS1hY3Rpb24pIChzdHIgKDpwb3J0IHByb2ZpbGUtYWN0aW9uKSkgdG9wb2xvZ3ktaWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpbWVzdGFtcCIgKHN0ciAoLSAoOnRpbWVzdGFtcCBwcm9maWxlLWFjdGlvbikgKFN5c3RlbS9jdXJyZW50VGltZU1pbGxpcykpKX0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0ZXN0LXByb2ZpbGUtYWN0aW9ucyldCisgICAgKGxvZy1tZXNzYWdlICJMYXRlc3QtYWN0aXZlIGFjdGlvbnMgYXJlOiAiIChwciBhY3RpdmUtYWN0aW9ucykpCisgICAgYWN0aXZlLWFjdGlvbnMpKQogCiAoZGVmbiBjb21wb25lbnQtcGFnZQogICBbdG9wb2xvZ3ktaWQgY29tcG9uZW50IHdpbmRvdyBpbmNsdWRlLXN5cz8gdXNlciBzZWN1cmU/XQogICAodGhyaWZ0L3dpdGgtY29uZmlndXJlZC1uaW1idXMtY29ubmVjdGlvbiBuaW1idXMKLSAgICAobGV0IFt3aW5kb3cgKGlmIHdpbmRvdyB3aW5kb3cgIjphbGwtdGltZSIpCi0gICAgICAgICAgc3VtbSAoLmdldFRvcG9sb2d5SW5mbyBeTmltYnVzJENsaWVudCBuaW1idXMgdG9wb2xvZ3ktaWQpCi0gICAgICAgICAgdG9wb2xvZ3kgKC5nZXRUb3BvbG9neSBeTmltYnVzJENsaWVudCBuaW1idXMgdG9wb2xvZ3ktaWQpCi0gICAgICAgICAgdG9wb2xvZ3ktY29uZiAoZnJvbS1qc29uICguZ2V0VG9wb2xvZ3lDb25mIF5OaW1idXMkQ2xpZW50IG5pbWJ1cyB0b3BvbG9neS1pZCkpCi0gICAgICAgICAgdHlwZSAoY29tcG9uZW50LXR5cGUgdG9wb2xvZ3kgY29tcG9uZW50KQotICAgICAgICAgIHN1bW1zIChjb21wb25lbnQtdGFzay1zdW1tcyBzdW1tIHRvcG9sb2d5IGNvbXBvbmVudCkKLSAgICAgICAgICBzcGVjIChjb25kICg9IHR5cGUgOnNwb3V0KSAoc3BvdXQtc3RhdHMgd2luZG93IHN1bW0gY29tcG9uZW50IHN1bW1zIGluY2x1ZGUtc3lzPyBzZWN1cmU/KQotICAgICAgICAgICAgICAgICAgICAgKD0gdHlwZSA6Ym9sdCkgKGJvbHQtc3RhdHMgd2luZG93IHN1bW0gY29tcG9uZW50IHN1bW1zIGluY2x1ZGUtc3lzPyBzZWN1cmU/KSkKLSAgICAgICAgICBlcnJvcnMgKGNvbXBvbmVudC1lcnJvcnMgKGdldCAoLmdldF9lcnJvcnMgc3VtbSkgY29tcG9uZW50KSB0b3BvbG9neS1pZCBzZWN1cmU/KQotICAgICAgICAgIGNvbXBvbmVudC0+ZGVidWcgKC5nZXRfY29tcG9uZW50X2RlYnVnIHN1bW0pCi0gICAgICAgICAgZGVidWctb3B0aW9ucyAoZ2V0IGNvbXBvbmVudC0+ZGVidWcgY29tcG9uZW50IChnZXQgY29tcG9uZW50LT5kZWJ1ZyB0b3BvbG9neS1pZCkpXQotICAgICAgKG1lcmdlCi0gICAgICAgIHsidXNlciIgdXNlcgotICAgICAgICAgImlkIiBjb21wb25lbnQKLSAgICAgICAgICJlbmNvZGVkSWQiICh1cmwtZW5jb2RlIGNvbXBvbmVudCkKLSAgICAgICAgICJuYW1lIiAoLmdldF9uYW1lIHN1bW0pCi0gICAgICAgICAiZXhlY3V0b3JzIiAoY291bnQgc3VtbXMpCi0gICAgICAgICAidGFza3MiIChzdW0tdGFza3Mgc3VtbXMpCi0gICAgICAgICAidG9wb2xvZ3lJZCIgdG9wb2xvZ3ktaWQKLSAgICAgICAgICJ0b3BvbG9neVN0YXR1cyIgKC5nZXRfc3RhdHVzIHN1bW0pCi0gICAgICAgICAiZW5jb2RlZFRvcG9sb2d5SWQiICh1cmwtZW5jb2RlIHRvcG9sb2d5LWlkKQotICAgICAgICAgIndpbmRvdyIgd2luZG93Ci0gICAgICAgICAiY29tcG9uZW50VHlwZSIgKG5hbWUgdHlwZSkKLSAgICAgICAgICJ3aW5kb3dIaW50IiAod2luZG93LWhpbnQgd2luZG93KQotICAgICAgICAgImRlYnVnIiAoaWYgKG5vdC1uaWw/IGRlYnVnLW9wdGlvbnMpICguaXNfZW5hYmxlIGRlYnVnLW9wdGlvbnMpIGZhbHNlKQotICAgICAgICAgInNhbXBsaW5nUGN0IiAoaWYgKG5vdC1uaWw/IGRlYnVnLW9wdGlvbnMpICguZ2V0X3NhbXBsaW5ncGN0IGRlYnVnLW9wdGlvbnMpIDEwKQotICAgICAgICAgImV2ZW50TG9nTGluayIgKGV2ZW50LWxvZy1saW5rIHRvcG9sb2d5LWlkIHN1bW0gdG9wb2xvZ3kgY29tcG9uZW50IHNlY3VyZT8pfQotICAgICAgIHNwZWMgZXJyb3JzKSkpKQorICAgIChsZXQgW3dpbmRvdyAob3Igd2luZG93ICI6YWxsLXRpbWUiKQorICAgICAgICAgIHdpbmRvdy1oaW50ICh3aW5kb3ctaGludCB3aW5kb3cpCisgICAgICAgICAgY29tcC1wYWdlLWluZm8gKC5nZXRDb21wb25lbnRQYWdlSW5mbyBeTmltYnVzJENsaWVudCBuaW1idXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcG9sb2d5LWlkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZS1zeXM/KQorICAgICAgICAgIHRvcG9sb2d5LWNvbmYgKGZyb20tanNvbiAoLmdldFRvcG9sb2d5Q29uZiBeTmltYnVzJENsaWVudCBuaW1idXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wb2xvZ3ktaWQpKQorICAgICAgICAgIG1zZy10aW1lb3V0ICh0b3BvbG9neS1jb25mIFRPUE9MT0dZLU1FU1NBR0UtVElNRU9VVC1TRUNTKQorICAgICAgICAgIFtkZWJ1Z0VuYWJsZWQKKyAgICAgICAgICAgc2FtcGxpbmdQY3RdIChpZi1sZXQgW2RlYnVnLW9wdHMgKC5nZXRfZGVidWdfb3B0aW9ucyBjb21wLXBhZ2UtaW5mbyldCisgICAgICAgICAgICAgICAgICAgICAgICAgIFsoLmlzX2VuYWJsZSBkZWJ1Zy1vcHRzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgKC5nZXRfc2FtcGxpbmdwY3QgZGVidWctb3B0cyldKV0KKyAgICAgIChhc3NvYworICAgICAgICh1bnBhY2stY29tcG9uZW50LXBhZ2UtaW5mbyBjb21wLXBhZ2UtaW5mbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BvbG9neS1pZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZS1zeXM/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3VyZT8pCisgICAgICAgInVzZXIiIHVzZXIKKyAgICAgICAiaWQiIGNvbXBvbmVudAorICAgICAgICJlbmNvZGVkSWQiICh1cmwtZW5jb2RlIGNvbXBvbmVudCkKKyAgICAgICAibmFtZSIgKC5nZXRfdG9wb2xvZ3lfbmFtZSBjb21wLXBhZ2UtaW5mbykKKyAgICAgICAiZXhlY3V0b3JzIiAoLmdldF9udW1fZXhlY3V0b3JzIGNvbXAtcGFnZS1pbmZvKQorICAgICAgICJ0YXNrcyIgKC5nZXRfbnVtX3Rhc2tzIGNvbXAtcGFnZS1pbmZvKQorICAgICAgICJ0b3BvbG9neUlkIiB0b3BvbG9neS1pZAorICAgICAgICJ0b3BvbG9neVN0YXR1cyIgKC5nZXRfdG9wb2xvZ3lfc3RhdHVzIGNvbXAtcGFnZS1pbmZvKQorICAgICAgICJlbmNvZGVkVG9wb2xvZ3lJZCIgKHVybC1lbmNvZGUgdG9wb2xvZ3ktaWQpCisgICAgICAgIndpbmRvdyIgd2luZG93CisgICAgICAgImNvbXBvbmVudFR5cGUiICgtPiBjb21wLXBhZ2UtaW5mbyAuZ2V0X2NvbXBvbmVudF90eXBlIHN0ciBsb3dlci1jYXNlKQorICAgICAgICJ3aW5kb3dIaW50IiB3aW5kb3ctaGludAorICAgICAgICJkZWJ1ZyIgKG9yIGRlYnVnRW5hYmxlZCBmYWxzZSkKKyAgICAgICAic2FtcGxpbmdQY3QiIChvciBzYW1wbGluZ1BjdCAxMCkKKyAgICAgICAiZXZlbnRMb2dMaW5rIiAoZXZlbnQtbG9nLWxpbmsgdG9wb2xvZ3ktaWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICguZ2V0X2V2ZW50bG9nX2hvc3QgY29tcC1wYWdlLWluZm8pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICguZ2V0X2V2ZW50bG9nX3BvcnQgY29tcC1wYWdlLWluZm8pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3VyZT8pCisgICAgICAgInByb2ZpbGVBY3Rpb25FbmFibGVkIiAoKlNUT1JNLUNPTkYqIFdPUktFUi1QUk9GSUxFUi1FTkFCTEVEKQorICAgICAgICJwcm9maWxlckFjdGl2ZSIgKGlmICgqU1RPUk0tQ09ORiogV09SS0VSLVBST0ZJTEVSLUVOQUJMRUQpCisgICAgICAgICAgICAgICAgICAgICAgICAgIChnZXQtYWN0aXZlLXByb2ZpbGUtYWN0aW9ucyBuaW1idXMgdG9wb2xvZ3ktaWQgY29tcG9uZW50KQorICAgICAgICAgICAgICAgICAgICAgICAgICBbXSkpKSkpCisgICAgCisoZGVmbi0gbGV2ZWwtdG8tZGljdCBbbGV2ZWxdCisgIChpZiBsZXZlbAorICAgIChsZXQgW3RpbWVvdXQgKC5nZXRfcmVzZXRfbG9nX2xldmVsX3RpbWVvdXRfc2VjcyBsZXZlbCkKKyAgICAgICAgICB0aW1lb3V0LWVwb2NoICguZ2V0X3Jlc2V0X2xvZ19sZXZlbF90aW1lb3V0X2Vwb2NoIGxldmVsKQorICAgICAgICAgIHRhcmdldC1sZXZlbCAoLmdldF90YXJnZXRfbG9nX2xldmVsIGxldmVsKQorICAgICAgICAgIHJlc2V0LWxldmVsICguZ2V0X3Jlc2V0X2xvZ19sZXZlbCBsZXZlbCldCisgICAgICAgICAgeyJ0YXJnZXRfbGV2ZWwiICgudG9TdHJpbmcgKExldmVsL3RvTGV2ZWwgdGFyZ2V0LWxldmVsKSkKKyAgICAgICAgICAgInJlc2V0X2xldmVsIiAoLnRvU3RyaW5nIChMZXZlbC90b0xldmVsIHJlc2V0LWxldmVsKSkKKyAgICAgICAgICAgInRpbWVvdXQiIHRpbWVvdXQKKyAgICAgICAgICAgInRpbWVvdXRfZXBvY2giIHRpbWVvdXQtZXBvY2h9KSkpCisKKyhkZWZuIGxvZy1jb25maWcgW3RvcG9sb2d5LWlkXQorICAodGhyaWZ0L3dpdGgtY29uZmlndXJlZC1uaW1idXMtY29ubmVjdGlvbgorICAgIG5pbWJ1cworICAgIChsZXQgW2xvZy1jb25maWcgKC5nZXRMb2dDb25maWcgXk5pbWJ1cyRDbGllbnQgbmltYnVzIHRvcG9sb2d5LWlkKQorICAgICAgICAgIG5hbWVkLWxvZ2dlci1sZXZlbHMgKGludG8ge30KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvciBbW2tleSB2YWxdICguZ2V0X25hbWVkX2xvZ2dlcl9sZXZlbCBsb2ctY29uZmlnKV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKHN0ciBrZXkpIChsZXZlbC10by1kaWN0IHZhbCldKSldCisgICAgICB7Im5hbWVkTG9nZ2VyTGV2ZWxzIiBuYW1lZC1sb2dnZXItbGV2ZWxzfSkpKQogCiAoZGVmbiB0b3BvbG9neS1jb25maWcgW3RvcG9sb2d5LWlkXQogICAodGhyaWZ0L3dpdGgtY29uZmlndXJlZC1uaW1idXMtY29ubmVjdGlvbiBuaW1idXMKLSAgICAgKGZyb20tanNvbiAoLmdldFRvcG9sb2d5Q29uZiBeTmltYnVzJENsaWVudCBuaW1idXMgdG9wb2xvZ3ktaWQpKSkpCisgICAgKGZyb20tanNvbiAoLmdldFRvcG9sb2d5Q29uZiBeTmltYnVzJENsaWVudCBuaW1idXMgdG9wb2xvZ3ktaWQpKSkpCiAKIChkZWZuIHRvcG9sb2d5LW9wLXJlc3BvbnNlIFt0b3BvbG9neS1pZCBvcF0KICAgeyJ0b3BvbG9neU9wZXJhdGlvbiIgb3AsCkBAIC0xMDEyLDU3ICs5MDgsODkgQEAKICAgW3N5cz9dCiAgIChpZiAob3IgKG5pbD8gc3lzPykgKD0gImZhbHNlIiBzeXM/KSkgZmFsc2UgdHJ1ZSkpCiAKLShkZWZuIHdyYXAtanNvbi1pbi1jYWxsYmFjayBbY2FsbGJhY2sgcmVzcG9uc2VdCi0gIChzdHIgY2FsbGJhY2sgIigiIHJlc3BvbnNlICIpOyIpKQotCi0oZGVmbmsganNvbi1yZXNwb25zZQotICBbZGF0YSBjYWxsYmFjayA6c2VyaWFsaXplLWZuIHRvLWpzb24gOnN0YXR1cyAyMDBdCi0gICAgIHs6c3RhdHVzIHN0YXR1cwotICAgICAgOmhlYWRlcnMgKG1lcmdlIHsiQ2FjaGUtQ29udHJvbCIgIm5vLWNhY2hlLCBuby1zdG9yZSIKLSAgICAgICAgICAgICAgICAgICAgICAgIkFjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbiIgIioiCi0gICAgICAgICAgICAgICAgICAgICAgICJBY2Nlc3MtQ29udHJvbC1BbGxvdy1IZWFkZXJzIiAiQ29udGVudC1UeXBlLCBBY2Nlc3MtQ29udHJvbC1BbGxvdy1IZWFkZXJzLCBBY2Nlc3MtQ29udHJvbGVyLUFsbG93LU9yaWdpbiwgWC1SZXF1ZXN0ZWQtQnksIEF1dGhvcml6YXRpb24sIFgtUmVxdWVzdGVkLVdpdGgifQotICAgICAgICAgICAgICAgICAgICAgIChpZiAobm90LW5pbD8gY2FsbGJhY2spIHsiQ29udGVudC1UeXBlIiAiYXBwbGljYXRpb24vamF2YXNjcmlwdDtjaGFyc2V0PXV0Zi04In0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgeyJDb250ZW50LVR5cGUiICJhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTgifSkpCi0gICAgICA6Ym9keSAoaWYgKG5vdC1uaWw/IGNhbGxiYWNrKQotICAgICAgICAgICAgICAod3JhcC1qc29uLWluLWNhbGxiYWNrIGNhbGxiYWNrIChzZXJpYWxpemUtZm4gZGF0YSkpCi0gICAgICAgICAgICAgIChzZXJpYWxpemUtZm4gZGF0YSkpfSkKLQogKGRlZiBodHRwLWNyZWRzLWhhbmRsZXIgKEF1dGhVdGlscy9HZXRVaUh0dHBDcmVkZW50aWFsc1BsdWdpbiAqU1RPUk0tQ09ORiopKQogCisoZGVmbiBwb3B1bGF0ZS1jb250ZXh0IQorICAiUG9wdWxhdGUgdGhlIFN0b3JtIFJlcXVlc3RDb250ZXh0IGZyb20gYW4gc2VydmxldC1yZXF1ZXN0LiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgaW4gZWFjaCBoYW5kbGVyIgorICBbc2VydmxldC1yZXF1ZXN0XQorICAgICh3aGVuIGh0dHAtY3JlZHMtaGFuZGxlcgorICAgICAgKC5wb3B1bGF0ZUNvbnRleHQgaHR0cC1jcmVkcy1oYW5kbGVyIChSZXFDb250ZXh0L2NvbnRleHQpIHNlcnZsZXQtcmVxdWVzdCkpKQorCisoZGVmbiBnZXQtdXNlci1uYW1lCisgIFtzZXJ2bGV0LXJlcXVlc3RdCisgICguZ2V0VXNlck5hbWUgaHR0cC1jcmVkcy1oYW5kbGVyIHNlcnZsZXQtcmVxdWVzdCkpCisKIChkZWZyb3V0ZXMgbWFpbi1yb3V0ZXMKICAgKEdFVCAiL2FwaS92MS9jbHVzdGVyL2NvbmZpZ3VyYXRpb24iIFsmIG1dCi0gICAgICAgKGpzb24tcmVzcG9uc2UgKGNsdXN0ZXItY29uZmlndXJhdGlvbikKLSAgICAgICAgICAgICAgICAgICAgICAoOmNhbGxiYWNrIG0pIDpzZXJpYWxpemUtZm4gaWRlbnRpdHkpKQorICAgIChtYXJrISB1aTpudW0tY2x1c3Rlci1jb25maWd1cmF0aW9uLWh0dHAtcmVxdWVzdHMpCisgICAgKGpzb24tcmVzcG9uc2UgKGNsdXN0ZXItY29uZmlndXJhdGlvbikKKyAgICAgICAgICAgICAgICAgICAoOmNhbGxiYWNrIG0pIDpzZXJpYWxpemUtZm4gaWRlbnRpdHkpKQogICAoR0VUICIvYXBpL3YxL2NsdXN0ZXIvc3VtbWFyeSIgWzphcyB7OmtleXMgW2Nvb2tpZXMgc2VydmxldC1yZXF1ZXN0XX0gJiBtXQotICAgICAgIChsZXQgW3VzZXIgKC5nZXRVc2VyTmFtZSBodHRwLWNyZWRzLWhhbmRsZXIgc2VydmxldC1yZXF1ZXN0KV0KLSAgICAgICAgIChhc3NlcnQtYXV0aG9yaXplZC11c2VyIHNlcnZsZXQtcmVxdWVzdCAiZ2V0Q2x1c3RlckluZm8iKQotICAgICAgICAgKGpzb24tcmVzcG9uc2UgKGNsdXN0ZXItc3VtbWFyeSB1c2VyKSAoOmNhbGxiYWNrIG0pKSkpCisgICAgKG1hcmshIHVpOm51bS1jbHVzdGVyLXN1bW1hcnktaHR0cC1yZXF1ZXN0cykKKyAgICAocG9wdWxhdGUtY29udGV4dCEgc2VydmxldC1yZXF1ZXN0KQorICAgIChhc3NlcnQtYXV0aG9yaXplZC11c2VyICJnZXRDbHVzdGVySW5mbyIpCisgICAgKGxldCBbdXNlciAoZ2V0LXVzZXItbmFtZSBzZXJ2bGV0LXJlcXVlc3QpXQorICAgICAgKGpzb24tcmVzcG9uc2UgKGFzc29jIChjbHVzdGVyLXN1bW1hcnkgdXNlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImJ1Z3RyYWNrZXItdXJsIiAoKlNUT1JNLUNPTkYqIFVJLVBST0pFQ1QtQlVHVFJBQ0tFUi1VUkwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICJjZW50cmFsLWxvZy11cmwiICgqU1RPUk0tQ09ORiogVUktQ0VOVFJBTC1MT0dHSU5HLVVSTCkpICg6Y2FsbGJhY2sgbSkpKSkKICAgKEdFVCAiL2FwaS92MS9uaW1idXMvc3VtbWFyeSIgWzphcyB7OmtleXMgW2Nvb2tpZXMgc2VydmxldC1yZXF1ZXN0XX0gJiBtXQotICAgIChhc3NlcnQtYXV0aG9yaXplZC11c2VyIHNlcnZsZXQtcmVxdWVzdCAiZ2V0Q2x1c3RlckluZm8iKQorICAgIChtYXJrISB1aTpudW0tbmltYnVzLXN1bW1hcnktaHR0cC1yZXF1ZXN0cykKKyAgICAocG9wdWxhdGUtY29udGV4dCEgc2VydmxldC1yZXF1ZXN0KQorICAgIChhc3NlcnQtYXV0aG9yaXplZC11c2VyICJnZXRDbHVzdGVySW5mbyIpCiAgICAgKGpzb24tcmVzcG9uc2UgKG5pbWJ1cy1zdW1tYXJ5KSAoOmNhbGxiYWNrIG0pKSkKKyAgKEdFVCAiL2FwaS92MS9oaXN0b3J5L3N1bW1hcnkiIFs6YXMgezprZXlzIFtjb29raWVzIHNlcnZsZXQtcmVxdWVzdF19ICYgbV0KKyAgICAobGV0IFt1c2VyICguZ2V0VXNlck5hbWUgaHR0cC1jcmVkcy1oYW5kbGVyIHNlcnZsZXQtcmVxdWVzdCldCisgICAgICAoanNvbi1yZXNwb25zZSAodG9wb2xvZ3ktaGlzdG9yeS1pbmZvIHVzZXIpICg6Y2FsbGJhY2sgbSkpKSkKICAgKEdFVCAiL2FwaS92MS9zdXBlcnZpc29yL3N1bW1hcnkiIFs6YXMgezprZXlzIFtjb29raWVzIHNlcnZsZXQtcmVxdWVzdF19ICYgbV0KLSAgICAgICAoYXNzZXJ0LWF1dGhvcml6ZWQtdXNlciBzZXJ2bGV0LXJlcXVlc3QgImdldENsdXN0ZXJJbmZvIikKLSAgICAgICAoanNvbi1yZXNwb25zZSAoc3VwZXJ2aXNvci1zdW1tYXJ5KSAoOmNhbGxiYWNrIG0pKSkKKyAgICAobWFyayEgdWk6bnVtLXN1cGVydmlzb3Itc3VtbWFyeS1odHRwLXJlcXVlc3RzKQorICAgIChwb3B1bGF0ZS1jb250ZXh0ISBzZXJ2bGV0LXJlcXVlc3QpCisgICAgKGFzc2VydC1hdXRob3JpemVkLXVzZXIgImdldENsdXN0ZXJJbmZvIikKKyAgICAoanNvbi1yZXNwb25zZSAoYXNzb2MgKHN1cGVydmlzb3Itc3VtbWFyeSkKKyAgICAgICAgICAgICAgICAgICAgICJsb2d2aWV3ZXJQb3J0IiAoKlNUT1JNLUNPTkYqIExPR1ZJRVdFUi1QT1JUKSkgKDpjYWxsYmFjayBtKSkpCiAgIChHRVQgIi9hcGkvdjEvdG9wb2xvZ3kvc3VtbWFyeSIgWzphcyB7OmtleXMgW2Nvb2tpZXMgc2VydmxldC1yZXF1ZXN0XX0gJiBtXQotICAgICAgIChhc3NlcnQtYXV0aG9yaXplZC11c2VyIHNlcnZsZXQtcmVxdWVzdCAiZ2V0Q2x1c3RlckluZm8iKQotICAgICAgIChqc29uLXJlc3BvbnNlIChhbGwtdG9wb2xvZ2llcy1zdW1tYXJ5KSAoOmNhbGxiYWNrIG0pKSkKLSAgKEdFVCAgIi9hcGkvdjEvdG9wb2xvZ3kvOmlkIiBbOmFzIHs6a2V5cyBbY29va2llcyBzZXJ2bGV0LXJlcXVlc3Qgc2NoZW1hXX0gaWQgJiBtXQotICAgICAgICAobGV0IFt1c2VyICguZ2V0VXNlck5hbWUgaHR0cC1jcmVkcy1oYW5kbGVyIHNlcnZsZXQtcmVxdWVzdCldCi0gICAgICAgICAgKGFzc2VydC1hdXRob3JpemVkLXVzZXIgc2VydmxldC1yZXF1ZXN0ICJnZXRUb3BvbG9neSIgKHRvcG9sb2d5LWNvbmZpZyBpZCkpCi0gICAgICAgICAgKGpzb24tcmVzcG9uc2UgKHRvcG9sb2d5LXBhZ2UgaWQgKDp3aW5kb3cgbSkgKGNoZWNrLWluY2x1ZGUtc3lzPyAoOnN5cyBtKSkgdXNlciAoPSBzY2hlbWEgOmh0dHBzKSkgKDpjYWxsYmFjayBtKSkpKQorICAgIChtYXJrISB1aTpudW0tYWxsLXRvcG9sb2dpZXMtc3VtbWFyeS1odHRwLXJlcXVlc3RzKQorICAgIChwb3B1bGF0ZS1jb250ZXh0ISBzZXJ2bGV0LXJlcXVlc3QpCisgICAgKGFzc2VydC1hdXRob3JpemVkLXVzZXIgImdldENsdXN0ZXJJbmZvIikKKyAgICAoanNvbi1yZXNwb25zZSAoYWxsLXRvcG9sb2dpZXMtc3VtbWFyeSkgKDpjYWxsYmFjayBtKSkpCisgIChHRVQgICIvYXBpL3YxL3RvcG9sb2d5LXdvcmtlcnMvOmlkIiBbOmFzIHs6a2V5cyBbY29va2llcyBzZXJ2bGV0LXJlcXVlc3RdfSBpZCAmIG1dCisgICAgKGxldCBbaWQgKHVybC1kZWNvZGUgaWQpXQorICAgICAgKGpzb24tcmVzcG9uc2UgeyJob3N0UG9ydExpc3QiICh3b3JrZXItaG9zdC1wb3J0IGlkKQorICAgICAgICAgICAgICAgICAgICAgICJsb2d2aWV3ZXJQb3J0IiAoKlNUT1JNLUNPTkYqIExPR1ZJRVdFUi1QT1JUKX0gKDpjYWxsYmFjayBtKSkpKQorICAoR0VUICIvYXBpL3YxL3RvcG9sb2d5LzppZCIgWzphcyB7OmtleXMgW2Nvb2tpZXMgc2VydmxldC1yZXF1ZXN0IHNjaGVtZV19IGlkICYgbV0KKyAgICAobWFyayEgdWk6bnVtLXRvcG9sb2d5LXBhZ2UtaHR0cC1yZXF1ZXN0cykKKyAgICAocG9wdWxhdGUtY29udGV4dCEgc2VydmxldC1yZXF1ZXN0KQorICAgIChhc3NlcnQtYXV0aG9yaXplZC11c2VyICJnZXRUb3BvbG9neSIgKHRvcG9sb2d5LWNvbmZpZyBpZCkpCisgICAgKGxldCBbdXNlciAoZ2V0LXVzZXItbmFtZSBzZXJ2bGV0LXJlcXVlc3QpXQorICAgICAgKGpzb24tcmVzcG9uc2UgKHRvcG9sb2d5LXBhZ2UgaWQgKDp3aW5kb3cgbSkgKGNoZWNrLWluY2x1ZGUtc3lzPyAoOnN5cyBtKSkgdXNlciAoPSBzY2hlbWUgOmh0dHBzKSkgKDpjYWxsYmFjayBtKSkpKQorICAoR0VUICIvYXBpL3YxL3RvcG9sb2d5LzppZC92aXN1YWxpemF0aW9uLWluaXQiIFs6YXMgezprZXlzIFtjb29raWVzIHNlcnZsZXQtcmVxdWVzdF19IGlkICYgbV0KKyAgICAobWFyayEgdWk6bnVtLWJ1aWxkLXZpc3VhbGl6YXRpb24taHR0cC1yZXF1ZXN0cykKKyAgICAocG9wdWxhdGUtY29udGV4dCEgc2VydmxldC1yZXF1ZXN0KQorICAgIChhc3NlcnQtYXV0aG9yaXplZC11c2VyICJnZXRUb3BvbG9neSIgKHRvcG9sb2d5LWNvbmZpZyBpZCkpCisgICAgKGpzb24tcmVzcG9uc2UgKGJ1aWxkLXZpc3VhbGl6YXRpb24gaWQgKDp3aW5kb3cgbSkgKGNoZWNrLWluY2x1ZGUtc3lzPyAoOnN5cyBtKSkpICg6Y2FsbGJhY2sgbSkpKQogICAoR0VUICIvYXBpL3YxL3RvcG9sb2d5LzppZC92aXN1YWxpemF0aW9uIiBbOmFzIHs6a2V5cyBbY29va2llcyBzZXJ2bGV0LXJlcXVlc3RdfSBpZCAmIG1dCi0gICAgICAgIChhc3NlcnQtYXV0aG9yaXplZC11c2VyIHNlcnZsZXQtcmVxdWVzdCAiZ2V0VG9wb2xvZ3kiICh0b3BvbG9neS1jb25maWcgaWQpKQotICAgICAgICAoanNvbi1yZXNwb25zZSAobWstdmlzdWFsaXphdGlvbi1kYXRhIGlkICg6d2luZG93IG0pIChjaGVjay1pbmNsdWRlLXN5cz8gKDpzeXMgbSkpKSAoOmNhbGxiYWNrIG0pKSkKKyAgICAobWFyayEgdWk6bnVtLW1rLXZpc3VhbGl6YXRpb24tZGF0YS1odHRwLXJlcXVlc3RzKQorICAgIChwb3B1bGF0ZS1jb250ZXh0ISBzZXJ2bGV0LXJlcXVlc3QpCisgICAgKGFzc2VydC1hdXRob3JpemVkLXVzZXIgImdldFRvcG9sb2d5IiAodG9wb2xvZ3ktY29uZmlnIGlkKSkKKyAgICAoanNvbi1yZXNwb25zZSAobWstdmlzdWFsaXphdGlvbi1kYXRhIGlkICg6d2luZG93IG0pIChjaGVjay1pbmNsdWRlLXN5cz8gKDpzeXMgbSkpKSAoOmNhbGxiYWNrIG0pKSkKICAgKEdFVCAiL2FwaS92MS90b3BvbG9neS86aWQvY29tcG9uZW50Lzpjb21wb25lbnQiIFs6YXMgezprZXlzIFtjb29raWVzIHNlcnZsZXQtcmVxdWVzdCBzY2hlbWVdfSBpZCBjb21wb25lbnQgJiBtXQotICAgICAgIChsZXQgW3VzZXIgKC5nZXRVc2VyTmFtZSBodHRwLWNyZWRzLWhhbmRsZXIgc2VydmxldC1yZXF1ZXN0KV0KLSAgICAgICAgIChhc3NlcnQtYXV0aG9yaXplZC11c2VyIHNlcnZsZXQtcmVxdWVzdCAiZ2V0VG9wb2xvZ3kiICh0b3BvbG9neS1jb25maWcgaWQpKQotICAgICAgICAgKGpzb24tcmVzcG9uc2UKKyAgICAobWFyayEgdWk6bnVtLWNvbXBvbmVudC1wYWdlLWh0dHAtcmVxdWVzdHMpCisgICAgKHBvcHVsYXRlLWNvbnRleHQhIHNlcnZsZXQtcmVxdWVzdCkKKyAgICAoYXNzZXJ0LWF1dGhvcml6ZWQtdXNlciAiZ2V0VG9wb2xvZ3kiICh0b3BvbG9neS1jb25maWcgaWQpKQorICAgIChsZXQgW3VzZXIgKGdldC11c2VyLW5hbWUgc2VydmxldC1yZXF1ZXN0KV0KKyAgICAgIChqc29uLXJlc3BvbnNlCiAgICAgICAgICAgKGNvbXBvbmVudC1wYWdlIGlkIGNvbXBvbmVudCAoOndpbmRvdyBtKSAoY2hlY2staW5jbHVkZS1zeXM/ICg6c3lzIG0pKSB1c2VyICg9IHNjaGVtZSA6aHR0cHMpKQogICAgICAgICAgICg6Y2FsbGJhY2sgbSkpKSkKKyAgKEdFVCAiL2FwaS92MS90b3BvbG9neS86aWQvbG9nY29uZmlnIiBbOmFzIHs6a2V5cyBbY29va2llcyBzZXJ2bGV0LXJlcXVlc3RdfSBpZCAmIG1dCisgICAgKG1hcmshIHVpOm51bS1sb2ctY29uZmlnLWh0dHAtcmVxdWVzdHMpCisgICAgKHBvcHVsYXRlLWNvbnRleHQhIHNlcnZsZXQtcmVxdWVzdCkKKyAgICAoYXNzZXJ0LWF1dGhvcml6ZWQtdXNlciAiZ2V0VG9wb2xvZ3kiICh0b3BvbG9neS1jb25maWcgaWQpKQorICAgICAgIChqc29uLXJlc3BvbnNlIChsb2ctY29uZmlnIGlkKSAoOmNhbGxiYWNrIG0pKSkKICAgKFBPU1QgIi9hcGkvdjEvdG9wb2xvZ3kvOmlkL2FjdGl2YXRlIiBbOmFzIHs6a2V5cyBbY29va2llcyBzZXJ2bGV0LXJlcXVlc3RdfSBpZCAmIG1dCisgICAgKG1hcmshIHVpOm51bS1hY3RpdmF0ZS10b3BvbG9neS1odHRwLXJlcXVlc3RzKQorICAgIChwb3B1bGF0ZS1jb250ZXh0ISBzZXJ2bGV0LXJlcXVlc3QpCisgICAgKGFzc2VydC1hdXRob3JpemVkLXVzZXIgImFjdGl2YXRlIiAodG9wb2xvZ3ktY29uZmlnIGlkKSkKICAgICAodGhyaWZ0L3dpdGgtY29uZmlndXJlZC1uaW1idXMtY29ubmVjdGlvbiBuaW1idXMKLSAgICAoYXNzZXJ0LWF1dGhvcml6ZWQtdXNlciBzZXJ2bGV0LXJlcXVlc3QgImFjdGl2YXRlIiAodG9wb2xvZ3ktY29uZmlnIGlkKSkKLSAgICAgIChsZXQgW3RwbGcgKC0+PiAoZG90bworICAgICAgIChsZXQgW3RwbGcgKC0+PiAoZG90bwogICAgICAgICAgICAgICAgICAgICAgICAgKEdldEluZm9PcHRpb25zLikKICAgICAgICAgICAgICAgICAgICAgICAgICguc2V0X251bV9lcnJfY2hvaWNlIE51bUVycm9yc0Nob2ljZS9OT05FKSkKICAgICAgICAgICAgICAgICAgICAgICAoLmdldFRvcG9sb2d5SW5mb1dpdGhPcHRzIF5OaW1idXMkQ2xpZW50IG5pbWJ1cyBpZCkpCkBAIC0xMDcxLDkgKzk5OSwxMSBAQAogICAgICAgICAobG9nLW1lc3NhZ2UgIkFjdGl2YXRpbmcgdG9wb2xvZ3kgJyIgbmFtZSAiJyIpKSkKICAgICAoanNvbi1yZXNwb25zZSAodG9wb2xvZ3ktb3AtcmVzcG9uc2UgaWQgImFjdGl2YXRlIikgKG0gImNhbGxiYWNrIikpKQogICAoUE9TVCAiL2FwaS92MS90b3BvbG9neS86aWQvZGVhY3RpdmF0ZSIgWzphcyB7OmtleXMgW2Nvb2tpZXMgc2VydmxldC1yZXF1ZXN0XX0gaWQgJiBtXQorICAgIChtYXJrISB1aTpudW0tZGVhY3RpdmF0ZS10b3BvbG9neS1odHRwLXJlcXVlc3RzKQorICAgIChwb3B1bGF0ZS1jb250ZXh0ISBzZXJ2bGV0LXJlcXVlc3QpCisgICAgKGFzc2VydC1hdXRob3JpemVkLXVzZXIgImRlYWN0aXZhdGUiICh0b3BvbG9neS1jb25maWcgaWQpKQogICAgICh0aHJpZnQvd2l0aC1jb25maWd1cmVkLW5pbWJ1cy1jb25uZWN0aW9uIG5pbWJ1cwotICAgIChhc3NlcnQtYXV0aG9yaXplZC11c2VyIHNlcnZsZXQtcmVxdWVzdCAiZGVhY3RpdmF0ZSIgKHRvcG9sb2d5LWNvbmZpZyBpZCkpCi0gICAgICAobGV0IFt0cGxnICgtPj4gKGRvdG8KKyAgICAgICAgKGxldCBbdHBsZyAoLT4+IChkb3RvCiAgICAgICAgICAgICAgICAgICAgICAgICAoR2V0SW5mb09wdGlvbnMuKQogICAgICAgICAgICAgICAgICAgICAgICAgKC5zZXRfbnVtX2Vycl9jaG9pY2UgTnVtRXJyb3JzQ2hvaWNlL05PTkUpKQogICAgICAgICAgICAgICAgICAgICAgICguZ2V0VG9wb2xvZ3lJbmZvV2l0aE9wdHMgXk5pbWJ1cyRDbGllbnQgbmltYnVzIGlkKSkKQEAgLTEwODIsOSArMTAxMiwxMSBAQAogICAgICAgICAobG9nLW1lc3NhZ2UgIkRlYWN0aXZhdGluZyB0b3BvbG9neSAnIiBuYW1lICInIikpKQogICAgIChqc29uLXJlc3BvbnNlICh0b3BvbG9neS1vcC1yZXNwb25zZSBpZCAiZGVhY3RpdmF0ZSIpIChtICJjYWxsYmFjayIpKSkKICAgKFBPU1QgIi9hcGkvdjEvdG9wb2xvZ3kvOmlkL2RlYnVnLzphY3Rpb24vOnNwY3QiIFs6YXMgezprZXlzIFtjb29raWVzIHNlcnZsZXQtcmVxdWVzdF19IGlkIGFjdGlvbiBzcGN0ICYgbV0KLSAgICAoYXNzZXJ0LWF1dGhvcml6ZWQtdXNlciBzZXJ2bGV0LXJlcXVlc3QgImRlYnVnIiAodG9wb2xvZ3ktY29uZmlnIGlkKSkKKyAgICAobWFyayEgdWk6bnVtLWRlYnVnLXRvcG9sb2d5LWh0dHAtcmVxdWVzdHMpCisgICAgKHBvcHVsYXRlLWNvbnRleHQhIHNlcnZsZXQtcmVxdWVzdCkKKyAgICAoYXNzZXJ0LWF1dGhvcml6ZWQtdXNlciAiZGVidWciICh0b3BvbG9neS1jb25maWcgaWQpKQogICAgICh0aHJpZnQvd2l0aC1jb25maWd1cmVkLW5pbWJ1cy1jb25uZWN0aW9uIG5pbWJ1cwotICAgICAgKGxldCBbdHBsZyAoLT4+IChkb3RvCisgICAgICAgIChsZXQgW3RwbGcgKC0+PiAoZG90bwogICAgICAgICAgICAgICAgICAgICAgICAgKEdldEluZm9PcHRpb25zLikKICAgICAgICAgICAgICAgICAgICAgICAgICguc2V0X251bV9lcnJfY2hvaWNlIE51bUVycm9yc0Nob2ljZS9OT05FKSkKICAgICAgICAgICAgICAgICAgICAoLmdldFRvcG9sb2d5SW5mb1dpdGhPcHRzIF5OaW1idXMkQ2xpZW50IG5pbWJ1cyBpZCkpCkBAIC0xMDkyLDkgKzEwMjQsMTEgQEAKICAgICAgICAgICAgIGVuYWJsZT8gKD0gImVuYWJsZSIgYWN0aW9uKV0KICAgICAgICAgKC5kZWJ1ZyBuaW1idXMgbmFtZSAiIiBlbmFibGU/IChJbnRlZ2VyL3BhcnNlSW50IHNwY3QpKQogICAgICAgICAobG9nLW1lc3NhZ2UgIkRlYnVnIHRvcG9sb2d5IFsiIG5hbWUgIl0gYWN0aW9uIFsiIGFjdGlvbiAiXSBzYW1wbGluZyBwY3QgWyIgc3BjdCAiXSIpKSkKLSAgICAoanNvbi1yZXNwb25zZSAodG9wb2xvZ3ktb3AtcmVzcG9uc2UgaWQgKHN0ciAiZGVidWcvIiBhY3Rpb24pKSAobSAiY2FsbGJhY2siKSkpCisgICAgIChqc29uLXJlc3BvbnNlICh0b3BvbG9neS1vcC1yZXNwb25zZSBpZCAoc3RyICJkZWJ1Zy8iIGFjdGlvbikpIChtICJjYWxsYmFjayIpKSkKICAgKFBPU1QgIi9hcGkvdjEvdG9wb2xvZ3kvOmlkL2NvbXBvbmVudC86Y29tcG9uZW50L2RlYnVnLzphY3Rpb24vOnNwY3QiIFs6YXMgezprZXlzIFtjb29raWVzIHNlcnZsZXQtcmVxdWVzdF19IGlkIGNvbXBvbmVudCBhY3Rpb24gc3BjdCAmIG1dCi0gICAgKGFzc2VydC1hdXRob3JpemVkLXVzZXIgc2VydmxldC1yZXF1ZXN0ICJkZWJ1ZyIgKHRvcG9sb2d5LWNvbmZpZyBpZCkpCisgICAgKG1hcmshIHVpOm51bS1jb21wb25lbnQtb3AtcmVzcG9uc2UtaHR0cC1yZXF1ZXN0cykKKyAgICAocG9wdWxhdGUtY29udGV4dCEgc2VydmxldC1yZXF1ZXN0KQorICAgIChhc3NlcnQtYXV0aG9yaXplZC11c2VyICJkZWJ1ZyIgKHRvcG9sb2d5LWNvbmZpZyBpZCkpCiAgICAgKHRocmlmdC93aXRoLWNvbmZpZ3VyZWQtbmltYnVzLWNvbm5lY3Rpb24gbmltYnVzCiAgICAgICAobGV0IFt0cGxnICgtPj4gKGRvdG8KICAgICAgICAgICAgICAgICAgICAgICAgIChHZXRJbmZvT3B0aW9ucy4pCkBAIC0xMTA2LDggKzEwNDAsMTAgQEAKICAgICAgICAgKGxvZy1tZXNzYWdlICJEZWJ1ZyB0b3BvbG9neSBbIiBuYW1lICJdIGNvbXBvbmVudCBbIiBjb21wb25lbnQgIl0gYWN0aW9uIFsiIGFjdGlvbiAiXSBzYW1wbGluZyBwY3QgWyIgc3BjdCAiXSIpKSkKICAgICAoanNvbi1yZXNwb25zZSAoY29tcG9uZW50LW9wLXJlc3BvbnNlIGlkIGNvbXBvbmVudCAoc3RyICIvZGVidWcvIiBhY3Rpb24pKSAobSAiY2FsbGJhY2siKSkpCiAgIChQT1NUICIvYXBpL3YxL3RvcG9sb2d5LzppZC9yZWJhbGFuY2UvOndhaXQtdGltZSIgWzphcyB7OmtleXMgW2Nvb2tpZXMgc2VydmxldC1yZXF1ZXN0XX0gaWQgd2FpdC10aW1lICYgbV0KKyAgICAobWFyayEgdWk6bnVtLXRvcG9sb2d5LW9wLXJlc3BvbnNlLWh0dHAtcmVxdWVzdHMpCisgICAgKHBvcHVsYXRlLWNvbnRleHQhIHNlcnZsZXQtcmVxdWVzdCkKKyAgICAoYXNzZXJ0LWF1dGhvcml6ZWQtdXNlciAicmViYWxhbmNlIiAodG9wb2xvZ3ktY29uZmlnIGlkKSkKICAgICAodGhyaWZ0L3dpdGgtY29uZmlndXJlZC1uaW1idXMtY29ubmVjdGlvbiBuaW1idXMKLSAgICAoYXNzZXJ0LWF1dGhvcml6ZWQtdXNlciBzZXJ2bGV0LXJlcXVlc3QgInJlYmFsYW5jZSIgKHRvcG9sb2d5LWNvbmZpZyBpZCkpCiAgICAgICAobGV0IFt0cGxnICgtPj4gKGRvdG8KICAgICAgICAgICAgICAgICAgICAgICAgIChHZXRJbmZvT3B0aW9ucy4pCiAgICAgICAgICAgICAgICAgICAgICAgICAoLnNldF9udW1fZXJyX2Nob2ljZSBOdW1FcnJvcnNDaG9pY2UvTk9ORSkpCkBAIC0xMTI1LDcgKzEwNjEsOSBAQAogICAgICAgICAobG9nLW1lc3NhZ2UgIlJlYmFsYW5jaW5nIHRvcG9sb2d5ICciIG5hbWUgIicgd2l0aCB3YWl0IHRpbWU6ICIgd2FpdC10aW1lICIgc2VjcyIpKSkKICAgICAoanNvbi1yZXNwb25zZSAodG9wb2xvZ3ktb3AtcmVzcG9uc2UgaWQgInJlYmFsYW5jZSIpIChtICJjYWxsYmFjayIpKSkKICAgKFBPU1QgIi9hcGkvdjEvdG9wb2xvZ3kvOmlkL2tpbGwvOndhaXQtdGltZSIgWzphcyB7OmtleXMgW2Nvb2tpZXMgc2VydmxldC1yZXF1ZXN0XX0gaWQgd2FpdC10aW1lICYgbV0KLSAgICAoYXNzZXJ0LWF1dGhvcml6ZWQtdXNlciBzZXJ2bGV0LXJlcXVlc3QgImtpbGxUb3BvbG9neSIgKHRvcG9sb2d5LWNvbmZpZyBpZCkpCisgICAgKG1hcmshIHVpOm51bS10b3BvbG9neS1vcC1yZXNwb25zZS1odHRwLXJlcXVlc3RzKQorICAgIChwb3B1bGF0ZS1jb250ZXh0ISBzZXJ2bGV0LXJlcXVlc3QpCisgICAgKGFzc2VydC1hdXRob3JpemVkLXVzZXIgImtpbGxUb3BvbG9neSIgKHRvcG9sb2d5LWNvbmZpZyBpZCkpCiAgICAgKHRocmlmdC93aXRoLWNvbmZpZ3VyZWQtbmltYnVzLWNvbm5lY3Rpb24gbmltYnVzCiAgICAgICAobGV0IFt0cGxnICgtPj4gKGRvdG8KICAgICAgICAgICAgICAgICAgICAgICAgIChHZXRJbmZvT3B0aW9ucy4pCkBAIC0xMTM3LDE5ICsxMDc1LDE2MSBAQAogICAgICAgICAoLmtpbGxUb3BvbG9neVdpdGhPcHRzIG5pbWJ1cyBuYW1lIG9wdGlvbnMpCiAgICAgICAgIChsb2ctbWVzc2FnZSAiS2lsbGluZyB0b3BvbG9neSAnIiBuYW1lICInIHdpdGggd2FpdCB0aW1lOiAiIHdhaXQtdGltZSAiIHNlY3MiKSkpCiAgICAgKGpzb24tcmVzcG9uc2UgKHRvcG9sb2d5LW9wLXJlc3BvbnNlIGlkICJraWxsIikgKG0gImNhbGxiYWNrIikpKQorICAoUE9TVCAiL2FwaS92MS90b3BvbG9neS86aWQvbG9nY29uZmlnIiBbOmFzIHs6a2V5cyBbY29va2llcyBzZXJ2bGV0LXJlcXVlc3RdfSBpZCBuYW1lZExvZ2dlckxldmVscyAmIG1dCisgICAgKG1hcmshIHVpOm51bS10b3BvbG9neS1vcC1yZXNwb25zZS1odHRwLXJlcXVlc3RzKQorICAgIChwb3B1bGF0ZS1jb250ZXh0ISBzZXJ2bGV0LXJlcXVlc3QpCisgICAgKGFzc2VydC1hdXRob3JpemVkLXVzZXIgInNldExvZ0NvbmZpZyIgKHRvcG9sb2d5LWNvbmZpZyBpZCkpCisgICAgKHRocmlmdC93aXRoLWNvbmZpZ3VyZWQtbmltYnVzLWNvbm5lY3Rpb24KKyAgICAgIG5pbWJ1cworICAgICAgKGxldCBbbmV3LWxvZy1jb25maWcgKExvZ0NvbmZpZy4pXQorICAgICAgICAoZG9zZXEgW1trZXkgbGV2ZWxdIG5hbWVkTG9nZ2VyTGV2ZWxzXQorICAgICAgICAgICAgKGxldCBbbG9nZ2VyLW5hbWUgKHN0ciBrZXkpCisgICAgICAgICAgICAgICAgICB0YXJnZXQtbGV2ZWwgKC5nZXQgbGV2ZWwgInRhcmdldF9sZXZlbCIpCisgICAgICAgICAgICAgICAgICB0aW1lb3V0IChvciAoLmdldCBsZXZlbCAidGltZW91dCIpIDApCisgICAgICAgICAgICAgICAgICBuYW1lZC1sb2dnZXItbGV2ZWwgKExvZ0xldmVsLildCisgICAgICAgICAgICAgIDs7IGlmIHRhcmdldC1sZXZlbCBpcyBuaWwsIGRvIG5vdCBzZXQgaXQsIHVzZXIgd2FudHMgdG8gY2xlYXIKKyAgICAgICAgICAgICAgKGxvZy1tZXNzYWdlICJUaGUgdGFyZ2V0IGxldmVsIGZvciAiIGxvZ2dlci1uYW1lICIgaXMgIiB0YXJnZXQtbGV2ZWwpCisgICAgICAgICAgICAgIChpZiAobmlsPyB0YXJnZXQtbGV2ZWwpCisgICAgICAgICAgICAgICAgKGRvCisgICAgICAgICAgICAgICAgICAoLnNldF9hY3Rpb24gbmFtZWQtbG9nZ2VyLWxldmVsIExvZ0xldmVsQWN0aW9uL1JFTU9WRSkKKyAgICAgICAgICAgICAgICAgICgudW5zZXRfdGFyZ2V0X2xvZ19sZXZlbCBuYW1lZC1sb2dnZXItbGV2ZWwpKQorICAgICAgICAgICAgICAgIChkbworICAgICAgICAgICAgICAgICAgKC5zZXRfYWN0aW9uIG5hbWVkLWxvZ2dlci1sZXZlbCBMb2dMZXZlbEFjdGlvbi9VUERBVEUpCisgICAgICAgICAgICAgICAgICA7OyB0aGUgdG9MZXZlbCBoZXJlIGVuc3VyZXMgdGhlIHN0cmluZyB3ZSBnZXQgaXMgdmFsaWQKKyAgICAgICAgICAgICAgICAgICguc2V0X3RhcmdldF9sb2dfbGV2ZWwgbmFtZWQtbG9nZ2VyLWxldmVsICgubmFtZSAoTGV2ZWwvdG9MZXZlbCB0YXJnZXQtbGV2ZWwpKSkKKyAgICAgICAgICAgICAgICAgICguc2V0X3Jlc2V0X2xvZ19sZXZlbF90aW1lb3V0X3NlY3MgbmFtZWQtbG9nZ2VyLWxldmVsIHRpbWVvdXQpKSkKKyAgICAgICAgICAgICAgKGxvZy1tZXNzYWdlICJBZGRpbmcgdGhpcyAiIGxvZ2dlci1uYW1lICIgIiBuYW1lZC1sb2dnZXItbGV2ZWwgIiB0byAiIG5ldy1sb2ctY29uZmlnKQorICAgICAgICAgICAgICAoLnB1dF90b19uYW1lZF9sb2dnZXJfbGV2ZWwgbmV3LWxvZy1jb25maWcgbG9nZ2VyLW5hbWUgbmFtZWQtbG9nZ2VyLWxldmVsKSkpCisgICAgICAgIChsb2ctbWVzc2FnZSAiU2V0dGluZyB0b3BvbG9neSAiIGlkICIgbG9nIGNvbmZpZyAiIG5ldy1sb2ctY29uZmlnKQorICAgICAgICAoLnNldExvZ0NvbmZpZyBuaW1idXMgaWQgbmV3LWxvZy1jb25maWcpCisgICAgICAgIChqc29uLXJlc3BvbnNlIChsb2ctY29uZmlnIGlkKSAobSAiY2FsbGJhY2siKSkpKSkKKworICAoR0VUICIvYXBpL3YxL3RvcG9sb2d5LzppZC9wcm9maWxpbmcvc3RhcnQvOmhvc3QtcG9ydC86dGltZW91dCIKKyAgICAgICBbOmFzIHs6a2V5cyBbc2VydmxldC1yZXF1ZXN0XX0gaWQgaG9zdC1wb3J0IHRpbWVvdXQgJiBtXQorICAgICAgICh0aHJpZnQvd2l0aC1jb25maWd1cmVkLW5pbWJ1cy1jb25uZWN0aW9uIG5pbWJ1cworICAgICAgICAgKGxldCBbdXNlciAoLmdldFVzZXJOYW1lIGh0dHAtY3JlZHMtaGFuZGxlciBzZXJ2bGV0LXJlcXVlc3QpCisgICAgICAgICAgICAgICB0b3BvbG9neS1jb25mIChmcm9tLWpzb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICguZ2V0VG9wb2xvZ3lDb25mIF5OaW1idXMkQ2xpZW50IG5pbWJ1cyBpZCkpXQorICAgICAgICAgICAoYXNzZXJ0LWF1dGhvcml6ZWQtdXNlciAic2V0V29ya2VyUHJvZmlsZXIiICh0b3BvbG9neS1jb25maWcgaWQpKQorICAgICAgICAgICAoYXNzZXJ0LWF1dGhvcml6ZWQtcHJvZmlsZXItYWN0aW9uICJzdGFydCIpKQorCisgICAgICAgICAobGV0IFtbaG9zdCwgcG9ydF0gKHNwbGl0IGhvc3QtcG9ydCAjIjoiKQorICAgICAgICAgICAgICAgbm9kZWluZm8gKE5vZGVJbmZvLiBob3N0IChzZXQgWyhMb25nLiBwb3J0KV0pKQorICAgICAgICAgICAgICAgdGltZXN0YW1wICgrIChTeXN0ZW0vY3VycmVudFRpbWVNaWxsaXMpICgqIDYwMDAwIChMb25nLiB0aW1lb3V0KSkpCisgICAgICAgICAgICAgICByZXF1ZXN0IChQcm9maWxlUmVxdWVzdC4gbm9kZWluZm8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9maWxlQWN0aW9uL0pQUk9GSUxFX1NUT1ApXQorICAgICAgICAgICAoLnNldF90aW1lX3N0YW1wIHJlcXVlc3QgdGltZXN0YW1wKQorICAgICAgICAgICAoLnNldFdvcmtlclByb2ZpbGVyIG5pbWJ1cyBpZCByZXF1ZXN0KQorICAgICAgICAgICAoanNvbi1yZXNwb25zZSB7InN0YXR1cyIgIm9rIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgImlkIiBob3N0LXBvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aW1lb3V0IiB0aW1lb3V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAiZHVtcGxpbmsiICh3b3JrZXItZHVtcC1saW5rCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCl9CisgICAgICAgICAgICAgICAgICAgICAgICAgIChtICJjYWxsYmFjayIpKSkpKQorCisgIChHRVQgIi9hcGkvdjEvdG9wb2xvZ3kvOmlkL3Byb2ZpbGluZy9zdG9wLzpob3N0LXBvcnQiCisgICAgICAgWzphcyB7OmtleXMgW3NlcnZsZXQtcmVxdWVzdF19IGlkIGhvc3QtcG9ydCAmIG1dCisgICAgICAgKHRocmlmdC93aXRoLWNvbmZpZ3VyZWQtbmltYnVzLWNvbm5lY3Rpb24gbmltYnVzCisgICAgICAgICAobGV0IFt1c2VyICguZ2V0VXNlck5hbWUgaHR0cC1jcmVkcy1oYW5kbGVyIHNlcnZsZXQtcmVxdWVzdCkKKyAgICAgICAgICAgICAgIHRvcG9sb2d5LWNvbmYgKGZyb20tanNvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC5nZXRUb3BvbG9neUNvbmYgXk5pbWJ1cyRDbGllbnQgbmltYnVzIGlkKSldCisgICAgICAgICAgIChhc3NlcnQtYXV0aG9yaXplZC11c2VyICJzZXRXb3JrZXJQcm9maWxlciIgKHRvcG9sb2d5LWNvbmZpZyBpZCkpCisgICAgICAgICAgIChhc3NlcnQtYXV0aG9yaXplZC1wcm9maWxlci1hY3Rpb24gInN0b3AiKSkKKyAgICAgICAgIChsZXQgW1tob3N0LCBwb3J0XSAoc3BsaXQgaG9zdC1wb3J0ICMiOiIpCisgICAgICAgICAgICAgICBub2RlaW5mbyAoTm9kZUluZm8uIGhvc3QgKHNldCBbKExvbmcuIHBvcnQpXSkpCisgICAgICAgICAgICAgICB0aW1lc3RhbXAgMAorICAgICAgICAgICAgICAgcmVxdWVzdCAoUHJvZmlsZVJlcXVlc3QuIG5vZGVpbmZvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZmlsZUFjdGlvbi9KUFJPRklMRV9TVE9QKV0KKyAgICAgICAgICAgKC5zZXRfdGltZV9zdGFtcCByZXF1ZXN0IHRpbWVzdGFtcCkKKyAgICAgICAgICAgKC5zZXRXb3JrZXJQcm9maWxlciBuaW1idXMgaWQgcmVxdWVzdCkKKyAgICAgICAgICAgKGpzb24tcmVzcG9uc2UgeyJzdGF0dXMiICJvayIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZCIgaG9zdC1wb3J0fQorICAgICAgICAgICAgICAgICAgICAgICAgICAobSAiY2FsbGJhY2siKSkpKSkKKyAgCisgIChHRVQgIi9hcGkvdjEvdG9wb2xvZ3kvOmlkL3Byb2ZpbGluZy9kdW1wcHJvZmlsZS86aG9zdC1wb3J0IgorICAgICAgIFs6YXMgezprZXlzIFtzZXJ2bGV0LXJlcXVlc3RdfSBpZCBob3N0LXBvcnQgJiBtXQorICAgICAgICh0aHJpZnQvd2l0aC1jb25maWd1cmVkLW5pbWJ1cy1jb25uZWN0aW9uIG5pbWJ1cworICAgICAgICAgKGxldCBbdXNlciAoLmdldFVzZXJOYW1lIGh0dHAtY3JlZHMtaGFuZGxlciBzZXJ2bGV0LXJlcXVlc3QpCisgICAgICAgICAgICAgICB0b3BvbG9neS1jb25mIChmcm9tLWpzb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICguZ2V0VG9wb2xvZ3lDb25mIF5OaW1idXMkQ2xpZW50IG5pbWJ1cyBpZCkpXQorICAgICAgICAgICAoYXNzZXJ0LWF1dGhvcml6ZWQtdXNlciAic2V0V29ya2VyUHJvZmlsZXIiICh0b3BvbG9neS1jb25maWcgaWQpKQorICAgICAgICAgICAoYXNzZXJ0LWF1dGhvcml6ZWQtcHJvZmlsZXItYWN0aW9uICJkdW1wcHJvZmlsZSIpKQorICAgICAgICAgKGxldCBbW2hvc3QsIHBvcnRdIChzcGxpdCBob3N0LXBvcnQgIyI6IikKKyAgICAgICAgICAgICAgIG5vZGVpbmZvIChOb2RlSW5mby4gaG9zdCAoc2V0IFsoTG9uZy4gcG9ydCldKSkKKyAgICAgICAgICAgICAgIHRpbWVzdGFtcCAoU3lzdGVtL2N1cnJlbnRUaW1lTWlsbGlzKQorICAgICAgICAgICAgICAgcmVxdWVzdCAoUHJvZmlsZVJlcXVlc3QuIG5vZGVpbmZvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvZmlsZUFjdGlvbi9KUFJPRklMRV9EVU1QKV0KKyAgICAgICAgICAgKC5zZXRfdGltZV9zdGFtcCByZXF1ZXN0IHRpbWVzdGFtcCkKKyAgICAgICAgICAgKC5zZXRXb3JrZXJQcm9maWxlciBuaW1idXMgaWQgcmVxdWVzdCkKKyAgICAgICAgICAgKGpzb24tcmVzcG9uc2UgeyJzdGF0dXMiICJvayIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZCIgaG9zdC1wb3J0fQorICAgICAgICAgICAgICAgICAgICAgICAgICAobSAiY2FsbGJhY2siKSkpKSkKKworICAoR0VUICIvYXBpL3YxL3RvcG9sb2d5LzppZC9wcm9maWxpbmcvZHVtcGpzdGFjay86aG9zdC1wb3J0IgorICAgICAgIFs6YXMgezprZXlzIFtzZXJ2bGV0LXJlcXVlc3RdfSBpZCBob3N0LXBvcnQgJiBtXQorICAgICAgICh0aHJpZnQvd2l0aC1jb25maWd1cmVkLW5pbWJ1cy1jb25uZWN0aW9uIG5pbWJ1cworICAgICAgICAgKGxldCBbdXNlciAoLmdldFVzZXJOYW1lIGh0dHAtY3JlZHMtaGFuZGxlciBzZXJ2bGV0LXJlcXVlc3QpCisgICAgICAgICAgICAgICB0b3BvbG9neS1jb25mIChmcm9tLWpzb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICguZ2V0VG9wb2xvZ3lDb25mIF5OaW1idXMkQ2xpZW50IG5pbWJ1cyBpZCkpXQorICAgICAgICAgICAoYXNzZXJ0LWF1dGhvcml6ZWQtdXNlciAic2V0V29ya2VyUHJvZmlsZXIiICh0b3BvbG9neS1jb25maWcgaWQpKQorICAgICAgICAgICAoYXNzZXJ0LWF1dGhvcml6ZWQtcHJvZmlsZXItYWN0aW9uICJkdW1wanN0YWNrIikpCisgICAgICAgICAobGV0IFtbaG9zdCwgcG9ydF0gKHNwbGl0IGhvc3QtcG9ydCAjIjoiKQorICAgICAgICAgICAgICAgbm9kZWluZm8gKE5vZGVJbmZvLiBob3N0IChzZXQgWyhMb25nLiBwb3J0KV0pKQorICAgICAgICAgICAgICAgdGltZXN0YW1wIChTeXN0ZW0vY3VycmVudFRpbWVNaWxsaXMpCisgICAgICAgICAgICAgICByZXF1ZXN0IChQcm9maWxlUmVxdWVzdC4gbm9kZWluZm8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9maWxlQWN0aW9uL0pTVEFDS19EVU1QKV0KKyAgICAgICAgICAgKC5zZXRfdGltZV9zdGFtcCByZXF1ZXN0IHRpbWVzdGFtcCkKKyAgICAgICAgICAgKC5zZXRXb3JrZXJQcm9maWxlciBuaW1idXMgaWQgcmVxdWVzdCkKKyAgICAgICAgICAgKGpzb24tcmVzcG9uc2UgeyJzdGF0dXMiICJvayIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZCIgaG9zdC1wb3J0fQorICAgICAgICAgICAgICAgICAgICAgICAgICAobSAiY2FsbGJhY2siKSkpKSkKKworICAoR0VUICIvYXBpL3YxL3RvcG9sb2d5LzppZC9wcm9maWxpbmcvcmVzdGFydHdvcmtlci86aG9zdC1wb3J0IgorICAgICAgIFs6YXMgezprZXlzIFtzZXJ2bGV0LXJlcXVlc3RdfSBpZCBob3N0LXBvcnQgJiBtXQorICAgICAgICh0aHJpZnQvd2l0aC1jb25maWd1cmVkLW5pbWJ1cy1jb25uZWN0aW9uIG5pbWJ1cworICAgICAgICAgKGxldCBbdXNlciAoLmdldFVzZXJOYW1lIGh0dHAtY3JlZHMtaGFuZGxlciBzZXJ2bGV0LXJlcXVlc3QpCisgICAgICAgICAgICAgICB0b3BvbG9neS1jb25mIChmcm9tLWpzb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICguZ2V0VG9wb2xvZ3lDb25mIF5OaW1idXMkQ2xpZW50IG5pbWJ1cyBpZCkpXQorICAgICAgICAgICAoYXNzZXJ0LWF1dGhvcml6ZWQtdXNlciAic2V0V29ya2VyUHJvZmlsZXIiICh0b3BvbG9neS1jb25maWcgaWQpKQorICAgICAgICAgICAoYXNzZXJ0LWF1dGhvcml6ZWQtcHJvZmlsZXItYWN0aW9uICJyZXN0YXJ0d29ya2VyIikpCisgICAgICAgICAobGV0IFtbaG9zdCwgcG9ydF0gKHNwbGl0IGhvc3QtcG9ydCAjIjoiKQorICAgICAgICAgICAgICAgbm9kZWluZm8gKE5vZGVJbmZvLiBob3N0IChzZXQgWyhMb25nLiBwb3J0KV0pKQorICAgICAgICAgICAgICAgdGltZXN0YW1wIChTeXN0ZW0vY3VycmVudFRpbWVNaWxsaXMpCisgICAgICAgICAgICAgICByZXF1ZXN0IChQcm9maWxlUmVxdWVzdC4gbm9kZWluZm8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9maWxlQWN0aW9uL0pWTV9SRVNUQVJUKV0KKyAgICAgICAgICAgKC5zZXRfdGltZV9zdGFtcCByZXF1ZXN0IHRpbWVzdGFtcCkKKyAgICAgICAgICAgKC5zZXRXb3JrZXJQcm9maWxlciBuaW1idXMgaWQgcmVxdWVzdCkKKyAgICAgICAgICAgKGpzb24tcmVzcG9uc2UgeyJzdGF0dXMiICJvayIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZCIgaG9zdC1wb3J0fQorICAgICAgICAgICAgICAgICAgICAgICAgICAobSAiY2FsbGJhY2siKSkpKSkKKyAgICAgICAKKyAgKEdFVCAiL2FwaS92MS90b3BvbG9neS86aWQvcHJvZmlsaW5nL2R1bXBoZWFwLzpob3N0LXBvcnQiCisgICAgICAgWzphcyB7OmtleXMgW3NlcnZsZXQtcmVxdWVzdF19IGlkIGhvc3QtcG9ydCAmIG1dCisgICAgICAgKHRocmlmdC93aXRoLWNvbmZpZ3VyZWQtbmltYnVzLWNvbm5lY3Rpb24gbmltYnVzCisgICAgICAgICAobGV0IFt1c2VyICguZ2V0VXNlck5hbWUgaHR0cC1jcmVkcy1oYW5kbGVyIHNlcnZsZXQtcmVxdWVzdCkKKyAgICAgICAgICAgICAgIHRvcG9sb2d5LWNvbmYgKGZyb20tanNvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC5nZXRUb3BvbG9neUNvbmYgXk5pbWJ1cyRDbGllbnQgbmltYnVzIGlkKSldCisgICAgICAgICAgIChhc3NlcnQtYXV0aG9yaXplZC11c2VyICJzZXRXb3JrZXJQcm9maWxlciIgKHRvcG9sb2d5LWNvbmZpZyBpZCkpCisgICAgICAgICAgIChhc3NlcnQtYXV0aG9yaXplZC1wcm9maWxlci1hY3Rpb24gImR1bXBoZWFwIikpCisgICAgICAgICAobGV0IFtbaG9zdCwgcG9ydF0gKHNwbGl0IGhvc3QtcG9ydCAjIjoiKQorICAgICAgICAgICAgICAgbm9kZWluZm8gKE5vZGVJbmZvLiBob3N0IChzZXQgWyhMb25nLiBwb3J0KV0pKQorICAgICAgICAgICAgICAgdGltZXN0YW1wIChTeXN0ZW0vY3VycmVudFRpbWVNaWxsaXMpCisgICAgICAgICAgICAgICByZXF1ZXN0IChQcm9maWxlUmVxdWVzdC4gbm9kZWluZm8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9maWxlQWN0aW9uL0pNQVBfRFVNUCldCisgICAgICAgICAgICguc2V0X3RpbWVfc3RhbXAgcmVxdWVzdCB0aW1lc3RhbXApCisgICAgICAgICAgICguc2V0V29ya2VyUHJvZmlsZXIgbmltYnVzIGlkIHJlcXVlc3QpCisgICAgICAgICAgIChqc29uLXJlc3BvbnNlIHsic3RhdHVzIiAib2siCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiaWQiIGhvc3QtcG9ydH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgKG0gImNhbGxiYWNrIikpKSkpCisgIAogICAoR0VUICIvIiBbOmFzIHtjb29raWVzIDpjb29raWVzfV0KLSAgICAgICAocmVzcC9yZWRpcmVjdCAiL2luZGV4Lmh0bWwiKSkKKyAgICAobWFyayEgdWk6bnVtLW1haW4tcGFnZS1odHRwLXJlcXVlc3RzKQorICAgIChyZXNwL3JlZGlyZWN0ICIvaW5kZXguaHRtbCIpKQogICAocm91dGUvcmVzb3VyY2VzICIvIikKICAgKHJvdXRlL25vdC1mb3VuZCAiUGFnZSBub3QgZm91bmQiKSkKIAotKGRlZm4gZXhjZXB0aW9uLT5qc29uCi0gIFtleF0KLSAgeyJlcnJvciIgIkludGVybmFsIFNlcnZlciBFcnJvciIKLSAgICJlcnJvck1lc3NhZ2UiCi0gICAobGV0IFtzdyAoamF2YS5pby5TdHJpbmdXcml0ZXIuKV0KLSAgICAgKC5wcmludFN0YWNrVHJhY2UgZXggKGphdmEuaW8uUHJpbnRXcml0ZXIuIHN3KSkKLSAgICAgKC50b1N0cmluZyBzdykpfSkKLQogKGRlZm4gY2F0Y2gtZXJyb3JzCiAgIFtoYW5kbGVyXQogICAoZm4gW3JlcXVlc3RdCkBAIC0xMTYzLDYgKzEyNDMsNyBAQAogICAgICAgICAgICAgICAgICAgICAod3JhcC1qc29uLXBhcmFtcykKICAgICAgICAgICAgICAgICAgICAgKHdyYXAtbXVsdGlwYXJ0LXBhcmFtcykKICAgICAgICAgICAgICAgICAgICAgKHdyYXAtcmVsb2FkICdbYmFja3R5cGUuc3Rvcm0udWkuY29yZV0pCisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RzLW1pZGRsZXdhcmUKICAgICAgICAgICAgICAgICAgICAgY2F0Y2gtZXJyb3JzKSkpCiAKIChkZWZuIHN0YXJ0LXNlcnZlciEKQEAgLTExODIsNiArMTI2Myw3IEBACiAgICAgICAgICAgaHR0cHMtdHMtdHlwZSAoY29uZiBVSS1IVFRQUy1UUlVTVFNUT1JFLVRZUEUpCiAgICAgICAgICAgaHR0cHMtd2FudC1jbGllbnQtYXV0aCAoY29uZiBVSS1IVFRQUy1XQU5ULUNMSUVOVC1BVVRIKQogICAgICAgICAgIGh0dHBzLW5lZWQtY2xpZW50LWF1dGggKGNvbmYgVUktSFRUUFMtTkVFRC1DTElFTlQtQVVUSCldCisgICAgICAoc3RhcnQtbWV0cmljcy1yZXBvcnRlcnMpCiAgICAgICAoc3Rvcm0tcnVuLWpldHR5IHs6cG9ydCAoY29uZiBVSS1QT1JUKQogICAgICAgICAgICAgICAgICAgICAgICAgOmhvc3QgKGNvbmYgVUktSE9TVCkKICAgICAgICAgICAgICAgICAgICAgICAgIDpodHRwcy1wb3J0IGh0dHBzLXBvcnQKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2Nsai9iYWNrdHlwZS9zdG9ybS91aS9oZWxwZXJzLmNsaiBiL3N0b3JtLWNvcmUvc3JjL2Nsai9iYWNrdHlwZS9zdG9ybS91aS9oZWxwZXJzLmNsagppbmRleCA0N2U4NDZmLi5lMGRiNWM4IDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9jbGovYmFja3R5cGUvc3Rvcm0vdWkvaGVscGVycy5jbGoKKysrIGIvc3Rvcm0tY29yZS9zcmMvY2xqL2JhY2t0eXBlL3N0b3JtL3VpL2hlbHBlcnMuY2xqCkBAIC0yMCw5ICsyMCwxMCBAQAogICAgICAgICAgW3N0cmluZyA6b25seSBbYmxhbms/IGpvaW5dXQogICAgICAgICAgW3dhbGsgOm9ubHkgW2tleXdvcmRpemUta2V5c11dXSkKICAgKDp1c2UgW2JhY2t0eXBlLnN0b3JtIGNvbmZpZyBsb2ddKQotICAoOnVzZSBbYmFja3R5cGUuc3Rvcm0udXRpbCA6b25seSBbY2xvanVyaWZ5LXN0cnVjdHVyZSB1dWlkIGRlZm5rIHVybC1lbmNvZGUgbm90LW5pbD9dXSkKKyAgKDp1c2UgW2JhY2t0eXBlLnN0b3JtLnV0aWwgOm9ubHkgW2Nsb2p1cmlmeS1zdHJ1Y3R1cmUgdXVpZCBkZWZuayB0by1qc29uIHVybC1lbmNvZGUgbm90LW5pbD9dXSkKICAgKDp1c2UgW2Nsai10aW1lIGNvZXJjZSBmb3JtYXRdKQogICAoOmltcG9ydCBbYmFja3R5cGUuc3Rvcm0uZ2VuZXJhdGVkIEV4ZWN1dG9ySW5mbyBFeGVjdXRvclN1bW1hcnldKQorICAoOmltcG9ydCBbYmFja3R5cGUuc3Rvcm0ubG9nZ2luZy5maWx0ZXJzIEFjY2Vzc0xvZ2dpbmdGaWx0ZXJdKQogICAoOmltcG9ydCBbamF2YS51dGlsIEVudW1TZXRdKQogICAoOmltcG9ydCBbb3JnLmVjbGlwc2UuamV0dHkuc2VydmVyIFNlcnZlcl0KICAgICAgICAgICAgW29yZy5lY2xpcHNlLmpldHR5LnNlcnZlci5uaW8gU2VsZWN0Q2hhbm5lbENvbm5lY3Rvcl0KQEAgLTMzLDcgKzM0LDE2IEBACiAgICAgICAgICAgIFtvcmcuZWNsaXBzZS5qZXR0eS5zZXJ2bGV0cyBDcm9zc09yaWdpbkZpbHRlcl0pCiAgICg6cmVxdWlyZSBbcmluZy51dGlsIHNlcnZsZXRdKQogICAoOnJlcXVpcmUgW2NvbXBvanVyZS5yb3V0ZSA6YXMgcm91dGVdCi0gICAgICAgICAgICBbY29tcG9qdXJlLmhhbmRsZXIgOmFzIGhhbmRsZXJdKSkKKyAgICAgICAgICAgIFtjb21wb2p1cmUuaGFuZGxlciA6YXMgaGFuZGxlcl0pCisgICg6cmVxdWlyZSBbbWV0cmljcy5tZXRlcnMgOnJlZmVyIFtkZWZtZXRlciBtYXJrIV1dKSkKKworKGRlZm1ldGVyIG51bS13ZWItcmVxdWVzdHMpCisoZGVmbiByZXF1ZXN0cy1taWRkbGV3YXJlCisgICJDb2RhIEhhbGUgbWV0cmljIGZvciBjb3VudGluZyB0aGUgbnVtYmVyIG9mIHdlYiByZXF1ZXN0cy4iCisgIFtoYW5kbGVyXQorICAoZm4gW3JlcV0KKyAgICAobWFyayEgbnVtLXdlYi1yZXF1ZXN0cykKKyAgICAoaGFuZGxlciByZXEpKSkKIAogKGRlZm4gc3BsaXQtZGl2aWRlIFt2YWwgZGl2aWRlcl0KICAgWyhJbnRlZ2VyLiAoaW50ICgvIHZhbCBkaXZpZGVyKSkpIChtb2QgdmFsIGRpdmlkZXIpXQpAQCAtOTYsNDMgKzEwNiwxOCBAQAogICAgICAgKV0KICAgIF0pCiAKLShkZWZuIGZsb2F0LXN0ciBbbl0KLSAgKGlmIG4KLSAgICAoZm9ybWF0ICIlLjNmIiAoZmxvYXQgbikpCi0gICAgIjAiCi0gICAgKSkKLQotKGRlZm4gc3dhcC1tYXAtb3JkZXIgW21dCi0gICgtPj4gbQotICAgICAgIChtYXAgKGZuIFtbayB2XV0KLSAgICAgICAgICAgICAgKGludG8KLSAgICAgICAgICAgICAgIHt9Ci0gICAgICAgICAgICAgICAoZm9yIFtbazIgdjJdIHZdCi0gICAgICAgICAgICAgICAgIFtrMiB7ayB2Mn1dCi0gICAgICAgICAgICAgICAgICkpCi0gICAgICAgICAgICAgICkpCi0gICAgICAgKGFwcGx5IG1lcmdlLXdpdGggbWVyZ2UpCi0gICAgICAgKSkKLQogKGRlZm4gdXJsLWZvcm1hdCBbZm10ICYgYXJnc10KICAgKFN0cmluZy9mb3JtYXQgZm10CiAgICAgKHRvLWFycmF5IChtYXAgIyh1cmwtZW5jb2RlIChzdHIgJSkpIGFyZ3MpKSkpCiAKLShkZWZuIHRvLXRhc2tzIFteRXhlY3V0b3JJbmZvIGVdCi0gIChsZXQgW3N0YXJ0ICguZ2V0X3Rhc2tfc3RhcnQgZSkKLSAgICAgICAgZW5kICguZ2V0X3Rhc2tfZW5kIGUpXQotICAgIChyYW5nZSBzdGFydCAoaW5jIGVuZCkpCi0gICAgKSkKLQotKGRlZm4gc3VtLXRhc2tzIFtleGVjdXRvcnNdCi0gIChyZWR1Y2UgKyAoLT4+IGV4ZWN1dG9ycwotICAgICAgICAgICAgICAgICAobWFwICMoLmdldF9leGVjdXRvcl9pbmZvIF5FeGVjdXRvclN1bW1hcnkgJSkpCi0gICAgICAgICAgICAgICAgIChtYXAgdG8tdGFza3MpCi0gICAgICAgICAgICAgICAgIChtYXAgY291bnQpKSkpCi0KIChkZWZuIHByZXR0eS1leGVjdXRvci1pbmZvIFteRXhlY3V0b3JJbmZvIGVdCiAgIChzdHIgIlsiICguZ2V0X3Rhc2tfc3RhcnQgZSkgIi0iICguZ2V0X3Rhc2tfZW5kIGUpICJdIikpCiAKKyhkZWZuIHVuYXV0aG9yaXplZC11c2VyLWpzb24KKyAgW3VzZXJdCisgIHsiZXJyb3IiICJObyBBdXRob3JpemF0aW9uIgorICAgImVycm9yTWVzc2FnZSIgKHN0ciAiVXNlciAiIHVzZXIgIiBpcyBub3QgYXV0aG9yaXplZC4iKX0pCisKIChkZWZuIHVuYXV0aG9yaXplZC11c2VyLWh0bWwgW3VzZXJdCiAgIFtbOmgyICJVc2VyICciIChlc2NhcGUtaHRtbCB1c2VyKSAiJyBpcyBub3QgYXV0aG9yaXplZC4iXV0pCiAKQEAgLTE3Myw2ICsxNTgsOSBAQAogICAgICguc2V0SW5pdFBhcmFtZXRlciBDcm9zc09yaWdpbkZpbHRlci9BQ0NFU1NfQ09OVFJPTF9BTExPV19PUklHSU5fSEVBREVSICIqIikKICAgICApKQogCisoZGVmbiBtay1hY2Nlc3MtbG9nZ2luZy1maWx0ZXItaGFuZGxlciBbXQorICAob3JnLmVjbGlwc2UuamV0dHkuc2VydmxldC5GaWx0ZXJIb2xkZXIuIChBY2Nlc3NMb2dnaW5nRmlsdGVyLikpKQorCiAoZGVmbiBjb25maWctZmlsdGVyIFtzZXJ2ZXIgaGFuZGxlciBmaWx0ZXJzLWNvbmZzXQogICAoaWYgZmlsdGVycy1jb25mcwogICAgIChsZXQgW3NlcnZsZXQtaG9sZGVyIChTZXJ2bGV0SG9sZGVyLgpAQCAtMTg3LDYgKzE3NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICguc2V0TmFtZSAob3IgZmlsdGVyLW5hbWUgZmlsdGVyLWNsYXNzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC5zZXRJbml0UGFyYW1ldGVycyAob3IgZmlsdGVyLXBhcmFtcyB7fSkpKV0KICAgICAgICAgICAgICguYWRkRmlsdGVyIGNvbnRleHQgZmlsdGVyLWhvbGRlciAiLyoiIEZpbHRlck1hcHBpbmcvQUxMKSkpKQorICAgICAgKC5hZGRGaWx0ZXIgY29udGV4dCAobWstYWNjZXNzLWxvZ2dpbmctZmlsdGVyLWhhbmRsZXIpICIvKiIgKEVudW1TZXQvYWxsT2YgRGlzcGF0Y2hlclR5cGUpKQogICAgICAgKC5zZXRIYW5kbGVyIHNlcnZlciBjb250ZXh0KSkpKQogCiAoZGVmbiByaW5nLXJlc3BvbnNlLWZyb20tZXhjZXB0aW9uIFtleF0KQEAgLTIyNSwzICsyMTQsMjcgQEAKICAgICAgICAgY29uZmlndXJhdG9yICg6Y29uZmlndXJhdG9yIGNvbmZpZyldCiAgICAgKGNvbmZpZ3VyYXRvciBzKQogICAgICguc3RhcnQgcykpKQorCisoZGVmbiB3cmFwLWpzb24taW4tY2FsbGJhY2sgW2NhbGxiYWNrIHJlc3BvbnNlXQorICAoc3RyIGNhbGxiYWNrICIoIiByZXNwb25zZSAiKTsiKSkKKworKGRlZm5rIGpzb24tcmVzcG9uc2UKKyAgW2RhdGEgY2FsbGJhY2sgOnNlcmlhbGl6ZS1mbiB0by1qc29uIDpzdGF0dXMgMjAwIDpoZWFkZXJzIHt9XQorICB7OnN0YXR1cyBzdGF0dXMKKyAgIDpoZWFkZXJzIChtZXJnZSB7IkNhY2hlLUNvbnRyb2wiICJuby1jYWNoZSwgbm8tc3RvcmUiCisgICAgICAgICAgICAgICAgICAgICJBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW4iICIqIgorICAgICAgICAgICAgICAgICAgICAiQWNjZXNzLUNvbnRyb2wtQWxsb3ctSGVhZGVycyIgIkNvbnRlbnQtVHlwZSwgQWNjZXNzLUNvbnRyb2wtQWxsb3ctSGVhZGVycywgQWNjZXNzLUNvbnRyb2xlci1BbGxvdy1PcmlnaW4sIFgtUmVxdWVzdGVkLUJ5LCBYLUNzcmYtVG9rZW4sIEF1dGhvcml6YXRpb24sIFgtUmVxdWVzdGVkLVdpdGgifQorICAgICAgICAgICAgICAoaWYgKG5vdC1uaWw/IGNhbGxiYWNrKSB7IkNvbnRlbnQtVHlwZSIgImFwcGxpY2F0aW9uL2phdmFzY3JpcHQ7Y2hhcnNldD11dGYtOCJ9CisgICAgICAgICAgICAgICAgeyJDb250ZW50LVR5cGUiICJhcHBsaWNhdGlvbi9qc29uO2NoYXJzZXQ9dXRmLTgifSkKKyAgICAgICAgICAgICAgaGVhZGVycykKKyAgIDpib2R5IChpZiAobm90LW5pbD8gY2FsbGJhY2spCisgICAgICAgICAgICh3cmFwLWpzb24taW4tY2FsbGJhY2sgY2FsbGJhY2sgKHNlcmlhbGl6ZS1mbiBkYXRhKSkKKyAgICAgICAgICAgKHNlcmlhbGl6ZS1mbiBkYXRhKSl9KQorCisoZGVmbiBleGNlcHRpb24tPmpzb24KKyAgW2V4XQorICB7ImVycm9yIiAiSW50ZXJuYWwgU2VydmVyIEVycm9yIgorICAgImVycm9yTWVzc2FnZSIKKyAgIChsZXQgW3N3IChqYXZhLmlvLlN0cmluZ1dyaXRlci4pXQorICAgICAoLnByaW50U3RhY2tUcmFjZSBleCAoamF2YS5pby5QcmludFdyaXRlci4gc3cpKQorICAgICAoLnRvU3RyaW5nIHN3KSl9KQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvY2xqL2JhY2t0eXBlL3N0b3JtL3V0aWwuY2xqIGIvc3Rvcm0tY29yZS9zcmMvY2xqL2JhY2t0eXBlL3N0b3JtL3V0aWwuY2xqCmluZGV4IGMwZjI2NmEuLjliMjJlNzAgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2Nsai9iYWNrdHlwZS9zdG9ybS91dGlsLmNsagorKysgYi9zdG9ybS1jb3JlL3NyYy9jbGovYmFja3R5cGUvc3Rvcm0vdXRpbC5jbGoKQEAgLTI2LDExICsyNiwxNCBAQAogICAoOmltcG9ydCBbamF2YS51dGlsLnppcCBaaXBGaWxlXSkKICAgKDppbXBvcnQgW2phdmEudXRpbC5jb25jdXJyZW50LmxvY2tzIFJlZW50cmFudFJlYWRXcml0ZUxvY2tdKQogICAoOmltcG9ydCBbamF2YS51dGlsLmNvbmN1cnJlbnQgU2VtYXBob3JlXSkKKyAgKDppbXBvcnQgW2phdmEubmlvLmZpbGUgRmlsZXMgUGF0aHNdKQorICAoOmltcG9ydCBbamF2YS5uaW8uZmlsZS5hdHRyaWJ1dGUgRmlsZUF0dHJpYnV0ZV0pCiAgICg6aW1wb3J0IFtqYXZhLmlvIEZpbGUgRmlsZU91dHB1dFN0cmVhbSBSYW5kb21BY2Nlc3NGaWxlIFN0cmluZ1dyaXRlcgogICAgICAgICAgICAgUHJpbnRXcml0ZXIgQnVmZmVyZWRSZWFkZXIgSW5wdXRTdHJlYW1SZWFkZXIgSU9FeGNlcHRpb25dKQogICAoOmltcG9ydCBbamF2YS5sYW5nLm1hbmFnZW1lbnQgTWFuYWdlbWVudEZhY3RvcnldKQogICAoOmltcG9ydCBbb3JnLmFwYWNoZS5jb21tb25zLmV4ZWMgRGVmYXVsdEV4ZWN1dG9yIENvbW1hbmRMaW5lXSkKICAgKDppbXBvcnQgW29yZy5hcGFjaGUuY29tbW9ucy5pbyBGaWxlVXRpbHNdKQorICAoOmltcG9ydCBbYmFja3R5cGUuc3Rvcm0ubG9nZ2luZyBUaHJpZnRBY2Nlc3NMb2dnZXJdKQogICAoOmltcG9ydCBbb3JnLmFwYWNoZS5jb21tb25zLmV4ZWMgRXhlY3V0ZUV4Y2VwdGlvbl0pCiAgICg6aW1wb3J0IFtvcmcuanNvbi5zaW1wbGUgSlNPTlZhbHVlXSkKICAgKDppbXBvcnQgW29yZy55YW1sLnNuYWtleWFtbCBZYW1sXQpAQCAtNTE0LDE4ICs1MTcsMjUgQEAKICAgICAobWFwICMoc3RyIFwnIChjbG9qdXJlLnN0cmluZy9lc2NhcGUgJSB7XCcgIidcIidcIicifSkgXCcpKQogICAgICAgKGNsb2p1cmUuc3RyaW5nL2pvaW4gIiAiKSkpCiAKKyhkZWZuIHNjcmlwdC1maWxlLXBhdGggW2Rpcl0KKyAgKHN0ciBkaXIgZmlsZS1wYXRoLXNlcGFyYXRvciAic3Rvcm0td29ya2VyLXNjcmlwdC5zaCIpKQorCisoZGVmbiBjb250YWluZXItZmlsZS1wYXRoIFtkaXJdCisgIChzdHIgZGlyIGZpbGUtcGF0aC1zZXBhcmF0b3IgImxhdW5jaF9jb250YWluZXIuc2giKSkKKwogKGRlZm5rIHdyaXRlLXNjcmlwdAogICBbZGlyIGNvbW1hbmQgOmVudmlyb25tZW50IHt9XQogICAobGV0IFtzY3JpcHQtc3JjIChzdHIgIiMhL2Jpbi9iYXNoXG4iIChjbG9qdXJlLnN0cmluZy9qb2luICIiIChtYXAgKGZuIFtbayB2XV0gKHN0ciAoc2hlbGwtY21kIFsiZXhwb3J0IiAoc3RyIGsgIj0iIHYpXSkgIjtcbiIpKSBlbnZpcm9ubWVudCkpICJcbmV4ZWMgIiAoc2hlbGwtY21kIGNvbW1hbmQpICI7IikKLSAgICAgICAgc2NyaXB0LXBhdGggKHN0ciBkaXIgIi9zdG9ybS13b3JrZXItc2NyaXB0LnNoIikKLSAgICAgICAgLSAoc3BpdCBzY3JpcHQtcGF0aCBzY3JpcHQtc3JjKV0KKyAgICAgICAgc2NyaXB0LXBhdGggKHNjcmlwdC1maWxlLXBhdGggZGlyKQorICAgICAgICBfIChzcGl0IHNjcmlwdC1wYXRoIHNjcmlwdC1zcmMpXQogICAgIHNjcmlwdC1wYXRoCiAgICkpCiAKIChkZWZuayBsYXVuY2gtcHJvY2VzcwotICBbY29tbWFuZCA6ZW52aXJvbm1lbnQge30gOmxvZy1wcmVmaXggbmlsIDpleGl0LWNvZGUtY2FsbGJhY2sgbmlsXQorICBbY29tbWFuZCA6ZW52aXJvbm1lbnQge30gOmxvZy1wcmVmaXggbmlsIDpleGl0LWNvZGUtY2FsbGJhY2sgbmlsIDpkaXJlY3RvcnkgbmlsXQogICAobGV0IFtidWlsZGVyIChQcm9jZXNzQnVpbGRlci4gY29tbWFuZCkKICAgICAgICAgcHJvY2Vzcy1lbnYgKC5lbnZpcm9ubWVudCBidWlsZGVyKV0KKyAgICAod2hlbiBkaXJlY3RvcnkgKC5kaXJlY3RvcnkgYnVpbGRlciBkaXJlY3RvcnkpKQogICAgICgucmVkaXJlY3RFcnJvclN0cmVhbSBidWlsZGVyIHRydWUpCiAgICAgKGRvc2VxIFtbayB2XSBlbnZpcm9ubWVudF0KICAgICAgICgucHV0IHByb2Nlc3MtZW52IGsgdikpCkBAIC01NzgsNiArNTg4LDIxIEBACiAgICAgKHdoZW4tbm90IHN1Y2Nlc3M/CiAgICAgICAodGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24uIChzdHIgIkZhaWxlZCB0byB0b3VjaCAiIHBhdGgpKSkpKSkKIAorKGRlZm4gY3JlYXRlLXN5bWxpbmshCisgICJDcmVhdGUgc3ltbGluayBpcyB0byB0aGUgdGFyZ2V0IgorICAoW3BhdGgtZGlyIHRhcmdldC1kaXIgZmlsZS1uYW1lXQorICAgIChjcmVhdGUtc3ltbGluayEgcGF0aC1kaXIgdGFyZ2V0LWRpciBmaWxlLW5hbWUgZmlsZS1uYW1lKSkKKyAgKFtwYXRoLWRpciB0YXJnZXQtZGlyIGZyb20tZmlsZS1uYW1lIHRvLWZpbGUtbmFtZV0KKyAgICAobGV0IFtwYXRoIChzdHIgcGF0aC1kaXIgZmlsZS1wYXRoLXNlcGFyYXRvciBmcm9tLWZpbGUtbmFtZSkKKyAgICAgICAgICB0YXJnZXQgKHN0ciB0YXJnZXQtZGlyIGZpbGUtcGF0aC1zZXBhcmF0b3IgdG8tZmlsZS1uYW1lKQorICAgICAgICAgIGVtcHR5LWFycmF5IChtYWtlLWFycmF5IFN0cmluZyAwKQorICAgICAgICAgIGF0dHJzIChtYWtlLWFycmF5IEZpbGVBdHRyaWJ1dGUgMCkKKyAgICAgICAgICBhYnMtcGF0aCAoLnRvQWJzb2x1dGVQYXRoIChQYXRocy9nZXQgcGF0aCBlbXB0eS1hcnJheSkpCisgICAgICAgICAgYWJzLXRhcmdldCAoLnRvQWJzb2x1dGVQYXRoIChQYXRocy9nZXQgdGFyZ2V0IGVtcHR5LWFycmF5KSldCisgICAgICAobG9nLWRlYnVnICJDcmVhdGluZyBzeW1saW5rIFsiIGFicy1wYXRoICJdIHRvIFsiIGFicy10YXJnZXQgIl0iKQorICAgICAgKGlmIChub3QgKC5leGlzdHMgKC50b0ZpbGUgYWJzLXBhdGgpKSkKKyAgICAgICAgKEZpbGVzL2NyZWF0ZVN5bWJvbGljTGluayBhYnMtcGF0aCBhYnMtdGFyZ2V0IGF0dHJzKSkpKSkKKwogKGRlZm4gcmVhZC1kaXItY29udGVudHMKICAgW2Rpcl0KICAgKGlmIChleGlzdHMtZmlsZT8gZGlyKQpAQCAtNzU1LDEwICs3ODAsNiBAQAogICAgICAgICAgIHJlc3QtZWxlbXMgKGFwcGx5IGludGVybGVhdmUtYWxsIChtYXAgcmVzdCBjb2xscykpXQogICAgICAgKGNvbmNhdCBteS1lbGVtcyByZXN0LWVsZW1zKSkpKQogCi0oZGVmbiB1cGRhdGUKLSAgW20gayBhZm5dCi0gIChhc3NvYyBtIGsgKGFmbiAoZ2V0IG0gaykpKSkKLQogKGRlZm4gYW55LWludGVyc2VjdGlvbgogICBbJiBzZXRzXQogICAobGV0IFtlbGVtLT5jb3VudCAobXVsdGktc2V0IChhcHBseSBjb25jYXQgc2V0cykpXQpAQCAtMTAxOCwzMCArMTAzOSwxOSBAQAogICAoW3ggZm9ybSAmIG1vcmVdIGAoLTw+ICgtPD4gfnggfmZvcm0pIH5AbW9yZSkpKQogCiAoZGVmIExPRy1ESVIKLSAgKC5nZXRDYW5vbmljYWxQYXRoIAotICAgICAgICAgICAgICAgIChjbG9qdXJlLmphdmEuaW8vZmlsZSAoU3lzdGVtL2dldFByb3BlcnR5ICJzdG9ybS5ob21lIikgImxvZ3MiKSkpCisgICguZ2V0Q2Fub25pY2FsUGF0aAorICAgIChjbG9qdXJlLmphdmEuaW8vZmlsZSAob3IgKFN5c3RlbS9nZXRQcm9wZXJ0eSAic3Rvcm0ubG9nLmRpciIpIChzdHIgKFN5c3RlbS9nZXRQcm9wZXJ0eSAic3Rvcm0uaG9tZSIpICJsb2dzIikpKSkpCiAKLShkZWZuLSBsb2dzLXJvb3RuYW1lCi0gIChbc3Rvcm0taWQgcG9ydF0gKGxvZ3Mtcm9vdG5hbWUgc3Rvcm0taWQgcG9ydCAiLXdvcmtlci0iKSkKLSAgKFtzdG9ybS1pZCBwb3J0IHR5cGVdIChzdHIgc3Rvcm0taWQgdHlwZSBwb3J0KSkpCiAKIChkZWZuIGxvZ3MtZmlsZW5hbWUKLSAgKFtzdG9ybS1pZCBwb3J0XSAoc3RyIChsb2dzLXJvb3RuYW1lIHN0b3JtLWlkIHBvcnQpICIubG9nIikpCi0gIChbc3Rvcm0taWQgcG9ydCB0eXBlXSAoc3RyIChsb2dzLXJvb3RuYW1lIHN0b3JtLWlkIHBvcnQgdHlwZSkgIi5sb2ciKSkpCisgIFtzdG9ybS1pZCBwb3J0XQorICAoc3RyIHN0b3JtLWlkIGZpbGUtcGF0aC1zZXBhcmF0b3IgcG9ydCBmaWxlLXBhdGgtc2VwYXJhdG9yICJ3b3JrZXIubG9nIikpCiAKLShkZWZuIGV2ZW50LWxvZ3MtZmlsZW5hbWUgW3N0b3JtLWlkIHBvcnRdIChsb2dzLWZpbGVuYW1lIHN0b3JtLWlkIHBvcnQgIi1ldmVudHMtIikpCisoZGVmIHdvcmtlci1sb2ctZmlsZW5hbWUtcGF0dGVybiAjIl53b3JrZXIubG9nKC4qKSIpCiAKLShkZWZuIGxvZ3MtbWV0YWRhdGEtZmlsZW5hbWUgW3N0b3JtLWlkIHBvcnRdCi0gIChzdHIgKGxvZ3Mtcm9vdG5hbWUgc3Rvcm0taWQgcG9ydCkgIi55YW1sIikpCi0KLShkZWYgd29ya2VyLWxvZy1maWxlbmFtZS1wYXR0ZXJuICMiXigoLiotXGQrLVxkKyktd29ya2VyLShcZCspKVwubG9nIikKLQotKGRlZm4gZ2V0LWxvZy1tZXRhZGF0YS1maWxlCi0gIChbZm5hbWVdCi0gICAgKGlmLWxldCBbW18gXyBpZCBwb3J0XSAocmUtbWF0Y2hlcyB3b3JrZXItbG9nLWZpbGVuYW1lLXBhdHRlcm4gZm5hbWUpXQotICAgICAgKGdldC1sb2ctbWV0YWRhdGEtZmlsZSBpZCBwb3J0KSkpCi0gIChbaWQgcG9ydF0KLSAgICAoY2xvanVyZS5qYXZhLmlvL2ZpbGUgTE9HLURJUiAibWV0YWRhdGEiIChsb2dzLW1ldGFkYXRhLWZpbGVuYW1lIGlkIHBvcnQpKSkpCisoZGVmbiBldmVudC1sb2dzLWZpbGVuYW1lCisgIFtzdG9ybS1pZCBwb3J0XQorICAoc3RyIHN0b3JtLWlkIGZpbGUtcGF0aC1zZXBhcmF0b3IgcG9ydCBmaWxlLXBhdGgtc2VwYXJhdG9yICJldmVudHMubG9nIikpCiAKIChkZWZuIGNsb2p1cmUtZnJvbS15YW1sLWZpbGUgW3lhbWxGaWxlXQogICAodHJ5CkBAIC0xMDUzLDYgKzEwNjMsMjIgQEAKIChkZWZuIGhhc2htYXAtdG8tcGVyc2lzdGVudCBbXkhhc2hNYXAgbV0KICAgKHppcG1hcCAoLmtleVNldCBtKSAoLnZhbHVlcyBtKSkpCiAKKyhkZWZuIHJldHJ5LW9uLWV4Y2VwdGlvbgorICAiUmV0cmllcyBzcGVjaWZpYyBmdW5jdGlvbiBvbiBleGNlcHRpb24gYmFzZWQgb24gcmV0cmllcyBjb3VudCIKKyAgW3JldHJpZXMgdGFzay1kZXNjcmlwdGlvbiBmICYgYXJnc10KKyAgKGxldCBbcmVzICh0cnkgezp2YWx1ZSAoYXBwbHkgZiBhcmdzKX0KKyAgICAgICAgICAgICAgKGNhdGNoIEV4Y2VwdGlvbiBlCisgICAgICAgICAgICAgICAgKGlmICg8PSAwIHJldHJpZXMpCisgICAgICAgICAgICAgICAgICAodGhyb3cgZSkKKyAgICAgICAgICAgICAgICAgIHs6ZXhjZXB0aW9uIGV9KSkpXQorICAgIChpZiAoOmV4Y2VwdGlvbiByZXMpCisgICAgICAoZG8gCisgICAgICAgIChsb2ctZXJyb3IgKDpleGNlcHRpb24gcmVzKSAoc3RyICJGYWlsZWQgdG8gIiB0YXNrLWRlc2NyaXB0aW9uICIuIFdpbGwgbWFrZSBbIiByZXRyaWVzICJdIG1vcmUgYXR0ZW1wdHMuIikpCisgICAgICAgIChyZWN1ciAoZGVjIHJldHJpZXMpIHRhc2stZGVzY3JpcHRpb24gZiBhcmdzKSkKKyAgICAgIChkbyAKKyAgICAgICAgKGxvZy1kZWJ1ZyAoc3RyICJTdWNjZXNzZnVsICIgdGFzay1kZXNjcmlwdGlvbiAiLiIpKQorICAgICAgICAoOnZhbHVlIHJlcykpKSkpCisKIChkZWZuIHNldHVwLWRlZmF1bHQtdW5jYXVnaHQtZXhjZXB0aW9uLWhhbmRsZXIKICAgIlNldCBhIGRlZmF1bHQgdW5jYXVnaHQgZXhjZXB0aW9uIGhhbmRsZXIgdG8gaGFuZGxlIGV4Y2VwdGlvbnMgbm90IGNhdWdodCBpbiBvdGhlciB0aHJlYWRzLiIKICAgW10KQEAgLTEwNzMsMyArMTA5OSw3IEBACiAgICAgKGFzc29jIGNvbGwgayAoYXBwbHkgc3RyIChyZXBlYXQgKGNvdW50IChjb2xsIGspKSAiIyIpKSkKICAgICBjb2xsKSkKIAorKGRlZm4gbG9nLXRocmlmdC1hY2Nlc3MgW3JlcXVlc3QtaWQgcmVtb3RlQWRkcmVzcyBwcmluY2lwYWwgb3BlcmF0aW9uXQorICAoZG90bworICAgIChUaHJpZnRBY2Nlc3NMb2dnZXIuKQorICAgICgubG9nIChzdHIgIlJlcXVlc3QgSUQ6ICIgcmVxdWVzdC1pZCAiIGFjY2VzcyBmcm9tOiAiIHJlbW90ZUFkZHJlc3MgIiBwcmluY2lwYWw6ICIgcHJpbmNpcGFsICIgb3BlcmF0aW9uOiAiIG9wZXJhdGlvbikpKSkKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2Nsai9vcmcvYXBhY2hlL3N0b3JtL3BhY2VtYWtlci9wYWNlbWFrZXIuY2xqIGIvc3Rvcm0tY29yZS9zcmMvY2xqL29yZy9hcGFjaGUvc3Rvcm0vcGFjZW1ha2VyL3BhY2VtYWtlci5jbGoKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg4ZjZhYQotLS0gL2Rldi9udWxsCisrKyBiL3N0b3JtLWNvcmUvc3JjL2Nsai9vcmcvYXBhY2hlL3N0b3JtL3BhY2VtYWtlci9wYWNlbWFrZXIuY2xqCkBAIC0wLDAgKzEsMjM3IEBACis7OyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCis7OyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKzs7IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCis7OyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCis7OyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCis7OyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCis7OyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Cis7OworOzsgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCis7OworOzsgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorOzsgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKzs7IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorOzsgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorOzsgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyhucyBvcmcuYXBhY2hlLnN0b3JtLnBhY2VtYWtlci5wYWNlbWFrZXIKKyAgKDppbXBvcnQgW29yZy5hcGFjaGUuc3Rvcm0ucGFjZW1ha2VyIFBhY2VtYWtlclNlcnZlciBJU2VydmVyTWVzc2FnZUhhbmRsZXJdCisgICAgICAgICAgIFtqYXZhLnV0aWwuY29uY3VycmVudCBDb25jdXJyZW50SGFzaE1hcF0KKyAgICAgICAgICAgW2phdmEudXRpbC5jb25jdXJyZW50LmF0b21pYyBBdG9taWNJbnRlZ2VyXQorICAgICAgICAgICBbYmFja3R5cGUuc3Rvcm0uZ2VuZXJhdGVkIEhCTm9kZXMKKyAgICAgICAgICAgIEhCU2VydmVyTWVzc2FnZVR5cGUgSEJNZXNzYWdlIEhCTWVzc2FnZURhdGEgSEJQdWxzZV0pCisgICg6dXNlIFtjbG9qdXJlLnN0cmluZyA6b25seSBbcmVwbGFjZS1maXJzdCBzcGxpdF1dCisgICAgICAgIFtiYWNrdHlwZS5zdG9ybSBsb2cgY29uZmlnIHV0aWxdKQorICAoOnJlcXVpcmUgW2Nsb2p1cmUuamF2YS5qbXggOmFzIGpteF0pCisgICg6Z2VuLWNsYXNzKSkKKworCis7OyBTdGF0cyBGdW5jdGlvbnMKKworKGRlZiBzbGVlcC1zZWNvbmRzIDYwKQorCisKKyhkZWZuLSBjaGVjay1hbmQtc2V0LWxvb3AgW3N0YXRzIGtleSBuZXcgJiB7OmtleXMgW2NvbXBhcmUgbmV3LWZuXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6b3Ige2NvbXBhcmUgKGZuIFtuZXcgb2xkXSB0cnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldy1mbiAoZm4gW25ldyBvbGRdIG5ldyl9fV0KKyAgKGxvb3AgW10KKyAgICAobGV0IFtvbGQgKC5nZXQgKGtleSBzdGF0cykpCisgICAgICAgICAgbmV3IChuZXctZm4gbmV3IG9sZCldCisgICAgICAoaWYgKGNvbXBhcmUgbmV3IG9sZCkKKyAgICAgICAgKGlmICguY29tcGFyZUFuZFNldCAoa2V5IHN0YXRzKSBvbGQgbmV3KQorICAgICAgICAgIG5pbAorICAgICAgICAgIChyZWN1cikpCisgICAgICAgIG5pbCkpKSkKKworKGRlZm4tIHNldC1hdmVyYWdlIFtzdGF0cyBzaXplXQorICAoY2hlY2stYW5kLXNldC1sb29wCisgICBzdGF0cworICAgOmF2ZXJhZ2UtaGVhcnRiZWF0LXNpemUKKyAgIHNpemUKKyAgIDpuZXctZm4gKGZuIFtuZXcgb2xkXQorICAgICAgICAgICAgKGxldCBbY291bnQgKC5nZXQgKDpzZW5kLXB1bHNlLWNvdW50IHN0YXRzKSldCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBXZWlnaHRlZCBhdmVyYWdlCisgICAgICAgICAgICAgICgvICgrIG5ldyAoKiBjb3VudCBvbGQpKSAoKyBjb3VudCAxKSkpKSkpCisKKyhkZWZuLSBzZXQtbGFyZ2VzdCBbc3RhdHMgc2l6ZV0KKyAgKGNoZWNrLWFuZC1zZXQtbG9vcAorICAgc3RhdHMKKyAgIDpsYXJnZXN0LWhlYXJ0YmVhdC1zaXplCisgICBzaXplCisgICA6Y29tcGFyZSAjJz4pKQorCisoZGVmbi0gcmVwb3J0LXN0YXRzIFtoZWFydGJlYXRzIHN0YXRzIGxhc3QtZml2ZS1zXQorICAobG9vcCBbXQorICAgIChsZXQgW3NlbmQtY291bnQgKC5nZXRBbmRTZXQgKDpzZW5kLXB1bHNlLWNvdW50IHN0YXRzKSAwKQorICAgICAgICAgIHJlY2VpdmVkLXNpemUgKC5nZXRBbmRTZXQgKDp0b3RhbC1yZWNlaXZlZC1zaXplIHN0YXRzKSAwKQorICAgICAgICAgIGdldC1jb3VudCAoLmdldEFuZFNldCAoOmdldC1wdWxzZS1jb3VudCBzdGF0cykgMCkKKyAgICAgICAgICBzZW50LXNpemUgKC5nZXRBbmRTZXQgKDp0b3RhbC1zZW50LXNpemUgc3RhdHMpIDApCisgICAgICAgICAgbGFyZ2VzdCAoLmdldEFuZFNldCAoOmxhcmdlc3QtaGVhcnRiZWF0LXNpemUgc3RhdHMpIDApCisgICAgICAgICAgYXZlcmFnZSAoLmdldEFuZFNldCAoOmF2ZXJhZ2UtaGVhcnRiZWF0LXNpemUgc3RhdHMpIDApCisgICAgICAgICAgdG90YWwta2V5cyAoLnNpemUgaGVhcnRiZWF0cyldCisgICAgICAobG9nLWRlYnVnICJcblJlY2VpdmVkICIgc2VuZC1jb3VudCAiIGhlYXJ0YmVhdHMgdG90YWxpbmcgIiByZWNlaXZlZC1zaXplICIgYnl0ZXMsXG4iCisgICAgICAgICAgICAgICAgICJTZW50ICIgZ2V0LWNvdW50ICIgaGVhcnRiZWF0cyB0b3RhbGluZyAiIHNlbnQtc2l6ZSAiIGJ5dGVzLFxuIgorICAgICAgICAgICAgICAgICAiVGhlIGxhcmdlc3QgaGVhcnRiZWF0IHdhcyAiIGxhcmdlc3QgIiBieXRlcyxcbiIKKyAgICAgICAgICAgICAgICAgIlRoZSBhdmVyYWdlIGhlYXJ0YmVhdCB3YXMgIiBhdmVyYWdlICIgYnl0ZXMsXG4iCisgICAgICAgICAgICAgICAgICJQYWNlbWFrZXIgY29udGFpbmVkICIgdG90YWwta2V5cyAiIHRvdGFsIGtleXNcbiIKKyAgICAgICAgICAgICAgICAgImluIHRoZSBsYXN0ICIgc2xlZXAtc2Vjb25kcyAiIHNlY29uZChzKSIpCisgICAgICAoZG9zeW5jIChyZWYtc2V0IGxhc3QtZml2ZS1zCisgICAgICAgICAgICAgICAgICAgICAgIHs6c2VuZC1wdWxzZS1jb3VudCBzZW5kLWNvdW50CisgICAgICAgICAgICAgICAgICAgICAgICA6dG90YWwtcmVjZWl2ZWQtc2l6ZSByZWNlaXZlZC1zaXplCisgICAgICAgICAgICAgICAgICAgICAgICA6Z2V0LXB1bHNlLWNvdW50IGdldC1jb3VudAorICAgICAgICAgICAgICAgICAgICAgICAgOnRvdGFsLXNlbnQtc2l6ZSBzZW50LXNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgIDpsYXJnZXN0LWhlYXJ0YmVhdC1zaXplIGxhcmdlc3QKKyAgICAgICAgICAgICAgICAgICAgICAgIDphdmVyYWdlLWhlYXJ0YmVhdC1zaXplIGF2ZXJhZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgIDp0b3RhbC1rZXlzIHRvdGFsLWtleXN9KSkpCisgICAgKFRocmVhZC9zbGVlcCAoKiAxMDAwIHNsZWVwLXNlY29uZHMpKQorICAgIChyZWN1cikpKQorCis7OyBKTVggc3R1ZmYKKyhkZWZuIHJlZ2lzdGVyIFtsYXN0LWZpdmUtc10KKyAgKGpteC9yZWdpc3Rlci1tYmVhbgorICAgIChqbXgvY3JlYXRlLWJlYW4KKyAgICAgIGxhc3QtZml2ZS1zKQorICAgICJvcmcuYXBhY2hlLnN0b3JtLnBhY2VtYWtlci5wYWNlbWFrZXI6c3RhdHM9U3RhdHNfTGFzdF81X1NlY29uZHMiKSkKKworCis7OyBQYWNlbWFrZXIgRnVuY3Rpb25zCisKKyhkZWZuIGhiLWRhdGEgW10KKyAgKENvbmN1cnJlbnRIYXNoTWFwLikpCisKKyhkZWZuIGNyZWF0ZS1wYXRoIFteU3RyaW5nIHBhdGggaGVhcnRiZWF0c10KKyAgKEhCTWVzc2FnZS4gSEJTZXJ2ZXJNZXNzYWdlVHlwZS9DUkVBVEVfUEFUSF9SRVNQT05TRSBuaWwpKQorCisoZGVmbiBleGlzdHMgW15TdHJpbmcgcGF0aCBoZWFydGJlYXRzXQorICAobGV0IFtpdC1kb2VzICguY29udGFpbnNLZXkgaGVhcnRiZWF0cyBwYXRoKV0KKyAgICAobG9nLWRlYnVnIChzdHIgIkNoZWNraW5nIGlmIHBhdGggWyIgcGF0aCAiXSBleGlzdHMuLi4iIGl0LWRvZXMgIi4iKSkKKyAgICAoSEJNZXNzYWdlLiBIQlNlcnZlck1lc3NhZ2VUeXBlL0VYSVNUU19SRVNQT05TRQorICAgICAgICAgICAgICAgIChIQk1lc3NhZ2VEYXRhL2Jvb2x2YWwgaXQtZG9lcykpKSkKKworKGRlZm4gc2VuZC1wdWxzZSBbXkhCUHVsc2UgcHVsc2UgaGVhcnRiZWF0cyBwYWNlbWFrZXItc3RhdHNdCisgIChsZXQgW2lkICguZ2V0X2lkIHB1bHNlKQorICAgICAgICBkZXRhaWxzICguZ2V0X2RldGFpbHMgcHVsc2UpXQorICAgIChsb2ctZGVidWcgKHN0ciAiU2F2aW5nIFB1bHNlIGZvciBpZCBbIiBpZCAiXSBkYXRhIFsiICsgKHN0ciBkZXRhaWxzKSAiXS4iKSkKKworICAgICguaW5jcmVtZW50QW5kR2V0ICg6c2VuZC1wdWxzZS1jb3VudCBwYWNlbWFrZXItc3RhdHMpKQorICAgICguYWRkQW5kR2V0ICg6dG90YWwtcmVjZWl2ZWQtc2l6ZSBwYWNlbWFrZXItc3RhdHMpIChhbGVuZ3RoIGRldGFpbHMpKQorICAgIChzZXQtbGFyZ2VzdCBwYWNlbWFrZXItc3RhdHMgKGFsZW5ndGggZGV0YWlscykpCisgICAgKHNldC1hdmVyYWdlIHBhY2VtYWtlci1zdGF0cyAoYWxlbmd0aCBkZXRhaWxzKSkKKworICAgICgucHV0IGhlYXJ0YmVhdHMgaWQgZGV0YWlscykKKyAgICAoSEJNZXNzYWdlLiBIQlNlcnZlck1lc3NhZ2VUeXBlL1NFTkRfUFVMU0VfUkVTUE9OU0UgbmlsKSkpCisKKyhkZWZuIGdldC1hbGwtcHVsc2UtZm9yLXBhdGggW15TdHJpbmcgcGF0aCBoZWFydGJlYXRzXQorICAoSEJNZXNzYWdlLiBIQlNlcnZlck1lc3NhZ2VUeXBlL0dFVF9BTExfUFVMU0VfRk9SX1BBVEhfUkVTUE9OU0UgbmlsKSkKKworKGRlZm4gZ2V0LWFsbC1ub2Rlcy1mb3ItcGF0aCBbXlN0cmluZyBwYXRoIF5Db25jdXJyZW50SGFzaE1hcCBoZWFydGJlYXRzXQorICAobG9nLWRlYnVnICJMaXN0IGFsbCBub2RlcyBmb3IgcGF0aCAiIHBhdGgpCisgIChIQk1lc3NhZ2UuIEhCU2VydmVyTWVzc2FnZVR5cGUvR0VUX0FMTF9OT0RFU19GT1JfUEFUSF9SRVNQT05TRQorICAgICAgICAgICAgICAoSEJNZXNzYWdlRGF0YS9ub2RlcworICAgICAgICAgICAgICAgKEhCTm9kZXMuIChkaXN0aW5jdCAoZm9yIFtrICgua2V5U2V0IGhlYXJ0YmVhdHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpsZXQgW3RyaW1tZWQtayAoZmlyc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZmlsdGVyICMobm90ICg9ICIiICUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNwbGl0IChyZXBsYWNlLWZpcnN0IGsgcGF0aCAiIikgIyIvIikpKV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOndoZW4gKGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5vdCAobmlsPyB0cmltbWVkLWspKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKD0gKC5pbmRleE9mIGsgcGF0aCkgMCkpXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyaW1tZWQtaykpKSkpKQorCisoZGVmbiBnZXQtcHVsc2UgW15TdHJpbmcgcGF0aCBoZWFydGJlYXRzIHBhY2VtYWtlci1zdGF0c10KKyAgKGxldCBbZGV0YWlscyAoLmdldCBoZWFydGJlYXRzIHBhdGgpXQorICAgIChsb2ctZGVidWcgKHN0ciAiR2V0dGluZyBQdWxzZSBmb3IgcGF0aCBbIiBwYXRoICJdLi4uZGF0YSAiIChzdHIgZGV0YWlscykgIl0uIikpCisKKworICAgICguaW5jcmVtZW50QW5kR2V0ICg6Z2V0LXB1bHNlLWNvdW50IHBhY2VtYWtlci1zdGF0cykpCisgICAgKGlmIGRldGFpbHMKKyAgICAgICguYWRkQW5kR2V0ICg6dG90YWwtc2VudC1zaXplIHBhY2VtYWtlci1zdGF0cykgKGFsZW5ndGggZGV0YWlscykpKQorCisgICAgKEhCTWVzc2FnZS4gSEJTZXJ2ZXJNZXNzYWdlVHlwZS9HRVRfUFVMU0VfUkVTUE9OU0UKKyAgICAgICAgICAgICAgICAoSEJNZXNzYWdlRGF0YS9wdWxzZQorICAgICAgICAgICAgICAgICAoZG90byAoSEJQdWxzZS4gKSAoLnNldF9pZCBwYXRoKSAoLnNldF9kZXRhaWxzIGRldGFpbHMpKSkpKSkKKworKGRlZm4gZGVsZXRlLXB1bHNlLWlkIFteU3RyaW5nIHBhdGggaGVhcnRiZWF0c10KKyAgKGxvZy1kZWJ1ZyAoc3RyICJEZWxldGluZyBQdWxzZSBmb3IgaWQgWyIgcGF0aCAiXS4iKSkKKyAgKC5yZW1vdmUgaGVhcnRiZWF0cyBwYXRoKQorICAoSEJNZXNzYWdlLiBIQlNlcnZlck1lc3NhZ2VUeXBlL0RFTEVURV9QVUxTRV9JRF9SRVNQT05TRSBuaWwpKQorCisoZGVmbiBkZWxldGUtcGF0aCBbXlN0cmluZyBwYXRoIGhlYXJ0YmVhdHNdCisgIChsZXQgW3ByZWZpeCAoaWYgKD0gXC8gKGxhc3QgcGF0aCkpIHBhdGggKHN0ciBwYXRoICIvIikpXQorICAgIChkb3NlcSBbayAoLmtleVNldCBoZWFydGJlYXRzKQorICAgICAgICAgICAgOndoZW4gKD0gKC5pbmRleE9mIGsgcHJlZml4KSAwKV0KKyAgICAgIChkZWxldGUtcHVsc2UtaWQgayBoZWFydGJlYXRzKSkpCisgIChIQk1lc3NhZ2UuIEhCU2VydmVyTWVzc2FnZVR5cGUvREVMRVRFX1BBVEhfUkVTUE9OU0UgbmlsKSkKKworKGRlZm4gbm90LWF1dGhvcml6ZWQgW10KKyAgKEhCTWVzc2FnZS4gSEJTZXJ2ZXJNZXNzYWdlVHlwZS9OT1RfQVVUSE9SSVpFRCBuaWwpKQorCisoZGVmbiBtay1oYW5kbGVyIFtjb25mXQorICAobGV0IFtoZWFydGJlYXRzIF5Db25jdXJyZW50SGFzaE1hcCAoaGItZGF0YSkKKyAgICAgICAgcGFjZW1ha2VyLXN0YXRzIHs6c2VuZC1wdWxzZS1jb3VudCAoQXRvbWljSW50ZWdlci4pCisgICAgICAgICAgICAgICAgICAgICAgICAgOnRvdGFsLXJlY2VpdmVkLXNpemUgKEF0b21pY0ludGVnZXIuKQorICAgICAgICAgICAgICAgICAgICAgICAgIDpnZXQtcHVsc2UtY291bnQgKEF0b21pY0ludGVnZXIuKQorICAgICAgICAgICAgICAgICAgICAgICAgIDp0b3RhbC1zZW50LXNpemUgKEF0b21pY0ludGVnZXIuKQorICAgICAgICAgICAgICAgICAgICAgICAgIDpsYXJnZXN0LWhlYXJ0YmVhdC1zaXplIChBdG9taWNJbnRlZ2VyLikKKyAgICAgICAgICAgICAgICAgICAgICAgICA6YXZlcmFnZS1oZWFydGJlYXQtc2l6ZSAoQXRvbWljSW50ZWdlci4pfQorICAgICAgICBsYXN0LWZpdmUgKHJlZiB7OnNlbmQtcHVsc2UtY291bnQgMAorICAgICAgICAgICAgICAgICAgICAgICAgOnRvdGFsLXJlY2VpdmVkLXNpemUgMAorICAgICAgICAgICAgICAgICAgICAgICAgOmdldC1wdWxzZS1jb3VudCAwCisgICAgICAgICAgICAgICAgICAgICAgICA6dG90YWwtc2VudC1zaXplIDAKKyAgICAgICAgICAgICAgICAgICAgICAgIDpsYXJnZXN0LWhlYXJ0YmVhdC1zaXplIDAKKyAgICAgICAgICAgICAgICAgICAgICAgIDphdmVyYWdlLWhlYXJ0YmVhdC1zaXplIDAKKyAgICAgICAgICAgICAgICAgICAgICAgIDp0b3RhbC1rZXlzIDB9KQorICAgICAgICBzdGF0cy10aHJlYWQgKFRocmVhZC4gKGZuIFtdIChyZXBvcnQtc3RhdHMgaGVhcnRiZWF0cyBwYWNlbWFrZXItc3RhdHMgbGFzdC1maXZlKSkpXQorICAgICguc2V0RGFlbW9uIHN0YXRzLXRocmVhZCB0cnVlKQorICAgICguc3RhcnQgc3RhdHMtdGhyZWFkKQorICAgIChyZWdpc3RlciBsYXN0LWZpdmUpCisgICAgKHJlaWZ5CisgICAgICBJU2VydmVyTWVzc2FnZUhhbmRsZXIKKyAgICAgICheSEJNZXNzYWdlIGhhbmRsZU1lc3NhZ2UgW3RoaXMgXkhCTWVzc2FnZSByZXF1ZXN0IF5ib29sZWFuIGF1dGhlbnRpY2F0ZWRdCisgICAgICAgIChsZXQgW3Jlc3BvbnNlCisgICAgICAgICAgICAgIChjb25kcCA9ICguZ2V0X3R5cGUgcmVxdWVzdCkKKyAgICAgICAgICAgICAgICBIQlNlcnZlck1lc3NhZ2VUeXBlL0NSRUFURV9QQVRICisgICAgICAgICAgICAgICAgKGNyZWF0ZS1wYXRoICguZ2V0X3BhdGggKC5nZXRfZGF0YSByZXF1ZXN0KSkgaGVhcnRiZWF0cykKKworICAgICAgICAgICAgICAgIEhCU2VydmVyTWVzc2FnZVR5cGUvRVhJU1RTCisgICAgICAgICAgICAgICAgKGlmIGF1dGhlbnRpY2F0ZWQKKyAgICAgICAgICAgICAgICAgIChleGlzdHMgKC5nZXRfcGF0aCAoLmdldF9kYXRhIHJlcXVlc3QpKSBoZWFydGJlYXRzKQorICAgICAgICAgICAgICAgICAgKG5vdC1hdXRob3JpemVkKSkKKworICAgICAgICAgICAgICAgIEhCU2VydmVyTWVzc2FnZVR5cGUvU0VORF9QVUxTRQorICAgICAgICAgICAgICAgIChzZW5kLXB1bHNlICguZ2V0X3B1bHNlICguZ2V0X2RhdGEgcmVxdWVzdCkpIGhlYXJ0YmVhdHMgcGFjZW1ha2VyLXN0YXRzKQorCisgICAgICAgICAgICAgICAgSEJTZXJ2ZXJNZXNzYWdlVHlwZS9HRVRfQUxMX1BVTFNFX0ZPUl9QQVRICisgICAgICAgICAgICAgICAgKGlmIGF1dGhlbnRpY2F0ZWQKKyAgICAgICAgICAgICAgICAgIChnZXQtYWxsLXB1bHNlLWZvci1wYXRoICguZ2V0X3BhdGggKC5nZXRfZGF0YSByZXF1ZXN0KSkgaGVhcnRiZWF0cykKKyAgICAgICAgICAgICAgICAgIChub3QtYXV0aG9yaXplZCkpCisKKyAgICAgICAgICAgICAgICBIQlNlcnZlck1lc3NhZ2VUeXBlL0dFVF9BTExfTk9ERVNfRk9SX1BBVEgKKyAgICAgICAgICAgICAgICAoaWYgYXV0aGVudGljYXRlZAorICAgICAgICAgICAgICAgICAgKGdldC1hbGwtbm9kZXMtZm9yLXBhdGggKC5nZXRfcGF0aCAoLmdldF9kYXRhIHJlcXVlc3QpKSBoZWFydGJlYXRzKQorICAgICAgICAgICAgICAgICAgKG5vdC1hdXRob3JpemVkKSkKKworICAgICAgICAgICAgICAgIEhCU2VydmVyTWVzc2FnZVR5cGUvR0VUX1BVTFNFCisgICAgICAgICAgICAgICAgKGlmIGF1dGhlbnRpY2F0ZWQKKyAgICAgICAgICAgICAgICAgIChnZXQtcHVsc2UgKC5nZXRfcGF0aCAoLmdldF9kYXRhIHJlcXVlc3QpKSBoZWFydGJlYXRzIHBhY2VtYWtlci1zdGF0cykKKyAgICAgICAgICAgICAgICAgIChub3QtYXV0aG9yaXplZCkpCisKKyAgICAgICAgICAgICAgICBIQlNlcnZlck1lc3NhZ2VUeXBlL0RFTEVURV9QQVRICisgICAgICAgICAgICAgICAgKGRlbGV0ZS1wYXRoICguZ2V0X3BhdGggKC5nZXRfZGF0YSByZXF1ZXN0KSkgaGVhcnRiZWF0cykKKworICAgICAgICAgICAgICAgIEhCU2VydmVyTWVzc2FnZVR5cGUvREVMRVRFX1BVTFNFX0lECisgICAgICAgICAgICAgICAgKGRlbGV0ZS1wdWxzZS1pZCAoLmdldF9wYXRoICguZ2V0X2RhdGEgcmVxdWVzdCkpIGhlYXJ0YmVhdHMpCisKKyAgICAgICAgICAgICAgICA7IE90aGVyd2lzZQorICAgICAgICAgICAgICAgIChsb2ctbWVzc2FnZSAiR290IFVuZXhwZWN0ZWQgVHlwZTogIiAoLmdldF90eXBlIHJlcXVlc3QpKSldCisKKyAgICAgICAgICAoLnNldF9tZXNzYWdlX2lkIHJlc3BvbnNlICguZ2V0X21lc3NhZ2VfaWQgcmVxdWVzdCkpCisgICAgICAgICAgcmVzcG9uc2UpKSkpKQorCisoZGVmbiBsYXVuY2gtc2VydmVyISBbXQorICAobG9nLW1lc3NhZ2UgIlN0YXJ0aW5nIFNlcnZlci4iKQorICAobGV0IFtjb25mIChvdmVycmlkZS1sb2dpbi1jb25maWctd2l0aC1zeXN0ZW0tcHJvcGVydHkgKHJlYWQtc3Rvcm0tY29uZmlnKSldCisgICAgKFBhY2VtYWtlclNlcnZlci4gKG1rLWhhbmRsZXIgY29uZikgY29uZikpKQorCisoZGVmbiAtbWFpbiBbXQorICAocmVkaXJlY3Qtc3RkaW8tdG8tc2xmNGohKQorICAobGF1bmNoLXNlcnZlciEpKQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvY2xqL29yZy9hcGFjaGUvc3Rvcm0vcGFjZW1ha2VyL3BhY2VtYWtlcl9zdGF0ZV9mYWN0b3J5LmNsaiBiL3N0b3JtLWNvcmUvc3JjL2Nsai9vcmcvYXBhY2hlL3N0b3JtL3BhY2VtYWtlci9wYWNlbWFrZXJfc3RhdGVfZmFjdG9yeS5jbGoKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM3Mzk3YQotLS0gL2Rldi9udWxsCisrKyBiL3N0b3JtLWNvcmUvc3JjL2Nsai9vcmcvYXBhY2hlL3N0b3JtL3BhY2VtYWtlci9wYWNlbWFrZXJfc3RhdGVfZmFjdG9yeS5jbGoKQEAgLTAsMCArMSwxMjQgQEAKKzs7IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKzs7IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorOzsgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKzs7IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKzs7IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKzs7ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKzs7IHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzs7Cis7OyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzs7Cis7OyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis7OyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOzsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis7OyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis7OyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworKG5zIG9yZy5hcGFjaGUuc3Rvcm0ucGFjZW1ha2VyLnBhY2VtYWtlci1zdGF0ZS1mYWN0b3J5CisgICg6cmVxdWlyZSBbb3JnLmFwYWNoZS5zdG9ybS5wYWNlbWFrZXIgcGFjZW1ha2VyXQorICAgICAgICAgICAgW2JhY2t0eXBlLnN0b3JtLmNsdXN0ZXItc3RhdGUgW3pvb2tlZXBlci1zdGF0ZS1mYWN0b3J5IDphcyB6ay1mYWN0b3J5XV0KKyAgICAgICAgICAgIFtiYWNrdHlwZS5zdG9ybQorICAgICAgICAgICAgIFtjb25maWcgOnJlZmVyIDphbGxdCisgICAgICAgICAgICAgW2NsdXN0ZXIgOnJlZmVyIDphbGxdCisgICAgICAgICAgICAgW2xvZyA6cmVmZXIgOmFsbF0KKyAgICAgICAgICAgICBbdXRpbCA6YXMgdXRpbF1dKQorICAoOmltcG9ydCBbYmFja3R5cGUuc3Rvcm0uZ2VuZXJhdGVkCisgICAgICAgICAgICBIQkV4ZWN1dGlvbkV4Y2VwdGlvbiBIQlNlcnZlck1lc3NhZ2VUeXBlIEhCTWVzc2FnZQorICAgICAgICAgICAgSEJNZXNzYWdlRGF0YSBIQlB1bHNlXQorICAgICAgICAgICBbYmFja3R5cGUuc3Rvcm0uY2x1c3Rlcl9zdGF0ZSB6b29rZWVwZXJfc3RhdGVfZmFjdG9yeV0KKyAgICAgICAgICAgW2JhY2t0eXBlLnN0b3JtLmNsdXN0ZXIgQ2x1c3RlclN0YXRlXQorICAgICAgICAgICBbb3JnLmFwYWNoZS5zdG9ybS5wYWNlbWFrZXIgUGFjZW1ha2VyQ2xpZW50XSkKKyAgKDpnZW4tY2xhc3MKKyAgIDppbXBsZW1lbnRzIFtiYWNrdHlwZS5zdG9ybS5jbHVzdGVyLkNsdXN0ZXJTdGF0ZUZhY3RvcnldKSkKKworOzsgU28gd2UgY2FuIG1vY2sgdGhlIGNsaWVudCBmb3IgdGVzdGluZworKGRlZm4gbWFrZUNsaWVudCBbY29uZl0KKyAgKFBhY2VtYWtlckNsaWVudC4gY29uZikpCisKKyhkZWZuIG1ha2VaS1N0YXRlIFtjb25mIGF1dGgtY29uZiBhY2xzIGNvbnRleHRdCisgICgubWtTdGF0ZSAoem9va2VlcGVyX3N0YXRlX2ZhY3RvcnkuKSBjb25mIGF1dGgtY29uZiBhY2xzIGNvbnRleHQpKQorCisoZGVmIG1heC1yZXRyaWVzIDEwKQorCisoZGVmbiAtbWtTdGF0ZSBbdGhpcyBjb25mIGF1dGgtY29uZiBhY2xzIGNvbnRleHRdCisgIChsZXQgW3prLXN0YXRlIChtYWtlWktTdGF0ZSBjb25mIGF1dGgtY29uZiBhY2xzIGNvbnRleHQpCisgICAgICAgIHBhY2VtYWtlci1jbGllbnQgKG1ha2VDbGllbnQgY29uZildCisKKyAgICAocmVpZnkKKyAgICAgIENsdXN0ZXJTdGF0ZQorICAgICAgOzsgTGV0IHRoZXNlIHBhc3MgdGhyb3VnaCB0byB0aGUgemstc3RhdGUuIFdlIG9ubHkgd2FudCB0byBoYW5kbGUgaGVhcnRiZWF0cy4KKyAgICAgIChyZWdpc3RlciBbdGhpcyBjYWxsYmFja10gKC5yZWdpc3RlciB6ay1zdGF0ZSBjYWxsYmFjaykpCisgICAgICAodW5yZWdpc3RlciBbdGhpcyBjYWxsYmFja10gKC51bnJlZ2lzdGVyIHprLXN0YXRlIGNhbGxiYWNrKSkKKyAgICAgIChzZXRfZXBoZW1lcmFsX25vZGUgW3RoaXMgcGF0aCBkYXRhIGFjbHNdICguc2V0X2VwaGVtZXJhbF9ub2RlIHprLXN0YXRlIHBhdGggZGF0YSBhY2xzKSkKKyAgICAgIChjcmVhdGVfc2VxdWVudGlhbCBbdGhpcyBwYXRoIGRhdGEgYWNsc10gKC5jcmVhdGVfc2VxdWVudGlhbCB6ay1zdGF0ZSBwYXRoIGRhdGEgYWNscykpCisgICAgICAoc2V0X2RhdGEgW3RoaXMgcGF0aCBkYXRhIGFjbHNdICguc2V0X2RhdGEgemstc3RhdGUgcGF0aCBkYXRhIGFjbHMpKQorICAgICAgKGRlbGV0ZV9ub2RlIFt0aGlzIHBhdGhdICguZGVsZXRlX25vZGUgemstc3RhdGUgcGF0aCkpCisgICAgICAoZ2V0X2RhdGEgW3RoaXMgcGF0aCB3YXRjaD9dICguZ2V0X2RhdGEgemstc3RhdGUgcGF0aCB3YXRjaD8pKQorICAgICAgKGdldF9kYXRhX3dpdGhfdmVyc2lvbiBbdGhpcyBwYXRoIHdhdGNoP10gKC5nZXRfZGF0YV93aXRoX3ZlcnNpb24gemstc3RhdGUgcGF0aCB3YXRjaD8pKQorICAgICAgKGdldF92ZXJzaW9uIFt0aGlzIHBhdGggd2F0Y2g/XSAoLmdldF92ZXJzaW9uIHprLXN0YXRlIHBhdGggd2F0Y2g/KSkKKyAgICAgIChnZXRfY2hpbGRyZW4gW3RoaXMgcGF0aCB3YXRjaD9dICguZ2V0X2NoaWxkcmVuIHprLXN0YXRlIHBhdGggd2F0Y2g/KSkKKyAgICAgIChta2RpcnMgW3RoaXMgcGF0aCBhY2xzXSAoLm1rZGlycyB6ay1zdGF0ZSBwYXRoIGFjbHMpKQorICAgICAgKG5vZGVfZXhpc3RzIFt0aGlzIHBhdGggd2F0Y2g/XSAoLm5vZGVfZXhpc3RzIHprLXN0YXRlIHBhdGggd2F0Y2g/KSkKKyAgICAgIChhZGRfbGlzdGVuZXIgW3RoaXMgbGlzdGVuZXJdICguYWRkX2xpc3RlbmVyIHprLXN0YXRlIGxpc3RlbmVyKSkKKyAgICAgIChzeW5jX3BhdGggW3RoaXMgcGF0aF0gKC5zeW5jX3BhdGggemstc3RhdGUgcGF0aCkpCisgICAgICAKKyAgICAgIChzZXRfd29ya2VyX2hiIFt0aGlzIHBhdGggZGF0YSBhY2xzXQorICAgICAgICAodXRpbC9yZXRyeS1vbi1leGNlcHRpb24KKyAgICAgICAgIG1heC1yZXRyaWVzCisgICAgICAgICAic2V0X3dvcmtlcl9oYiIKKyAgICAgICAgICMobGV0IFtyZXNwb25zZQorICAgICAgICAgICAgICAgICguc2VuZCBwYWNlbWFrZXItY2xpZW50CisgICAgICAgICAgICAgICAgICAgICAgIChIQk1lc3NhZ2UuIEhCU2VydmVyTWVzc2FnZVR5cGUvU0VORF9QVUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSEJNZXNzYWdlRGF0YS9wdWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRvdG8gKEhCUHVsc2UuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLnNldF9pZCBwYXRoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLnNldF9kZXRhaWxzIGRhdGEpKSkpKV0KKyAgICAgICAgICAgIChpZiAoPSAoLmdldF90eXBlIHJlc3BvbnNlKSBIQlNlcnZlck1lc3NhZ2VUeXBlL1NFTkRfUFVMU0VfUkVTUE9OU0UpCisgICAgICAgICAgICAgIDpvaworICAgICAgICAgICAgICAodGhyb3cgKEhCRXhlY3V0aW9uRXhjZXB0aW9uLiAiSW52YWxpZCBSZXNwb25zZSBUeXBlIikpKSkpKQorCisgICAgICAoZGVsZXRlX3dvcmtlcl9oYiBbdGhpcyBwYXRoXQorICAgICAgICAodXRpbC9yZXRyeS1vbi1leGNlcHRpb24KKyAgICAgICAgIG1heC1yZXRyaWVzCisgICAgICAgICAiZGVsZXRlX3dvcmtlcl9oYiIKKyAgICAgICAgICMobGV0IFtyZXNwb25zZQorICAgICAgICAgICAgICAgICguc2VuZCBwYWNlbWFrZXItY2xpZW50CisgICAgICAgICAgICAgICAgICAgICAgIChIQk1lc3NhZ2UuIEhCU2VydmVyTWVzc2FnZVR5cGUvREVMRVRFX1BBVEgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEhCTWVzc2FnZURhdGEvcGF0aCBwYXRoKSkpXQorICAgICAgICAgICAgKGlmICg9ICguZ2V0X3R5cGUgcmVzcG9uc2UpIEhCU2VydmVyTWVzc2FnZVR5cGUvREVMRVRFX1BBVEhfUkVTUE9OU0UpCisgICAgICAgICAgICAgIDpvaworICAgICAgICAgICAgICAodGhyb3cgKEhCRXhlY3V0aW9uRXhjZXB0aW9uLiAiSW52YWxpZCBSZXNwb25zZSBUeXBlIikpKSkpKQorICAgICAgCisgICAgICAoZ2V0X3dvcmtlcl9oYiBbdGhpcyBwYXRoIHdhdGNoP10KKyAgICAgICAgKHV0aWwvcmV0cnktb24tZXhjZXB0aW9uCisgICAgICAgICBtYXgtcmV0cmllcworICAgICAgICAgImdldF93b3JrZXJfaGIiCisgICAgICAgICAjKGxldCBbcmVzcG9uc2UKKyAgICAgICAgICAgICAgICAoLnNlbmQgcGFjZW1ha2VyLWNsaWVudAorICAgICAgICAgICAgICAgICAgICAgICAoSEJNZXNzYWdlLiBIQlNlcnZlck1lc3NhZ2VUeXBlL0dFVF9QVUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSEJNZXNzYWdlRGF0YS9wYXRoIHBhdGgpKSldCisgICAgICAgICAgICAoaWYgKD0gKC5nZXRfdHlwZSByZXNwb25zZSkgSEJTZXJ2ZXJNZXNzYWdlVHlwZS9HRVRfUFVMU0VfUkVTUE9OU0UpCisgICAgICAgICAgICAgICh0cnkgCisgICAgICAgICAgICAgICAgKC5nZXRfZGV0YWlscyAoLmdldF9wdWxzZSAoLmdldF9kYXRhIHJlc3BvbnNlKSkpCisgICAgICAgICAgICAgICAgKGNhdGNoIEV4Y2VwdGlvbiBlCisgICAgICAgICAgICAgICAgICAodGhyb3cgKEhCRXhlY3V0aW9uRXhjZXB0aW9uLiAoLnRvU3RyaW5nIGUpKSkpKQorICAgICAgICAgICAgICAodGhyb3cgKEhCRXhlY3V0aW9uRXhjZXB0aW9uLiAiSW52YWxpZCBSZXNwb25zZSBUeXBlIikpKSkpKQorICAgICAgCisgICAgICAoZ2V0X3dvcmtlcl9oYl9jaGlsZHJlbiBbdGhpcyBwYXRoIHdhdGNoP10KKyAgICAgICAgKHV0aWwvcmV0cnktb24tZXhjZXB0aW9uCisgICAgICAgICBtYXgtcmV0cmllcworICAgICAgICAgImdldF93b3JrZXJfaGJfY2hpbGRyZW4iCisgICAgICAgICAjKGxldCBbcmVzcG9uc2UKKyAgICAgICAgICAgICAgICAoLnNlbmQgcGFjZW1ha2VyLWNsaWVudAorICAgICAgICAgICAgICAgICAgICAgICAoSEJNZXNzYWdlLiBIQlNlcnZlck1lc3NhZ2VUeXBlL0dFVF9BTExfTk9ERVNfRk9SX1BBVEgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEhCTWVzc2FnZURhdGEvcGF0aCBwYXRoKSkpXQorICAgICAgICAgICAgKGlmICg9ICguZ2V0X3R5cGUgcmVzcG9uc2UpIEhCU2VydmVyTWVzc2FnZVR5cGUvR0VUX0FMTF9OT0RFU19GT1JfUEFUSF9SRVNQT05TRSkKKyAgICAgICAgICAgICAgKHRyeQorICAgICAgICAgICAgICAgIChpbnRvIFtdICguZ2V0X3B1bHNlSWRzICguZ2V0X25vZGVzICguZ2V0X2RhdGEgcmVzcG9uc2UpKSkpCisgICAgICAgICAgICAgICAgKGNhdGNoIEV4Y2VwdGlvbiBlCisgICAgICAgICAgICAgICAgICAodGhyb3cgKEhCRXhlY3V0aW9uRXhjZXB0aW9uLiAoLnRvU3RyaW5nIGUpKSkpKQorICAgICAgICAgICAgICAodGhyb3cgKEhCRXhlY3V0aW9uRXhjZXB0aW9uLiAiSW52YWxpZCBSZXNwb25zZSBUeXBlIikpKSkpKQorICAgICAgCisgICAgICAoY2xvc2UgW3RoaXNdCisgICAgICAgICguY2xvc2Ugemstc3RhdGUpCisgICAgICAgICguY2xvc2UgcGFjZW1ha2VyLWNsaWVudCkpKSkpCmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9kZXYvbG9ndmlld2VyLXNlYXJjaC1jb250ZXh0LXRlc3RzLmxvZyBiL3N0b3JtLWNvcmUvc3JjL2Rldi9sb2d2aWV3ZXItc2VhcmNoLWNvbnRleHQtdGVzdHMubG9nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNGQ0YWYKLS0tIC9kZXYvbnVsbAorKysgYi9zdG9ybS1jb3JlL3NyYy9kZXYvbG9ndmlld2VyLXNlYXJjaC1jb250ZXh0LXRlc3RzLmxvZwpAQCAtMCwwICsxIEBACituZWVkbGUgbmVlZGxlMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwbmVlZGxlIG5lZWRsZQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvZGV2L2xvZ3ZpZXdlci1zZWFyY2gtY29udGV4dC10ZXN0cy5sb2cuZ3ogYi9zdG9ybS1jb3JlL3NyYy9kZXYvbG9ndmlld2VyLXNlYXJjaC1jb250ZXh0LXRlc3RzLmxvZy5negpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2YyYTA2Ci0tLSAvZGV2L251bGwKKysrIGIvc3Rvcm0tY29yZS9zcmMvZGV2L2xvZ3ZpZXdlci1zZWFyY2gtY29udGV4dC10ZXN0cy5sb2cuZ3oKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvZGV2L3NtYWxsLXdvcmtlci5sb2cgYi9zdG9ybS1jb3JlL3NyYy9kZXYvc21hbGwtd29ya2VyLmxvZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2Q2MWQxCi0tLSAvZGV2L251bGwKKysrIGIvc3Rvcm0tY29yZS9zcmMvZGV2L3NtYWxsLXdvcmtlci5sb2cKQEAgLTAsMCArMSBAQAorMDAwMDAwIG5lZWRsZSAwMDAwMDAKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2Rldi90ZXN0LTMwNzIubG9nIGIvc3Rvcm0tY29yZS9zcmMvZGV2L3Rlc3QtMzA3Mi5sb2cKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZkYzZmMQotLS0gL2Rldi9udWxsCisrKyBiL3N0b3JtLWNvcmUvc3JjL2Rldi90ZXN0LTMwNzIubG9nCkBAIC0wLDAgKzEsMyBAQAorVGhpcyBpcyBhIHRlc3QgbG9nIGZpbGUgb2Ygc2l6ZSAzMDcyLgorCisuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi5uZWVkbGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9kZXYvdGVzdC13b3JrZXIubG9nIGIvc3Rvcm0tY29yZS9zcmMvZGV2L3Rlc3Qtd29ya2VyLmxvZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmI0YzUzCi0tLSAvZGV2L251bGwKKysrIGIvc3Rvcm0tY29yZS9zcmMvZGV2L3Rlc3Qtd29ya2VyLmxvZwpAQCAtMCwwICsxLDM4MCBAQAorVGVzdCBuZWVkbGUgaXMgbmVhciB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLgorVGhpcyBmaWxlIGFzc3VtZXMgYSBidWZmZXIgc2l6ZSBvZiAyMDQ4IGJ5dGVzLCBhIG1heCBzZWFyY2ggc3RyaW5nIHNpemUgb2YgMTAyNCBieXRlcywgYW5kIGEgY29udGV4dCBsZW5ndGggb2YgMTI4IFVURi04IGNoYXJhY3RlcnMuCitUaGUgZWFybHkgbWF0Y2ggdGVzdHMgdGhlIGNhc2Ugd2hlbiB3ZSBmaW5kIGEgbWF0Y2ggdG9vIGNsb3NlIHRvIHRoZSBzdGFydCBvZiB0aGUgZmlsZSB0byBnaXZlIHRoZSBub3JtYWwgYmVmb3JlIGNvbnRleHQgc3RyaW5ncy4KKworcGFkZGluZyA1CitwYWRkaW5nIDYKK3BhZGRpbmcgNworcGFkZGluZyA4CitwYWRkaW5nIDkKK3BhZGRpbmcgMTAKK3BhZGRpbmcgMTEKK3BhZGRpbmcgMTIKK3BhZGRpbmcgMTMKK3BhZGRpbmcgMTQKK3BhZGRpbmcgMTUKK3BhZGRpbmcgMTYKK3BhZGRpbmcgMTcKK3BhZGRpbmcgMTgKK3BhZGRpbmcgMTkKK3BhZGRpbmcgMjAKK3BhZGRpbmcgMjEKK3BhZGRpbmcgMjIKK3BhZGRpbmcgMjMKK3BhZGRpbmcgMjQKK3BhZGRpbmcgMjUKK3BhZGRpbmcgMjYKK3BhZGRpbmcgMjcKK3BhZGRpbmcgMjgKK3BhZGRpbmcgMjkKK3BhZGRpbmcgMzAKK3BhZGRpbmcgMzEKK3BhZGRpbmcgMzIKK3BhZGRpbmcgMzMKK3BhZGRpbmcgMzQKK3BhZGRpbmcgMzUKK3BhZGRpbmcgMzYKK3BhZGRpbmcgMzcKK3BhZGRpbmcgMzgKK3BhZGRpbmcgMzkKK3BhZGRpbmcgNDAKK3BhZGRpbmcgNDEKK3BhZGRpbmcgNDIKK3BhZGRpbmcgNDMKK3BhZGRpbmcgNDQKK3BhZGRpbmcgNDUKK3BhZGRpbmcgNDYKK3BhZGRpbmcgNDcKK3BhZGRpbmcgNDgKK3BhZGRpbmcgNDkKK3BhZGRpbmcgNTAKK3BhZGRpbmcgNTEKK3BhZGRpbmcgNTIKK3BhZGRpbmcgNTMKK3BhZGRpbmcgNTQKK3BhZGRpbmcgNTUKK3BhZGRpbmcgNTYKK3BhZGRpbmcgNTcKK3BhZGRpbmcgNTgKK3BhZGRpbmcgNTkKK3BhZGRpbmcgNjAKK3BhZGRpbmcgNjEKK3BhZGRpbmcgNjIKK3BhZGRpbmcgNjMKK3BhZGRpbmcgNjQKK3BhZGRpbmcgNjUKK3BhZGRpbmcgNjYKK3BhZGRpbmcgNjcKK3BhZGRpbmcgNjgKK3BhZGRpbmcgNjkKK3BhZGRpbmcgNzAKK3BhZGRpbmcgNzEKK3BhZGRpbmcgNzIKK3BhZGRpbmcgNzMKK3BhZGRpbmcgNzQKK3BhZGRpbmcgNzUKK3BhZGRpbmcgNzYKK3BhZGRpbmcgNzcKK3BhZGRpbmcgNzgKK3BhZGRpbmcgNzkKK3BhZGRpbmcgODAKK3BhZGRpbmcgODEKK3BhZGRpbmcgODIKK3BhZGRpbmcgODMKK3BhZGRpbmcgODQKK3BhZGRpbmcgODUKK3BhZGRpbmcgODYKK3BhZGRpbmcgODcKK3BhZGRpbmcgODgKK3BhZGRpbmcgODkKK3BhZGRpbmcgOTAKK3BhZGRpbmcgOTEKK3BhZGRpbmcgOTIKK3BhZGRpbmcgOTMKK3BhZGRpbmcgOTQKK3BhZGRpbmcgOTUKK3BhZGRpbmcgOTYKK3BhZGRpbmcgOTcKK3BhZGRpbmcgOTgKK3BhZGRpbmcgOTkKK3BhZGRpbmcgMTAwCitwYWRkaW5nIDEwMQorcGFkZGluZyAxMDIKK3BhZGRpbmcgMTAzCitwYWRkaW5nIDEwNAorcGFkZGluZyAxMDUKK3BhZGRpbmcgMTA2CitwYWRkaW5nIDEwNworcGFkZGluZyAxMDgKK3BhZGRpbmcgMTA5CitwYWRkaW5nIDExMAorcGFkZGluZyAxMTEKK3BhZGRpbmcgMTEyCitwYWRkaW5nIDExMworcGFkZGluZyAxMTQKK3BhZGRpbmcgMTE1CitwYWRkaW5nIDExNgorcGFkZGluZyAxMTcKK3BhZGRpbmcgMTE4CitwYWRkaW5nIDExOQorcGFkZGluZyAxMjAKK3BhZGRpbmcgMTIxCitwYWRkaW5nIDEyMgorcGFkZGluZyAxMjMKK3BhZGRpbmcgMTI0CitwYWRkaW5nIDEyNQorcGFkZGluZyAxMjYKK3BhZGRpbmcgMTI3CitwYWRkaW5nIDEyOAorcGFkZGluZyAxMjkKK3BhZGRpbmcgMTMwCitwYWRkaW5nIDEzMQorcGFkZGluZyAxMzIKK3BhZGRpbmcgMTMzCitwYWRkaW5nIDEzNAorcGFkZGluZyAxMzUKK3BhZGRpbmcgMTM2CitwYWRkaW5nIDEzNworcGFkZGluZyAxMzgKK3BhZGRpbmcgMTM5CitwYWRkaW5nIDE0MAorcGFkZGluZyAxNDEKK3BhZGRpbmcgMTQyCitwYWRkaW5nIDE0MworcGFkZGluZyAxNDQKK3BhZGRpbmcgMTQ1CitwYWRkaW5nIDE0NgorcGFkZGluZyAxNDcKK3BhZGRpbmcgMTQ4CitwYWRkaW5nIDE0OQorcGFkZGluZyAxNTAKK3BhZGRpbmcgMTUxCitwYWRkaW5nIDE1MgorcGFkZGluZyAxNTMKK05lYXIgdGhlIGVuZCBvZiBhIDEwMjQgYnl0ZSBibG9jaywgYSBuZWVkbGUuCitBIG5lZWRsZSB0aGF0IHN0cmFkZGxlcyBhIDEwMjQgYnl0ZSBib3VuZGFyeSBzaG91bGQgYWxzbyBiZSBkZXRlY3RlZC4KKworcGFkZGluZyAxNTcKK3BhZGRpbmcgMTU4CitwYWRkaW5nIDE1OQorcGFkZGluZyAxNjAKK3BhZGRpbmcgMTYxCitwYWRkaW5nIDE2MgorcGFkZGluZyAxNjMKK3BhZGRpbmcgMTY0CitwYWRkaW5nIDE2NQorcGFkZGluZyAxNjYKK3BhZGRpbmcgMTY3CitwYWRkaW5nIDE2OAorcGFkZGluZyAxNjkKK3BhZGRpbmcgMTcwCitwYWRkaW5nIDE3MQorcGFkZGluZyAxNzIKK3BhZGRpbmcgMTczCitwYWRkaW5nIDE3NAorcGFkZGluZyAxNzUKK3BhZGRpbmcgMTc2CitwYWRkaW5nIDE3NworcGFkZGluZyAxNzgKK3BhZGRpbmcgMTc5CitwYWRkaW5nIDE4MAorcGFkZGluZyAxODEKK3BhZGRpbmcgMTgyCitwYWRkaW5nIDE4MworcGFkZGluZyAxODQKK3BhZGRpbmcgMTg1CitwYWRkaW5nIDE4NgorcGFkZGluZyAxODcKK3BhZGRpbmcgMTg4CitwYWRkaW5nIDE4OQorcGFkZGluZyAxOTAKK3BhZGRpbmcgMTkxCitwYWRkaW5nIDE5MgorcGFkZGluZyAxOTMKK3BhZGRpbmcgMTk0CitwYWRkaW5nIDE5NQorcGFkZGluZyAxOTYKK3BhZGRpbmcgMTk3CitwYWRkaW5nIDE5OAorcGFkZGluZyAxOTkKK3BhZGRpbmcgMjAwCitwYWRkaW5nIDIwMQorcGFkZGluZyAyMDIKK3BhZGRpbmcgMjAzCitwYWRkaW5nIDIwNAorcGFkZGluZyAyMDUKK3BhZGRpbmcgMjA2CitwYWRkaW5nIDIwNworcGFkZGluZyAyMDgKK3BhZGRpbmcgMjA5CitwYWRkaW5nIDIxMAorcGFkZGluZyAyMTEKK3BhZGRpbmcgMjEyCitwYWRkaW5nIDIxMworcGFkZGluZyAyMTQKK3BhZGRpbmcgMjE1CitwYWRkaW5nIDIxNgorcGFkZGluZyAyMTcKK3BhZGRpbmcgMjE4CitwYWRkaW5nIDIxOQorcGFkZGluZyAyMjAKK3BhZGRpbmcgMjIxCitwYWRkaW5nIDIyMgorcGFkZGluZyAyMjMKK3BhZGRpbmcgMjI0CitwYWRkaW5nIDIyNQorcGFkZGluZyAyMjYKK3BhZGRpbmcgMjI3CitwYWRkaW5nIDIyOAorcGFkZGluZyAyMjkKK3BhZGRpbmcgMjMwCitwYWRkaW5nIDIzMQorcGFkZGluZyAyMzIKK3BhZGRpbmcgMjMzCitwYWRkaW5nIDIzNAorcGFkZGluZyAyMzUKKworCitIZXJlIGEgbmVlZGxlIG9jY3VycyBqdXN0IGFmdGVyIGEgMTAyNCBieXRlIGJvdW5kYXJ5LiAgSXQgc2hvdWxkIGhhdmUgdGhlIGNvcnJlY3QgY29udGV4dC4KKworVGV4dCB3aXRoIHR3byBhZGpvaW5pbmcgbWF0Y2hlczogbmVlZGxlbmVlZGxlCisKK3BhZGRpbmcgMjQzCitwYWRkaW5nIDI0NAorcGFkZGluZyAyNDUKK3BhZGRpbmcgMjQ2CitwYWRkaW5nIDI0NworcGFkZGluZyAyNDgKK3BhZGRpbmcgMjQ5CitwYWRkaW5nIDI1MAorcGFkZGluZyAyNTEKK3BhZGRpbmcgMjUyCitwYWRkaW5nIDI1MworcGFkZGluZyAyNTQKK3BhZGRpbmcgMjU1CitwYWRkaW5nIDI1NgorcGFkZGluZyAyNTcKK3BhZGRpbmcgMjU4CitwYWRkaW5nIDI1OQorcGFkZGluZyAyNjAKK3BhZGRpbmcgMjYxCitwYWRkaW5nIDI2MgorcGFkZGluZyAyNjMKK3BhZGRpbmcgMjY0CitwYWRkaW5nIDI2NQorcGFkZGluZyAyNjYKK3BhZGRpbmcgMjY3CitwYWRkaW5nIDI2OAorcGFkZGluZyAyNjkKK3BhZGRpbmcgMjcwCitwYWRkaW5nIDI3MQorcGFkZGluZyAyNzIKK3BhZGRpbmcgMjczCitwYWRkaW5nIDI3NAorcGFkZGluZyAyNzUKK3BhZGRpbmcgMjc2CitwYWRkaW5nIDI3NworcGFkZGluZyAyNzgKK3BhZGRpbmcgMjc5CitwYWRkaW5nIDI4MAorcGFkZGluZyAyODEKK3BhZGRpbmcgMjgyCitwYWRkaW5nIDI4MworcGFkZGluZyAyODQKK3BhZGRpbmcgMjg1CitwYWRkaW5nIDI4NgorcGFkZGluZyAyODcKK3BhZGRpbmcgMjg4CitwYWRkaW5nIDI4OQorcGFkZGluZyAyOTAKK3BhZGRpbmcgMjkxCitwYWRkaW5nIDI5MgorcGFkZGluZyAyOTMKK3BhZGRpbmcgMjk0CitwYWRkaW5nIDI5NQorcGFkZGluZyAyOTYKK3BhZGRpbmcgMjk3CitwYWRkaW5nIDI5OAorcGFkZGluZyAyOTkKK3BhZGRpbmcgMzAwCitwYWRkaW5nIDMwMQorcGFkZGluZyAzMDIKK3BhZGRpbmcgMzAzCitwYWRkaW5nIDMwNAorCitUaGUgZm9sbG93aW5nIG1hdGNoIG9mIDEwMjQgYnl0ZXMgY29tcGxldGVseSBmaWxscyBoYWxmIHRoZSBieXRlIGJ1ZmZlci4gIEl0IGlzIGEgc2VhcmNoIHN1YnN0cmluZyBvZiB0aGUgbWF4aW11bSBzaXplLi4uLi4uCisKK1hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgKK1RoZSBmb2xsb3dpbmcgbWF4LXNpemUgbWF0Y2ggc3RyYWRkbGVzIGEgMTAyNCBieXRlIGJ1ZmZlci4KK1hYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgKKworSGVyZSBhcmUgZm91ciBub24tYXNjaWkgMS1ieXRlIFVURi04IGNoYXJhY3RlcnM6IM6xzrLOs860zrUKKworbmVlZGxlCisKK0hlcmUgYXJlIGZvdXIgcHJpbnRhYmxlIDItYnl0ZSBVVEYtOCBjaGFyYWN0ZXJzOiDCocKiwqPCpMKlCisKK25lZWRsZQorCisKKworSGVyZSBhcmUgZm91ciBwcmludGFibGUgMy1ieXRlIFVURi04IGNoYXJhY3RlcnM6IOCkhOCkheCkhuCkh+CkiAorCituZWVkbGUKKworSGVyZSBhcmUgZm91ciBwcmludGFibGUgNC1ieXRlIFVURi04IGNoYXJhY3RlcnM6IPCQhIfwkISI8JCEifCQhIvwkISMCisKK25lZWRsZQorCitIZXJlIGFyZSBmb3VyIG9mIHRoZSBzYW1lIGludmFsaWQgVVRGLTggY2hhcmFjdGVyczog9oCAgPaAgID2gICA9oCAgAorCituZWVkbGUKKworcGFkZGluZyAzMzIKK3BhZGRpbmcgMzMzCitwYWRkaW5nIDMzNAorcGFkZGluZyAzMzUKK3BhZGRpbmcgMzM2CitwYWRkaW5nIDMzNworcGFkZGluZyAzMzgKK3BhZGRpbmcgMzM5CitwYWRkaW5nIDM0MAorcGFkZGluZyAzNDEKK3BhZGRpbmcgMzQyCitwYWRkaW5nIDM0MworcGFkZGluZyAzNDQKK3BhZGRpbmcgMzQ1CitwYWRkaW5nIDM0NgorcGFkZGluZyAzNDcKK3BhZGRpbmcgMzQ4CitwYWRkaW5nIDM0OQorcGFkZGluZyAzNTAKK3BhZGRpbmcgMzUxCitwYWRkaW5nIDM1MgorcGFkZGluZyAzNTMKK3BhZGRpbmcgMzU0CitwYWRkaW5nIDM1NQorcGFkZGluZyAzNTYKK3BhZGRpbmcgMzU3CitwYWRkaW5nIDM1OAorcGFkZGluZyAzNTkKK3BhZGRpbmcgMzYwCitwYWRkaW5nIDM2MQorcGFkZGluZyAzNjIKK3BhZGRpbmcgMzYzCitwYWRkaW5nIDM2NAorcGFkZGluZyAzNjUKK3BhZGRpbmcgMzY2CitwYWRkaW5nIDM2NworcGFkZGluZyAzNjgKK3BhZGRpbmcgMzY5CitwYWRkaW5nIDM3MAorcGFkZGluZyAzNzEKK3BhZGRpbmcgMzcyCitwYWRkaW5nIDM3MworcGFkZGluZyAzNzQKK3BhZGRpbmcgMzc1CisKK1RoZSBmb2xsb3dpbmcgdGVzdHMgbXVsdGlieXRlIFVURi04IENoYXJhY3RlcnMgc3RyYWRkbGluZyB0aGUgYnl0ZSBib3VuZGFyeTogICDwkISA8JCEgfCQhIIKKworbmVlZGxlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvZ2VudGhyaWZ0LnNoIGIvc3Rvcm0tY29yZS9zcmMvZ2VudGhyaWZ0LnNoCmluZGV4IDdlOTA1NzYuLjU0Y2QxMGEgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2dlbnRocmlmdC5zaAorKysgYi9zdG9ybS1jb3JlL3NyYy9nZW50aHJpZnQuc2gKQEAgLTE3LDcgKzE3LDcgQEAKIAogcm0gLXJmIGdlbi1qYXZhYmVhbiBnZW4tcHkgcHkKIHJtIC1yZiBqdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkCi10aHJpZnQgLS1nZW4gamF2YTpiZWFucyxoYXNoY29kZSxub2NhbWVsIC0tZ2VuIHB5OnV0ZjhzdHJpbmdzIHN0b3JtLnRocmlmdAordGhyaWZ0IC0tZ2VuIGphdmE6YmVhbnMsaGFzaGNvZGUsbm9jYW1lbCxnZW5lcmF0ZWRfYW5ub3RhdGlvbnM9dW5kYXRlZCAtLWdlbiBweTp1dGY4c3RyaW5ncyBzdG9ybS50aHJpZnQKIGZvciBmaWxlIGluIGdlbi1qYXZhYmVhbi9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvKiA7IGRvCiAgIGNhdCBqYXZhX2xpY2Vuc2VfaGVhZGVyLnR4dCAke2ZpbGV9ID4gJHtmaWxlfS50bXAKICAgbXYgLWYgJHtmaWxlfS50bXAgJHtmaWxlfQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL0NvbmZpZy5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL0NvbmZpZy5qYXZhCmluZGV4IDBlZmY1MWIuLjg5NDIyZjYgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9Db25maWcuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vQ29uZmlnLmphdmEKQEAgLTE5LDcgKzE5LDEwIEBACiAKIGltcG9ydCBiYWNrdHlwZS5zdG9ybS5zZXJpYWxpemF0aW9uLklLcnlvRGVjb3JhdG9yOwogaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnNlcmlhbGl6YXRpb24uSUtyeW9GYWN0b3J5OworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnZhbGlkYXRpb24uQ29uZmlnVmFsaWRhdGlvbkFubm90YXRpb25zLio7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0udmFsaWRhdGlvbi5Db25maWdWYWxpZGF0aW9uLio7CiBpbXBvcnQgY29tLmVzb3Rlcmljc29mdHdhcmUua3J5by5TZXJpYWxpemVyOworCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKQEAgLTMyLDcgKzM1LDcgQEAKICAqIHNlcmlhbGl6YXRpb25zLgogICoKICAqIDxwPlRoaXMgY2xhc3MgYWxzbyBwcm92aWRlcyBjb25zdGFudHMgZm9yIGFsbCB0aGUgY29uZmlndXJhdGlvbnMgcG9zc2libGUgb24KLSAqIGEgU3Rvcm0gY2x1c3RlciBhbmQgU3Rvcm0gdG9wb2xvZ3kuIEVhY2ggY29uc3RhbnQgaXMgcGFpcmVkIHdpdGggYSBzY2hlbWEKKyAqIGEgU3Rvcm0gY2x1c3RlciBhbmQgU3Rvcm0gdG9wb2xvZ3kuIEVhY2ggY29uc3RhbnQgaXMgcGFpcmVkIHdpdGggYW4gYW5ub3RhdGlvbgogICogdGhhdCBkZWZpbmVzIHRoZSB2YWxpZGl0eSBjcml0ZXJpb24gb2YgdGhlIGNvcnJlc3BvbmRpbmcgZmllbGQuIERlZmF1bHQKICAqIHZhbHVlcyBmb3IgdGhlc2UgY29uZmlncyBjYW4gYmUgZm91bmQgaW4gZGVmYXVsdHMueWFtbC48L3A+CiAgKgpAQCAtNTAsMTc4ICs1MywyMTMgQEAKICAgICAgKiBUaGlzIGlzIHBhcnQgb2YgYSB0ZW1wb3Jhcnkgd29ya2Fyb3VuZCB0byBhIFpLIGJ1ZywgaXQgaXMgdGhlICdzY2hlbWU6YWNsJyBmb3IKICAgICAgKiB0aGUgdXNlciBOaW1idXMgYW5kIFN1cGVydmlzb3JzIHVzZSB0byBhdXRoZW50aWNhdGUgd2l0aCBaSy4KICAgICAgKi8KKyAgICBAaXNTdHJpbmcKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVE9STV9aT09LRUVQRVJfU1VQRVJBQ0wgPSAic3Rvcm0uem9va2VlcGVyLnN1cGVyQUNMIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBTVE9STV9aT09LRUVQRVJfU1VQRVJBQ0xfU0NIRU1BID0gU3RyaW5nLmNsYXNzOwogCiAgICAgLyoqCiAgICAgICogVGhlIHRyYW5zcG9ydGVyIGZvciBjb21tdW5pY2F0aW9uIGFtb25nIFN0b3JtIHRhc2tzCiAgICAgICovCisgICAgQGlzU3RyaW5nCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RPUk1fTUVTU0FHSU5HX1RSQU5TUE9SVCA9ICJzdG9ybS5tZXNzYWdpbmcudHJhbnNwb3J0IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBTVE9STV9NRVNTQUdJTkdfVFJBTlNQT1JUX1NDSEVNQSA9IFN0cmluZy5jbGFzczsKIAogICAgIC8qKgogICAgICAqIE5ldHR5IGJhc2VkIG1lc3NhZ2luZzogVGhlIGJ1ZmZlciBzaXplIGZvciBzZW5kL3JlY3YgYnVmZmVyCiAgICAgICovCisgICAgQGlzSW50ZWdlcgorICAgIEBpc1Bvc2l0aXZlTnVtYmVyCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RPUk1fTUVTU0FHSU5HX05FVFRZX0JVRkZFUl9TSVpFID0gInN0b3JtLm1lc3NhZ2luZy5uZXR0eS5idWZmZXJfc2l6ZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgU1RPUk1fTUVTU0FHSU5HX05FVFRZX0JVRkZFUl9TSVpFX1NDSEVNQSA9IENvbmZpZ1ZhbGlkYXRpb24uSW50ZWdlclZhbGlkYXRvcjsKIAogICAgIC8qKgogICAgICAqIE5ldHR5IGJhc2VkIG1lc3NhZ2luZzogU2V0cyB0aGUgYmFja2xvZyB2YWx1ZSB0byBzcGVjaWZ5IHdoZW4gdGhlIGNoYW5uZWwgYmluZHMgdG8gYSBsb2NhbCBhZGRyZXNzCiAgICAgICovCisgICAgQGlzSW50ZWdlcgorICAgIEBpc1Bvc2l0aXZlTnVtYmVyCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RPUk1fTUVTU0FHSU5HX05FVFRZX1NPQ0tFVF9CQUNLTE9HID0gInN0b3JtLm1lc3NhZ2luZy5uZXR0eS5zb2NrZXQuYmFja2xvZyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgU1RPUk1fTUVTU0FHSU5HX05FVFRZX1NPQ0tFVF9CQUNLTE9HX1NDSEVNQSA9IENvbmZpZ1ZhbGlkYXRpb24uSW50ZWdlclZhbGlkYXRvcjsKIAogICAgIC8qKgogICAgICAqIE5ldHR5IGJhc2VkIG1lc3NhZ2luZzogVGhlIG1heCAjIG9mIHJldHJpZXMgdGhhdCBhIHBlZXIgd2lsbCBwZXJmb3JtIHdoZW4gYSByZW1vdGUgaXMgbm90IGFjY2Vzc2libGUKKyAgICAgKkBkZXByZWNhdGVkICJTaW5jZSBuZXR0eSBjbGllbnRzIHNob3VsZCBuZXZlciBzdG9wIHJlY29ubmVjdGluZyAtIHRoaXMgZG9lcyBub3QgbWFrZSBzZW5zZSBhbnltb3JlLgogICAgICAqLworICAgIEBEZXByZWNhdGVkCisgICAgQGlzSW50ZWdlcgogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUT1JNX01FU1NBR0lOR19ORVRUWV9NQVhfUkVUUklFUyA9ICJzdG9ybS5tZXNzYWdpbmcubmV0dHkubWF4X3JldHJpZXMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFNUT1JNX01FU1NBR0lOR19ORVRUWV9NQVhfUkVUUklFU19TQ0hFTUEgPSBDb25maWdWYWxpZGF0aW9uLkludGVnZXJWYWxpZGF0b3I7CiAKICAgICAvKioKICAgICAgKiBOZXR0eSBiYXNlZCBtZXNzYWdpbmc6IFRoZSBtaW4gIyBvZiBtaWxsaXNlY29uZHMgdGhhdCBhIHBlZXIgd2lsbCB3YWl0LgogICAgICAqLworICAgIEBpc0ludGVnZXIKKyAgICBAaXNQb3NpdGl2ZU51bWJlcihpbmNsdWRlWmVybyA9IHRydWUpCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RPUk1fTUVTU0FHSU5HX05FVFRZX01JTl9TTEVFUF9NUyA9ICJzdG9ybS5tZXNzYWdpbmcubmV0dHkubWluX3dhaXRfbXMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFNUT1JNX01FU1NBR0lOR19ORVRUWV9NSU5fU0xFRVBfTVNfU0NIRU1BID0gQ29uZmlnVmFsaWRhdGlvbi5JbnRlZ2VyVmFsaWRhdG9yOwogCiAgICAgLyoqCiAgICAgICogTmV0dHkgYmFzZWQgbWVzc2FnaW5nOiBUaGUgbWF4ICMgb2YgbWlsbGlzZWNvbmRzIHRoYXQgYSBwZWVyIHdpbGwgd2FpdC4KICAgICAgKi8KKyAgICBAaXNJbnRlZ2VyCisgICAgQGlzUG9zaXRpdmVOdW1iZXIoaW5jbHVkZVplcm8gPSB0cnVlKQogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUT1JNX01FU1NBR0lOR19ORVRUWV9NQVhfU0xFRVBfTVMgPSAic3Rvcm0ubWVzc2FnaW5nLm5ldHR5Lm1heF93YWl0X21zIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBTVE9STV9NRVNTQUdJTkdfTkVUVFlfTUFYX1NMRUVQX01TX1NDSEVNQSA9IENvbmZpZ1ZhbGlkYXRpb24uSW50ZWdlclZhbGlkYXRvcjsKIAogICAgIC8qKgogICAgICAqIE5ldHR5IGJhc2VkIG1lc3NhZ2luZzogVGhlICMgb2Ygd29ya2VyIHRocmVhZHMgZm9yIHRoZSBzZXJ2ZXIuCiAgICAgICovCisgICAgQGlzSW50ZWdlcgorICAgIEBpc1Bvc2l0aXZlTnVtYmVyKGluY2x1ZGVaZXJvID0gdHJ1ZSkKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVE9STV9NRVNTQUdJTkdfTkVUVFlfU0VSVkVSX1dPUktFUl9USFJFQURTID0gInN0b3JtLm1lc3NhZ2luZy5uZXR0eS5zZXJ2ZXJfd29ya2VyX3RocmVhZHMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFNUT1JNX01FU1NBR0lOR19ORVRUWV9TRVJWRVJfV09SS0VSX1RIUkVBRFNfU0NIRU1BID0gQ29uZmlnVmFsaWRhdGlvbi5JbnRlZ2VyVmFsaWRhdG9yOwogCiAgICAgLyoqCiAgICAgICogTmV0dHkgYmFzZWQgbWVzc2FnaW5nOiBUaGUgIyBvZiB3b3JrZXIgdGhyZWFkcyBmb3IgdGhlIGNsaWVudC4KICAgICAgKi8KKyAgICBAaXNJbnRlZ2VyCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RPUk1fTUVTU0FHSU5HX05FVFRZX0NMSUVOVF9XT1JLRVJfVEhSRUFEUyA9ICJzdG9ybS5tZXNzYWdpbmcubmV0dHkuY2xpZW50X3dvcmtlcl90aHJlYWRzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBTVE9STV9NRVNTQUdJTkdfTkVUVFlfQ0xJRU5UX1dPUktFUl9USFJFQURTX1NDSEVNQSA9IENvbmZpZ1ZhbGlkYXRpb24uSW50ZWdlclZhbGlkYXRvcjsKIAogICAgIC8qKgogICAgICAqIElmIHRoZSBOZXR0eSBtZXNzYWdpbmcgbGF5ZXIgaXMgYnVzeSwgdGhlIE5ldHR5IGNsaWVudCB3aWxsIHRyeSB0byBiYXRjaCBtZXNzYWdlIGFzIG1vcmUgYXMgcG9zc2libGUgdXAgdG8gdGhlIHNpemUgb2YgU1RPUk1fTkVUVFlfTUVTU0FHRV9CQVRDSF9TSVpFIGJ5dGVzCiAgICAgICovCisgICAgQGlzSW50ZWdlcgogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUT1JNX05FVFRZX01FU1NBR0VfQkFUQ0hfU0laRSA9ICJzdG9ybS5tZXNzYWdpbmcubmV0dHkudHJhbnNmZXIuYmF0Y2guc2l6ZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgU1RPUk1fTkVUVFlfTUVTU0FHRV9CQVRDSF9TSVpFX1NDSEVNQSA9IENvbmZpZ1ZhbGlkYXRpb24uSW50ZWdlclZhbGlkYXRvcjsKIAogICAgIC8qKgogICAgICAqIFdlIGNoZWNrIHdpdGggdGhpcyBpbnRlcnZhbCB0aGF0IHdoZXRoZXIgdGhlIE5ldHR5IGNoYW5uZWwgaXMgd3JpdGFibGUgYW5kIHRyeSB0byB3cml0ZSBwZW5kaW5nIG1lc3NhZ2VzCiAgICAgICovCisgICAgQGlzSW50ZWdlcgogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUT1JNX05FVFRZX0ZMVVNIX0NIRUNLX0lOVEVSVkFMX01TID0gInN0b3JtLm1lc3NhZ2luZy5uZXR0eS5mbHVzaC5jaGVjay5pbnRlcnZhbC5tcyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgU1RPUk1fTkVUVFlfRkxVU0hfQ0hFQ0tfSU5URVJWQUxfTVNfU0NIRU1BID0gQ29uZmlnVmFsaWRhdGlvbi5JbnRlZ2VyVmFsaWRhdG9yOwogCiAgICAgLyoqCiAgICAgICogTmV0dHkgYmFzZWQgbWVzc2FnaW5nOiBJcyBhdXRoZW50aWNhdGlvbiByZXF1aXJlZCBmb3IgTmV0dHkgbWVzc2FnaW5nIGZyb20gY2xpZW50IHdvcmtlciBwcm9jZXNzIHRvIHNlcnZlciB3b3JrZXIgcHJvY2Vzcy4KICAgICAgKi8KKyAgICBAaXNCb29sZWFuCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RPUk1fTUVTU0FHSU5HX05FVFRZX0FVVEhFTlRJQ0FUSU9OID0gInN0b3JtLm1lc3NhZ2luZy5uZXR0eS5hdXRoZW50aWNhdGlvbiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgU1RPUk1fTUVTU0FHSU5HX05FVFRZX0FVVEhFTlRJQ0FUSU9OX1NDSEVNQSA9IEJvb2xlYW4uY2xhc3M7CiAKICAgICAvKioKICAgICAgKiBUaGUgZGVsZWdhdGUgZm9yIHNlcmlhbGl6aW5nIG1ldGFkYXRhLCBzaG91bGQgYmUgdXNlZCBmb3Igc2VyaWFsaXplZCBvYmplY3RzIHN0b3JlZCBpbiB6b29rZWVwZXIgYW5kIG9uIGRpc2suCiAgICAgICogVGhpcyBpcyBOT1QgdXNlZCBmb3IgY29tcHJlc3Npbmcgc2VyaWFsaXplZCB0dXBsZXMgc2VudCBiZXR3ZWVuIHRvcG9sb2dpZXMuCiAgICAgICovCisgICAgQGlzU3RyaW5nCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RPUk1fTUVUQV9TRVJJQUxJWkFUSU9OX0RFTEVHQVRFID0gInN0b3JtLm1ldGEuc2VyaWFsaXphdGlvbi5kZWxlZ2F0ZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgU1RPUk1fTUVUQV9TRVJJQUxJWkFUSU9OX0RFTEVHQVRFX1NDSEVNQSA9IFN0cmluZy5jbGFzczsKIAogICAgIC8qKgogICAgICAqIEEgbGlzdCBvZiBob3N0cyBvZiBab29LZWVwZXIgc2VydmVycyB1c2VkIHRvIG1hbmFnZSB0aGUgY2x1c3Rlci4KICAgICAgKi8KKyAgICBAaXNTdHJpbmdMaXN0CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RPUk1fWk9PS0VFUEVSX1NFUlZFUlMgPSAic3Rvcm0uem9va2VlcGVyLnNlcnZlcnMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFNUT1JNX1pPT0tFRVBFUl9TRVJWRVJTX1NDSEVNQSA9IENvbmZpZ1ZhbGlkYXRpb24uU3RyaW5nc1ZhbGlkYXRvcjsKIAogICAgIC8qKgogICAgICAqIFRoZSBwb3J0IFN0b3JtIHdpbGwgdXNlIHRvIGNvbm5lY3QgdG8gZWFjaCBvZiB0aGUgWm9vS2VlcGVyIHNlcnZlcnMuCiAgICAgICovCisgICAgQGlzSW50ZWdlcgorICAgIEBpc1Bvc2l0aXZlTnVtYmVyCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RPUk1fWk9PS0VFUEVSX1BPUlQgPSAic3Rvcm0uem9va2VlcGVyLnBvcnQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFNUT1JNX1pPT0tFRVBFUl9QT1JUX1NDSEVNQSA9IENvbmZpZ1ZhbGlkYXRpb24uSW50ZWdlclZhbGlkYXRvcjsKIAogICAgIC8qKgogICAgICAqIEEgZGlyZWN0b3J5IG9uIHRoZSBsb2NhbCBmaWxlc3lzdGVtIHVzZWQgYnkgU3Rvcm0gZm9yIGFueSBsb2NhbAogICAgICAqIGZpbGVzeXN0ZW0gdXNhZ2UgaXQgbmVlZHMuIFRoZSBkaXJlY3RvcnkgbXVzdCBleGlzdCBhbmQgdGhlIFN0b3JtIGRhZW1vbnMgbXVzdAogICAgICAqIGhhdmUgcGVybWlzc2lvbiB0byByZWFkL3dyaXRlIGZyb20gdGhpcyBsb2NhdGlvbi4KICAgICAgKi8KKyAgICBAaXNTdHJpbmcKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVE9STV9MT0NBTF9ESVIgPSAic3Rvcm0ubG9jYWwuZGlyIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBTVE9STV9MT0NBTF9ESVJfU0NIRU1BID0gU3RyaW5nLmNsYXNzOwogCiAgICAgLyoqCiAgICAgICogQSBkaXJlY3RvcnkgdGhhdCBob2xkcyBjb25maWd1cmF0aW9uIGZpbGVzIGZvciBsb2c0ajIuCisgICAgICogSXQgY2FuIGJlIGVpdGhlciBhIHJlbGF0aXZlIG9yIGFuIGFic29sdXRlIGRpcmVjdG9yeS4KKyAgICAgKiBJZiByZWxhdGl2ZSwgaXQgaXMgcmVsYXRpdmUgdG8gdGhlIHN0b3JtJ3MgaG9tZSBkaXJlY3RvcnkuCiAgICAgICovCisgICAgQGlzU3RyaW5nCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RPUk1fTE9HNEoyX0NPTkZfRElSID0gInN0b3JtLmxvZzRqMi5jb25mLmRpciI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgU1RPUk1fTE9HNEoyX0NPTkZfRElSX1NDSEVNQSA9IFN0cmluZy5jbGFzczsKIAogICAgIC8qKgotICAgICAqIEEgZ2xvYmFsIHRhc2sgc2NoZWR1bGVyIHVzZWQgdG8gYXNzaWduIHRvcG9sb2dpZXMncyB0YXNrcyB0byBzdXBlcnZpc29ycycgd29rZXJzLgorICAgICAqIEEgZ2xvYmFsIHRhc2sgc2NoZWR1bGVyIHVzZWQgdG8gYXNzaWduIHRvcG9sb2dpZXMncyB0YXNrcyB0byBzdXBlcnZpc29ycycgd29ya2Vycy4KICAgICAgKgogICAgICAqIElmIHRoaXMgaXMgbm90IHNldCwgYSBkZWZhdWx0IHN5c3RlbSBzY2hlZHVsZXIgd2lsbCBiZSB1c2VkLgogICAgICAqLworICAgIEBpc1N0cmluZwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUT1JNX1NDSEVEVUxFUiA9ICJzdG9ybS5zY2hlZHVsZXIiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFNUT1JNX1NDSEVEVUxFUl9TQ0hFTUEgPSBTdHJpbmcuY2xhc3M7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHdlIHdhbnQgdG8gZGlzcGxheSBhbGwgdGhlIHJlc291cmNlIGNhcGFjaXR5IGFuZCBzY2hlZHVsZWQgdXNhZ2Ugb24gdGhlIFVJIHBhZ2UuCisgICAgICogV2Ugc3VnZ2VzdCB0byBoYXZlIHRoaXMgdmFyaWFibGUgc2V0IGlmIHlvdSBhcmUgdXNpbmcgYW55IGtpbmQgb2YgcmVzb3VyY2UtcmVsYXRlZCBzY2hlZHVsZXIuCisgICAgICoKKyAgICAgKiBJZiB0aGlzIGlzIG5vdCBzZXQsIHdlIHdpbGwgbm90IGRpc3BsYXkgcmVzb3VyY2UgY2FwYWNpdHkgYW5kIHVzYWdlIG9uIHRoZSBVSS4KKyAgICAgKi8KKyAgICBAaXNCb29sZWFuCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRURVTEVSX0RJU1BMQVlfUkVTT1VSQ0UgPSAic2NoZWR1bGVyLmRpc3BsYXkucmVzb3VyY2UiOwogCiAgICAgLyoqCiAgICAgICogVGhlIG1vZGUgdGhpcyBTdG9ybSBjbHVzdGVyIGlzIHJ1bm5pbmcgaW4uIEVpdGhlciAiZGlzdHJpYnV0ZWQiIG9yICJsb2NhbCIuCiAgICAgICovCisgICAgQGlzU3RyaW5nCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RPUk1fQ0xVU1RFUl9NT0RFID0gInN0b3JtLmNsdXN0ZXIubW9kZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgU1RPUk1fQ0xVU1RFUl9NT0RFX1NDSEVNQSA9IFN0cmluZy5jbGFzczsKKworICAgIC8qKgorICAgICAqIFdoYXQgTmV0d29yayBUb3BvZ3JhcGh5IGRldGVjdGlvbiBjbGFzc2VzIHNob3VsZCB3ZSB1c2UuCisgICAgICogR2l2ZW4gYSBsaXN0IG9mIHN1cGVydmlzb3IgaG9zdG5hbWVzIChvciBJUCBhZGRyZXNzZXMpLCB0aGlzIGNsYXNzIHdvdWxkIHJldHVybiBhIGxpc3Qgb2YKKyAgICAgKiByYWNrIG5hbWVzIHRoYXQgY29ycmVzcG9uZCB0byB0aGUgc3VwZXJ2aXNvcnMuIFRoaXMgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGluIENsdXN0ZXIuamF2YSwgYW5kCisgICAgICogaXMgdXNlZCBpbiB0aGUgcmVzb3VyY2UgYXdhcmUgc2NoZWR1bGVyLgorICAgICAqLworICAgIEBpc1N0cmluZworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUT1JNX05FVFdPUktfVE9QT0dSQVBIWV9QTFVHSU4gPSAic3Rvcm0ubmV0d29yay50b3BvZ3JhcGh5LnBsdWdpbiI7CiAKICAgICAvKioKICAgICAgKiBUaGUgaG9zdG5hbWUgdGhlIHN1cGVydmlzb3JzL3dvcmtlcnMgc2hvdWxkIHJlcG9ydCB0byBuaW1idXMuIElmIHVuc2V0LCBTdG9ybSB3aWxsCiAgICAgICogZ2V0IHRoZSBob3N0bmFtZSB0byByZXBvcnQgYnkgY2FsbGluZyA8Y29kZT5JbmV0QWRkcmVzcy5nZXRMb2NhbEhvc3QoKS5nZXRDYW5vbmljYWxIb3N0TmFtZSgpPC9jb2RlPi4KICAgICAgKgotICAgICAqIFlvdSBzaG91bGQgc2V0IHRoaXMgY29uZmlnIHdoZW4geW91IGRvbnQgaGF2ZSBhIEROUyB3aGljaCBzdXBlcnZpc29ycy93b3JrZXJzCisgICAgICogWW91IHNob3VsZCBzZXQgdGhpcyBjb25maWcgd2hlbiB5b3UgZG9uJ3QgaGF2ZSBhIEROUyB3aGljaCBzdXBlcnZpc29ycy93b3JrZXJzCiAgICAgICogY2FuIHV0aWxpemUgdG8gZmluZCBlYWNoIG90aGVyIGJhc2VkIG9uIGhvc3RuYW1lIGdvdCBmcm9tIGNhbGxzIHRvCiAgICAgICogPGNvZGU+SW5ldEFkZHJlc3MuZ2V0TG9jYWxIb3N0KCkuZ2V0Q2Fub25pY2FsSG9zdE5hbWUoKTwvY29kZT4uCiAgICAgICovCisgICAgQGlzU3RyaW5nCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RPUk1fTE9DQUxfSE9TVE5BTUUgPSAic3Rvcm0ubG9jYWwuaG9zdG5hbWUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFNUT1JNX0xPQ0FMX0hPU1ROQU1FX1NDSEVNQSA9IFN0cmluZy5jbGFzczsKIAogICAgIC8qKgogICAgICAqIFRoZSBwbHVnaW4gdGhhdCB3aWxsIGNvbnZlcnQgYSBwcmluY2lwYWwgdG8gYSBsb2NhbCB1c2VyLgogICAgICAqLworICAgIEBpc1N0cmluZwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUT1JNX1BSSU5DSVBBTF9UT19MT0NBTF9QTFVHSU4gPSAic3Rvcm0ucHJpbmNpcGFsLnRvbG9jYWwiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFNUT1JNX1BSSU5DSVBBTF9UT19MT0NBTF9QTFVHSU5fU0NIRU1BID0gU3RyaW5nLmNsYXNzOwogCiAgICAgLyoqCiAgICAgICogVGhlIHBsdWdpbiB0aGF0IHdpbGwgcHJvdmlkZSB1c2VyIGdyb3VwcyBzZXJ2aWNlCiAgICAgICovCisgICAgQGlzU3RyaW5nCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RPUk1fR1JPVVBfTUFQUElOR19TRVJWSUNFX1BST1ZJREVSX1BMVUdJTiA9ICJzdG9ybS5ncm91cC5tYXBwaW5nLnNlcnZpY2UiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFNUT1JNX0dST1VQX01BUFBJTkdfU0VSVklDRV9QUk9WSURFUl9QTFVHSU5fU0NIRU1BID0gU3RyaW5nLmNsYXNzOwogCiAgICAgLyoqCiAgICAgICogTWF4IG5vLm9mIHNlY29uZHMgZ3JvdXAgbWFwcGluZyBzZXJ2aWNlIHdpbGwgY2FjaGUgdXNlciBncm91cHMKICAgICAgKi8KKyAgICBAaXNJbnRlZ2VyCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RPUk1fR1JPVVBfTUFQUElOR19TRVJWSUNFX0NBQ0hFX0RVUkFUSU9OX1NFQ1MgPSAic3Rvcm0uZ3JvdXAubWFwcGluZy5zZXJ2aWNlLmNhY2hlLmR1cmF0aW9uLnNlY3MiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFNUT1JNX0dST1VQX01BUFBJTkdfU0VSVklDRV9DQUNIRV9EVVJBVElPTl9TRUNTX1NDSEVNQSA9IE51bWJlci5jbGFzczsKIAogICAgIC8qKgogICAgICAqIEluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMgZm9yIHRoZSBncm91cCBtYXBwaW5nIHNlcnZpY2UgcGx1Z2luLgogICAgICAqIFByb3ZpZGVzIGEgd2F5IGZvciBhIEBsaW5re1NUT1JNX0dST1VQX01BUFBJTkdfU0VSVklDRV9QUk9WSURFUl9QTFVHSU59CiAgICAgICogaW1wbGVtZW50YXRpb24gdG8gYWNjZXNzIG9wdGlvbmFsIHNldHRpbmdzLgogICAgICAqLworICAgIEBpc1R5cGUodHlwZT1NYXAuY2xhc3MpCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RPUk1fR1JPVVBfTUFQUElOR19TRVJWSUNFX1BBUkFNUyA9ICJzdG9ybS5ncm91cC5tYXBwaW5nLnNlcnZpY2UucGFyYW1zIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBTVE9STV9HUk9VUF9NQVBQSU5HX1NFUlZJQ0VfUEFSQU1TX1NDSEVNQSA9IE1hcC5jbGFzczsKIAogICAgIC8qKgogICAgICAqIFRoZSBkZWZhdWx0IHRyYW5zcG9ydCBwbHVnLWluIGZvciBUaHJpZnQgY2xpZW50L3NlcnZlciBjb21tdW5pY2F0aW9uCiAgICAgICovCisgICAgQGlzU3RyaW5nCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RPUk1fVEhSSUZUX1RSQU5TUE9SVF9QTFVHSU4gPSAic3Rvcm0udGhyaWZ0LnRyYW5zcG9ydCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgU1RPUk1fVEhSSUZUX1RSQU5TUE9SVF9QTFVHSU5fU0NIRU1BID0gU3RyaW5nLmNsYXNzOwogCiAgICAgLyoqCiAgICAgICogVGhlIHNlcmlhbGl6ZXIgY2xhc3MgZm9yIExpc3REZWxlZ2F0ZSAodHVwbGUgcGF5bG9hZCkuCiAgICAgICogVGhlIGRlZmF1bHQgc2VyaWFsaXplciB3aWxsIGJlIExpc3REZWxlZ2F0ZVNlcmlhbGl6ZXIKICAgICAgKi8KKyAgICBAaXNTdHJpbmcKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BPTE9HWV9UVVBMRV9TRVJJQUxJWkVSID0gInRvcG9sb2d5LnR1cGxlLnNlcmlhbGl6ZXIiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFRPUE9MT0dZX1RVUExFX1NFUklBTElaRVJfU0NIRU1BID0gU3RyaW5nLmNsYXNzOworCisgICAgLyoqCisgICAgICogRGlzYWJsZSBsb2FkIGF3YXJlIGdyb3VwaW5nIHN1cHBvcnQuCisgICAgICovCisgICAgQGlzQm9vbGVhbgorICAgIEBOb3ROdWxsCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QT0xPR1lfRElTQUJMRV9MT0FEQVdBUkVfTUVTU0FHSU5HID0gInRvcG9sb2d5LmRpc2FibGUubG9hZGF3YXJlLm1lc3NhZ2luZyI7CiAKICAgICAvKioKICAgICAgKiBUcnkgdG8gc2VyaWFsaXplIGFsbCB0dXBsZXMsIGV2ZW4gZm9yIGxvY2FsIHRyYW5zZmVycy4gIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZAogICAgICAqIGZvciB0ZXN0aW5nLCBhcyBhIHNhbml0eSBjaGVjayB0aGF0IGFsbCBvZiB5b3VyIHR1cGxlcyBhcmUgc2V0dXAgcHJvcGVybHkuCiAgICAgICovCisgICAgQGlzQm9vbGVhbgogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUE9MT0dZX1RFU1RJTkdfQUxXQVlTX1RSWV9TRVJJQUxJWkUgPSAidG9wb2xvZ3kudGVzdGluZy5hbHdheXMudHJ5LnNlcmlhbGl6ZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgVE9QT0xPR1lfVEVTVElOR19BTFdBWVNfVFJZX1NFUklBTElaRV9TQ0hFTUEgPSBCb29sZWFuLmNsYXNzOwogCiAgICAgLyoqCiAgICAgICogV2hldGhlciBvciBub3QgdG8gdXNlIFplcm9NUSBmb3IgbWVzc2FnaW5nIGluIGxvY2FsIG1vZGUuIElmIHRoaXMgaXMgc2V0CkBAIC0yMzEsNTAgKzI2OSw1MCBAQAogICAgICAqCiAgICAgICogRGVmYXVsdHMgdG8gZmFsc2UuCiAgICAgICovCisgICAgQGlzQm9vbGVhbgogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUT1JNX0xPQ0FMX01PREVfWk1RID0gInN0b3JtLmxvY2FsLm1vZGUuem1xIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBTVE9STV9MT0NBTF9NT0RFX1pNUV9TQ0hFTUEgPSBCb29sZWFuLmNsYXNzOwogCiAgICAgLyoqCiAgICAgICogVGhlIHJvb3QgbG9jYXRpb24gYXQgd2hpY2ggU3Rvcm0gc3RvcmVzIGRhdGEgaW4gWm9vS2VlcGVyLgogICAgICAqLworICAgIEBpc1N0cmluZwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUT1JNX1pPT0tFRVBFUl9ST09UID0gInN0b3JtLnpvb2tlZXBlci5yb290IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBTVE9STV9aT09LRUVQRVJfUk9PVF9TQ0hFTUEgPSBTdHJpbmcuY2xhc3M7CiAKICAgICAvKioKICAgICAgKiBUaGUgc2Vzc2lvbiB0aW1lb3V0IGZvciBjbGllbnRzIHRvIFpvb0tlZXBlci4KICAgICAgKi8KKyAgICBAaXNJbnRlZ2VyCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RPUk1fWk9PS0VFUEVSX1NFU1NJT05fVElNRU9VVCA9ICJzdG9ybS56b29rZWVwZXIuc2Vzc2lvbi50aW1lb3V0IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBTVE9STV9aT09LRUVQRVJfU0VTU0lPTl9USU1FT1VUX1NDSEVNQSA9IENvbmZpZ1ZhbGlkYXRpb24uSW50ZWdlclZhbGlkYXRvcjsKIAogICAgIC8qKgogICAgICAqIFRoZSBjb25uZWN0aW9uIHRpbWVvdXQgZm9yIGNsaWVudHMgdG8gWm9vS2VlcGVyLgogICAgICAqLworICAgIEBpc0ludGVnZXIKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVE9STV9aT09LRUVQRVJfQ09OTkVDVElPTl9USU1FT1VUID0gInN0b3JtLnpvb2tlZXBlci5jb25uZWN0aW9uLnRpbWVvdXQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFNUT1JNX1pPT0tFRVBFUl9DT05ORUNUSU9OX1RJTUVPVVRfU0NIRU1BID0gQ29uZmlnVmFsaWRhdGlvbi5JbnRlZ2VyVmFsaWRhdG9yOwogCiAgICAgLyoqCiAgICAgICogVGhlIG51bWJlciBvZiB0aW1lcyB0byByZXRyeSBhIFpvb2tlZXBlciBvcGVyYXRpb24uCiAgICAgICovCisgICAgQGlzSW50ZWdlcgogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUT1JNX1pPT0tFRVBFUl9SRVRSWV9USU1FUz0ic3Rvcm0uem9va2VlcGVyLnJldHJ5LnRpbWVzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBTVE9STV9aT09LRUVQRVJfUkVUUllfVElNRVNfU0NIRU1BID0gQ29uZmlnVmFsaWRhdGlvbi5JbnRlZ2VyVmFsaWRhdG9yOwogCiAgICAgLyoqCiAgICAgICogVGhlIGludGVydmFsIGJldHdlZW4gcmV0cmllcyBvZiBhIFpvb2tlZXBlciBvcGVyYXRpb24uCiAgICAgICovCisgICAgQGlzSW50ZWdlcgogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUT1JNX1pPT0tFRVBFUl9SRVRSWV9JTlRFUlZBTD0ic3Rvcm0uem9va2VlcGVyLnJldHJ5LmludGVydmFsIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBTVE9STV9aT09LRUVQRVJfUkVUUllfSU5URVJWQUxfU0NIRU1BID0gQ29uZmlnVmFsaWRhdGlvbi5JbnRlZ2VyVmFsaWRhdG9yOwogCiAgICAgLyoqCiAgICAgICogVGhlIGNlaWxpbmcgb2YgdGhlIGludGVydmFsIGJldHdlZW4gcmV0cmllcyBvZiBhIFpvb2tlZXBlciBvcGVyYXRpb24uCiAgICAgICovCisgICAgQGlzSW50ZWdlcgogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUT1JNX1pPT0tFRVBFUl9SRVRSWV9JTlRFUlZBTF9DRUlMSU5HPSJzdG9ybS56b29rZWVwZXIucmV0cnkuaW50ZXJ2YWxjZWlsaW5nLm1pbGxpcyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgU1RPUk1fWk9PS0VFUEVSX1JFVFJZX0lOVEVSVkFMX0NFSUxJTkdfU0NIRU1BID0gQ29uZmlnVmFsaWRhdGlvbi5JbnRlZ2VyVmFsaWRhdG9yOwogCiAgICAgLyoqCiAgICAgICogVGhlIGNsdXN0ZXIgWm9va2VlcGVyIGF1dGhlbnRpY2F0aW9uIHNjaGVtZSB0byB1c2UsIGUuZy4gImRpZ2VzdCIuIERlZmF1bHRzIHRvIG5vIGF1dGhlbnRpY2F0aW9uLgogICAgICAqLworICAgIEBpc1N0cmluZwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUT1JNX1pPT0tFRVBFUl9BVVRIX1NDSEVNRT0ic3Rvcm0uem9va2VlcGVyLmF1dGguc2NoZW1lIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBTVE9STV9aT09LRUVQRVJfQVVUSF9TQ0hFTUVfU0NIRU1BID0gU3RyaW5nLmNsYXNzOwogCiAgICAgLyoqCiAgICAgICogQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBwYXlsb2FkIGZvciBjbHVzdGVyIFpvb2tlZXBlciBhdXRoZW50aWNhdGlvbi4KQEAgLTI4NSwxNDQgKzMyMywxNzcgQEAKICAgICAgKiBUaGlzIGZpbGUgc3Rvcm0tY2x1c3Rlci1hdXRoLnlhbWwgc2hvdWxkIHRoZW4gYmUgcHJvdGVjdGVkIHdpdGgKICAgICAgKiBhcHByb3ByaWF0ZSBwZXJtaXNzaW9ucyB0aGF0IGRlbnkgYWNjZXNzIGZyb20gd29ya2Vycy4KICAgICAgKi8KKyAgICBAaXNTdHJpbmcKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVE9STV9aT09LRUVQRVJfQVVUSF9QQVlMT0FEPSJzdG9ybS56b29rZWVwZXIuYXV0aC5wYXlsb2FkIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBTVE9STV9aT09LRUVQRVJfQVVUSF9QQVlMT0FEX1NDSEVNQSA9IFN0cmluZy5jbGFzczsKIAogICAgIC8qKgogICAgICAqIFRoZSB0b3BvbG9neSBab29rZWVwZXIgYXV0aGVudGljYXRpb24gc2NoZW1lIHRvIHVzZSwgZS5nLiAiZGlnZXN0Ii4gRGVmYXVsdHMgdG8gbm8gYXV0aGVudGljYXRpb24uCiAgICAgICovCisgICAgQGlzU3RyaW5nCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RPUk1fWk9PS0VFUEVSX1RPUE9MT0dZX0FVVEhfU0NIRU1FPSJzdG9ybS56b29rZWVwZXIudG9wb2xvZ3kuYXV0aC5zY2hlbWUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFNUT1JNX1pPT0tFRVBFUl9UT1BPTE9HWV9BVVRIX1NDSEVNRV9TQ0hFTUEgPSBTdHJpbmcuY2xhc3M7CiAKICAgICAvKioKICAgICAgKiBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHBheWxvYWQgZm9yIHRvcG9sb2d5IFpvb2tlZXBlciBhdXRoZW50aWNhdGlvbi4gSXQgZ2V0cyBzZXJpYWxpemVkIHVzaW5nIFVURi04IGVuY29kaW5nIGR1cmluZyBhdXRoZW50aWNhdGlvbi4KICAgICAgKi8KKyAgICBAaXNTdHJpbmcKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVE9STV9aT09LRUVQRVJfVE9QT0xPR1lfQVVUSF9QQVlMT0FEPSJzdG9ybS56b29rZWVwZXIudG9wb2xvZ3kuYXV0aC5wYXlsb2FkIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBTVE9STV9aT09LRUVQRVJfVE9QT0xPR1lfQVVUSF9QQVlMT0FEX1NDSEVNQSA9IFN0cmluZy5jbGFzczsKIAogICAgIC8qKgogICAgICAqIFRoZSBpZCBhc3NpZ25lZCB0byBhIHJ1bm5pbmcgdG9wb2xvZ3kuIFRoZSBpZCBpcyB0aGUgc3Rvcm0gbmFtZSB3aXRoIGEgdW5pcXVlIG5vbmNlIGFwcGVuZGVkLgogICAgICAqLworICAgIEBpc1N0cmluZwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUT1JNX0lEID0gInN0b3JtLmlkIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBTVE9STV9JRF9TQ0hFTUEgPSBTdHJpbmcuY2xhc3M7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGlyZWN0b3J5IHdoZXJlIHN0b3JtJ3MgaGVhbHRoIHNjcmlwdHMgZ28uCisgICAgICovCisgICAgQGlzU3RyaW5nCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RPUk1fSEVBTFRIX0NIRUNLX0RJUiA9ICJzdG9ybS5oZWFsdGguY2hlY2suZGlyIjsKKworICAgIC8qKgorICAgICAqIFRoZSB0aW1lIHRvIGFsbG93IGFueSBnaXZlbiBoZWFsdGhjaGVjayBzY3JpcHQgdG8gcnVuIGJlZm9yZSBpdAorICAgICAqIGlzIG1hcmtlZCBmYWlsZWQgZHVlIHRvIHRpbWVvdXQKKyAgICAgKi8KKyAgICBAaXNOdW1iZXIKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVE9STV9IRUFMVEhfQ0hFQ0tfVElNRU9VVF9NUyA9ICJzdG9ybS5oZWFsdGguY2hlY2sudGltZW91dC5tcyI7CiAKICAgICAvKioKICAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRvIHJldHJ5IGEgTmltYnVzIG9wZXJhdGlvbi4KICAgICAgKi8KKyAgICBAaXNOdW1iZXIKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVE9STV9OSU1CVVNfUkVUUllfVElNRVM9InN0b3JtLm5pbWJ1cy5yZXRyeS50aW1lcyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgU1RPUk1fTklNQlVTX1JFVFJZX1RJTUVTX1NDSEVNQSA9IE51bWJlci5jbGFzczsKIAogICAgIC8qKgogICAgICAqIFRoZSBzdGFydGluZyBpbnRlcnZhbCBiZXR3ZWVuIGV4cG9uZW50aWFsIGJhY2tvZmYgcmV0cmllcyBvZiBhIE5pbWJ1cyBvcGVyYXRpb24uCiAgICAgICovCisgICAgQGlzTnVtYmVyCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RPUk1fTklNQlVTX1JFVFJZX0lOVEVSVkFMPSJzdG9ybS5uaW1idXMucmV0cnkuaW50ZXJ2YWwubWlsbGlzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBTVE9STV9OSU1CVVNfUkVUUllfSU5URVJWQUxfU0NIRU1BID0gTnVtYmVyLmNsYXNzOwogCiAgICAgLyoqCiAgICAgICogVGhlIGNlaWxpbmcgb2YgdGhlIGludGVydmFsIGJldHdlZW4gcmV0cmllcyBvZiBhIGNsaWVudCBjb25uZWN0IHRvIE5pbWJ1cyBvcGVyYXRpb24uCiAgICAgICovCisgICAgQGlzTnVtYmVyCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RPUk1fTklNQlVTX1JFVFJZX0lOVEVSVkFMX0NFSUxJTkc9InN0b3JtLm5pbWJ1cy5yZXRyeS5pbnRlcnZhbGNlaWxpbmcubWlsbGlzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBTVE9STV9OSU1CVVNfUkVUUllfSU5URVJWQUxfQ0VJTElOR19TQ0hFTUEgPSBOdW1iZXIuY2xhc3M7CisKKyAgICAvKioKKyAgICAgKiBUaGUgQ2x1c3RlclN0YXRlIGZhY3RvcnkgdGhhdCB3b3JrZXIgd2lsbCB1c2UgdG8gY3JlYXRlIGEgQ2x1c3RlclN0YXRlCisgICAgICogdG8gc3RvcmUgc3RhdGUgaW4uIERlZmF1bHRzIHRvIFpvb0tlZXBlci4KKyAgICAgKi8KKyAgICBAaXNTdHJpbmcKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVE9STV9DTFVTVEVSX1NUQVRFX1NUT1JFID0gInN0b3JtLmNsdXN0ZXIuc3RhdGUuc3RvcmUiOwogCiAgICAgLyoqCiAgICAgICogVGhlIE5pbWJ1cyB0cmFuc3BvcnQgcGx1Zy1pbiBmb3IgVGhyaWZ0IGNsaWVudC9zZXJ2ZXIgY29tbXVuaWNhdGlvbgogICAgICAqLworICAgIEBpc1N0cmluZwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5JTUJVU19USFJJRlRfVFJBTlNQT1JUX1BMVUdJTiA9ICJuaW1idXMudGhyaWZ0LnRyYW5zcG9ydCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgTklNQlVTX1RIUklGVF9UUkFOU1BPUlRfUExVR0lOX1NDSEVNQSA9IFN0cmluZy5jbGFzczsKIAogICAgIC8qKgogICAgICAqIFRoZSBob3N0IHRoYXQgdGhlIG1hc3RlciBzZXJ2ZXIgaXMgcnVubmluZyBvbiwgYWRkZWQgb25seSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwKICAgICAgKiB0aGUgdXNhZ2UgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBuaW1idXMuc2VlZHMgY29uZmlnLgogICAgICAqLwogICAgIEBEZXByZWNhdGVkCisgICAgQGlzU3RyaW5nCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTklNQlVTX0hPU1QgPSAibmltYnVzLmhvc3QiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IE5JTUJVU19IT1NUX1NDSEVNQSA9IFN0cmluZy5jbGFzczsKIAogICAgIC8qKgogICAgICAqIExpc3Qgb2Ygc2VlZCBuaW1idXMgaG9zdHMgdG8gdXNlIGZvciBsZWFkZXIgbmltYnVzIGRpc2NvdmVyeS4KICAgICAgKi8KKyAgICBAaXNTdHJpbmdMaXN0CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTklNQlVTX1NFRURTID0gIm5pbWJ1cy5zZWVkcyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgTklNQlVTX1NFRURTX1NDSEVNQSA9IENvbmZpZ1ZhbGlkYXRpb24uU3RyaW5nc1ZhbGlkYXRvcjsKIAogICAgIC8qKgogICAgICAqIFdoaWNoIHBvcnQgdGhlIFRocmlmdCBpbnRlcmZhY2Ugb2YgTmltYnVzIHNob3VsZCBydW4gb24uIENsaWVudHMgc2hvdWxkCiAgICAgICogY29ubmVjdCB0byB0aGlzIHBvcnQgdG8gdXBsb2FkIGphcnMgYW5kIHN1Ym1pdCB0b3BvbG9naWVzLgogICAgICAqLworICAgIEBpc0ludGVnZXIKKyAgICBAaXNQb3NpdGl2ZU51bWJlcgogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5JTUJVU19USFJJRlRfUE9SVCA9ICJuaW1idXMudGhyaWZ0LnBvcnQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IE5JTUJVU19USFJJRlRfUE9SVF9TQ0hFTUEgPSBDb25maWdWYWxpZGF0aW9uLkludGVnZXJWYWxpZGF0b3I7CiAKICAgICAvKioKICAgICAgKiBUaGUgbnVtYmVyIG9mIHRocmVhZHMgdGhhdCBzaG91bGQgYmUgdXNlZCBieSB0aGUgbmltYnVzIHRocmlmdCBzZXJ2ZXIuCiAgICAgICovCisgICAgQGlzSW50ZWdlcgorICAgIEBpc1Bvc2l0aXZlTnVtYmVyCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTklNQlVTX1RIUklGVF9USFJFQURTID0gIm5pbWJ1cy50aHJpZnQudGhyZWFkcyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgTklNQlVTX1RIUklGVF9USFJFQURTX1NDSEVNQSA9IE51bWJlci5jbGFzczsKIAogICAgIC8qKgogICAgICAqIEEgbGlzdCBvZiB1c2VycyB0aGF0IGFyZSBjbHVzdGVyIGFkbWlucyBhbmQgY2FuIHJ1biBhbnkgY29tbWFuZC4gIFRvIHVzZSB0aGlzIHNldAogICAgICAqIG5pbWJ1cy5hdXRob3JpemVyIHRvIGJhY2t0eXBlLnN0b3JtLnNlY3VyaXR5LmF1dGguYXV0aG9yaXplci5TaW1wbGVBQ0xBdXRob3JpemVyCiAgICAgICovCisgICAgQGlzU3RyaW5nTGlzdAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5JTUJVU19BRE1JTlMgPSAibmltYnVzLmFkbWlucyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgTklNQlVTX0FETUlOU19TQ0hFTUEgPSBDb25maWdWYWxpZGF0aW9uLlN0cmluZ3NWYWxpZGF0b3I7CiAKICAgICAvKioKICAgICAgKiBBIGxpc3Qgb2YgdXNlcnMgdGhhdCBhcmUgdGhlIG9ubHkgb25lcyBhbGxvd2VkIHRvIHJ1biB1c2VyIG9wZXJhdGlvbiBvbiBzdG9ybSBjbHVzdGVyLgogICAgICAqIFRvIHVzZSB0aGlzIHNldCBuaW1idXMuYXV0aG9yaXplciB0byBiYWNrdHlwZS5zdG9ybS5zZWN1cml0eS5hdXRoLmF1dGhvcml6ZXIuU2ltcGxlQUNMQXV0aG9yaXplcgogICAgICAqLworICAgIEBpc1N0cmluZ0xpc3QKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOSU1CVVNfVVNFUlMgPSAibmltYnVzLnVzZXJzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBOSU1CVVNfVVNFUlNfU0NIRU1BID0gQ29uZmlnVmFsaWRhdGlvbi5TdHJpbmdzVmFsaWRhdG9yOwogCiAgICAgLyoqCiAgICAgICogQSBsaXN0IG9mIGdyb3VwcyAsIHVzZXJzIGJlbG9uZyB0byB0aGVzZSBncm91cHMgYXJlIHRoZSBvbmx5IG9uZXMgYWxsb3dlZCB0byBydW4gdXNlciBvcGVyYXRpb24gb24gc3Rvcm0gY2x1c3Rlci4KICAgICAgKiBUbyB1c2UgdGhpcyBzZXQgbmltYnVzLmF1dGhvcml6ZXIgdG8gYmFja3R5cGUuc3Rvcm0uc2VjdXJpdHkuYXV0aC5hdXRob3JpemVyLlNpbXBsZUFDTEF1dGhvcml6ZXIKICAgICAgKi8KKyAgICBAaXNTdHJpbmdMaXN0CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTklNQlVTX0dST1VQUyA9ICJuaW1idXMuZ3JvdXBzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBOSU1CVVNfR1JPVVBTX1NDSEVNQSA9IENvbmZpZ1ZhbGlkYXRpb24uU3RyaW5nc1ZhbGlkYXRvcjsKIAogICAgIC8qKgogICAgICAqIEEgbGlzdCBvZiB1c2VycyB0aGF0IHJ1biB0aGUgc3VwZXJ2aXNvcnMgYW5kIHNob3VsZCBiZSBhdXRob3JpemVkIHRvIGludGVyYWN0IHdpdGgKICAgICAgKiBuaW1idXMgYXMgYSBzdXBlcnZpc29yIHdvdWxkLiAgVG8gdXNlIHRoaXMgc2V0CiAgICAgICogbmltYnVzLmF1dGhvcml6ZXIgdG8gYmFja3R5cGUuc3Rvcm0uc2VjdXJpdHkuYXV0aC5hdXRob3JpemVyLlNpbXBsZUFDTEF1dGhvcml6ZXIKICAgICAgKi8KKyAgICBAaXNTdHJpbmdMaXN0CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTklNQlVTX1NVUEVSVklTT1JfVVNFUlMgPSAibmltYnVzLnN1cGVydmlzb3IudXNlcnMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IE5JTUJVU19TVVBFUlZJU09SX1VTRVJTX1NDSEVNQSA9IENvbmZpZ1ZhbGlkYXRpb24uU3RyaW5nc1ZhbGlkYXRvcjsKKworICAgIC8qKgorICAgICAqIFRoaXMgaXMgdGhlIHVzZXIgdGhhdCB0aGUgTmltYnVzIGRhZW1vbiBwcm9jZXNzIGlzIHJ1bm5pbmcgYXMuIE1heSBiZSB1c2VkIHdoZW4gc2VjdXJpdHkKKyAgICAgKiBpcyBlbmFibGVkIHRvIGF1dGhvcml6ZSBhY3Rpb25zIGluIHRoZSBjbHVzdGVyLgorICAgICAqLworICAgIEBpc1N0cmluZworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5JTUJVU19EQUVNT05fVVNFUiA9ICJuaW1idXMuZGFlbW9uLnVzZXIiOwogCiAgICAgLyoqCiAgICAgICogVGhlIG1heGltdW0gYnVmZmVyIHNpemUgdGhyaWZ0IHNob3VsZCB1c2Ugd2hlbiByZWFkaW5nIG1lc3NhZ2VzLgogICAgICAqLworICAgIEBpc0ludGVnZXIKKyAgICBAaXNQb3NpdGl2ZU51bWJlcgogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5JTUJVU19USFJJRlRfTUFYX0JVRkZFUl9TSVpFID0gIm5pbWJ1cy50aHJpZnQubWF4X2J1ZmZlcl9zaXplIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBOSU1CVVNfVEhSSUZUX01BWF9CVUZGRVJfU0laRV9TQ0hFTUEgPSBDb25maWdWYWxpZGF0aW9uLkludGVnZXJWYWxpZGF0b3I7CiAKICAgICAvKioKICAgICAgKiBUaGlzIHBhcmFtZXRlciBpcyB1c2VkIGJ5IHRoZSBzdG9ybS1kZXBsb3kgcHJvamVjdCB0byBjb25maWd1cmUgdGhlCiAgICAgICoganZtIG9wdGlvbnMgZm9yIHRoZSBuaW1idXMgZGFlbW9uLgogICAgICAqLworICAgIEBpc1N0cmluZwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5JTUJVU19DSElMRE9QVFMgPSAibmltYnVzLmNoaWxkb3B0cyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgTklNQlVTX0NISUxET1BUU19TQ0hFTUEgPSBTdHJpbmcuY2xhc3M7CiAKIAogICAgIC8qKgogICAgICAqIEhvdyBsb25nIHdpdGhvdXQgaGVhcnRiZWF0aW5nIGEgdGFzayBjYW4gZ28gYmVmb3JlIG5pbWJ1cyB3aWxsIGNvbnNpZGVyIHRoZQogICAgICAqIHRhc2sgZGVhZCBhbmQgcmVhc3NpZ24gaXQgdG8gYW5vdGhlciBsb2NhdGlvbi4KICAgICAgKi8KKyAgICBAaXNJbnRlZ2VyCisgICAgQGlzUG9zaXRpdmVOdW1iZXIKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOSU1CVVNfVEFTS19USU1FT1VUX1NFQ1MgPSAibmltYnVzLnRhc2sudGltZW91dC5zZWNzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBOSU1CVVNfVEFTS19USU1FT1VUX1NFQ1NfU0NIRU1BID0gQ29uZmlnVmFsaWRhdGlvbi5JbnRlZ2VyVmFsaWRhdG9yOwogCiAKICAgICAvKioKICAgICAgKiBIb3cgb2Z0ZW4gbmltYnVzIHNob3VsZCB3YWtlIHVwIHRvIGNoZWNrIGhlYXJ0YmVhdHMgYW5kIGRvIHJlYXNzaWdubWVudHMuIE5vdGUKICAgICAgKiB0aGF0IGlmIGEgbWFjaGluZSBldmVyIGdvZXMgZG93biBOaW1idXMgd2lsbCBpbW1lZGlhdGVseSB3YWtlIHVwIGFuZCB0YWtlIGFjdGlvbi4KICAgICAgKiBUaGlzIHBhcmFtZXRlciBpcyBmb3IgY2hlY2tpbmcgZm9yIGZhaWx1cmVzIHdoZW4gdGhlcmUncyBubyBleHBsaWNpdCBldmVudCBsaWtlIHRoYXQKLSAgICAgKiBvY2N1cmluZy4KKyAgICAgKiBvY2N1cnJpbmcuCiAgICAgICovCisgICAgQGlzSW50ZWdlcgorICAgIEBpc1Bvc2l0aXZlTnVtYmVyCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTklNQlVTX01PTklUT1JfRlJFUV9TRUNTID0gIm5pbWJ1cy5tb25pdG9yLmZyZXEuc2VjcyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgTklNQlVTX01PTklUT1JfRlJFUV9TRUNTX1NDSEVNQSA9IENvbmZpZ1ZhbGlkYXRpb24uSW50ZWdlclZhbGlkYXRvcjsKIAogICAgIC8qKgogICAgICAqIEhvdyBvZnRlbiBuaW1idXMgc2hvdWxkIHdha2UgdGhlIGNsZWFudXAgdGhyZWFkIHRvIGNsZWFuIHRoZSBpbmJveC4KLSAgICAgKiBAc2VlIE5JTUJVU19JTkJPWF9KQVJfRVhQSVJBVElPTl9TRUNTCisgICAgICogQHNlZSAjTklNQlVTX0lOQk9YX0pBUl9FWFBJUkFUSU9OX1NFQ1MKICAgICAgKi8KKyAgICBAaXNJbnRlZ2VyCisgICAgQGlzUG9zaXRpdmVOdW1iZXIKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOSU1CVVNfQ0xFQU5VUF9JTkJPWF9GUkVRX1NFQ1MgPSAibmltYnVzLmNsZWFudXAuaW5ib3guZnJlcS5zZWNzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBOSU1CVVNfQ0xFQU5VUF9JTkJPWF9GUkVRX1NFQ1NfU0NIRU1BID0gQ29uZmlnVmFsaWRhdGlvbi5JbnRlZ2VyVmFsaWRhdG9yOwogCiAgICAgLyoqCiAgICAgICogVGhlIGxlbmd0aCBvZiB0aW1lIGEgamFyIGZpbGUgbGl2ZXMgaW4gdGhlIGluYm94IGJlZm9yZSBiZWluZyBkZWxldGVkIGJ5IHRoZSBjbGVhbnVwIHRocmVhZC4KQEAgLTQzMSwxNyArNTAyLDE4IEBACiAgICAgICogTm90ZSB0aGF0IHRoZSB0aW1lIGl0IHRha2VzIHRvIGRlbGV0ZSBhbiBpbmJveCBqYXIgZmlsZSBpcyBnb2luZyB0byBiZSBzb21ld2hhdCBtb3JlIHRoYW4KICAgICAgKiBOSU1CVVNfQ0xFQU5VUF9JTkJPWF9KQVJfRVhQSVJBVElPTl9TRUNTIChkZXBlbmRpbmcgb24gaG93IG9mdGVuIE5JTUJVU19DTEVBTlVQX0ZSRVFfU0VDUwogICAgICAqIGlzIHNldCB0bykuCi0gICAgICogQHNlZSBOSU1CVVNfQ0xFQU5VUF9GUkVRX1NFQ1MKKyAgICAgKiBAc2VlICNOSU1CVVNfQ0xFQU5VUF9JTkJPWF9GUkVRX1NFQ1MKICAgICAgKi8KKyAgICBAaXNJbnRlZ2VyCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTklNQlVTX0lOQk9YX0pBUl9FWFBJUkFUSU9OX1NFQ1MgPSAibmltYnVzLmluYm94Lmphci5leHBpcmF0aW9uLnNlY3MiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IE5JTUJVU19JTkJPWF9KQVJfRVhQSVJBVElPTl9TRUNTX1NDSEVNQSA9IENvbmZpZ1ZhbGlkYXRpb24uSW50ZWdlclZhbGlkYXRvcjsKIAogICAgIC8qKgogICAgICAqIEhvdyBsb25nIGJlZm9yZSBhIHN1cGVydmlzb3IgY2FuIGdvIHdpdGhvdXQgaGVhcnRiZWF0aW5nIGJlZm9yZSBuaW1idXMgY29uc2lkZXJzIGl0IGRlYWQKICAgICAgKiBhbmQgc3RvcHMgYXNzaWduaW5nIG5ldyB3b3JrIHRvIGl0LgogICAgICAqLworICAgIEBpc0ludGVnZXIKKyAgICBAaXNQb3NpdGl2ZU51bWJlcgogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5JTUJVU19TVVBFUlZJU09SX1RJTUVPVVRfU0VDUyA9ICJuaW1idXMuc3VwZXJ2aXNvci50aW1lb3V0LnNlY3MiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IE5JTUJVU19TVVBFUlZJU09SX1RJTUVPVVRfU0VDU19TQ0hFTUEgPSBDb25maWdWYWxpZGF0aW9uLkludGVnZXJWYWxpZGF0b3I7CiAKICAgICAvKioKICAgICAgKiBBIHNwZWNpYWwgdGltZW91dCB1c2VkIHdoZW4gYSB0YXNrIGlzIGluaXRpYWxseSBsYXVuY2hlZC4gRHVyaW5nIGxhdW5jaCwgdGhpcyBpcyB0aGUgdGltZW91dApAQCAtNDUwLDM2OSArNTIyLDQ0MCBAQAogICAgICAqIDxwPkEgc2VwYXJhdGUgdGltZW91dCBleGlzdHMgZm9yIGxhdW5jaCBiZWNhdXNlIHRoZXJlIGNhbiBiZSBxdWl0ZSBhIGJpdCBvZiBvdmVyaGVhZAogICAgICAqIHRvIGxhdW5jaGluZyBuZXcgSlZNJ3MgYW5kIGNvbmZpZ3VyaW5nIHRoZW0uPC9wPgogICAgICAqLworICAgIEBpc0ludGVnZXIKKyAgICBAaXNQb3NpdGl2ZU51bWJlcgogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5JTUJVU19UQVNLX0xBVU5DSF9TRUNTID0gIm5pbWJ1cy50YXNrLmxhdW5jaC5zZWNzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBOSU1CVVNfVEFTS19MQVVOQ0hfU0VDU19TQ0hFTUEgPSBDb25maWdWYWxpZGF0aW9uLkludGVnZXJWYWxpZGF0b3I7Ci0KLSAgICAvKioKLSAgICAgKiBXaGV0aGVyIG9yIG5vdCBuaW1idXMgc2hvdWxkIHJlYXNzaWduIHRhc2tzIGlmIGl0IGRldGVjdHMgdGhhdCBhIHRhc2sgZ29lcyBkb3duLgotICAgICAqIERlZmF1bHRzIHRvIHRydWUsIGFuZCBpdCdzIG5vdCByZWNvbW1lbmRlZCB0byBjaGFuZ2UgdGhpcyB2YWx1ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOSU1CVVNfUkVBU1NJR04gPSAibmltYnVzLnJlYXNzaWduIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBOSU1CVVNfUkVBU1NJR05fU0NIRU1BID0gQm9vbGVhbi5jbGFzczsKIAogICAgIC8qKgogICAgICAqIER1cmluZyB1cGxvYWQvZG93bmxvYWQgd2l0aCB0aGUgbWFzdGVyLCBob3cgbG9uZyBhbiB1cGxvYWQgb3IgZG93bmxvYWQgY29ubmVjdGlvbiBpcyBpZGxlCiAgICAgICogYmVmb3JlIG5pbWJ1cyBjb25zaWRlcnMgaXQgZGVhZCBhbmQgZHJvcHMgdGhlIGNvbm5lY3Rpb24uCiAgICAgICovCisgICAgQGlzSW50ZWdlcgogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5JTUJVU19GSUxFX0NPUFlfRVhQSVJBVElPTl9TRUNTID0gIm5pbWJ1cy5maWxlLmNvcHkuZXhwaXJhdGlvbi5zZWNzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBOSU1CVVNfRklMRV9DT1BZX0VYUElSQVRJT05fU0VDU19TQ0hFTUEgPSBDb25maWdWYWxpZGF0aW9uLkludGVnZXJWYWxpZGF0b3I7CiAKICAgICAvKioKICAgICAgKiBBIGN1c3RvbSBjbGFzcyB0aGF0IGltcGxlbWVudHMgSVRvcG9sb2d5VmFsaWRhdG9yIHRoYXQgaXMgcnVuIHdoZW5ldmVyIGEKICAgICAgKiB0b3BvbG9neSBpcyBzdWJtaXR0ZWQuIENhbiBiZSB1c2VkIHRvIHByb3ZpZGUgYnVzaW5lc3Mtc3BlY2lmaWMgbG9naWMgZm9yCiAgICAgICogd2hldGhlciB0b3BvbG9naWVzIGFyZSBhbGxvd2VkIHRvIHJ1biBvciBub3QuCiAgICAgICovCisgICAgQGlzU3RyaW5nCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTklNQlVTX1RPUE9MT0dZX1ZBTElEQVRPUiA9ICJuaW1idXMudG9wb2xvZ3kudmFsaWRhdG9yIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBOSU1CVVNfVE9QT0xPR1lfVkFMSURBVE9SX1NDSEVNQSA9IFN0cmluZy5jbGFzczsKIAogICAgIC8qKgogICAgICAqIENsYXNzIG5hbWUgZm9yIGF1dGhvcml6YXRpb24gcGx1Z2luIGZvciBOaW1idXMKICAgICAgKi8KKyAgICBAaXNTdHJpbmcKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOSU1CVVNfQVVUSE9SSVpFUiA9ICJuaW1idXMuYXV0aG9yaXplciI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgTklNQlVTX0FVVEhPUklaRVJfU0NIRU1BID0gU3RyaW5nLmNsYXNzOwotCiAKICAgICAvKioKICAgICAgKiBJbXBlcnNvbmF0aW9uIHVzZXIgQUNMIGNvbmZpZyBlbnRyaWVzLgogICAgICAqLworICAgIEBpc1N0cmluZwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5JTUJVU19JTVBFUlNPTkFUSU9OX0FVVEhPUklaRVIgPSAibmltYnVzLmltcGVyc29uYXRpb24uYXV0aG9yaXplciI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgTklNQlVTX0lNUEVSU09OQVRJT05fQVVUSE9SSVpFUl9TQ0hFTUEgPSBTdHJpbmcuY2xhc3M7Ci0KIAogICAgIC8qKgogICAgICAqIEltcGVyc29uYXRpb24gdXNlciBBQ0wgY29uZmlnIGVudHJpZXMuCiAgICAgICovCisgICAgQGlzTWFwRW50cnlDdXN0b20oa2V5VmFsaWRhdG9yQ2xhc3NlcyA9IHtTdHJpbmdWYWxpZGF0b3IuY2xhc3N9LCB2YWx1ZVZhbGlkYXRvckNsYXNzZXMgPSB7SW1wZXJzb25hdGlvbkFjbFVzZXJFbnRyeVZhbGlkYXRvci5jbGFzc30pCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTklNQlVTX0lNUEVSU09OQVRJT05fQUNMID0gIm5pbWJ1cy5pbXBlcnNvbmF0aW9uLmFjbCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgTklNQlVTX0lNUEVSU09OQVRJT05fQUNMX1NDSEVNQSA9IENvbmZpZ1ZhbGlkYXRpb24uTWFwT2ZTdHJpbmdUb01hcFZhbGlkYXRvcjsKIAogICAgIC8qKgogICAgICAqIEhvdyBvZnRlbiBuaW1idXMgc2hvdWxkIHdha2UgdXAgdG8gcmVuZXcgY3JlZGVudGlhbHMgaWYgbmVlZGVkLgogICAgICAqLworICAgIEBpc0ludGVnZXIKKyAgICBAaXNQb3NpdGl2ZU51bWJlcgogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5JTUJVU19DUkVERU5USUFMX1JFTkVXX0ZSRVFfU0VDUyA9ICJuaW1idXMuY3JlZGVudGlhbC5yZW5ld2Vycy5mcmVxLnNlY3MiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IE5JTUJVU19DUkVERU5USUFMX1JFTkVXX0ZSRVFfU0VDU19TQ0hFTUEgPSBOdW1iZXIuY2xhc3M7CiAKICAgICAvKioKICAgICAgKiBBIGxpc3Qgb2YgY3JlZGVudGlhbCByZW5ld2VycyB0aGF0IG5pbWJ1cyBzaG91bGQgbG9hZC4KICAgICAgKi8KKyAgICBAaXNTdHJpbmdMaXN0CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTklNQlVTX0NSRURFTlRJQUxfUkVORVdFUlMgPSAibmltYnVzLmNyZWRlbnRpYWwucmVuZXdlcnMuY2xhc3NlcyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgTklNQlVTX0NSRURFTlRJQUxfUkVORVdFUlNfU0NIRU1BID0gQ29uZmlnVmFsaWRhdGlvbi5TdHJpbmdzVmFsaWRhdG9yOwogCiAgICAgLyoqCiAgICAgICogQSBsaXN0IG9mIHBsdWdpbnMgdGhhdCBuaW1idXMgc2hvdWxkIGxvYWQgZHVyaW5nIHN1Ym1pdCB0b3BvbG9neSB0byBwb3B1bGF0ZQogICAgICAqIGNyZWRlbnRpYWxzIG9uIHVzZXIncyBiZWhhbGYuCiAgICAgICovCisgICAgQGlzU3RyaW5nTGlzdAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5JTUJVU19BVVRPX0NSRURfUExVR0lOUyA9ICJuaW1idXMuYXV0b2NyZWRlbnRpYWwucGx1Z2lucy5jbGFzc2VzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBOSU1CVVNfQVVUT19DUkVEX1BMVUdJTlNfU0NIRU1BID0gQ29uZmlnVmFsaWRhdGlvbi5TdHJpbmdzVmFsaWRhdG9yOworCisgICAgLyoqCisgICAgICogRlFDTiBvZiBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB7QGNvZGUgSVRvcG9sb2d5QWN0aW9uTm90aWZpZXJQbHVnaW59IEBzZWUgYmFja3R5cGUuc3Rvcm0ubmltYnVzLklUb3BvbG9neUFjdGlvbk5vdGlmaWVyUGx1Z2luIGZvciBkZXRhaWxzLgorICAgICAqLworICAgIEBpc1N0cmluZworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5JTUJVU19UT1BPTE9HWV9BQ1RJT05fTk9USUZJRVJfUExVR0lOID0gIm5pbWJ1cy50b3BvbG9neS5hY3Rpb24ubm90aWZpZXIucGx1Z2luLmNsYXNzIjsKIAogICAgIC8qKgogICAgICAqIFN0b3JtIFVJIGJpbmRzIHRvIHRoaXMgaG9zdC9pbnRlcmZhY2UuCiAgICAgICovCisgICAgQGlzU3RyaW5nCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUlfSE9TVCA9ICJ1aS5ob3N0IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBVSV9IT1NUX1NDSEVNQSA9IFN0cmluZy5jbGFzczsKIAogICAgIC8qKgogICAgICAqIFN0b3JtIFVJIGJpbmRzIHRvIHRoaXMgcG9ydC4KICAgICAgKi8KKyAgICBAaXNJbnRlZ2VyCisgICAgQGlzUG9zaXRpdmVOdW1iZXIKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVSV9QT1JUID0gInVpLnBvcnQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFVJX1BPUlRfU0NIRU1BID0gQ29uZmlnVmFsaWRhdGlvbi5JbnRlZ2VyVmFsaWRhdG9yOworCisgICAgLyoqCisgICAgICogU3Rvcm0gVUkgUHJvamVjdCBCVUdUUkFDS0VSIExpbmsgZm9yIHJlcG9ydGluZyBpc3N1ZS4KKyAgICAgKi8KKyAgICBAaXNTdHJpbmcKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVSV9QUk9KRUNUX0JVR1RSQUNLRVJfVVJMID0gInVpLnByb2plY3QuYnVndHJhY2tlci51cmwiOworCisgICAgLyoqCisgICAgICogU3Rvcm0gVUkgQ2VudHJhbCBMb2dnaW5nIFVSTC4KKyAgICAgKi8KKyAgICBAaXNTdHJpbmcKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVSV9DRU5UUkFMX0xPR0dJTkdfVVJMID0gInVpLmNlbnRyYWwubG9nZ2luZy51cmwiOwogCiAgICAgLyoqCiAgICAgICogSFRUUCBVSSBwb3J0IGZvciBsb2cgdmlld2VyCiAgICAgICovCisgICAgQGlzSW50ZWdlcgorICAgIEBpc1Bvc2l0aXZlTnVtYmVyCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HVklFV0VSX1BPUlQgPSAibG9ndmlld2VyLnBvcnQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IExPR1ZJRVdFUl9QT1JUX1NDSEVNQSA9IENvbmZpZ1ZhbGlkYXRpb24uSW50ZWdlclZhbGlkYXRvcjsKIAogICAgIC8qKgogICAgICAqIENoaWxkb3B0cyBmb3IgbG9nIHZpZXdlciBqYXZhIHByb2Nlc3MuCiAgICAgICovCisgICAgQGlzU3RyaW5nCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HVklFV0VSX0NISUxET1BUUyA9ICJsb2d2aWV3ZXIuY2hpbGRvcHRzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBMT0dWSUVXRVJfQ0hJTERPUFRTX1NDSEVNQSA9IFN0cmluZy5jbGFzczsKIAogICAgIC8qKgogICAgICAqIEhvdyBvZnRlbiB0byBjbGVhbiB1cCBvbGQgbG9nIGZpbGVzCiAgICAgICovCisgICAgQGlzSW50ZWdlcgorICAgIEBpc1Bvc2l0aXZlTnVtYmVyCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HVklFV0VSX0NMRUFOVVBfSU5URVJWQUxfU0VDUyA9ICJsb2d2aWV3ZXIuY2xlYW51cC5pbnRlcnZhbC5zZWNzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBMT0dWSUVXRVJfQ0xFQU5VUF9JTlRFUlZBTF9TRUNTX1NDSEVNQSA9IENvbmZpZ1ZhbGlkYXRpb24uUG9zaXRpdmVJbnRlZ2VyVmFsaWRhdG9yOwogCiAgICAgLyoqCiAgICAgICogSG93IG1hbnkgbWludXRlcyBzaW5jZSBhIGxvZyB3YXMgbGFzdCBtb2RpZmllZCBmb3IgdGhlIGxvZyB0byBiZSBjb25zaWRlcmVkIGZvciBjbGVhbi11cAogICAgICAqLworICAgIEBpc0ludGVnZXIKKyAgICBAaXNQb3NpdGl2ZU51bWJlcgogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPR1ZJRVdFUl9DTEVBTlVQX0FHRV9NSU5TID0gImxvZ3ZpZXdlci5jbGVhbnVwLmFnZS5taW5zIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBMT0dWSUVXRVJfQ0xFQU5VUF9BR0VfTUlOU19TQ0hFTUEgPSBDb25maWdWYWxpZGF0aW9uLlBvc2l0aXZlSW50ZWdlclZhbGlkYXRvcjsKKworICAgIC8qKgorICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyBhbGwgd29ya2VyIGxvZyBmaWxlcyBjYW4gdGFrZSB1cCBpbiBNQgorICAgICAqLworICAgIEBpc1Bvc2l0aXZlTnVtYmVyCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HVklFV0VSX01BWF9TVU1fV09SS0VSX0xPR1NfU0laRV9NQiA9ICJsb2d2aWV3ZXIubWF4LnN1bS53b3JrZXIubG9ncy5zaXplLm1iIjsKKworICAgIC8qKgorICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyBwZXIgd29ya2VyJ3MgZmlsZXMgY2FuIHRha2UgdXAgaW4gTUIKKyAgICAgKi8KKyAgICBAaXNQb3NpdGl2ZU51bWJlcgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPR1ZJRVdFUl9NQVhfUEVSX1dPUktFUl9MT0dTX1NJWkVfTUIgPSAibG9ndmlld2VyLm1heC5wZXIud29ya2VyLmxvZ3Muc2l6ZS5tYiI7CiAKICAgICAvKioKICAgICAgKiBTdG9ybSBMb2d2aWV3ZXIgSFRUUFMgcG9ydAogICAgICAqLworICAgIEBpc0ludGVnZXIKKyAgICBAaXNQb3NpdGl2ZU51bWJlcgogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPR1ZJRVdFUl9IVFRQU19QT1JUID0gImxvZ3ZpZXdlci5odHRwcy5wb3J0IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBMT0dWSUVXRVJfSFRUUFNfUE9SVF9TQ0hFTUEgPSBOdW1iZXIuY2xhc3M7CiAKICAgICAvKioKICAgICAgKiBQYXRoIHRvIHRoZSBrZXlzdG9yZSBjb250YWluaW5nIHRoZSBjZXJ0cyB1c2VkIGJ5IFN0b3JtIExvZ3ZpZXdlciBmb3IgSFRUUFMgY29tbXVuaWNhdGlvbnMKICAgICAgKi8KKyAgICBAaXNTdHJpbmcKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dWSUVXRVJfSFRUUFNfS0VZU1RPUkVfUEFUSCA9ICJsb2d2aWV3ZXIuaHR0cHMua2V5c3RvcmUucGF0aCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgTE9HVklFV0VSX0hUVFBTX0tFWVNUT1JFX1BBVEhfU0NIRU1BID0gU3RyaW5nLmNsYXNzOwogCiAgICAgLyoqCiAgICAgICogUGFzc3dvcmQgZm9yIHRoZSBrZXlzdG9yZSBmb3IgSFRUUFMgZm9yIFN0b3JtIExvZ3ZpZXdlcgogICAgICAqLworICAgIEBpc1N0cmluZwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPR1ZJRVdFUl9IVFRQU19LRVlTVE9SRV9QQVNTV09SRCA9ICJsb2d2aWV3ZXIuaHR0cHMua2V5c3RvcmUucGFzc3dvcmQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IExPR1ZJRVdFUl9IVFRQU19LRVlTVE9SRV9QQVNTV09SRF9TQ0hFTUEgPSBTdHJpbmcuY2xhc3M7CiAKICAgICAvKioKICAgICAgKiBUeXBlIG9mIHRoZSBrZXlzdG9yZSBmb3IgSFRUUFMgZm9yIFN0b3JtIExvZ3ZpZXdlci4KICAgICAgKiBzZWUgaHR0cDovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvOC9kb2NzL2FwaS9qYXZhL3NlY3VyaXR5L0tleVN0b3JlLmh0bWwgZm9yIG1vcmUgZGV0YWlscy4KICAgICAgKi8KKyAgICBAaXNTdHJpbmcKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dWSUVXRVJfSFRUUFNfS0VZU1RPUkVfVFlQRSA9ICJsb2d2aWV3ZXIuaHR0cHMua2V5c3RvcmUudHlwZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgTE9HVklFV0VSX0hUVFBTX0tFWVNUT1JFX1RZUEVfU0NIRU1BID0gU3RyaW5nLmNsYXNzOwogCiAgICAgLyoqCi0gICAgICogUGFzc3dvcmQgdG8gdGhlIHByaXZhdGUga2V5IGluIHRoZSBrZXlzdG9yZSBmb3Igc2V0dHRpbmcgdXAgSFRUUFMgKFNTTCkuCisgICAgICogUGFzc3dvcmQgdG8gdGhlIHByaXZhdGUga2V5IGluIHRoZSBrZXlzdG9yZSBmb3Igc2V0dGluZyB1cCBIVFRQUyAoU1NMKS4KICAgICAgKi8KKyAgICBAaXNTdHJpbmcKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dWSUVXRVJfSFRUUFNfS0VZX1BBU1NXT1JEID0gImxvZ3ZpZXdlci5odHRwcy5rZXkucGFzc3dvcmQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IExPR1ZJRVdFUl9IVFRQU19LRVlfUEFTU1dPUkRfU0NIRU1BID0gU3RyaW5nLmNsYXNzOwogCiAgICAgLyoqCiAgICAgICogUGF0aCB0byB0aGUgdHJ1c3RzdG9yZSBjb250YWluaW5nIHRoZSBjZXJ0cyB1c2VkIGJ5IFN0b3JtIExvZ3ZpZXdlciBmb3IgSFRUUFMgY29tbXVuaWNhdGlvbnMKICAgICAgKi8KKyAgICBAaXNTdHJpbmcKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dWSUVXRVJfSFRUUFNfVFJVU1RTVE9SRV9QQVRIID0gImxvZ3ZpZXdlci5odHRwcy50cnVzdHN0b3JlLnBhdGgiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IExPR1ZJRVdFUl9IVFRQU19UUlVTVFNUT1JFX1BBVEhfU0NIRU1BID0gU3RyaW5nLmNsYXNzOwogCiAgICAgLyoqCiAgICAgICogUGFzc3dvcmQgZm9yIHRoZSB0cnVzdHN0b3JlIGZvciBIVFRQUyBmb3IgU3Rvcm0gTG9ndmlld2VyCiAgICAgICovCisgICAgQGlzU3RyaW5nCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HVklFV0VSX0hUVFBTX1RSVVNUU1RPUkVfUEFTU1dPUkQgPSAibG9ndmlld2VyLmh0dHBzLnRydXN0c3RvcmUucGFzc3dvcmQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IExPR1ZJRVdFUl9IVFRQU19UUlVTVFNUT1JFX1BBU1NXT1JEX1NDSEVNQSA9IFN0cmluZy5jbGFzczsKIAogICAgIC8qKgogICAgICAqIFR5cGUgb2YgdGhlIHRydXN0c3RvcmUgZm9yIEhUVFBTIGZvciBTdG9ybSBMb2d2aWV3ZXIuCiAgICAgICogc2VlIGh0dHA6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzgvZG9jcy9hcGkvamF2YS9zZWN1cml0eS9UcnVzdHN0b3JlLmh0bWwgZm9yIG1vcmUgZGV0YWlscy4KICAgICAgKi8KKyAgICBAaXNTdHJpbmcKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dWSUVXRVJfSFRUUFNfVFJVU1RTVE9SRV9UWVBFID0gImxvZ3ZpZXdlci5odHRwcy50cnVzdHN0b3JlLnR5cGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IExPR1ZJRVdFUl9IVFRQU19UUlVTVFNUT1JFX1RZUEVfU0NIRU1BID0gU3RyaW5nLmNsYXNzOwogCiAgICAgLyoqCi0gICAgICogUGFzc3dvcmQgdG8gdGhlIHRydXN0c3RvcmUgdXNlZCBieSBTdG9ybSBMb2d2aWV3ZXIgc2V0dHRpbmcgdXAgSFRUUFMgKFNTTCkuCisgICAgICogUGFzc3dvcmQgdG8gdGhlIHRydXN0c3RvcmUgdXNlZCBieSBTdG9ybSBMb2d2aWV3ZXIgc2V0dGluZyB1cCBIVFRQUyAoU1NMKS4KICAgICAgKi8KKyAgICBAaXNCb29sZWFuCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HVklFV0VSX0hUVFBTX1dBTlRfQ0xJRU5UX0FVVEggPSAibG9ndmlld2VyLmh0dHBzLndhbnQuY2xpZW50LmF1dGgiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IExPR1ZJRVdFUl9IVFRQU19XQU5UX0NMSUVOVF9BVVRIX1NDSEVNQSA9IEJvb2xlYW4uY2xhc3M7CiAKKyAgICBAaXNCb29sZWFuCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HVklFV0VSX0hUVFBTX05FRURfQ0xJRU5UX0FVVEggPSAibG9ndmlld2VyLmh0dHBzLm5lZWQuY2xpZW50LmF1dGgiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IExPR1ZJRVdFUl9IVFRQU19ORUVEX0NMSUVOVF9BVVRIX1NDSEVNQSA9IEJvb2xlYW4uY2xhc3M7CiAKICAgICAvKioKICAgICAgKiBBIGxpc3Qgb2YgdXNlcnMgYWxsb3dlZCB0byB2aWV3IGxvZ3MgdmlhIHRoZSBMb2cgVmlld2VyCiAgICAgICovCisgICAgQGlzU3RyaW5nTGlzdAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPR1NfVVNFUlMgPSAibG9ncy51c2VycyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgTE9HU19VU0VSU19TQ0hFTUEgPSBDb25maWdWYWxpZGF0aW9uLlN0cmluZ3NWYWxpZGF0b3I7CiAKICAgICAvKioKICAgICAgKiBBIGxpc3Qgb2YgZ3JvdXBzIGFsbG93ZWQgdG8gdmlldyBsb2dzIHZpYSB0aGUgTG9nIFZpZXdlcgogICAgICAqLworICAgIEBpc1N0cmluZ0xpc3QKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dTX0dST1VQUyA9ICJsb2dzLmdyb3VwcyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgTE9HU19HUk9VUFNfU0NIRU1BID0gQ29uZmlnVmFsaWRhdGlvbi5TdHJpbmdzVmFsaWRhdG9yOwogCiAgICAgLyoqCiAgICAgICogQXBwZW5kZXIgbmFtZSB1c2VkIGJ5IGxvZyB2aWV3ZXIgdG8gZGV0ZXJtaW5lIGxvZyBkaXJlY3RvcnkuCiAgICAgICovCisgICAgQGlzU3RyaW5nCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HVklFV0VSX0FQUEVOREVSX05BTUUgPSAibG9ndmlld2VyLmFwcGVuZGVyLm5hbWUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IExPR1ZJRVdFUl9BUFBFTkRFUl9OQU1FX1NDSEVNQSA9IFN0cmluZy5jbGFzczsKIAogICAgIC8qKgogICAgICAqIENoaWxkb3B0cyBmb3IgU3Rvcm0gVUkgSmF2YSBwcm9jZXNzLgogICAgICAqLworICAgIEBpc1N0cmluZwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVJX0NISUxET1BUUyA9ICJ1aS5jaGlsZG9wdHMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFVJX0NISUxET1BUU19TQ0hFTUEgPSBTdHJpbmcuY2xhc3M7CiAKICAgICAvKioKICAgICAgKiBBIGNsYXNzIGltcGxlbWVudGluZyBqYXZheC5zZXJ2bGV0LkZpbHRlciBmb3IgYXV0aGVudGljYXRpbmcvZmlsdGVyaW5nIFVJIHJlcXVlc3RzCiAgICAgICovCisgICAgQGlzU3RyaW5nCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUlfRklMVEVSID0gInVpLmZpbHRlciI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgVUlfRklMVEVSX1NDSEVNQSA9IFN0cmluZy5jbGFzczsKIAogICAgIC8qKgogICAgICAqIEluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMgZm9yIHRoZSBqYXZheC5zZXJ2bGV0LkZpbHRlcgogICAgICAqLworICAgIEBpc01hcEVudHJ5VHlwZShrZXlUeXBlID0gU3RyaW5nLmNsYXNzLCB2YWx1ZVR5cGUgPSBTdHJpbmcuY2xhc3MpCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUlfRklMVEVSX1BBUkFNUyA9ICJ1aS5maWx0ZXIucGFyYW1zIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBVSV9GSUxURVJfUEFSQU1TX1NDSEVNQSA9IE1hcC5jbGFzczsKIAogICAgIC8qKgogICAgICAqIFRoZSBzaXplIG9mIHRoZSBoZWFkZXIgYnVmZmVyIGZvciB0aGUgVUkgaW4gYnl0ZXMKICAgICAgKi8KKyAgICBAaXNJbnRlZ2VyCisgICAgQGlzUG9zaXRpdmVOdW1iZXIKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVSV9IRUFERVJfQlVGRkVSX0JZVEVTID0gInVpLmhlYWRlci5idWZmZXIuYnl0ZXMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFVJX0hFQURFUl9CVUZGRVJfQllURVNfU0NIRU1BID0gTnVtYmVyLmNsYXNzOwogCiAgICAgLyoqCiAgICAgICogVGhpcyBwb3J0IGlzIHVzZWQgYnkgU3Rvcm0gRFJQQyBmb3IgcmVjZWl2aW5nIEhUVFBTIChTU0wpIERQUkMgcmVxdWVzdHMgZnJvbSBjbGllbnRzLgogICAgICAqLworICAgIEBpc0ludGVnZXIKKyAgICBAaXNQb3NpdGl2ZU51bWJlcgogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVJX0hUVFBTX1BPUlQgPSAidWkuaHR0cHMucG9ydCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgVUlfSFRUUFNfUE9SVF9TQ0hFTUEgPSBOdW1iZXIuY2xhc3M7CiAKICAgICAvKioKICAgICAgKiBQYXRoIHRvIHRoZSBrZXlzdG9yZSB1c2VkIGJ5IFN0b3JtIFVJIGZvciBzZXR0aW5nIHVwIEhUVFBTIChTU0wpLgogICAgICAqLworICAgIEBpc1N0cmluZwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVJX0hUVFBTX0tFWVNUT1JFX1BBVEggPSAidWkuaHR0cHMua2V5c3RvcmUucGF0aCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgVUlfSFRUUFNfS0VZU1RPUkVfUEFUSF9TQ0hFTUEgPSBTdHJpbmcuY2xhc3M7CiAKICAgICAvKioKICAgICAgKiBQYXNzd29yZCB0byB0aGUga2V5c3RvcmUgdXNlZCBieSBTdG9ybSBVSSBmb3Igc2V0dGluZyB1cCBIVFRQUyAoU1NMKS4KICAgICAgKi8KKyAgICBAaXNTdHJpbmcKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVSV9IVFRQU19LRVlTVE9SRV9QQVNTV09SRCA9ICJ1aS5odHRwcy5rZXlzdG9yZS5wYXNzd29yZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgVUlfSFRUUFNfS0VZU1RPUkVfUEFTU1dPUkRfU0NIRU1BID0gU3RyaW5nLmNsYXNzOwogCiAgICAgLyoqCiAgICAgICogVHlwZSBvZiBrZXlzdG9yZSB1c2VkIGJ5IFN0b3JtIFVJIGZvciBzZXR0aW5nIHVwIEhUVFBTIChTU0wpLgogICAgICAqIHNlZSBodHRwOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS83L2RvY3MvYXBpL2phdmEvc2VjdXJpdHkvS2V5U3RvcmUuaHRtbCBmb3IgbW9yZSBkZXRhaWxzLgogICAgICAqLworICAgIEBpc1N0cmluZwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVJX0hUVFBTX0tFWVNUT1JFX1RZUEUgPSAidWkuaHR0cHMua2V5c3RvcmUudHlwZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgVUlfSFRUUFNfS0VZU1RPUkVfVFlQRV9TQ0hFTUEgPSBTdHJpbmcuY2xhc3M7CiAKICAgICAvKioKLSAgICAgKiBQYXNzd29yZCB0byB0aGUgcHJpdmF0ZSBrZXkgaW4gdGhlIGtleXN0b3JlIGZvciBzZXR0dGluZyB1cCBIVFRQUyAoU1NMKS4KKyAgICAgKiBQYXNzd29yZCB0byB0aGUgcHJpdmF0ZSBrZXkgaW4gdGhlIGtleXN0b3JlIGZvciBzZXR0aW5nIHVwIEhUVFBTIChTU0wpLgogICAgICAqLworICAgIEBpc1N0cmluZwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVJX0hUVFBTX0tFWV9QQVNTV09SRCA9ICJ1aS5odHRwcy5rZXkucGFzc3dvcmQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFVJX0hUVFBTX0tFWV9QQVNTV09SRF9TQ0hFTUEgPSBTdHJpbmcuY2xhc3M7CiAKICAgICAvKioKLSAgICAgKiBQYXRoIHRvIHRoZSB0cnVzdHN0b3JlIHVzZWQgYnkgU3Rvcm0gVUkgc2V0dHRpbmcgdXAgSFRUUFMgKFNTTCkuCisgICAgICogUGF0aCB0byB0aGUgdHJ1c3RzdG9yZSB1c2VkIGJ5IFN0b3JtIFVJIHNldHRpbmcgdXAgSFRUUFMgKFNTTCkuCiAgICAgICovCisgICAgQGlzU3RyaW5nCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUlfSFRUUFNfVFJVU1RTVE9SRV9QQVRIID0gInVpLmh0dHBzLnRydXN0c3RvcmUucGF0aCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgVUlfSFRUUFNfVFJVU1RTVE9SRV9QQVRIX1NDSEVNQSA9IFN0cmluZy5jbGFzczsKIAogICAgIC8qKgotICAgICAqIFBhc3N3b3JkIHRvIHRoZSB0cnVzdHN0b3JlIHVzZWQgYnkgU3Rvcm0gVUkgc2V0dHRpbmcgdXAgSFRUUFMgKFNTTCkuCisgICAgICogUGFzc3dvcmQgdG8gdGhlIHRydXN0c3RvcmUgdXNlZCBieSBTdG9ybSBVSSBzZXR0aW5nIHVwIEhUVFBTIChTU0wpLgogICAgICAqLworICAgIEBpc1N0cmluZwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVJX0hUVFBTX1RSVVNUU1RPUkVfUEFTU1dPUkQgPSAidWkuaHR0cHMudHJ1c3RzdG9yZS5wYXNzd29yZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgVUlfSFRUUFNfVFJVU1RTVE9SRV9QQVNTV09SRF9TQ0hFTUEgPSBTdHJpbmcuY2xhc3M7CiAKICAgICAvKioKICAgICAgKiBUeXBlIG9mIHRydXN0c3RvcmUgdXNlZCBieSBTdG9ybSBVSSBmb3Igc2V0dGluZyB1cCBIVFRQUyAoU1NMKS4KICAgICAgKiBzZWUgaHR0cDovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvNy9kb2NzL2FwaS9qYXZhL3NlY3VyaXR5L0tleVN0b3JlLmh0bWwgZm9yIG1vcmUgZGV0YWlscy4KICAgICAgKi8KKyAgICBAaXNTdHJpbmcKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVSV9IVFRQU19UUlVTVFNUT1JFX1RZUEUgPSAidWkuaHR0cHMudHJ1c3RzdG9yZS50eXBlIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBVSV9IVFRQU19UUlVTVFNUT1JFX1RZUEVfU0NIRU1BID0gU3RyaW5nLmNsYXNzOwogCiAgICAgLyoqCi0gICAgICogUGFzc3dvcmQgdG8gdGhlIHRydXN0c3RvcmUgdXNlZCBieSBTdG9ybSBEUlBDIHNldHR0aW5nIHVwIEhUVFBTIChTU0wpLgorICAgICAqIFBhc3N3b3JkIHRvIHRoZSB0cnVzdHN0b3JlIHVzZWQgYnkgU3Rvcm0gRFJQQyBzZXR0aW5nIHVwIEhUVFBTIChTU0wpLgogICAgICAqLworICAgIEBpc0Jvb2xlYW4KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVSV9IVFRQU19XQU5UX0NMSUVOVF9BVVRIID0gInVpLmh0dHBzLndhbnQuY2xpZW50LmF1dGgiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFVJX0hUVFBTX1dBTlRfQ0xJRU5UX0FVVEhfU0NIRU1BID0gQm9vbGVhbi5jbGFzczsKIAorICAgIEBpc0Jvb2xlYW4KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBVSV9IVFRQU19ORUVEX0NMSUVOVF9BVVRIID0gInVpLmh0dHBzLm5lZWQuY2xpZW50LmF1dGgiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFVJX0hUVFBTX05FRURfQ0xJRU5UX0FVVEhfU0NIRU1BID0gQm9vbGVhbi5jbGFzczsKIAorICAgIC8qKgorICAgICAqIFRoZSBob3N0IHRoYXQgUGFjZW1ha2VyIGlzIHJ1bm5pbmcgb24uCisgICAgICovCisgICAgQGlzU3RyaW5nCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDRU1BS0VSX0hPU1QgPSAicGFjZW1ha2VyLmhvc3QiOwogCiAgICAgLyoqCisgICAgICogVGhlIHBvcnQgUGFjZW1ha2VyIHNob3VsZCBydW4gb24uIENsaWVudHMgc2hvdWxkCisgICAgICogY29ubmVjdCB0byB0aGlzIHBvcnQgdG8gc3VibWl0IG9yIHJlYWQgaGVhcnRiZWF0cy4KKyAgICAgKi8KKyAgICBAaXNOdW1iZXIKKyAgICBAaXNQb3NpdGl2ZU51bWJlcgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0VNQUtFUl9QT1JUID0gInBhY2VtYWtlci5wb3J0IjsKKworICAgIC8qKgorICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0aHJlYWRzIHRoYXQgc2hvdWxkIGJlIHVzZWQgYnkgdGhlIFBhY2VtYWtlci4KKyAgICAgKiBXaGVuIFBhY2VtYWtlciBnZXRzIGxvYWRlZCBpdCB3aWxsIHNwYXduIG5ldyB0aHJlYWRzLCB1cCB0byAKKyAgICAgKiB0aGlzIG1hbnkgdG90YWwsIHRvIGhhbmRsZSB0aGUgbG9hZC4KKyAgICAgKi8KKyAgICBAaXNOdW1iZXIKKyAgICBAaXNQb3NpdGl2ZU51bWJlcgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0VNQUtFUl9NQVhfVEhSRUFEUyA9ICJwYWNlbWFrZXIubWF4LnRocmVhZHMiOworCisgICAgLyoqCisgICAgICogVGhpcyBwYXJhbWV0ZXIgaXMgdXNlZCBieSB0aGUgc3Rvcm0tZGVwbG95IHByb2plY3QgdG8gY29uZmlndXJlIHRoZQorICAgICAqIGp2bSBvcHRpb25zIGZvciB0aGUgcGFjZW1ha2VyIGRhZW1vbi4KKyAgICAgKi8KKyAgICBAaXNTdHJpbmcKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNFTUFLRVJfQ0hJTERPUFRTID0gInBhY2VtYWtlci5jaGlsZG9wdHMiOworCisgICAgLyoqCisgICAgICogVGhpcyBzaG91bGQgYmUgb25lIG9mICJESUdFU1QiLCAiS0VSQkVST1MiLCBvciAiTk9ORSIKKyAgICAgKiBEZXRlcm1pbmVzIHRoZSBtb2RlIG9mIGF1dGhlbnRpY2F0aW9uIHRoZSBwYWNlbWFrZXIgc2VydmVyIGFuZCBjbGllbnQgdXNlLgorICAgICAqIFRoZSBjbGllbnQgbXVzdCBlaXRoZXIgbWF0Y2ggdGhlIHNlcnZlciwgb3IgYmUgTk9ORS4gSW4gdGhlIGNhc2Ugb2YgTk9ORSwKKyAgICAgKiBubyBhdXRoZW50aWNhdGlvbiBpcyBwZXJmb3JtZWQgZm9yIHRoZSBjbGllbnQsIGFuZCBpZiB0aGUgc2VydmVyIGlzIHJ1bm5pbmcgd2l0aAorICAgICAqIERJR0VTVCBvciBLRVJCRVJPUywgdGhlIGNsaWVudCBjYW4gb25seSB3cml0ZSB0byB0aGUgc2VydmVyIChubyByZWFkcykuCisgICAgICogVGhpcyBpcyBpbnRlbmRlZCB0byBwcm92aWRlIGEgcHJpbWl0aXZlIGZvcm0gb2YgYWNjZXNzLWNvbnRyb2wuCisgICAgICovCisgICAgQEN1c3RvbVZhbGlkYXRvcih2YWxpZGF0b3JDbGFzcz1QYWNlbWFrZXJBdXRoVHlwZVZhbGlkYXRvci5jbGFzcykKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQUNFTUFLRVJfQVVUSF9NRVRIT0QgPSAicGFjZW1ha2VyLmF1dGgubWV0aG9kIjsKKyAgICAKKyAgICAvKioKICAgICAgKiBMaXN0IG9mIERSUEMgc2VydmVycyBzbyB0aGF0IHRoZSBEUlBDU3BvdXQga25vd3Mgd2hvIHRvIHRhbGsgdG8uCiAgICAgICovCisgICAgQGlzU3RyaW5nTGlzdAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERSUENfU0VSVkVSUyA9ICJkcnBjLnNlcnZlcnMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IERSUENfU0VSVkVSU19TQ0hFTUEgPSBDb25maWdWYWxpZGF0aW9uLlN0cmluZ3NWYWxpZGF0b3I7CiAKICAgICAvKioKICAgICAgKiBUaGlzIHBvcnQgaXMgdXNlZCBieSBTdG9ybSBEUlBDIGZvciByZWNlaXZpbmcgSFRUUCBEUFJDIHJlcXVlc3RzIGZyb20gY2xpZW50cy4KICAgICAgKi8KKyAgICBAaXNJbnRlZ2VyCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFJQQ19IVFRQX1BPUlQgPSAiZHJwYy5odHRwLnBvcnQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IERSUENfSFRUUF9QT1JUX1NDSEVNQSA9IE51bWJlci5jbGFzczsKIAogICAgIC8qKgogICAgICAqIFRoaXMgcG9ydCBpcyB1c2VkIGJ5IFN0b3JtIERSUEMgZm9yIHJlY2VpdmluZyBIVFRQUyAoU1NMKSBEUFJDIHJlcXVlc3RzIGZyb20gY2xpZW50cy4KICAgICAgKi8KKyAgICBAaXNJbnRlZ2VyCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFJQQ19IVFRQU19QT1JUID0gImRycGMuaHR0cHMucG9ydCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgRFJQQ19IVFRQU19QT1JUX1NDSEVNQSA9IE51bWJlci5jbGFzczsKIAogICAgIC8qKgogICAgICAqIFBhdGggdG8gdGhlIGtleXN0b3JlIHVzZWQgYnkgU3Rvcm0gRFJQQyBmb3Igc2V0dGluZyB1cCBIVFRQUyAoU1NMKS4KICAgICAgKi8KKyAgICBAaXNTdHJpbmcKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEUlBDX0hUVFBTX0tFWVNUT1JFX1BBVEggPSAiZHJwYy5odHRwcy5rZXlzdG9yZS5wYXRoIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBEUlBDX0hUVFBTX0tFWVNUT1JFX1BBVEhfU0NIRU1BID0gU3RyaW5nLmNsYXNzOwogCiAgICAgLyoqCiAgICAgICogUGFzc3dvcmQgdG8gdGhlIGtleXN0b3JlIHVzZWQgYnkgU3Rvcm0gRFJQQyBmb3Igc2V0dGluZyB1cCBIVFRQUyAoU1NMKS4KICAgICAgKi8KKyAgICBAaXNTdHJpbmcKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEUlBDX0hUVFBTX0tFWVNUT1JFX1BBU1NXT1JEID0gImRycGMuaHR0cHMua2V5c3RvcmUucGFzc3dvcmQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IERSUENfSFRUUFNfS0VZU1RPUkVfUEFTU1dPUkRfU0NIRU1BID0gU3RyaW5nLmNsYXNzOwogCiAgICAgLyoqCiAgICAgICogVHlwZSBvZiBrZXlzdG9yZSB1c2VkIGJ5IFN0b3JtIERSUEMgZm9yIHNldHRpbmcgdXAgSFRUUFMgKFNTTCkuCiAgICAgICogc2VlIGh0dHA6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzcvZG9jcy9hcGkvamF2YS9zZWN1cml0eS9LZXlTdG9yZS5odG1sIGZvciBtb3JlIGRldGFpbHMuCiAgICAgICovCisgICAgQGlzU3RyaW5nCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFJQQ19IVFRQU19LRVlTVE9SRV9UWVBFID0gImRycGMuaHR0cHMua2V5c3RvcmUudHlwZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgRFJQQ19IVFRQU19LRVlTVE9SRV9UWVBFX1NDSEVNQSA9IFN0cmluZy5jbGFzczsKIAogICAgIC8qKgotICAgICAqIFBhc3N3b3JkIHRvIHRoZSBwcml2YXRlIGtleSBpbiB0aGUga2V5c3RvcmUgZm9yIHNldHR0aW5nIHVwIEhUVFBTIChTU0wpLgorICAgICAqIFBhc3N3b3JkIHRvIHRoZSBwcml2YXRlIGtleSBpbiB0aGUga2V5c3RvcmUgZm9yIHNldHRpbmcgdXAgSFRUUFMgKFNTTCkuCiAgICAgICovCisgICAgQGlzU3RyaW5nCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFJQQ19IVFRQU19LRVlfUEFTU1dPUkQgPSAiZHJwYy5odHRwcy5rZXkucGFzc3dvcmQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IERSUENfSFRUUFNfS0VZX1BBU1NXT1JEX1NDSEVNQSA9IFN0cmluZy5jbGFzczsKIAogICAgIC8qKgotICAgICAqIFBhdGggdG8gdGhlIHRydXN0c3RvcmUgdXNlZCBieSBTdG9ybSBEUlBDIHNldHR0aW5nIHVwIEhUVFBTIChTU0wpLgorICAgICAqIFBhdGggdG8gdGhlIHRydXN0c3RvcmUgdXNlZCBieSBTdG9ybSBEUlBDIHNldHRpbmcgdXAgSFRUUFMgKFNTTCkuCiAgICAgICovCisgICAgQGlzU3RyaW5nCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFJQQ19IVFRQU19UUlVTVFNUT1JFX1BBVEggPSAiZHJwYy5odHRwcy50cnVzdHN0b3JlLnBhdGgiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IERSUENfSFRUUFNfVFJVU1RTVE9SRV9QQVRIX1NDSEVNQSA9IFN0cmluZy5jbGFzczsKIAogICAgIC8qKgotICAgICAqIFBhc3N3b3JkIHRvIHRoZSB0cnVzdHN0b3JlIHVzZWQgYnkgU3Rvcm0gRFJQQyBzZXR0dGluZyB1cCBIVFRQUyAoU1NMKS4KKyAgICAgKiBQYXNzd29yZCB0byB0aGUgdHJ1c3RzdG9yZSB1c2VkIGJ5IFN0b3JtIERSUEMgc2V0dGluZyB1cCBIVFRQUyAoU1NMKS4KICAgICAgKi8KKyAgICBAaXNTdHJpbmcKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEUlBDX0hUVFBTX1RSVVNUU1RPUkVfUEFTU1dPUkQgPSAiZHJwYy5odHRwcy50cnVzdHN0b3JlLnBhc3N3b3JkIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBEUlBDX0hUVFBTX1RSVVNUU1RPUkVfUEFTU1dPUkRfU0NIRU1BID0gU3RyaW5nLmNsYXNzOwogCiAgICAgLyoqCiAgICAgICogVHlwZSBvZiB0cnVzdHN0b3JlIHVzZWQgYnkgU3Rvcm0gRFJQQyBmb3Igc2V0dGluZyB1cCBIVFRQUyAoU1NMKS4KICAgICAgKiBzZWUgaHR0cDovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvNy9kb2NzL2FwaS9qYXZhL3NlY3VyaXR5L0tleVN0b3JlLmh0bWwgZm9yIG1vcmUgZGV0YWlscy4KICAgICAgKi8KKyAgICBAaXNTdHJpbmcKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEUlBDX0hUVFBTX1RSVVNUU1RPUkVfVFlQRSA9ICJkcnBjLmh0dHBzLnRydXN0c3RvcmUudHlwZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgRFJQQ19IVFRQU19UUlVTVFNUT1JFX1RZUEVfU0NIRU1BID0gU3RyaW5nLmNsYXNzOwogCiAgICAgLyoqCi0gICAgICogUGFzc3dvcmQgdG8gdGhlIHRydXN0c3RvcmUgdXNlZCBieSBTdG9ybSBEUlBDIHNldHR0aW5nIHVwIEhUVFBTIChTU0wpLgorICAgICAqIFBhc3N3b3JkIHRvIHRoZSB0cnVzdHN0b3JlIHVzZWQgYnkgU3Rvcm0gRFJQQyBzZXR0aW5nIHVwIEhUVFBTIChTU0wpLgogICAgICAqLworICAgIEBpc0Jvb2xlYW4KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEUlBDX0hUVFBTX1dBTlRfQ0xJRU5UX0FVVEggPSAiZHJwYy5odHRwcy53YW50LmNsaWVudC5hdXRoIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBEUlBDX0hUVFBTX1dBTlRfQ0xJRU5UX0FVVEhfU0NIRU1BID0gQm9vbGVhbi5jbGFzczsKIAorICAgIEBpc0Jvb2xlYW4KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEUlBDX0hUVFBTX05FRURfQ0xJRU5UX0FVVEggPSAiZHJwYy5odHRwcy5uZWVkLmNsaWVudC5hdXRoIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBEUlBDX0hUVFBTX05FRURfQ0xJRU5UX0FVVEhfU0NIRU1BID0gQm9vbGVhbi5jbGFzczsKIAogICAgIC8qKgogICAgICAqIFRoZSBEUlBDIHRyYW5zcG9ydCBwbHVnLWluIGZvciBUaHJpZnQgY2xpZW50L3NlcnZlciBjb21tdW5pY2F0aW9uCiAgICAgICovCisgICAgQGlzU3RyaW5nCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFJQQ19USFJJRlRfVFJBTlNQT1JUX1BMVUdJTiA9ICJkcnBjLnRocmlmdC50cmFuc3BvcnQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IERSUENfVEhSSUZUX1RSQU5TUE9SVF9QTFVHSU5fU0NIRU1BID0gU3RyaW5nLmNsYXNzOwogCiAgICAgLyoqCiAgICAgICogVGhpcyBwb3J0IGlzIHVzZWQgYnkgU3Rvcm0gRFJQQyBmb3IgcmVjZWl2aW5nIERQUkMgcmVxdWVzdHMgZnJvbSBjbGllbnRzLgogICAgICAqLworICAgIEBpc0ludGVnZXIKKyAgICBAaXNQb3NpdGl2ZU51bWJlcgogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERSUENfUE9SVCA9ICJkcnBjLnBvcnQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IERSUENfUE9SVF9TQ0hFTUEgPSBDb25maWdWYWxpZGF0aW9uLkludGVnZXJWYWxpZGF0b3I7CiAKICAgICAvKioKICAgICAgKiBDbGFzcyBuYW1lIGZvciBhdXRob3JpemF0aW9uIHBsdWdpbiBmb3IgRFJQQyBjbGllbnQKICAgICAgKi8KKyAgICBAaXNTdHJpbmcKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEUlBDX0FVVEhPUklaRVIgPSAiZHJwYy5hdXRob3JpemVyIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBEUlBDX0FVVEhPUklaRVJfU0NIRU1BID0gU3RyaW5nLmNsYXNzOwogCiAgICAgLyoqCiAgICAgICogVGhlIEFjY2VzcyBDb250cm9sIExpc3QgZm9yIHRoZSBEUlBDIEF1dGhvcml6ZXIuCi0gICAgICogQHNlZSBEUlBDU2ltcGxlQWNsQXV0aG9yaXplcgorICAgICAqIEBzZWUgYmFja3R5cGUuc3Rvcm0uc2VjdXJpdHkuYXV0aC5hdXRob3JpemVyLkRSUENTaW1wbGVBQ0xBdXRob3JpemVyCiAgICAgICovCisgICAgQGlzVHlwZSh0eXBlPU1hcC5jbGFzcykKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEUlBDX0FVVEhPUklaRVJfQUNMID0gImRycGMuYXV0aG9yaXplci5hY2wiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IERSUENfQVVUSE9SSVpFUl9BQ0xfU0NIRU1BID0gTWFwLmNsYXNzOwogCiAgICAgLyoqCiAgICAgICogRmlsZSBuYW1lIG9mIHRoZSBEUlBDIEF1dGhvcml6ZXIgQUNMLgotICAgICAqIEBzZWUgRFJQQ1NpbXBsZUFjbEF1dGhvcml6ZXIKKyAgICAgKiBAc2VlIGJhY2t0eXBlLnN0b3JtLnNlY3VyaXR5LmF1dGguYXV0aG9yaXplci5EUlBDU2ltcGxlQUNMQXV0aG9yaXplcgogICAgICAqLworICAgIEBpc1N0cmluZwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERSUENfQVVUSE9SSVpFUl9BQ0xfRklMRU5BTUUgPSAiZHJwYy5hdXRob3JpemVyLmFjbC5maWxlbmFtZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgRFJQQ19BVVRIT1JJWkVSX0FDTF9GSUxFTkFNRV9TQ0hFTUEgPSBTdHJpbmcuY2xhc3M7CiAKICAgICAvKioKICAgICAgKiBXaGV0aGVyIHRoZSBEUlBDU2ltcGxlQWNsQXV0aG9yaXplciBzaG91bGQgZGVueSByZXF1ZXN0cyBmb3Igb3BlcmF0aW9ucwpAQCAtODIxLDEzMCArOTY0LDE0NiBAQAogICAgICAqIHBlcm1pdHRlZCwgd2hpY2ggaXMgYXBwcm9wcmlhdGUgZm9yIGEgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQuIFdoZW4gc2V0CiAgICAgICogdG8gdHJ1ZSwgZXhwbGljaXQgQUNMIGVudHJpZXMgYXJlIHJlcXVpcmVkIGZvciBldmVyeSBEUlBDIGZ1bmN0aW9uLCBhbmQKICAgICAgKiBhbnkgcmVxdWVzdCBmb3IgZnVuY3Rpb25zIHdpbGwgYmUgZGVuaWVkLgotICAgICAqIEBzZWUgRFJQQ1NpbXBsZUFjbEF1dGhvcml6ZXIKKyAgICAgKiBAc2VlIGJhY2t0eXBlLnN0b3JtLnNlY3VyaXR5LmF1dGguYXV0aG9yaXplci5EUlBDU2ltcGxlQUNMQXV0aG9yaXplcgogICAgICAqLworICAgIEBpc0Jvb2xlYW4KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEUlBDX0FVVEhPUklaRVJfQUNMX1NUUklDVCA9ICJkcnBjLmF1dGhvcml6ZXIuYWNsLnN0cmljdCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgRFJQQ19BVVRIT1JJWkVSX0FDTF9TVFJJQ1RfU0NIRU1BID0gQm9vbGVhbi5jbGFzczsKIAogICAgIC8qKgogICAgICAqIERSUEMgdGhyaWZ0IHNlcnZlciB3b3JrZXIgdGhyZWFkcwogICAgICAqLworICAgIEBpc0ludGVnZXIKKyAgICBAaXNQb3NpdGl2ZU51bWJlcgogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERSUENfV09SS0VSX1RIUkVBRFMgPSAiZHJwYy53b3JrZXIudGhyZWFkcyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgRFJQQ19XT1JLRVJfVEhSRUFEU19TQ0hFTUEgPSBDb25maWdWYWxpZGF0aW9uLkludGVnZXJWYWxpZGF0b3I7CiAKICAgICAvKioKICAgICAgKiBUaGUgbWF4aW11bSBidWZmZXIgc2l6ZSB0aHJpZnQgc2hvdWxkIHVzZSB3aGVuIHJlYWRpbmcgbWVzc2FnZXMgZm9yIERSUEMuCiAgICAgICovCisgICAgQGlzTnVtYmVyCisgICAgQGlzUG9zaXRpdmVOdW1iZXIKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEUlBDX01BWF9CVUZGRVJfU0laRSA9ICJkcnBjLm1heF9idWZmZXJfc2l6ZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgRFJQQ19NQVhfQlVGRkVSX1NJWkVfU0NIRU1BID0gTnVtYmVyLmNsYXNzOwogCiAgICAgLyoqCiAgICAgICogRFJQQyB0aHJpZnQgc2VydmVyIHF1ZXVlIHNpemUKICAgICAgKi8KKyAgICBAaXNJbnRlZ2VyCisgICAgQGlzUG9zaXRpdmVOdW1iZXIKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEUlBDX1FVRVVFX1NJWkUgPSAiZHJwYy5xdWV1ZS5zaXplIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBEUlBDX1FVRVVFX1NJWkVfU0NIRU1BID0gQ29uZmlnVmFsaWRhdGlvbi5JbnRlZ2VyVmFsaWRhdG9yOwogCiAgICAgLyoqCiAgICAgICogVGhlIERSUEMgaW52b2NhdGlvbnMgdHJhbnNwb3J0IHBsdWctaW4gZm9yIFRocmlmdCBjbGllbnQvc2VydmVyIGNvbW11bmljYXRpb24KICAgICAgKi8KKyAgICBAaXNTdHJpbmcKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEUlBDX0lOVk9DQVRJT05TX1RIUklGVF9UUkFOU1BPUlRfUExVR0lOID0gImRycGMuaW52b2NhdGlvbnMudGhyaWZ0LnRyYW5zcG9ydCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgRFJQQ19JTlZPQ0FUSU9OU19USFJJRlRfVFJBTlNQT1JUX1BMVUdJTl9TQ0hFTUEgPSBTdHJpbmcuY2xhc3M7CiAKICAgICAvKioKICAgICAgKiBUaGlzIHBvcnQgb24gU3Rvcm0gRFJQQyBpcyB1c2VkIGJ5IERSUEMgdG9wb2xvZ2llcyB0byByZWNlaXZlIGZ1bmN0aW9uIGludm9jYXRpb25zIGFuZCBzZW5kIHJlc3VsdHMgYmFjay4KICAgICAgKi8KKyAgICBAaXNJbnRlZ2VyCisgICAgQGlzUG9zaXRpdmVOdW1iZXIKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEUlBDX0lOVk9DQVRJT05TX1BPUlQgPSAiZHJwYy5pbnZvY2F0aW9ucy5wb3J0IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBEUlBDX0lOVk9DQVRJT05TX1BPUlRfU0NIRU1BID0gQ29uZmlnVmFsaWRhdGlvbi5JbnRlZ2VyVmFsaWRhdG9yOwogCiAgICAgLyoqCiAgICAgICogRFJQQyBpbnZvY2F0aW9ucyB0aHJpZnQgc2VydmVyIHdvcmtlciB0aHJlYWRzCiAgICAgICovCisgICAgQGlzSW50ZWdlcgorICAgIEBpc1Bvc2l0aXZlTnVtYmVyCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFJQQ19JTlZPQ0FUSU9OU19USFJFQURTID0gImRycGMuaW52b2NhdGlvbnMudGhyZWFkcyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgRFJQQ19JTlZPQ0FUSU9OU19USFJFQURTX1NDSEVNQSA9IE51bWJlci5jbGFzczsKIAogICAgIC8qKgogICAgICAqIFRoZSB0aW1lb3V0IG9uIERSUEMgcmVxdWVzdHMgd2l0aGluIHRoZSBEUlBDIHNlcnZlci4gRGVmYXVsdHMgdG8gMTAgbWludXRlcy4gTm90ZSB0aGF0IHJlcXVlc3RzIGNhbiBhbHNvCiAgICAgICogdGltZW91dCBiYXNlZCBvbiB0aGUgc29ja2V0IHRpbWVvdXQgb24gdGhlIERSUEMgY2xpZW50LCBhbmQgc2VwYXJhdGVseSBiYXNlZCBvbiB0aGUgdG9wb2xvZ3kgbWVzc2FnZQogICAgICAqIHRpbWVvdXQgZm9yIHRoZSB0b3BvbG9neSBpbXBsZW1lbnRpbmcgdGhlIERSUEMgZnVuY3Rpb24uCiAgICAgICovCisKKyAgICBAaXNJbnRlZ2VyCisgICAgQGlzUG9zaXRpdmVOdW1iZXIKKyAgICBATm90TnVsbAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERSUENfUkVRVUVTVF9USU1FT1VUX1NFQ1MgID0gImRycGMucmVxdWVzdC50aW1lb3V0LnNlY3MiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IERSUENfUkVRVUVTVF9USU1FT1VUX1NFQ1NfU0NIRU1BID0gQ29uZmlnVmFsaWRhdGlvbi5Ob3ROdWxsUG9zSW50ZWdlclZhbGlkYXRvcjsKIAogICAgIC8qKgogICAgICAqIENoaWxkb3B0cyBmb3IgU3Rvcm0gRFJQQyBKYXZhIHByb2Nlc3MuCiAgICAgICovCisgICAgQGlzU3RyaW5nCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFJQQ19DSElMRE9QVFMgPSAiZHJwYy5jaGlsZG9wdHMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IERSUENfQ0hJTERPUFRTX1NDSEVNQSA9IFN0cmluZy5jbGFzczsKIAogICAgIC8qKgogICAgICAqIENsYXNzIG5hbWUgb2YgdGhlIEhUVFAgY3JlZGVudGlhbHMgcGx1Z2luIGZvciB0aGUgVUkuCiAgICAgICovCisgICAgQGlzU3RyaW5nCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVUlfSFRUUF9DUkVEU19QTFVHSU4gPSAidWkuaHR0cC5jcmVkcy5wbHVnaW4iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFVJX0hUVFBfQ1JFRFNfUExVR0lOX1NDSEVNQSA9IFN0cmluZy5jbGFzczsKIAogICAgIC8qKgogICAgICAqIENsYXNzIG5hbWUgb2YgdGhlIEhUVFAgY3JlZGVudGlhbHMgcGx1Z2luIGZvciBEUlBDLgogICAgICAqLworICAgIEBpc1N0cmluZwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERSUENfSFRUUF9DUkVEU19QTFVHSU4gPSAiZHJwYy5odHRwLmNyZWRzLnBsdWdpbiI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgRFJQQ19IVFRQX0NSRURTX1BMVUdJTl9TQ0hFTUEgPSBTdHJpbmcuY2xhc3M7CiAKICAgICAvKioKICAgICAgKiB0aGUgbWV0YWRhdGEgY29uZmlndXJlZCBvbiB0aGUgc3VwZXJ2aXNvcgogICAgICAqLworICAgIEBpc1R5cGUodHlwZT1NYXAuY2xhc3MpCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VQRVJWSVNPUl9TQ0hFRFVMRVJfTUVUQSA9ICJzdXBlcnZpc29yLnNjaGVkdWxlci5tZXRhIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBTVVBFUlZJU09SX1NDSEVEVUxFUl9NRVRBX1NDSEVNQSA9IE1hcC5jbGFzczsKKwogICAgIC8qKgogICAgICAqIEEgbGlzdCBvZiBwb3J0cyB0aGF0IGNhbiBydW4gd29ya2VycyBvbiB0aGlzIHN1cGVydmlzb3IuIEVhY2ggd29ya2VyIHVzZXMgb25lIHBvcnQsIGFuZAogICAgICAqIHRoZSBzdXBlcnZpc29yIHdpbGwgb25seSBydW4gb25lIHdvcmtlciBwZXIgcG9ydC4gVXNlIHRoaXMgY29uZmlndXJhdGlvbiB0byB0dW5lCiAgICAgICogaG93IG1hbnkgd29ya2VycyBydW4gb24gZWFjaCBtYWNoaW5lLgogICAgICAqLworICAgIEBpc05vRHVwbGljYXRlSW5MaXN0CisgICAgQE5vdE51bGwKKyAgICBAaXNMaXN0RW50cnlDdXN0b20oZW50cnlWYWxpZGF0b3JDbGFzc2VzPXtJbnRlZ2VyVmFsaWRhdG9yLmNsYXNzLFBvc2l0aXZlTnVtYmVyVmFsaWRhdG9yLmNsYXNzfSkKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVVBFUlZJU09SX1NMT1RTX1BPUlRTID0gInN1cGVydmlzb3Iuc2xvdHMucG9ydHMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFNVUEVSVklTT1JfU0xPVFNfUE9SVFNfU0NIRU1BID0gQ29uZmlnVmFsaWRhdGlvbi5Ob0R1cGxpY2F0ZUludGVnZXJzVmFsaWRhdG9yOwogCiAgICAgLyoqCiAgICAgICogQSBudW1iZXIgcmVwcmVzZW50aW5nIHRoZSBtYXhpbXVtIG51bWJlciBvZiB3b3JrZXJzIGFueSBzaW5nbGUgdG9wb2xvZ3kgY2FuIGFjcXVpcmUuCiAgICAgICovCisgICAgQGlzSW50ZWdlcgorICAgIEBpc1Bvc2l0aXZlTnVtYmVyKGluY2x1ZGVaZXJvID0gdHJ1ZSkKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOSU1CVVNfU0xPVFNfUEVSX1RPUE9MT0dZID0gIm5pbWJ1cy5zbG90cy5wZXJUb3BvbG9neSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgTklNQlVTX1NMT1RTX1BFUl9UT1BPTE9HWV9TQ0hFTUEgPSBOdW1iZXIuY2xhc3M7CiAKICAgICAvKioKICAgICAgKiBBIGNsYXNzIGltcGxlbWVudGluZyBqYXZheC5zZXJ2bGV0LkZpbHRlciBmb3IgRFJQQyBIVFRQIHJlcXVlc3RzCiAgICAgICovCisgICAgQGlzU3RyaW5nCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFJQQ19IVFRQX0ZJTFRFUiA9ICJkcnBjLmh0dHAuZmlsdGVyIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBEUlBDX0hUVFBfRklMVEVSX1NDSEVNQSA9IFN0cmluZy5jbGFzczsKIAogICAgIC8qKgogICAgICAqIEluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMgZm9yIHRoZSBqYXZheC5zZXJ2bGV0LkZpbHRlciBvZiB0aGUgRFJQQyBIVFRQCiAgICAgICogc2VydmljZQogICAgICAqLworICAgIEBpc01hcEVudHJ5VHlwZShrZXlUeXBlID0gU3RyaW5nLmNsYXNzLCB2YWx1ZVR5cGUgPSBTdHJpbmcuY2xhc3MpCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRFJQQ19IVFRQX0ZJTFRFUl9QQVJBTVMgPSAiZHJwYy5odHRwLmZpbHRlci5wYXJhbXMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IERSUENfSFRUUF9GSUxURVJfUEFSQU1TX1NDSEVNQSA9IE1hcC5jbGFzczsKIAogICAgIC8qKgogICAgICAqIEEgbnVtYmVyIHJlcHJlc2VudGluZyB0aGUgbWF4aW11bSBudW1iZXIgb2YgZXhlY3V0b3JzIGFueSBzaW5nbGUgdG9wb2xvZ3kgY2FuIGFjcXVpcmUuCiAgICAgICovCisgICAgQGlzSW50ZWdlcgorICAgIEBpc1Bvc2l0aXZlTnVtYmVyKGluY2x1ZGVaZXJvID0gdHJ1ZSkKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOSU1CVVNfRVhFQ1VUT1JTX1BFUl9UT1BPTE9HWSA9ICJuaW1idXMuZXhlY3V0b3JzLnBlclRvcG9sb2d5IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBOSU1CVVNfRVhFQ1VUT1JTX1BFUl9UT1BPTE9HWV9TQ0hFTUEgPSBOdW1iZXIuY2xhc3M7CiAKICAgICAvKioKICAgICAgKiBUaGlzIHBhcmFtZXRlciBpcyB1c2VkIGJ5IHRoZSBzdG9ybS1kZXBsb3kgcHJvamVjdCB0byBjb25maWd1cmUgdGhlCiAgICAgICoganZtIG9wdGlvbnMgZm9yIHRoZSBzdXBlcnZpc29yIGRhZW1vbi4KICAgICAgKi8KKyAgICBAaXNTdHJpbmcKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVVBFUlZJU09SX0NISUxET1BUUyA9ICJzdXBlcnZpc29yLmNoaWxkb3B0cyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgU1VQRVJWSVNPUl9DSElMRE9QVFNfU0NIRU1BID0gU3RyaW5nLmNsYXNzOwogCiAgICAgLyoqCiAgICAgICogSG93IGxvbmcgYSB3b3JrZXIgY2FuIGdvIHdpdGhvdXQgaGVhcnRiZWF0aW5nIGJlZm9yZSB0aGUgc3VwZXJ2aXNvciB0cmllcyB0bwogICAgICAqIHJlc3RhcnQgdGhlIHdvcmtlciBwcm9jZXNzLgogICAgICAqLworICAgIEBpc0ludGVnZXIKKyAgICBAaXNQb3NpdGl2ZU51bWJlcgorICAgIEBOb3ROdWxsCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VQRVJWSVNPUl9XT1JLRVJfVElNRU9VVF9TRUNTID0gInN1cGVydmlzb3Iud29ya2VyLnRpbWVvdXQuc2VjcyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgU1VQRVJWSVNPUl9XT1JLRVJfVElNRU9VVF9TRUNTX1NDSEVNQSA9IENvbmZpZ1ZhbGlkYXRpb24uTm90TnVsbFBvc0ludGVnZXJWYWxpZGF0b3I7CiAKICAgICAvKioKICAgICAgKiBIb3cgbWFueSBzZWNvbmRzIHRvIHNsZWVwIGZvciBiZWZvcmUgc2h1dHRpbmcgZG93biB0aHJlYWRzIG9uIHdvcmtlcgogICAgICAqLworICAgIEBpc0ludGVnZXIKKyAgICBAaXNQb3NpdGl2ZU51bWJlcgogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVUEVSVklTT1JfV09SS0VSX1NIVVRET1dOX1NMRUVQX1NFQ1MgPSAic3VwZXJ2aXNvci53b3JrZXIuc2h1dGRvd24uc2xlZXAuc2VjcyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgU1VQRVJWSVNPUl9XT1JLRVJfU0hVVERPV05fU0xFRVBfU0VDU19TQ0hFTUEgPSBDb25maWdWYWxpZGF0aW9uLkludGVnZXJWYWxpZGF0b3I7CiAKICAgICAvKioKICAgICAgKiBIb3cgbG9uZyBhIHdvcmtlciBjYW4gZ28gd2l0aG91dCBoZWFydGJlYXRpbmcgZHVyaW5nIHRoZSBpbml0aWFsIGxhdW5jaCBiZWZvcmUKQEAgLTk1Miw4MSArMTExMSwxMjUgQEAKICAgICAgKiBzdXBlcnZpc29yLndvcmtlci50aW1lb3V0LnNlY3MgZHVyaW5nIGxhdW5jaCBiZWNhdXNlIHRoZXJlIGlzIGFkZGl0aW9uYWwKICAgICAgKiBvdmVyaGVhZCB0byBzdGFydGluZyBhbmQgY29uZmlndXJpbmcgdGhlIEpWTSBvbiBsYXVuY2guCiAgICAgICovCisgICAgQGlzSW50ZWdlcgorICAgIEBpc1Bvc2l0aXZlTnVtYmVyCisgICAgQE5vdE51bGwKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVVBFUlZJU09SX1dPUktFUl9TVEFSVF9USU1FT1VUX1NFQ1MgPSAic3VwZXJ2aXNvci53b3JrZXIuc3RhcnQudGltZW91dC5zZWNzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBTVVBFUlZJU09SX1dPUktFUl9TVEFSVF9USU1FT1VUX1NFQ1NfU0NIRU1BID0gQ29uZmlnVmFsaWRhdGlvbi5Ob3ROdWxsUG9zSW50ZWdlclZhbGlkYXRvcjsKIAogICAgIC8qKgogICAgICAqIFdoZXRoZXIgb3Igbm90IHRoZSBzdXBlcnZpc29yIHNob3VsZCBsYXVuY2ggd29ya2VycyBhc3NpZ25lZCB0byBpdC4gRGVmYXVsdHMKICAgICAgKiB0byB0cnVlIC0tIGFuZCB5b3Ugc2hvdWxkIHByb2JhYmx5IG5ldmVyIGNoYW5nZSB0aGlzIHZhbHVlLiBUaGlzIGNvbmZpZ3VyYXRpb24KICAgICAgKiBpcyB1c2VkIGluIHRoZSBTdG9ybSB1bml0IHRlc3RzLgogICAgICAqLworICAgIEBpc0Jvb2xlYW4KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVVBFUlZJU09SX0VOQUJMRSA9ICJzdXBlcnZpc29yLmVuYWJsZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgU1VQRVJWSVNPUl9FTkFCTEVfU0NIRU1BID0gQm9vbGVhbi5jbGFzczsKIAogICAgIC8qKgogICAgICAqIGhvdyBvZnRlbiB0aGUgc3VwZXJ2aXNvciBzZW5kcyBhIGhlYXJ0YmVhdCB0byB0aGUgbWFzdGVyLgogICAgICAqLworICAgIEBpc0ludGVnZXIKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVVBFUlZJU09SX0hFQVJUQkVBVF9GUkVRVUVOQ1lfU0VDUyA9ICJzdXBlcnZpc29yLmhlYXJ0YmVhdC5mcmVxdWVuY3kuc2VjcyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgU1VQRVJWSVNPUl9IRUFSVEJFQVRfRlJFUVVFTkNZX1NFQ1NfU0NIRU1BID0gQ29uZmlnVmFsaWRhdGlvbi5JbnRlZ2VyVmFsaWRhdG9yOwogCiAKICAgICAvKioKICAgICAgKiBIb3cgb2Z0ZW4gdGhlIHN1cGVydmlzb3IgY2hlY2tzIHRoZSB3b3JrZXIgaGVhcnRiZWF0cyB0byBzZWUgaWYgYW55IG9mIHRoZW0KICAgICAgKiBuZWVkIHRvIGJlIHJlc3RhcnRlZC4KICAgICAgKi8KKyAgICBAaXNJbnRlZ2VyCisgICAgQGlzUG9zaXRpdmVOdW1iZXIKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVVBFUlZJU09SX01PTklUT1JfRlJFUVVFTkNZX1NFQ1MgPSAic3VwZXJ2aXNvci5tb25pdG9yLmZyZXF1ZW5jeS5zZWNzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBTVVBFUlZJU09SX01PTklUT1JfRlJFUVVFTkNZX1NFQ1NfU0NIRU1BID0gQ29uZmlnVmFsaWRhdGlvbi5JbnRlZ2VyVmFsaWRhdG9yOwogCiAgICAgLyoqCiAgICAgICogU2hvdWxkIHRoZSBzdXBlcnZpb3IgdHJ5IHRvIHJ1biB0aGUgd29ya2VyIGFzIHRoZSBsYXVjaGluZyB1c2VyIG9yIG5vdC4gIERlZmF1bHRzIHRvIGZhbHNlLgogICAgICAqLworICAgIEBpc0Jvb2xlYW4KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVVBFUlZJU09SX1JVTl9XT1JLRVJfQVNfVVNFUiA9ICJzdXBlcnZpc29yLnJ1bi53b3JrZXIuYXMudXNlciI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgU1VQRVJWSVNPUl9SVU5fV09SS0VSX0FTX1VTRVJfU0NIRU1BID0gQm9vbGVhbi5jbGFzczsKIAogICAgIC8qKgogICAgICAqIEZ1bGwgcGF0aCB0byB0aGUgd29ya2VyLWxhdWNoZXIgZXhlY3V0YWJsZSB0aGF0IHdpbGwgYmUgdXNlZCB0byBsYXVjaCB3b3JrZXJzIHdoZW4KICAgICAgKiBTVVBFUlZJU09SX1JVTl9XT1JLRVJfQVNfVVNFUiBpcyBzZXQgdG8gdHJ1ZS4KICAgICAgKi8KKyAgICBAaXNTdHJpbmcKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVVBFUlZJU09SX1dPUktFUl9MQVVOQ0hFUiA9ICJzdXBlcnZpc29yLndvcmtlci5sYXVuY2hlciI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgU1VQRVJWSVNPUl9XT1JLRVJfTEFVTkNIRVJfU0NIRU1BID0gU3RyaW5nLmNsYXNzOwogCiAgICAgLyoqCi0gICAgICogVGhlIGp2bSBvcHRzIHByb3ZpZGVkIHRvIHdvcmtlcnMgbGF1bmNoZWQgYnkgdGhpcyBzdXBlcnZpc29yLiBBbGwgIiVJRCUiLCAiJVdPUktFUi1JRCUiLCAiJVRPUE9MT0dZLUlEJSIKLSAgICAgKiBhbmQgIiVXT1JLRVItUE9SVCUiIHN1YnN0cmluZ3MgYXJlIHJlcGxhY2VkIHdpdGg6CisgICAgICogVGhlIHRvdGFsIGFtb3VudCBvZiBtZW1vcnkgKGluIE1pQikgYSBzdXBlcnZpc29yIGlzIGFsbG93ZWQgdG8gZ2l2ZSB0byBpdHMgd29ya2Vycy4KKyAgICAgKiAgQSBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgc2V0IGZvciB0aGlzIGNvbmZpZyBpZiB1c2VyIGRvZXMgbm90IG92ZXJyaWRlCisgICAgICovCisgICAgQGlzUG9zaXRpdmVOdW1iZXIKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVVBFUlZJU09SX01FTU9SWV9DQVBBQ0lUWV9NQiA9ICJzdXBlcnZpc29yLm1lbW9yeS5jYXBhY2l0eS5tYiI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdG90YWwgYW1vdW50IG9mIENQVSByZXNvdXJjZXMgYSBzdXBlcnZpc29yIGlzIGFsbG93ZWQgdG8gZ2l2ZSB0byBpdHMgd29ya2Vycy4KKyAgICAgKiBCeSBjb252ZW50aW9uIDEgY3B1IGNvcmUgc2hvdWxkIGJlIGFib3V0IDEwMCwgYnV0IHRoaXMgY2FuIGJlIGFkanVzdGVkIGlmIG5lZWRlZAorICAgICAqIHVzaW5nIDEwMCBtYWtlcyBpdCBzaW1wbGUgdG8gc2V0IHRoZSBkZXNpcmVkIHZhbHVlIHRvIHRoZSBjYXBhY2l0eSBtZWFzdXJlbWVudAorICAgICAqIGZvciBzaW5nbGUgdGhyZWFkZWQgYm9sdHMuICBBIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSBzZXQgZm9yIHRoaXMgY29uZmlnIGlmIHVzZXIgZG9lcyBub3Qgb3ZlcnJpZGUKKyAgICAgKi8KKyAgICBAaXNQb3NpdGl2ZU51bWJlcgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVUEVSVklTT1JfQ1BVX0NBUEFDSVRZID0gInN1cGVydmlzb3IuY3B1LmNhcGFjaXR5IjsKKworICAgIC8qKgorICAgICAqIFRoZSBqdm0gb3B0cyBwcm92aWRlZCB0byB3b3JrZXJzIGxhdW5jaGVkIGJ5IHRoaXMgc3VwZXJ2aXNvci4KKyAgICAgKiBBbGwgIiVJRCUiLCAiJVdPUktFUi1JRCUiLCAiJVRPUE9MT0dZLUlEJSIsCisgICAgICogIiVXT1JLRVItUE9SVCUiIGFuZCAiJUhFQVAtTUVNJSIgc3Vic3RyaW5ncyBhcmUgcmVwbGFjZWQgd2l0aDoKICAgICAgKiAlSUQlICAgICAgICAgIC0+IHBvcnQgKGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KSwKICAgICAgKiAlV09SS0VSLUlEJSAgIC0+IHdvcmtlci1pZCwKICAgICAgKiAlVE9QT0xPR1ktSUQlICAgIC0+IHRvcG9sb2d5LWlkLAogICAgICAqICVXT1JLRVItUE9SVCUgLT4gcG9ydC4KKyAgICAgKiAlSEVBUC1NRU0lIC0+IG1lbS1vbmhlYXAuCiAgICAgICovCisgICAgQGlzU3RyaW5nT3JTdHJpbmdMaXN0CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV09SS0VSX0NISUxET1BUUyA9ICJ3b3JrZXIuY2hpbGRvcHRzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBXT1JLRVJfQ0hJTERPUFRTX1NDSEVNQSA9IENvbmZpZ1ZhbGlkYXRpb24uU3RyaW5nT3JTdHJpbmdMaXN0VmFsaWRhdG9yOworCisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgaGVhcCBtZW1vcnkgc2l6ZSBpbiBNQiBwZXIgd29ya2VyLCB1c2VkIGluIHRoZSBqdm0gLVhteCBvcHRzIGZvciBsYXVuY2hpbmcgdGhlIHdvcmtlcgorICAgICAgKi8KKyAgICBAaXNJbnRlZ2VyCisgICAgQGlzUG9zaXRpdmVOdW1iZXIKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLRVJfSEVBUF9NRU1PUllfTUIgPSAid29ya2VyLmhlYXAubWVtb3J5Lm1iIjsKKworICAgIC8qKgorICAgICAqIFRoZSBqdm0gcHJvZmlsZXIgb3B0cyBwcm92aWRlZCB0byB3b3JrZXJzIGxhdW5jaGVkIGJ5IHRoaXMgc3VwZXJ2aXNvci4KKyAgICAgKi8KKyAgICBAaXNTdHJpbmdPclN0cmluZ0xpc3QKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLRVJfUFJPRklMRVJfQ0hJTERPUFRTID0gIndvcmtlci5wcm9maWxlci5jaGlsZG9wdHMiOworCisgICAgLyoqCisgICAgICogVGhpcyBjb25maWd1cmF0aW9uIHdvdWxkIGVuYWJsZSBvciBkaXNhYmxlIGNvbXBvbmVudCBwYWdlIHByb2ZpaW5nIGFuZCBkZWJ1Z2dpbmcgZm9yIHdvcmtlcnMuCisgICAgICovCisgICAgQGlzQm9vbGVhbgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFdPUktFUl9QUk9GSUxFUl9FTkFCTEVEID0gIndvcmtlci5wcm9maWxlci5lbmFibGVkIjsKKworICAgIC8qKgorICAgICAqIFRoZSBjb21tYW5kIGxhdW5jaGVkIHN1cGVydmlzb3Igd2l0aCB3b3JrZXIgYXJndW1lbnRzCisgICAgICogcGlkLCBhY3Rpb24gYW5kIFt0YXJnZXRfZGlyZWN0b3J5XQorICAgICAqIFdoZXJlIGFjdGlvbiBpcyAtIHN0YXJ0IHByb2ZpbGUsIHN0b3AgcHJvZmlsZSwganN0YWNrLCBoZWFwZHVtcCBhbmQga2lsbCBhZ2FpbnN0IHBpZAorICAgICAqCisgICAgICovCisgICAgQGlzU3RyaW5nCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV09SS0VSX1BST0ZJTEVSX0NPTU1BTkQgPSAid29ya2VyLnByb2ZpbGVyLmNvbW1hbmQiOwogCiAgICAgLyoqCiAgICAgICogVGhlIGp2bSBvcHRzIHByb3ZpZGVkIHRvIHdvcmtlcnMgbGF1bmNoZWQgYnkgdGhpcyBzdXBlcnZpc29yIGZvciBHQy4gQWxsICIlSUQlIiBzdWJzdHJpbmdzIGFyZSByZXBsYWNlZAogICAgICAqIHdpdGggYW4gaWRlbnRpZmllciBmb3IgdGhpcyB3b3JrZXIuICBCZWNhdXNlIHRoZSBKVk0gY29tcGxhaW5zIGFib3V0IG11bHRpcGxlIEdDIG9wdHMgdGhlIHRvcG9sb2d5CiAgICAgICogY2FuIG92ZXJyaWRlIHRoaXMgZGVmYXVsdCB2YWx1ZSBieSBzZXR0aW5nIHRvcG9sb2d5Lndvcmtlci5nYy5jaGlsZG9wdHMuCiAgICAgICovCisgICAgQGlzU3RyaW5nT3JTdHJpbmdMaXN0CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV09SS0VSX0dDX0NISUxET1BUUyA9ICJ3b3JrZXIuZ2MuY2hpbGRvcHRzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBXT1JLRVJfR0NfQ0hJTERPUFRTX1NDSEVNQSA9IENvbmZpZ1ZhbGlkYXRpb24uU3RyaW5nT3JTdHJpbmdMaXN0VmFsaWRhdG9yOwotCi0gICAgLyoqCi0gICAgICogY29udHJvbCBob3cgbWFueSB3b3JrZXIgcmVjZWl2ZXIgdGhyZWFkcyB3ZSBuZWVkIHBlciB3b3JrZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLRVJfUkVDRUlWRVJfVEhSRUFEX0NPVU5UID0gInRvcG9sb2d5Lndvcmtlci5yZWNlaXZlci50aHJlYWQuY291bnQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFdPUktFUl9SRUNFSVZFUl9USFJFQURfQ09VTlRfU0NIRU1BID0gQ29uZmlnVmFsaWRhdGlvbi5JbnRlZ2VyVmFsaWRhdG9yOwogCiAgICAgLyoqCiAgICAgICogSG93IG9mdGVuIHRoaXMgd29ya2VyIHNob3VsZCBoZWFydGJlYXQgdG8gdGhlIHN1cGVydmlzb3IuCiAgICAgICovCisgICAgQGlzSW50ZWdlcgorICAgIEBpc1Bvc2l0aXZlTnVtYmVyCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV09SS0VSX0hFQVJUQkVBVF9GUkVRVUVOQ1lfU0VDUyA9ICJ3b3JrZXIuaGVhcnRiZWF0LmZyZXF1ZW5jeS5zZWNzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBXT1JLRVJfSEVBUlRCRUFUX0ZSRVFVRU5DWV9TRUNTX1NDSEVNQSA9IENvbmZpZ1ZhbGlkYXRpb24uSW50ZWdlclZhbGlkYXRvcjsKIAogICAgIC8qKgogICAgICAqIEhvdyBvZnRlbiBhIHRhc2sgc2hvdWxkIGhlYXJ0YmVhdCBpdHMgc3RhdHVzIHRvIHRoZSBtYXN0ZXIuCiAgICAgICovCisgICAgQGlzSW50ZWdlcgorICAgIEBpc1Bvc2l0aXZlTnVtYmVyCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFTS19IRUFSVEJFQVRfRlJFUVVFTkNZX1NFQ1MgPSAidGFzay5oZWFydGJlYXQuZnJlcXVlbmN5LnNlY3MiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFRBU0tfSEVBUlRCRUFUX0ZSRVFVRU5DWV9TRUNTX1NDSEVNQSA9IENvbmZpZ1ZhbGlkYXRpb24uSW50ZWdlclZhbGlkYXRvcjsKLQogCiAgICAgLyoqCiAgICAgICogSG93IG9mdGVuIGEgdGFzayBzaG91bGQgc3luYyBpdHMgY29ubmVjdGlvbnMgd2l0aCBvdGhlciB0YXNrcyAoaWYgYSB0YXNrIGlzCkBAIC0xMDM1LDIyICsxMjM4LDMxIEBACiAgICAgICogYWxtb3N0IGltbWVkaWF0ZWx5LiBUaGlzIGNvbmZpZ3VyYXRpb24gaXMgaGVyZSBqdXN0IGluIGNhc2UgdGhhdCBub3RpZmljYXRpb24gZG9lc24ndAogICAgICAqIGNvbWUgdGhyb3VnaC4KICAgICAgKi8KKyAgICBAaXNJbnRlZ2VyCisgICAgQGlzUG9zaXRpdmVOdW1iZXIKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUQVNLX1JFRlJFU0hfUE9MTF9TRUNTID0gInRhc2sucmVmcmVzaC5wb2xsLnNlY3MiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFRBU0tfUkVGUkVTSF9QT0xMX1NFQ1NfU0NIRU1BID0gQ29uZmlnVmFsaWRhdGlvbi5JbnRlZ2VyVmFsaWRhdG9yOwogCisgICAgLyoqCisgICAgICogSG93IG9mdGVuIGEgd29ya2VyIHNob3VsZCBjaGVjayBkeW5hbWljIGxvZyBsZXZlbCB0aW1lb3V0cyBmb3IgZXhwaXJhdGlvbi4KKyAgICAgKiBGb3IgZXhwaXJlZCBsb2dnZXIgc2V0dGluZ3MsIHRoZSBjbGVhbiB1cCBwb2xsaW5nIHRhc2sgd2lsbCByZXNldCB0aGUgbG9nIGxldmVscworICAgICAqIHRvIHRoZSBvcmlnaW5hbCBsZXZlbHMgKGRldGVjdGVkIGF0IHN0YXJ0dXApLCBhbmQgd2lsbCBjbGVhbiB1cCB0aGUgdGltZW91dCBtYXAKKyAgICAgKi8KKyAgICBAaXNJbnRlZ2VyCisgICAgQGlzUG9zaXRpdmVOdW1iZXIKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLRVJfTE9HX0xFVkVMX1JFU0VUX1BPTExfU0VDUyA9ICJ3b3JrZXIubG9nLmxldmVsLnJlc2V0LnBvbGwuc2VjcyI7CiAKICAgICAvKioKICAgICAgKiBIb3cgb2Z0ZW4gYSB0YXNrIHNob3VsZCBzeW5jIGNyZWRlbnRpYWxzLCB3b3JzdCBjYXNlLgogICAgICAqLworICAgIEBpc0ludGVnZXIKKyAgICBAaXNQb3NpdGl2ZU51bWJlcgogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRBU0tfQ1JFREVOVElBTFNfUE9MTF9TRUNTID0gInRhc2suY3JlZGVudGlhbHMucG9sbC5zZWNzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBUQVNLX0NSRURFTlRJQUxTX1BPTExfU0VDU19TQ0hFTUEgPSBOdW1iZXIuY2xhc3M7Ci0KIAogICAgIC8qKgogICAgICAqIFdoZXRoZXIgdG8gZW5hYmxlIGJhY2twcmVzc3VyZSBpbiBmb3IgYSBjZXJ0YWluIHRvcG9sb2d5CiAgICAgICovCisgICAgQGlzQm9vbGVhbgogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUE9MT0dZX0JBQ0tQUkVTU1VSRV9FTkFCTEUgPSAidG9wb2xvZ3kuYmFja3ByZXNzdXJlLmVuYWJsZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgVE9QT0xPR1lfQkFDS1BSRVNTVVJFX0VOQUJMRV9TQ0hFTUEgPSBCb29sZWFuLmNsYXNzOwogCiAgICAgLyoqCiAgICAgICogVGhpcyBzaWduaWZpZXMgdGhlIHR1cGxlIGNvbmdlc3Rpb24gaW4gYSBkaXNydXB0b3IgcXVldWUuCkBAIC0xMDU4LDUwICsxMjcwLDUwIEBACiAgICAgICogdGhlIGJhY2twcmVzc3VyZSBzY2hlbWUsIGlmIGVuYWJsZWQsIHNob3VsZCBzbG93IGRvd24gdGhlIHR1cGxlIHNlbmRpbmcgc3BlZWQgb2YKICAgICAgKiB0aGUgc3BvdXRzIHVudGlsIHJlYWNoaW5nIHRoZSBsb3cgd2F0ZXJtYXJrLgogICAgICAqLworICAgIEBpc1Bvc2l0aXZlTnVtYmVyCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFDS1BSRVNTVVJFX0RJU1JVUFRPUl9ISUdIX1dBVEVSTUFSSz0iYmFja3ByZXNzdXJlLmRpc3J1cHRvci5oaWdoLndhdGVybWFyayI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgQkFDS1BSRVNTVVJFX0RJU1JVUFRPUl9ISUdIX1dBVEVSTUFSS19TQ0hFTUEgPUNvbmZpZ1ZhbGlkYXRpb24uUG9zaXRpdmVOdW1iZXJWYWxpZGF0b3I7CiAKICAgICAvKioKICAgICAgKiBUaGlzIHNpZ25pZmllcyBhIHN0YXRlIHRoYXQgYSBkaXNydXB0b3IgcXVldWUgaGFzIGxlZnQgdGhlIGNvbmdlc3Rpb24uCiAgICAgICogSWYgdGhlIHVzZWQgcmF0aW8gb2YgYSBkaXNydXB0b3IgcXVldWUgaXMgbG93ZXIgdGhhbiB0aGUgbG93IHdhdGVybWFyaywKICAgICAgKiBpdCB3aWxsIHVuc2V0IHRoZSBiYWNrcHJlc3N1cmUgZmxhZy4KICAgICAgKi8KKyAgICBAaXNQb3NpdGl2ZU51bWJlcgogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEJBQ0tQUkVTU1VSRV9ESVNSVVBUT1JfTE9XX1dBVEVSTUFSSz0iYmFja3ByZXNzdXJlLmRpc3J1cHRvci5sb3cud2F0ZXJtYXJrIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBCQUNLUFJFU1NVUkVfRElTUlVQVE9SX0xPV19XQVRFUk1BUktfU0NIRU1BID1Db25maWdWYWxpZGF0aW9uLlBvc2l0aXZlTnVtYmVyVmFsaWRhdG9yOwogCiAgICAgLyoqCiAgICAgICogQSBsaXN0IG9mIHVzZXJzIHRoYXQgYXJlIGFsbG93ZWQgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgdG9wb2xvZ3kuICBUbyB1c2UgdGhpcyBzZXQKICAgICAgKiBuaW1idXMuYXV0aG9yaXplciB0byBiYWNrdHlwZS5zdG9ybS5zZWN1cml0eS5hdXRoLmF1dGhvcml6ZXIuU2ltcGxlQUNMQXV0aG9yaXplcgogICAgICAqLworICAgIEBpc1N0cmluZ0xpc3QKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BPTE9HWV9VU0VSUyA9ICJ0b3BvbG9neS51c2VycyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgVE9QT0xPR1lfVVNFUlNfU0NIRU1BID0gQ29uZmlnVmFsaWRhdGlvbi5TdHJpbmdzVmFsaWRhdG9yOwogCiAgICAgLyoqCiAgICAgICogQSBsaXN0IG9mIGdyb3VwcyB0aGF0IGFyZSBhbGxvd2VkIHRvIGludGVyYWN0IHdpdGggdGhlIHRvcG9sb2d5LiAgVG8gdXNlIHRoaXMgc2V0CiAgICAgICogbmltYnVzLmF1dGhvcml6ZXIgdG8gYmFja3R5cGUuc3Rvcm0uc2VjdXJpdHkuYXV0aC5hdXRob3JpemVyLlNpbXBsZUFDTEF1dGhvcml6ZXIKICAgICAgKi8KKyAgICBAaXNTdHJpbmdMaXN0CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QT0xPR1lfR1JPVVBTID0gInRvcG9sb2d5Lmdyb3VwcyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgVE9QT0xPR1lfR1JPVVBTX1NDSEVNQSA9IENvbmZpZ1ZhbGlkYXRpb24uU3RyaW5nc1ZhbGlkYXRvcjsKIAogICAgIC8qKgogICAgICAqIFRydWUgaWYgU3Rvcm0gc2hvdWxkIHRpbWVvdXQgbWVzc2FnZXMgb3Igbm90LiBEZWZhdWx0cyB0byB0cnVlLiBUaGlzIGlzIG1lYW50IHRvIGJlIHVzZWQKICAgICAgKiBpbiB1bml0IHRlc3RzIHRvIHByZXZlbnQgdHVwbGVzIGZyb20gYmVpbmcgYWNjaWRlbnRhbGx5IHRpbWVkIG91dCBkdXJpbmcgdGhlIHRlc3QuCiAgICAgICovCisgICAgQGlzQm9vbGVhbgogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUE9MT0dZX0VOQUJMRV9NRVNTQUdFX1RJTUVPVVRTID0gInRvcG9sb2d5LmVuYWJsZS5tZXNzYWdlLnRpbWVvdXRzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBUT1BPTE9HWV9FTkFCTEVfTUVTU0FHRV9USU1FT1VUU19TQ0hFTUEgPSBCb29sZWFuLmNsYXNzOwogCiAgICAgLyoqCiAgICAgICogV2hlbiBzZXQgdG8gdHJ1ZSwgU3Rvcm0gd2lsbCBsb2cgZXZlcnkgbWVzc2FnZSB0aGF0J3MgZW1pdHRlZC4KICAgICAgKi8KKyAgICBAaXNCb29sZWFuCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QT0xPR1lfREVCVUcgPSAidG9wb2xvZ3kuZGVidWciOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFRPUE9MT0dZX0RFQlVHX1NDSEVNQSA9IEJvb2xlYW4uY2xhc3M7CiAKICAgICAvKioKICAgICAgKiBUaGUgc2VyaWFsaXplciBmb3IgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHNoZWxsIGNvbXBvbmVudHMgYW5kIG5vbi1KVk0KICAgICAgKiBwcm9jZXNzZXMKICAgICAgKi8KKyAgICBAaXNTdHJpbmcKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BPTE9HWV9NVUxUSUxBTkdfU0VSSUFMSVpFUiA9ICJ0b3BvbG9neS5tdWx0aWxhbmcuc2VyaWFsaXplciI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgVE9QT0xPR1lfTVVMVElMQU5HX1NFUklBTElaRVJfU0NIRU1BID0gU3RyaW5nLmNsYXNzOwogCiAgICAgLyoqCiAgICAgICogSG93IG1hbnkgcHJvY2Vzc2VzIHNob3VsZCBiZSBzcGF3bmVkIGFyb3VuZCB0aGUgY2x1c3RlciB0byBleGVjdXRlIHRoaXMKQEAgLTExMDksOCArMTMyMSw5IEBACiAgICAgICogdGhlbS4gVGhpcyBwYXJhbWV0ZXIgc2hvdWxkIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgcGFyYWxsZWxpc20gaGludHMKICAgICAgKiBvbiBlYWNoIGNvbXBvbmVudCBpbiB0aGUgdG9wb2xvZ3kgdG8gdHVuZSB0aGUgcGVyZm9ybWFuY2Ugb2YgYSB0b3BvbG9neS4KICAgICAgKi8KKyAgICBAaXNJbnRlZ2VyCisgICAgQGlzUG9zaXRpdmVOdW1iZXIKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BPTE9HWV9XT1JLRVJTID0gInRvcG9sb2d5LndvcmtlcnMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFRPUE9MT0dZX1dPUktFUlNfU0NIRU1BID0gQ29uZmlnVmFsaWRhdGlvbi5JbnRlZ2VyVmFsaWRhdG9yOwogCiAgICAgLyoqCiAgICAgICogSG93IG1hbnkgaW5zdGFuY2VzIHRvIGNyZWF0ZSBmb3IgYSBzcG91dC9ib2x0LiBBIHRhc2sgcnVucyBvbiBhIHRocmVhZCB3aXRoIHplcm8gb3IgbW9yZQpAQCAtMTEyMCw4ICsxMzMzLDM3IEBACiAgICAgICogd2l0aG91dCByZWRlcGxveWluZyB0aGUgdG9wb2xvZ3kgb3IgdmlvbGF0aW5nIHRoZSBjb25zdHJhaW50cyBvZiBTdG9ybSAoc3VjaCBhcyBhIGZpZWxkcyBncm91cGluZwogICAgICAqIGd1YXJhbnRlZWluZyB0aGF0IHRoZSBzYW1lIHZhbHVlIGdvZXMgdG8gdGhlIHNhbWUgdGFzaykuCiAgICAgICovCisgICAgQGlzSW50ZWdlcgorICAgIEBpc1Bvc2l0aXZlTnVtYmVyKGluY2x1ZGVaZXJvID0gdHJ1ZSkKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BPTE9HWV9UQVNLUyA9ICJ0b3BvbG9neS50YXNrcyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgVE9QT0xPR1lfVEFTS1NfU0NIRU1BID0gQ29uZmlnVmFsaWRhdGlvbi5JbnRlZ2VyVmFsaWRhdG9yOworCisgICAgLyoqCisgICAgICogVGhlIG1heGltdW0gYW1vdW50IG9mIG1lbW9yeSBhbiBpbnN0YW5jZSBvZiBhIHNwb3V0L2JvbHQgd2lsbCB0YWtlIG9uIGhlYXAuIFRoaXMgZW5hYmxlcyB0aGUgc2NoZWR1bGVyCisgICAgICogdG8gYWxsb2NhdGUgc2xvdHMgb24gbWFjaGluZXMgd2l0aCBlbm91Z2ggYXZhaWxhYmxlIG1lbW9yeS4gQSBkZWZhdWx0IHZhbHVlIHdpbGwgYmUgc2V0IGZvciB0aGlzIGNvbmZpZyBpZiB1c2VyIGRvZXMgbm90IG92ZXJyaWRlCisgICAgICovCisgICAgQGlzUG9zaXRpdmVOdW1iZXIoaW5jbHVkZVplcm8gPSB0cnVlKQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUE9MT0dZX0NPTVBPTkVOVF9SRVNPVVJDRVNfT05IRUFQX01FTU9SWV9NQiA9ICJ0b3BvbG9neS5jb21wb25lbnQucmVzb3VyY2VzLm9uaGVhcC5tZW1vcnkubWIiOworCisgICAgLyoqCisgICAgICogVGhlIG1heGltdW0gYW1vdW50IG9mIG1lbW9yeSBhbiBpbnN0YW5jZSBvZiBhIHNwb3V0L2JvbHQgd2lsbCB0YWtlIG9mZiBoZWFwLiBUaGlzIGVuYWJsZXMgdGhlIHNjaGVkdWxlcgorICAgICAqIHRvIGFsbG9jYXRlIHNsb3RzIG9uIG1hY2hpbmVzIHdpdGggZW5vdWdoIGF2YWlsYWJsZSBtZW1vcnkuICBBIGRlZmF1bHQgdmFsdWUgd2lsbCBiZSBzZXQgZm9yIHRoaXMgY29uZmlnIGlmIHVzZXIgZG9lcyBub3Qgb3ZlcnJpZGUKKyAgICAgKi8KKyAgICBAaXNQb3NpdGl2ZU51bWJlcihpbmNsdWRlWmVybyA9IHRydWUpCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QT0xPR1lfQ09NUE9ORU5UX1JFU09VUkNFU19PRkZIRUFQX01FTU9SWV9NQiA9ICJ0b3BvbG9neS5jb21wb25lbnQucmVzb3VyY2VzLm9mZmhlYXAubWVtb3J5Lm1iIjsKKworICAgIC8qKgorICAgICAqIFRoZSBjb25maWcgaW5kaWNhdGVzIHRoZSBwZXJjZW50YWdlIG9mIGNwdSBmb3IgYSBjb3JlIGFuIGluc3RhbmNlKGV4ZWN1dG9yKSBvZiBhIGNvbXBvbmVudCB3aWxsIHVzZS4KKyAgICAgKiBBc3N1bWluZyB0aGUgYSBjb3JlIHZhbHVlIHRvIGJlIDEwMCwgYSB2YWx1ZSBvZiAxMCBpbmRpY2F0ZXMgMTAlIG9mIHRoZSBjb3JlLgorICAgICAqIFRoZSBQIGluIFBDT1JFIHJlcHJlc2VudHMgdGhlIHRlcm0gInBoeXNpY2FsIi4gIEEgZGVmYXVsdCB2YWx1ZSB3aWxsIGJlIHNldCBmb3IgdGhpcyBjb25maWcgaWYgdXNlciBkb2VzIG5vdCBvdmVycmlkZQorICAgICAqLworICAgIEBpc1Bvc2l0aXZlTnVtYmVyKGluY2x1ZGVaZXJvID0gdHJ1ZSkKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BPTE9HWV9DT01QT05FTlRfQ1BVX1BDT1JFX1BFUkNFTlQgPSAidG9wb2xvZ3kuY29tcG9uZW50LmNwdS5wY29yZS5wZXJjZW50IjsKKworICAgIC8qKgorICAgICAqIEEgcGVyIHRvcG9sb2d5IGNvbmZpZyB0aGF0IHNwZWNpZmllcyB0aGUgbWF4aW11bSBhbW91bnQgb2YgbWVtb3J5IGEgd29ya2VyIGNhbiB1c2UgZm9yIHRoYXQgc3BlY2lmaWMgdG9wb2xvZ3kKKyAgICAgKi8KKyAgICBAaXNQb3NpdGl2ZU51bWJlcgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUE9MT0dZX1dPUktFUl9NQVhfSEVBUF9TSVpFX01CID0gInRvcG9sb2d5Lndvcmtlci5tYXguaGVhcC5zaXplLm1iIjsKIAogICAgIC8qKgogICAgICAqIEhvdyBtYW55IGV4ZWN1dG9ycyB0byBzcGF3biBmb3IgYWNrZXJzLgpAQCAtMTEzMCw4ICsxMzcyLDkgQEAKICAgICAgKiB0byBiZSBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIHdvcmtlcnMgY29uZmlndXJlZCBmb3IgdGhpcyB0b3BvbG9neS4gSWYgdGhpcyB2YXJpYWJsZSBpcyBzZXQgdG8gMCwKICAgICAgKiB0aGVuIFN0b3JtIHdpbGwgaW1tZWRpYXRlbHkgYWNrIHR1cGxlcyBhcyBzb29uIGFzIHRoZXkgY29tZSBvZmYgdGhlIHNwb3V0LCBlZmZlY3RpdmVseSBkaXNhYmxpbmcgcmVsaWFiaWxpdHkuPC9wPgogICAgICAqLworICAgIEBpc0ludGVnZXIKKyAgICBAaXNQb3NpdGl2ZU51bWJlcihpbmNsdWRlWmVybyA9IHRydWUpCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QT0xPR1lfQUNLRVJfRVhFQ1VUT1JTID0gInRvcG9sb2d5LmFja2VyLmV4ZWN1dG9ycyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgVE9QT0xPR1lfQUNLRVJfRVhFQ1VUT1JTX1NDSEVNQSA9IENvbmZpZ1ZhbGlkYXRpb24uSW50ZWdlclZhbGlkYXRvcjsKIAogICAgIC8qKgogICAgICAqIEhvdyBtYW55IGV4ZWN1dG9ycyB0byBzcGF3biBmb3IgZXZlbnQgbG9nZ2VyLgpAQCAtMTE0MCw4ICsxMzgzLDkgQEAKICAgICAgKiB0byBiZSBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIHdvcmtlcnMgY29uZmlndXJlZCBmb3IgdGhpcyB0b3BvbG9neS4gSWYgdGhpcyB2YXJpYWJsZSBpcyBzZXQgdG8gMCwKICAgICAgKiBldmVudCBsb2dnaW5nIHdpbGwgYmUgZGlzYWJsZWQuPC9wPgogICAgICAqLworICAgIEBpc0ludGVnZXIKKyAgICBAaXNQb3NpdGl2ZU51bWJlcihpbmNsdWRlWmVybyA9IHRydWUpCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QT0xPR1lfRVZFTlRMT0dHRVJfRVhFQ1VUT1JTID0gInRvcG9sb2d5LmV2ZW50bG9nZ2VyLmV4ZWN1dG9ycyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgVE9QT0xPR1lfRVZFTlRMT0dHRVJfRVhFQ1VUT1JTX1NDSEVNQSA9IENvbmZpZ1ZhbGlkYXRpb24uSW50ZWdlclZhbGlkYXRvcjsKIAogICAgIC8qKgogICAgICAqIFRoZSBtYXhpbXVtIGFtb3VudCBvZiB0aW1lIGdpdmVuIHRvIHRoZSB0b3BvbG9neSB0byBmdWxseSBwcm9jZXNzIGEgbWVzc2FnZQpAQCAtMTE0OSw4ICsxMzkzLDEwIEBACiAgICAgICogd2lsbCBmYWlsIHRoZSBtZXNzYWdlIG9uIHRoZSBzcG91dC4gU29tZSBzcG91dHMgaW1wbGVtZW50YXRpb25zIHdpbGwgdGhlbiByZXBsYXkKICAgICAgKiB0aGUgbWVzc2FnZSBhdCBhIGxhdGVyIHRpbWUuCiAgICAgICovCisgICAgQGlzSW50ZWdlcgorICAgIEBpc1Bvc2l0aXZlTnVtYmVyCisgICAgQE5vdE51bGwKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BPTE9HWV9NRVNTQUdFX1RJTUVPVVRfU0VDUyA9ICJ0b3BvbG9neS5tZXNzYWdlLnRpbWVvdXQuc2VjcyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgVE9QT0xPR1lfTUVTU0FHRV9USU1FT1VUX1NFQ1NfU0NIRU1BID0gQ29uZmlnVmFsaWRhdGlvbi5Ob3ROdWxsUG9zSW50ZWdlclZhbGlkYXRvcjsKIAogICAgIC8qKgogICAgICAqIEEgbGlzdCBvZiBzZXJpYWxpemF0aW9uIHJlZ2lzdHJhdGlvbnMgZm9yIEtyeW8gKCBodHRwOi8vY29kZS5nb29nbGUuY29tL3Ava3J5by8gKSwKQEAgLTExNjAsOCArMTQwNiw4IEBACiAgICAgICoKICAgICAgKiBTZWUgS3J5bydzIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgd3JpdGluZyBjdXN0b20gc2VyaWFsaXplcnMuCiAgICAgICovCisgICAgQGlzS3J5b1JlZwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUE9MT0dZX0tSWU9fUkVHSVNURVIgPSAidG9wb2xvZ3kua3J5by5yZWdpc3RlciI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgVE9QT0xPR1lfS1JZT19SRUdJU1RFUl9TQ0hFTUEgPSBDb25maWdWYWxpZGF0aW9uLktyeW9SZWdWYWxpZGF0b3I7CiAKICAgICAvKioKICAgICAgKiBBIGxpc3Qgb2YgY2xhc3NlcyB0aGF0IGN1c3RvbWl6ZSBzdG9ybSdzIGtyeW8gaW5zdGFuY2UgZHVyaW5nIHN0YXJ0LXVwLgpAQCAtMTE2OSwxNyArMTQxNSwxNiBAQAogICAgICAqIGxpc3RlZCBjbGFzcyBpcyBpbnN0YW50aWF0ZWQgd2l0aCAwIGFyZ3VtZW50cywgdGhlbiBpdHMgJ2RlY29yYXRlJyBtZXRob2QKICAgICAgKiBpcyBjYWxsZWQgd2l0aCBzdG9ybSdzIGtyeW8gaW5zdGFuY2UgYXMgdGhlIG9ubHkgYXJndW1lbnQuCiAgICAgICovCisgICAgQGlzU3RyaW5nTGlzdAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUE9MT0dZX0tSWU9fREVDT1JBVE9SUyA9ICJ0b3BvbG9neS5rcnlvLmRlY29yYXRvcnMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFRPUE9MT0dZX0tSWU9fREVDT1JBVE9SU19TQ0hFTUEgPSBDb25maWdWYWxpZGF0aW9uLlN0cmluZ3NWYWxpZGF0b3I7CiAKICAgICAvKioKICAgICAgKiBDbGFzcyB0aGF0IHNwZWNpZmllcyBob3cgdG8gY3JlYXRlIGEgS3J5byBpbnN0YW5jZSBmb3Igc2VyaWFsaXphdGlvbi4gU3Rvcm0gd2lsbCB0aGVuIGFwcGx5CiAgICAgICogdG9wb2xvZ3kua3J5by5yZWdpc3RlciBhbmQgdG9wb2xvZ3kua3J5by5kZWNvcmF0b3JzIG9uIHRvcCBvZiB0aGlzLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgogICAgICAqIGltcGxlbWVudHMgdG9wb2xvZ3kuZmFsbC5iYWNrLm9uLmphdmEuc2VyaWFsaXphdGlvbiBhbmQgdHVybnMgcmVmZXJlbmNlcyBvZmYuCiAgICAgICovCisgICAgQGlzU3RyaW5nCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QT0xPR1lfS1JZT19GQUNUT1JZID0gInRvcG9sb2d5LmtyeW8uZmFjdG9yeSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgVE9QT0xPR1lfS1JZT19GQUNUT1JZX1NDSEVNQSA9IFN0cmluZy5jbGFzczsKLQogCiAgICAgLyoqCiAgICAgICogV2hldGhlciBvciBub3QgU3Rvcm0gc2hvdWxkIHNraXAgdGhlIGxvYWRpbmcgb2Yga3J5byByZWdpc3RyYXRpb25zIGZvciB3aGljaCBpdApAQCAtMTE5MSwzNiArMTQzNiwzNyBAQAogICAgICAqIEJ5IHNldHRpbmcgdGhpcyBjb25maWcgdG8gdHJ1ZSwgU3Rvcm0gd2lsbCBpZ25vcmUgdGhhdCBpdCBkb2Vzbid0IGhhdmUgdGhvc2Ugb3RoZXIgc2VyaWFsaXphdGlvbnMKICAgICAgKiByYXRoZXIgdGhhbiB0aHJvdyBhbiBlcnJvci4KICAgICAgKi8KKyAgICBAaXNCb29sZWFuCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QT0xPR1lfU0tJUF9NSVNTSU5HX0tSWU9fUkVHSVNUUkFUSU9OUz0gInRvcG9sb2d5LnNraXAubWlzc2luZy5rcnlvLnJlZ2lzdHJhdGlvbnMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFRPUE9MT0dZX1NLSVBfTUlTU0lOR19LUllPX1JFR0lTVFJBVElPTlNfU0NIRU1BID0gQm9vbGVhbi5jbGFzczsKIAogICAgIC8qKgogICAgICAqIEEgbGlzdCBvZiBjbGFzc2VzIGltcGxlbWVudGluZyBJTWV0cmljc0NvbnN1bWVyIChTZWUgc3Rvcm0ueWFtbC5leGFtcGxlIGZvciBleGFjdCBjb25maWcgZm9ybWF0KS4KICAgICAgKiBFYWNoIGxpc3RlZCBjbGFzcyB3aWxsIGJlIHJvdXRlZCBhbGwgdGhlIG1ldHJpY3MgZGF0YSBnZW5lcmF0ZWQgYnkgdGhlIHN0b3JtIG1ldHJpY3MgQVBJLgogICAgICAqIEVhY2ggbGlzdGVkIGNsYXNzIG1hcHMgMToxIHRvIGEgc3lzdGVtIGJvbHQgbmFtZWQgX19tZXRyaWNzX0NsYXNzTmFtZSNOLCBhbmQgaXQncyBwYXJhbGxlbGlzbSBpcyBjb25maWd1cmFibGUuCiAgICAgICovCisKKyAgICBAaXNMaXN0RW50cnlDdXN0b20oZW50cnlWYWxpZGF0b3JDbGFzc2VzPXtNZXRyaWNSZWdpc3RyeVZhbGlkYXRvci5jbGFzc30pCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QT0xPR1lfTUVUUklDU19DT05TVU1FUl9SRUdJU1RFUiA9ICJ0b3BvbG9neS5tZXRyaWNzLmNvbnN1bWVyLnJlZ2lzdGVyIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBUT1BPTE9HWV9NRVRSSUNTX0NPTlNVTUVSX1JFR0lTVEVSX1NDSEVNQSA9IENvbmZpZ1ZhbGlkYXRpb24uTWFwc1ZhbGlkYXRvcjsKIAogICAgIC8qKgogICAgICAqIEEgbWFwIG9mIG1ldHJpYyBuYW1lIHRvIGNsYXNzIG5hbWUgaW1wbGVtZW50aW5nIElNZXRyaWMgdGhhdCB3aWxsIGJlIGNyZWF0ZWQgb25jZSBwZXIgd29ya2VyIEpWTQogICAgICAqLworICAgIEBpc01hcEVudHJ5VHlwZShrZXlUeXBlID0gU3RyaW5nLmNsYXNzLCB2YWx1ZVR5cGUgPSBTdHJpbmcuY2xhc3MpCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QT0xPR1lfV09SS0VSX01FVFJJQ1MgPSAidG9wb2xvZ3kud29ya2VyLm1ldHJpY3MiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFRPUE9MT0dZX1dPUktFUl9NRVRSSUNTX1NDSEVNQSA9IE1hcC5jbGFzczsKIAogICAgIC8qKgogICAgICAqIEEgbWFwIG9mIG1ldHJpYyBuYW1lIHRvIGNsYXNzIG5hbWUgaW1wbGVtZW50aW5nIElNZXRyaWMgdGhhdCB3aWxsIGJlIGNyZWF0ZWQgb25jZSBwZXIgd29ya2VyIEpWTQogICAgICAqLworICAgIEBpc01hcEVudHJ5VHlwZShrZXlUeXBlID0gU3RyaW5nLmNsYXNzLCB2YWx1ZVR5cGUgPSBTdHJpbmcuY2xhc3MpCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV09SS0VSX01FVFJJQ1MgPSAid29ya2VyLm1ldHJpY3MiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFdPUktFUl9NRVRSSUNTX1NDSEVNQSA9IE1hcC5jbGFzczsKIAogICAgIC8qKgogICAgICAqIFRoZSBtYXhpbXVtIHBhcmFsbGVsaXNtIGFsbG93ZWQgZm9yIGEgY29tcG9uZW50IGluIHRoaXMgdG9wb2xvZ3kuIFRoaXMgY29uZmlndXJhdGlvbiBpcwogICAgICAqIHR5cGljYWxseSB1c2VkIGluIHRlc3RpbmcgdG8gbGltaXQgdGhlIG51bWJlciBvZiB0aHJlYWRzIHNwYXduZWQgaW4gbG9jYWwgbW9kZS4KICAgICAgKi8KKyAgICBAaXNJbnRlZ2VyCisgICAgQGlzUG9zaXRpdmVOdW1iZXIKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BPTE9HWV9NQVhfVEFTS19QQVJBTExFTElTTT0idG9wb2xvZ3kubWF4LnRhc2sucGFyYWxsZWxpc20iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFRPUE9MT0dZX01BWF9UQVNLX1BBUkFMTEVMSVNNX1NDSEVNQSA9IENvbmZpZ1ZhbGlkYXRpb24uSW50ZWdlclZhbGlkYXRvcjsKLQogCiAgICAgLyoqCiAgICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHR1cGxlcyB0aGF0IGNhbiBiZSBwZW5kaW5nIG9uIGEgc3BvdXQgdGFzayBhdCBhbnkgZ2l2ZW4gdGltZS4KQEAgLTEyMzAsOCArMTQ3Niw5IEBACiAgICAgICogTm90ZSB0aGF0IHRoaXMgY29uZmlnIHBhcmFtZXRlciBoYXMgbm8gZWZmZWN0IGZvciB1bnJlbGlhYmxlIHNwb3V0cyB0aGF0IGRvbid0IHRhZwogICAgICAqIHRoZWlyIHR1cGxlcyB3aXRoIGEgbWVzc2FnZSBpZC4KICAgICAgKi8KKyAgICBAaXNJbnRlZ2VyCisgICAgQGlzUG9zaXRpdmVOdW1iZXIKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BPTE9HWV9NQVhfU1BPVVRfUEVORElORz0idG9wb2xvZ3kubWF4LnNwb3V0LnBlbmRpbmciOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFRPUE9MT0dZX01BWF9TUE9VVF9QRU5ESU5HX1NDSEVNQSA9IENvbmZpZ1ZhbGlkYXRpb24uSW50ZWdlclZhbGlkYXRvcjsKIAogICAgIC8qKgogICAgICAqIEEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIGEgc3RyYXRlZ3kgZm9yIHdoYXQgdG8gZG8gd2hlbiBhIHNwb3V0IG5lZWRzIHRvIHdhaXQuIFdhaXRpbmcgaXMKQEAgLTEyNDAsNzAgKzE0ODcsNzMgQEAKICAgICAgKiAxLiBuZXh0VHVwbGUgZW1pdHMgbm8gdHVwbGVzCiAgICAgICogMi4gVGhlIHNwb3V0IGhhcyBoaXQgbWF4U3BvdXRQZW5kaW5nIGFuZCBjYW4ndCBlbWl0IGFueSBtb3JlIHR1cGxlcwogICAgICAqLworICAgIEBpc1N0cmluZwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUE9MT0dZX1NQT1VUX1dBSVRfU1RSQVRFR1k9InRvcG9sb2d5LnNwb3V0LndhaXQuc3RyYXRlZ3kiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFRPUE9MT0dZX1NQT1VUX1dBSVRfU1RSQVRFR1lfU0NIRU1BID0gU3RyaW5nLmNsYXNzOwogCiAgICAgLyoqCiAgICAgICogVGhlIGFtb3VudCBvZiBtaWxsaXNlY29uZHMgdGhlIFNsZWVwRW1wdHlFbWl0U3RyYXRlZ3kgc2hvdWxkIHNsZWVwIGZvci4KICAgICAgKi8KKyAgICBAaXNJbnRlZ2VyCisgICAgQGlzUG9zaXRpdmVOdW1iZXIoaW5jbHVkZVplcm8gPSB0cnVlKQogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUE9MT0dZX1NMRUVQX1NQT1VUX1dBSVRfU1RSQVRFR1lfVElNRV9NUz0idG9wb2xvZ3kuc2xlZXAuc3BvdXQud2FpdC5zdHJhdGVneS50aW1lLm1zIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBUT1BPTE9HWV9TTEVFUF9TUE9VVF9XQUlUX1NUUkFURUdZX1RJTUVfTVNfU0NIRU1BID0gQ29uZmlnVmFsaWRhdGlvbi5JbnRlZ2VyVmFsaWRhdG9yOwogCiAgICAgLyoqCiAgICAgICogVGhlIG1heGltdW0gYW1vdW50IG9mIHRpbWUgYSBjb21wb25lbnQgZ2l2ZXMgYSBzb3VyY2Ugb2Ygc3RhdGUgdG8gc3luY2hyb25pemUgYmVmb3JlIGl0IHJlcXVlc3RzCiAgICAgICogc3luY2hyb25pemF0aW9uIGFnYWluLgogICAgICAqLworICAgIEBpc0ludGVnZXIKKyAgICBAaXNQb3NpdGl2ZU51bWJlcgorICAgIEBOb3ROdWxsCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QT0xPR1lfU1RBVEVfU1lOQ0hST05JWkFUSU9OX1RJTUVPVVRfU0VDUz0idG9wb2xvZ3kuc3RhdGUuc3luY2hyb25pemF0aW9uLnRpbWVvdXQuc2VjcyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgVE9QT0xPR1lfU1RBVEVfU1lOQ0hST05JWkFUSU9OX1RJTUVPVVRfU0VDU19TQ0hFTUEgPSBDb25maWdWYWxpZGF0aW9uLk5vdE51bGxQb3NJbnRlZ2VyVmFsaWRhdG9yOwogCiAgICAgLyoqCiAgICAgICogVGhlIHBlcmNlbnRhZ2Ugb2YgdHVwbGVzIHRvIHNhbXBsZSB0byBwcm9kdWNlIHN0YXRzIGZvciBhIHRhc2suCiAgICAgICovCisgICAgQGlzUG9zaXRpdmVOdW1iZXIKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BPTE9HWV9TVEFUU19TQU1QTEVfUkFURT0idG9wb2xvZ3kuc3RhdHMuc2FtcGxlLnJhdGUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFRPUE9MT0dZX1NUQVRTX1NBTVBMRV9SQVRFX1NDSEVNQSA9Q29uZmlnVmFsaWRhdGlvbi5Qb3NpdGl2ZU51bWJlclZhbGlkYXRvcjsKIAogICAgIC8qKgogICAgICAqIFRoZSB0aW1lIHBlcmlvZCB0aGF0IGJ1aWx0aW4gbWV0cmljcyBkYXRhIGluIGJ1Y2tldGVkIGludG8uCiAgICAgICovCisgICAgQGlzSW50ZWdlcgogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUE9MT0dZX0JVSUxUSU5fTUVUUklDU19CVUNLRVRfU0laRV9TRUNTPSJ0b3BvbG9neS5idWlsdGluLm1ldHJpY3MuYnVja2V0LnNpemUuc2VjcyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgVE9QT0xPR1lfQlVJTFRJTl9NRVRSSUNTX0JVQ0tFVF9TSVpFX1NFQ1NfU0NIRU1BID0gQ29uZmlnVmFsaWRhdGlvbi5JbnRlZ2VyVmFsaWRhdG9yOwogCiAgICAgLyoqCiAgICAgICogV2hldGhlciBvciBub3QgdG8gdXNlIEphdmEgc2VyaWFsaXphdGlvbiBpbiBhIHRvcG9sb2d5LgogICAgICAqLworICAgIEBpc0Jvb2xlYW4KICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BPTE9HWV9GQUxMX0JBQ0tfT05fSkFWQV9TRVJJQUxJWkFUSU9OPSJ0b3BvbG9neS5mYWxsLmJhY2sub24uamF2YS5zZXJpYWxpemF0aW9uIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBUT1BPTE9HWV9GQUxMX0JBQ0tfT05fSkFWQV9TRVJJQUxJWkFUSU9OX1NDSEVNQSA9IEJvb2xlYW4uY2xhc3M7CiAKICAgICAvKioKICAgICAgKiBUb3BvbG9neS1zcGVjaWZpYyBvcHRpb25zIGZvciB0aGUgd29ya2VyIGNoaWxkIHByb2Nlc3MuIFRoaXMgaXMgdXNlZCBpbiBhZGRpdGlvbiB0byBXT1JLRVJfQ0hJTERPUFRTLgogICAgICAqLworICAgIEBpc1N0cmluZ09yU3RyaW5nTGlzdAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUE9MT0dZX1dPUktFUl9DSElMRE9QVFM9InRvcG9sb2d5Lndvcmtlci5jaGlsZG9wdHMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFRPUE9MT0dZX1dPUktFUl9DSElMRE9QVFNfU0NIRU1BID0gQ29uZmlnVmFsaWRhdGlvbi5TdHJpbmdPclN0cmluZ0xpc3RWYWxpZGF0b3I7CiAKICAgICAvKioKICAgICAgKiBUb3BvbG9neS1zcGVjaWZpYyBvcHRpb25zIEdDIGZvciB0aGUgd29ya2VyIGNoaWxkIHByb2Nlc3MuIFRoaXMgb3ZlcnJpZGVzIFdPUktFUl9HQ19DSElMRE9QVFMuCiAgICAgICovCisgICAgQGlzU3RyaW5nT3JTdHJpbmdMaXN0CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QT0xPR1lfV09SS0VSX0dDX0NISUxET1BUUz0idG9wb2xvZ3kud29ya2VyLmdjLmNoaWxkb3B0cyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgVE9QT0xPR1lfV09SS0VSX0dDX0NISUxET1BUU19TQ0hFTUEgPSBDb25maWdWYWxpZGF0aW9uLlN0cmluZ09yU3RyaW5nTGlzdFZhbGlkYXRvcjsKIAogICAgIC8qKgogICAgICAqIFRvcG9sb2d5LXNwZWNpZmljIG9wdGlvbnMgZm9yIHRoZSBsb2d3cml0ZXIgcHJvY2VzcyBvZiBhIHdvcmtlci4KICAgICAgKi8KKyAgICBAaXNTdHJpbmdPclN0cmluZ0xpc3QKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BPTE9HWV9XT1JLRVJfTE9HV1JJVEVSX0NISUxET1BUUz0idG9wb2xvZ3kud29ya2VyLmxvZ3dyaXRlci5jaGlsZG9wdHMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFRPUE9MT0dZX1dPUktFUl9MT0dXUklURVJfQ0hJTERPUFRTX1NDSEVNQSA9IENvbmZpZ1ZhbGlkYXRpb24uU3RyaW5nT3JTdHJpbmdMaXN0VmFsaWRhdG9yOwogCiAgICAgLyoqCiAgICAgICogVG9wb2xvZ3ktc3BlY2lmaWMgY2xhc3NwYXRoIGZvciB0aGUgd29ya2VyIGNoaWxkIHByb2Nlc3MuIFRoaXMgaXMgY29tYmluZWQgdG8gdGhlIHVzdWFsIGNsYXNzcGF0aC4KICAgICAgKi8KKyAgICBAaXNTdHJpbmdPclN0cmluZ0xpc3QKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BPTE9HWV9DTEFTU1BBVEg9InRvcG9sb2d5LmNsYXNzcGF0aCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgVE9QT0xPR1lfQ0xBU1NQQVRIX1NDSEVNQSA9IENvbmZpZ1ZhbGlkYXRpb24uU3RyaW5nT3JTdHJpbmdMaXN0VmFsaWRhdG9yOwogCiAgICAgLyoqCiAgICAgICogVG9wb2xvZ3ktc3BlY2lmaWMgZW52aXJvbm1lbnQgdmFyaWFibGVzIGZvciB0aGUgd29ya2VyIGNoaWxkIHByb2Nlc3MuCiAgICAgICogVGhpcyBpcyBhZGRlZCB0byB0aGUgZXhpc3RpbmcgZW52aXJvbm1lbnQgKHRoYXQgb2YgdGhlIHN1cGVydmlzb3IpCiAgICAgICovCi0gICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUE9MT0dZX0VOVklST05NRU5UPSJ0b3BvbG9neS5lbnZpcm9ubWVudCI7Ci0gICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFRPUE9MT0dZX0VOVklST05NRU5UX1NDSEVNQSA9IE1hcC5jbGFzczsKKyAgICBAaXNNYXBFbnRyeVR5cGUoa2V5VHlwZSA9IFN0cmluZy5jbGFzcywgdmFsdWVUeXBlID0gU3RyaW5nLmNsYXNzKQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUE9MT0dZX0VOVklST05NRU5UPSJ0b3BvbG9neS5lbnZpcm9ubWVudCI7CiAKICAgICAvKgogICAgICAqIFRvcG9sb2d5LXNwZWNpZmljIG9wdGlvbiB0byBkaXNhYmxlL2VuYWJsZSBib2x0J3Mgb3V0Z29pbmcgb3ZlcmZsb3cgYnVmZmVyLgpAQCAtMTMxMiwxMjIgKzE1NjIsMTYyIEBACiAgICAgICogVGhlIG92ZXJmbG93IGJ1ZmZlciBjYW4gZmlsbCBkZWdyYWRpbmcgdGhlIHBlcmZvcm1hbmNlIGdyYWR1YWxseSwKICAgICAgKiBldmVudHVhbGx5IHJ1bm5pbmcgb3V0IG9mIG1lbW9yeS4KICAgICAgKi8KKyAgICBAaXNCb29sZWFuCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QT0xPR1lfQk9MVFNfT1VUR09JTkdfT1ZFUkZMT1dfQlVGRkVSX0VOQUJMRT0idG9wb2xvZ3kuYm9sdHMub3V0Z29pbmcub3ZlcmZsb3cuYnVmZmVyLmVuYWJsZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgVE9QT0xPR1lfQk9MVFNfT1VUR09JTkdfT1ZFUkZMT1dfQlVGRkVSX0VOQUJMRV9TQ0hFTUEgPSBCb29sZWFuLmNsYXNzOworCisgICAgLyoKKyAgICAgKiBCb2x0LXNwZWNpZmljIGNvbmZpZ3VyYXRpb24gZm9yIHdpbmRvd2VkIGJvbHRzIHRvIHNwZWNpZnkgdGhlIHdpbmRvdyBsZW5ndGggYXMgYSBjb3VudCBvZiBudW1iZXIgb2YgdHVwbGVzCisgICAgICogaW4gdGhlIHdpbmRvdy4KKyAgICAgKi8KKyAgICBAaXNJbnRlZ2VyCisgICAgQGlzUG9zaXRpdmVOdW1iZXIKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BPTE9HWV9CT0xUU19XSU5ET1dfTEVOR1RIX0NPVU5UID0gInRvcG9sb2d5LmJvbHRzLndpbmRvdy5sZW5ndGguY291bnQiOworCisgICAgLyoKKyAgICAgKiBCb2x0LXNwZWNpZmljIGNvbmZpZ3VyYXRpb24gZm9yIHdpbmRvd2VkIGJvbHRzIHRvIHNwZWNpZnkgdGhlIHdpbmRvdyBsZW5ndGggaW4gdGltZSBkdXJhdGlvbi4KKyAgICAgKi8KKyAgICBAaXNJbnRlZ2VyCisgICAgQGlzUG9zaXRpdmVOdW1iZXIKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BPTE9HWV9CT0xUU19XSU5ET1dfTEVOR1RIX0RVUkFUSU9OX01TID0gInRvcG9sb2d5LmJvbHRzLndpbmRvdy5sZW5ndGguZHVyYXRpb24ubXMiOworCisgICAgLyoKKyAgICAgKiBCb2x0LXNwZWNpZmljIGNvbmZpZ3VyYXRpb24gZm9yIHdpbmRvd2VkIGJvbHRzIHRvIHNwZWNpZml5IHRoZSBzbGlkaW5nIGludGVydmFsIGFzIGEgY291bnQgb2YgbnVtYmVyIG9mIHR1cGxlcy4KKyAgICAgKi8KKyAgICBAaXNJbnRlZ2VyCisgICAgQGlzUG9zaXRpdmVOdW1iZXIKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BPTE9HWV9CT0xUU19TTElESU5HX0lOVEVSVkFMX0NPVU5UID0gInRvcG9sb2d5LmJvbHRzLndpbmRvdy5zbGlkaW5nLmludGVydmFsLmNvdW50IjsKKworICAgIC8qCisgICAgICogQm9sdC1zcGVjaWZpYyBjb25maWd1cmF0aW9uIGZvciB3aW5kb3dlZCBib2x0cyB0byBzcGVjaWZpeSB0aGUgc2xpZGluZyBpbnRlcnZhbCBpbiB0aW1lIGR1cmF0aW9uLgorICAgICAqLworICAgIEBpc0ludGVnZXIKKyAgICBAaXNQb3NpdGl2ZU51bWJlcgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUE9MT0dZX0JPTFRTX1NMSURJTkdfSU5URVJWQUxfRFVSQVRJT05fTVMgPSAidG9wb2xvZ3kuYm9sdHMud2luZG93LnNsaWRpbmcuaW50ZXJ2YWwuZHVyYXRpb24ubXMiOwogCiAgICAgLyoqCiAgICAgICogVGhpcyBjb25maWcgaXMgYXZhaWxhYmxlIGZvciBUcmFuc2FjdGlvbmFsU3BvdXRzLCBhbmQgY29udGFpbnMgdGhlIGlkICggYSBTdHJpbmcpIGZvcgogICAgICAqIHRoZSB0cmFuc2FjdGlvbmFsIHRvcG9sb2d5LiBUaGlzIGlkIGlzIHVzZWQgdG8gc3RvcmUgdGhlIHN0YXRlIG9mIHRoZSB0cmFuc2FjdGlvbmFsCiAgICAgICogdG9wb2xvZ3kgaW4gWm9va2VlcGVyLgogICAgICAqLworICAgIEBpc1N0cmluZwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUE9MT0dZX1RSQU5TQUNUSU9OQUxfSUQ9InRvcG9sb2d5LnRyYW5zYWN0aW9uYWwuaWQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFRPUE9MT0dZX1RSQU5TQUNUSU9OQUxfSURfU0NIRU1BID0gU3RyaW5nLmNsYXNzOwogCiAgICAgLyoqCiAgICAgICogQSBsaXN0IG9mIHRhc2sgaG9va3MgdGhhdCBhcmUgYXV0b21hdGljYWxseSBhZGRlZCB0byBldmVyeSBzcG91dCBhbmQgYm9sdCBpbiB0aGUgdG9wb2xvZ3kuIEFuIGV4YW1wbGUKICAgICAgKiBvZiB3aGVuIHlvdSdkIGRvIHRoaXMgaXMgdG8gYWRkIGEgaG9vayB0aGF0IGludGVncmF0ZXMgd2l0aCB5b3VyIGludGVybmFsCiAgICAgICogbW9uaXRvcmluZyBzeXN0ZW0uIFRoZXNlIGhvb2tzIGFyZSBpbnN0YW50aWF0ZWQgdXNpbmcgdGhlIHplcm8tYXJnIGNvbnN0cnVjdG9yLgogICAgICAqLworICAgIEBpc1N0cmluZ0xpc3QKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BPTE9HWV9BVVRPX1RBU0tfSE9PS1M9InRvcG9sb2d5LmF1dG8udGFzay5ob29rcyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgVE9QT0xPR1lfQVVUT19UQVNLX0hPT0tTX1NDSEVNQSA9IENvbmZpZ1ZhbGlkYXRpb24uU3RyaW5nc1ZhbGlkYXRvcjsKLQogCiAgICAgLyoqCiAgICAgICogVGhlIHNpemUgb2YgdGhlIERpc3J1cHRvciByZWNlaXZlIHF1ZXVlIGZvciBlYWNoIGV4ZWN1dG9yLiBNdXN0IGJlIGEgcG93ZXIgb2YgMi4KICAgICAgKi8KKyAgICBAaXNQb3dlck9mMgogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUE9MT0dZX0VYRUNVVE9SX1JFQ0VJVkVfQlVGRkVSX1NJWkU9InRvcG9sb2d5LmV4ZWN1dG9yLnJlY2VpdmUuYnVmZmVyLnNpemUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFRPUE9MT0dZX0VYRUNVVE9SX1JFQ0VJVkVfQlVGRkVSX1NJWkVfU0NIRU1BID0gQ29uZmlnVmFsaWRhdGlvbi5Qb3dlck9mMlZhbGlkYXRvcjsKIAogICAgIC8qKgogICAgICAqIFRoZSBzaXplIG9mIHRoZSBEaXNydXB0b3Igc2VuZCBxdWV1ZSBmb3IgZWFjaCBleGVjdXRvci4gTXVzdCBiZSBhIHBvd2VyIG9mIDIuCiAgICAgICovCisgICAgQGlzUG93ZXJPZjIKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BPTE9HWV9FWEVDVVRPUl9TRU5EX0JVRkZFUl9TSVpFPSJ0b3BvbG9neS5leGVjdXRvci5zZW5kLmJ1ZmZlci5zaXplIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBUT1BPTE9HWV9FWEVDVVRPUl9TRU5EX0JVRkZFUl9TSVpFX1NDSEVNQSA9IENvbmZpZ1ZhbGlkYXRpb24uUG93ZXJPZjJWYWxpZGF0b3I7CiAKICAgICAvKioKICAgICAgKiBUaGUgc2l6ZSBvZiB0aGUgRGlzcnVwdG9yIHRyYW5zZmVyIHF1ZXVlIGZvciBlYWNoIHdvcmtlci4KICAgICAgKi8KKyAgICBAaXNJbnRlZ2VyCisgICAgQGlzUG93ZXJPZjIKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BPTE9HWV9UUkFOU0ZFUl9CVUZGRVJfU0laRT0idG9wb2xvZ3kudHJhbnNmZXIuYnVmZmVyLnNpemUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFRPUE9MT0dZX1RSQU5TRkVSX0JVRkZFUl9TSVpFX1NDSEVNQSA9IENvbmZpZ1ZhbGlkYXRpb24uSW50ZWdlclZhbGlkYXRvcjsKIAotICAgLyoqCi0gICAgKiBIb3cgb2Z0ZW4gYSB0aWNrIHR1cGxlIGZyb20gdGhlICJfX3N5c3RlbSIgY29tcG9uZW50IGFuZCAiX190aWNrIiBzdHJlYW0gc2hvdWxkIGJlIHNlbnQKLSAgICAqIHRvIHRhc2tzLiBNZWFudCB0byBiZSB1c2VkIGFzIGEgY29tcG9uZW50LXNwZWNpZmljIGNvbmZpZ3VyYXRpb24uCi0gICAgKi8KKyAgICAvKioKKyAgICAgKiBIb3cgb2Z0ZW4gYSB0aWNrIHR1cGxlIGZyb20gdGhlICJfX3N5c3RlbSIgY29tcG9uZW50IGFuZCAiX190aWNrIiBzdHJlYW0gc2hvdWxkIGJlIHNlbnQKKyAgICAgKiB0byB0YXNrcy4gTWVhbnQgdG8gYmUgdXNlZCBhcyBhIGNvbXBvbmVudC1zcGVjaWZpYyBjb25maWd1cmF0aW9uLgorICAgICAqLworICAgIEBpc0ludGVnZXIKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BPTE9HWV9USUNLX1RVUExFX0ZSRVFfU0VDUz0idG9wb2xvZ3kudGljay50dXBsZS5mcmVxLnNlY3MiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFRPUE9MT0dZX1RJQ0tfVFVQTEVfRlJFUV9TRUNTX1NDSEVNQSA9IENvbmZpZ1ZhbGlkYXRpb24uSW50ZWdlclZhbGlkYXRvcjsKLQogCiAgICAvKioKKyAgICAqIEBkZXByZWNhdGVkIHRoaXMgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZAogICAgICogQ29uZmlndXJlIHRoZSB3YWl0IHN0cmF0ZWd5IHVzZWQgZm9yIGludGVybmFsIHF1ZXVpbmcuIENhbiBiZSB1c2VkIHRvIHRyYWRlb2ZmIGxhdGVuY3kKICAgICAqIHZzLiB0aHJvdWdocHV0CiAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIEBpc1N0cmluZwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUE9MT0dZX0RJU1JVUFRPUl9XQUlUX1NUUkFURUdZPSJ0b3BvbG9neS5kaXNydXB0b3Iud2FpdC5zdHJhdGVneSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgVE9QT0xPR1lfRElTUlVQVE9SX1dBSVRfU1RSQVRFR1lfU0NIRU1BID0gU3RyaW5nLmNsYXNzOwogCi0gICAvKioKLSAgICAqIFRoZSBzaXplIG9mIHRoZSBzaGFyZWQgdGhyZWFkIHBvb2wgZm9yIHdvcmtlciB0YXNrcyB0byBtYWtlIHVzZSBvZi4gVGhlIHRocmVhZCBwb29sIGNhbiBiZSBhY2Nlc3NlZAotICAgICogdmlhIHRoZSBUb3BvbG9neUNvbnRleHQuCi0gICAgKi8KKyAgICAvKioKKyAgICAgKiBUaGUgc2l6ZSBvZiB0aGUgc2hhcmVkIHRocmVhZCBwb29sIGZvciB3b3JrZXIgdGFza3MgdG8gbWFrZSB1c2Ugb2YuIFRoZSB0aHJlYWQgcG9vbCBjYW4gYmUgYWNjZXNzZWQKKyAgICAgKiB2aWEgdGhlIFRvcG9sb2d5Q29udGV4dC4KKyAgICAgKi8KKyAgICBAaXNJbnRlZ2VyCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QT0xPR1lfV09SS0VSX1NIQVJFRF9USFJFQURfUE9PTF9TSVpFPSJ0b3BvbG9neS53b3JrZXIuc2hhcmVkLnRocmVhZC5wb29sLnNpemUiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFRPUE9MT0dZX1dPUktFUl9TSEFSRURfVEhSRUFEX1BPT0xfU0laRV9TQ0hFTUEgPSBDb25maWdWYWxpZGF0aW9uLkludGVnZXJWYWxpZGF0b3I7CiAKICAgICAvKioKICAgICAgKiBUaGUgaW50ZXJ2YWwgaW4gc2Vjb25kcyB0byB1c2UgZm9yIGRldGVybWluaW5nIHdoZXRoZXIgdG8gdGhyb3R0bGUgZXJyb3IgcmVwb3J0ZWQgdG8gWm9va2VlcGVyLiBGb3IgZXhhbXBsZSwKICAgICAgKiBhbiBpbnRlcnZhbCBvZiAxMCBzZWNvbmRzIHdpdGggdG9wb2xvZ3kubWF4LmVycm9yLnJlcG9ydC5wZXIuaW50ZXJ2YWwgc2V0IHRvIDUgd2lsbCBvbmx5IGFsbG93IDUgZXJyb3JzIHRvIGJlCiAgICAgICogcmVwb3J0ZWQgdG8gWm9va2VlcGVyIHBlciB0YXNrIGZvciBldmVyeSAxMCBzZWNvbmQgaW50ZXJ2YWwgb2YgdGltZS4KICAgICAgKi8KKyAgICBAaXNJbnRlZ2VyCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QT0xPR1lfRVJST1JfVEhST1RUTEVfSU5URVJWQUxfU0VDUz0idG9wb2xvZ3kuZXJyb3IudGhyb3R0bGUuaW50ZXJ2YWwuc2VjcyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgVE9QT0xPR1lfRVJST1JfVEhST1RUTEVfSU5URVJWQUxfU0VDU19TQ0hFTUEgPSBDb25maWdWYWxpZGF0aW9uLkludGVnZXJWYWxpZGF0b3I7CiAKICAgICAvKioKICAgICAgKiBTZWUgZG9jIGZvciBUT1BPTE9HWV9FUlJPUl9USFJPVFRMRV9JTlRFUlZBTF9TRUNTCiAgICAgICovCisgICAgQGlzSW50ZWdlcgorICAgIEBpc1Bvc2l0aXZlTnVtYmVyCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QT0xPR1lfTUFYX0VSUk9SX1JFUE9SVF9QRVJfSU5URVJWQUw9InRvcG9sb2d5Lm1heC5lcnJvci5yZXBvcnQucGVyLmludGVydmFsIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBUT1BPTE9HWV9NQVhfRVJST1JfUkVQT1JUX1BFUl9JTlRFUlZBTF9TQ0hFTUEgPSBDb25maWdWYWxpZGF0aW9uLkludGVnZXJWYWxpZGF0b3I7Ci0KIAogICAgIC8qKgogICAgICAqIEhvdyBvZnRlbiBhIGJhdGNoIGNhbiBiZSBlbWl0dGVkIGluIGEgVHJpZGVudCB0b3BvbG9neS4KICAgICAgKi8KKyAgICBAaXNJbnRlZ2VyCisgICAgQGlzUG9zaXRpdmVOdW1iZXIKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BPTE9HWV9UUklERU5UX0JBVENIX0VNSVRfSU5URVJWQUxfTUlMTElTPSJ0b3BvbG9neS50cmlkZW50LmJhdGNoLmVtaXQuaW50ZXJ2YWwubWlsbGlzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBUT1BPTE9HWV9UUklERU5UX0JBVENIX0VNSVRfSU5URVJWQUxfTUlMTElTX1NDSEVNQSA9IENvbmZpZ1ZhbGlkYXRpb24uSW50ZWdlclZhbGlkYXRvcjsKIAogICAgIC8qKgogICAgICAqIE5hbWUgb2YgdGhlIHRvcG9sb2d5LiBUaGlzIGNvbmZpZyBpcyBhdXRvbWF0aWNhbGx5IHNldCBieSBTdG9ybSB3aGVuIHRoZSB0b3BvbG9neSBpcyBzdWJtaXR0ZWQuCiAgICAgICovCisgICAgQGlzU3RyaW5nCiAgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgVE9QT0xPR1lfTkFNRT0idG9wb2xvZ3kubmFtZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgVE9QT0xPR1lfTkFNRV9TQ0hFTUEgPSBTdHJpbmcuY2xhc3M7CiAKICAgICAvKioKICAgICAgKiBUaGUgcHJpbmNpcGFsIHdobyBzdWJtaXR0ZWQgYSB0b3BvbG9neQogICAgICAqLworICAgIEBpc1N0cmluZwogICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIFRPUE9MT0dZX1NVQk1JVFRFUl9QUklOQ0lQQUwgPSAidG9wb2xvZ3kuc3VibWl0dGVyLnByaW5jaXBhbCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgVE9QT0xPR1lfU1VCTUlUVEVSX1BSSU5DSVBBTF9TQ0hFTUEgPSBTdHJpbmcuY2xhc3M7CiAKICAgICAvKioKICAgICAgKiBUaGUgbG9jYWwgdXNlciBuYW1lIG9mIHRoZSB1c2VyIHdobyBzdWJtaXR0ZWQgYSB0b3BvbG9neS4KICAgICAgKi8KKyAgICBAaXNTdHJpbmcKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BPTE9HWV9TVUJNSVRURVJfVVNFUiA9ICJ0b3BvbG9neS5zdWJtaXR0ZXIudXNlciI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgVE9QT0xPR1lfU1VCTUlUVEVSX1VTRVJfU0NIRU1BID0gU3RyaW5nLmNsYXNzOwogCiAgICAgLyoqCiAgICAgICogQXJyYXkgb2YgY29tcG9uZW50cyB0aGF0IHNjaGVkdWxlciBzaG91bGQgdHJ5IHRvIHBsYWNlIG9uIHNlcGFyYXRlIGhvc3RzLgogICAgICAqLworICAgIEBpc1N0cmluZ0xpc3QKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BPTE9HWV9TUFJFQURfQ09NUE9ORU5UUyA9ICJ0b3BvbG9neS5zcHJlYWQuY29tcG9uZW50cyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgVE9QT0xPR1lfU1BSRUFEX0NPTVBPTkVOVFNfU0NIRU1BID0gQ29uZmlnVmFsaWRhdGlvbi5TdHJpbmdzVmFsaWRhdG9yOwogCiAgICAgLyoqCiAgICAgICogQSBsaXN0IG9mIElBdXRvQ3JlZGVudGlhbHMgdGhhdCB0aGUgdG9wb2xvZ3kgc2hvdWxkIGxvYWQgYW5kIHVzZS4KICAgICAgKi8KKyAgICBAaXNTdHJpbmdMaXN0CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QT0xPR1lfQVVUT19DUkVERU5USUFMUyA9ICJ0b3BvbG9neS5hdXRvLWNyZWRlbnRpYWxzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBUT1BPTE9HWV9BVVRPX0NSRURFTlRJQUxTX1NDSEVNQSA9IENvbmZpZ1ZhbGlkYXRpb24uU3RyaW5nc1ZhbGlkYXRvcjsKIAogICAgIC8qKgogICAgICAqIE1heCBwZW5kaW5nIHR1cGxlcyBpbiBvbmUgU2hlbGxCb2x0CiAgICAgICovCisgICAgQGlzSW50ZWdlcgorICAgIEBpc1Bvc2l0aXZlTnVtYmVyCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QT0xPR1lfU0hFTExCT0xUX01BWF9QRU5ESU5HPSJ0b3BvbG9neS5zaGVsbGJvbHQubWF4LnBlbmRpbmciOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFRPUE9MT0dZX1NIRUxMQk9MVF9NQVhfUEVORElOR19TQ0hFTUEgPSBDb25maWdWYWxpZGF0aW9uLkludGVnZXJWYWxpZGF0b3I7CisKKyAgICAvKioKKyAgICAgKiBIb3cgbG9uZyBhIHN1YnByb2Nlc3MgY2FuIGdvIHdpdGhvdXQgaGVhcnRiZWF0aW5nIGJlZm9yZSB0aGUgU2hlbGxTcG91dC9TaGVsbEJvbHQgdHJpZXMgdG8KKyAgICAgKiBzdWljaWRlIGl0c2VsZi4KKyAgICAgKi8KKyAgICBAaXNJbnRlZ2VyCisgICAgQGlzUG9zaXRpdmVOdW1iZXIKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BPTE9HWV9TVUJQUk9DRVNTX1RJTUVPVVRfU0VDUyA9ICJ0b3BvbG9neS5zdWJwcm9jZXNzLnRpbWVvdXQuc2VjcyI7CiAKICAgICAvKioKICAgICAgKiBUb3BvbG9neSBjZW50cmFsIGxvZ2dpbmcgc2Vuc2l0aXZpdHkgdG8gZGV0ZXJtaW5lIHdobyBoYXMgYWNjZXNzIHRvIGxvZ3MgaW4gY2VudHJhbCBsb2dnaW5nIHN5c3RlbS4KQEAgLTE0MzcsNTUgKzE3MjcsNTkgQEAKICAgICAgKiAgIFMyIC0gQ29uZmlkZW50aWFsCiAgICAgICogICBTMyAtIFNlY3JldCAoZGVmYXVsdC4pCiAgICAgICovCisgICAgQGlzU3RyaW5nKGFjY2VwdGVkVmFsdWVzID0geyJTMCIsICJTMSIsICJTMiIsICJTMyJ9KQogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUE9MT0dZX0xPR0dJTkdfU0VOU0lUSVZJVFk9InRvcG9sb2d5LmxvZ2dpbmcuc2Vuc2l0aXZpdHkiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFRPUE9MT0dZX0xPR0dJTkdfU0VOU0lUSVZJVFlfU0NIRU1BID0gU3RyaW5nLmNsYXNzOwogCiAgICAgLyoqCiAgICAgICogVGhlIHJvb3QgZGlyZWN0b3J5IGluIFpvb0tlZXBlciBmb3IgbWV0YWRhdGEgYWJvdXQgVHJhbnNhY3Rpb25hbFNwb3V0cy4KICAgICAgKi8KKyAgICBAaXNTdHJpbmcKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFOU0FDVElPTkFMX1pPT0tFRVBFUl9ST09UPSJ0cmFuc2FjdGlvbmFsLnpvb2tlZXBlci5yb290IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBUUkFOU0FDVElPTkFMX1pPT0tFRVBFUl9ST09UX1NDSEVNQSA9IFN0cmluZy5jbGFzczsKIAogICAgIC8qKgogICAgICAqIFRoZSBsaXN0IG9mIHpvb2tlZXBlciBzZXJ2ZXJzIGluIHdoaWNoIHRvIGtlZXAgdGhlIHRyYW5zYWN0aW9uYWwgc3RhdGUuIElmIG51bGwgKHdoaWNoIGlzIGRlZmF1bHQpLAogICAgICAqIHdpbGwgdXNlIHN0b3JtLnpvb2tlZXBlci5zZXJ2ZXJzCiAgICAgICovCisgICAgQGlzU3RyaW5nTGlzdAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQU5TQUNUSU9OQUxfWk9PS0VFUEVSX1NFUlZFUlM9InRyYW5zYWN0aW9uYWwuem9va2VlcGVyLnNlcnZlcnMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFRSQU5TQUNUSU9OQUxfWk9PS0VFUEVSX1NFUlZFUlNfU0NIRU1BID0gQ29uZmlnVmFsaWRhdGlvbi5TdHJpbmdzVmFsaWRhdG9yOwogCiAgICAgLyoqCiAgICAgICogVGhlIHBvcnQgdG8gdXNlIHRvIGNvbm5lY3QgdG8gdGhlIHRyYW5zYWN0aW9uYWwgem9va2VlcGVyIHNlcnZlcnMuIElmIG51bGwgKHdoaWNoIGlzIGRlZmF1bHQpLAogICAgICAqIHdpbGwgdXNlIHN0b3JtLnpvb2tlZXBlci5wb3J0CiAgICAgICovCisgICAgQGlzSW50ZWdlcgorICAgIEBpc1Bvc2l0aXZlTnVtYmVyCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBTlNBQ1RJT05BTF9aT09LRUVQRVJfUE9SVD0idHJhbnNhY3Rpb25hbC56b29rZWVwZXIucG9ydCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgVFJBTlNBQ1RJT05BTF9aT09LRUVQRVJfUE9SVF9TQ0hFTUEgPSBDb25maWdWYWxpZGF0aW9uLkludGVnZXJWYWxpZGF0b3I7CiAKICAgICAvKioKICAgICAgKiBUaGUgdXNlciBhcyB3aGljaCB0aGUgbmltYnVzIGNsaWVudCBzaG91bGQgYmUgYWNxdWlyZWQgdG8gcGVyZm9ybSB0aGUgb3BlcmF0aW9uLgogICAgICAqLworICAgIEBpc1N0cmluZwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUT1JNX0RPX0FTX1VTRVI9InN0b3JtLmRvQXNVc2VyIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBTVE9STV9ET19BU19VU0VSX1NDSEVNQSA9IFN0cmluZy5jbGFzczsKIAogICAgIC8qKgogICAgICAqIFRoZSBudW1iZXIgb2YgdGhyZWFkcyB0aGF0IHNob3VsZCBiZSB1c2VkIGJ5IHRoZSB6ZXJvbXEgY29udGV4dCBpbiBlYWNoIHdvcmtlciBwcm9jZXNzLgogICAgICAqLworICAgIEBEZXByZWNhdGVkCisgICAgQGlzSW50ZWdlcgogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFpNUV9USFJFQURTID0gInptcS50aHJlYWRzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBaTVFfVEhSRUFEU19TQ0hFTUEgPSBDb25maWdWYWxpZGF0aW9uLkludGVnZXJWYWxpZGF0b3I7CiAKICAgICAvKioKICAgICAgKiBIb3cgbG9uZyBhIGNvbm5lY3Rpb24gc2hvdWxkIHJldHJ5IHNlbmRpbmcgbWVzc2FnZXMgdG8gYSB0YXJnZXQgaG9zdCB3aGVuCiAgICAgICogdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkLiBUaGlzIGlzIGFuIGFkdmFuY2VkIGNvbmZpZ3VyYXRpb24gYW5kIGNhbiBhbG1vc3QKICAgICAgKiBjZXJ0YWlubHkgYmUgaWdub3JlZC4KICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIEBpc0ludGVnZXIKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBaTVFfTElOR0VSX01JTExJUyA9ICJ6bXEubGluZ2VyLm1pbGxpcyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgWk1RX0xJTkdFUl9NSUxMSVNfU0NIRU1BID0gQ29uZmlnVmFsaWRhdGlvbi5JbnRlZ2VyVmFsaWRhdG9yOwogCiAgICAgLyoqCiAgICAgICogVGhlIGhpZ2ggd2F0ZXIgZm9yIHRoZSBaZXJvTVEgcHVzaCBzb2NrZXRzIHVzZWQgZm9yIG5ldHdvcmtpbmcuIFVzZSB0aGlzIGNvbmZpZyB0byBwcmV2ZW50IGJ1ZmZlciBleHBsb3Npb24KICAgICAgKiBvbiB0aGUgbmV0d29ya2luZyBsYXllci4KICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIEBpc0ludGVnZXIKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBaTVFfSFdNID0gInptcS5od20iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IFpNUV9IV01fU0NIRU1BID0gQ29uZmlnVmFsaWRhdGlvbi5JbnRlZ2VyVmFsaWRhdG9yOwogCiAgICAgLyoqCiAgICAgICogVGhpcyB2YWx1ZSBpcyBwYXNzZWQgdG8gc3Bhd25lZCBKVk1zIChlLmcuLCBOaW1idXMsIFN1cGVydmlzb3IsIGFuZCBXb3JrZXJzKQpAQCAtMTQ5Myw1OSArMTc4Nyw3OSBAQAogICAgICAqIHRvIGxvb2sgZm9yIG5hdGl2ZSBsaWJyYXJpZXMuIEl0IGlzIG5lY2Vzc2FyeSB0byBzZXQgdGhpcyBjb25maWcgY29ycmVjdGx5IHNpbmNlCiAgICAgICogU3Rvcm0gdXNlcyB0aGUgWmVyb01RIGFuZCBKWk1RIG5hdGl2ZSBsaWJzLgogICAgICAqLworICAgIEBpc1N0cmluZwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpBVkFfTElCUkFSWV9QQVRIID0gImphdmEubGlicmFyeS5wYXRoIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBKQVZBX0xJQlJBUllfUEFUSF9TQ0hFTUEgPSBTdHJpbmcuY2xhc3M7CiAKICAgICAvKioKICAgICAgKiBUaGUgcGF0aCB0byB1c2UgYXMgdGhlIHpvb2tlZXBlciBkaXIgd2hlbiBydW5uaW5nIGEgem9va2VlcGVyIHNlcnZlciB2aWEKICAgICAgKiAic3Rvcm0gZGV2LXpvb2tlZXBlciIuIFRoaXMgem9va2VlcGVyIGluc3RhbmNlIGlzIG9ubHkgaW50ZW5kZWQgZm9yIGRldmVsb3BtZW50OwogICAgICAqIGl0IGlzIG5vdCBhIHByb2R1Y3Rpb24gZ3JhZGUgem9va2VlcGVyIHNldHVwLgogICAgICAqLworICAgIEBpc1N0cmluZwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFVl9aT09LRUVQRVJfUEFUSCA9ICJkZXYuem9va2VlcGVyLnBhdGgiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IERFVl9aT09LRUVQRVJfUEFUSF9TQ0hFTUEgPSBTdHJpbmcuY2xhc3M7CiAKICAgICAvKioKICAgICAgKiBBIG1hcCBmcm9tIHRvcG9sb2d5IG5hbWUgdG8gdGhlIG51bWJlciBvZiBtYWNoaW5lcyB0aGF0IHNob3VsZCBiZSBkZWRpY2F0ZWQgZm9yIHRoYXQgdG9wb2xvZ3kuIFNldCBzdG9ybS5zY2hlZHVsZXIKICAgICAgKiB0byBiYWNrdHlwZS5zdG9ybS5zY2hlZHVsZXIuSXNvbGF0aW9uU2NoZWR1bGVyIHRvIG1ha2UgdXNlIG9mIHRoZSBpc29sYXRpb24gc2NoZWR1bGVyLgogICAgICAqLworICAgIEBpc01hcEVudHJ5VHlwZShrZXlUeXBlID0gU3RyaW5nLmNsYXNzLCB2YWx1ZVR5cGUgPSBOdW1iZXIuY2xhc3MpCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSVNPTEFUSU9OX1NDSEVEVUxFUl9NQUNISU5FUyA9ICJpc29sYXRpb24uc2NoZWR1bGVyLm1hY2hpbmVzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBJU09MQVRJT05fU0NIRURVTEVSX01BQ0hJTkVTX1NDSEVNQSA9IENvbmZpZ1ZhbGlkYXRpb24uTWFwT2ZTdHJpbmdUb051bWJlclZhbGlkYXRvcjsKIAogICAgIC8qKgogICAgICAqIEEgbWFwIGZyb20gdGhlIHVzZXIgbmFtZSB0byB0aGUgbnVtYmVyIG9mIG1hY2hpbmVzIHRoYXQgc2hvdWxkIHRoYXQgdXNlciBpcyBhbGxvd2VkIHRvIHVzZS4gU2V0IHN0b3JtLnNjaGVkdWxlcgogICAgICAqIHRvIGJhY2t0eXBlLnN0b3JtLnNjaGVkdWxlci5tdWx0aXRlbmFudC5NdWx0aXRlbmFudFNjaGVkdWxlcgogICAgICAqLworICAgIEBpc01hcEVudHJ5VHlwZShrZXlUeXBlID0gU3RyaW5nLmNsYXNzLCB2YWx1ZVR5cGUgPSBOdW1iZXIuY2xhc3MpCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVVMVElURU5BTlRfU0NIRURVTEVSX1VTRVJfUE9PTFMgPSAibXVsdGl0ZW5hbnQuc2NoZWR1bGVyLnVzZXIucG9vbHMiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT2JqZWN0IE1VTFRJVEVOQU5UX1NDSEVEVUxFUl9VU0VSX1BPT0xTX1NDSEVNQSA9IENvbmZpZ1ZhbGlkYXRpb24uTWFwT2ZTdHJpbmdUb051bWJlclZhbGlkYXRvcjsKIAogICAgIC8qKgogICAgICAqIFRoZSBudW1iZXIgb2YgbWFjaGluZXMgdGhhdCBzaG91bGQgYmUgdXNlZCBieSB0aGlzIHRvcG9sb2d5IHRvIGlzb2xhdGUgaXQgZnJvbSBhbGwgb3RoZXJzLiBTZXQgc3Rvcm0uc2NoZWR1bGVyCiAgICAgICogdG8gYmFja3R5cGUuc3Rvcm0uc2NoZWR1bGVyLm11bHRpdGVuYW50Lk11bHRpdGVuYW50U2NoZWR1bGVyCiAgICAgICovCisgICAgQGlzSW50ZWdlcgorICAgIEBpc1Bvc2l0aXZlTnVtYmVyCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QT0xPR1lfSVNPTEFURURfTUFDSElORVMgPSAidG9wb2xvZ3kuaXNvbGF0ZS5tYWNoaW5lcyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgVE9QT0xPR1lfSVNPTEFURURfTUFDSElORVNfU0NIRU1BID0gTnVtYmVyLmNsYXNzOwogCiAgICAgLyoqCiAgICAgICogQ29uZmlndXJlIHRpbWVvdXQgbWlsbGlzZWNvbmRzIHVzZWQgZm9yIGRpc3J1cHRvciBxdWV1ZSB3YWl0IHN0cmF0ZWd5LiBDYW4gYmUgdXNlZCB0byB0cmFkZW9mZiBsYXRlbmN5CiAgICAgICogdnMuIENQVSB1c2FnZQogICAgICAqLworICAgIEBpc0ludGVnZXIKKyAgICBATm90TnVsbAogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRPUE9MT0dZX0RJU1JVUFRPUl9XQUlUX1RJTUVPVVRfTUlMTElTPSJ0b3BvbG9neS5kaXNydXB0b3Iud2FpdC50aW1lb3V0Lm1pbGxpcyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgVE9QT0xPR1lfRElTUlVQVE9SX1dBSVRfVElNRU9VVF9NSUxMSVNfU0NIRU1BID0gQ29uZmlnVmFsaWRhdGlvbi5Ob3ROdWxsUG9zSW50ZWdlclZhbGlkYXRvcjsKKworICAgIC8qKgorICAgICAqIFRoZSBudW1iZXIgb2YgdHVwbGVzIHRvIGJhdGNoIGJlZm9yZSBzZW5kaW5nIHRvIHRoZSBuZXh0IHRocmVhZC4gIFRoaXMgbnVtYmVyIGlzIGp1c3QgYW4gaW5pdGlhbCBzdWdnZXN0aW9uIGFuZAorICAgICAqIHRoZSBjb2RlIG1heSBhZGp1c3QgaXQgYXMgeW91ciB0b3BvbG9neSBydW5zLgorICAgICAqLworICAgIEBpc0ludGVnZXIKKyAgICBAaXNQb3NpdGl2ZU51bWJlcgorICAgIEBOb3ROdWxsCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9QT0xPR1lfRElTUlVQVE9SX0JBVENIX1NJWkU9InRvcG9sb2d5LmRpc3J1cHRvci5iYXRjaC5zaXplIjsKKworICAgIC8qKgorICAgICAqIFRoZSBtYXhpbXVtIGFnZSBpbiBtaWxsaXNlY29uZHMgYSBiYXRjaCBjYW4gYmUgYmVmb3JlIGJlaW5nIHNlbnQgdG8gdGhlIG5leHQgdGhyZWFkLiAgVGhpcyBudW1iZXIgaXMganVzdCBhbgorICAgICAqIGluaXRpYWwgc3VnZ2VzdGlvbiBhbmQgdGhlIGNvZGUgbWF5IGFkanVzdCBpdCBhcyB5b3VyIHRvcG9sb2d5IHJ1bnMuCisgICAgICovCisgICAgQGlzSW50ZWdlcgorICAgIEBpc1Bvc2l0aXZlTnVtYmVyCisgICAgQE5vdE51bGwKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BPTE9HWV9ESVNSVVBUT1JfQkFUQ0hfVElNRU9VVF9NSUxMSVM9InRvcG9sb2d5LmRpc3J1cHRvci5iYXRjaC50aW1lb3V0Lm1pbGxpcyI7CiAKICAgICAvKioKICAgICAgKiBXaGljaCBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgYmFja3R5cGUuc3Rvcm0uY29kZWRpc3RyaWJ1dG9yLklDb2RlRGlzdHJpYnV0b3J9IHNob3VsZCBiZSB1c2VkIGJ5IHN0b3JtIGZvciBjb2RlCiAgICAgICogZGlzdHJpYnV0aW9uLgogICAgICAqLworICAgIEBpc1N0cmluZwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUT1JNX0NPREVfRElTVFJJQlVUT1JfQ0xBU1MgPSAic3Rvcm0uY29kZWRpc3RyaWJ1dG9yLmNsYXNzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBTVE9STV9DT0RFX0RJU1RSSUJVVE9SX0NMQVNTX1NDSEVNQSA9IFN0cmluZy5jbGFzczsKIAogICAgIC8qKgogICAgICAqIE1pbmltdW0gbnVtYmVyIG9mIG5pbWJ1cyBob3N0cyB3aGVyZSB0aGUgY29kZSBtdXN0IGJlIHJlcGxpY2F0ZWQgYmVmb3JlIGxlYWRlciBuaW1idXMKICAgICAgKiBpcyBhbGxvd2VkIHRvIHBlcmZvcm0gdG9wb2xvZ3kgYWN0aXZhdGlvbiB0YXNrcyBsaWtlIHNldHRpbmcgdXAgaGVhcnRiZWF0cy9hc3NpZ25tZW50cwogICAgICAqIGFuZCBtYXJraW5nIHRoZSB0b3BvbG9neSBhcyBhY3RpdmUuIGRlZmF1bHQgaXMgMC4KICAgICAgKi8KKyAgICBAaXNOdW1iZXIKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BPTE9HWV9NSU5fUkVQTElDQVRJT05fQ09VTlQgPSAidG9wb2xvZ3kubWluLnJlcGxpY2F0aW9uLmNvdW50IjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBUT1BPTE9HWV9NSU5fUkVQTElDQVRJT05fQ09VTlRfU0NIRU1BID0gTnVtYmVyLmNsYXNzOwogCiAgICAgLyoqCiAgICAgICogTWF4aW11bSB3YWl0IHRpbWUgZm9yIHRoZSBuaW1idXMgaG9zdCByZXBsaWNhdGlvbiB0byBhY2hpZXZlIHRoZSBuaW1idXMubWluLnJlcGxpY2F0aW9uLmNvdW50LgpAQCAtMTU1MywxNCArMTg2NywxNCBAQAogICAgICAqIGlmIHJlcXVpcmVkIG5pbWJ1cy5taW4ucmVwbGljYXRpb24uY291bnQgaXMgbm90IGFjaGlldmVkLiBUaGUgZGVmYXVsdCBpcyAwIHNlY29uZHMsIGEgdmFsdWUgb2YKICAgICAgKiAtMSBpbmRpY2F0ZXMgdG8gd2FpdCBmb3IgZXZlci4KICAgICAgKi8KKyAgICBAaXNOdW1iZXIKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUT1BPTE9HWV9NQVhfUkVQTElDQVRJT05fV0FJVF9USU1FX1NFQyA9ICJ0b3BvbG9neS5tYXgucmVwbGljYXRpb24ud2FpdC50aW1lLnNlYyI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBPYmplY3QgVE9QT0xPR1lfTUFYX1JFUExJQ0FUSU9OX1dBSVRfVElNRV9TRUNfU0NIRU1BID0gTnVtYmVyLmNsYXNzOwogCiAgICAgLyoqCiAgICAgICogSG93IG9mdGVuIG5pbWJ1cydzIGJhY2tncm91bmQgdGhyZWFkIHRvIHN5bmMgY29kZSBmb3IgbWlzc2luZyB0b3BvbG9naWVzIHNob3VsZCBydW4uCiAgICAgICovCisgICAgQGlzSW50ZWdlcgogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5JTUJVU19DT0RFX1NZTkNfRlJFUV9TRUNTID0gIm5pbWJ1cy5jb2RlLnN5bmMuZnJlcS5zZWNzIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBOSU1CVVNfQ09ERV9TWU5DX0ZSRVFfU0VDU19TQ0hFTUEgPSBDb25maWdWYWxpZGF0aW9uLkludGVnZXJWYWxpZGF0b3I7CiAKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0Q2xhc3NwYXRoKE1hcCBjb25mLCBTdHJpbmcgY3ApIHsKICAgICAgICAgY29uZi5wdXQoQ29uZmlnLlRPUE9MT0dZX0NMQVNTUEFUSCwgY3ApOwpAQCAtMTY1MCw3ICsxOTY0LDcgQEAKICAgICB9CiAKICAgICBwdWJsaWMgdm9pZCByZWdpc3Rlck1ldHJpY3NDb25zdW1lcihDbGFzcyBrbGFzcywgT2JqZWN0IGFyZ3VtZW50LCBsb25nIHBhcmFsbGVsaXNtSGludCkgewotICAgICAgIHJlZ2lzdGVyTWV0cmljc0NvbnN1bWVyKHRoaXMsIGtsYXNzLCBhcmd1bWVudCwgcGFyYWxsZWxpc21IaW50KTsKKyAgICAgICAgcmVnaXN0ZXJNZXRyaWNzQ29uc3VtZXIodGhpcywga2xhc3MsIGFyZ3VtZW50LCBwYXJhbGxlbGlzbUhpbnQpOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3Rlck1ldHJpY3NDb25zdW1lcihNYXAgY29uZiwgQ2xhc3Mga2xhc3MsIGxvbmcgcGFyYWxsZWxpc21IaW50KSB7CkBAIC0xNjkwLDcgKzIwMDQsNyBAQAogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIHNldFNraXBNaXNzaW5nS3J5b1JlZ2lzdHJhdGlvbnMoYm9vbGVhbiBza2lwKSB7Ci0gICAgICAgc2V0U2tpcE1pc3NpbmdLcnlvUmVnaXN0cmF0aW9ucyh0aGlzLCBza2lwKTsKKyAgICAgICAgc2V0U2tpcE1pc3NpbmdLcnlvUmVnaXN0cmF0aW9ucyh0aGlzLCBza2lwKTsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0TWF4VGFza1BhcmFsbGVsaXNtKE1hcCBjb25mLCBpbnQgbWF4KSB7CkBAIC0xNzQ2LDQgKzIwNjAsMTQgQEAKICAgICAgICAgY29uZi5wdXQoQ29uZmlnLlRPUE9MT0dZX0tSWU9fREVDT1JBVE9SUywgcmV0KTsKICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CisKKyAgICAvKioKKyAgICAgKiBzZXQgdGhlIG1heCBoZWFwIHNpemUgYWxsb3cgcGVyIHdvcmtlciBmb3IgdGhpcyB0b3BvbG9neQorICAgICAqIEBwYXJhbSBzaXplCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VG9wb2xvZ3lXb3JrZXJNYXhIZWFwU2l6ZShOdW1iZXIgc2l6ZSkgeworICAgICAgICBpZihzaXplICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMucHV0KENvbmZpZy5UT1BPTE9HWV9XT1JLRVJfTUFYX0hFQVBfU0laRV9NQiwgc2l6ZSk7CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vQ29uZmlnVmFsaWRhdGlvbi5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL0NvbmZpZ1ZhbGlkYXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ5ZGFlNy4uMDAwMDAwMAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vQ29uZmlnVmFsaWRhdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc1ICswLDAgQEAKLS8qKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGJhY2t0eXBlLnN0b3JtOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBQcm92aWRlcyBmdW5jdGlvbmFsaXR5IGZvciB2YWxpZGF0aW5nIGNvbmZpZ3VyYXRpb24gZmllbGRzLgotICovCi1wdWJsaWMgY2xhc3MgQ29uZmlnVmFsaWRhdGlvbiB7Ci0KLSAgICAvKioKLSAgICAgKiBEZWNsYXJlcyBtZXRob2RzIGZvciB2YWxpZGF0aW5nIGNvbmZpZ3VyYXRpb24gdmFsdWVzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIEZpZWxkVmFsaWRhdG9yIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFZhbGlkYXRlcyB0aGUgZ2l2ZW4gZmllbGQuCi0gICAgICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWVsZC4KLSAgICAgICAgICogQHBhcmFtIGZpZWxkIFRoZSBmaWVsZCB0byBiZSB2YWxpZGF0ZWQuCi0gICAgICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBmaWVsZCBmYWlscyB2YWxpZGF0aW9uLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgdmFsaWRhdGVGaWVsZChTdHJpbmcgbmFtZSwgT2JqZWN0IGZpZWxkKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBEZWNsYXJlcyBhIG1ldGhvZCBmb3IgdmFsaWRhdGluZyBjb25maWd1cmF0aW9uIHZhbHVlcyB0aGF0IGlzIG5lc3RhYmxlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgTmVzdGFibGVGaWVsZFZhbGlkYXRvciBpbXBsZW1lbnRzIEZpZWxkVmFsaWRhdG9yIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlRmllbGQoU3RyaW5nIG5hbWUsIE9iamVjdCBmaWVsZCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICB2YWxpZGF0ZUZpZWxkKG51bGwsIG5hbWUsIGZpZWxkKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFZhbGlkYXRlcyB0aGUgZ2l2ZW4gZmllbGQuCi0gICAgICAgICAqIEBwYXJhbSBwZCBkZXNjcmliZXMgdGhlIHBhcmVudCB3cmFwcGluZyB0aGlzIHZhbGlkYXRvci4KLSAgICAgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpZWxkLgotICAgICAgICAgKiBAcGFyYW0gZmllbGQgVGhlIGZpZWxkIHRvIGJlIHZhbGlkYXRlZC4KLSAgICAgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGZpZWxkIGZhaWxzIHZhbGlkYXRpb24uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB2YWxpZGF0ZUZpZWxkKFN0cmluZyBwZCwgU3RyaW5nIG5hbWUsIE9iamVjdCBmaWVsZCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IE5lc3RhYmxlRmllbGRWYWxpZGF0b3IgZm9yIGEgZ2l2ZW4gY2xhc3MuCi0gICAgICogQHBhcmFtIGNscyB0aGUgQ2xhc3MgdGhlIGZpZWxkIHNob3VsZCBiZSBhIHR5cGUgb2YKLSAgICAgKiBAcGFyYW0gbnVsbEFsbG93ZWQgd2hldGhlciBvciBub3QgYSB2YWx1ZSBvZiBudWxsIGlzIHZhbGlkCi0gICAgICogQHJldHVybiBhIE5lc3RhYmxlRmllbGRWYWxpZGF0b3IgZm9yIHRoYXQgY2xhc3MKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE5lc3RhYmxlRmllbGRWYWxpZGF0b3IgZnYoZmluYWwgQ2xhc3MgY2xzLCBmaW5hbCBib29sZWFuIG51bGxBbGxvd2VkKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTmVzdGFibGVGaWVsZFZhbGlkYXRvcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgdmFsaWRhdGVGaWVsZChTdHJpbmcgcGQsIFN0cmluZyBuYW1lLCBPYmplY3QgZmllbGQpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGlmIChudWxsQWxsb3dlZCAmJiBmaWVsZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCEgY2xzLmlzSW5zdGFuY2UoZmllbGQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBwZCArIG5hbWUgKyAiIG11c3QgYmUgYSAiICsgY2xzLmdldE5hbWUoKSArICIuICgiK2ZpZWxkKyIpIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IE5lc3RhYmxlRmllbGRWYWxpZGF0b3IgZm9yIGEgTGlzdCBvZiB0aGUgZ2l2ZW4gQ2xhc3MuCi0gICAgICogQHBhcmFtIGNscyB0aGUgQ2xhc3Mgb2YgZWxlbWVudHMgY29tcG9zaW5nIHRoZSBsaXN0Ci0gICAgICogQHBhcmFtIG51bGxBbGxvd2VkIHdoZXRoZXIgb3Igbm90IGEgdmFsdWUgb2YgbnVsbCBpcyB2YWxpZAotICAgICAqIEByZXR1cm4gYSBOZXN0YWJsZUZpZWxkVmFsaWRhdG9yIGZvciBhIGxpc3Qgb2YgdGhlIGdpdmVuIGNsYXNzCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBOZXN0YWJsZUZpZWxkVmFsaWRhdG9yIGxpc3RGdihDbGFzcyBjbHMsIGJvb2xlYW4gbnVsbEFsbG93ZWQpIHsKLSAgICAgIHJldHVybiBsaXN0RnYoZnYoY2xzLCBmYWxzZSksIG51bGxBbGxvd2VkKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBOZXN0YWJsZUZpZWxkVmFsaWRhdG9yIGZvciBhIExpc3Qgd2hlcmUgZWFjaCBpdGVtIGlzIHZhbGlkYXRlZCBieSB2YWxpZGF0b3IuCi0gICAgICogQHBhcmFtIHZhbGlkYXRvciB1c2VkIHRvIHZhbGlkYXRlIGVhY2ggaXRlbSBpbiB0aGUgbGlzdAotICAgICAqIEBwYXJhbSBudWxsQWxsb3dlZCB3aGV0aGVyIG9yIG5vdCBhIHZhbHVlIG9mIG51bGwgaXMgdmFsaWQKLSAgICAgKiBAcmV0dXJuIGEgTmVzdGFibGVGaWVsZFZhbGlkYXRvciBmb3IgYSBsaXN0IHdpdGggZWFjaCBpdGVtIHZhbGlkYXRlZCBieSBhIGRpZmZlcmVudCB2YWxpZGF0b3IuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBOZXN0YWJsZUZpZWxkVmFsaWRhdG9yIGxpc3RGdihmaW5hbCBOZXN0YWJsZUZpZWxkVmFsaWRhdG9yIHZhbGlkYXRvciwgCi0gICAgICAgICAgICBmaW5hbCBib29sZWFuIG51bGxBbGxvd2VkKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTmVzdGFibGVGaWVsZFZhbGlkYXRvcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgdmFsaWRhdGVGaWVsZChTdHJpbmcgcGQsIFN0cmluZyBuYW1lLCBPYmplY3QgZmllbGQpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotICAgICAgICAgICAgICAgIGlmIChudWxsQWxsb3dlZCAmJiBmaWVsZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGZpZWxkIGluc3RhbmNlb2YgSXRlcmFibGUpIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChPYmplY3QgZSA6IChJdGVyYWJsZSlmaWVsZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yLnZhbGlkYXRlRmllbGQocGQgKyAiRWFjaCBlbGVtZW50IG9mIHRoZSBsaXN0ICIsIG5hbWUsIGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJGaWVsZCAiICsgbmFtZSArICIgbXVzdCBiZSBhbiBJdGVyYWJsZSBidXQgd2FzICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgKChmaWVsZCA9PSBudWxsKSA/ICJudWxsIiA6ICAoImEgIiArIGZpZWxkLmdldENsYXNzKCkpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIG5ldyBOZXN0YWJsZUZpZWxkVmFsaWRhdG9yIGZvciBhIE1hcCBvZiBrZXkgdG8gdmFsLgotICAgICAqIEBwYXJhbSBrZXkgdGhlIENsYXNzIG9mIGtleXMgaW4gdGhlIG1hcAotICAgICAqIEBwYXJhbSB2YWwgdGhlIENsYXNzIG9mIHZhbHVlcyBpbiB0aGUgbWFwCi0gICAgICogQHBhcmFtIG51bGxBbGxvd2VkIHdoZXRoZXIgb3Igbm90IGEgdmFsdWUgb2YgbnVsbCBpcyB2YWxpZAotICAgICAqIEByZXR1cm4gYSBOZXN0YWJsZUZpZWxkVmFsaWRhdG9yIGZvciBhIE1hcCBvZiBrZXkgdG8gdmFsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBOZXN0YWJsZUZpZWxkVmFsaWRhdG9yIG1hcEZ2KENsYXNzIGtleSwgQ2xhc3MgdmFsLCAKLSAgICAgICAgICAgIGJvb2xlYW4gbnVsbEFsbG93ZWQpIHsKLSAgICAgICAgcmV0dXJuIG1hcEZ2KGZ2KGtleSwgZmFsc2UpLCBmdih2YWwsIGZhbHNlKSwgbnVsbEFsbG93ZWQpOwotICAgIH0KLSAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IE5lc3RhYmxlRmllbGRWYWxpZGF0b3IgZm9yIGEgTWFwLgotICAgICAqIEBwYXJhbSBrZXkgYSB2YWxpZGF0b3IgZm9yIHRoZSBrZXlzIGluIHRoZSBtYXAKLSAgICAgKiBAcGFyYW0gdmFsIGEgdmFsaWRhdG9yIGZvciB0aGUgdmFsdWVzIGluIHRoZSBtYXAKLSAgICAgKiBAcGFyYW0gbnVsbEFsbG93ZWQgd2hldGhlciBvciBub3QgYSB2YWx1ZSBvZiBudWxsIGlzIHZhbGlkCi0gICAgICogQHJldHVybiBhIE5lc3RhYmxlRmllbGRWYWxpZGF0b3IgZm9yIGEgTWFwCi0gICAgICovICAgCi0gICAgcHVibGljIHN0YXRpYyBOZXN0YWJsZUZpZWxkVmFsaWRhdG9yIG1hcEZ2KGZpbmFsIE5lc3RhYmxlRmllbGRWYWxpZGF0b3Iga2V5LCAKLSAgICAgICAgICAgIGZpbmFsIE5lc3RhYmxlRmllbGRWYWxpZGF0b3IgdmFsLCBmaW5hbCBib29sZWFuIG51bGxBbGxvd2VkKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTmVzdGFibGVGaWVsZFZhbGlkYXRvcigpIHsKLSAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZUZpZWxkKFN0cmluZyBwZCwgU3RyaW5nIG5hbWUsIE9iamVjdCBmaWVsZCkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICAgICAgaWYgKG51bGxBbGxvd2VkICYmIGZpZWxkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZmllbGQgaW5zdGFuY2VvZiBNYXApIHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8T2JqZWN0LCBPYmplY3Q+IGVudHJ5OiAoKE1hcDxPYmplY3QsIE9iamVjdD4pZmllbGQpLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICBrZXkudmFsaWRhdGVGaWVsZCgiRWFjaCBrZXkgb2YgdGhlIG1hcCAiLCBuYW1lLCBlbnRyeS5nZXRLZXkoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgdmFsLnZhbGlkYXRlRmllbGQoIkVhY2ggdmFsdWUgaW4gdGhlIG1hcCAiLCBuYW1lLCBlbnRyeS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiRmllbGQgIiArIG5hbWUgKyAiIG11c3QgYmUgYSBNYXAiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogVmFsaWRhdGVzIGEgbGlzdCBvZiBOdW1iZXJzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IE51bWJlcnNWYWxpZGF0b3IgPSBsaXN0RnYoTnVtYmVyLmNsYXNzLCB0cnVlKTsKLQotICAgIC8qKgotICAgICAqIFZhbGlkYXRlcyBhIGxpc3Qgb2YgU3RyaW5ncy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBTdHJpbmdzVmFsaWRhdG9yID0gbGlzdEZ2KFN0cmluZy5jbGFzcywgdHJ1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBWYWxpZGF0ZXMgYSBtYXAgb2YgU3RyaW5ncyB0byBOdW1iZXJzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IE1hcE9mU3RyaW5nVG9OdW1iZXJWYWxpZGF0b3IgPSBtYXBGdihTdHJpbmcuY2xhc3MsIE51bWJlci5jbGFzcywgdHJ1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBWYWxpZGF0ZXMgYSBtYXAgb2YgU3RyaW5ncyB0byBhIG1hcCBvZiBTdHJpbmdzIHRvIGEgbGlzdC4KLSAgICAgKiB7c3RyIC0+IHtzdHIgLT4gW3N0cixzdHJdfQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IE1hcE9mU3RyaW5nVG9NYXBWYWxpZGF0b3IgPSBtYXBGdihmdihTdHJpbmcuY2xhc3MsIGZhbHNlKSwgbWFwRnYoZnYoU3RyaW5nLmNsYXNzLCBmYWxzZSksIGxpc3RGdihTdHJpbmcuY2xhc3MsIGZhbHNlKSwgZmFsc2UpLCB0cnVlKTsKLQotICAgIC8qKgotICAgICAqIFZhbGlkYXRlcyBpcyBhIGxpc3Qgb2YgTWFwcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBNYXBzVmFsaWRhdG9yID0gbGlzdEZ2KE1hcC5jbGFzcywgdHJ1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBWYWxpZGF0ZXMgYSBub24gbnVsbCBJbnRlZ2VyID4gMAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IE5vdE51bGxQb3NJbnRlZ2VyVmFsaWRhdG9yID0gbmV3IEZpZWxkVmFsaWRhdG9yKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgdmFsaWRhdGVGaWVsZChTdHJpbmcgbmFtZSwgT2JqZWN0IG8pIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotICAgICAgICAgICAgZmluYWwgbG9uZyBpOwotICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBOdW1iZXIgJiYKLSAgICAgICAgICAgICAgICAgICAgKGkgPSAoKE51bWJlcilvKS5sb25nVmFsdWUoKSkgPT0gKChOdW1iZXIpbykuZG91YmxlVmFsdWUoKSkgewotICAgICAgICAgICAgICAgIGlmIChpIDw9IEludGVnZXIuTUFYX1ZBTFVFICYmIGkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkZpZWxkICIgKyBuYW1lICsgIiBtdXN0IGJlIGFuIEludGVnZXIgPiAwIik7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgLyoqCi0gICAgICogVmFsaWRhdGVzIGEgSW50ZWdlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBJbnRlZ2VyVmFsaWRhdG9yID0gbmV3IEZpZWxkVmFsaWRhdG9yKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgdmFsaWRhdGVGaWVsZChTdHJpbmcgbmFtZSwgT2JqZWN0IG8pIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotICAgICAgICAgICAgaWYgKG8gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIEEgbnVsbCB2YWx1ZSBpcyBhY2NlcHRhYmxlLgotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIGxvbmcgaTsKLSAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgTnVtYmVyICYmCi0gICAgICAgICAgICAgICAgICAgIChpID0gKChOdW1iZXIpbykubG9uZ1ZhbHVlKCkpID09ICgoTnVtYmVyKW8pLmRvdWJsZVZhbHVlKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoaSA8PSBJbnRlZ2VyLk1BWF9WQUxVRSAmJiBpID49IEludGVnZXIuTUlOX1ZBTFVFKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkZpZWxkICIgKyBuYW1lICsgIiBtdXN0IGJlIGFuIEludGVnZXIgd2l0aGluIHR5cGUgcmFuZ2UuIik7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgLyoqCi0gICAgICogVmFsaWRhdGVzIGlzIGEgbGlzdCBvZiBJbnRlZ2Vycy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBOb0R1cGxpY2F0ZUludGVnZXJzVmFsaWRhdG9yID0gbmV3IEZpZWxkVmFsaWRhdG9yKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgdmFsaWRhdGVGaWVsZChTdHJpbmcgbmFtZSwgT2JqZWN0IGZpZWxkKQotICAgICAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotICAgICAgICAgICAgaWYgKGZpZWxkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBBIG51bGwgdmFsdWUgaXMgYWNjZXB0YWJsZS4KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgICAgICAgICBTZXQ8TnVtYmVyPiBpbnRlZ2VyU2V0ID0gbmV3IEhhc2hTZXQ8TnVtYmVyPigpOwotICAgICAgICAgICAgaWYgKGZpZWxkIGluc3RhbmNlb2YgSXRlcmFibGUpIHsKLSAgICAgICAgICAgICAgICBmb3IgKE9iamVjdCBvIDogKEl0ZXJhYmxlKWZpZWxkKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNpemUrKzsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgbG9uZyBpOwotICAgICAgICAgICAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIE51bWJlciAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaSA9ICgoTnVtYmVyKW8pLmxvbmdWYWx1ZSgpKSA9PSAoKE51bWJlcilvKS5kb3VibGVWYWx1ZSgpKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpIDw9IEludGVnZXIuTUFYX1ZBTFVFICYmIGkgPj0gSW50ZWdlci5NSU5fVkFMVUUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXNzIHRoZSB0ZXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnRlZ2VyU2V0LmFkZCgoTnVtYmVyKSBvKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFYWNoIGVsZW1lbnQgb2YgdGhlIGxpc3QgIiArIG5hbWUgKyAiIG11c3QgYmUgYW4gSW50ZWdlciB3aXRoaW4gdHlwZSByYW5nZS4iKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc2l6ZSAhPSBpbnRlZ2VyU2V0LnNpemUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKG5hbWUgKyAiIHNob3VsZCBjb250YWluIG5vIGR1cGxpY2F0ZSBlbGVtZW50cyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgLyoqCi0gICAgICogVmFsaWRhdGVzIGEgUG9zaXRpdmUgTnVtYmVyCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgUG9zaXRpdmVOdW1iZXJWYWxpZGF0b3IgPSBuZXcgRmllbGRWYWxpZGF0b3IoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZUZpZWxkKFN0cmluZyBuYW1lLCBPYmplY3QgbykgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAobyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gQSBudWxsIHZhbHVlIGlzIGFjY2VwdGFibGUuCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYobyBpbnN0YW5jZW9mIE51bWJlcikgewotICAgICAgICAgICAgICAgIGlmKCgoTnVtYmVyKW8pLmRvdWJsZVZhbHVlKCkgPiAwLjApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkZpZWxkICIgKyBuYW1lICsgIiBtdXN0IGJlIGEgUG9zaXRpdmUgTnVtYmVyIik7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgLyoqCi0gICAgICogVmFsaWRhdGVzIGEgcG93ZXIgb2YgMi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBQb3dlck9mMlZhbGlkYXRvciA9IG5ldyBGaWVsZFZhbGlkYXRvcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlRmllbGQoU3RyaW5nIG5hbWUsIE9iamVjdCBvKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGlmIChvID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBBIG51bGwgdmFsdWUgaXMgYWNjZXB0YWJsZS4KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBsb25nIGk7Ci0gICAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIE51bWJlciAmJgotICAgICAgICAgICAgICAgICAgICAoaSA9ICgoTnVtYmVyKW8pLmxvbmdWYWx1ZSgpKSA9PSAoKE51bWJlcilvKS5kb3VibGVWYWx1ZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIFRlc3Qgd2hldGhlciB0aGUgaW50ZWdlciBpcyBhIHBvd2VyIG9mIDIuCi0gICAgICAgICAgICAgICAgaWYgKGkgPiAwICYmIChpICYgKGktMSkpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkZpZWxkICIgKyBuYW1lICsgIiBtdXN0IGJlIGEgcG93ZXIgb2YgMi4iKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICAvKioKLSAgICAgKiBWYWxpZGF0ZXMgYSBwb3NpdGl2ZSBpbnRlZ2VyLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IFBvc2l0aXZlSW50ZWdlclZhbGlkYXRvciA9IG5ldyBGaWVsZFZhbGlkYXRvcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlRmllbGQoU3RyaW5nIG5hbWUsIE9iamVjdCBvKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgICAgIGlmIChvID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBBIG51bGwgdmFsdWUgaXMgYWNjZXB0YWJsZS4KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBsb25nIGk7Ci0gICAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIE51bWJlciAmJgotICAgICAgICAgICAgICAgICAgICAoaSA9ICgoTnVtYmVyKW8pLmxvbmdWYWx1ZSgpKSA9PSAoKE51bWJlcilvKS5kb3VibGVWYWx1ZSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRmllbGQgIiArIG5hbWUgKyAiIG11c3QgYmUgYSBwb3NpdGl2ZSBpbnRlZ2VyLiIpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIC8qKgotICAgICAqIFZhbGlkYXRlcyBLcnlvIFJlZ2lzdHJhdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IEtyeW9SZWdWYWxpZGF0b3IgPSBuZXcgRmllbGRWYWxpZGF0b3IoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZUZpZWxkKFN0cmluZyBuYW1lLCBPYmplY3QgbykgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBpZiAobyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gQSBudWxsIHZhbHVlIGlzIGFjY2VwdGFibGUuCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBJdGVyYWJsZSkgewotICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0IGUgOiAoSXRlcmFibGUpbykgewotICAgICAgICAgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIE1hcCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8T2JqZWN0LE9iamVjdD4gZW50cnk6ICgoTWFwPE9iamVjdCxPYmplY3Q+KWUpLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShlbnRyeS5nZXRLZXkoKSBpbnN0YW5jZW9mIFN0cmluZykgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIShlbnRyeS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgU3RyaW5nKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVhY2ggZWxlbWVudCBvZiB0aGUgbGlzdCAiICsgbmFtZSArICIgbXVzdCBiZSBhIFN0cmluZyBvciBhIE1hcCBvZiBTdHJpbmdzIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCEoZSBpbnN0YW5jZW9mIFN0cmluZykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFYWNoIGVsZW1lbnQgb2YgdGhlIGxpc3QgIiArIG5hbWUgKyAiIG11c3QgYmUgYSBTdHJpbmcgb3IgYSBNYXAgb2YgU3RyaW5ncyIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJGaWVsZCAiICsgbmFtZSArICIgbXVzdCBiZSBhbiBJdGVyYWJsZSBjb250YWluaW5nIG9ubHkgU3RyaW5ncyBvciBNYXBzIG9mIFN0cmluZ3MiKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICAvKioKLSAgICAgKiBWYWxpZGF0ZXMgYSBTdHJpbmcgb3IgYSBsaXN0IG9mIFN0cmluZ3MKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBTdHJpbmdPclN0cmluZ0xpc3RWYWxpZGF0b3IgPSBuZXcgRmllbGRWYWxpZGF0b3IoKSB7Ci0KLSAgICAgICAgcHJpdmF0ZSBGaWVsZFZhbGlkYXRvciBmdiA9IGxpc3RGdihTdHJpbmcuY2xhc3MsIGZhbHNlKTsKLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgdmFsaWRhdGVGaWVsZChTdHJpbmcgbmFtZSwgT2JqZWN0IG8pIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotICAgICAgICAgICAgaWYgKG8gPT0gbnVsbCB8fCBvIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgICAgICAgLy8gQSBudWxsIHZhbHVlIG9yIGEgU3RyaW5nIHZhbHVlIGlzIGFjY2VwdGFibGUKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aGlzLmZ2LnZhbGlkYXRlRmllbGQobmFtZSwgbyk7Ci0gICAgICAgIH0KLSAgICB9OwotfQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL0xvZ1dyaXRlci5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL0xvZ1dyaXRlci5qYXZhCmluZGV4IGIwODU3ZTguLjg0OWY1Y2EgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9Mb2dXcml0ZXIuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vTG9nV3JpdGVyLmphdmEKQEAgLTQxLDcgKzQxLDcgQEAKICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CiAgICAgICAgIExvZ2dlciBsb2dnZXIgPSB0aGlzLmxvZ2dlcjsKICAgICAgICAgQnVmZmVyZWRSZWFkZXIgaW4gPSB0aGlzLmluOwotICAgICAgICBTdHJpbmcgbGluZSA9IG51bGw7CisgICAgICAgIFN0cmluZyBsaW5lOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgd2hpbGUgKChsaW5lID0gaW4ucmVhZExpbmUoKSkgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGxpbmUpOwpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL1N0b3JtU3VibWl0dGVyLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vU3Rvcm1TdWJtaXR0ZXIuamF2YQppbmRleCBhNGNjZjVmLi4xZDdhMWYzIDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vU3Rvcm1TdWJtaXR0ZXIuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vU3Rvcm1TdWJtaXR0ZXIuamF2YQpAQCAtMjQsNiArMjQsOCBAQAogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5zY2hlZHVsZXIucmVzb3VyY2UuUmVzb3VyY2VVdGlsczsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS52YWxpZGF0aW9uLkNvbmZpZ1ZhbGlkYXRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxhbmcuU3RyaW5nVXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuanNvbi5zaW1wbGUuSlNPTlZhbHVlOwpAQCAtNDMsMTYgKzQ1LDEyIEBACiAgKiBzdWJtaXQgeW91ciB0b3BvbG9naWVzLgogICovCiBwdWJsaWMgY2xhc3MgU3Rvcm1TdWJtaXR0ZXIgewotICAgIHB1YmxpYyBzdGF0aWMgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFN0b3JtU3VibWl0dGVyLmNsYXNzKTsgICAgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoU3Rvcm1TdWJtaXR0ZXIuY2xhc3MpOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRIUklGVF9DSFVOS19TSVpFX0JZVEVTID0gMzA3MjAwOwogICAgIAogICAgIHByaXZhdGUgc3RhdGljIElMb2NhbENsdXN0ZXIgbG9jYWxOaW1idXMgPSBudWxsOwogCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldExvY2FsTmltYnVzKElMb2NhbENsdXN0ZXIgbG9jYWxOaW1idXNIYW5kbGVyKSB7Ci0gICAgICAgIFN0b3JtU3VibWl0dGVyLmxvY2FsTmltYnVzID0gbG9jYWxOaW1idXNIYW5kbGVyOwotICAgIH0KLQogICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZW5lcmF0ZVpvb2tlZXBlckRpZ2VzdFNlY3JldFBheWxvYWQoKSB7CiAgICAgICAgIHJldHVybiBVdGlscy5zZWN1cmVSYW5kb21Mb25nKCkgKyAiOiIgKyBVdGlscy5zZWN1cmVSYW5kb21Mb25nKCk7CiAgICAgfQpAQCAtODksNyArODcsNyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsU3RyaW5nPiBwb3B1bGF0ZUNyZWRlbnRpYWxzKE1hcCBjb25mLCBNYXA8U3RyaW5nLCBTdHJpbmc+IGNyZWRzKSB7Ci0gICAgICAgIE1hcDxTdHJpbmcsU3RyaW5nPiByZXQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsU3RyaW5nPigpOworICAgICAgICBNYXA8U3RyaW5nLFN0cmluZz4gcmV0ID0gbmV3IEhhc2hNYXA8PigpOwogICAgICAgICBmb3IgKElBdXRvQ3JlZGVudGlhbHMgYXV0b0NyZWQ6IEF1dGhVdGlscy5HZXRBdXRvQ3JlZGVudGlhbHMoY29uZikpIHsKICAgICAgICAgICAgIExPRy5pbmZvKCJSdW5uaW5nICIrYXV0b0NyZWQpOwogICAgICAgICAgICAgYXV0b0NyZWQucG9wdWxhdGVDcmVkZW50aWFscyhyZXQpOwpAQCAtMTUyLDcgKzE1MCw3IEBACiAgICAgICogQHRocm93cyBJbnZhbGlkVG9wb2xvZ3lFeGNlcHRpb24gaWYgYW4gaW52YWxpZCB0b3BvbG9neSB3YXMgc3VibWl0dGVkCiAgICAgICogQHRocm93cyBBdXRob3JpemF0aW9uRXhjZXB0aW9uIGlmIGF1dGhvcml6YXRpb24gaXMgZmFpbGVkCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHN1Ym1pdFRvcG9sb2d5KFN0cmluZyBuYW1lLCBNYXAgc3Rvcm1Db25mLCBTdG9ybVRvcG9sb2d5IHRvcG9sb2d5KSAKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc3VibWl0VG9wb2xvZ3koU3RyaW5nIG5hbWUsIE1hcCBzdG9ybUNvbmYsIFN0b3JtVG9wb2xvZ3kgdG9wb2xvZ3kpCiAgICAgICAgICAgICB0aHJvd3MgQWxyZWFkeUFsaXZlRXhjZXB0aW9uLCBJbnZhbGlkVG9wb2xvZ3lFeGNlcHRpb24sIEF1dGhvcml6YXRpb25FeGNlcHRpb24gewogICAgICAgICBzdWJtaXRUb3BvbG9neShuYW1lLCBzdG9ybUNvbmYsIHRvcG9sb2d5LCBudWxsLCBudWxsKTsKICAgICB9ICAgIApAQCAtMTY5LDcgKzE2Nyw3IEBACiAgICAgICogQHRocm93cyBJbnZhbGlkVG9wb2xvZ3lFeGNlcHRpb24gaWYgYW4gaW52YWxpZCB0b3BvbG9neSB3YXMgc3VibWl0dGVkCiAgICAgICogQHRocm93cyBBdXRob3JpemF0aW9uRXhjZXB0aW9uIGlmIGF1dGhvcml6YXRpb24gaXMgZmFpbGVkCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHN1Ym1pdFRvcG9sb2d5KFN0cmluZyBuYW1lLCBNYXAgc3Rvcm1Db25mLCBTdG9ybVRvcG9sb2d5IHRvcG9sb2d5LCBTdWJtaXRPcHRpb25zIG9wdHMpIAorICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzdWJtaXRUb3BvbG9neShTdHJpbmcgbmFtZSwgTWFwIHN0b3JtQ29uZiwgU3Rvcm1Ub3BvbG9neSB0b3BvbG9neSwgU3VibWl0T3B0aW9ucyBvcHRzKQogICAgICAgICAgICAgdGhyb3dzIEFscmVhZHlBbGl2ZUV4Y2VwdGlvbiwgSW52YWxpZFRvcG9sb2d5RXhjZXB0aW9uLCBBdXRob3JpemF0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgc3VibWl0VG9wb2xvZ3kobmFtZSwgc3Rvcm1Db25mLCB0b3BvbG9neSwgb3B0cywgbnVsbCk7CiAgICAgfQpAQCAtMTg1LDkgKzE4MywxMCBAQAogICAgICAqIEB0aHJvd3MgQWxyZWFkeUFsaXZlRXhjZXB0aW9uCiAgICAgICogQHRocm93cyBJbnZhbGlkVG9wb2xvZ3lFeGNlcHRpb24KICAgICAgKiBAdGhyb3dzIEF1dGhvcml6YXRpb25FeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB0aHJvd24gaWYgY29uZmlncyB3aWxsIHlpZWxkIGFuIHVuc2NoZWR1bGFibGUgdG9wb2xvZ3kuIHZhbGlkYXRlQ29uZnMgdmFsaWRhdGVzIGNvbmZzCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHN1Ym1pdFRvcG9sb2d5QXMoU3RyaW5nIG5hbWUsIE1hcCBzdG9ybUNvbmYsIFN0b3JtVG9wb2xvZ3kgdG9wb2xvZ3ksIFN1Ym1pdE9wdGlvbnMgb3B0cywgUHJvZ3Jlc3NMaXN0ZW5lciBwcm9ncmVzc0xpc3RlbmVyLCBTdHJpbmcgYXNVc2VyKQotICAgICAgICAgICAgdGhyb3dzIEFscmVhZHlBbGl2ZUV4Y2VwdGlvbiwgSW52YWxpZFRvcG9sb2d5RXhjZXB0aW9uLCBBdXRob3JpemF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRocm93cyBBbHJlYWR5QWxpdmVFeGNlcHRpb24sIEludmFsaWRUb3BvbG9neUV4Y2VwdGlvbiwgQXV0aG9yaXphdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKICAgICAgICAgaWYoIVV0aWxzLmlzVmFsaWRDb25mKHN0b3JtQ29uZikpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN0b3JtIGNvbmYgaXMgbm90IHZhbGlkLiBNdXN0IGJlIGpzb24tc2VyaWFsaXphYmxlIik7CiAgICAgICAgIH0KQEAgLTE5Nyw3ICsxOTYsOSBAQAogICAgICAgICBjb25mLnB1dEFsbChzdG9ybUNvbmYpOwogICAgICAgICBzdG9ybUNvbmYucHV0QWxsKHByZXBhcmVab29rZWVwZXJBdXRoZW50aWNhdGlvbihjb25mKSk7CiAKLSAgICAgICAgTWFwPFN0cmluZyxTdHJpbmc+IHBhc3NlZENyZWRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisgICAgICAgIHZhbGlkYXRlQ29uZnMoY29uZiwgdG9wb2xvZ3kpOworCisgICAgICAgIE1hcDxTdHJpbmcsU3RyaW5nPiBwYXNzZWRDcmVkcyA9IG5ldyBIYXNoTWFwPD4oKTsKICAgICAgICAgaWYgKG9wdHMgIT0gbnVsbCkgewogICAgICAgICAgICAgQ3JlZGVudGlhbHMgdG1wQ3JlZHMgPSBvcHRzLmdldF9jcmVkcygpOwogICAgICAgICAgICAgaWYgKHRtcENyZWRzICE9IG51bGwpIHsKQEAgLTQ0Miw0ICs0NDMsMzggQEAKICAgICAgICAgICovCiAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ29tcGxldGVkKFN0cmluZyBzcmNGaWxlLCBTdHJpbmcgdGFyZ2V0RmlsZSwgbG9uZyB0b3RhbEJ5dGVzKTsKICAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHZhbGlkYXRlQ29uZnMoTWFwIHN0b3JtQ29uZiwgU3Rvcm1Ub3BvbG9neSB0b3BvbG9neSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgICAgIENvbmZpZ1ZhbGlkYXRpb24udmFsaWRhdGVGaWVsZHMoc3Rvcm1Db25mKTsKKyAgICAgICAgdmFsaWRhdGVUb3BvbG9neVdvcmtlck1heEhlYXBTaXplTUJDb25maWdzKHN0b3JtQ29uZiwgdG9wb2xvZ3kpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdmFsaWRhdGVUb3BvbG9neVdvcmtlck1heEhlYXBTaXplTUJDb25maWdzKE1hcCBzdG9ybUNvbmYsIFN0b3JtVG9wb2xvZ3kgdG9wb2xvZ3kpIHsKKyAgICAgICAgZG91YmxlIGxhcmdlc3RNZW1SZXEgPSBnZXRNYXhFeGVjdXRvck1lbW9yeVVzYWdlRm9yVG9wbyh0b3BvbG9neSwgc3Rvcm1Db25mKTsKKyAgICAgICAgRG91YmxlIHRvcG9sb2d5V29ya2VyTWF4SGVhcFNpemUgPSBVdGlscy5nZXREb3VibGUoc3Rvcm1Db25mLmdldChDb25maWcuVE9QT0xPR1lfV09SS0VSX01BWF9IRUFQX1NJWkVfTUIpKTsKKyAgICAgICAgaWYodG9wb2xvZ3lXb3JrZXJNYXhIZWFwU2l6ZSA8IGxhcmdlc3RNZW1SZXEpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRvcG9sb2d5IHdpbGwgbm90IGJlIGFibGUgdG8gYmUgc3VjY2Vzc2Z1bGx5IHNjaGVkdWxlZDogQ29uZmlnIFRPUE9MT0dZX1dPUktFUl9NQVhfSEVBUF9TSVpFX01CPSIKKyAgICAgICAgICAgICAgICAgICAgK1V0aWxzLmdldERvdWJsZShzdG9ybUNvbmYuZ2V0KENvbmZpZy5UT1BPTE9HWV9XT1JLRVJfTUFYX0hFQVBfU0laRV9NQikpICsgIiA8ICIKKyAgICAgICAgICAgICAgICAgICAgKyBsYXJnZXN0TWVtUmVxICsgIiAoTGFyZ2VzdCBtZW1vcnkgcmVxdWlyZW1lbnQgb2YgYSBjb21wb25lbnQgaW4gdGhlIHRvcG9sb2d5KS4gUGVyaGFwcyBzZXQgVE9QT0xPR1lfV09SS0VSX01BWF9IRUFQX1NJWkVfTUIgdG8gYSBsYXJnZXIgYW1vdW50Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBkb3VibGUgZ2V0TWF4RXhlY3V0b3JNZW1vcnlVc2FnZUZvclRvcG8oU3Rvcm1Ub3BvbG9neSB0b3BvbG9neSwgTWFwIHRvcG9sb2d5Q29uZikgeworICAgICAgICBkb3VibGUgbGFyZ2VzdE1lbW9yeU9wZXJhdG9yID0gMC4wOworICAgICAgICBmb3IoTWFwPFN0cmluZywgRG91YmxlPiBlbnRyeSA6IFJlc291cmNlVXRpbHMuZ2V0Qm9sdHNSZXNvdXJjZXModG9wb2xvZ3ksIHRvcG9sb2d5Q29uZikudmFsdWVzKCkpIHsKKyAgICAgICAgICAgIGRvdWJsZSBtZW1vcnlSZXF1aXJlbWVudCA9IGVudHJ5LmdldChDb25maWcuVE9QT0xPR1lfQ09NUE9ORU5UX1JFU09VUkNFU19PRkZIRUFQX01FTU9SWV9NQikKKyAgICAgICAgICAgICAgICAgICAgKyBlbnRyeS5nZXQoQ29uZmlnLlRPUE9MT0dZX0NPTVBPTkVOVF9SRVNPVVJDRVNfT05IRUFQX01FTU9SWV9NQik7CisgICAgICAgICAgICBpZihtZW1vcnlSZXF1aXJlbWVudCA+IGxhcmdlc3RNZW1vcnlPcGVyYXRvcikgeworICAgICAgICAgICAgICAgIGxhcmdlc3RNZW1vcnlPcGVyYXRvciA9IG1lbW9yeVJlcXVpcmVtZW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvcihNYXA8U3RyaW5nLCBEb3VibGU+IGVudHJ5IDogUmVzb3VyY2VVdGlscy5nZXRTcG91dHNSZXNvdXJjZXModG9wb2xvZ3ksIHRvcG9sb2d5Q29uZikudmFsdWVzKCkpIHsKKyAgICAgICAgICAgIGRvdWJsZSBtZW1vcnlSZXF1aXJlbWVudCA9IGVudHJ5LmdldChDb25maWcuVE9QT0xPR1lfQ09NUE9ORU5UX1JFU09VUkNFU19PRkZIRUFQX01FTU9SWV9NQikKKyAgICAgICAgICAgICAgICAgICAgKyBlbnRyeS5nZXQoQ29uZmlnLlRPUE9MT0dZX0NPTVBPTkVOVF9SRVNPVVJDRVNfT05IRUFQX01FTU9SWV9NQik7CisgICAgICAgICAgICBpZihtZW1vcnlSZXF1aXJlbWVudCA+IGxhcmdlc3RNZW1vcnlPcGVyYXRvcikgeworICAgICAgICAgICAgICAgIGxhcmdlc3RNZW1vcnlPcGVyYXRvciA9IG1lbW9yeVJlcXVpcmVtZW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBsYXJnZXN0TWVtb3J5T3BlcmF0b3I7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2NsdXN0ZXIvQ2x1c3RlclN0YXRlLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vY2x1c3Rlci9DbHVzdGVyU3RhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmNjNjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2NsdXN0ZXIvQ2x1c3RlclN0YXRlLmphdmEKQEAgLTAsMCArMSwyMDggQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGJhY2t0eXBlLnN0b3JtLmNsdXN0ZXI7CisKK2ltcG9ydCBjbG9qdXJlLmxhbmcuQVBlcnNpc3RlbnRNYXA7CitpbXBvcnQgY2xvanVyZS5sYW5nLklGbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnpvb2tlZXBlci5kYXRhLkFDTDsKKworLyoqCisgKiBDbHVzdGVyU3RhdGUgcHJvdmlkZXMgdGhlIEFQSSBmb3IgdGhlIHBsdWdnYWJsZSBzdGF0ZSBzdG9yZSB1c2VkIGJ5IHRoZQorICogU3Rvcm0gZGFlbW9ucy4gRGF0YSBpcyBzdG9yZWQgaW4gcGF0aC92YWx1ZSBmb3JtYXQsIGFuZCB0aGUgc3RvcmUgc3VwcG9ydHMKKyAqIGxpc3Rpbmcgc3ViLXBhdGhzIGF0IGEgZ2l2ZW4gcGF0aC4KKyAqIEFsbCBkYXRhIHNob3VsZCBiZSBhdmFpbGFibGUgYWNyb3NzIGFsbCBub2RlcyB3aXRoIGV2ZW50dWFsIGNvbnNpc3RlbmN5LgorICoKKyAqIElNUE9SVEFOVCBOT1RFOgorICogSGVhcnRiZWF0cyBoYXZlIGRpZmZlcmVudCBhcGkgY2FsbHMgdXNlZCB0byBpbnRlcmFjdCB3aXRoIHRoZW0uIFRoZSByb290CisgKiBwYXRoICgvKSBtYXkgb3IgbWF5IG5vdCBiZSB0aGUgc2FtZSBhcyB0aGUgcm9vdCBwYXRoIGZvciB0aGUgb3RoZXIgYXBpIGNhbGxzLgorICoKKyAqIEZvciBleGFtcGxlLCBwZXJmb3JtaW5nIHRoZXNlIHR3byBjYWxsczoKKyAqICAgICBzZXRfZGF0YSgiL3BhdGgiLCBkYXRhLCBhY2xzKTsKKyAqICAgICB2b2lkIHNldF93b3JrZXJfaGIoIi9wYXRoIiwgaGVhcnRiZWF0LCBhY2xzKTsKKyAqIG1heSBvciBtYXkgbm90IGNhdXNlIGEgY29sbGlzaW9uIGluICIvcGF0aCIuCisgKiBOZXZlciB1c2UgdGhlIHNhbWUgcGF0aHMgd2l0aCB0aGUgKl9oYiogbWV0aG9kcyBhcyB5b3UgZG8gd2l0aCB0aGUgb3RoZXJzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIENsdXN0ZXJTdGF0ZSB7CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlcnMgYSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGdldHMgY2FsbGVkIHdoZW4gQ3VyYXRvckV2ZW50cyBoYXBwZW4uCisgICAgICogQHBhcmFtIGNhbGxiYWNrIGlzIGEgY2xvanVyZSBJRm4gdGhhdCBhY2NlcHRzIHRoZSB0eXBlIC0gdHJhbnNsYXRlZCB0bworICAgICAqIGNsb2p1cmUga2V5d29yZCBhcyBpbiB6b29rZWVwZXIuY2xqIC0gYW5kIHRoZSBwYXRoOiAoY2FsbGJhY2sgdHlwZSBwYXRoKQorICAgICAqIEByZXR1cm4gaXMgYW4gaWQgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHVucmVnaXN0ZXIoLi4uKSB0byB1bnJlZ2lzdGVyIHRoZQorICAgICAqIGNhbGxiYWNrLgorICAgICAqLworICAgIFN0cmluZyByZWdpc3RlcihJRm4gY2FsbGJhY2spOworCisgICAgLyoqCisgICAgICogVW5yZWdpc3RlcnMgYSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IHdhcyByZWdpc3RlcmVkIHdpdGggcmVnaXN0ZXIoLi4uKS4KKyAgICAgKiBAcGFyYW0gaWQgaXMgdGhlIFN0cmluZyBpZCB0aGF0IHdhcyByZXR1cm5lZCBmcm9tIHJlZ2lzdGVyKC4uLikuCisgICAgICovCisgICAgdm9pZCB1bnJlZ2lzdGVyKFN0cmluZyBpZCk7CisKKyAgICAvKioKKyAgICAgKiBQYXRoIHdpbGwgYmUgYXBwZW5kZWQgd2l0aCBhIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZyBpbnRlZ2VyLCBhIG5ldyBub2RlCisgICAgICogd2lsbCBiZSBjcmVhdGVkIHRoZXJlLCBhbmQgZGF0YSB3aWxsIGJlIHB1dCBhdCB0aGF0IG5vZGUuCisgICAgICogQHBhcmFtIHBhdGggVGhlIHBhdGggdGhhdCB0aGUgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nIGludGVnZXIgc3VmZml4IHdpbGwKKyAgICAgKiBiZSBhZGRlZCB0by4KKyAgICAgKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSB0aGF0IHdpbGwgYmUgd3JpdHRlbiBhdCB0aGUgc3VmZml4ZWQgcGF0aCdzIG5vZGUuCisgICAgICogQHBhcmFtIGFjbHMgVGhlIGFjbHMgdG8gYXBwbHkgdG8gdGhlIHBhdGguIE1heSBiZSBudWxsLgorICAgICAqIEByZXR1cm4gVGhlIHBhdGggd2l0aCB0aGUgaW50ZWdlciBzdWZmaXggYXBwZW5kZWQuCisgICAgICovCisgICAgU3RyaW5nIGNyZWF0ZV9zZXF1ZW50aWFsKFN0cmluZyBwYXRoLCBieXRlW10gZGF0YSwgTGlzdDxBQ0w+IGFjbHMpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBub2RlcyBmb3IgcGF0aCBhbmQgYWxsIGl0cyBwYXJlbnRzLiBQYXRoIGVsZW1lbnRzIGFyZSBzZXBhcmF0ZWQgYnkKKyAgICAgKiBhICIvIiwgYXMgaW4gKm5peCBmaWxlc3lzdGVtIG5vdGF0aW9uLiBFcXVpdmFsZW50IHRvIG1rZGlyIC1wIGluICpuaXguCisgICAgICogQHBhcmFtIHBhdGggVGhlIHBhdGggdG8gY3JlYXRlLCBhbG9uZyB3aXRoIGFsbCBpdHMgcGFyZW50cy4KKyAgICAgKiBAcGFyYW0gYWNscyBUaGUgYWNscyB0byBhcHBseSB0byB0aGUgcGF0aC4gTWF5IGJlIG51bGwuCisgICAgICogQHJldHVybiBwYXRoCisgICAgICovCisgICAgU3RyaW5nIG1rZGlycyhTdHJpbmcgcGF0aCwgTGlzdDxBQ0w+IGFjbHMpOworCisgICAgLyoqCisgICAgICogRGVsZXRlcyB0aGUgbm9kZSBhdCBhIGdpdmVuIHBhdGgsIGFuZCBhbnkgY2hpbGQgbm9kZXMgdGhhdCBtYXkgZXhpc3QuCisgICAgICogQHBhcmFtIHBhdGggVGhlIHBhdGggdG8gZGVsZXRlCisgICAgICovCisgICAgdm9pZCBkZWxldGVfbm9kZShTdHJpbmcgcGF0aCk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIGVwaGVtZXJhbCBub2RlIGF0IHBhdGguIEVwaGVtZXJhbCBub2RlcyBhcmUgZGVzdHJveWVkCisgICAgICogYnkgdGhlIHN0b3JlIHdoZW4gdGhlIGNsaWVudCBkaXNjb25uZWN0cy4KKyAgICAgKiBAcGFyYW0gcGF0aCBUaGUgcGF0aCB3aGVyZSBhIG5vZGUgd2lsbCBiZSBjcmVhdGVkLgorICAgICAqIEBwYXJhbSBkYXRhIFRoZSBkYXRhIHRvIGJlIHdyaXR0ZW4gYXQgdGhlIG5vZGUuCisgICAgICogQHBhcmFtIGFjbHMgVGhlIGFjbHMgdG8gYXBwbHkgdG8gdGhlIHBhdGguIE1heSBiZSBudWxsLgorICAgICAqLworICAgIHZvaWQgc2V0X2VwaGVtZXJhbF9ub2RlKFN0cmluZyBwYXRoLCBieXRlW10gZGF0YSwgTGlzdDxBQ0w+IGFjbHMpOworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgJ3ZlcnNpb24nIG9mIHRoZSBub2RlIGF0IGEgcGF0aC4gT3B0aW9uYWxseSBzZXRzIGEgd2F0Y2gKKyAgICAgKiBvbiB0aGF0IG5vZGUuIFRoZSB2ZXJzaW9uIHNob3VsZCBpbmNyZWFzZSB3aGVuZXZlciBhIHdyaXRlIGhhcHBlbnMuCisgICAgICogQHBhcmFtIHBhdGggVGhlIHBhdGggdG8gZ2V0IHRoZSB2ZXJzaW9uIG9mLgorICAgICAqIEBwYXJhbSB3YXRjaCBXaGV0aGVyIG9yIG5vdCB0byBzZXQgYSB3YXRjaCBvbiB0aGUgcGF0aC4gV2F0Y2hlZCBwYXRocworICAgICAqIGVtaXQgZXZlbnRzIHdoaWNoIGFyZSBjb25zdW1lZCBieSBmdW5jdGlvbnMgcmVnaXN0ZXJlZCB3aXRoIHRoZQorICAgICAqIHJlZ2lzdGVyIG1ldGhvZC4gVmVyeSB1c2VmdWwgZm9yIGNhdGNoaW5nIHVwZGF0ZXMgdG8gbm9kZXMuCisgICAgICogQHJldHVybiBUaGUgaW50ZWdlciB2ZXJzaW9uIG9mIHRoaXMgbm9kZS4KKyAgICAgKi8KKyAgICBJbnRlZ2VyIGdldF92ZXJzaW9uKFN0cmluZyBwYXRoLCBib29sZWFuIHdhdGNoKTsKKworICAgIC8qKgorICAgICAqIENoZWNrIGlmIGEgbm9kZSBleGlzdHMgYW5kIG9wdGlvbmFsbHkgc2V0IGEgd2F0Y2ggb24gdGhlIHBhdGguCisgICAgICogQHBhcmFtIHBhdGggVGhlIHBhdGggdG8gY2hlY2sgZm9yIHRoZSBleGlzdGVuY2Ugb2YgYSBub2RlLgorICAgICAqIEBwYXJhbSB3YXRjaCBXaGV0aGVyIG9yIG5vdCB0byBzZXQgYSB3YXRjaCBvbiB0aGUgcGF0aC4gV2F0Y2hlZCBwYXRocworICAgICAqIGVtaXQgZXZlbnRzIHdoaWNoIGFyZSBjb25zdW1lZCBieSBmdW5jdGlvbnMgcmVnaXN0ZXJlZCB3aXRoIHRoZQorICAgICAqIHJlZ2lzdGVyIG1ldGhvZC4gVmVyeSB1c2VmdWwgZm9yIGNhdGNoaW5nIHVwZGF0ZXMgdG8gbm9kZXMuCisgICAgICogQHJldHVybiBXaGV0aGVyIG9yIG5vdCBhIG5vZGUgZXhpc3RzIGF0IHBhdGguCisgICAgICovCisgICAgYm9vbGVhbiBub2RlX2V4aXN0cyhTdHJpbmcgcGF0aCwgYm9vbGVhbiB3YXRjaCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBsaXN0IG9mIHBhdGhzIG9mIGFsbCB0aGUgY2hpbGQgbm9kZXMgd2hpY2ggZXhpc3QgaW1tZWRpYXRlbHkKKyAgICAgKiB1bmRlciBwYXRoLgorICAgICAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIHRvIGxvb2sgdW5kZXIKKyAgICAgKiBAcGFyYW0gd2F0Y2ggV2hldGhlciBvciBub3QgdG8gc2V0IGEgd2F0Y2ggb24gdGhlIHBhdGguIFdhdGNoZWQgcGF0aHMKKyAgICAgKiBlbWl0IGV2ZW50cyB3aGljaCBhcmUgY29uc3VtZWQgYnkgZnVuY3Rpb25zIHJlZ2lzdGVyZWQgd2l0aCB0aGUKKyAgICAgKiByZWdpc3RlciBtZXRob2QuIFZlcnkgdXNlZnVsIGZvciBjYXRjaGluZyB1cGRhdGVzIHRvIG5vZGVzLgorICAgICAqIEByZXR1cm4gbGlzdCBvZiBzdHJpbmcgcGF0aHMgdW5kZXIgcGF0aC4KKyAgICAgKi8KKyAgICBMaXN0PFN0cmluZz4gZ2V0X2NoaWxkcmVuKFN0cmluZyBwYXRoLCBib29sZWFuIHdhdGNoKTsKKworICAgIC8qKgorICAgICAqIENsb3NlIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBkYXRhIHN0b3JlLgorICAgICAqLworICAgIHZvaWQgY2xvc2UoKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdmFsdWUgb2YgdGhlIG5vZGUgYXQgcGF0aCB0byBkYXRhLgorICAgICAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIHdob3NlIG5vZGUgd2Ugd2FudCB0byBzZXQuCisgICAgICogQHBhcmFtIGRhdGEgVGhlIGRhdGEgdG8gcHV0IGluIHRoZSBub2RlLgorICAgICAqIEBwYXJhbSBhY2xzIFRoZSBhY2xzIHRvIGFwcGx5IHRvIHRoZSBwYXRoLiBNYXkgYmUgbnVsbC4KKyAgICAgKi8KKyAgICB2b2lkIHNldF9kYXRhKFN0cmluZyBwYXRoLCBieXRlW10gZGF0YSwgTGlzdDxBQ0w+IGFjbHMpOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBkYXRhIGZyb20gdGhlIG5vZGUgYXQgcGF0aAorICAgICAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIHRvIGxvb2sgdW5kZXIKKyAgICAgKiBAcGFyYW0gd2F0Y2ggV2hldGhlciBvciBub3QgdG8gc2V0IGEgd2F0Y2ggb24gdGhlIHBhdGguIFdhdGNoZWQgcGF0aHMKKyAgICAgKiBlbWl0IGV2ZW50cyB3aGljaCBhcmUgY29uc3VtZWQgYnkgZnVuY3Rpb25zIHJlZ2lzdGVyZWQgd2l0aCB0aGUKKyAgICAgKiByZWdpc3RlciBtZXRob2QuIFZlcnkgdXNlZnVsIGZvciBjYXRjaGluZyB1cGRhdGVzIHRvIG5vZGVzLgorICAgICAqIEByZXR1cm4gVGhlIGRhdGEgYXQgdGhlIG5vZGUuCisgICAgICovCisgICAgYnl0ZVtdIGdldF9kYXRhKFN0cmluZyBwYXRoLCBib29sZWFuIHdhdGNoKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZGF0YSBhdCB0aGUgbm9kZSBhbG9uZyB3aXRoIGl0cyB2ZXJzaW9uLiBEYXRhIGlzIHJldHVybmVkCisgICAgICogaW4gYW4gQVBlcnNpc3RlbnRNYXAgd2l0aCBjbG9qdXJlIGtleXdvcmQga2V5cyA6ZGF0YSBhbmQgOnZlcnNpb24uCisgICAgICogQHBhcmFtIHBhdGggVGhlIHBhdGggdG8gbG9vayB1bmRlcgorICAgICAqIEBwYXJhbSB3YXRjaCBXaGV0aGVyIG9yIG5vdCB0byBzZXQgYSB3YXRjaCBvbiB0aGUgcGF0aC4gV2F0Y2hlZCBwYXRocworICAgICAqIGVtaXQgZXZlbnRzIHdoaWNoIGFyZSBjb25zdW1lZCBieSBmdW5jdGlvbnMgcmVnaXN0ZXJlZCB3aXRoIHRoZQorICAgICAqIHJlZ2lzdGVyIG1ldGhvZC4gVmVyeSB1c2VmdWwgZm9yIGNhdGNoaW5nIHVwZGF0ZXMgdG8gbm9kZXMuCisgICAgICogQHJldHVybiBBbiBBUGVyc2lzdGVudE1hcCBpbiB0aGUgZm9ybSB7OmRhdGEgZGF0YSA6dmVyc2lvbiB2ZXJzaW9ufQorICAgICAqLworICAgIEFQZXJzaXN0ZW50TWFwIGdldF9kYXRhX3dpdGhfdmVyc2lvbihTdHJpbmcgcGF0aCwgYm9vbGVhbiB3YXRjaCk7CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBhIHdvcmtlciBoZWFydGJlYXQgYXQgdGhlIHBhdGguCisgICAgICogQHBhcmFtIHBhdGggVGhlIHBhdGggd2hvc2Ugbm9kZSB3ZSB3YW50IHRvIHNldC4KKyAgICAgKiBAcGFyYW0gZGF0YSBUaGUgZGF0YSB0byBwdXQgaW4gdGhlIG5vZGUuCisgICAgICogQHBhcmFtIGFjbHMgVGhlIGFjbHMgdG8gYXBwbHkgdG8gdGhlIHBhdGguIE1heSBiZSBudWxsLgorICAgICAqLworICAgIHZvaWQgc2V0X3dvcmtlcl9oYihTdHJpbmcgcGF0aCwgYnl0ZVtdIGRhdGEsIExpc3Q8QUNMPiBhY2xzKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgaGVhcnRiZWF0IGZyb20gdGhlIG5vZGUgYXQgcGF0aAorICAgICAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIHRvIGxvb2sgdW5kZXIKKyAgICAgKiBAcGFyYW0gd2F0Y2ggV2hldGhlciBvciBub3QgdG8gc2V0IGEgd2F0Y2ggb24gdGhlIHBhdGguIFdhdGNoZWQgcGF0aHMKKyAgICAgKiBlbWl0IGV2ZW50cyB3aGljaCBhcmUgY29uc3VtZWQgYnkgZnVuY3Rpb25zIHJlZ2lzdGVyZWQgd2l0aCB0aGUKKyAgICAgKiByZWdpc3RlciBtZXRob2QuIFZlcnkgdXNlZnVsIGZvciBjYXRjaGluZyB1cGRhdGVzIHRvIG5vZGVzLgorICAgICAqIEByZXR1cm4gVGhlIGhlYXJ0YmVhdCBhdCB0aGUgbm9kZS4KKyAgICAgKi8KKyAgICBieXRlW10gZ2V0X3dvcmtlcl9oYihTdHJpbmcgcGF0aCwgYm9vbGVhbiB3YXRjaCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBsaXN0IG9mIHBhdGhzIG9mIGFsbCB0aGUgY2hpbGQgbm9kZXMgd2hpY2ggZXhpc3QgaW1tZWRpYXRlbHkKKyAgICAgKiB1bmRlciBwYXRoLiBUaGlzIGlzIHNpbWlsYXIgdG8gZ2V0X2NoaWxkcmVuLCBidXQgbXVzdCBiZSB1c2VkIGZvcgorICAgICAqIGFueSBub2RlcworICAgICAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIHRvIGxvb2sgdW5kZXIKKyAgICAgKiBAcGFyYW0gd2F0Y2ggV2hldGhlciBvciBub3QgdG8gc2V0IGEgd2F0Y2ggb24gdGhlIHBhdGguIFdhdGNoZWQgcGF0aHMKKyAgICAgKiBlbWl0IGV2ZW50cyB3aGljaCBhcmUgY29uc3VtZWQgYnkgZnVuY3Rpb25zIHJlZ2lzdGVyZWQgd2l0aCB0aGUKKyAgICAgKiByZWdpc3RlciBtZXRob2QuIFZlcnkgdXNlZnVsIGZvciBjYXRjaGluZyB1cGRhdGVzIHRvIG5vZGVzLgorICAgICAqIEByZXR1cm4gbGlzdCBvZiBzdHJpbmcgcGF0aHMgdW5kZXIgcGF0aC4KKyAgICAgKi8KKyAgICBMaXN0PFN0cmluZz4gZ2V0X3dvcmtlcl9oYl9jaGlsZHJlbihTdHJpbmcgcGF0aCwgYm9vbGVhbiB3YXRjaCk7CisKKyAgICAvKioKKyAgICAgKiBEZWxldGVzIHRoZSBoZWFydGJlYXQgYXQgYSBnaXZlbiBwYXRoLCBhbmQgYW55IGNoaWxkIG5vZGVzIHRoYXQgbWF5IGV4aXN0LgorICAgICAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIHRvIGRlbGV0ZS4KKyAgICAgKi8KKyAgICB2b2lkIGRlbGV0ZV93b3JrZXJfaGIoU3RyaW5nIHBhdGgpOworCisgICAgLyoqCisgICAgICogQWRkIGEgQ2x1c3RlclN0YXRlTGlzdGVuZXIgdG8gdGhlIGNvbm5lY3Rpb24uCisgICAgICogQHBhcmFtIGxpc3RlbmVyIEEgQ2x1c3RlclN0YXRlTGlzdGVuZXIgdG8gaGFuZGxlIGNoYW5naW5nIGNsdXN0ZXIgc3RhdGUKKyAgICAgKiBldmVudHMuCisgICAgICovCisgICAgdm9pZCBhZGRfbGlzdGVuZXIoQ2x1c3RlclN0YXRlTGlzdGVuZXIgbGlzdGVuZXIpOworCisgICAgLyoqCisgICAgICogRm9yY2UgY29uc2lzdGVuY3kgb24gYSBwYXRoLiBBbnkgd3JpdGVzIGNvbW1pdHRlZCBvbiB0aGUgcGF0aCBiZWZvcmUKKyAgICAgKiB0aGlzIGNhbGwgd2lsbCBiZSBjb21wbGV0ZWx5IHByb3BhZ2F0ZWQgd2hlbiBpdCByZXR1cm5zLgorICAgICAqIEBwYXJhbSBwYXRoIFRoZSBwYXRoIHRvIHN5bmNocm9uaXplLgorICAgICAqLworICAgIHZvaWQgc3luY19wYXRoKFN0cmluZyBwYXRoKTsKK30KZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9jbHVzdGVyL0NsdXN0ZXJTdGF0ZUNvbnRleHQuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9jbHVzdGVyL0NsdXN0ZXJTdGF0ZUNvbnRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2NkZTIzCi0tLSAvZGV2L251bGwKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2NsdXN0ZXIvQ2x1c3RlclN0YXRlQ29udGV4dC5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYmFja3R5cGUuc3Rvcm0uY2x1c3RlcjsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGludGVuZGVkIHRvIHByb3ZpZGUgcnVudGltZS1jb250ZXh0IHRvIENsdXN0ZXJTdGF0ZUZhY3RvcnkKKyAqIGltcGxlbWVudG9ycywgZ2l2aW5nIGluZm9ybWF0aW9uIHN1Y2ggYXMgd2hhdCBkYWVtb24gaXMgY3JlYXRpbmcgaXQuCisgKi8KK3B1YmxpYyBjbGFzcyBDbHVzdGVyU3RhdGVDb250ZXh0IHsKKyAgICAKKyAgICBwcml2YXRlIERhZW1vblR5cGUgZGFlbW9uVHlwZTsKKworICAgIHB1YmxpYyBDbHVzdGVyU3RhdGVDb250ZXh0KCkgeworICAgICAgICBkYWVtb25UeXBlID0gRGFlbW9uVHlwZS5VTktOT1dOOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgQ2x1c3RlclN0YXRlQ29udGV4dChEYWVtb25UeXBlIGRhZW1vblR5cGUpIHsKKyAgICAgICAgdGhpcy5kYWVtb25UeXBlID0gZGFlbW9uVHlwZTsKKyAgICB9CisgICAgCisgICAgcHVibGljIERhZW1vblR5cGUgZ2V0RGFlbW9uVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIGRhZW1vblR5cGU7CisgICAgfQorICAgIAorfQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2NsdXN0ZXIvQ2x1c3RlclN0YXRlRmFjdG9yeS5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2NsdXN0ZXIvQ2x1c3RlclN0YXRlRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmOTQ2ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vY2x1c3Rlci9DbHVzdGVyU3RhdGVGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYmFja3R5cGUuc3Rvcm0uY2x1c3RlcjsKKworaW1wb3J0IGNsb2p1cmUubGFuZy5BUGVyc2lzdGVudE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnpvb2tlZXBlci5kYXRhLkFDTDsKKworcHVibGljIGludGVyZmFjZSBDbHVzdGVyU3RhdGVGYWN0b3J5IHsKKyAgICAKKyAgICBDbHVzdGVyU3RhdGUgbWtTdGF0ZShBUGVyc2lzdGVudE1hcCBjb25maWcsIEFQZXJzaXN0ZW50TWFwIGF1dGhfY29uZiwgTGlzdDxBQ0w+IGFjbHMsIENsdXN0ZXJTdGF0ZUNvbnRleHQgY29udGV4dCk7CisKK30KZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9jbHVzdGVyL0NsdXN0ZXJTdGF0ZUxpc3RlbmVyLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vY2x1c3Rlci9DbHVzdGVyU3RhdGVMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNjkzZjgKLS0tIC9kZXYvbnVsbAorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vY2x1c3Rlci9DbHVzdGVyU3RhdGVMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsMjIgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGJhY2t0eXBlLnN0b3JtLmNsdXN0ZXI7CisKK3B1YmxpYyBpbnRlcmZhY2UgQ2x1c3RlclN0YXRlTGlzdGVuZXIgeworICAgIHZvaWQgc3RhdGVDaGFuZ2VkKENvbm5lY3Rpb25TdGF0ZSBuZXdTdGF0ZSk7Cit9CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vY2x1c3Rlci9Db25uZWN0aW9uU3RhdGUuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9jbHVzdGVyL0Nvbm5lY3Rpb25TdGF0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2ODg3ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vY2x1c3Rlci9Db25uZWN0aW9uU3RhdGUuamF2YQpAQCAtMCwwICsxLDI0IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBiYWNrdHlwZS5zdG9ybS5jbHVzdGVyOworCitwdWJsaWMgZW51bSBDb25uZWN0aW9uU3RhdGUgeworICAgIENPTk5FQ1RFRCwKKyAgICBSRUNPTk5FQ1RFRCwKKyAgICBMT1NUCit9CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vY2x1c3Rlci9EYWVtb25UeXBlLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vY2x1c3Rlci9EYWVtb25UeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg0ZDBlZgotLS0gL2Rldi9udWxsCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9jbHVzdGVyL0RhZW1vblR5cGUuamF2YQpAQCAtMCwwICsxLDI3IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGJhY2t0eXBlLnN0b3JtLmNsdXN0ZXI7CisKK3B1YmxpYyBlbnVtIERhZW1vblR5cGUgeworICAgIFNVUEVSVklTT1IsCisgICAgTklNQlVTLAorICAgIFdPUktFUiwKKyAgICBQQUNFTUFLRVIsCisgICAgVU5LTk9XTgorfQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2NvZGVkaXN0cmlidXRvci9JQ29kZURpc3RyaWJ1dG9yLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vY29kZWRpc3RyaWJ1dG9yL0lDb2RlRGlzdHJpYnV0b3IuamF2YQppbmRleCAyNWU1NzhiLi5jNDY2ODhmIDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vY29kZWRpc3RyaWJ1dG9yL0lDb2RlRGlzdHJpYnV0b3IuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vY29kZWRpc3RyaWJ1dG9yL0lDb2RlRGlzdHJpYnV0b3IuamF2YQpAQCAtMSwzICsxLDIwIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLwogcGFja2FnZSBiYWNrdHlwZS5zdG9ybS5jb2RlZGlzdHJpYnV0b3I7CiAKIApkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2NvZGVkaXN0cmlidXRvci9Mb2NhbEZpbGVTeXN0ZW1Db2RlRGlzdHJpYnV0b3IuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9jb2RlZGlzdHJpYnV0b3IvTG9jYWxGaWxlU3lzdGVtQ29kZURpc3RyaWJ1dG9yLmphdmEKaW5kZXggMDJkNWUyZC4uNzY5OTNlMiAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2NvZGVkaXN0cmlidXRvci9Mb2NhbEZpbGVTeXN0ZW1Db2RlRGlzdHJpYnV0b3IuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vY29kZWRpc3RyaWJ1dG9yL0xvY2FsRmlsZVN5c3RlbUNvZGVEaXN0cmlidXRvci5qYXZhCkBAIC0xLDMgKzEsMjAgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCiBwYWNrYWdlIGJhY2t0eXBlLnN0b3JtLmNvZGVkaXN0cmlidXRvcjsKIAogaW1wb3J0IGJhY2t0eXBlLnN0b3JtLm5pbWJ1cy5OaW1idXNJbmZvOwpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2Nvb3JkaW5hdGlvbi9CYXRjaEJvbHRFeGVjdXRvci5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2Nvb3JkaW5hdGlvbi9CYXRjaEJvbHRFeGVjdXRvci5qYXZhCmluZGV4IDg2NTMwMTAuLjU1NTkwZDAgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9jb29yZGluYXRpb24vQmF0Y2hCb2x0RXhlY3V0b3IuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vY29vcmRpbmF0aW9uL0JhdGNoQm9sdEV4ZWN1dG9yLmphdmEKQEAgLTMyLDcgKzMyLDcgQEAKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAogcHVibGljIGNsYXNzIEJhdGNoQm9sdEV4ZWN1dG9yIGltcGxlbWVudHMgSVJpY2hCb2x0LCBGaW5pc2hlZENhbGxiYWNrLCBUaW1lb3V0Q2FsbGJhY2sgewotICAgIHB1YmxpYyBzdGF0aWMgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEJhdGNoQm9sdEV4ZWN1dG9yLmNsYXNzKTsgICAgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQmF0Y2hCb2x0RXhlY3V0b3IuY2xhc3MpOwogCiAgICAgYnl0ZVtdIF9ib2x0U2VyOwogICAgIE1hcDxPYmplY3QsIElCYXRjaEJvbHQ+IF9vcGVuVHJhbnNhY3Rpb25zOwpAQCAtNDksNyArNDksNyBAQAogICAgICAgICBfY29uZiA9IGNvbmY7CiAgICAgICAgIF9jb250ZXh0ID0gY29udGV4dDsKICAgICAgICAgX2NvbGxlY3RvciA9IG5ldyBCYXRjaE91dHB1dENvbGxlY3RvckltcGwoY29sbGVjdG9yKTsKLSAgICAgICAgX29wZW5UcmFuc2FjdGlvbnMgPSBuZXcgSGFzaE1hcDxPYmplY3QsIElCYXRjaEJvbHQ+KCk7CisgICAgICAgIF9vcGVuVHJhbnNhY3Rpb25zID0gbmV3IEhhc2hNYXA8PigpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2Nvb3JkaW5hdGlvbi9Db29yZGluYXRlZEJvbHQuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9jb29yZGluYXRpb24vQ29vcmRpbmF0ZWRCb2x0LmphdmEKaW5kZXggNmYzMzdhNi4uYzNhNDI4YyAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2Nvb3JkaW5hdGlvbi9Db29yZGluYXRlZEJvbHQuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vY29vcmRpbmF0aW9uL0Nvb3JkaW5hdGVkQm9sdC5qYXZhCkBAIC00OSw3ICs0OSw3IEBACiAgKiBpbiB0aGUgY2FzZSBvZiByZXRyaWVzLgogICovCiBwdWJsaWMgY2xhc3MgQ29vcmRpbmF0ZWRCb2x0IGltcGxlbWVudHMgSVJpY2hCb2x0IHsKLSAgICBwdWJsaWMgc3RhdGljIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihDb29yZGluYXRlZEJvbHQuY2xhc3MpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKENvb3JkaW5hdGVkQm9sdC5jbGFzcyk7CiAKICAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBGaW5pc2hlZENhbGxiYWNrIHsKICAgICAgICAgdm9pZCBmaW5pc2hlZElkKE9iamVjdCBpZCk7CkBAIC0xNDgsNyArMTQ4LDcgQEAKICAgICBwcml2YXRlIElkU3RyZWFtU3BlYyBfaWRTdHJlYW1TcGVjOwogICAgIHByaXZhdGUgSVJpY2hCb2x0IF9kZWxlZ2F0ZTsKICAgICBwcml2YXRlIEludGVnZXIgX251bVNvdXJjZVJlcG9ydHM7Ci0gICAgcHJpdmF0ZSBMaXN0PEludGVnZXI+IF9jb3VudE91dFRhc2tzID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOzsKKyAgICBwcml2YXRlIExpc3Q8SW50ZWdlcj4gX2NvdW50T3V0VGFza3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICBwcml2YXRlIE91dHB1dENvbGxlY3RvciBfY29sbGVjdG9yOwogICAgIHByaXZhdGUgVGltZUNhY2hlTWFwPE9iamVjdCwgVHJhY2tpbmdJbmZvPiBfdHJhY2tlZDsKIApAQCAtMTU3LDEwICsxNTcsMTAgQEAKICAgICAgICAgaW50IGV4cGVjdGVkVHVwbGVDb3VudCA9IDA7CiAgICAgICAgIGludCByZWNlaXZlZFR1cGxlcyA9IDA7CiAgICAgICAgIGJvb2xlYW4gZmFpbGVkID0gZmFsc2U7Ci0gICAgICAgIE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiB0YXNrRW1pdHRlZFR1cGxlcyA9IG5ldyBIYXNoTWFwPEludGVnZXIsIEludGVnZXI+KCk7CisgICAgICAgIE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiB0YXNrRW1pdHRlZFR1cGxlcyA9IG5ldyBIYXNoTWFwPD4oKTsKICAgICAgICAgYm9vbGVhbiByZWNlaXZlZElkID0gZmFsc2U7CiAgICAgICAgIGJvb2xlYW4gZmluaXNoZWQgPSBmYWxzZTsKLSAgICAgICAgTGlzdDxUdXBsZT4gYWNrVHVwbGVzID0gbmV3IEFycmF5TGlzdDxUdXBsZT4oKTsKKyAgICAgICAgTGlzdDxUdXBsZT4gYWNrVHVwbGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgICAgIAogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKQEAgLTE5OSw3ICsxOTksNyBAQAogICAgIAogICAgIHB1YmxpYyBDb29yZGluYXRlZEJvbHQoSVJpY2hCb2x0IGRlbGVnYXRlLCBNYXA8U3RyaW5nLCBTb3VyY2VBcmdzPiBzb3VyY2VBcmdzLCBJZFN0cmVhbVNwZWMgaWRTdHJlYW1TcGVjKSB7CiAgICAgICAgIF9zb3VyY2VBcmdzID0gc291cmNlQXJnczsKLSAgICAgICAgaWYoX3NvdXJjZUFyZ3M9PW51bGwpIF9zb3VyY2VBcmdzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTb3VyY2VBcmdzPigpOworICAgICAgICBpZihfc291cmNlQXJncz09bnVsbCkgX3NvdXJjZUFyZ3MgPSBuZXcgSGFzaE1hcDw+KCk7CiAgICAgICAgIF9kZWxlZ2F0ZSA9IGRlbGVnYXRlOwogICAgICAgICBfaWRTdHJlYW1TcGVjID0gaWRTdHJlYW1TcGVjOwogICAgIH0KQEAgLTIwOSw3ICsyMDksNyBAQAogICAgICAgICBpZihfZGVsZWdhdGUgaW5zdGFuY2VvZiBUaW1lb3V0Q2FsbGJhY2spIHsKICAgICAgICAgICAgIGNhbGxiYWNrID0gbmV3IFRpbWVvdXRJdGVtcygpOwogICAgICAgICB9Ci0gICAgICAgIF90cmFja2VkID0gbmV3IFRpbWVDYWNoZU1hcDxPYmplY3QsIFRyYWNraW5nSW5mbz4oY29udGV4dC5tYXhUb3BvbG9neU1lc3NhZ2VUaW1lb3V0KCksIGNhbGxiYWNrKTsKKyAgICAgICAgX3RyYWNrZWQgPSBuZXcgVGltZUNhY2hlTWFwPD4oY29udGV4dC5tYXhUb3BvbG9neU1lc3NhZ2VUaW1lb3V0KCksIGNhbGxiYWNrKTsKICAgICAgICAgX2NvbGxlY3RvciA9IGNvbGxlY3RvcjsKICAgICAgICAgX2RlbGVnYXRlLnByZXBhcmUoY29uZmlnLCBjb250ZXh0LCBuZXcgT3V0cHV0Q29sbGVjdG9yKG5ldyBDb29yZGluYXRlZE91dHB1dENvbGxlY3Rvcihjb2xsZWN0b3IpKSk7CiAgICAgICAgIGZvcihTdHJpbmcgY29tcG9uZW50OiBVdGlscy5nZXQoY29udGV4dC5nZXRUaGlzVGFyZ2V0cygpLApAQCAtMzQzLDcgKzM0Myw3IEBACiAgICAgfQogICAgIAogICAgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIFNvdXJjZUFyZ3M+IHNpbmdsZVNvdXJjZUFyZ3MoU3RyaW5nIHNvdXJjZUNvbXBvbmVudCwgU291cmNlQXJncyBzb3VyY2VBcmdzKSB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIFNvdXJjZUFyZ3M+IHJldCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU291cmNlQXJncz4oKTsKKyAgICAgICAgTWFwPFN0cmluZywgU291cmNlQXJncz4gcmV0ID0gbmV3IEhhc2hNYXA8PigpOwogICAgICAgICByZXQucHV0KHNvdXJjZUNvbXBvbmVudCwgc291cmNlQXJncyk7CiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQpAQCAtMzY0LDcgKzM2NCw3IEBACiAgICAgCiAgICAgcHJpdmF0ZSBUdXBsZVR5cGUgZ2V0VHVwbGVUeXBlKFR1cGxlIHR1cGxlKSB7CiAgICAgICAgIGlmKF9pZFN0cmVhbVNwZWMhPW51bGwKLSAgICAgICAgICAgICAgICAmJiB0dXBsZS5nZXRTb3VyY2VHbG9iYWxTdHJlYW1pZCgpLmVxdWFscyhfaWRTdHJlYW1TcGVjLl9pZCkpIHsKKyAgICAgICAgICAgICAgICAmJiB0dXBsZS5nZXRTb3VyY2VHbG9iYWxTdHJlYW1JZCgpLmVxdWFscyhfaWRTdHJlYW1TcGVjLl9pZCkpIHsKICAgICAgICAgICAgIHJldHVybiBUdXBsZVR5cGUuSUQ7CiAgICAgICAgIH0gZWxzZSBpZighX3NvdXJjZUFyZ3MuaXNFbXB0eSgpCiAgICAgICAgICAgICAgICAgJiYgdHVwbGUuZ2V0U291cmNlU3RyZWFtSWQoKS5lcXVhbHMoQ29uc3RhbnRzLkNPT1JESU5BVEVEX1NUUkVBTV9JRCkpIHsKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9kcnBjL0RSUENJbnZvY2F0aW9uc0NsaWVudC5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2RycGMvRFJQQ0ludm9jYXRpb25zQ2xpZW50LmphdmEKaW5kZXggNjI0ZGIzZS4uNzhlOGQ5YiAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2RycGMvRFJQQ0ludm9jYXRpb25zQ2xpZW50LmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2RycGMvRFJQQ0ludm9jYXRpb25zQ2xpZW50LmphdmEKQEAgLTMxLDkgKzMxLDggQEAKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAogcHVibGljIGNsYXNzIERSUENJbnZvY2F0aW9uc0NsaWVudCBleHRlbmRzIFRocmlmdENsaWVudCBpbXBsZW1lbnRzIERpc3RyaWJ1dGVkUlBDSW52b2NhdGlvbnMuSWZhY2UgewotICAgIHB1YmxpYyBzdGF0aWMgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKERSUENJbnZvY2F0aW9uc0NsaWVudC5jbGFzcyk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBBdG9taWNSZWZlcmVuY2U8RGlzdHJpYnV0ZWRSUENJbnZvY2F0aW9ucy5DbGllbnQ+IGNsaWVudCA9Ci0gICAgICAgbmV3IEF0b21pY1JlZmVyZW5jZTxEaXN0cmlidXRlZFJQQ0ludm9jYXRpb25zLkNsaWVudD4oKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihEUlBDSW52b2NhdGlvbnNDbGllbnQuY2xhc3MpOworICAgIHByaXZhdGUgZmluYWwgQXRvbWljUmVmZXJlbmNlPERpc3RyaWJ1dGVkUlBDSW52b2NhdGlvbnMuQ2xpZW50PiBjbGllbnQgPSBuZXcgQXRvbWljUmVmZXJlbmNlPD4oKTsKICAgICBwcml2YXRlIFN0cmluZyBob3N0OwogICAgIHByaXZhdGUgaW50IHBvcnQ7CiAKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9kcnBjL0RSUENTcG91dC5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2RycGMvRFJQQ1Nwb3V0LmphdmEKaW5kZXggY2UyMzNlZC4uNGVkMTVjMCAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2RycGMvRFJQQ1Nwb3V0LmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2RycGMvRFJQQ1Nwb3V0LmphdmEKQEAgLTM3LDcgKzM3LDYgQEAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOwpAQCAtNDcsMTcgKzQ2LDE2IEBACiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uOwogaW1wb3J0IG9yZy5qc29uLnNpbXBsZS5KU09OVmFsdWU7CiAKIHB1YmxpYyBjbGFzcyBEUlBDU3BvdXQgZXh0ZW5kcyBCYXNlUmljaFNwb3V0IHsKICAgICAvL0FOWSBDSEFOR0UgVE8gVEhJUyBDT0RFIE1VU1QgQkUgU0VSSUFMSVpBQkxFIENPTVBBVElCTEUgT1IgVEhFUkUgV0lMTCBCRSBQUk9CTEVNUwogICAgIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyMzg3ODQ4MzEwOTY5MjM3ODc3TDsKIAotICAgIHB1YmxpYyBzdGF0aWMgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKERSUENTcG91dC5jbGFzcyk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoRFJQQ1Nwb3V0LmNsYXNzKTsKICAgICAKICAgICBTcG91dE91dHB1dENvbGxlY3RvciBfY29sbGVjdG9yOwotICAgIExpc3Q8RFJQQ0ludm9jYXRpb25zQ2xpZW50PiBfY2xpZW50cyA9IG5ldyBBcnJheUxpc3Q8RFJQQ0ludm9jYXRpb25zQ2xpZW50PigpOworICAgIExpc3Q8RFJQQ0ludm9jYXRpb25zQ2xpZW50PiBfY2xpZW50cyA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgIHRyYW5zaWVudCBMaW5rZWRMaXN0PEZ1dHVyZTxWb2lkPj4gX2Z1dHVyZXMgPSBudWxsOwogICAgIHRyYW5zaWVudCBFeGVjdXRvclNlcnZpY2UgX2JhY2tyb3VuZCA9IG51bGw7CiAgICAgU3RyaW5nIF9mdW5jdGlvbjsKQEAgLTE0MCw3ICsxMzgsNyBAQAogICAgICAgICAgICAgX2JhY2tyb3VuZCA9IG5ldyBFeHRlbmRlZFRocmVhZFBvb2xFeGVjdXRvcigwLCBJbnRlZ2VyLk1BWF9WQUxVRSwKICAgICAgICAgICAgICAgICA2MEwsIFRpbWVVbml0LlNFQ09ORFMsCiAgICAgICAgICAgICAgICAgbmV3IFN5bmNocm9ub3VzUXVldWU8UnVubmFibGU+KCkpOwotICAgICAgICAgICAgX2Z1dHVyZXMgPSBuZXcgTGlua2VkTGlzdDxGdXR1cmU8Vm9pZD4+KCk7CisgICAgICAgICAgICBfZnV0dXJlcyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKIAogICAgICAgICAgICAgaW50IG51bVRhc2tzID0gY29udGV4dC5nZXRDb21wb25lbnRUYXNrcyhjb250ZXh0LmdldFRoaXNDb21wb25lbnRJZCgpKS5zaXplKCk7CiAgICAgICAgICAgICBpbnQgaW5kZXggPSBjb250ZXh0LmdldFRoaXNUYXNrSW5kZXgoKTsKQEAgLTE3NCw3ICsxNzIsNyBAQAogICAgIHB1YmxpYyB2b2lkIG5leHRUdXBsZSgpIHsKICAgICAgICAgYm9vbGVhbiBnb3RSZXF1ZXN0ID0gZmFsc2U7CiAgICAgICAgIGlmKF9sb2NhbF9kcnBjX2lkPT1udWxsKSB7Ci0gICAgICAgICAgICBpbnQgc2l6ZSA9IDA7CisgICAgICAgICAgICBpbnQgc2l6ZTsKICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoX2NsaWVudHMpIHsKICAgICAgICAgICAgICAgICBzaXplID0gX2NsaWVudHMuc2l6ZSgpOyAvL1RoaXMgd2lsbCBvbmx5IGV2ZXIgZ3Jvdywgc28gbm8gbmVlZCB0byB3b3JyeSBhYm91dCBmYWxsaW5nIG9mZiB0aGUgZW5kCiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZHJwYy9Kb2luUmVzdWx0LmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZHJwYy9Kb2luUmVzdWx0LmphdmEKaW5kZXggYjc0Yjk3ZS4uMmM0MTZlZCAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2RycGMvSm9pblJlc3VsdC5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9kcnBjL0pvaW5SZXN1bHQuamF2YQpAQCAtMzMsMTEgKzMzLDExIEBACiAKIAogcHVibGljIGNsYXNzIEpvaW5SZXN1bHQgZXh0ZW5kcyBCYXNlUmljaEJvbHQgewotICAgIHB1YmxpYyBzdGF0aWMgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEpvaW5SZXN1bHQuY2xhc3MpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEpvaW5SZXN1bHQuY2xhc3MpOwogCiAgICAgU3RyaW5nIHJldHVybkNvbXBvbmVudDsKLSAgICBNYXA8T2JqZWN0LCBUdXBsZT4gcmV0dXJucyA9IG5ldyBIYXNoTWFwPE9iamVjdCwgVHVwbGU+KCk7Ci0gICAgTWFwPE9iamVjdCwgVHVwbGU+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDxPYmplY3QsIFR1cGxlPigpOworICAgIE1hcDxPYmplY3QsIFR1cGxlPiByZXR1cm5zID0gbmV3IEhhc2hNYXA8PigpOworICAgIE1hcDxPYmplY3QsIFR1cGxlPiByZXN1bHRzID0gbmV3IEhhc2hNYXA8PigpOwogICAgIE91dHB1dENvbGxlY3RvciBfY29sbGVjdG9yOwogCiAgICAgcHVibGljIEpvaW5SZXN1bHQoU3RyaW5nIHJldHVybkNvbXBvbmVudCkgewpAQCAtNjAsNyArNjAsNyBAQAogICAgICAgICAgICAgVHVwbGUgcmVzdWx0ID0gcmVzdWx0cy5yZW1vdmUocmVxdWVzdElkKTsKICAgICAgICAgICAgIFR1cGxlIHJldHVybmVyID0gcmV0dXJucy5yZW1vdmUocmVxdWVzdElkKTsKICAgICAgICAgICAgIExPRy5kZWJ1ZyhyZXN1bHQuZ2V0VmFsdWUoMSkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBMaXN0PFR1cGxlPiBhbmNob3JzID0gbmV3IEFycmF5TGlzdDxUdXBsZT4oKTsKKyAgICAgICAgICAgIExpc3Q8VHVwbGU+IGFuY2hvcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgICAgICAgIGFuY2hvcnMuYWRkKHJlc3VsdCk7CiAgICAgICAgICAgICBhbmNob3JzLmFkZChyZXR1cm5lcik7ICAgICAgICAgICAgCiAgICAgICAgICAgICBfY29sbGVjdG9yLmVtaXQoYW5jaG9ycywgbmV3IFZhbHVlcygiIityZXN1bHQuZ2V0VmFsdWUoMSksIHJldHVybmVyLmdldFZhbHVlKDEpKSk7CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL0FscmVhZHlBbGl2ZUV4Y2VwdGlvbi5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9BbHJlYWR5QWxpdmVFeGNlcHRpb24uamF2YQppbmRleCA2MjY0N2MzLi5lZWNmMDQ0IDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL0FscmVhZHlBbGl2ZUV4Y2VwdGlvbi5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvQWxyZWFkeUFsaXZlRXhjZXB0aW9uLmphdmEKQEAgLTE2LDcgKzE2LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAvKioKLSAqIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMikKKyAqIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMykKICAqCiAgKiBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HCiAgKiAgQGdlbmVyYXRlZApAQCAtNTEsNyArNTEsNyBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCiBAU3VwcHJlc3NXYXJuaW5ncyh7ImNhc3QiLCAicmF3dHlwZXMiLCAic2VyaWFsIiwgInVuY2hlY2tlZCJ9KQotQEdlbmVyYXRlZCh2YWx1ZSA9ICJBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjIpIiwgZGF0ZSA9ICIyMDE1LTItNiIpCitAR2VuZXJhdGVkKHZhbHVlID0gIkF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMykiKQogcHVibGljIGNsYXNzIEFscmVhZHlBbGl2ZUV4Y2VwdGlvbiBleHRlbmRzIFRFeGNlcHRpb24gaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZTxBbHJlYWR5QWxpdmVFeGNlcHRpb24sIEFscmVhZHlBbGl2ZUV4Y2VwdGlvbi5fRmllbGRzPiwgamF2YS5pby5TZXJpYWxpemFibGUsIENsb25lYWJsZSwgQ29tcGFyYWJsZTxBbHJlYWR5QWxpdmVFeGNlcHRpb24+IHsKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdCBTVFJVQ1RfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0KCJBbHJlYWR5QWxpdmVFeGNlcHRpb24iKTsKIApkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9Bc3NpZ25tZW50LmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL0Fzc2lnbm1lbnQuamF2YQppbmRleCBmNTc2Yzg0Li5jYzliYjE5IDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL0Fzc2lnbm1lbnQuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL0Fzc2lnbm1lbnQuamF2YQpAQCAtMTYsNyArMTYsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIC8qKgotICogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4yKQorICogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4zKQogICoKICAqIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkcKICAqICBAZ2VuZXJhdGVkCkBAIC01MSw3ICs1MSw3IEBACiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKIEBTdXBwcmVzc1dhcm5pbmdzKHsiY2FzdCIsICJyYXd0eXBlcyIsICJzZXJpYWwiLCAidW5jaGVja2VkIn0pCi1AR2VuZXJhdGVkKHZhbHVlID0gIkF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMikiLCBkYXRlID0gIjIwMTUtOS0zIikKK0BHZW5lcmF0ZWQodmFsdWUgPSAiQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4zKSIpCiBwdWJsaWMgY2xhc3MgQXNzaWdubWVudCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlPEFzc2lnbm1lbnQsIEFzc2lnbm1lbnQuX0ZpZWxkcz4sIGphdmEuaW8uU2VyaWFsaXphYmxlLCBDbG9uZWFibGUsIENvbXBhcmFibGU8QXNzaWdubWVudD4gewogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0IFNUUlVDVF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QoIkFzc2lnbm1lbnQiKTsKIApAQCAtNTksNiArNTksNyBAQAogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgTk9ERV9IT1NUX0ZJRUxEX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkKCJub2RlX2hvc3QiLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5NQVAsIChzaG9ydCkyKTsKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIEVYRUNVVE9SX05PREVfUE9SVF9GSUVMRF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCgiZXhlY3V0b3Jfbm9kZV9wb3J0Iiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTUFQLCAoc2hvcnQpMyk7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBFWEVDVVRPUl9TVEFSVF9USU1FX1NFQ1NfRklFTERfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQoImV4ZWN1dG9yX3N0YXJ0X3RpbWVfc2VjcyIsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLk1BUCwgKHNob3J0KTQpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgV09SS0VSX1JFU09VUkNFU19GSUVMRF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCgid29ya2VyX3Jlc291cmNlcyIsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLk1BUCwgKHNob3J0KTUpOwogCiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxDbGFzczw/IGV4dGVuZHMgSVNjaGVtZT4sIFNjaGVtZUZhY3Rvcnk+IHNjaGVtZXMgPSBuZXcgSGFzaE1hcDxDbGFzczw/IGV4dGVuZHMgSVNjaGVtZT4sIFNjaGVtZUZhY3Rvcnk+KCk7CiAgIHN0YXRpYyB7CkBAIC03MCwxMyArNzEsMTUgQEAKICAgcHJpdmF0ZSBNYXA8U3RyaW5nLFN0cmluZz4gbm9kZV9ob3N0OyAvLyBvcHRpb25hbAogICBwcml2YXRlIE1hcDxMaXN0PExvbmc+LE5vZGVJbmZvPiBleGVjdXRvcl9ub2RlX3BvcnQ7IC8vIG9wdGlvbmFsCiAgIHByaXZhdGUgTWFwPExpc3Q8TG9uZz4sTG9uZz4gZXhlY3V0b3Jfc3RhcnRfdGltZV9zZWNzOyAvLyBvcHRpb25hbAorICBwcml2YXRlIE1hcDxOb2RlSW5mbyxXb3JrZXJSZXNvdXJjZXM+IHdvcmtlcl9yZXNvdXJjZXM7IC8vIG9wdGlvbmFsCiAKICAgLyoqIFRoZSBzZXQgb2YgZmllbGRzIHRoaXMgc3RydWN0IGNvbnRhaW5zLCBhbG9uZyB3aXRoIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9yIGZpbmRpbmcgYW5kIG1hbmlwdWxhdGluZyB0aGVtLiAqLwogICBwdWJsaWMgZW51bSBfRmllbGRzIGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkSWRFbnVtIHsKICAgICBNQVNURVJfQ09ERV9ESVIoKHNob3J0KTEsICJtYXN0ZXJfY29kZV9kaXIiKSwKICAgICBOT0RFX0hPU1QoKHNob3J0KTIsICJub2RlX2hvc3QiKSwKICAgICBFWEVDVVRPUl9OT0RFX1BPUlQoKHNob3J0KTMsICJleGVjdXRvcl9ub2RlX3BvcnQiKSwKLSAgICBFWEVDVVRPUl9TVEFSVF9USU1FX1NFQ1MoKHNob3J0KTQsICJleGVjdXRvcl9zdGFydF90aW1lX3NlY3MiKTsKKyAgICBFWEVDVVRPUl9TVEFSVF9USU1FX1NFQ1MoKHNob3J0KTQsICJleGVjdXRvcl9zdGFydF90aW1lX3NlY3MiKSwKKyAgICBXT1JLRVJfUkVTT1VSQ0VTKChzaG9ydCk1LCAid29ya2VyX3Jlc291cmNlcyIpOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgX0ZpZWxkcz4gYnlOYW1lID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBfRmllbGRzPigpOwogCkBAIC05OSw2ICsxMDIsOCBAQAogICAgICAgICAgIHJldHVybiBFWEVDVVRPUl9OT0RFX1BPUlQ7CiAgICAgICAgIGNhc2UgNDogLy8gRVhFQ1VUT1JfU1RBUlRfVElNRV9TRUNTCiAgICAgICAgICAgcmV0dXJuIEVYRUNVVE9SX1NUQVJUX1RJTUVfU0VDUzsKKyAgICAgICAgY2FzZSA1OiAvLyBXT1JLRVJfUkVTT1VSQ0VTCisgICAgICAgICAgcmV0dXJuIFdPUktFUl9SRVNPVVJDRVM7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICB9CkBAIC0xMzksNyArMTQ0LDcgQEAKICAgfQogCiAgIC8vIGlzc2V0IGlkIGFzc2lnbm1lbnRzCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIF9GaWVsZHMgb3B0aW9uYWxzW10gPSB7X0ZpZWxkcy5OT0RFX0hPU1QsX0ZpZWxkcy5FWEVDVVRPUl9OT0RFX1BPUlQsX0ZpZWxkcy5FWEVDVVRPUl9TVEFSVF9USU1FX1NFQ1N9OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBfRmllbGRzIG9wdGlvbmFsc1tdID0ge19GaWVsZHMuTk9ERV9IT1NULF9GaWVsZHMuRVhFQ1VUT1JfTk9ERV9QT1JULF9GaWVsZHMuRVhFQ1VUT1JfU1RBUlRfVElNRV9TRUNTLF9GaWVsZHMuV09SS0VSX1JFU09VUkNFU307CiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPiBtZXRhRGF0YU1hcDsKICAgc3RhdGljIHsKICAgICBNYXA8X0ZpZWxkcywgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGE+IHRtcE1hcCA9IG5ldyBFbnVtTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPihfRmllbGRzLmNsYXNzKTsKQEAgLTE1OSw2ICsxNjQsMTAgQEAKICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuTGlzdE1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkxJU1QsIAogICAgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRWYWx1ZU1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkk2NCkpLCAKICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRWYWx1ZU1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkk2NCkpKSk7CisgICAgdG1wTWFwLnB1dChfRmllbGRzLldPUktFUl9SRVNPVVJDRVMsIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YSgid29ya2VyX3Jlc291cmNlcyIsIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZFJlcXVpcmVtZW50VHlwZS5PUFRJT05BTCwgCisgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuTWFwTWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTUFQLCAKKyAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuU3RydWN0TWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNULCBOb2RlSW5mby5jbGFzcyksIAorICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5TdHJ1Y3RNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIFdvcmtlclJlc291cmNlcy5jbGFzcykpKSk7CiAgICAgbWV0YURhdGFNYXAgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAodG1wTWFwKTsKICAgICBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YS5hZGRTdHJ1Y3RNZXRhRGF0YU1hcChBc3NpZ25tZW50LmNsYXNzLCBtZXRhRGF0YU1hcCk7CiAgIH0KQEAgLTE3MCw2ICsxNzksOCBAQAogCiAgICAgdGhpcy5leGVjdXRvcl9zdGFydF90aW1lX3NlY3MgPSBuZXcgSGFzaE1hcDxMaXN0PExvbmc+LExvbmc+KCk7CiAKKyAgICB0aGlzLndvcmtlcl9yZXNvdXJjZXMgPSBuZXcgSGFzaE1hcDxOb2RlSW5mbyxXb3JrZXJSZXNvdXJjZXM+KCk7CisKICAgfQogCiAgIHB1YmxpYyBBc3NpZ25tZW50KApAQCAtMjIwLDYgKzIzMSwyMSBAQAogICAgICAgfQogICAgICAgdGhpcy5leGVjdXRvcl9zdGFydF90aW1lX3NlY3MgPSBfX3RoaXNfX2V4ZWN1dG9yX3N0YXJ0X3RpbWVfc2VjczsKICAgICB9CisgICAgaWYgKG90aGVyLmlzX3NldF93b3JrZXJfcmVzb3VyY2VzKCkpIHsKKyAgICAgIE1hcDxOb2RlSW5mbyxXb3JrZXJSZXNvdXJjZXM+IF9fdGhpc19fd29ya2VyX3Jlc291cmNlcyA9IG5ldyBIYXNoTWFwPE5vZGVJbmZvLFdvcmtlclJlc291cmNlcz4ob3RoZXIud29ya2VyX3Jlc291cmNlcy5zaXplKCkpOworICAgICAgZm9yIChNYXAuRW50cnk8Tm9kZUluZm8sIFdvcmtlclJlc291cmNlcz4gb3RoZXJfZWxlbWVudCA6IG90aGVyLndvcmtlcl9yZXNvdXJjZXMuZW50cnlTZXQoKSkgeworCisgICAgICAgIE5vZGVJbmZvIG90aGVyX2VsZW1lbnRfa2V5ID0gb3RoZXJfZWxlbWVudC5nZXRLZXkoKTsKKyAgICAgICAgV29ya2VyUmVzb3VyY2VzIG90aGVyX2VsZW1lbnRfdmFsdWUgPSBvdGhlcl9lbGVtZW50LmdldFZhbHVlKCk7CisKKyAgICAgICAgTm9kZUluZm8gX190aGlzX193b3JrZXJfcmVzb3VyY2VzX2NvcHlfa2V5ID0gbmV3IE5vZGVJbmZvKG90aGVyX2VsZW1lbnRfa2V5KTsKKworICAgICAgICBXb3JrZXJSZXNvdXJjZXMgX190aGlzX193b3JrZXJfcmVzb3VyY2VzX2NvcHlfdmFsdWUgPSBuZXcgV29ya2VyUmVzb3VyY2VzKG90aGVyX2VsZW1lbnRfdmFsdWUpOworCisgICAgICAgIF9fdGhpc19fd29ya2VyX3Jlc291cmNlcy5wdXQoX190aGlzX193b3JrZXJfcmVzb3VyY2VzX2NvcHlfa2V5LCBfX3RoaXNfX3dvcmtlcl9yZXNvdXJjZXNfY29weV92YWx1ZSk7CisgICAgICB9CisgICAgICB0aGlzLndvcmtlcl9yZXNvdXJjZXMgPSBfX3RoaXNfX3dvcmtlcl9yZXNvdXJjZXM7CisgICAgfQogICB9CiAKICAgcHVibGljIEFzc2lnbm1lbnQgZGVlcENvcHkoKSB7CkBAIC0yMzUsNiArMjYxLDggQEAKIAogICAgIHRoaXMuZXhlY3V0b3Jfc3RhcnRfdGltZV9zZWNzID0gbmV3IEhhc2hNYXA8TGlzdDxMb25nPixMb25nPigpOwogCisgICAgdGhpcy53b3JrZXJfcmVzb3VyY2VzID0gbmV3IEhhc2hNYXA8Tm9kZUluZm8sV29ya2VyUmVzb3VyY2VzPigpOworCiAgIH0KIAogICBwdWJsaWMgU3RyaW5nIGdldF9tYXN0ZXJfY29kZV9kaXIoKSB7CkBAIC0zNjIsNiArMzkwLDQwIEBACiAgICAgfQogICB9CiAKKyAgcHVibGljIGludCBnZXRfd29ya2VyX3Jlc291cmNlc19zaXplKCkgeworICAgIHJldHVybiAodGhpcy53b3JrZXJfcmVzb3VyY2VzID09IG51bGwpID8gMCA6IHRoaXMud29ya2VyX3Jlc291cmNlcy5zaXplKCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBwdXRfdG9fd29ya2VyX3Jlc291cmNlcyhOb2RlSW5mbyBrZXksIFdvcmtlclJlc291cmNlcyB2YWwpIHsKKyAgICBpZiAodGhpcy53b3JrZXJfcmVzb3VyY2VzID09IG51bGwpIHsKKyAgICAgIHRoaXMud29ya2VyX3Jlc291cmNlcyA9IG5ldyBIYXNoTWFwPE5vZGVJbmZvLFdvcmtlclJlc291cmNlcz4oKTsKKyAgICB9CisgICAgdGhpcy53b3JrZXJfcmVzb3VyY2VzLnB1dChrZXksIHZhbCk7CisgIH0KKworICBwdWJsaWMgTWFwPE5vZGVJbmZvLFdvcmtlclJlc291cmNlcz4gZ2V0X3dvcmtlcl9yZXNvdXJjZXMoKSB7CisgICAgcmV0dXJuIHRoaXMud29ya2VyX3Jlc291cmNlczsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF93b3JrZXJfcmVzb3VyY2VzKE1hcDxOb2RlSW5mbyxXb3JrZXJSZXNvdXJjZXM+IHdvcmtlcl9yZXNvdXJjZXMpIHsKKyAgICB0aGlzLndvcmtlcl9yZXNvdXJjZXMgPSB3b3JrZXJfcmVzb3VyY2VzOworICB9CisKKyAgcHVibGljIHZvaWQgdW5zZXRfd29ya2VyX3Jlc291cmNlcygpIHsKKyAgICB0aGlzLndvcmtlcl9yZXNvdXJjZXMgPSBudWxsOworICB9CisKKyAgLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCB3b3JrZXJfcmVzb3VyY2VzIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLworICBwdWJsaWMgYm9vbGVhbiBpc19zZXRfd29ya2VyX3Jlc291cmNlcygpIHsKKyAgICByZXR1cm4gdGhpcy53b3JrZXJfcmVzb3VyY2VzICE9IG51bGw7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfd29ya2VyX3Jlc291cmNlc19pc1NldChib29sZWFuIHZhbHVlKSB7CisgICAgaWYgKCF2YWx1ZSkgeworICAgICAgdGhpcy53b3JrZXJfcmVzb3VyY2VzID0gbnVsbDsKKyAgICB9CisgIH0KKwogICBwdWJsaWMgdm9pZCBzZXRGaWVsZFZhbHVlKF9GaWVsZHMgZmllbGQsIE9iamVjdCB2YWx1ZSkgewogICAgIHN3aXRjaCAoZmllbGQpIHsKICAgICBjYXNlIE1BU1RFUl9DT0RFX0RJUjoKQEAgLTM5Niw2ICs0NTgsMTQgQEAKICAgICAgIH0KICAgICAgIGJyZWFrOwogCisgICAgY2FzZSBXT1JLRVJfUkVTT1VSQ0VTOgorICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgdW5zZXRfd29ya2VyX3Jlc291cmNlcygpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2V0X3dvcmtlcl9yZXNvdXJjZXMoKE1hcDxOb2RlSW5mbyxXb3JrZXJSZXNvdXJjZXM+KXZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCiAgICAgfQogICB9CiAKQEAgLTQxMyw2ICs0ODMsOSBAQAogICAgIGNhc2UgRVhFQ1VUT1JfU1RBUlRfVElNRV9TRUNTOgogICAgICAgcmV0dXJuIGdldF9leGVjdXRvcl9zdGFydF90aW1lX3NlY3MoKTsKIAorICAgIGNhc2UgV09SS0VSX1JFU09VUkNFUzoKKyAgICAgIHJldHVybiBnZXRfd29ya2VyX3Jlc291cmNlcygpOworCiAgICAgfQogICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKICAgfQpAQCAtNDMyLDYgKzUwNSw4IEBACiAgICAgICByZXR1cm4gaXNfc2V0X2V4ZWN1dG9yX25vZGVfcG9ydCgpOwogICAgIGNhc2UgRVhFQ1VUT1JfU1RBUlRfVElNRV9TRUNTOgogICAgICAgcmV0dXJuIGlzX3NldF9leGVjdXRvcl9zdGFydF90aW1lX3NlY3MoKTsKKyAgICBjYXNlIFdPUktFUl9SRVNPVVJDRVM6CisgICAgICByZXR1cm4gaXNfc2V0X3dvcmtlcl9yZXNvdXJjZXMoKTsKICAgICB9CiAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwogICB9CkBAIC00ODUsNiArNTYwLDE1IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKKyAgICBib29sZWFuIHRoaXNfcHJlc2VudF93b3JrZXJfcmVzb3VyY2VzID0gdHJ1ZSAmJiB0aGlzLmlzX3NldF93b3JrZXJfcmVzb3VyY2VzKCk7CisgICAgYm9vbGVhbiB0aGF0X3ByZXNlbnRfd29ya2VyX3Jlc291cmNlcyA9IHRydWUgJiYgdGhhdC5pc19zZXRfd29ya2VyX3Jlc291cmNlcygpOworICAgIGlmICh0aGlzX3ByZXNlbnRfd29ya2VyX3Jlc291cmNlcyB8fCB0aGF0X3ByZXNlbnRfd29ya2VyX3Jlc291cmNlcykgeworICAgICAgaWYgKCEodGhpc19wcmVzZW50X3dvcmtlcl9yZXNvdXJjZXMgJiYgdGhhdF9wcmVzZW50X3dvcmtlcl9yZXNvdXJjZXMpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBpZiAoIXRoaXMud29ya2VyX3Jlc291cmNlcy5lcXVhbHModGhhdC53b3JrZXJfcmVzb3VyY2VzKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKwogICAgIHJldHVybiB0cnVlOwogICB9CiAKQEAgLTUxMiw2ICs1OTYsMTEgQEAKICAgICBpZiAocHJlc2VudF9leGVjdXRvcl9zdGFydF90aW1lX3NlY3MpCiAgICAgICBsaXN0LmFkZChleGVjdXRvcl9zdGFydF90aW1lX3NlY3MpOwogCisgICAgYm9vbGVhbiBwcmVzZW50X3dvcmtlcl9yZXNvdXJjZXMgPSB0cnVlICYmIChpc19zZXRfd29ya2VyX3Jlc291cmNlcygpKTsKKyAgICBsaXN0LmFkZChwcmVzZW50X3dvcmtlcl9yZXNvdXJjZXMpOworICAgIGlmIChwcmVzZW50X3dvcmtlcl9yZXNvdXJjZXMpCisgICAgICBsaXN0LmFkZCh3b3JrZXJfcmVzb3VyY2VzKTsKKwogICAgIHJldHVybiBsaXN0Lmhhc2hDb2RlKCk7CiAgIH0KIApAQCAtNTYzLDYgKzY1MiwxNiBAQAogICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CiAgICAgICB9CiAgICAgfQorICAgIGxhc3RDb21wYXJpc29uID0gQm9vbGVhbi52YWx1ZU9mKGlzX3NldF93b3JrZXJfcmVzb3VyY2VzKCkpLmNvbXBhcmVUbyhvdGhlci5pc19zZXRfd29ya2VyX3Jlc291cmNlcygpKTsKKyAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgIH0KKyAgICBpZiAoaXNfc2V0X3dvcmtlcl9yZXNvdXJjZXMoKSkgeworICAgICAgbGFzdENvbXBhcmlzb24gPSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy53b3JrZXJfcmVzb3VyY2VzLCBvdGhlci53b3JrZXJfcmVzb3VyY2VzKTsKKyAgICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICAgIH0KKyAgICB9CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtNjIwLDYgKzcxOSwxNiBAQAogICAgICAgfQogICAgICAgZmlyc3QgPSBmYWxzZTsKICAgICB9CisgICAgaWYgKGlzX3NldF93b3JrZXJfcmVzb3VyY2VzKCkpIHsKKyAgICAgIGlmICghZmlyc3QpIHNiLmFwcGVuZCgiLCAiKTsKKyAgICAgIHNiLmFwcGVuZCgid29ya2VyX3Jlc291cmNlczoiKTsKKyAgICAgIGlmICh0aGlzLndvcmtlcl9yZXNvdXJjZXMgPT0gbnVsbCkgeworICAgICAgICBzYi5hcHBlbmQoIm51bGwiKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNiLmFwcGVuZCh0aGlzLndvcmtlcl9yZXNvdXJjZXMpOworICAgICAgfQorICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9CiAgICAgc2IuYXBwZW5kKCIpIik7CiAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgIH0KQEAgLTY3OCwxNSArNzg3LDE1IEBACiAgICAgICAgICAgY2FzZSAyOiAvLyBOT0RFX0hPU1QKICAgICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLk1BUCkgewogICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwMzg4ID0gaXByb3QucmVhZE1hcEJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgc3RydWN0Lm5vZGVfaG9zdCA9IG5ldyBIYXNoTWFwPFN0cmluZyxTdHJpbmc+KDIqX21hcDM4OC5zaXplKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgX2tleTM4OTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgX3ZhbDM5MDsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBfaTM5MSA9IDA7IF9pMzkxIDwgX21hcDM4OC5zaXplOyArK19pMzkxKQorICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgX21hcDUzMiA9IGlwcm90LnJlYWRNYXBCZWdpbigpOworICAgICAgICAgICAgICAgIHN0cnVjdC5ub2RlX2hvc3QgPSBuZXcgSGFzaE1hcDxTdHJpbmcsU3RyaW5nPigyKl9tYXA1MzIuc2l6ZSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIF9rZXk1MzM7CisgICAgICAgICAgICAgICAgU3RyaW5nIF92YWw1MzQ7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgX2k1MzUgPSAwOyBfaTUzNSA8IF9tYXA1MzIuc2l6ZTsgKytfaTUzNSkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBfa2V5Mzg5ID0gaXByb3QucmVhZFN0cmluZygpOwotICAgICAgICAgICAgICAgICAgX3ZhbDM5MCA9IGlwcm90LnJlYWRTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgIHN0cnVjdC5ub2RlX2hvc3QucHV0KF9rZXkzODksIF92YWwzOTApOworICAgICAgICAgICAgICAgICAgX2tleTUzMyA9IGlwcm90LnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgIF92YWw1MzQgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICBzdHJ1Y3Qubm9kZV9ob3N0LnB1dChfa2V5NTMzLCBfdmFsNTM0KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaXByb3QucmVhZE1hcEVuZCgpOwogICAgICAgICAgICAgICB9CkBAIC02OTgsMjYgKzgwNywyNiBAQAogICAgICAgICAgIGNhc2UgMzogLy8gRVhFQ1VUT1JfTk9ERV9QT1JUCiAgICAgICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5NQVApIHsKICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgX21hcDM5MiA9IGlwcm90LnJlYWRNYXBCZWdpbigpOwotICAgICAgICAgICAgICAgIHN0cnVjdC5leGVjdXRvcl9ub2RlX3BvcnQgPSBuZXcgSGFzaE1hcDxMaXN0PExvbmc+LE5vZGVJbmZvPigyKl9tYXAzOTIuc2l6ZSk7Ci0gICAgICAgICAgICAgICAgTGlzdDxMb25nPiBfa2V5MzkzOwotICAgICAgICAgICAgICAgIE5vZGVJbmZvIF92YWwzOTQ7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgX2kzOTUgPSAwOyBfaTM5NSA8IF9tYXAzOTIuc2l6ZTsgKytfaTM5NSkKKyAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwIF9tYXA1MzYgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKTsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QuZXhlY3V0b3Jfbm9kZV9wb3J0ID0gbmV3IEhhc2hNYXA8TGlzdDxMb25nPixOb2RlSW5mbz4oMipfbWFwNTM2LnNpemUpOworICAgICAgICAgICAgICAgIExpc3Q8TG9uZz4gX2tleTUzNzsKKyAgICAgICAgICAgICAgICBOb2RlSW5mbyBfdmFsNTM4OworICAgICAgICAgICAgICAgIGZvciAoaW50IF9pNTM5ID0gMDsgX2k1MzkgPCBfbWFwNTM2LnNpemU7ICsrX2k1MzkpCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTGlzdCBfbGlzdDM5NiA9IGlwcm90LnJlYWRMaXN0QmVnaW4oKTsKLSAgICAgICAgICAgICAgICAgICAgX2tleTM5MyA9IG5ldyBBcnJheUxpc3Q8TG9uZz4oX2xpc3QzOTYuc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGxvbmcgX2VsZW0zOTc7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IF9pMzk4ID0gMDsgX2kzOTggPCBfbGlzdDM5Ni5zaXplOyArK19pMzk4KQorICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTGlzdCBfbGlzdDU0MCA9IGlwcm90LnJlYWRMaXN0QmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgX2tleTUzNyA9IG5ldyBBcnJheUxpc3Q8TG9uZz4oX2xpc3Q1NDAuc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIGxvbmcgX2VsZW01NDE7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IF9pNTQyID0gMDsgX2k1NDIgPCBfbGlzdDU0MC5zaXplOyArK19pNTQyKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgX2VsZW0zOTcgPSBpcHJvdC5yZWFkSTY0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgX2tleTM5My5hZGQoX2VsZW0zOTcpOworICAgICAgICAgICAgICAgICAgICAgIF9lbGVtNTQxID0gaXByb3QucmVhZEk2NCgpOworICAgICAgICAgICAgICAgICAgICAgIF9rZXk1MzcuYWRkKF9lbGVtNTQxKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpcHJvdC5yZWFkTGlzdEVuZCgpOwogICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgX3ZhbDM5NCA9IG5ldyBOb2RlSW5mbygpOwotICAgICAgICAgICAgICAgICAgX3ZhbDM5NC5yZWFkKGlwcm90KTsKLSAgICAgICAgICAgICAgICAgIHN0cnVjdC5leGVjdXRvcl9ub2RlX3BvcnQucHV0KF9rZXkzOTMsIF92YWwzOTQpOworICAgICAgICAgICAgICAgICAgX3ZhbDUzOCA9IG5ldyBOb2RlSW5mbygpOworICAgICAgICAgICAgICAgICAgX3ZhbDUzOC5yZWFkKGlwcm90KTsKKyAgICAgICAgICAgICAgICAgIHN0cnVjdC5leGVjdXRvcl9ub2RlX3BvcnQucHV0KF9rZXk1MzcsIF92YWw1MzgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpcHJvdC5yZWFkTWFwRW5kKCk7CiAgICAgICAgICAgICAgIH0KQEAgLTcyOSwyNSArODM4LDI1IEBACiAgICAgICAgICAgY2FzZSA0OiAvLyBFWEVDVVRPUl9TVEFSVF9USU1FX1NFQ1MKICAgICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLk1BUCkgewogICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwMzk5ID0gaXByb3QucmVhZE1hcEJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgc3RydWN0LmV4ZWN1dG9yX3N0YXJ0X3RpbWVfc2VjcyA9IG5ldyBIYXNoTWFwPExpc3Q8TG9uZz4sTG9uZz4oMipfbWFwMzk5LnNpemUpOwotICAgICAgICAgICAgICAgIExpc3Q8TG9uZz4gX2tleTQwMDsKLSAgICAgICAgICAgICAgICBsb25nIF92YWw0MDE7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgX2k0MDIgPSAwOyBfaTQwMiA8IF9tYXAzOTkuc2l6ZTsgKytfaTQwMikKKyAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwIF9tYXA1NDMgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKTsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QuZXhlY3V0b3Jfc3RhcnRfdGltZV9zZWNzID0gbmV3IEhhc2hNYXA8TGlzdDxMb25nPixMb25nPigyKl9tYXA1NDMuc2l6ZSk7CisgICAgICAgICAgICAgICAgTGlzdDxMb25nPiBfa2V5NTQ0OworICAgICAgICAgICAgICAgIGxvbmcgX3ZhbDU0NTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBfaTU0NiA9IDA7IF9pNTQ2IDwgX21hcDU0My5zaXplOyArK19pNTQ2KQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVExpc3QgX2xpc3Q0MDMgPSBpcHJvdC5yZWFkTGlzdEJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgICAgIF9rZXk0MDAgPSBuZXcgQXJyYXlMaXN0PExvbmc+KF9saXN0NDAzLnNpemUpOwotICAgICAgICAgICAgICAgICAgICBsb25nIF9lbGVtNDA0OwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBfaTQwNSA9IDA7IF9pNDA1IDwgX2xpc3Q0MDMuc2l6ZTsgKytfaTQwNSkKKyAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVExpc3QgX2xpc3Q1NDcgPSBpcHJvdC5yZWFkTGlzdEJlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgIF9rZXk1NDQgPSBuZXcgQXJyYXlMaXN0PExvbmc+KF9saXN0NTQ3LnNpemUpOworICAgICAgICAgICAgICAgICAgICBsb25nIF9lbGVtNTQ4OworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBfaTU0OSA9IDA7IF9pNTQ5IDwgX2xpc3Q1NDcuc2l6ZTsgKytfaTU0OSkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIF9lbGVtNDA0ID0gaXByb3QucmVhZEk2NCgpOwotICAgICAgICAgICAgICAgICAgICAgIF9rZXk0MDAuYWRkKF9lbGVtNDA0KTsKKyAgICAgICAgICAgICAgICAgICAgICBfZWxlbTU0OCA9IGlwcm90LnJlYWRJNjQoKTsKKyAgICAgICAgICAgICAgICAgICAgICBfa2V5NTQ0LmFkZChfZWxlbTU0OCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaXByb3QucmVhZExpc3RFbmQoKTsKICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIF92YWw0MDEgPSBpcHJvdC5yZWFkSTY0KCk7Ci0gICAgICAgICAgICAgICAgICBzdHJ1Y3QuZXhlY3V0b3Jfc3RhcnRfdGltZV9zZWNzLnB1dChfa2V5NDAwLCBfdmFsNDAxKTsKKyAgICAgICAgICAgICAgICAgIF92YWw1NDUgPSBpcHJvdC5yZWFkSTY0KCk7CisgICAgICAgICAgICAgICAgICBzdHJ1Y3QuZXhlY3V0b3Jfc3RhcnRfdGltZV9zZWNzLnB1dChfa2V5NTQ0LCBfdmFsNTQ1KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaXByb3QucmVhZE1hcEVuZCgpOwogICAgICAgICAgICAgICB9CkBAIC03NTYsNiArODY1LDI4IEBACiAgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgc2NoZW1lRmllbGQudHlwZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDU6IC8vIFdPUktFUl9SRVNPVVJDRVMKKyAgICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLk1BUCkgeworICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwNTUwID0gaXByb3QucmVhZE1hcEJlZ2luKCk7CisgICAgICAgICAgICAgICAgc3RydWN0Lndvcmtlcl9yZXNvdXJjZXMgPSBuZXcgSGFzaE1hcDxOb2RlSW5mbyxXb3JrZXJSZXNvdXJjZXM+KDIqX21hcDU1MC5zaXplKTsKKyAgICAgICAgICAgICAgICBOb2RlSW5mbyBfa2V5NTUxOworICAgICAgICAgICAgICAgIFdvcmtlclJlc291cmNlcyBfdmFsNTUyOworICAgICAgICAgICAgICAgIGZvciAoaW50IF9pNTUzID0gMDsgX2k1NTMgPCBfbWFwNTUwLnNpemU7ICsrX2k1NTMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgX2tleTU1MSA9IG5ldyBOb2RlSW5mbygpOworICAgICAgICAgICAgICAgICAgX2tleTU1MS5yZWFkKGlwcm90KTsKKyAgICAgICAgICAgICAgICAgIF92YWw1NTIgPSBuZXcgV29ya2VyUmVzb3VyY2VzKCk7CisgICAgICAgICAgICAgICAgICBfdmFsNTUyLnJlYWQoaXByb3QpOworICAgICAgICAgICAgICAgICAgc3RydWN0Lndvcmtlcl9yZXNvdXJjZXMucHV0KF9rZXk1NTEsIF92YWw1NTIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpcHJvdC5yZWFkTWFwRW5kKCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgc3RydWN0LnNldF93b3JrZXJfcmVzb3VyY2VzX2lzU2V0KHRydWUpOworICAgICAgICAgICAgfSBlbHNlIHsgCisgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgc2NoZW1lRmllbGQudHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKICAgICAgICAgfQpAQCAtNzc5LDEwICs5MTAsMTAgQEAKICAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oTk9ERV9IT1NUX0ZJRUxEX0RFU0MpOwogICAgICAgICAgIHsKICAgICAgICAgICAgIG9wcm90LndyaXRlTWFwQmVnaW4obmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcsIHN0cnVjdC5ub2RlX2hvc3Quc2l6ZSgpKSk7Ci0gICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gX2l0ZXI0MDYgOiBzdHJ1Y3Qubm9kZV9ob3N0LmVudHJ5U2V0KCkpCisgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gX2l0ZXI1NTQgOiBzdHJ1Y3Qubm9kZV9ob3N0LmVudHJ5U2V0KCkpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKF9pdGVyNDA2LmdldEtleSgpKTsKLSAgICAgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoX2l0ZXI0MDYuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKF9pdGVyNTU0LmdldEtleSgpKTsKKyAgICAgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoX2l0ZXI1NTQuZ2V0VmFsdWUoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBvcHJvdC53cml0ZU1hcEVuZCgpOwogICAgICAgICAgIH0KQEAgLTc5NCwxNyArOTI1LDE3IEBACiAgICAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKEVYRUNVVE9SX05PREVfUE9SVF9GSUVMRF9ERVNDKTsKICAgICAgICAgICB7CiAgICAgICAgICAgICBvcHJvdC53cml0ZU1hcEJlZ2luKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkxJU1QsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCwgc3RydWN0LmV4ZWN1dG9yX25vZGVfcG9ydC5zaXplKCkpKTsKLSAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PExpc3Q8TG9uZz4sIE5vZGVJbmZvPiBfaXRlcjQwNyA6IHN0cnVjdC5leGVjdXRvcl9ub2RlX3BvcnQuZW50cnlTZXQoKSkKKyAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PExpc3Q8TG9uZz4sIE5vZGVJbmZvPiBfaXRlcjU1NSA6IHN0cnVjdC5leGVjdXRvcl9ub2RlX3BvcnQuZW50cnlTZXQoKSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG9wcm90LndyaXRlTGlzdEJlZ2luKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTGlzdChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JNjQsIF9pdGVyNDA3LmdldEtleSgpLnNpemUoKSkpOwotICAgICAgICAgICAgICAgIGZvciAobG9uZyBfaXRlcjQwOCA6IF9pdGVyNDA3LmdldEtleSgpKQorICAgICAgICAgICAgICAgIG9wcm90LndyaXRlTGlzdEJlZ2luKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTGlzdChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JNjQsIF9pdGVyNTU1LmdldEtleSgpLnNpemUoKSkpOworICAgICAgICAgICAgICAgIGZvciAobG9uZyBfaXRlcjU1NiA6IF9pdGVyNTU1LmdldEtleSgpKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIG9wcm90LndyaXRlSTY0KF9pdGVyNDA4KTsKKyAgICAgICAgICAgICAgICAgIG9wcm90LndyaXRlSTY0KF9pdGVyNTU2KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgb3Byb3Qud3JpdGVMaXN0RW5kKCk7CiAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgX2l0ZXI0MDcuZ2V0VmFsdWUoKS53cml0ZShvcHJvdCk7CisgICAgICAgICAgICAgIF9pdGVyNTU1LmdldFZhbHVlKCkud3JpdGUob3Byb3QpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgb3Byb3Qud3JpdGVNYXBFbmQoKTsKICAgICAgICAgICB9CkBAIC04MTYsMTcgKzk0NywzMiBAQAogICAgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihFWEVDVVRPUl9TVEFSVF9USU1FX1NFQ1NfRklFTERfREVTQyk7CiAgICAgICAgICAgewogICAgICAgICAgICAgb3Byb3Qud3JpdGVNYXBCZWdpbihuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5MSVNULCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JNjQsIHN0cnVjdC5leGVjdXRvcl9zdGFydF90aW1lX3NlY3Muc2l6ZSgpKSk7Ci0gICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxMaXN0PExvbmc+LCBMb25nPiBfaXRlcjQwOSA6IHN0cnVjdC5leGVjdXRvcl9zdGFydF90aW1lX3NlY3MuZW50cnlTZXQoKSkKKyAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PExpc3Q8TG9uZz4sIExvbmc+IF9pdGVyNTU3IDogc3RydWN0LmV4ZWN1dG9yX3N0YXJ0X3RpbWVfc2Vjcy5lbnRyeVNldCgpKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb3Byb3Qud3JpdGVMaXN0QmVnaW4obmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRMaXN0KG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkk2NCwgX2l0ZXI0MDkuZ2V0S2V5KCkuc2l6ZSgpKSk7Ci0gICAgICAgICAgICAgICAgZm9yIChsb25nIF9pdGVyNDEwIDogX2l0ZXI0MDkuZ2V0S2V5KCkpCisgICAgICAgICAgICAgICAgb3Byb3Qud3JpdGVMaXN0QmVnaW4obmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRMaXN0KG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkk2NCwgX2l0ZXI1NTcuZ2V0S2V5KCkuc2l6ZSgpKSk7CisgICAgICAgICAgICAgICAgZm9yIChsb25nIF9pdGVyNTU4IDogX2l0ZXI1NTcuZ2V0S2V5KCkpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgb3Byb3Qud3JpdGVJNjQoX2l0ZXI0MTApOworICAgICAgICAgICAgICAgICAgb3Byb3Qud3JpdGVJNjQoX2l0ZXI1NTgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBvcHJvdC53cml0ZUxpc3RFbmQoKTsKICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBvcHJvdC53cml0ZUk2NChfaXRlcjQwOS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgb3Byb3Qud3JpdGVJNjQoX2l0ZXI1NTcuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvcHJvdC53cml0ZU1hcEVuZCgpOworICAgICAgICAgIH0KKyAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3Qud29ya2VyX3Jlc291cmNlcyAhPSBudWxsKSB7CisgICAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X3dvcmtlcl9yZXNvdXJjZXMoKSkgeworICAgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihXT1JLRVJfUkVTT1VSQ0VTX0ZJRUxEX0RFU0MpOworICAgICAgICAgIHsKKyAgICAgICAgICAgIG9wcm90LndyaXRlTWFwQmVnaW4obmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNULCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIHN0cnVjdC53b3JrZXJfcmVzb3VyY2VzLnNpemUoKSkpOworICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8Tm9kZUluZm8sIFdvcmtlclJlc291cmNlcz4gX2l0ZXI1NTkgOiBzdHJ1Y3Qud29ya2VyX3Jlc291cmNlcy5lbnRyeVNldCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfaXRlcjU1OS5nZXRLZXkoKS53cml0ZShvcHJvdCk7CisgICAgICAgICAgICAgIF9pdGVyNTU5LmdldFZhbHVlKCkud3JpdGUob3Byb3QpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgb3Byb3Qud3JpdGVNYXBFbmQoKTsKICAgICAgICAgICB9CkBAIC04NjEsNDYgKzEwMDcsNTkgQEAKICAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X2V4ZWN1dG9yX3N0YXJ0X3RpbWVfc2VjcygpKSB7CiAgICAgICAgIG9wdGlvbmFscy5zZXQoMik7CiAgICAgICB9Ci0gICAgICBvcHJvdC53cml0ZUJpdFNldChvcHRpb25hbHMsIDMpOworICAgICAgaWYgKHN0cnVjdC5pc19zZXRfd29ya2VyX3Jlc291cmNlcygpKSB7CisgICAgICAgIG9wdGlvbmFscy5zZXQoMyk7CisgICAgICB9CisgICAgICBvcHJvdC53cml0ZUJpdFNldChvcHRpb25hbHMsIDQpOwogICAgICAgaWYgKHN0cnVjdC5pc19zZXRfbm9kZV9ob3N0KCkpIHsKICAgICAgICAgewogICAgICAgICAgIG9wcm90LndyaXRlSTMyKHN0cnVjdC5ub2RlX2hvc3Quc2l6ZSgpKTsKLSAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gX2l0ZXI0MTEgOiBzdHJ1Y3Qubm9kZV9ob3N0LmVudHJ5U2V0KCkpCisgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IF9pdGVyNTYwIDogc3RydWN0Lm5vZGVfaG9zdC5lbnRyeVNldCgpKQogICAgICAgICAgIHsKLSAgICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKF9pdGVyNDExLmdldEtleSgpKTsKLSAgICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKF9pdGVyNDExLmdldFZhbHVlKCkpOworICAgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoX2l0ZXI1NjAuZ2V0S2V5KCkpOworICAgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoX2l0ZXI1NjAuZ2V0VmFsdWUoKSk7CiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICB9CiAgICAgICBpZiAoc3RydWN0LmlzX3NldF9leGVjdXRvcl9ub2RlX3BvcnQoKSkgewogICAgICAgICB7CiAgICAgICAgICAgb3Byb3Qud3JpdGVJMzIoc3RydWN0LmV4ZWN1dG9yX25vZGVfcG9ydC5zaXplKCkpOwotICAgICAgICAgIGZvciAoTWFwLkVudHJ5PExpc3Q8TG9uZz4sIE5vZGVJbmZvPiBfaXRlcjQxMiA6IHN0cnVjdC5leGVjdXRvcl9ub2RlX3BvcnQuZW50cnlTZXQoKSkKKyAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxMaXN0PExvbmc+LCBOb2RlSW5mbz4gX2l0ZXI1NjEgOiBzdHJ1Y3QuZXhlY3V0b3Jfbm9kZV9wb3J0LmVudHJ5U2V0KCkpCiAgICAgICAgICAgewogICAgICAgICAgICAgewotICAgICAgICAgICAgICBvcHJvdC53cml0ZUkzMihfaXRlcjQxMi5nZXRLZXkoKS5zaXplKCkpOwotICAgICAgICAgICAgICBmb3IgKGxvbmcgX2l0ZXI0MTMgOiBfaXRlcjQxMi5nZXRLZXkoKSkKKyAgICAgICAgICAgICAgb3Byb3Qud3JpdGVJMzIoX2l0ZXI1NjEuZ2V0S2V5KCkuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgZm9yIChsb25nIF9pdGVyNTYyIDogX2l0ZXI1NjEuZ2V0S2V5KCkpCiAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvcHJvdC53cml0ZUk2NChfaXRlcjQxMyk7CisgICAgICAgICAgICAgICAgb3Byb3Qud3JpdGVJNjQoX2l0ZXI1NjIpOwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBfaXRlcjQxMi5nZXRWYWx1ZSgpLndyaXRlKG9wcm90KTsKKyAgICAgICAgICAgIF9pdGVyNTYxLmdldFZhbHVlKCkud3JpdGUob3Byb3QpOwogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgfQogICAgICAgaWYgKHN0cnVjdC5pc19zZXRfZXhlY3V0b3Jfc3RhcnRfdGltZV9zZWNzKCkpIHsKICAgICAgICAgewogICAgICAgICAgIG9wcm90LndyaXRlSTMyKHN0cnVjdC5leGVjdXRvcl9zdGFydF90aW1lX3NlY3Muc2l6ZSgpKTsKLSAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxMaXN0PExvbmc+LCBMb25nPiBfaXRlcjQxNCA6IHN0cnVjdC5leGVjdXRvcl9zdGFydF90aW1lX3NlY3MuZW50cnlTZXQoKSkKKyAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxMaXN0PExvbmc+LCBMb25nPiBfaXRlcjU2MyA6IHN0cnVjdC5leGVjdXRvcl9zdGFydF90aW1lX3NlY3MuZW50cnlTZXQoKSkKICAgICAgICAgICB7CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG9wcm90LndyaXRlSTMyKF9pdGVyNDE0LmdldEtleSgpLnNpemUoKSk7Ci0gICAgICAgICAgICAgIGZvciAobG9uZyBfaXRlcjQxNSA6IF9pdGVyNDE0LmdldEtleSgpKQorICAgICAgICAgICAgICBvcHJvdC53cml0ZUkzMihfaXRlcjU2My5nZXRLZXkoKS5zaXplKCkpOworICAgICAgICAgICAgICBmb3IgKGxvbmcgX2l0ZXI1NjQgOiBfaXRlcjU2My5nZXRLZXkoKSkKICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG9wcm90LndyaXRlSTY0KF9pdGVyNDE1KTsKKyAgICAgICAgICAgICAgICBvcHJvdC53cml0ZUk2NChfaXRlcjU2NCk7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG9wcm90LndyaXRlSTY0KF9pdGVyNDE0LmdldFZhbHVlKCkpOworICAgICAgICAgICAgb3Byb3Qud3JpdGVJNjQoX2l0ZXI1NjMuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF93b3JrZXJfcmVzb3VyY2VzKCkpIHsKKyAgICAgICAgeworICAgICAgICAgIG9wcm90LndyaXRlSTMyKHN0cnVjdC53b3JrZXJfcmVzb3VyY2VzLnNpemUoKSk7CisgICAgICAgICAgZm9yIChNYXAuRW50cnk8Tm9kZUluZm8sIFdvcmtlclJlc291cmNlcz4gX2l0ZXI1NjUgOiBzdHJ1Y3Qud29ya2VyX3Jlc291cmNlcy5lbnRyeVNldCgpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIF9pdGVyNTY1LmdldEtleSgpLndyaXRlKG9wcm90KTsKKyAgICAgICAgICAgIF9pdGVyNTY1LmdldFZhbHVlKCkud3JpdGUob3Byb3QpOwogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgfQpAQCAtOTExLDcxICsxMDcwLDg4IEBACiAgICAgICBUVHVwbGVQcm90b2NvbCBpcHJvdCA9IChUVHVwbGVQcm90b2NvbCkgcHJvdDsKICAgICAgIHN0cnVjdC5tYXN0ZXJfY29kZV9kaXIgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CiAgICAgICBzdHJ1Y3Quc2V0X21hc3Rlcl9jb2RlX2Rpcl9pc1NldCh0cnVlKTsKLSAgICAgIEJpdFNldCBpbmNvbWluZyA9IGlwcm90LnJlYWRCaXRTZXQoMyk7CisgICAgICBCaXRTZXQgaW5jb21pbmcgPSBpcHJvdC5yZWFkQml0U2V0KDQpOwogICAgICAgaWYgKGluY29taW5nLmdldCgwKSkgewogICAgICAgICB7Ci0gICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwNDE2ID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcsIGlwcm90LnJlYWRJMzIoKSk7Ci0gICAgICAgICAgc3RydWN0Lm5vZGVfaG9zdCA9IG5ldyBIYXNoTWFwPFN0cmluZyxTdHJpbmc+KDIqX21hcDQxNi5zaXplKTsKLSAgICAgICAgICBTdHJpbmcgX2tleTQxNzsKLSAgICAgICAgICBTdHJpbmcgX3ZhbDQxODsKLSAgICAgICAgICBmb3IgKGludCBfaTQxOSA9IDA7IF9pNDE5IDwgX21hcDQxNi5zaXplOyArK19pNDE5KQorICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgX21hcDU2NiA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORywgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCBpcHJvdC5yZWFkSTMyKCkpOworICAgICAgICAgIHN0cnVjdC5ub2RlX2hvc3QgPSBuZXcgSGFzaE1hcDxTdHJpbmcsU3RyaW5nPigyKl9tYXA1NjYuc2l6ZSk7CisgICAgICAgICAgU3RyaW5nIF9rZXk1Njc7CisgICAgICAgICAgU3RyaW5nIF92YWw1Njg7CisgICAgICAgICAgZm9yIChpbnQgX2k1NjkgPSAwOyBfaTU2OSA8IF9tYXA1NjYuc2l6ZTsgKytfaTU2OSkKICAgICAgICAgICB7Ci0gICAgICAgICAgICBfa2V5NDE3ID0gaXByb3QucmVhZFN0cmluZygpOwotICAgICAgICAgICAgX3ZhbDQxOCA9IGlwcm90LnJlYWRTdHJpbmcoKTsKLSAgICAgICAgICAgIHN0cnVjdC5ub2RlX2hvc3QucHV0KF9rZXk0MTcsIF92YWw0MTgpOworICAgICAgICAgICAgX2tleTU2NyA9IGlwcm90LnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgIF92YWw1NjggPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICBzdHJ1Y3Qubm9kZV9ob3N0LnB1dChfa2V5NTY3LCBfdmFsNTY4KTsKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgc3RydWN0LnNldF9ub2RlX2hvc3RfaXNTZXQodHJ1ZSk7CiAgICAgICB9CiAgICAgICBpZiAoaW5jb21pbmcuZ2V0KDEpKSB7CiAgICAgICAgIHsKLSAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwIF9tYXA0MjAgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5MSVNULCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIGlwcm90LnJlYWRJMzIoKSk7Ci0gICAgICAgICAgc3RydWN0LmV4ZWN1dG9yX25vZGVfcG9ydCA9IG5ldyBIYXNoTWFwPExpc3Q8TG9uZz4sTm9kZUluZm8+KDIqX21hcDQyMC5zaXplKTsKLSAgICAgICAgICBMaXN0PExvbmc+IF9rZXk0MjE7Ci0gICAgICAgICAgTm9kZUluZm8gX3ZhbDQyMjsKLSAgICAgICAgICBmb3IgKGludCBfaTQyMyA9IDA7IF9pNDIzIDwgX21hcDQyMC5zaXplOyArK19pNDIzKQorICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgX21hcDU3MCA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkxJU1QsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCwgaXByb3QucmVhZEkzMigpKTsKKyAgICAgICAgICBzdHJ1Y3QuZXhlY3V0b3Jfbm9kZV9wb3J0ID0gbmV3IEhhc2hNYXA8TGlzdDxMb25nPixOb2RlSW5mbz4oMipfbWFwNTcwLnNpemUpOworICAgICAgICAgIExpc3Q8TG9uZz4gX2tleTU3MTsKKyAgICAgICAgICBOb2RlSW5mbyBfdmFsNTcyOworICAgICAgICAgIGZvciAoaW50IF9pNTczID0gMDsgX2k1NzMgPCBfbWFwNTcwLnNpemU7ICsrX2k1NzMpCiAgICAgICAgICAgewogICAgICAgICAgICAgewotICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTGlzdCBfbGlzdDQyNCA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTGlzdChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JNjQsIGlwcm90LnJlYWRJMzIoKSk7Ci0gICAgICAgICAgICAgIF9rZXk0MjEgPSBuZXcgQXJyYXlMaXN0PExvbmc+KF9saXN0NDI0LnNpemUpOwotICAgICAgICAgICAgICBsb25nIF9lbGVtNDI1OwotICAgICAgICAgICAgICBmb3IgKGludCBfaTQyNiA9IDA7IF9pNDI2IDwgX2xpc3Q0MjQuc2l6ZTsgKytfaTQyNikKKyAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVExpc3QgX2xpc3Q1NzQgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVExpc3Qob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTY0LCBpcHJvdC5yZWFkSTMyKCkpOworICAgICAgICAgICAgICBfa2V5NTcxID0gbmV3IEFycmF5TGlzdDxMb25nPihfbGlzdDU3NC5zaXplKTsKKyAgICAgICAgICAgICAgbG9uZyBfZWxlbTU3NTsKKyAgICAgICAgICAgICAgZm9yIChpbnQgX2k1NzYgPSAwOyBfaTU3NiA8IF9saXN0NTc0LnNpemU7ICsrX2k1NzYpCiAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfZWxlbTQyNSA9IGlwcm90LnJlYWRJNjQoKTsKLSAgICAgICAgICAgICAgICBfa2V5NDIxLmFkZChfZWxlbTQyNSk7CisgICAgICAgICAgICAgICAgX2VsZW01NzUgPSBpcHJvdC5yZWFkSTY0KCk7CisgICAgICAgICAgICAgICAgX2tleTU3MS5hZGQoX2VsZW01NzUpOwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBfdmFsNDIyID0gbmV3IE5vZGVJbmZvKCk7Ci0gICAgICAgICAgICBfdmFsNDIyLnJlYWQoaXByb3QpOwotICAgICAgICAgICAgc3RydWN0LmV4ZWN1dG9yX25vZGVfcG9ydC5wdXQoX2tleTQyMSwgX3ZhbDQyMik7CisgICAgICAgICAgICBfdmFsNTcyID0gbmV3IE5vZGVJbmZvKCk7CisgICAgICAgICAgICBfdmFsNTcyLnJlYWQoaXByb3QpOworICAgICAgICAgICAgc3RydWN0LmV4ZWN1dG9yX25vZGVfcG9ydC5wdXQoX2tleTU3MSwgX3ZhbDU3Mik7CiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHN0cnVjdC5zZXRfZXhlY3V0b3Jfbm9kZV9wb3J0X2lzU2V0KHRydWUpOwogICAgICAgfQogICAgICAgaWYgKGluY29taW5nLmdldCgyKSkgewogICAgICAgICB7Ci0gICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwNDI3ID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTElTVCwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTY0LCBpcHJvdC5yZWFkSTMyKCkpOwotICAgICAgICAgIHN0cnVjdC5leGVjdXRvcl9zdGFydF90aW1lX3NlY3MgPSBuZXcgSGFzaE1hcDxMaXN0PExvbmc+LExvbmc+KDIqX21hcDQyNy5zaXplKTsKLSAgICAgICAgICBMaXN0PExvbmc+IF9rZXk0Mjg7Ci0gICAgICAgICAgbG9uZyBfdmFsNDI5OwotICAgICAgICAgIGZvciAoaW50IF9pNDMwID0gMDsgX2k0MzAgPCBfbWFwNDI3LnNpemU7ICsrX2k0MzApCisgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwNTc3ID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTElTVCwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTY0LCBpcHJvdC5yZWFkSTMyKCkpOworICAgICAgICAgIHN0cnVjdC5leGVjdXRvcl9zdGFydF90aW1lX3NlY3MgPSBuZXcgSGFzaE1hcDxMaXN0PExvbmc+LExvbmc+KDIqX21hcDU3Ny5zaXplKTsKKyAgICAgICAgICBMaXN0PExvbmc+IF9rZXk1Nzg7CisgICAgICAgICAgbG9uZyBfdmFsNTc5OworICAgICAgICAgIGZvciAoaW50IF9pNTgwID0gMDsgX2k1ODAgPCBfbWFwNTc3LnNpemU7ICsrX2k1ODApCiAgICAgICAgICAgewogICAgICAgICAgICAgewotICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTGlzdCBfbGlzdDQzMSA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTGlzdChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JNjQsIGlwcm90LnJlYWRJMzIoKSk7Ci0gICAgICAgICAgICAgIF9rZXk0MjggPSBuZXcgQXJyYXlMaXN0PExvbmc+KF9saXN0NDMxLnNpemUpOwotICAgICAgICAgICAgICBsb25nIF9lbGVtNDMyOwotICAgICAgICAgICAgICBmb3IgKGludCBfaTQzMyA9IDA7IF9pNDMzIDwgX2xpc3Q0MzEuc2l6ZTsgKytfaTQzMykKKyAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVExpc3QgX2xpc3Q1ODEgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVExpc3Qob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTY0LCBpcHJvdC5yZWFkSTMyKCkpOworICAgICAgICAgICAgICBfa2V5NTc4ID0gbmV3IEFycmF5TGlzdDxMb25nPihfbGlzdDU4MS5zaXplKTsKKyAgICAgICAgICAgICAgbG9uZyBfZWxlbTU4MjsKKyAgICAgICAgICAgICAgZm9yIChpbnQgX2k1ODMgPSAwOyBfaTU4MyA8IF9saXN0NTgxLnNpemU7ICsrX2k1ODMpCiAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfZWxlbTQzMiA9IGlwcm90LnJlYWRJNjQoKTsKLSAgICAgICAgICAgICAgICBfa2V5NDI4LmFkZChfZWxlbTQzMik7CisgICAgICAgICAgICAgICAgX2VsZW01ODIgPSBpcHJvdC5yZWFkSTY0KCk7CisgICAgICAgICAgICAgICAgX2tleTU3OC5hZGQoX2VsZW01ODIpOwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBfdmFsNDI5ID0gaXByb3QucmVhZEk2NCgpOwotICAgICAgICAgICAgc3RydWN0LmV4ZWN1dG9yX3N0YXJ0X3RpbWVfc2Vjcy5wdXQoX2tleTQyOCwgX3ZhbDQyOSk7CisgICAgICAgICAgICBfdmFsNTc5ID0gaXByb3QucmVhZEk2NCgpOworICAgICAgICAgICAgc3RydWN0LmV4ZWN1dG9yX3N0YXJ0X3RpbWVfc2Vjcy5wdXQoX2tleTU3OCwgX3ZhbDU3OSk7CiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHN0cnVjdC5zZXRfZXhlY3V0b3Jfc3RhcnRfdGltZV9zZWNzX2lzU2V0KHRydWUpOwogICAgICAgfQorICAgICAgaWYgKGluY29taW5nLmdldCgzKSkgeworICAgICAgICB7CisgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwNTg0ID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNULCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIGlwcm90LnJlYWRJMzIoKSk7CisgICAgICAgICAgc3RydWN0Lndvcmtlcl9yZXNvdXJjZXMgPSBuZXcgSGFzaE1hcDxOb2RlSW5mbyxXb3JrZXJSZXNvdXJjZXM+KDIqX21hcDU4NC5zaXplKTsKKyAgICAgICAgICBOb2RlSW5mbyBfa2V5NTg1OworICAgICAgICAgIFdvcmtlclJlc291cmNlcyBfdmFsNTg2OworICAgICAgICAgIGZvciAoaW50IF9pNTg3ID0gMDsgX2k1ODcgPCBfbWFwNTg0LnNpemU7ICsrX2k1ODcpCisgICAgICAgICAgeworICAgICAgICAgICAgX2tleTU4NSA9IG5ldyBOb2RlSW5mbygpOworICAgICAgICAgICAgX2tleTU4NS5yZWFkKGlwcm90KTsKKyAgICAgICAgICAgIF92YWw1ODYgPSBuZXcgV29ya2VyUmVzb3VyY2VzKCk7CisgICAgICAgICAgICBfdmFsNTg2LnJlYWQoaXByb3QpOworICAgICAgICAgICAgc3RydWN0Lndvcmtlcl9yZXNvdXJjZXMucHV0KF9rZXk1ODUsIF92YWw1ODYpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdHJ1Y3Quc2V0X3dvcmtlcl9yZXNvdXJjZXNfaXNTZXQodHJ1ZSk7CisgICAgICB9CiAgICAgfQogICB9CiAKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvQXV0aG9yaXphdGlvbkV4Y2VwdGlvbi5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9BdXRob3JpemF0aW9uRXhjZXB0aW9uLmphdmEKaW5kZXggYTE3OTc1MS4uYzRiZjA1MyAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9BdXRob3JpemF0aW9uRXhjZXB0aW9uLmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9BdXRob3JpemF0aW9uRXhjZXB0aW9uLmphdmEKQEAgLTE2LDcgKzE2LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAvKioKLSAqIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMikKKyAqIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMykKICAqCiAgKiBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HCiAgKiAgQGdlbmVyYXRlZApAQCAtNTEsNyArNTEsNyBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCiBAU3VwcHJlc3NXYXJuaW5ncyh7ImNhc3QiLCAicmF3dHlwZXMiLCAic2VyaWFsIiwgInVuY2hlY2tlZCJ9KQotQEdlbmVyYXRlZCh2YWx1ZSA9ICJBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjIpIiwgZGF0ZSA9ICIyMDE1LTItNiIpCitAR2VuZXJhdGVkKHZhbHVlID0gIkF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMykiKQogcHVibGljIGNsYXNzIEF1dGhvcml6YXRpb25FeGNlcHRpb24gZXh0ZW5kcyBURXhjZXB0aW9uIGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2U8QXV0aG9yaXphdGlvbkV4Y2VwdGlvbiwgQXV0aG9yaXphdGlvbkV4Y2VwdGlvbi5fRmllbGRzPiwgamF2YS5pby5TZXJpYWxpemFibGUsIENsb25lYWJsZSwgQ29tcGFyYWJsZTxBdXRob3JpemF0aW9uRXhjZXB0aW9uPiB7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QgU1RSVUNUX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdCgiQXV0aG9yaXphdGlvbkV4Y2VwdGlvbiIpOwogCmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL0JvbHQuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvQm9sdC5qYXZhCmluZGV4IDg2MTIyNmMuLmRmMWEwMDcgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvQm9sdC5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvQm9sdC5qYXZhCkBAIC0xNiw3ICsxNiw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogLyoqCi0gKiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjIpCisgKiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjMpCiAgKgogICogRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lORwogICogIEBnZW5lcmF0ZWQKQEAgLTUxLDcgKzUxLDcgQEAKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAogQFN1cHByZXNzV2FybmluZ3MoeyJjYXN0IiwgInJhd3R5cGVzIiwgInNlcmlhbCIsICJ1bmNoZWNrZWQifSkKLUBHZW5lcmF0ZWQodmFsdWUgPSAiQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4yKSIsIGRhdGUgPSAiMjAxNS0yLTYiKQorQEdlbmVyYXRlZCh2YWx1ZSA9ICJBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjMpIikKIHB1YmxpYyBjbGFzcyBCb2x0IGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2U8Qm9sdCwgQm9sdC5fRmllbGRzPiwgamF2YS5pby5TZXJpYWxpemFibGUsIENsb25lYWJsZSwgQ29tcGFyYWJsZTxCb2x0PiB7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QgU1RSVUNUX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdCgiQm9sdCIpOwogCmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL0JvbHRBZ2dyZWdhdGVTdGF0cy5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9Cb2x0QWdncmVnYXRlU3RhdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjFmM2ZiCi0tLSAvZGV2L251bGwKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9Cb2x0QWdncmVnYXRlU3RhdHMuamF2YQpAQCAtMCwwICsxLDcwNCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8qKgorICogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4zKQorICoKKyAqIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkcKKyAqICBAZ2VuZXJhdGVkCisgKi8KK3BhY2thZ2UgYmFja3R5cGUuc3Rvcm0uZ2VuZXJhdGVkOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLklTY2hlbWU7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLlNjaGVtZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLlN0YW5kYXJkU2NoZW1lOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLlR1cGxlU2NoZW1lOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUdXBsZVByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5FbmNvZGluZ1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuQXN5bmNNZXRob2RDYWxsYmFjazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlci4qOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bU1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuQml0U2V0OworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLkdlbmVyYXRlZDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitAU3VwcHJlc3NXYXJuaW5ncyh7ImNhc3QiLCAicmF3dHlwZXMiLCAic2VyaWFsIiwgInVuY2hlY2tlZCJ9KQorQEdlbmVyYXRlZCh2YWx1ZSA9ICJBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjMpIikKK3B1YmxpYyBjbGFzcyBCb2x0QWdncmVnYXRlU3RhdHMgaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZTxCb2x0QWdncmVnYXRlU3RhdHMsIEJvbHRBZ2dyZWdhdGVTdGF0cy5fRmllbGRzPiwgamF2YS5pby5TZXJpYWxpemFibGUsIENsb25lYWJsZSwgQ29tcGFyYWJsZTxCb2x0QWdncmVnYXRlU3RhdHM+IHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdCBTVFJVQ1RfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0KCJCb2x0QWdncmVnYXRlU3RhdHMiKTsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgRVhFQ1VURV9MQVRFTkNZX01TX0ZJRUxEX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkKCJleGVjdXRlX2xhdGVuY3lfbXMiLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5ET1VCTEUsIChzaG9ydCkxKTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIFBST0NFU1NfTEFURU5DWV9NU19GSUVMRF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCgicHJvY2Vzc19sYXRlbmN5X21zIiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuRE9VQkxFLCAoc2hvcnQpMik7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBFWEVDVVRFRF9GSUVMRF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCgiZXhlY3V0ZWQiLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JNjQsIChzaG9ydCkzKTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIENBUEFDSVRZX0ZJRUxEX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkKCJjYXBhY2l0eSIsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkRPVUJMRSwgKHNob3J0KTQpOworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxDbGFzczw/IGV4dGVuZHMgSVNjaGVtZT4sIFNjaGVtZUZhY3Rvcnk+IHNjaGVtZXMgPSBuZXcgSGFzaE1hcDxDbGFzczw/IGV4dGVuZHMgSVNjaGVtZT4sIFNjaGVtZUZhY3Rvcnk+KCk7CisgIHN0YXRpYyB7CisgICAgc2NoZW1lcy5wdXQoU3RhbmRhcmRTY2hlbWUuY2xhc3MsIG5ldyBCb2x0QWdncmVnYXRlU3RhdHNTdGFuZGFyZFNjaGVtZUZhY3RvcnkoKSk7CisgICAgc2NoZW1lcy5wdXQoVHVwbGVTY2hlbWUuY2xhc3MsIG5ldyBCb2x0QWdncmVnYXRlU3RhdHNUdXBsZVNjaGVtZUZhY3RvcnkoKSk7CisgIH0KKworICBwcml2YXRlIGRvdWJsZSBleGVjdXRlX2xhdGVuY3lfbXM7IC8vIG9wdGlvbmFsCisgIHByaXZhdGUgZG91YmxlIHByb2Nlc3NfbGF0ZW5jeV9tczsgLy8gb3B0aW9uYWwKKyAgcHJpdmF0ZSBsb25nIGV4ZWN1dGVkOyAvLyBvcHRpb25hbAorICBwcml2YXRlIGRvdWJsZSBjYXBhY2l0eTsgLy8gb3B0aW9uYWwKKworICAvKiogVGhlIHNldCBvZiBmaWVsZHMgdGhpcyBzdHJ1Y3QgY29udGFpbnMsIGFsb25nIHdpdGggY29udmVuaWVuY2UgbWV0aG9kcyBmb3IgZmluZGluZyBhbmQgbWFuaXB1bGF0aW5nIHRoZW0uICovCisgIHB1YmxpYyBlbnVtIF9GaWVsZHMgaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRJZEVudW0geworICAgIEVYRUNVVEVfTEFURU5DWV9NUygoc2hvcnQpMSwgImV4ZWN1dGVfbGF0ZW5jeV9tcyIpLAorICAgIFBST0NFU1NfTEFURU5DWV9NUygoc2hvcnQpMiwgInByb2Nlc3NfbGF0ZW5jeV9tcyIpLAorICAgIEVYRUNVVEVEKChzaG9ydCkzLCAiZXhlY3V0ZWQiKSwKKyAgICBDQVBBQ0lUWSgoc2hvcnQpNCwgImNhcGFjaXR5Iik7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBfRmllbGRzPiBieU5hbWUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIF9GaWVsZHM+KCk7CisKKyAgICBzdGF0aWMgeworICAgICAgZm9yIChfRmllbGRzIGZpZWxkIDogRW51bVNldC5hbGxPZihfRmllbGRzLmNsYXNzKSkgeworICAgICAgICBieU5hbWUucHV0KGZpZWxkLmdldEZpZWxkTmFtZSgpLCBmaWVsZCk7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCB0aGUgX0ZpZWxkcyBjb25zdGFudCB0aGF0IG1hdGNoZXMgZmllbGRJZCwgb3IgbnVsbCBpZiBpdHMgbm90IGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgX0ZpZWxkcyBmaW5kQnlUaHJpZnRJZChpbnQgZmllbGRJZCkgeworICAgICAgc3dpdGNoKGZpZWxkSWQpIHsKKyAgICAgICAgY2FzZSAxOiAvLyBFWEVDVVRFX0xBVEVOQ1lfTVMKKyAgICAgICAgICByZXR1cm4gRVhFQ1VURV9MQVRFTkNZX01TOworICAgICAgICBjYXNlIDI6IC8vIFBST0NFU1NfTEFURU5DWV9NUworICAgICAgICAgIHJldHVybiBQUk9DRVNTX0xBVEVOQ1lfTVM7CisgICAgICAgIGNhc2UgMzogLy8gRVhFQ1VURUQKKyAgICAgICAgICByZXR1cm4gRVhFQ1VURUQ7CisgICAgICAgIGNhc2UgNDogLy8gQ0FQQUNJVFkKKyAgICAgICAgICByZXR1cm4gQ0FQQUNJVFk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCB0aGUgX0ZpZWxkcyBjb25zdGFudCB0aGF0IG1hdGNoZXMgZmllbGRJZCwgdGhyb3dpbmcgYW4gZXhjZXB0aW9uCisgICAgICogaWYgaXQgaXMgbm90IGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgX0ZpZWxkcyBmaW5kQnlUaHJpZnRJZE9yVGhyb3coaW50IGZpZWxkSWQpIHsKKyAgICAgIF9GaWVsZHMgZmllbGRzID0gZmluZEJ5VGhyaWZ0SWQoZmllbGRJZCk7CisgICAgICBpZiAoZmllbGRzID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkZpZWxkICIgKyBmaWVsZElkICsgIiBkb2Vzbid0IGV4aXN0ISIpOworICAgICAgcmV0dXJuIGZpZWxkczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kIHRoZSBfRmllbGRzIGNvbnN0YW50IHRoYXQgbWF0Y2hlcyBuYW1lLCBvciBudWxsIGlmIGl0cyBub3QgZm91bmQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBfRmllbGRzIGZpbmRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgIHJldHVybiBieU5hbWUuZ2V0KG5hbWUpOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgc2hvcnQgX3RocmlmdElkOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIF9maWVsZE5hbWU7CisKKyAgICBfRmllbGRzKHNob3J0IHRocmlmdElkLCBTdHJpbmcgZmllbGROYW1lKSB7CisgICAgICBfdGhyaWZ0SWQgPSB0aHJpZnRJZDsKKyAgICAgIF9maWVsZE5hbWUgPSBmaWVsZE5hbWU7CisgICAgfQorCisgICAgcHVibGljIHNob3J0IGdldFRocmlmdEZpZWxkSWQoKSB7CisgICAgICByZXR1cm4gX3RocmlmdElkOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmllbGROYW1lKCkgeworICAgICAgcmV0dXJuIF9maWVsZE5hbWU7CisgICAgfQorICB9CisKKyAgLy8gaXNzZXQgaWQgYXNzaWdubWVudHMKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IF9fRVhFQ1VURV9MQVRFTkNZX01TX0lTU0VUX0lEID0gMDsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IF9fUFJPQ0VTU19MQVRFTkNZX01TX0lTU0VUX0lEID0gMTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IF9fRVhFQ1VURURfSVNTRVRfSUQgPSAyOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgX19DQVBBQ0lUWV9JU1NFVF9JRCA9IDM7CisgIHByaXZhdGUgYnl0ZSBfX2lzc2V0X2JpdGZpZWxkID0gMDsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgX0ZpZWxkcyBvcHRpb25hbHNbXSA9IHtfRmllbGRzLkVYRUNVVEVfTEFURU5DWV9NUyxfRmllbGRzLlBST0NFU1NfTEFURU5DWV9NUyxfRmllbGRzLkVYRUNVVEVELF9GaWVsZHMuQ0FQQUNJVFl9OworICBwdWJsaWMgc3RhdGljIGZpbmFsIE1hcDxfRmllbGRzLCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YT4gbWV0YURhdGFNYXA7CisgIHN0YXRpYyB7CisgICAgTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPiB0bXBNYXAgPSBuZXcgRW51bU1hcDxfRmllbGRzLCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YT4oX0ZpZWxkcy5jbGFzcyk7CisgICAgdG1wTWFwLnB1dChfRmllbGRzLkVYRUNVVEVfTEFURU5DWV9NUywgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhKCJleGVjdXRlX2xhdGVuY3lfbXMiLCBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRSZXF1aXJlbWVudFR5cGUuT1BUSU9OQUwsIAorICAgICAgICBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkVmFsdWVNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5ET1VCTEUpKSk7CisgICAgdG1wTWFwLnB1dChfRmllbGRzLlBST0NFU1NfTEFURU5DWV9NUywgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhKCJwcm9jZXNzX2xhdGVuY3lfbXMiLCBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRSZXF1aXJlbWVudFR5cGUuT1BUSU9OQUwsIAorICAgICAgICBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkVmFsdWVNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5ET1VCTEUpKSk7CisgICAgdG1wTWFwLnB1dChfRmllbGRzLkVYRUNVVEVELCBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEoImV4ZWN1dGVkIiwgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLk9QVElPTkFMLCAKKyAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZFZhbHVlTWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTY0KSkpOworICAgIHRtcE1hcC5wdXQoX0ZpZWxkcy5DQVBBQ0lUWSwgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhKCJjYXBhY2l0eSIsIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZFJlcXVpcmVtZW50VHlwZS5PUFRJT05BTCwgCisgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRWYWx1ZU1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkRPVUJMRSkpKTsKKyAgICBtZXRhRGF0YU1hcCA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcCh0bXBNYXApOworICAgIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhLmFkZFN0cnVjdE1ldGFEYXRhTWFwKEJvbHRBZ2dyZWdhdGVTdGF0cy5jbGFzcywgbWV0YURhdGFNYXApOworICB9CisKKyAgcHVibGljIEJvbHRBZ2dyZWdhdGVTdGF0cygpIHsKKyAgfQorCisgIC8qKgorICAgKiBQZXJmb3JtcyBhIGRlZXAgY29weSBvbiA8aT5vdGhlcjwvaT4uCisgICAqLworICBwdWJsaWMgQm9sdEFnZ3JlZ2F0ZVN0YXRzKEJvbHRBZ2dyZWdhdGVTdGF0cyBvdGhlcikgeworICAgIF9faXNzZXRfYml0ZmllbGQgPSBvdGhlci5fX2lzc2V0X2JpdGZpZWxkOworICAgIHRoaXMuZXhlY3V0ZV9sYXRlbmN5X21zID0gb3RoZXIuZXhlY3V0ZV9sYXRlbmN5X21zOworICAgIHRoaXMucHJvY2Vzc19sYXRlbmN5X21zID0gb3RoZXIucHJvY2Vzc19sYXRlbmN5X21zOworICAgIHRoaXMuZXhlY3V0ZWQgPSBvdGhlci5leGVjdXRlZDsKKyAgICB0aGlzLmNhcGFjaXR5ID0gb3RoZXIuY2FwYWNpdHk7CisgIH0KKworICBwdWJsaWMgQm9sdEFnZ3JlZ2F0ZVN0YXRzIGRlZXBDb3B5KCkgeworICAgIHJldHVybiBuZXcgQm9sdEFnZ3JlZ2F0ZVN0YXRzKHRoaXMpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgIHNldF9leGVjdXRlX2xhdGVuY3lfbXNfaXNTZXQoZmFsc2UpOworICAgIHRoaXMuZXhlY3V0ZV9sYXRlbmN5X21zID0gMC4wOworICAgIHNldF9wcm9jZXNzX2xhdGVuY3lfbXNfaXNTZXQoZmFsc2UpOworICAgIHRoaXMucHJvY2Vzc19sYXRlbmN5X21zID0gMC4wOworICAgIHNldF9leGVjdXRlZF9pc1NldChmYWxzZSk7CisgICAgdGhpcy5leGVjdXRlZCA9IDA7CisgICAgc2V0X2NhcGFjaXR5X2lzU2V0KGZhbHNlKTsKKyAgICB0aGlzLmNhcGFjaXR5ID0gMC4wOworICB9CisKKyAgcHVibGljIGRvdWJsZSBnZXRfZXhlY3V0ZV9sYXRlbmN5X21zKCkgeworICAgIHJldHVybiB0aGlzLmV4ZWN1dGVfbGF0ZW5jeV9tczsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF9leGVjdXRlX2xhdGVuY3lfbXMoZG91YmxlIGV4ZWN1dGVfbGF0ZW5jeV9tcykgeworICAgIHRoaXMuZXhlY3V0ZV9sYXRlbmN5X21zID0gZXhlY3V0ZV9sYXRlbmN5X21zOworICAgIHNldF9leGVjdXRlX2xhdGVuY3lfbXNfaXNTZXQodHJ1ZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB1bnNldF9leGVjdXRlX2xhdGVuY3lfbXMoKSB7CisgICAgX19pc3NldF9iaXRmaWVsZCA9IEVuY29kaW5nVXRpbHMuY2xlYXJCaXQoX19pc3NldF9iaXRmaWVsZCwgX19FWEVDVVRFX0xBVEVOQ1lfTVNfSVNTRVRfSUQpOworICB9CisKKyAgLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBleGVjdXRlX2xhdGVuY3lfbXMgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgIHB1YmxpYyBib29sZWFuIGlzX3NldF9leGVjdXRlX2xhdGVuY3lfbXMoKSB7CisgICAgcmV0dXJuIEVuY29kaW5nVXRpbHMudGVzdEJpdChfX2lzc2V0X2JpdGZpZWxkLCBfX0VYRUNVVEVfTEFURU5DWV9NU19JU1NFVF9JRCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfZXhlY3V0ZV9sYXRlbmN5X21zX2lzU2V0KGJvb2xlYW4gdmFsdWUpIHsKKyAgICBfX2lzc2V0X2JpdGZpZWxkID0gRW5jb2RpbmdVdGlscy5zZXRCaXQoX19pc3NldF9iaXRmaWVsZCwgX19FWEVDVVRFX0xBVEVOQ1lfTVNfSVNTRVRfSUQsIHZhbHVlKTsKKyAgfQorCisgIHB1YmxpYyBkb3VibGUgZ2V0X3Byb2Nlc3NfbGF0ZW5jeV9tcygpIHsKKyAgICByZXR1cm4gdGhpcy5wcm9jZXNzX2xhdGVuY3lfbXM7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfcHJvY2Vzc19sYXRlbmN5X21zKGRvdWJsZSBwcm9jZXNzX2xhdGVuY3lfbXMpIHsKKyAgICB0aGlzLnByb2Nlc3NfbGF0ZW5jeV9tcyA9IHByb2Nlc3NfbGF0ZW5jeV9tczsKKyAgICBzZXRfcHJvY2Vzc19sYXRlbmN5X21zX2lzU2V0KHRydWUpOworICB9CisKKyAgcHVibGljIHZvaWQgdW5zZXRfcHJvY2Vzc19sYXRlbmN5X21zKCkgeworICAgIF9faXNzZXRfYml0ZmllbGQgPSBFbmNvZGluZ1V0aWxzLmNsZWFyQml0KF9faXNzZXRfYml0ZmllbGQsIF9fUFJPQ0VTU19MQVRFTkNZX01TX0lTU0VUX0lEKTsKKyAgfQorCisgIC8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgcHJvY2Vzc19sYXRlbmN5X21zIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLworICBwdWJsaWMgYm9vbGVhbiBpc19zZXRfcHJvY2Vzc19sYXRlbmN5X21zKCkgeworICAgIHJldHVybiBFbmNvZGluZ1V0aWxzLnRlc3RCaXQoX19pc3NldF9iaXRmaWVsZCwgX19QUk9DRVNTX0xBVEVOQ1lfTVNfSVNTRVRfSUQpOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X3Byb2Nlc3NfbGF0ZW5jeV9tc19pc1NldChib29sZWFuIHZhbHVlKSB7CisgICAgX19pc3NldF9iaXRmaWVsZCA9IEVuY29kaW5nVXRpbHMuc2V0Qml0KF9faXNzZXRfYml0ZmllbGQsIF9fUFJPQ0VTU19MQVRFTkNZX01TX0lTU0VUX0lELCB2YWx1ZSk7CisgIH0KKworICBwdWJsaWMgbG9uZyBnZXRfZXhlY3V0ZWQoKSB7CisgICAgcmV0dXJuIHRoaXMuZXhlY3V0ZWQ7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfZXhlY3V0ZWQobG9uZyBleGVjdXRlZCkgeworICAgIHRoaXMuZXhlY3V0ZWQgPSBleGVjdXRlZDsKKyAgICBzZXRfZXhlY3V0ZWRfaXNTZXQodHJ1ZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB1bnNldF9leGVjdXRlZCgpIHsKKyAgICBfX2lzc2V0X2JpdGZpZWxkID0gRW5jb2RpbmdVdGlscy5jbGVhckJpdChfX2lzc2V0X2JpdGZpZWxkLCBfX0VYRUNVVEVEX0lTU0VUX0lEKTsKKyAgfQorCisgIC8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgZXhlY3V0ZWQgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgIHB1YmxpYyBib29sZWFuIGlzX3NldF9leGVjdXRlZCgpIHsKKyAgICByZXR1cm4gRW5jb2RpbmdVdGlscy50ZXN0Qml0KF9faXNzZXRfYml0ZmllbGQsIF9fRVhFQ1VURURfSVNTRVRfSUQpOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X2V4ZWN1dGVkX2lzU2V0KGJvb2xlYW4gdmFsdWUpIHsKKyAgICBfX2lzc2V0X2JpdGZpZWxkID0gRW5jb2RpbmdVdGlscy5zZXRCaXQoX19pc3NldF9iaXRmaWVsZCwgX19FWEVDVVRFRF9JU1NFVF9JRCwgdmFsdWUpOworICB9CisKKyAgcHVibGljIGRvdWJsZSBnZXRfY2FwYWNpdHkoKSB7CisgICAgcmV0dXJuIHRoaXMuY2FwYWNpdHk7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfY2FwYWNpdHkoZG91YmxlIGNhcGFjaXR5KSB7CisgICAgdGhpcy5jYXBhY2l0eSA9IGNhcGFjaXR5OworICAgIHNldF9jYXBhY2l0eV9pc1NldCh0cnVlKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHVuc2V0X2NhcGFjaXR5KCkgeworICAgIF9faXNzZXRfYml0ZmllbGQgPSBFbmNvZGluZ1V0aWxzLmNsZWFyQml0KF9faXNzZXRfYml0ZmllbGQsIF9fQ0FQQUNJVFlfSVNTRVRfSUQpOworICB9CisKKyAgLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBjYXBhY2l0eSBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNfc2V0X2NhcGFjaXR5KCkgeworICAgIHJldHVybiBFbmNvZGluZ1V0aWxzLnRlc3RCaXQoX19pc3NldF9iaXRmaWVsZCwgX19DQVBBQ0lUWV9JU1NFVF9JRCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfY2FwYWNpdHlfaXNTZXQoYm9vbGVhbiB2YWx1ZSkgeworICAgIF9faXNzZXRfYml0ZmllbGQgPSBFbmNvZGluZ1V0aWxzLnNldEJpdChfX2lzc2V0X2JpdGZpZWxkLCBfX0NBUEFDSVRZX0lTU0VUX0lELCB2YWx1ZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRGaWVsZFZhbHVlKF9GaWVsZHMgZmllbGQsIE9iamVjdCB2YWx1ZSkgeworICAgIHN3aXRjaCAoZmllbGQpIHsKKyAgICBjYXNlIEVYRUNVVEVfTEFURU5DWV9NUzoKKyAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgIHVuc2V0X2V4ZWN1dGVfbGF0ZW5jeV9tcygpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2V0X2V4ZWN1dGVfbGF0ZW5jeV9tcygoRG91YmxlKXZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBQUk9DRVNTX0xBVEVOQ1lfTVM6CisgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICB1bnNldF9wcm9jZXNzX2xhdGVuY3lfbXMoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNldF9wcm9jZXNzX2xhdGVuY3lfbXMoKERvdWJsZSl2YWx1ZSk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgRVhFQ1VURUQ6CisgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICB1bnNldF9leGVjdXRlZCgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2V0X2V4ZWN1dGVkKChMb25nKXZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBDQVBBQ0lUWToKKyAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgIHVuc2V0X2NhcGFjaXR5KCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzZXRfY2FwYWNpdHkoKERvdWJsZSl2YWx1ZSk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIH0KKyAgfQorCisgIHB1YmxpYyBPYmplY3QgZ2V0RmllbGRWYWx1ZShfRmllbGRzIGZpZWxkKSB7CisgICAgc3dpdGNoIChmaWVsZCkgeworICAgIGNhc2UgRVhFQ1VURV9MQVRFTkNZX01TOgorICAgICAgcmV0dXJuIGdldF9leGVjdXRlX2xhdGVuY3lfbXMoKTsKKworICAgIGNhc2UgUFJPQ0VTU19MQVRFTkNZX01TOgorICAgICAgcmV0dXJuIGdldF9wcm9jZXNzX2xhdGVuY3lfbXMoKTsKKworICAgIGNhc2UgRVhFQ1VURUQ6CisgICAgICByZXR1cm4gZ2V0X2V4ZWN1dGVkKCk7CisKKyAgICBjYXNlIENBUEFDSVRZOgorICAgICAgcmV0dXJuIGdldF9jYXBhY2l0eSgpOworCisgICAgfQorICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgfQorCisgIC8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgY29ycmVzcG9uZGluZyB0byBmaWVsZElEIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLworICBwdWJsaWMgYm9vbGVhbiBpc1NldChfRmllbGRzIGZpZWxkKSB7CisgICAgaWYgKGZpZWxkID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGZpZWxkKSB7CisgICAgY2FzZSBFWEVDVVRFX0xBVEVOQ1lfTVM6CisgICAgICByZXR1cm4gaXNfc2V0X2V4ZWN1dGVfbGF0ZW5jeV9tcygpOworICAgIGNhc2UgUFJPQ0VTU19MQVRFTkNZX01TOgorICAgICAgcmV0dXJuIGlzX3NldF9wcm9jZXNzX2xhdGVuY3lfbXMoKTsKKyAgICBjYXNlIEVYRUNVVEVEOgorICAgICAgcmV0dXJuIGlzX3NldF9leGVjdXRlZCgpOworICAgIGNhc2UgQ0FQQUNJVFk6CisgICAgICByZXR1cm4gaXNfc2V0X2NhcGFjaXR5KCk7CisgICAgfQorICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IHRoYXQpIHsKKyAgICBpZiAodGhhdCA9PSBudWxsKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmICh0aGF0IGluc3RhbmNlb2YgQm9sdEFnZ3JlZ2F0ZVN0YXRzKQorICAgICAgcmV0dXJuIHRoaXMuZXF1YWxzKChCb2x0QWdncmVnYXRlU3RhdHMpdGhhdCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gZXF1YWxzKEJvbHRBZ2dyZWdhdGVTdGF0cyB0aGF0KSB7CisgICAgaWYgKHRoYXQgPT0gbnVsbCkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGJvb2xlYW4gdGhpc19wcmVzZW50X2V4ZWN1dGVfbGF0ZW5jeV9tcyA9IHRydWUgJiYgdGhpcy5pc19zZXRfZXhlY3V0ZV9sYXRlbmN5X21zKCk7CisgICAgYm9vbGVhbiB0aGF0X3ByZXNlbnRfZXhlY3V0ZV9sYXRlbmN5X21zID0gdHJ1ZSAmJiB0aGF0LmlzX3NldF9leGVjdXRlX2xhdGVuY3lfbXMoKTsKKyAgICBpZiAodGhpc19wcmVzZW50X2V4ZWN1dGVfbGF0ZW5jeV9tcyB8fCB0aGF0X3ByZXNlbnRfZXhlY3V0ZV9sYXRlbmN5X21zKSB7CisgICAgICBpZiAoISh0aGlzX3ByZXNlbnRfZXhlY3V0ZV9sYXRlbmN5X21zICYmIHRoYXRfcHJlc2VudF9leGVjdXRlX2xhdGVuY3lfbXMpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBpZiAodGhpcy5leGVjdXRlX2xhdGVuY3lfbXMgIT0gdGhhdC5leGVjdXRlX2xhdGVuY3lfbXMpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sZWFuIHRoaXNfcHJlc2VudF9wcm9jZXNzX2xhdGVuY3lfbXMgPSB0cnVlICYmIHRoaXMuaXNfc2V0X3Byb2Nlc3NfbGF0ZW5jeV9tcygpOworICAgIGJvb2xlYW4gdGhhdF9wcmVzZW50X3Byb2Nlc3NfbGF0ZW5jeV9tcyA9IHRydWUgJiYgdGhhdC5pc19zZXRfcHJvY2Vzc19sYXRlbmN5X21zKCk7CisgICAgaWYgKHRoaXNfcHJlc2VudF9wcm9jZXNzX2xhdGVuY3lfbXMgfHwgdGhhdF9wcmVzZW50X3Byb2Nlc3NfbGF0ZW5jeV9tcykgeworICAgICAgaWYgKCEodGhpc19wcmVzZW50X3Byb2Nlc3NfbGF0ZW5jeV9tcyAmJiB0aGF0X3ByZXNlbnRfcHJvY2Vzc19sYXRlbmN5X21zKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKHRoaXMucHJvY2Vzc19sYXRlbmN5X21zICE9IHRoYXQucHJvY2Vzc19sYXRlbmN5X21zKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbGVhbiB0aGlzX3ByZXNlbnRfZXhlY3V0ZWQgPSB0cnVlICYmIHRoaXMuaXNfc2V0X2V4ZWN1dGVkKCk7CisgICAgYm9vbGVhbiB0aGF0X3ByZXNlbnRfZXhlY3V0ZWQgPSB0cnVlICYmIHRoYXQuaXNfc2V0X2V4ZWN1dGVkKCk7CisgICAgaWYgKHRoaXNfcHJlc2VudF9leGVjdXRlZCB8fCB0aGF0X3ByZXNlbnRfZXhlY3V0ZWQpIHsKKyAgICAgIGlmICghKHRoaXNfcHJlc2VudF9leGVjdXRlZCAmJiB0aGF0X3ByZXNlbnRfZXhlY3V0ZWQpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBpZiAodGhpcy5leGVjdXRlZCAhPSB0aGF0LmV4ZWN1dGVkKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbGVhbiB0aGlzX3ByZXNlbnRfY2FwYWNpdHkgPSB0cnVlICYmIHRoaXMuaXNfc2V0X2NhcGFjaXR5KCk7CisgICAgYm9vbGVhbiB0aGF0X3ByZXNlbnRfY2FwYWNpdHkgPSB0cnVlICYmIHRoYXQuaXNfc2V0X2NhcGFjaXR5KCk7CisgICAgaWYgKHRoaXNfcHJlc2VudF9jYXBhY2l0eSB8fCB0aGF0X3ByZXNlbnRfY2FwYWNpdHkpIHsKKyAgICAgIGlmICghKHRoaXNfcHJlc2VudF9jYXBhY2l0eSAmJiB0aGF0X3ByZXNlbnRfY2FwYWNpdHkpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBpZiAodGhpcy5jYXBhY2l0eSAhPSB0aGF0LmNhcGFjaXR5KQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICBMaXN0PE9iamVjdD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOworCisgICAgYm9vbGVhbiBwcmVzZW50X2V4ZWN1dGVfbGF0ZW5jeV9tcyA9IHRydWUgJiYgKGlzX3NldF9leGVjdXRlX2xhdGVuY3lfbXMoKSk7CisgICAgbGlzdC5hZGQocHJlc2VudF9leGVjdXRlX2xhdGVuY3lfbXMpOworICAgIGlmIChwcmVzZW50X2V4ZWN1dGVfbGF0ZW5jeV9tcykKKyAgICAgIGxpc3QuYWRkKGV4ZWN1dGVfbGF0ZW5jeV9tcyk7CisKKyAgICBib29sZWFuIHByZXNlbnRfcHJvY2Vzc19sYXRlbmN5X21zID0gdHJ1ZSAmJiAoaXNfc2V0X3Byb2Nlc3NfbGF0ZW5jeV9tcygpKTsKKyAgICBsaXN0LmFkZChwcmVzZW50X3Byb2Nlc3NfbGF0ZW5jeV9tcyk7CisgICAgaWYgKHByZXNlbnRfcHJvY2Vzc19sYXRlbmN5X21zKQorICAgICAgbGlzdC5hZGQocHJvY2Vzc19sYXRlbmN5X21zKTsKKworICAgIGJvb2xlYW4gcHJlc2VudF9leGVjdXRlZCA9IHRydWUgJiYgKGlzX3NldF9leGVjdXRlZCgpKTsKKyAgICBsaXN0LmFkZChwcmVzZW50X2V4ZWN1dGVkKTsKKyAgICBpZiAocHJlc2VudF9leGVjdXRlZCkKKyAgICAgIGxpc3QuYWRkKGV4ZWN1dGVkKTsKKworICAgIGJvb2xlYW4gcHJlc2VudF9jYXBhY2l0eSA9IHRydWUgJiYgKGlzX3NldF9jYXBhY2l0eSgpKTsKKyAgICBsaXN0LmFkZChwcmVzZW50X2NhcGFjaXR5KTsKKyAgICBpZiAocHJlc2VudF9jYXBhY2l0eSkKKyAgICAgIGxpc3QuYWRkKGNhcGFjaXR5KTsKKworICAgIHJldHVybiBsaXN0Lmhhc2hDb2RlKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBjb21wYXJlVG8oQm9sdEFnZ3JlZ2F0ZVN0YXRzIG90aGVyKSB7CisgICAgaWYgKCFnZXRDbGFzcygpLmVxdWFscyhvdGhlci5nZXRDbGFzcygpKSkgeworICAgICAgcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpLmNvbXBhcmVUbyhvdGhlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgfQorCisgICAgaW50IGxhc3RDb21wYXJpc29uID0gMDsKKworICAgIGxhc3RDb21wYXJpc29uID0gQm9vbGVhbi52YWx1ZU9mKGlzX3NldF9leGVjdXRlX2xhdGVuY3lfbXMoKSkuY29tcGFyZVRvKG90aGVyLmlzX3NldF9leGVjdXRlX2xhdGVuY3lfbXMoKSk7CisgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICB9CisgICAgaWYgKGlzX3NldF9leGVjdXRlX2xhdGVuY3lfbXMoKSkgeworICAgICAgbGFzdENvbXBhcmlzb24gPSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy5leGVjdXRlX2xhdGVuY3lfbXMsIG90aGVyLmV4ZWN1dGVfbGF0ZW5jeV9tcyk7CisgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICB9CisgICAgfQorICAgIGxhc3RDb21wYXJpc29uID0gQm9vbGVhbi52YWx1ZU9mKGlzX3NldF9wcm9jZXNzX2xhdGVuY3lfbXMoKSkuY29tcGFyZVRvKG90aGVyLmlzX3NldF9wcm9jZXNzX2xhdGVuY3lfbXMoKSk7CisgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICB9CisgICAgaWYgKGlzX3NldF9wcm9jZXNzX2xhdGVuY3lfbXMoKSkgeworICAgICAgbGFzdENvbXBhcmlzb24gPSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy5wcm9jZXNzX2xhdGVuY3lfbXMsIG90aGVyLnByb2Nlc3NfbGF0ZW5jeV9tcyk7CisgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICB9CisgICAgfQorICAgIGxhc3RDb21wYXJpc29uID0gQm9vbGVhbi52YWx1ZU9mKGlzX3NldF9leGVjdXRlZCgpKS5jb21wYXJlVG8ob3RoZXIuaXNfc2V0X2V4ZWN1dGVkKCkpOworICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgfQorICAgIGlmIChpc19zZXRfZXhlY3V0ZWQoKSkgeworICAgICAgbGFzdENvbXBhcmlzb24gPSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy5leGVjdXRlZCwgb3RoZXIuZXhlY3V0ZWQpOworICAgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgICAgfQorICAgIH0KKyAgICBsYXN0Q29tcGFyaXNvbiA9IEJvb2xlYW4udmFsdWVPZihpc19zZXRfY2FwYWNpdHkoKSkuY29tcGFyZVRvKG90aGVyLmlzX3NldF9jYXBhY2l0eSgpKTsKKyAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgIH0KKyAgICBpZiAoaXNfc2V0X2NhcGFjaXR5KCkpIHsKKyAgICAgIGxhc3RDb21wYXJpc29uID0gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29tcGFyZVRvKHRoaXMuY2FwYWNpdHksIG90aGVyLmNhcGFjaXR5KTsKKyAgICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7CisgIH0KKworICBwdWJsaWMgX0ZpZWxkcyBmaWVsZEZvcklkKGludCBmaWVsZElkKSB7CisgICAgcmV0dXJuIF9GaWVsZHMuZmluZEJ5VGhyaWZ0SWQoZmllbGRJZCk7CisgIH0KKworICBwdWJsaWMgdm9pZCByZWFkKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBpcHJvdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgIHNjaGVtZXMuZ2V0KGlwcm90LmdldFNjaGVtZSgpKS5nZXRTY2hlbWUoKS5yZWFkKGlwcm90LCB0aGlzKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgIHNjaGVtZXMuZ2V0KG9wcm90LmdldFNjaGVtZSgpKS5nZXRTY2hlbWUoKS53cml0ZShvcHJvdCwgdGhpcyk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoIkJvbHRBZ2dyZWdhdGVTdGF0cygiKTsKKyAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKKworICAgIGlmIChpc19zZXRfZXhlY3V0ZV9sYXRlbmN5X21zKCkpIHsKKyAgICAgIHNiLmFwcGVuZCgiZXhlY3V0ZV9sYXRlbmN5X21zOiIpOworICAgICAgc2IuYXBwZW5kKHRoaXMuZXhlY3V0ZV9sYXRlbmN5X21zKTsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfQorICAgIGlmIChpc19zZXRfcHJvY2Vzc19sYXRlbmN5X21zKCkpIHsKKyAgICAgIGlmICghZmlyc3QpIHNiLmFwcGVuZCgiLCAiKTsKKyAgICAgIHNiLmFwcGVuZCgicHJvY2Vzc19sYXRlbmN5X21zOiIpOworICAgICAgc2IuYXBwZW5kKHRoaXMucHJvY2Vzc19sYXRlbmN5X21zKTsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfQorICAgIGlmIChpc19zZXRfZXhlY3V0ZWQoKSkgeworICAgICAgaWYgKCFmaXJzdCkgc2IuYXBwZW5kKCIsICIpOworICAgICAgc2IuYXBwZW5kKCJleGVjdXRlZDoiKTsKKyAgICAgIHNiLmFwcGVuZCh0aGlzLmV4ZWN1dGVkKTsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfQorICAgIGlmIChpc19zZXRfY2FwYWNpdHkoKSkgeworICAgICAgaWYgKCFmaXJzdCkgc2IuYXBwZW5kKCIsICIpOworICAgICAgc2IuYXBwZW5kKCJjYXBhY2l0eToiKTsKKyAgICAgIHNiLmFwcGVuZCh0aGlzLmNhcGFjaXR5KTsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfQorICAgIHNiLmFwcGVuZCgiKSIpOworICAgIHJldHVybiBzYi50b1N0cmluZygpOworICB9CisKKyAgcHVibGljIHZvaWQgdmFsaWRhdGUoKSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgLy8gY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcworICAgIC8vIGNoZWNrIGZvciBzdWItc3RydWN0IHZhbGlkaXR5CisgIH0KKworICBwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIHdyaXRlKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQ29tcGFjdFByb3RvY29sKG5ldyBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVElPU3RyZWFtVHJhbnNwb3J0KG91dCkpKTsKKyAgICB9IGNhdGNoIChvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHRlKSB7CisgICAgICB0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbih0ZSk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBpbikgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICAvLyBpdCBkb2Vzbid0IHNlZW0gbGlrZSB5b3Ugc2hvdWxkIGhhdmUgdG8gZG8gdGhpcywgYnV0IGphdmEgc2VyaWFsaXphdGlvbiBpcyB3YWNreSwgYW5kIGRvZXNuJ3QgY2FsbCB0aGUgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICAgIF9faXNzZXRfYml0ZmllbGQgPSAwOworICAgICAgcmVhZChuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbChuZXcgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRJT1N0cmVhbVRyYW5zcG9ydChpbikpKTsKKyAgICB9IGNhdGNoIChvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHRlKSB7CisgICAgICB0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbih0ZSk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQm9sdEFnZ3JlZ2F0ZVN0YXRzU3RhbmRhcmRTY2hlbWVGYWN0b3J5IGltcGxlbWVudHMgU2NoZW1lRmFjdG9yeSB7CisgICAgcHVibGljIEJvbHRBZ2dyZWdhdGVTdGF0c1N0YW5kYXJkU2NoZW1lIGdldFNjaGVtZSgpIHsKKyAgICAgIHJldHVybiBuZXcgQm9sdEFnZ3JlZ2F0ZVN0YXRzU3RhbmRhcmRTY2hlbWUoKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBCb2x0QWdncmVnYXRlU3RhdHNTdGFuZGFyZFNjaGVtZSBleHRlbmRzIFN0YW5kYXJkU2NoZW1lPEJvbHRBZ2dyZWdhdGVTdGF0cz4geworCisgICAgcHVibGljIHZvaWQgcmVhZChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgaXByb3QsIEJvbHRBZ2dyZWdhdGVTdGF0cyBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBzY2hlbWVGaWVsZDsKKyAgICAgIGlwcm90LnJlYWRTdHJ1Y3RCZWdpbigpOworICAgICAgd2hpbGUgKHRydWUpCisgICAgICB7CisgICAgICAgIHNjaGVtZUZpZWxkID0gaXByb3QucmVhZEZpZWxkQmVnaW4oKTsKKyAgICAgICAgaWYgKHNjaGVtZUZpZWxkLnR5cGUgPT0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RPUCkgeyAKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKHNjaGVtZUZpZWxkLmlkKSB7CisgICAgICAgICAgY2FzZSAxOiAvLyBFWEVDVVRFX0xBVEVOQ1lfTVMKKyAgICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkRPVUJMRSkgeworICAgICAgICAgICAgICBzdHJ1Y3QuZXhlY3V0ZV9sYXRlbmN5X21zID0gaXByb3QucmVhZERvdWJsZSgpOworICAgICAgICAgICAgICBzdHJ1Y3Quc2V0X2V4ZWN1dGVfbGF0ZW5jeV9tc19pc1NldCh0cnVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7IAorICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAyOiAvLyBQUk9DRVNTX0xBVEVOQ1lfTVMKKyAgICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkRPVUJMRSkgeworICAgICAgICAgICAgICBzdHJ1Y3QucHJvY2Vzc19sYXRlbmN5X21zID0gaXByb3QucmVhZERvdWJsZSgpOworICAgICAgICAgICAgICBzdHJ1Y3Quc2V0X3Byb2Nlc3NfbGF0ZW5jeV9tc19pc1NldCh0cnVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7IAorICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAzOiAvLyBFWEVDVVRFRAorICAgICAgICAgICAgaWYgKHNjaGVtZUZpZWxkLnR5cGUgPT0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTY0KSB7CisgICAgICAgICAgICAgIHN0cnVjdC5leGVjdXRlZCA9IGlwcm90LnJlYWRJNjQoKTsKKyAgICAgICAgICAgICAgc3RydWN0LnNldF9leGVjdXRlZF9pc1NldCh0cnVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7IAorICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSA0OiAvLyBDQVBBQ0lUWQorICAgICAgICAgICAgaWYgKHNjaGVtZUZpZWxkLnR5cGUgPT0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuRE9VQkxFKSB7CisgICAgICAgICAgICAgIHN0cnVjdC5jYXBhY2l0eSA9IGlwcm90LnJlYWREb3VibGUoKTsKKyAgICAgICAgICAgICAgc3RydWN0LnNldF9jYXBhY2l0eV9pc1NldCh0cnVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7IAorICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgc2NoZW1lRmllbGQudHlwZSk7CisgICAgICAgIH0KKyAgICAgICAgaXByb3QucmVhZEZpZWxkRW5kKCk7CisgICAgICB9CisgICAgICBpcHJvdC5yZWFkU3RydWN0RW5kKCk7CisgICAgICBzdHJ1Y3QudmFsaWRhdGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgb3Byb3QsIEJvbHRBZ2dyZWdhdGVTdGF0cyBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgIHN0cnVjdC52YWxpZGF0ZSgpOworCisgICAgICBvcHJvdC53cml0ZVN0cnVjdEJlZ2luKFNUUlVDVF9ERVNDKTsKKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X2V4ZWN1dGVfbGF0ZW5jeV9tcygpKSB7CisgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihFWEVDVVRFX0xBVEVOQ1lfTVNfRklFTERfREVTQyk7CisgICAgICAgIG9wcm90LndyaXRlRG91YmxlKHN0cnVjdC5leGVjdXRlX2xhdGVuY3lfbXMpOworICAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9wcm9jZXNzX2xhdGVuY3lfbXMoKSkgeworICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oUFJPQ0VTU19MQVRFTkNZX01TX0ZJRUxEX0RFU0MpOworICAgICAgICBvcHJvdC53cml0ZURvdWJsZShzdHJ1Y3QucHJvY2Vzc19sYXRlbmN5X21zKTsKKyAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5pc19zZXRfZXhlY3V0ZWQoKSkgeworICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oRVhFQ1VURURfRklFTERfREVTQyk7CisgICAgICAgIG9wcm90LndyaXRlSTY0KHN0cnVjdC5leGVjdXRlZCk7CisgICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X2NhcGFjaXR5KCkpIHsKKyAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKENBUEFDSVRZX0ZJRUxEX0RFU0MpOworICAgICAgICBvcHJvdC53cml0ZURvdWJsZShzdHJ1Y3QuY2FwYWNpdHkpOworICAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgICB9CisgICAgICBvcHJvdC53cml0ZUZpZWxkU3RvcCgpOworICAgICAgb3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsKKyAgICB9CisKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIEJvbHRBZ2dyZWdhdGVTdGF0c1R1cGxlU2NoZW1lRmFjdG9yeSBpbXBsZW1lbnRzIFNjaGVtZUZhY3RvcnkgeworICAgIHB1YmxpYyBCb2x0QWdncmVnYXRlU3RhdHNUdXBsZVNjaGVtZSBnZXRTY2hlbWUoKSB7CisgICAgICByZXR1cm4gbmV3IEJvbHRBZ2dyZWdhdGVTdGF0c1R1cGxlU2NoZW1lKCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQm9sdEFnZ3JlZ2F0ZVN0YXRzVHVwbGVTY2hlbWUgZXh0ZW5kcyBUdXBsZVNjaGVtZTxCb2x0QWdncmVnYXRlU3RhdHM+IHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBwcm90LCBCb2x0QWdncmVnYXRlU3RhdHMgc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICBUVHVwbGVQcm90b2NvbCBvcHJvdCA9IChUVHVwbGVQcm90b2NvbCkgcHJvdDsKKyAgICAgIEJpdFNldCBvcHRpb25hbHMgPSBuZXcgQml0U2V0KCk7CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9leGVjdXRlX2xhdGVuY3lfbXMoKSkgeworICAgICAgICBvcHRpb25hbHMuc2V0KDApOworICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5pc19zZXRfcHJvY2Vzc19sYXRlbmN5X21zKCkpIHsKKyAgICAgICAgb3B0aW9uYWxzLnNldCgxKTsKKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X2V4ZWN1dGVkKCkpIHsKKyAgICAgICAgb3B0aW9uYWxzLnNldCgyKTsKKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X2NhcGFjaXR5KCkpIHsKKyAgICAgICAgb3B0aW9uYWxzLnNldCgzKTsKKyAgICAgIH0KKyAgICAgIG9wcm90LndyaXRlQml0U2V0KG9wdGlvbmFscywgNCk7CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9leGVjdXRlX2xhdGVuY3lfbXMoKSkgeworICAgICAgICBvcHJvdC53cml0ZURvdWJsZShzdHJ1Y3QuZXhlY3V0ZV9sYXRlbmN5X21zKTsKKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X3Byb2Nlc3NfbGF0ZW5jeV9tcygpKSB7CisgICAgICAgIG9wcm90LndyaXRlRG91YmxlKHN0cnVjdC5wcm9jZXNzX2xhdGVuY3lfbXMpOworICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5pc19zZXRfZXhlY3V0ZWQoKSkgeworICAgICAgICBvcHJvdC53cml0ZUk2NChzdHJ1Y3QuZXhlY3V0ZWQpOworICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5pc19zZXRfY2FwYWNpdHkoKSkgeworICAgICAgICBvcHJvdC53cml0ZURvdWJsZShzdHJ1Y3QuY2FwYWNpdHkpOworICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlYWQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIHByb3QsIEJvbHRBZ2dyZWdhdGVTdGF0cyBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgIFRUdXBsZVByb3RvY29sIGlwcm90ID0gKFRUdXBsZVByb3RvY29sKSBwcm90OworICAgICAgQml0U2V0IGluY29taW5nID0gaXByb3QucmVhZEJpdFNldCg0KTsKKyAgICAgIGlmIChpbmNvbWluZy5nZXQoMCkpIHsKKyAgICAgICAgc3RydWN0LmV4ZWN1dGVfbGF0ZW5jeV9tcyA9IGlwcm90LnJlYWREb3VibGUoKTsKKyAgICAgICAgc3RydWN0LnNldF9leGVjdXRlX2xhdGVuY3lfbXNfaXNTZXQodHJ1ZSk7CisgICAgICB9CisgICAgICBpZiAoaW5jb21pbmcuZ2V0KDEpKSB7CisgICAgICAgIHN0cnVjdC5wcm9jZXNzX2xhdGVuY3lfbXMgPSBpcHJvdC5yZWFkRG91YmxlKCk7CisgICAgICAgIHN0cnVjdC5zZXRfcHJvY2Vzc19sYXRlbmN5X21zX2lzU2V0KHRydWUpOworICAgICAgfQorICAgICAgaWYgKGluY29taW5nLmdldCgyKSkgeworICAgICAgICBzdHJ1Y3QuZXhlY3V0ZWQgPSBpcHJvdC5yZWFkSTY0KCk7CisgICAgICAgIHN0cnVjdC5zZXRfZXhlY3V0ZWRfaXNTZXQodHJ1ZSk7CisgICAgICB9CisgICAgICBpZiAoaW5jb21pbmcuZ2V0KDMpKSB7CisgICAgICAgIHN0cnVjdC5jYXBhY2l0eSA9IGlwcm90LnJlYWREb3VibGUoKTsKKyAgICAgICAgc3RydWN0LnNldF9jYXBhY2l0eV9pc1NldCh0cnVlKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworfQorCmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL0JvbHRTdGF0cy5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9Cb2x0U3RhdHMuamF2YQppbmRleCAyNmVmNWQ4Li5jYmFkZDMyIDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL0JvbHRTdGF0cy5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvQm9sdFN0YXRzLmphdmEKQEAgLTE2LDcgKzE2LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAvKioKLSAqIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMikKKyAqIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMykKICAqCiAgKiBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HCiAgKiAgQGdlbmVyYXRlZApAQCAtNTEsNyArNTEsNyBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCiBAU3VwcHJlc3NXYXJuaW5ncyh7ImNhc3QiLCAicmF3dHlwZXMiLCAic2VyaWFsIiwgInVuY2hlY2tlZCJ9KQotQEdlbmVyYXRlZCh2YWx1ZSA9ICJBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjIpIiwgZGF0ZSA9ICIyMDE1LTktMyIpCitAR2VuZXJhdGVkKHZhbHVlID0gIkF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMykiKQogcHVibGljIGNsYXNzIEJvbHRTdGF0cyBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlPEJvbHRTdGF0cywgQm9sdFN0YXRzLl9GaWVsZHM+LCBqYXZhLmlvLlNlcmlhbGl6YWJsZSwgQ2xvbmVhYmxlLCBDb21wYXJhYmxlPEJvbHRTdGF0cz4gewogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0IFNUUlVDVF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QoIkJvbHRTdGF0cyIpOwogCkBAIC04ODEsMjggKzg4MSwyOCBAQAogICAgICAgICAgIGNhc2UgMTogLy8gQUNLRUQKICAgICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLk1BUCkgewogICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwOTggPSBpcHJvdC5yZWFkTWFwQmVnaW4oKTsKLSAgICAgICAgICAgICAgICBzdHJ1Y3QuYWNrZWQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsTWFwPEdsb2JhbFN0cmVhbUlkLExvbmc+PigyKl9tYXA5OC5zaXplKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgX2tleTk5OwotICAgICAgICAgICAgICAgIE1hcDxHbG9iYWxTdHJlYW1JZCxMb25nPiBfdmFsMTAwOwotICAgICAgICAgICAgICAgIGZvciAoaW50IF9pMTAxID0gMDsgX2kxMDEgPCBfbWFwOTguc2l6ZTsgKytfaTEwMSkKKyAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwIF9tYXAxMTYgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKTsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QuYWNrZWQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsTWFwPEdsb2JhbFN0cmVhbUlkLExvbmc+PigyKl9tYXAxMTYuc2l6ZSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIF9rZXkxMTc7CisgICAgICAgICAgICAgICAgTWFwPEdsb2JhbFN0cmVhbUlkLExvbmc+IF92YWwxMTg7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgX2kxMTkgPSAwOyBfaTExOSA8IF9tYXAxMTYuc2l6ZTsgKytfaTExOSkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBfa2V5OTkgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICBfa2V5MTE3ID0gaXByb3QucmVhZFN0cmluZygpOwogICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwIF9tYXAxMDIgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKTsKLSAgICAgICAgICAgICAgICAgICAgX3ZhbDEwMCA9IG5ldyBIYXNoTWFwPEdsb2JhbFN0cmVhbUlkLExvbmc+KDIqX21hcDEwMi5zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgR2xvYmFsU3RyZWFtSWQgX2tleTEwMzsKLSAgICAgICAgICAgICAgICAgICAgbG9uZyBfdmFsMTA0OwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBfaTEwNSA9IDA7IF9pMTA1IDwgX21hcDEwMi5zaXplOyArK19pMTA1KQorICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwIF9tYXAxMjAgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgX3ZhbDExOCA9IG5ldyBIYXNoTWFwPEdsb2JhbFN0cmVhbUlkLExvbmc+KDIqX21hcDEyMC5zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgR2xvYmFsU3RyZWFtSWQgX2tleTEyMTsKKyAgICAgICAgICAgICAgICAgICAgbG9uZyBfdmFsMTIyOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBfaTEyMyA9IDA7IF9pMTIzIDwgX21hcDEyMC5zaXplOyArK19pMTIzKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgX2tleTEwMyA9IG5ldyBHbG9iYWxTdHJlYW1JZCgpOwotICAgICAgICAgICAgICAgICAgICAgIF9rZXkxMDMucmVhZChpcHJvdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgX3ZhbDEwNCA9IGlwcm90LnJlYWRJNjQoKTsKLSAgICAgICAgICAgICAgICAgICAgICBfdmFsMTAwLnB1dChfa2V5MTAzLCBfdmFsMTA0KTsKKyAgICAgICAgICAgICAgICAgICAgICBfa2V5MTIxID0gbmV3IEdsb2JhbFN0cmVhbUlkKCk7CisgICAgICAgICAgICAgICAgICAgICAgX2tleTEyMS5yZWFkKGlwcm90KTsKKyAgICAgICAgICAgICAgICAgICAgICBfdmFsMTIyID0gaXByb3QucmVhZEk2NCgpOworICAgICAgICAgICAgICAgICAgICAgIF92YWwxMTgucHV0KF9rZXkxMjEsIF92YWwxMjIpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGlwcm90LnJlYWRNYXBFbmQoKTsKICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIHN0cnVjdC5hY2tlZC5wdXQoX2tleTk5LCBfdmFsMTAwKTsKKyAgICAgICAgICAgICAgICAgIHN0cnVjdC5hY2tlZC5wdXQoX2tleTExNywgX3ZhbDExOCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlwcm90LnJlYWRNYXBFbmQoKTsKICAgICAgICAgICAgICAgfQpAQCAtOTE0LDI4ICs5MTQsMjggQEAKICAgICAgICAgICBjYXNlIDI6IC8vIEZBSUxFRAogICAgICAgICAgICAgaWYgKHNjaGVtZUZpZWxkLnR5cGUgPT0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTUFQKSB7CiAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwIF9tYXAxMDYgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKTsKLSAgICAgICAgICAgICAgICBzdHJ1Y3QuZmFpbGVkID0gbmV3IEhhc2hNYXA8U3RyaW5nLE1hcDxHbG9iYWxTdHJlYW1JZCxMb25nPj4oMipfbWFwMTA2LnNpemUpOwotICAgICAgICAgICAgICAgIFN0cmluZyBfa2V5MTA3OwotICAgICAgICAgICAgICAgIE1hcDxHbG9iYWxTdHJlYW1JZCxMb25nPiBfdmFsMTA4OwotICAgICAgICAgICAgICAgIGZvciAoaW50IF9pMTA5ID0gMDsgX2kxMDkgPCBfbWFwMTA2LnNpemU7ICsrX2kxMDkpCisgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwMTI0ID0gaXByb3QucmVhZE1hcEJlZ2luKCk7CisgICAgICAgICAgICAgICAgc3RydWN0LmZhaWxlZCA9IG5ldyBIYXNoTWFwPFN0cmluZyxNYXA8R2xvYmFsU3RyZWFtSWQsTG9uZz4+KDIqX21hcDEyNC5zaXplKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgX2tleTEyNTsKKyAgICAgICAgICAgICAgICBNYXA8R2xvYmFsU3RyZWFtSWQsTG9uZz4gX3ZhbDEyNjsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBfaTEyNyA9IDA7IF9pMTI3IDwgX21hcDEyNC5zaXplOyArK19pMTI3KQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIF9rZXkxMDcgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICBfa2V5MTI1ID0gaXByb3QucmVhZFN0cmluZygpOwogICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwIF9tYXAxMTAgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKTsKLSAgICAgICAgICAgICAgICAgICAgX3ZhbDEwOCA9IG5ldyBIYXNoTWFwPEdsb2JhbFN0cmVhbUlkLExvbmc+KDIqX21hcDExMC5zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgR2xvYmFsU3RyZWFtSWQgX2tleTExMTsKLSAgICAgICAgICAgICAgICAgICAgbG9uZyBfdmFsMTEyOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBfaTExMyA9IDA7IF9pMTEzIDwgX21hcDExMC5zaXplOyArK19pMTEzKQorICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwIF9tYXAxMjggPSBpcHJvdC5yZWFkTWFwQmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgX3ZhbDEyNiA9IG5ldyBIYXNoTWFwPEdsb2JhbFN0cmVhbUlkLExvbmc+KDIqX21hcDEyOC5zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgR2xvYmFsU3RyZWFtSWQgX2tleTEyOTsKKyAgICAgICAgICAgICAgICAgICAgbG9uZyBfdmFsMTMwOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBfaTEzMSA9IDA7IF9pMTMxIDwgX21hcDEyOC5zaXplOyArK19pMTMxKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgX2tleTExMSA9IG5ldyBHbG9iYWxTdHJlYW1JZCgpOwotICAgICAgICAgICAgICAgICAgICAgIF9rZXkxMTEucmVhZChpcHJvdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgX3ZhbDExMiA9IGlwcm90LnJlYWRJNjQoKTsKLSAgICAgICAgICAgICAgICAgICAgICBfdmFsMTA4LnB1dChfa2V5MTExLCBfdmFsMTEyKTsKKyAgICAgICAgICAgICAgICAgICAgICBfa2V5MTI5ID0gbmV3IEdsb2JhbFN0cmVhbUlkKCk7CisgICAgICAgICAgICAgICAgICAgICAgX2tleTEyOS5yZWFkKGlwcm90KTsKKyAgICAgICAgICAgICAgICAgICAgICBfdmFsMTMwID0gaXByb3QucmVhZEk2NCgpOworICAgICAgICAgICAgICAgICAgICAgIF92YWwxMjYucHV0KF9rZXkxMjksIF92YWwxMzApOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGlwcm90LnJlYWRNYXBFbmQoKTsKICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIHN0cnVjdC5mYWlsZWQucHV0KF9rZXkxMDcsIF92YWwxMDgpOworICAgICAgICAgICAgICAgICAgc3RydWN0LmZhaWxlZC5wdXQoX2tleTEyNSwgX3ZhbDEyNik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlwcm90LnJlYWRNYXBFbmQoKTsKICAgICAgICAgICAgICAgfQpAQCAtOTQ3LDI4ICs5NDcsMjggQEAKICAgICAgICAgICBjYXNlIDM6IC8vIFBST0NFU1NfTVNfQVZHCiAgICAgICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5NQVApIHsKICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgX21hcDExNCA9IGlwcm90LnJlYWRNYXBCZWdpbigpOwotICAgICAgICAgICAgICAgIHN0cnVjdC5wcm9jZXNzX21zX2F2ZyA9IG5ldyBIYXNoTWFwPFN0cmluZyxNYXA8R2xvYmFsU3RyZWFtSWQsRG91YmxlPj4oMipfbWFwMTE0LnNpemUpOwotICAgICAgICAgICAgICAgIFN0cmluZyBfa2V5MTE1OwotICAgICAgICAgICAgICAgIE1hcDxHbG9iYWxTdHJlYW1JZCxEb3VibGU+IF92YWwxMTY7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgX2kxMTcgPSAwOyBfaTExNyA8IF9tYXAxMTQuc2l6ZTsgKytfaTExNykKKyAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwIF9tYXAxMzIgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKTsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QucHJvY2Vzc19tc19hdmcgPSBuZXcgSGFzaE1hcDxTdHJpbmcsTWFwPEdsb2JhbFN0cmVhbUlkLERvdWJsZT4+KDIqX21hcDEzMi5zaXplKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgX2tleTEzMzsKKyAgICAgICAgICAgICAgICBNYXA8R2xvYmFsU3RyZWFtSWQsRG91YmxlPiBfdmFsMTM0OworICAgICAgICAgICAgICAgIGZvciAoaW50IF9pMTM1ID0gMDsgX2kxMzUgPCBfbWFwMTMyLnNpemU7ICsrX2kxMzUpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgX2tleTExNSA9IGlwcm90LnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgIF9rZXkxMzMgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgX21hcDExOCA9IGlwcm90LnJlYWRNYXBCZWdpbigpOwotICAgICAgICAgICAgICAgICAgICBfdmFsMTE2ID0gbmV3IEhhc2hNYXA8R2xvYmFsU3RyZWFtSWQsRG91YmxlPigyKl9tYXAxMTguc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIEdsb2JhbFN0cmVhbUlkIF9rZXkxMTk7Ci0gICAgICAgICAgICAgICAgICAgIGRvdWJsZSBfdmFsMTIwOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBfaTEyMSA9IDA7IF9pMTIxIDwgX21hcDExOC5zaXplOyArK19pMTIxKQorICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwIF9tYXAxMzYgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgX3ZhbDEzNCA9IG5ldyBIYXNoTWFwPEdsb2JhbFN0cmVhbUlkLERvdWJsZT4oMipfbWFwMTM2LnNpemUpOworICAgICAgICAgICAgICAgICAgICBHbG9iYWxTdHJlYW1JZCBfa2V5MTM3OworICAgICAgICAgICAgICAgICAgICBkb3VibGUgX3ZhbDEzODsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgX2kxMzkgPSAwOyBfaTEzOSA8IF9tYXAxMzYuc2l6ZTsgKytfaTEzOSkKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIF9rZXkxMTkgPSBuZXcgR2xvYmFsU3RyZWFtSWQoKTsKLSAgICAgICAgICAgICAgICAgICAgICBfa2V5MTE5LnJlYWQoaXByb3QpOwotICAgICAgICAgICAgICAgICAgICAgIF92YWwxMjAgPSBpcHJvdC5yZWFkRG91YmxlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgX3ZhbDExNi5wdXQoX2tleTExOSwgX3ZhbDEyMCk7CisgICAgICAgICAgICAgICAgICAgICAgX2tleTEzNyA9IG5ldyBHbG9iYWxTdHJlYW1JZCgpOworICAgICAgICAgICAgICAgICAgICAgIF9rZXkxMzcucmVhZChpcHJvdCk7CisgICAgICAgICAgICAgICAgICAgICAgX3ZhbDEzOCA9IGlwcm90LnJlYWREb3VibGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICBfdmFsMTM0LnB1dChfa2V5MTM3LCBfdmFsMTM4KTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpcHJvdC5yZWFkTWFwRW5kKCk7CiAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBzdHJ1Y3QucHJvY2Vzc19tc19hdmcucHV0KF9rZXkxMTUsIF92YWwxMTYpOworICAgICAgICAgICAgICAgICAgc3RydWN0LnByb2Nlc3NfbXNfYXZnLnB1dChfa2V5MTMzLCBfdmFsMTM0KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaXByb3QucmVhZE1hcEVuZCgpOwogICAgICAgICAgICAgICB9CkBAIC05ODAsMjggKzk4MCwyOCBAQAogICAgICAgICAgIGNhc2UgNDogLy8gRVhFQ1VURUQKICAgICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLk1BUCkgewogICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwMTIyID0gaXByb3QucmVhZE1hcEJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgc3RydWN0LmV4ZWN1dGVkID0gbmV3IEhhc2hNYXA8U3RyaW5nLE1hcDxHbG9iYWxTdHJlYW1JZCxMb25nPj4oMipfbWFwMTIyLnNpemUpOwotICAgICAgICAgICAgICAgIFN0cmluZyBfa2V5MTIzOwotICAgICAgICAgICAgICAgIE1hcDxHbG9iYWxTdHJlYW1JZCxMb25nPiBfdmFsMTI0OwotICAgICAgICAgICAgICAgIGZvciAoaW50IF9pMTI1ID0gMDsgX2kxMjUgPCBfbWFwMTIyLnNpemU7ICsrX2kxMjUpCisgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwMTQwID0gaXByb3QucmVhZE1hcEJlZ2luKCk7CisgICAgICAgICAgICAgICAgc3RydWN0LmV4ZWN1dGVkID0gbmV3IEhhc2hNYXA8U3RyaW5nLE1hcDxHbG9iYWxTdHJlYW1JZCxMb25nPj4oMipfbWFwMTQwLnNpemUpOworICAgICAgICAgICAgICAgIFN0cmluZyBfa2V5MTQxOworICAgICAgICAgICAgICAgIE1hcDxHbG9iYWxTdHJlYW1JZCxMb25nPiBfdmFsMTQyOworICAgICAgICAgICAgICAgIGZvciAoaW50IF9pMTQzID0gMDsgX2kxNDMgPCBfbWFwMTQwLnNpemU7ICsrX2kxNDMpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgX2tleTEyMyA9IGlwcm90LnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgIF9rZXkxNDEgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgX21hcDEyNiA9IGlwcm90LnJlYWRNYXBCZWdpbigpOwotICAgICAgICAgICAgICAgICAgICBfdmFsMTI0ID0gbmV3IEhhc2hNYXA8R2xvYmFsU3RyZWFtSWQsTG9uZz4oMipfbWFwMTI2LnNpemUpOwotICAgICAgICAgICAgICAgICAgICBHbG9iYWxTdHJlYW1JZCBfa2V5MTI3OwotICAgICAgICAgICAgICAgICAgICBsb25nIF92YWwxMjg7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IF9pMTI5ID0gMDsgX2kxMjkgPCBfbWFwMTI2LnNpemU7ICsrX2kxMjkpCisgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgX21hcDE0NCA9IGlwcm90LnJlYWRNYXBCZWdpbigpOworICAgICAgICAgICAgICAgICAgICBfdmFsMTQyID0gbmV3IEhhc2hNYXA8R2xvYmFsU3RyZWFtSWQsTG9uZz4oMipfbWFwMTQ0LnNpemUpOworICAgICAgICAgICAgICAgICAgICBHbG9iYWxTdHJlYW1JZCBfa2V5MTQ1OworICAgICAgICAgICAgICAgICAgICBsb25nIF92YWwxNDY7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IF9pMTQ3ID0gMDsgX2kxNDcgPCBfbWFwMTQ0LnNpemU7ICsrX2kxNDcpCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICBfa2V5MTI3ID0gbmV3IEdsb2JhbFN0cmVhbUlkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgX2tleTEyNy5yZWFkKGlwcm90KTsKLSAgICAgICAgICAgICAgICAgICAgICBfdmFsMTI4ID0gaXByb3QucmVhZEk2NCgpOwotICAgICAgICAgICAgICAgICAgICAgIF92YWwxMjQucHV0KF9rZXkxMjcsIF92YWwxMjgpOworICAgICAgICAgICAgICAgICAgICAgIF9rZXkxNDUgPSBuZXcgR2xvYmFsU3RyZWFtSWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICBfa2V5MTQ1LnJlYWQoaXByb3QpOworICAgICAgICAgICAgICAgICAgICAgIF92YWwxNDYgPSBpcHJvdC5yZWFkSTY0KCk7CisgICAgICAgICAgICAgICAgICAgICAgX3ZhbDE0Mi5wdXQoX2tleTE0NSwgX3ZhbDE0Nik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaXByb3QucmVhZE1hcEVuZCgpOwogICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgc3RydWN0LmV4ZWN1dGVkLnB1dChfa2V5MTIzLCBfdmFsMTI0KTsKKyAgICAgICAgICAgICAgICAgIHN0cnVjdC5leGVjdXRlZC5wdXQoX2tleTE0MSwgX3ZhbDE0Mik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlwcm90LnJlYWRNYXBFbmQoKTsKICAgICAgICAgICAgICAgfQpAQCAtMTAxMywyOCArMTAxMywyOCBAQAogICAgICAgICAgIGNhc2UgNTogLy8gRVhFQ1VURV9NU19BVkcKICAgICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLk1BUCkgewogICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwMTMwID0gaXByb3QucmVhZE1hcEJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgc3RydWN0LmV4ZWN1dGVfbXNfYXZnID0gbmV3IEhhc2hNYXA8U3RyaW5nLE1hcDxHbG9iYWxTdHJlYW1JZCxEb3VibGU+PigyKl9tYXAxMzAuc2l6ZSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIF9rZXkxMzE7Ci0gICAgICAgICAgICAgICAgTWFwPEdsb2JhbFN0cmVhbUlkLERvdWJsZT4gX3ZhbDEzMjsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBfaTEzMyA9IDA7IF9pMTMzIDwgX21hcDEzMC5zaXplOyArK19pMTMzKQorICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgX21hcDE0OCA9IGlwcm90LnJlYWRNYXBCZWdpbigpOworICAgICAgICAgICAgICAgIHN0cnVjdC5leGVjdXRlX21zX2F2ZyA9IG5ldyBIYXNoTWFwPFN0cmluZyxNYXA8R2xvYmFsU3RyZWFtSWQsRG91YmxlPj4oMipfbWFwMTQ4LnNpemUpOworICAgICAgICAgICAgICAgIFN0cmluZyBfa2V5MTQ5OworICAgICAgICAgICAgICAgIE1hcDxHbG9iYWxTdHJlYW1JZCxEb3VibGU+IF92YWwxNTA7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgX2kxNTEgPSAwOyBfaTE1MSA8IF9tYXAxNDguc2l6ZTsgKytfaTE1MSkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBfa2V5MTMxID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICAgICAgICAgICAgX2tleTE0OSA9IGlwcm90LnJlYWRTdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwMTM0ID0gaXByb3QucmVhZE1hcEJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgICAgIF92YWwxMzIgPSBuZXcgSGFzaE1hcDxHbG9iYWxTdHJlYW1JZCxEb3VibGU+KDIqX21hcDEzNC5zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgR2xvYmFsU3RyZWFtSWQgX2tleTEzNTsKLSAgICAgICAgICAgICAgICAgICAgZG91YmxlIF92YWwxMzY7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IF9pMTM3ID0gMDsgX2kxMzcgPCBfbWFwMTM0LnNpemU7ICsrX2kxMzcpCisgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgX21hcDE1MiA9IGlwcm90LnJlYWRNYXBCZWdpbigpOworICAgICAgICAgICAgICAgICAgICBfdmFsMTUwID0gbmV3IEhhc2hNYXA8R2xvYmFsU3RyZWFtSWQsRG91YmxlPigyKl9tYXAxNTIuc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIEdsb2JhbFN0cmVhbUlkIF9rZXkxNTM7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBfdmFsMTU0OworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBfaTE1NSA9IDA7IF9pMTU1IDwgX21hcDE1Mi5zaXplOyArK19pMTU1KQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgX2tleTEzNSA9IG5ldyBHbG9iYWxTdHJlYW1JZCgpOwotICAgICAgICAgICAgICAgICAgICAgIF9rZXkxMzUucmVhZChpcHJvdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgX3ZhbDEzNiA9IGlwcm90LnJlYWREb3VibGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICBfdmFsMTMyLnB1dChfa2V5MTM1LCBfdmFsMTM2KTsKKyAgICAgICAgICAgICAgICAgICAgICBfa2V5MTUzID0gbmV3IEdsb2JhbFN0cmVhbUlkKCk7CisgICAgICAgICAgICAgICAgICAgICAgX2tleTE1My5yZWFkKGlwcm90KTsKKyAgICAgICAgICAgICAgICAgICAgICBfdmFsMTU0ID0gaXByb3QucmVhZERvdWJsZSgpOworICAgICAgICAgICAgICAgICAgICAgIF92YWwxNTAucHV0KF9rZXkxNTMsIF92YWwxNTQpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGlwcm90LnJlYWRNYXBFbmQoKTsKICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIHN0cnVjdC5leGVjdXRlX21zX2F2Zy5wdXQoX2tleTEzMSwgX3ZhbDEzMik7CisgICAgICAgICAgICAgICAgICBzdHJ1Y3QuZXhlY3V0ZV9tc19hdmcucHV0KF9rZXkxNDksIF92YWwxNTApOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpcHJvdC5yZWFkTWFwRW5kKCk7CiAgICAgICAgICAgICAgIH0KQEAgLTEwNjAsMTUgKzEwNjAsMTUgQEAKICAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKEFDS0VEX0ZJRUxEX0RFU0MpOwogICAgICAgICB7CiAgICAgICAgICAgb3Byb3Qud3JpdGVNYXBCZWdpbihuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLk1BUCwgc3RydWN0LmFja2VkLnNpemUoKSkpOwotICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgTWFwPEdsb2JhbFN0cmVhbUlkLExvbmc+PiBfaXRlcjEzOCA6IHN0cnVjdC5hY2tlZC5lbnRyeVNldCgpKQorICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgTWFwPEdsb2JhbFN0cmVhbUlkLExvbmc+PiBfaXRlcjE1NiA6IHN0cnVjdC5hY2tlZC5lbnRyeVNldCgpKQogICAgICAgICAgIHsKLSAgICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKF9pdGVyMTM4LmdldEtleSgpKTsKKyAgICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKF9pdGVyMTU2LmdldEtleSgpKTsKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgb3Byb3Qud3JpdGVNYXBCZWdpbihuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkk2NCwgX2l0ZXIxMzguZ2V0VmFsdWUoKS5zaXplKCkpKTsKLSAgICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8R2xvYmFsU3RyZWFtSWQsIExvbmc+IF9pdGVyMTM5IDogX2l0ZXIxMzguZ2V0VmFsdWUoKS5lbnRyeVNldCgpKQorICAgICAgICAgICAgICBvcHJvdC53cml0ZU1hcEJlZ2luKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTY0LCBfaXRlcjE1Ni5nZXRWYWx1ZSgpLnNpemUoKSkpOworICAgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxHbG9iYWxTdHJlYW1JZCwgTG9uZz4gX2l0ZXIxNTcgOiBfaXRlcjE1Ni5nZXRWYWx1ZSgpLmVudHJ5U2V0KCkpCiAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfaXRlcjEzOS5nZXRLZXkoKS53cml0ZShvcHJvdCk7Ci0gICAgICAgICAgICAgICAgb3Byb3Qud3JpdGVJNjQoX2l0ZXIxMzkuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgX2l0ZXIxNTcuZ2V0S2V5KCkud3JpdGUob3Byb3QpOworICAgICAgICAgICAgICAgIG9wcm90LndyaXRlSTY0KF9pdGVyMTU3LmdldFZhbHVlKCkpOwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIG9wcm90LndyaXRlTWFwRW5kKCk7CiAgICAgICAgICAgICB9CkBAIC0xMDgxLDE1ICsxMDgxLDE1IEBACiAgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihGQUlMRURfRklFTERfREVTQyk7CiAgICAgICAgIHsKICAgICAgICAgICBvcHJvdC53cml0ZU1hcEJlZ2luKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORywgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTUFQLCBzdHJ1Y3QuZmFpbGVkLnNpemUoKSkpOwotICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgTWFwPEdsb2JhbFN0cmVhbUlkLExvbmc+PiBfaXRlcjE0MCA6IHN0cnVjdC5mYWlsZWQuZW50cnlTZXQoKSkKKyAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIE1hcDxHbG9iYWxTdHJlYW1JZCxMb25nPj4gX2l0ZXIxNTggOiBzdHJ1Y3QuZmFpbGVkLmVudHJ5U2V0KCkpCiAgICAgICAgICAgewotICAgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoX2l0ZXIxNDAuZ2V0S2V5KCkpOworICAgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoX2l0ZXIxNTguZ2V0S2V5KCkpOwogICAgICAgICAgICAgewotICAgICAgICAgICAgICBvcHJvdC53cml0ZU1hcEJlZ2luKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTY0LCBfaXRlcjE0MC5nZXRWYWx1ZSgpLnNpemUoKSkpOwotICAgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxHbG9iYWxTdHJlYW1JZCwgTG9uZz4gX2l0ZXIxNDEgOiBfaXRlcjE0MC5nZXRWYWx1ZSgpLmVudHJ5U2V0KCkpCisgICAgICAgICAgICAgIG9wcm90LndyaXRlTWFwQmVnaW4obmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNULCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JNjQsIF9pdGVyMTU4LmdldFZhbHVlKCkuc2l6ZSgpKSk7CisgICAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PEdsb2JhbFN0cmVhbUlkLCBMb25nPiBfaXRlcjE1OSA6IF9pdGVyMTU4LmdldFZhbHVlKCkuZW50cnlTZXQoKSkKICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9pdGVyMTQxLmdldEtleSgpLndyaXRlKG9wcm90KTsKLSAgICAgICAgICAgICAgICBvcHJvdC53cml0ZUk2NChfaXRlcjE0MS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICBfaXRlcjE1OS5nZXRLZXkoKS53cml0ZShvcHJvdCk7CisgICAgICAgICAgICAgICAgb3Byb3Qud3JpdGVJNjQoX2l0ZXIxNTkuZ2V0VmFsdWUoKSk7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgb3Byb3Qud3JpdGVNYXBFbmQoKTsKICAgICAgICAgICAgIH0KQEAgLTExMDIsMTUgKzExMDIsMTUgQEAKICAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKFBST0NFU1NfTVNfQVZHX0ZJRUxEX0RFU0MpOwogICAgICAgICB7CiAgICAgICAgICAgb3Byb3Qud3JpdGVNYXBCZWdpbihuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLk1BUCwgc3RydWN0LnByb2Nlc3NfbXNfYXZnLnNpemUoKSkpOwotICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgTWFwPEdsb2JhbFN0cmVhbUlkLERvdWJsZT4+IF9pdGVyMTQyIDogc3RydWN0LnByb2Nlc3NfbXNfYXZnLmVudHJ5U2V0KCkpCisgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBNYXA8R2xvYmFsU3RyZWFtSWQsRG91YmxlPj4gX2l0ZXIxNjAgOiBzdHJ1Y3QucHJvY2Vzc19tc19hdmcuZW50cnlTZXQoKSkKICAgICAgICAgICB7Ci0gICAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhfaXRlcjE0Mi5nZXRLZXkoKSk7CisgICAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhfaXRlcjE2MC5nZXRLZXkoKSk7CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG9wcm90LndyaXRlTWFwQmVnaW4obmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNULCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5ET1VCTEUsIF9pdGVyMTQyLmdldFZhbHVlKCkuc2l6ZSgpKSk7Ci0gICAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PEdsb2JhbFN0cmVhbUlkLCBEb3VibGU+IF9pdGVyMTQzIDogX2l0ZXIxNDIuZ2V0VmFsdWUoKS5lbnRyeVNldCgpKQorICAgICAgICAgICAgICBvcHJvdC53cml0ZU1hcEJlZ2luKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuRE9VQkxFLCBfaXRlcjE2MC5nZXRWYWx1ZSgpLnNpemUoKSkpOworICAgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxHbG9iYWxTdHJlYW1JZCwgRG91YmxlPiBfaXRlcjE2MSA6IF9pdGVyMTYwLmdldFZhbHVlKCkuZW50cnlTZXQoKSkKICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9pdGVyMTQzLmdldEtleSgpLndyaXRlKG9wcm90KTsKLSAgICAgICAgICAgICAgICBvcHJvdC53cml0ZURvdWJsZShfaXRlcjE0My5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICBfaXRlcjE2MS5nZXRLZXkoKS53cml0ZShvcHJvdCk7CisgICAgICAgICAgICAgICAgb3Byb3Qud3JpdGVEb3VibGUoX2l0ZXIxNjEuZ2V0VmFsdWUoKSk7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgb3Byb3Qud3JpdGVNYXBFbmQoKTsKICAgICAgICAgICAgIH0KQEAgLTExMjMsMTUgKzExMjMsMTUgQEAKICAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKEVYRUNVVEVEX0ZJRUxEX0RFU0MpOwogICAgICAgICB7CiAgICAgICAgICAgb3Byb3Qud3JpdGVNYXBCZWdpbihuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLk1BUCwgc3RydWN0LmV4ZWN1dGVkLnNpemUoKSkpOwotICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgTWFwPEdsb2JhbFN0cmVhbUlkLExvbmc+PiBfaXRlcjE0NCA6IHN0cnVjdC5leGVjdXRlZC5lbnRyeVNldCgpKQorICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgTWFwPEdsb2JhbFN0cmVhbUlkLExvbmc+PiBfaXRlcjE2MiA6IHN0cnVjdC5leGVjdXRlZC5lbnRyeVNldCgpKQogICAgICAgICAgIHsKLSAgICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKF9pdGVyMTQ0LmdldEtleSgpKTsKKyAgICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKF9pdGVyMTYyLmdldEtleSgpKTsKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgb3Byb3Qud3JpdGVNYXBCZWdpbihuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkk2NCwgX2l0ZXIxNDQuZ2V0VmFsdWUoKS5zaXplKCkpKTsKLSAgICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8R2xvYmFsU3RyZWFtSWQsIExvbmc+IF9pdGVyMTQ1IDogX2l0ZXIxNDQuZ2V0VmFsdWUoKS5lbnRyeVNldCgpKQorICAgICAgICAgICAgICBvcHJvdC53cml0ZU1hcEJlZ2luKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTY0LCBfaXRlcjE2Mi5nZXRWYWx1ZSgpLnNpemUoKSkpOworICAgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxHbG9iYWxTdHJlYW1JZCwgTG9uZz4gX2l0ZXIxNjMgOiBfaXRlcjE2Mi5nZXRWYWx1ZSgpLmVudHJ5U2V0KCkpCiAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfaXRlcjE0NS5nZXRLZXkoKS53cml0ZShvcHJvdCk7Ci0gICAgICAgICAgICAgICAgb3Byb3Qud3JpdGVJNjQoX2l0ZXIxNDUuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgX2l0ZXIxNjMuZ2V0S2V5KCkud3JpdGUob3Byb3QpOworICAgICAgICAgICAgICAgIG9wcm90LndyaXRlSTY0KF9pdGVyMTYzLmdldFZhbHVlKCkpOwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIG9wcm90LndyaXRlTWFwRW5kKCk7CiAgICAgICAgICAgICB9CkBAIC0xMTQ0LDE1ICsxMTQ0LDE1IEBACiAgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihFWEVDVVRFX01TX0FWR19GSUVMRF9ERVNDKTsKICAgICAgICAgewogICAgICAgICAgIG9wcm90LndyaXRlTWFwQmVnaW4obmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5NQVAsIHN0cnVjdC5leGVjdXRlX21zX2F2Zy5zaXplKCkpKTsKLSAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIE1hcDxHbG9iYWxTdHJlYW1JZCxEb3VibGU+PiBfaXRlcjE0NiA6IHN0cnVjdC5leGVjdXRlX21zX2F2Zy5lbnRyeVNldCgpKQorICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgTWFwPEdsb2JhbFN0cmVhbUlkLERvdWJsZT4+IF9pdGVyMTY0IDogc3RydWN0LmV4ZWN1dGVfbXNfYXZnLmVudHJ5U2V0KCkpCiAgICAgICAgICAgewotICAgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoX2l0ZXIxNDYuZ2V0S2V5KCkpOworICAgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoX2l0ZXIxNjQuZ2V0S2V5KCkpOwogICAgICAgICAgICAgewotICAgICAgICAgICAgICBvcHJvdC53cml0ZU1hcEJlZ2luKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuRE9VQkxFLCBfaXRlcjE0Ni5nZXRWYWx1ZSgpLnNpemUoKSkpOwotICAgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxHbG9iYWxTdHJlYW1JZCwgRG91YmxlPiBfaXRlcjE0NyA6IF9pdGVyMTQ2LmdldFZhbHVlKCkuZW50cnlTZXQoKSkKKyAgICAgICAgICAgICAgb3Byb3Qud3JpdGVNYXBCZWdpbihuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkRPVUJMRSwgX2l0ZXIxNjQuZ2V0VmFsdWUoKS5zaXplKCkpKTsKKyAgICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8R2xvYmFsU3RyZWFtSWQsIERvdWJsZT4gX2l0ZXIxNjUgOiBfaXRlcjE2NC5nZXRWYWx1ZSgpLmVudHJ5U2V0KCkpCiAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfaXRlcjE0Ny5nZXRLZXkoKS53cml0ZShvcHJvdCk7Ci0gICAgICAgICAgICAgICAgb3Byb3Qud3JpdGVEb3VibGUoX2l0ZXIxNDcuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgX2l0ZXIxNjUuZ2V0S2V5KCkud3JpdGUob3Byb3QpOworICAgICAgICAgICAgICAgIG9wcm90LndyaXRlRG91YmxlKF9pdGVyMTY1LmdldFZhbHVlKCkpOwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIG9wcm90LndyaXRlTWFwRW5kKCk7CiAgICAgICAgICAgICB9CkBAIC0xMTgwLDc1ICsxMTgwLDc1IEBACiAgICAgICBUVHVwbGVQcm90b2NvbCBvcHJvdCA9IChUVHVwbGVQcm90b2NvbCkgcHJvdDsKICAgICAgIHsKICAgICAgICAgb3Byb3Qud3JpdGVJMzIoc3RydWN0LmFja2VkLnNpemUoKSk7Ci0gICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgTWFwPEdsb2JhbFN0cmVhbUlkLExvbmc+PiBfaXRlcjE0OCA6IHN0cnVjdC5hY2tlZC5lbnRyeVNldCgpKQorICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIE1hcDxHbG9iYWxTdHJlYW1JZCxMb25nPj4gX2l0ZXIxNjYgOiBzdHJ1Y3QuYWNrZWQuZW50cnlTZXQoKSkKICAgICAgICAgewotICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKF9pdGVyMTQ4LmdldEtleSgpKTsKKyAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhfaXRlcjE2Ni5nZXRLZXkoKSk7CiAgICAgICAgICAgewotICAgICAgICAgICAgb3Byb3Qud3JpdGVJMzIoX2l0ZXIxNDguZ2V0VmFsdWUoKS5zaXplKCkpOwotICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8R2xvYmFsU3RyZWFtSWQsIExvbmc+IF9pdGVyMTQ5IDogX2l0ZXIxNDguZ2V0VmFsdWUoKS5lbnRyeVNldCgpKQorICAgICAgICAgICAgb3Byb3Qud3JpdGVJMzIoX2l0ZXIxNjYuZ2V0VmFsdWUoKS5zaXplKCkpOworICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8R2xvYmFsU3RyZWFtSWQsIExvbmc+IF9pdGVyMTY3IDogX2l0ZXIxNjYuZ2V0VmFsdWUoKS5lbnRyeVNldCgpKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICBfaXRlcjE0OS5nZXRLZXkoKS53cml0ZShvcHJvdCk7Ci0gICAgICAgICAgICAgIG9wcm90LndyaXRlSTY0KF9pdGVyMTQ5LmdldFZhbHVlKCkpOworICAgICAgICAgICAgICBfaXRlcjE2Ny5nZXRLZXkoKS53cml0ZShvcHJvdCk7CisgICAgICAgICAgICAgIG9wcm90LndyaXRlSTY0KF9pdGVyMTY3LmdldFZhbHVlKCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgfQogICAgICAgewogICAgICAgICBvcHJvdC53cml0ZUkzMihzdHJ1Y3QuZmFpbGVkLnNpemUoKSk7Ci0gICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgTWFwPEdsb2JhbFN0cmVhbUlkLExvbmc+PiBfaXRlcjE1MCA6IHN0cnVjdC5mYWlsZWQuZW50cnlTZXQoKSkKKyAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBNYXA8R2xvYmFsU3RyZWFtSWQsTG9uZz4+IF9pdGVyMTY4IDogc3RydWN0LmZhaWxlZC5lbnRyeVNldCgpKQogICAgICAgICB7Ci0gICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoX2l0ZXIxNTAuZ2V0S2V5KCkpOworICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKF9pdGVyMTY4LmdldEtleSgpKTsKICAgICAgICAgICB7Ci0gICAgICAgICAgICBvcHJvdC53cml0ZUkzMihfaXRlcjE1MC5nZXRWYWx1ZSgpLnNpemUoKSk7Ci0gICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxHbG9iYWxTdHJlYW1JZCwgTG9uZz4gX2l0ZXIxNTEgOiBfaXRlcjE1MC5nZXRWYWx1ZSgpLmVudHJ5U2V0KCkpCisgICAgICAgICAgICBvcHJvdC53cml0ZUkzMihfaXRlcjE2OC5nZXRWYWx1ZSgpLnNpemUoKSk7CisgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxHbG9iYWxTdHJlYW1JZCwgTG9uZz4gX2l0ZXIxNjkgOiBfaXRlcjE2OC5nZXRWYWx1ZSgpLmVudHJ5U2V0KCkpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIF9pdGVyMTUxLmdldEtleSgpLndyaXRlKG9wcm90KTsKLSAgICAgICAgICAgICAgb3Byb3Qud3JpdGVJNjQoX2l0ZXIxNTEuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgIF9pdGVyMTY5LmdldEtleSgpLndyaXRlKG9wcm90KTsKKyAgICAgICAgICAgICAgb3Byb3Qud3JpdGVJNjQoX2l0ZXIxNjkuZ2V0VmFsdWUoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICB9CiAgICAgICB7CiAgICAgICAgIG9wcm90LndyaXRlSTMyKHN0cnVjdC5wcm9jZXNzX21zX2F2Zy5zaXplKCkpOwotICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIE1hcDxHbG9iYWxTdHJlYW1JZCxEb3VibGU+PiBfaXRlcjE1MiA6IHN0cnVjdC5wcm9jZXNzX21zX2F2Zy5lbnRyeVNldCgpKQorICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIE1hcDxHbG9iYWxTdHJlYW1JZCxEb3VibGU+PiBfaXRlcjE3MCA6IHN0cnVjdC5wcm9jZXNzX21zX2F2Zy5lbnRyeVNldCgpKQogICAgICAgICB7Ci0gICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoX2l0ZXIxNTIuZ2V0S2V5KCkpOworICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKF9pdGVyMTcwLmdldEtleSgpKTsKICAgICAgICAgICB7Ci0gICAgICAgICAgICBvcHJvdC53cml0ZUkzMihfaXRlcjE1Mi5nZXRWYWx1ZSgpLnNpemUoKSk7Ci0gICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxHbG9iYWxTdHJlYW1JZCwgRG91YmxlPiBfaXRlcjE1MyA6IF9pdGVyMTUyLmdldFZhbHVlKCkuZW50cnlTZXQoKSkKKyAgICAgICAgICAgIG9wcm90LndyaXRlSTMyKF9pdGVyMTcwLmdldFZhbHVlKCkuc2l6ZSgpKTsKKyAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PEdsb2JhbFN0cmVhbUlkLCBEb3VibGU+IF9pdGVyMTcxIDogX2l0ZXIxNzAuZ2V0VmFsdWUoKS5lbnRyeVNldCgpKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICBfaXRlcjE1My5nZXRLZXkoKS53cml0ZShvcHJvdCk7Ci0gICAgICAgICAgICAgIG9wcm90LndyaXRlRG91YmxlKF9pdGVyMTUzLmdldFZhbHVlKCkpOworICAgICAgICAgICAgICBfaXRlcjE3MS5nZXRLZXkoKS53cml0ZShvcHJvdCk7CisgICAgICAgICAgICAgIG9wcm90LndyaXRlRG91YmxlKF9pdGVyMTcxLmdldFZhbHVlKCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgfQogICAgICAgewogICAgICAgICBvcHJvdC53cml0ZUkzMihzdHJ1Y3QuZXhlY3V0ZWQuc2l6ZSgpKTsKLSAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBNYXA8R2xvYmFsU3RyZWFtSWQsTG9uZz4+IF9pdGVyMTU0IDogc3RydWN0LmV4ZWN1dGVkLmVudHJ5U2V0KCkpCisgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgTWFwPEdsb2JhbFN0cmVhbUlkLExvbmc+PiBfaXRlcjE3MiA6IHN0cnVjdC5leGVjdXRlZC5lbnRyeVNldCgpKQogICAgICAgICB7Ci0gICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoX2l0ZXIxNTQuZ2V0S2V5KCkpOworICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKF9pdGVyMTcyLmdldEtleSgpKTsKICAgICAgICAgICB7Ci0gICAgICAgICAgICBvcHJvdC53cml0ZUkzMihfaXRlcjE1NC5nZXRWYWx1ZSgpLnNpemUoKSk7Ci0gICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxHbG9iYWxTdHJlYW1JZCwgTG9uZz4gX2l0ZXIxNTUgOiBfaXRlcjE1NC5nZXRWYWx1ZSgpLmVudHJ5U2V0KCkpCisgICAgICAgICAgICBvcHJvdC53cml0ZUkzMihfaXRlcjE3Mi5nZXRWYWx1ZSgpLnNpemUoKSk7CisgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxHbG9iYWxTdHJlYW1JZCwgTG9uZz4gX2l0ZXIxNzMgOiBfaXRlcjE3Mi5nZXRWYWx1ZSgpLmVudHJ5U2V0KCkpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIF9pdGVyMTU1LmdldEtleSgpLndyaXRlKG9wcm90KTsKLSAgICAgICAgICAgICAgb3Byb3Qud3JpdGVJNjQoX2l0ZXIxNTUuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgIF9pdGVyMTczLmdldEtleSgpLndyaXRlKG9wcm90KTsKKyAgICAgICAgICAgICAgb3Byb3Qud3JpdGVJNjQoX2l0ZXIxNzMuZ2V0VmFsdWUoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICB9CiAgICAgICB7CiAgICAgICAgIG9wcm90LndyaXRlSTMyKHN0cnVjdC5leGVjdXRlX21zX2F2Zy5zaXplKCkpOwotICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIE1hcDxHbG9iYWxTdHJlYW1JZCxEb3VibGU+PiBfaXRlcjE1NiA6IHN0cnVjdC5leGVjdXRlX21zX2F2Zy5lbnRyeVNldCgpKQorICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIE1hcDxHbG9iYWxTdHJlYW1JZCxEb3VibGU+PiBfaXRlcjE3NCA6IHN0cnVjdC5leGVjdXRlX21zX2F2Zy5lbnRyeVNldCgpKQogICAgICAgICB7Ci0gICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoX2l0ZXIxNTYuZ2V0S2V5KCkpOworICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKF9pdGVyMTc0LmdldEtleSgpKTsKICAgICAgICAgICB7Ci0gICAgICAgICAgICBvcHJvdC53cml0ZUkzMihfaXRlcjE1Ni5nZXRWYWx1ZSgpLnNpemUoKSk7Ci0gICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxHbG9iYWxTdHJlYW1JZCwgRG91YmxlPiBfaXRlcjE1NyA6IF9pdGVyMTU2LmdldFZhbHVlKCkuZW50cnlTZXQoKSkKKyAgICAgICAgICAgIG9wcm90LndyaXRlSTMyKF9pdGVyMTc0LmdldFZhbHVlKCkuc2l6ZSgpKTsKKyAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PEdsb2JhbFN0cmVhbUlkLCBEb3VibGU+IF9pdGVyMTc1IDogX2l0ZXIxNzQuZ2V0VmFsdWUoKS5lbnRyeVNldCgpKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICBfaXRlcjE1Ny5nZXRLZXkoKS53cml0ZShvcHJvdCk7Ci0gICAgICAgICAgICAgIG9wcm90LndyaXRlRG91YmxlKF9pdGVyMTU3LmdldFZhbHVlKCkpOworICAgICAgICAgICAgICBfaXRlcjE3NS5nZXRLZXkoKS53cml0ZShvcHJvdCk7CisgICAgICAgICAgICAgIG9wcm90LndyaXRlRG91YmxlKF9pdGVyMTc1LmdldFZhbHVlKCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTI1OSwxMjcgKzEyNTksMTI3IEBACiAgICAgcHVibGljIHZvaWQgcmVhZChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgcHJvdCwgQm9sdFN0YXRzIHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24gewogICAgICAgVFR1cGxlUHJvdG9jb2wgaXByb3QgPSAoVFR1cGxlUHJvdG9jb2wpIHByb3Q7CiAgICAgICB7Ci0gICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgX21hcDE1OCA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORywgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTUFQLCBpcHJvdC5yZWFkSTMyKCkpOwotICAgICAgICBzdHJ1Y3QuYWNrZWQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsTWFwPEdsb2JhbFN0cmVhbUlkLExvbmc+PigyKl9tYXAxNTguc2l6ZSk7Ci0gICAgICAgIFN0cmluZyBfa2V5MTU5OwotICAgICAgICBNYXA8R2xvYmFsU3RyZWFtSWQsTG9uZz4gX3ZhbDE2MDsKLSAgICAgICAgZm9yIChpbnQgX2kxNjEgPSAwOyBfaTE2MSA8IF9tYXAxNTguc2l6ZTsgKytfaTE2MSkKKyAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwMTc2ID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5NQVAsIGlwcm90LnJlYWRJMzIoKSk7CisgICAgICAgIHN0cnVjdC5hY2tlZCA9IG5ldyBIYXNoTWFwPFN0cmluZyxNYXA8R2xvYmFsU3RyZWFtSWQsTG9uZz4+KDIqX21hcDE3Ni5zaXplKTsKKyAgICAgICAgU3RyaW5nIF9rZXkxNzc7CisgICAgICAgIE1hcDxHbG9iYWxTdHJlYW1JZCxMb25nPiBfdmFsMTc4OworICAgICAgICBmb3IgKGludCBfaTE3OSA9IDA7IF9pMTc5IDwgX21hcDE3Ni5zaXplOyArK19pMTc5KQogICAgICAgICB7Ci0gICAgICAgICAgX2tleTE1OSA9IGlwcm90LnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICBfa2V5MTc3ID0gaXByb3QucmVhZFN0cmluZygpOwogICAgICAgICAgIHsKLSAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgX21hcDE2MiA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTY0LCBpcHJvdC5yZWFkSTMyKCkpOwotICAgICAgICAgICAgX3ZhbDE2MCA9IG5ldyBIYXNoTWFwPEdsb2JhbFN0cmVhbUlkLExvbmc+KDIqX21hcDE2Mi5zaXplKTsKLSAgICAgICAgICAgIEdsb2JhbFN0cmVhbUlkIF9rZXkxNjM7Ci0gICAgICAgICAgICBsb25nIF92YWwxNjQ7Ci0gICAgICAgICAgICBmb3IgKGludCBfaTE2NSA9IDA7IF9pMTY1IDwgX21hcDE2Mi5zaXplOyArK19pMTY1KQorICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwMTgwID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNULCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JNjQsIGlwcm90LnJlYWRJMzIoKSk7CisgICAgICAgICAgICBfdmFsMTc4ID0gbmV3IEhhc2hNYXA8R2xvYmFsU3RyZWFtSWQsTG9uZz4oMipfbWFwMTgwLnNpemUpOworICAgICAgICAgICAgR2xvYmFsU3RyZWFtSWQgX2tleTE4MTsKKyAgICAgICAgICAgIGxvbmcgX3ZhbDE4MjsKKyAgICAgICAgICAgIGZvciAoaW50IF9pMTgzID0gMDsgX2kxODMgPCBfbWFwMTgwLnNpemU7ICsrX2kxODMpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIF9rZXkxNjMgPSBuZXcgR2xvYmFsU3RyZWFtSWQoKTsKLSAgICAgICAgICAgICAgX2tleTE2My5yZWFkKGlwcm90KTsKLSAgICAgICAgICAgICAgX3ZhbDE2NCA9IGlwcm90LnJlYWRJNjQoKTsKLSAgICAgICAgICAgICAgX3ZhbDE2MC5wdXQoX2tleTE2MywgX3ZhbDE2NCk7CisgICAgICAgICAgICAgIF9rZXkxODEgPSBuZXcgR2xvYmFsU3RyZWFtSWQoKTsKKyAgICAgICAgICAgICAgX2tleTE4MS5yZWFkKGlwcm90KTsKKyAgICAgICAgICAgICAgX3ZhbDE4MiA9IGlwcm90LnJlYWRJNjQoKTsKKyAgICAgICAgICAgICAgX3ZhbDE3OC5wdXQoX2tleTE4MSwgX3ZhbDE4Mik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQotICAgICAgICAgIHN0cnVjdC5hY2tlZC5wdXQoX2tleTE1OSwgX3ZhbDE2MCk7CisgICAgICAgICAgc3RydWN0LmFja2VkLnB1dChfa2V5MTc3LCBfdmFsMTc4KTsKICAgICAgICAgfQogICAgICAgfQogICAgICAgc3RydWN0LnNldF9hY2tlZF9pc1NldCh0cnVlKTsKICAgICAgIHsKLSAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwMTY2ID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5NQVAsIGlwcm90LnJlYWRJMzIoKSk7Ci0gICAgICAgIHN0cnVjdC5mYWlsZWQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsTWFwPEdsb2JhbFN0cmVhbUlkLExvbmc+PigyKl9tYXAxNjYuc2l6ZSk7Ci0gICAgICAgIFN0cmluZyBfa2V5MTY3OwotICAgICAgICBNYXA8R2xvYmFsU3RyZWFtSWQsTG9uZz4gX3ZhbDE2ODsKLSAgICAgICAgZm9yIChpbnQgX2kxNjkgPSAwOyBfaTE2OSA8IF9tYXAxNjYuc2l6ZTsgKytfaTE2OSkKKyAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwMTg0ID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5NQVAsIGlwcm90LnJlYWRJMzIoKSk7CisgICAgICAgIHN0cnVjdC5mYWlsZWQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsTWFwPEdsb2JhbFN0cmVhbUlkLExvbmc+PigyKl9tYXAxODQuc2l6ZSk7CisgICAgICAgIFN0cmluZyBfa2V5MTg1OworICAgICAgICBNYXA8R2xvYmFsU3RyZWFtSWQsTG9uZz4gX3ZhbDE4NjsKKyAgICAgICAgZm9yIChpbnQgX2kxODcgPSAwOyBfaTE4NyA8IF9tYXAxODQuc2l6ZTsgKytfaTE4NykKICAgICAgICAgewotICAgICAgICAgIF9rZXkxNjcgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgX2tleTE4NSA9IGlwcm90LnJlYWRTdHJpbmcoKTsKICAgICAgICAgICB7Ci0gICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwIF9tYXAxNzAgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkk2NCwgaXByb3QucmVhZEkzMigpKTsKLSAgICAgICAgICAgIF92YWwxNjggPSBuZXcgSGFzaE1hcDxHbG9iYWxTdHJlYW1JZCxMb25nPigyKl9tYXAxNzAuc2l6ZSk7Ci0gICAgICAgICAgICBHbG9iYWxTdHJlYW1JZCBfa2V5MTcxOwotICAgICAgICAgICAgbG9uZyBfdmFsMTcyOwotICAgICAgICAgICAgZm9yIChpbnQgX2kxNzMgPSAwOyBfaTE3MyA8IF9tYXAxNzAuc2l6ZTsgKytfaTE3MykKKyAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgX21hcDE4OCA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTY0LCBpcHJvdC5yZWFkSTMyKCkpOworICAgICAgICAgICAgX3ZhbDE4NiA9IG5ldyBIYXNoTWFwPEdsb2JhbFN0cmVhbUlkLExvbmc+KDIqX21hcDE4OC5zaXplKTsKKyAgICAgICAgICAgIEdsb2JhbFN0cmVhbUlkIF9rZXkxODk7CisgICAgICAgICAgICBsb25nIF92YWwxOTA7CisgICAgICAgICAgICBmb3IgKGludCBfaTE5MSA9IDA7IF9pMTkxIDwgX21hcDE4OC5zaXplOyArK19pMTkxKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICBfa2V5MTcxID0gbmV3IEdsb2JhbFN0cmVhbUlkKCk7Ci0gICAgICAgICAgICAgIF9rZXkxNzEucmVhZChpcHJvdCk7Ci0gICAgICAgICAgICAgIF92YWwxNzIgPSBpcHJvdC5yZWFkSTY0KCk7Ci0gICAgICAgICAgICAgIF92YWwxNjgucHV0KF9rZXkxNzEsIF92YWwxNzIpOworICAgICAgICAgICAgICBfa2V5MTg5ID0gbmV3IEdsb2JhbFN0cmVhbUlkKCk7CisgICAgICAgICAgICAgIF9rZXkxODkucmVhZChpcHJvdCk7CisgICAgICAgICAgICAgIF92YWwxOTAgPSBpcHJvdC5yZWFkSTY0KCk7CisgICAgICAgICAgICAgIF92YWwxODYucHV0KF9rZXkxODksIF92YWwxOTApOwogICAgICAgICAgICAgfQogICAgICAgICAgIH0KLSAgICAgICAgICBzdHJ1Y3QuZmFpbGVkLnB1dChfa2V5MTY3LCBfdmFsMTY4KTsKKyAgICAgICAgICBzdHJ1Y3QuZmFpbGVkLnB1dChfa2V5MTg1LCBfdmFsMTg2KTsKICAgICAgICAgfQogICAgICAgfQogICAgICAgc3RydWN0LnNldF9mYWlsZWRfaXNTZXQodHJ1ZSk7CiAgICAgICB7Ci0gICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgX21hcDE3NCA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORywgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTUFQLCBpcHJvdC5yZWFkSTMyKCkpOwotICAgICAgICBzdHJ1Y3QucHJvY2Vzc19tc19hdmcgPSBuZXcgSGFzaE1hcDxTdHJpbmcsTWFwPEdsb2JhbFN0cmVhbUlkLERvdWJsZT4+KDIqX21hcDE3NC5zaXplKTsKLSAgICAgICAgU3RyaW5nIF9rZXkxNzU7Ci0gICAgICAgIE1hcDxHbG9iYWxTdHJlYW1JZCxEb3VibGU+IF92YWwxNzY7Ci0gICAgICAgIGZvciAoaW50IF9pMTc3ID0gMDsgX2kxNzcgPCBfbWFwMTc0LnNpemU7ICsrX2kxNzcpCisgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgX21hcDE5MiA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORywgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTUFQLCBpcHJvdC5yZWFkSTMyKCkpOworICAgICAgICBzdHJ1Y3QucHJvY2Vzc19tc19hdmcgPSBuZXcgSGFzaE1hcDxTdHJpbmcsTWFwPEdsb2JhbFN0cmVhbUlkLERvdWJsZT4+KDIqX21hcDE5Mi5zaXplKTsKKyAgICAgICAgU3RyaW5nIF9rZXkxOTM7CisgICAgICAgIE1hcDxHbG9iYWxTdHJlYW1JZCxEb3VibGU+IF92YWwxOTQ7CisgICAgICAgIGZvciAoaW50IF9pMTk1ID0gMDsgX2kxOTUgPCBfbWFwMTkyLnNpemU7ICsrX2kxOTUpCiAgICAgICAgIHsKLSAgICAgICAgICBfa2V5MTc1ID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICAgIF9rZXkxOTMgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CiAgICAgICAgICAgewotICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwMTc4ID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNULCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5ET1VCTEUsIGlwcm90LnJlYWRJMzIoKSk7Ci0gICAgICAgICAgICBfdmFsMTc2ID0gbmV3IEhhc2hNYXA8R2xvYmFsU3RyZWFtSWQsRG91YmxlPigyKl9tYXAxNzguc2l6ZSk7Ci0gICAgICAgICAgICBHbG9iYWxTdHJlYW1JZCBfa2V5MTc5OwotICAgICAgICAgICAgZG91YmxlIF92YWwxODA7Ci0gICAgICAgICAgICBmb3IgKGludCBfaTE4MSA9IDA7IF9pMTgxIDwgX21hcDE3OC5zaXplOyArK19pMTgxKQorICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwMTk2ID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNULCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5ET1VCTEUsIGlwcm90LnJlYWRJMzIoKSk7CisgICAgICAgICAgICBfdmFsMTk0ID0gbmV3IEhhc2hNYXA8R2xvYmFsU3RyZWFtSWQsRG91YmxlPigyKl9tYXAxOTYuc2l6ZSk7CisgICAgICAgICAgICBHbG9iYWxTdHJlYW1JZCBfa2V5MTk3OworICAgICAgICAgICAgZG91YmxlIF92YWwxOTg7CisgICAgICAgICAgICBmb3IgKGludCBfaTE5OSA9IDA7IF9pMTk5IDwgX21hcDE5Ni5zaXplOyArK19pMTk5KQogICAgICAgICAgICAgewotICAgICAgICAgICAgICBfa2V5MTc5ID0gbmV3IEdsb2JhbFN0cmVhbUlkKCk7Ci0gICAgICAgICAgICAgIF9rZXkxNzkucmVhZChpcHJvdCk7Ci0gICAgICAgICAgICAgIF92YWwxODAgPSBpcHJvdC5yZWFkRG91YmxlKCk7Ci0gICAgICAgICAgICAgIF92YWwxNzYucHV0KF9rZXkxNzksIF92YWwxODApOworICAgICAgICAgICAgICBfa2V5MTk3ID0gbmV3IEdsb2JhbFN0cmVhbUlkKCk7CisgICAgICAgICAgICAgIF9rZXkxOTcucmVhZChpcHJvdCk7CisgICAgICAgICAgICAgIF92YWwxOTggPSBpcHJvdC5yZWFkRG91YmxlKCk7CisgICAgICAgICAgICAgIF92YWwxOTQucHV0KF9rZXkxOTcsIF92YWwxOTgpOwogICAgICAgICAgICAgfQogICAgICAgICAgIH0KLSAgICAgICAgICBzdHJ1Y3QucHJvY2Vzc19tc19hdmcucHV0KF9rZXkxNzUsIF92YWwxNzYpOworICAgICAgICAgIHN0cnVjdC5wcm9jZXNzX21zX2F2Zy5wdXQoX2tleTE5MywgX3ZhbDE5NCk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICAgIHN0cnVjdC5zZXRfcHJvY2Vzc19tc19hdmdfaXNTZXQodHJ1ZSk7CiAgICAgICB7Ci0gICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgX21hcDE4MiA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORywgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTUFQLCBpcHJvdC5yZWFkSTMyKCkpOwotICAgICAgICBzdHJ1Y3QuZXhlY3V0ZWQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsTWFwPEdsb2JhbFN0cmVhbUlkLExvbmc+PigyKl9tYXAxODIuc2l6ZSk7Ci0gICAgICAgIFN0cmluZyBfa2V5MTgzOwotICAgICAgICBNYXA8R2xvYmFsU3RyZWFtSWQsTG9uZz4gX3ZhbDE4NDsKLSAgICAgICAgZm9yIChpbnQgX2kxODUgPSAwOyBfaTE4NSA8IF9tYXAxODIuc2l6ZTsgKytfaTE4NSkKKyAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwMjAwID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5NQVAsIGlwcm90LnJlYWRJMzIoKSk7CisgICAgICAgIHN0cnVjdC5leGVjdXRlZCA9IG5ldyBIYXNoTWFwPFN0cmluZyxNYXA8R2xvYmFsU3RyZWFtSWQsTG9uZz4+KDIqX21hcDIwMC5zaXplKTsKKyAgICAgICAgU3RyaW5nIF9rZXkyMDE7CisgICAgICAgIE1hcDxHbG9iYWxTdHJlYW1JZCxMb25nPiBfdmFsMjAyOworICAgICAgICBmb3IgKGludCBfaTIwMyA9IDA7IF9pMjAzIDwgX21hcDIwMC5zaXplOyArK19pMjAzKQogICAgICAgICB7Ci0gICAgICAgICAgX2tleTE4MyA9IGlwcm90LnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICBfa2V5MjAxID0gaXByb3QucmVhZFN0cmluZygpOwogICAgICAgICAgIHsKLSAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgX21hcDE4NiA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTY0LCBpcHJvdC5yZWFkSTMyKCkpOwotICAgICAgICAgICAgX3ZhbDE4NCA9IG5ldyBIYXNoTWFwPEdsb2JhbFN0cmVhbUlkLExvbmc+KDIqX21hcDE4Ni5zaXplKTsKLSAgICAgICAgICAgIEdsb2JhbFN0cmVhbUlkIF9rZXkxODc7Ci0gICAgICAgICAgICBsb25nIF92YWwxODg7Ci0gICAgICAgICAgICBmb3IgKGludCBfaTE4OSA9IDA7IF9pMTg5IDwgX21hcDE4Ni5zaXplOyArK19pMTg5KQorICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwMjA0ID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNULCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JNjQsIGlwcm90LnJlYWRJMzIoKSk7CisgICAgICAgICAgICBfdmFsMjAyID0gbmV3IEhhc2hNYXA8R2xvYmFsU3RyZWFtSWQsTG9uZz4oMipfbWFwMjA0LnNpemUpOworICAgICAgICAgICAgR2xvYmFsU3RyZWFtSWQgX2tleTIwNTsKKyAgICAgICAgICAgIGxvbmcgX3ZhbDIwNjsKKyAgICAgICAgICAgIGZvciAoaW50IF9pMjA3ID0gMDsgX2kyMDcgPCBfbWFwMjA0LnNpemU7ICsrX2kyMDcpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIF9rZXkxODcgPSBuZXcgR2xvYmFsU3RyZWFtSWQoKTsKLSAgICAgICAgICAgICAgX2tleTE4Ny5yZWFkKGlwcm90KTsKLSAgICAgICAgICAgICAgX3ZhbDE4OCA9IGlwcm90LnJlYWRJNjQoKTsKLSAgICAgICAgICAgICAgX3ZhbDE4NC5wdXQoX2tleTE4NywgX3ZhbDE4OCk7CisgICAgICAgICAgICAgIF9rZXkyMDUgPSBuZXcgR2xvYmFsU3RyZWFtSWQoKTsKKyAgICAgICAgICAgICAgX2tleTIwNS5yZWFkKGlwcm90KTsKKyAgICAgICAgICAgICAgX3ZhbDIwNiA9IGlwcm90LnJlYWRJNjQoKTsKKyAgICAgICAgICAgICAgX3ZhbDIwMi5wdXQoX2tleTIwNSwgX3ZhbDIwNik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQotICAgICAgICAgIHN0cnVjdC5leGVjdXRlZC5wdXQoX2tleTE4MywgX3ZhbDE4NCk7CisgICAgICAgICAgc3RydWN0LmV4ZWN1dGVkLnB1dChfa2V5MjAxLCBfdmFsMjAyKTsKICAgICAgICAgfQogICAgICAgfQogICAgICAgc3RydWN0LnNldF9leGVjdXRlZF9pc1NldCh0cnVlKTsKICAgICAgIHsKLSAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwMTkwID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5NQVAsIGlwcm90LnJlYWRJMzIoKSk7Ci0gICAgICAgIHN0cnVjdC5leGVjdXRlX21zX2F2ZyA9IG5ldyBIYXNoTWFwPFN0cmluZyxNYXA8R2xvYmFsU3RyZWFtSWQsRG91YmxlPj4oMipfbWFwMTkwLnNpemUpOwotICAgICAgICBTdHJpbmcgX2tleTE5MTsKLSAgICAgICAgTWFwPEdsb2JhbFN0cmVhbUlkLERvdWJsZT4gX3ZhbDE5MjsKLSAgICAgICAgZm9yIChpbnQgX2kxOTMgPSAwOyBfaTE5MyA8IF9tYXAxOTAuc2l6ZTsgKytfaTE5MykKKyAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwMjA4ID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5NQVAsIGlwcm90LnJlYWRJMzIoKSk7CisgICAgICAgIHN0cnVjdC5leGVjdXRlX21zX2F2ZyA9IG5ldyBIYXNoTWFwPFN0cmluZyxNYXA8R2xvYmFsU3RyZWFtSWQsRG91YmxlPj4oMipfbWFwMjA4LnNpemUpOworICAgICAgICBTdHJpbmcgX2tleTIwOTsKKyAgICAgICAgTWFwPEdsb2JhbFN0cmVhbUlkLERvdWJsZT4gX3ZhbDIxMDsKKyAgICAgICAgZm9yIChpbnQgX2kyMTEgPSAwOyBfaTIxMSA8IF9tYXAyMDguc2l6ZTsgKytfaTIxMSkKICAgICAgICAgewotICAgICAgICAgIF9rZXkxOTEgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgX2tleTIwOSA9IGlwcm90LnJlYWRTdHJpbmcoKTsKICAgICAgICAgICB7Ci0gICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwIF9tYXAxOTQgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkRPVUJMRSwgaXByb3QucmVhZEkzMigpKTsKLSAgICAgICAgICAgIF92YWwxOTIgPSBuZXcgSGFzaE1hcDxHbG9iYWxTdHJlYW1JZCxEb3VibGU+KDIqX21hcDE5NC5zaXplKTsKLSAgICAgICAgICAgIEdsb2JhbFN0cmVhbUlkIF9rZXkxOTU7Ci0gICAgICAgICAgICBkb3VibGUgX3ZhbDE5NjsKLSAgICAgICAgICAgIGZvciAoaW50IF9pMTk3ID0gMDsgX2kxOTcgPCBfbWFwMTk0LnNpemU7ICsrX2kxOTcpCisgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwIF9tYXAyMTIgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkRPVUJMRSwgaXByb3QucmVhZEkzMigpKTsKKyAgICAgICAgICAgIF92YWwyMTAgPSBuZXcgSGFzaE1hcDxHbG9iYWxTdHJlYW1JZCxEb3VibGU+KDIqX21hcDIxMi5zaXplKTsKKyAgICAgICAgICAgIEdsb2JhbFN0cmVhbUlkIF9rZXkyMTM7CisgICAgICAgICAgICBkb3VibGUgX3ZhbDIxNDsKKyAgICAgICAgICAgIGZvciAoaW50IF9pMjE1ID0gMDsgX2kyMTUgPCBfbWFwMjEyLnNpemU7ICsrX2kyMTUpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIF9rZXkxOTUgPSBuZXcgR2xvYmFsU3RyZWFtSWQoKTsKLSAgICAgICAgICAgICAgX2tleTE5NS5yZWFkKGlwcm90KTsKLSAgICAgICAgICAgICAgX3ZhbDE5NiA9IGlwcm90LnJlYWREb3VibGUoKTsKLSAgICAgICAgICAgICAgX3ZhbDE5Mi5wdXQoX2tleTE5NSwgX3ZhbDE5Nik7CisgICAgICAgICAgICAgIF9rZXkyMTMgPSBuZXcgR2xvYmFsU3RyZWFtSWQoKTsKKyAgICAgICAgICAgICAgX2tleTIxMy5yZWFkKGlwcm90KTsKKyAgICAgICAgICAgICAgX3ZhbDIxNCA9IGlwcm90LnJlYWREb3VibGUoKTsKKyAgICAgICAgICAgICAgX3ZhbDIxMC5wdXQoX2tleTIxMywgX3ZhbDIxNCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQotICAgICAgICAgIHN0cnVjdC5leGVjdXRlX21zX2F2Zy5wdXQoX2tleTE5MSwgX3ZhbDE5Mik7CisgICAgICAgICAgc3RydWN0LmV4ZWN1dGVfbXNfYXZnLnB1dChfa2V5MjA5LCBfdmFsMjEwKTsKICAgICAgICAgfQogICAgICAgfQogICAgICAgc3RydWN0LnNldF9leGVjdXRlX21zX2F2Z19pc1NldCh0cnVlKTsKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvQ2x1c3RlclN1bW1hcnkuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvQ2x1c3RlclN1bW1hcnkuamF2YQppbmRleCBlNTY1MWRmLi45YzQyNDI3IDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL0NsdXN0ZXJTdW1tYXJ5LmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9DbHVzdGVyU3VtbWFyeS5qYXZhCkBAIC0xNiw3ICsxNiw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogLyoqCi0gKiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjIpCisgKiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjMpCiAgKgogICogRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lORwogICogIEBnZW5lcmF0ZWQKQEAgLTUxLDExICs1MSwxMiBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCiBAU3VwcHJlc3NXYXJuaW5ncyh7ImNhc3QiLCAicmF3dHlwZXMiLCAic2VyaWFsIiwgInVuY2hlY2tlZCJ9KQotQEdlbmVyYXRlZCh2YWx1ZSA9ICJBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjIpIiwgZGF0ZSA9ICIyMDE1LTMtMiIpCitAR2VuZXJhdGVkKHZhbHVlID0gIkF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMykiKQogcHVibGljIGNsYXNzIENsdXN0ZXJTdW1tYXJ5IGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2U8Q2x1c3RlclN1bW1hcnksIENsdXN0ZXJTdW1tYXJ5Ll9GaWVsZHM+LCBqYXZhLmlvLlNlcmlhbGl6YWJsZSwgQ2xvbmVhYmxlLCBDb21wYXJhYmxlPENsdXN0ZXJTdW1tYXJ5PiB7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QgU1RSVUNUX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdCgiQ2x1c3RlclN1bW1hcnkiKTsKIAogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgU1VQRVJWSVNPUlNfRklFTERfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQoInN1cGVydmlzb3JzIiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTElTVCwgKHNob3J0KTEpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgTklNQlVTX1VQVElNRV9TRUNTX0ZJRUxEX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkKCJuaW1idXNfdXB0aW1lX3NlY3MiLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JMzIsIChzaG9ydCkyKTsKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIFRPUE9MT0dJRVNfRklFTERfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQoInRvcG9sb2dpZXMiLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5MSVNULCAoc2hvcnQpMyk7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBOSU1CVVNFU19GSUVMRF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCgibmltYnVzZXMiLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5MSVNULCAoc2hvcnQpNCk7CiAKQEAgLTY2LDEyICs2NywxNCBAQAogICB9CiAKICAgcHJpdmF0ZSBMaXN0PFN1cGVydmlzb3JTdW1tYXJ5PiBzdXBlcnZpc29yczsgLy8gcmVxdWlyZWQKKyAgcHJpdmF0ZSBpbnQgbmltYnVzX3VwdGltZV9zZWNzOyAvLyBvcHRpb25hbAogICBwcml2YXRlIExpc3Q8VG9wb2xvZ3lTdW1tYXJ5PiB0b3BvbG9naWVzOyAvLyByZXF1aXJlZAogICBwcml2YXRlIExpc3Q8TmltYnVzU3VtbWFyeT4gbmltYnVzZXM7IC8vIHJlcXVpcmVkCiAKICAgLyoqIFRoZSBzZXQgb2YgZmllbGRzIHRoaXMgc3RydWN0IGNvbnRhaW5zLCBhbG9uZyB3aXRoIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9yIGZpbmRpbmcgYW5kIG1hbmlwdWxhdGluZyB0aGVtLiAqLwogICBwdWJsaWMgZW51bSBfRmllbGRzIGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkSWRFbnVtIHsKICAgICBTVVBFUlZJU09SUygoc2hvcnQpMSwgInN1cGVydmlzb3JzIiksCisgICAgTklNQlVTX1VQVElNRV9TRUNTKChzaG9ydCkyLCAibmltYnVzX3VwdGltZV9zZWNzIiksCiAgICAgVE9QT0xPR0lFUygoc2hvcnQpMywgInRvcG9sb2dpZXMiKSwKICAgICBOSU1CVVNFUygoc2hvcnQpNCwgIm5pbWJ1c2VzIik7CiAKQEAgLTkwLDYgKzkzLDggQEAKICAgICAgIHN3aXRjaChmaWVsZElkKSB7CiAgICAgICAgIGNhc2UgMTogLy8gU1VQRVJWSVNPUlMKICAgICAgICAgICByZXR1cm4gU1VQRVJWSVNPUlM7CisgICAgICAgIGNhc2UgMjogLy8gTklNQlVTX1VQVElNRV9TRUNTCisgICAgICAgICAgcmV0dXJuIE5JTUJVU19VUFRJTUVfU0VDUzsKICAgICAgICAgY2FzZSAzOiAvLyBUT1BPTE9HSUVTCiAgICAgICAgICAgcmV0dXJuIFRPUE9MT0dJRVM7CiAgICAgICAgIGNhc2UgNDogLy8gTklNQlVTRVMKQEAgLTEzNCwxMiArMTM5LDE3IEBACiAgIH0KIAogICAvLyBpc3NldCBpZCBhc3NpZ25tZW50cworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgX19OSU1CVVNfVVBUSU1FX1NFQ1NfSVNTRVRfSUQgPSAwOworICBwcml2YXRlIGJ5dGUgX19pc3NldF9iaXRmaWVsZCA9IDA7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIF9GaWVsZHMgb3B0aW9uYWxzW10gPSB7X0ZpZWxkcy5OSU1CVVNfVVBUSU1FX1NFQ1N9OwogICBwdWJsaWMgc3RhdGljIGZpbmFsIE1hcDxfRmllbGRzLCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YT4gbWV0YURhdGFNYXA7CiAgIHN0YXRpYyB7CiAgICAgTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPiB0bXBNYXAgPSBuZXcgRW51bU1hcDxfRmllbGRzLCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YT4oX0ZpZWxkcy5jbGFzcyk7CiAgICAgdG1wTWFwLnB1dChfRmllbGRzLlNVUEVSVklTT1JTLCBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEoInN1cGVydmlzb3JzIiwgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLlJFUVVJUkVELCAKICAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5MaXN0TWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTElTVCwgCiAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLlN0cnVjdE1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCwgU3VwZXJ2aXNvclN1bW1hcnkuY2xhc3MpKSkpOworICAgIHRtcE1hcC5wdXQoX0ZpZWxkcy5OSU1CVVNfVVBUSU1FX1NFQ1MsIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YSgibmltYnVzX3VwdGltZV9zZWNzIiwgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLk9QVElPTkFMLCAKKyAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZFZhbHVlTWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTMyKSkpOwogICAgIHRtcE1hcC5wdXQoX0ZpZWxkcy5UT1BPTE9HSUVTLCBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEoInRvcG9sb2dpZXMiLCBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRSZXF1aXJlbWVudFR5cGUuUkVRVUlSRUQsIAogICAgICAgICBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkxpc3RNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5MSVNULCAKICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuU3RydWN0TWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNULCBUb3BvbG9neVN1bW1hcnkuY2xhc3MpKSkpOwpAQCAtMTUxLDYgKzE2MSw4IEBACiAgIH0KIAogICBwdWJsaWMgQ2x1c3RlclN1bW1hcnkoKSB7CisgICAgdGhpcy5uaW1idXNfdXB0aW1lX3NlY3MgPSAwOworCiAgIH0KIAogICBwdWJsaWMgQ2x1c3RlclN1bW1hcnkoCkBAIC0xNjgsNiArMTgwLDcgQEAKICAgICogUGVyZm9ybXMgYSBkZWVwIGNvcHkgb24gPGk+b3RoZXI8L2k+LgogICAgKi8KICAgcHVibGljIENsdXN0ZXJTdW1tYXJ5KENsdXN0ZXJTdW1tYXJ5IG90aGVyKSB7CisgICAgX19pc3NldF9iaXRmaWVsZCA9IG90aGVyLl9faXNzZXRfYml0ZmllbGQ7CiAgICAgaWYgKG90aGVyLmlzX3NldF9zdXBlcnZpc29ycygpKSB7CiAgICAgICBMaXN0PFN1cGVydmlzb3JTdW1tYXJ5PiBfX3RoaXNfX3N1cGVydmlzb3JzID0gbmV3IEFycmF5TGlzdDxTdXBlcnZpc29yU3VtbWFyeT4ob3RoZXIuc3VwZXJ2aXNvcnMuc2l6ZSgpKTsKICAgICAgIGZvciAoU3VwZXJ2aXNvclN1bW1hcnkgb3RoZXJfZWxlbWVudCA6IG90aGVyLnN1cGVydmlzb3JzKSB7CkBAIC0xNzUsNiArMTg4LDcgQEAKICAgICAgIH0KICAgICAgIHRoaXMuc3VwZXJ2aXNvcnMgPSBfX3RoaXNfX3N1cGVydmlzb3JzOwogICAgIH0KKyAgICB0aGlzLm5pbWJ1c191cHRpbWVfc2VjcyA9IG90aGVyLm5pbWJ1c191cHRpbWVfc2VjczsKICAgICBpZiAob3RoZXIuaXNfc2V0X3RvcG9sb2dpZXMoKSkgewogICAgICAgTGlzdDxUb3BvbG9neVN1bW1hcnk+IF9fdGhpc19fdG9wb2xvZ2llcyA9IG5ldyBBcnJheUxpc3Q8VG9wb2xvZ3lTdW1tYXJ5PihvdGhlci50b3BvbG9naWVzLnNpemUoKSk7CiAgICAgICBmb3IgKFRvcG9sb2d5U3VtbWFyeSBvdGhlcl9lbGVtZW50IDogb3RoZXIudG9wb2xvZ2llcykgewpAQCAtMTk4LDYgKzIxMiw4IEBACiAgIEBPdmVycmlkZQogICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKICAgICB0aGlzLnN1cGVydmlzb3JzID0gbnVsbDsKKyAgICB0aGlzLm5pbWJ1c191cHRpbWVfc2VjcyA9IDA7CisKICAgICB0aGlzLnRvcG9sb2dpZXMgPSBudWxsOwogICAgIHRoaXMubmltYnVzZXMgPSBudWxsOwogICB9CkBAIC0yNDAsNiArMjU2LDI4IEBACiAgICAgfQogICB9CiAKKyAgcHVibGljIGludCBnZXRfbmltYnVzX3VwdGltZV9zZWNzKCkgeworICAgIHJldHVybiB0aGlzLm5pbWJ1c191cHRpbWVfc2VjczsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF9uaW1idXNfdXB0aW1lX3NlY3MoaW50IG5pbWJ1c191cHRpbWVfc2VjcykgeworICAgIHRoaXMubmltYnVzX3VwdGltZV9zZWNzID0gbmltYnVzX3VwdGltZV9zZWNzOworICAgIHNldF9uaW1idXNfdXB0aW1lX3NlY3NfaXNTZXQodHJ1ZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB1bnNldF9uaW1idXNfdXB0aW1lX3NlY3MoKSB7CisgICAgX19pc3NldF9iaXRmaWVsZCA9IEVuY29kaW5nVXRpbHMuY2xlYXJCaXQoX19pc3NldF9iaXRmaWVsZCwgX19OSU1CVVNfVVBUSU1FX1NFQ1NfSVNTRVRfSUQpOworICB9CisKKyAgLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBuaW1idXNfdXB0aW1lX3NlY3MgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgIHB1YmxpYyBib29sZWFuIGlzX3NldF9uaW1idXNfdXB0aW1lX3NlY3MoKSB7CisgICAgcmV0dXJuIEVuY29kaW5nVXRpbHMudGVzdEJpdChfX2lzc2V0X2JpdGZpZWxkLCBfX05JTUJVU19VUFRJTUVfU0VDU19JU1NFVF9JRCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfbmltYnVzX3VwdGltZV9zZWNzX2lzU2V0KGJvb2xlYW4gdmFsdWUpIHsKKyAgICBfX2lzc2V0X2JpdGZpZWxkID0gRW5jb2RpbmdVdGlscy5zZXRCaXQoX19pc3NldF9iaXRmaWVsZCwgX19OSU1CVVNfVVBUSU1FX1NFQ1NfSVNTRVRfSUQsIHZhbHVlKTsKKyAgfQorCiAgIHB1YmxpYyBpbnQgZ2V0X3RvcG9sb2dpZXNfc2l6ZSgpIHsKICAgICByZXR1cm4gKHRoaXMudG9wb2xvZ2llcyA9PSBudWxsKSA/IDAgOiB0aGlzLnRvcG9sb2dpZXMuc2l6ZSgpOwogICB9CkBAIC0zMjYsNiArMzY0LDE0IEBACiAgICAgICB9CiAgICAgICBicmVhazsKIAorICAgIGNhc2UgTklNQlVTX1VQVElNRV9TRUNTOgorICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgdW5zZXRfbmltYnVzX3VwdGltZV9zZWNzKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzZXRfbmltYnVzX3VwdGltZV9zZWNzKChJbnRlZ2VyKXZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCiAgICAgY2FzZSBUT1BPTE9HSUVTOgogICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKICAgICAgICAgdW5zZXRfdG9wb2xvZ2llcygpOwpAQCAtMzUwLDYgKzM5Niw5IEBACiAgICAgY2FzZSBTVVBFUlZJU09SUzoKICAgICAgIHJldHVybiBnZXRfc3VwZXJ2aXNvcnMoKTsKIAorICAgIGNhc2UgTklNQlVTX1VQVElNRV9TRUNTOgorICAgICAgcmV0dXJuIGdldF9uaW1idXNfdXB0aW1lX3NlY3MoKTsKKwogICAgIGNhc2UgVE9QT0xPR0lFUzoKICAgICAgIHJldHVybiBnZXRfdG9wb2xvZ2llcygpOwogCkBAIC0zNjksNiArNDE4LDggQEAKICAgICBzd2l0Y2ggKGZpZWxkKSB7CiAgICAgY2FzZSBTVVBFUlZJU09SUzoKICAgICAgIHJldHVybiBpc19zZXRfc3VwZXJ2aXNvcnMoKTsKKyAgICBjYXNlIE5JTUJVU19VUFRJTUVfU0VDUzoKKyAgICAgIHJldHVybiBpc19zZXRfbmltYnVzX3VwdGltZV9zZWNzKCk7CiAgICAgY2FzZSBUT1BPTE9HSUVTOgogICAgICAgcmV0dXJuIGlzX3NldF90b3BvbG9naWVzKCk7CiAgICAgY2FzZSBOSU1CVVNFUzoKQEAgLTM5OSw2ICs0NTAsMTUgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAorICAgIGJvb2xlYW4gdGhpc19wcmVzZW50X25pbWJ1c191cHRpbWVfc2VjcyA9IHRydWUgJiYgdGhpcy5pc19zZXRfbmltYnVzX3VwdGltZV9zZWNzKCk7CisgICAgYm9vbGVhbiB0aGF0X3ByZXNlbnRfbmltYnVzX3VwdGltZV9zZWNzID0gdHJ1ZSAmJiB0aGF0LmlzX3NldF9uaW1idXNfdXB0aW1lX3NlY3MoKTsKKyAgICBpZiAodGhpc19wcmVzZW50X25pbWJ1c191cHRpbWVfc2VjcyB8fCB0aGF0X3ByZXNlbnRfbmltYnVzX3VwdGltZV9zZWNzKSB7CisgICAgICBpZiAoISh0aGlzX3ByZXNlbnRfbmltYnVzX3VwdGltZV9zZWNzICYmIHRoYXRfcHJlc2VudF9uaW1idXNfdXB0aW1lX3NlY3MpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBpZiAodGhpcy5uaW1idXNfdXB0aW1lX3NlY3MgIT0gdGhhdC5uaW1idXNfdXB0aW1lX3NlY3MpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKICAgICBib29sZWFuIHRoaXNfcHJlc2VudF90b3BvbG9naWVzID0gdHJ1ZSAmJiB0aGlzLmlzX3NldF90b3BvbG9naWVzKCk7CiAgICAgYm9vbGVhbiB0aGF0X3ByZXNlbnRfdG9wb2xvZ2llcyA9IHRydWUgJiYgdGhhdC5pc19zZXRfdG9wb2xvZ2llcygpOwogICAgIGlmICh0aGlzX3ByZXNlbnRfdG9wb2xvZ2llcyB8fCB0aGF0X3ByZXNlbnRfdG9wb2xvZ2llcykgewpAQCAtNDI5LDYgKzQ4OSwxMSBAQAogICAgIGlmIChwcmVzZW50X3N1cGVydmlzb3JzKQogICAgICAgbGlzdC5hZGQoc3VwZXJ2aXNvcnMpOwogCisgICAgYm9vbGVhbiBwcmVzZW50X25pbWJ1c191cHRpbWVfc2VjcyA9IHRydWUgJiYgKGlzX3NldF9uaW1idXNfdXB0aW1lX3NlY3MoKSk7CisgICAgbGlzdC5hZGQocHJlc2VudF9uaW1idXNfdXB0aW1lX3NlY3MpOworICAgIGlmIChwcmVzZW50X25pbWJ1c191cHRpbWVfc2VjcykKKyAgICAgIGxpc3QuYWRkKG5pbWJ1c191cHRpbWVfc2Vjcyk7CisKICAgICBib29sZWFuIHByZXNlbnRfdG9wb2xvZ2llcyA9IHRydWUgJiYgKGlzX3NldF90b3BvbG9naWVzKCkpOwogICAgIGxpc3QuYWRkKHByZXNlbnRfdG9wb2xvZ2llcyk7CiAgICAgaWYgKHByZXNlbnRfdG9wb2xvZ2llcykKQEAgLTQ2MCw2ICs1MjUsMTYgQEAKICAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOwogICAgICAgfQogICAgIH0KKyAgICBsYXN0Q29tcGFyaXNvbiA9IEJvb2xlYW4udmFsdWVPZihpc19zZXRfbmltYnVzX3VwdGltZV9zZWNzKCkpLmNvbXBhcmVUbyhvdGhlci5pc19zZXRfbmltYnVzX3VwdGltZV9zZWNzKCkpOworICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgfQorICAgIGlmIChpc19zZXRfbmltYnVzX3VwdGltZV9zZWNzKCkpIHsKKyAgICAgIGxhc3RDb21wYXJpc29uID0gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29tcGFyZVRvKHRoaXMubmltYnVzX3VwdGltZV9zZWNzLCBvdGhlci5uaW1idXNfdXB0aW1lX3NlY3MpOworICAgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgICAgfQorICAgIH0KICAgICBsYXN0Q29tcGFyaXNvbiA9IEJvb2xlYW4udmFsdWVPZihpc19zZXRfdG9wb2xvZ2llcygpKS5jb21wYXJlVG8ob3RoZXIuaXNfc2V0X3RvcG9sb2dpZXMoKSk7CiAgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKQEAgLTUwNyw2ICs1ODIsMTIgQEAKICAgICAgIHNiLmFwcGVuZCh0aGlzLnN1cGVydmlzb3JzKTsKICAgICB9CiAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICBpZiAoaXNfc2V0X25pbWJ1c191cHRpbWVfc2VjcygpKSB7CisgICAgICBpZiAoIWZpcnN0KSBzYi5hcHBlbmQoIiwgIik7CisgICAgICBzYi5hcHBlbmQoIm5pbWJ1c191cHRpbWVfc2VjczoiKTsKKyAgICAgIHNiLmFwcGVuZCh0aGlzLm5pbWJ1c191cHRpbWVfc2Vjcyk7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0KICAgICBpZiAoIWZpcnN0KSBzYi5hcHBlbmQoIiwgIik7CiAgICAgc2IuYXBwZW5kKCJ0b3BvbG9naWVzOiIpOwogICAgIGlmICh0aGlzLnRvcG9sb2dpZXMgPT0gbnVsbCkgewpAQCAtNTU0LDYgKzYzNSw4IEBACiAKICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBpbikgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewogICAgIHRyeSB7CisgICAgICAvLyBpdCBkb2Vzbid0IHNlZW0gbGlrZSB5b3Ugc2hvdWxkIGhhdmUgdG8gZG8gdGhpcywgYnV0IGphdmEgc2VyaWFsaXphdGlvbiBpcyB3YWNreSwgYW5kIGRvZXNuJ3QgY2FsbCB0aGUgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICAgIF9faXNzZXRfYml0ZmllbGQgPSAwOwogICAgICAgcmVhZChuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbChuZXcgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRJT1N0cmVhbVRyYW5zcG9ydChpbikpKTsKICAgICB9IGNhdGNoIChvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHRlKSB7CiAgICAgICB0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbih0ZSk7CkBAIC01ODEsMTQgKzY2NCwxNCBAQAogICAgICAgICAgIGNhc2UgMTogLy8gU1VQRVJWSVNPUlMKICAgICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkxJU1QpIHsKICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRMaXN0IF9saXN0NzQgPSBpcHJvdC5yZWFkTGlzdEJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgc3RydWN0LnN1cGVydmlzb3JzID0gbmV3IEFycmF5TGlzdDxTdXBlcnZpc29yU3VtbWFyeT4oX2xpc3Q3NC5zaXplKTsKLSAgICAgICAgICAgICAgICBTdXBlcnZpc29yU3VtbWFyeSBfZWxlbTc1OwotICAgICAgICAgICAgICAgIGZvciAoaW50IF9pNzYgPSAwOyBfaTc2IDwgX2xpc3Q3NC5zaXplOyArK19pNzYpCisgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVExpc3QgX2xpc3Q5MiA9IGlwcm90LnJlYWRMaXN0QmVnaW4oKTsKKyAgICAgICAgICAgICAgICBzdHJ1Y3Quc3VwZXJ2aXNvcnMgPSBuZXcgQXJyYXlMaXN0PFN1cGVydmlzb3JTdW1tYXJ5PihfbGlzdDkyLnNpemUpOworICAgICAgICAgICAgICAgIFN1cGVydmlzb3JTdW1tYXJ5IF9lbGVtOTM7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgX2k5NCA9IDA7IF9pOTQgPCBfbGlzdDkyLnNpemU7ICsrX2k5NCkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBfZWxlbTc1ID0gbmV3IFN1cGVydmlzb3JTdW1tYXJ5KCk7Ci0gICAgICAgICAgICAgICAgICBfZWxlbTc1LnJlYWQoaXByb3QpOwotICAgICAgICAgICAgICAgICAgc3RydWN0LnN1cGVydmlzb3JzLmFkZChfZWxlbTc1KTsKKyAgICAgICAgICAgICAgICAgIF9lbGVtOTMgPSBuZXcgU3VwZXJ2aXNvclN1bW1hcnkoKTsKKyAgICAgICAgICAgICAgICAgIF9lbGVtOTMucmVhZChpcHJvdCk7CisgICAgICAgICAgICAgICAgICBzdHJ1Y3Quc3VwZXJ2aXNvcnMuYWRkKF9lbGVtOTMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpcHJvdC5yZWFkTGlzdEVuZCgpOwogICAgICAgICAgICAgICB9CkBAIC01OTcsMTcgKzY4MCwyNSBAQAogICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAyOiAvLyBOSU1CVVNfVVBUSU1FX1NFQ1MKKyAgICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkkzMikgeworICAgICAgICAgICAgICBzdHJ1Y3QubmltYnVzX3VwdGltZV9zZWNzID0gaXByb3QucmVhZEkzMigpOworICAgICAgICAgICAgICBzdHJ1Y3Quc2V0X25pbWJ1c191cHRpbWVfc2Vjc19pc1NldCh0cnVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7IAorICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgY2FzZSAzOiAvLyBUT1BPTE9HSUVTCiAgICAgICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5MSVNUKSB7CiAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTGlzdCBfbGlzdDc3ID0gaXByb3QucmVhZExpc3RCZWdpbigpOwotICAgICAgICAgICAgICAgIHN0cnVjdC50b3BvbG9naWVzID0gbmV3IEFycmF5TGlzdDxUb3BvbG9neVN1bW1hcnk+KF9saXN0Nzcuc2l6ZSk7Ci0gICAgICAgICAgICAgICAgVG9wb2xvZ3lTdW1tYXJ5IF9lbGVtNzg7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgX2k3OSA9IDA7IF9pNzkgPCBfbGlzdDc3LnNpemU7ICsrX2k3OSkKKyAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTGlzdCBfbGlzdDk1ID0gaXByb3QucmVhZExpc3RCZWdpbigpOworICAgICAgICAgICAgICAgIHN0cnVjdC50b3BvbG9naWVzID0gbmV3IEFycmF5TGlzdDxUb3BvbG9neVN1bW1hcnk+KF9saXN0OTUuc2l6ZSk7CisgICAgICAgICAgICAgICAgVG9wb2xvZ3lTdW1tYXJ5IF9lbGVtOTY7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgX2k5NyA9IDA7IF9pOTcgPCBfbGlzdDk1LnNpemU7ICsrX2k5NykKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBfZWxlbTc4ID0gbmV3IFRvcG9sb2d5U3VtbWFyeSgpOwotICAgICAgICAgICAgICAgICAgX2VsZW03OC5yZWFkKGlwcm90KTsKLSAgICAgICAgICAgICAgICAgIHN0cnVjdC50b3BvbG9naWVzLmFkZChfZWxlbTc4KTsKKyAgICAgICAgICAgICAgICAgIF9lbGVtOTYgPSBuZXcgVG9wb2xvZ3lTdW1tYXJ5KCk7CisgICAgICAgICAgICAgICAgICBfZWxlbTk2LnJlYWQoaXByb3QpOworICAgICAgICAgICAgICAgICAgc3RydWN0LnRvcG9sb2dpZXMuYWRkKF9lbGVtOTYpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpcHJvdC5yZWFkTGlzdEVuZCgpOwogICAgICAgICAgICAgICB9CkBAIC02MTksMTQgKzcxMCwxNCBAQAogICAgICAgICAgIGNhc2UgNDogLy8gTklNQlVTRVMKICAgICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkxJU1QpIHsKICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRMaXN0IF9saXN0ODAgPSBpcHJvdC5yZWFkTGlzdEJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgc3RydWN0Lm5pbWJ1c2VzID0gbmV3IEFycmF5TGlzdDxOaW1idXNTdW1tYXJ5PihfbGlzdDgwLnNpemUpOwotICAgICAgICAgICAgICAgIE5pbWJ1c1N1bW1hcnkgX2VsZW04MTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBfaTgyID0gMDsgX2k4MiA8IF9saXN0ODAuc2l6ZTsgKytfaTgyKQorICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRMaXN0IF9saXN0OTggPSBpcHJvdC5yZWFkTGlzdEJlZ2luKCk7CisgICAgICAgICAgICAgICAgc3RydWN0Lm5pbWJ1c2VzID0gbmV3IEFycmF5TGlzdDxOaW1idXNTdW1tYXJ5PihfbGlzdDk4LnNpemUpOworICAgICAgICAgICAgICAgIE5pbWJ1c1N1bW1hcnkgX2VsZW05OTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBfaTEwMCA9IDA7IF9pMTAwIDwgX2xpc3Q5OC5zaXplOyArK19pMTAwKQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIF9lbGVtODEgPSBuZXcgTmltYnVzU3VtbWFyeSgpOwotICAgICAgICAgICAgICAgICAgX2VsZW04MS5yZWFkKGlwcm90KTsKLSAgICAgICAgICAgICAgICAgIHN0cnVjdC5uaW1idXNlcy5hZGQoX2VsZW04MSk7CisgICAgICAgICAgICAgICAgICBfZWxlbTk5ID0gbmV3IE5pbWJ1c1N1bW1hcnkoKTsKKyAgICAgICAgICAgICAgICAgIF9lbGVtOTkucmVhZChpcHJvdCk7CisgICAgICAgICAgICAgICAgICBzdHJ1Y3QubmltYnVzZXMuYWRkKF9lbGVtOTkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpcHJvdC5yZWFkTGlzdEVuZCgpOwogICAgICAgICAgICAgICB9CkBAIC02NTIsMjEgKzc0MywyNiBAQAogICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oU1VQRVJWSVNPUlNfRklFTERfREVTQyk7CiAgICAgICAgIHsKICAgICAgICAgICBvcHJvdC53cml0ZUxpc3RCZWdpbihuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVExpc3Qob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNULCBzdHJ1Y3Quc3VwZXJ2aXNvcnMuc2l6ZSgpKSk7Ci0gICAgICAgICAgZm9yIChTdXBlcnZpc29yU3VtbWFyeSBfaXRlcjgzIDogc3RydWN0LnN1cGVydmlzb3JzKQorICAgICAgICAgIGZvciAoU3VwZXJ2aXNvclN1bW1hcnkgX2l0ZXIxMDEgOiBzdHJ1Y3Quc3VwZXJ2aXNvcnMpCiAgICAgICAgICAgewotICAgICAgICAgICAgX2l0ZXI4My53cml0ZShvcHJvdCk7CisgICAgICAgICAgICBfaXRlcjEwMS53cml0ZShvcHJvdCk7CiAgICAgICAgICAgfQogICAgICAgICAgIG9wcm90LndyaXRlTGlzdEVuZCgpOwogICAgICAgICB9CiAgICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKICAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X25pbWJ1c191cHRpbWVfc2VjcygpKSB7CisgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihOSU1CVVNfVVBUSU1FX1NFQ1NfRklFTERfREVTQyk7CisgICAgICAgIG9wcm90LndyaXRlSTMyKHN0cnVjdC5uaW1idXNfdXB0aW1lX3NlY3MpOworICAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgICB9CiAgICAgICBpZiAoc3RydWN0LnRvcG9sb2dpZXMgIT0gbnVsbCkgewogICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oVE9QT0xPR0lFU19GSUVMRF9ERVNDKTsKICAgICAgICAgewogICAgICAgICAgIG9wcm90LndyaXRlTGlzdEJlZ2luKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTGlzdChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIHN0cnVjdC50b3BvbG9naWVzLnNpemUoKSkpOwotICAgICAgICAgIGZvciAoVG9wb2xvZ3lTdW1tYXJ5IF9pdGVyODQgOiBzdHJ1Y3QudG9wb2xvZ2llcykKKyAgICAgICAgICBmb3IgKFRvcG9sb2d5U3VtbWFyeSBfaXRlcjEwMiA6IHN0cnVjdC50b3BvbG9naWVzKQogICAgICAgICAgIHsKLSAgICAgICAgICAgIF9pdGVyODQud3JpdGUob3Byb3QpOworICAgICAgICAgICAgX2l0ZXIxMDIud3JpdGUob3Byb3QpOwogICAgICAgICAgIH0KICAgICAgICAgICBvcHJvdC53cml0ZUxpc3RFbmQoKTsKICAgICAgICAgfQpAQCAtNjc2LDkgKzc3Miw5IEBACiAgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihOSU1CVVNFU19GSUVMRF9ERVNDKTsKICAgICAgICAgewogICAgICAgICAgIG9wcm90LndyaXRlTGlzdEJlZ2luKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTGlzdChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIHN0cnVjdC5uaW1idXNlcy5zaXplKCkpKTsKLSAgICAgICAgICBmb3IgKE5pbWJ1c1N1bW1hcnkgX2l0ZXI4NSA6IHN0cnVjdC5uaW1idXNlcykKKyAgICAgICAgICBmb3IgKE5pbWJ1c1N1bW1hcnkgX2l0ZXIxMDMgOiBzdHJ1Y3QubmltYnVzZXMpCiAgICAgICAgICAgewotICAgICAgICAgICAgX2l0ZXI4NS53cml0ZShvcHJvdCk7CisgICAgICAgICAgICBfaXRlcjEwMy53cml0ZShvcHJvdCk7CiAgICAgICAgICAgfQogICAgICAgICAgIG9wcm90LndyaXRlTGlzdEVuZCgpOwogICAgICAgICB9CkBAIC03MDMsNjYgKzc5OSw3OSBAQAogICAgICAgVFR1cGxlUHJvdG9jb2wgb3Byb3QgPSAoVFR1cGxlUHJvdG9jb2wpIHByb3Q7CiAgICAgICB7CiAgICAgICAgIG9wcm90LndyaXRlSTMyKHN0cnVjdC5zdXBlcnZpc29ycy5zaXplKCkpOwotICAgICAgICBmb3IgKFN1cGVydmlzb3JTdW1tYXJ5IF9pdGVyODYgOiBzdHJ1Y3Quc3VwZXJ2aXNvcnMpCisgICAgICAgIGZvciAoU3VwZXJ2aXNvclN1bW1hcnkgX2l0ZXIxMDQgOiBzdHJ1Y3Quc3VwZXJ2aXNvcnMpCiAgICAgICAgIHsKLSAgICAgICAgICBfaXRlcjg2LndyaXRlKG9wcm90KTsKKyAgICAgICAgICBfaXRlcjEwNC53cml0ZShvcHJvdCk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICAgIHsKICAgICAgICAgb3Byb3Qud3JpdGVJMzIoc3RydWN0LnRvcG9sb2dpZXMuc2l6ZSgpKTsKLSAgICAgICAgZm9yIChUb3BvbG9neVN1bW1hcnkgX2l0ZXI4NyA6IHN0cnVjdC50b3BvbG9naWVzKQorICAgICAgICBmb3IgKFRvcG9sb2d5U3VtbWFyeSBfaXRlcjEwNSA6IHN0cnVjdC50b3BvbG9naWVzKQogICAgICAgICB7Ci0gICAgICAgICAgX2l0ZXI4Ny53cml0ZShvcHJvdCk7CisgICAgICAgICAgX2l0ZXIxMDUud3JpdGUob3Byb3QpOwogICAgICAgICB9CiAgICAgICB9CiAgICAgICB7CiAgICAgICAgIG9wcm90LndyaXRlSTMyKHN0cnVjdC5uaW1idXNlcy5zaXplKCkpOwotICAgICAgICBmb3IgKE5pbWJ1c1N1bW1hcnkgX2l0ZXI4OCA6IHN0cnVjdC5uaW1idXNlcykKKyAgICAgICAgZm9yIChOaW1idXNTdW1tYXJ5IF9pdGVyMTA2IDogc3RydWN0Lm5pbWJ1c2VzKQogICAgICAgICB7Ci0gICAgICAgICAgX2l0ZXI4OC53cml0ZShvcHJvdCk7CisgICAgICAgICAgX2l0ZXIxMDYud3JpdGUob3Byb3QpOwogICAgICAgICB9CiAgICAgICB9CisgICAgICBCaXRTZXQgb3B0aW9uYWxzID0gbmV3IEJpdFNldCgpOworICAgICAgaWYgKHN0cnVjdC5pc19zZXRfbmltYnVzX3VwdGltZV9zZWNzKCkpIHsKKyAgICAgICAgb3B0aW9uYWxzLnNldCgwKTsKKyAgICAgIH0KKyAgICAgIG9wcm90LndyaXRlQml0U2V0KG9wdGlvbmFscywgMSk7CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9uaW1idXNfdXB0aW1lX3NlY3MoKSkgeworICAgICAgICBvcHJvdC53cml0ZUkzMihzdHJ1Y3QubmltYnVzX3VwdGltZV9zZWNzKTsKKyAgICAgIH0KICAgICB9CiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCByZWFkKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBwcm90LCBDbHVzdGVyU3VtbWFyeSBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKICAgICAgIFRUdXBsZVByb3RvY29sIGlwcm90ID0gKFRUdXBsZVByb3RvY29sKSBwcm90OwogICAgICAgewotICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTGlzdCBfbGlzdDg5ID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRMaXN0KG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCwgaXByb3QucmVhZEkzMigpKTsKLSAgICAgICAgc3RydWN0LnN1cGVydmlzb3JzID0gbmV3IEFycmF5TGlzdDxTdXBlcnZpc29yU3VtbWFyeT4oX2xpc3Q4OS5zaXplKTsKLSAgICAgICAgU3VwZXJ2aXNvclN1bW1hcnkgX2VsZW05MDsKLSAgICAgICAgZm9yIChpbnQgX2k5MSA9IDA7IF9pOTEgPCBfbGlzdDg5LnNpemU7ICsrX2k5MSkKKyAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVExpc3QgX2xpc3QxMDcgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVExpc3Qob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNULCBpcHJvdC5yZWFkSTMyKCkpOworICAgICAgICBzdHJ1Y3Quc3VwZXJ2aXNvcnMgPSBuZXcgQXJyYXlMaXN0PFN1cGVydmlzb3JTdW1tYXJ5PihfbGlzdDEwNy5zaXplKTsKKyAgICAgICAgU3VwZXJ2aXNvclN1bW1hcnkgX2VsZW0xMDg7CisgICAgICAgIGZvciAoaW50IF9pMTA5ID0gMDsgX2kxMDkgPCBfbGlzdDEwNy5zaXplOyArK19pMTA5KQogICAgICAgICB7Ci0gICAgICAgICAgX2VsZW05MCA9IG5ldyBTdXBlcnZpc29yU3VtbWFyeSgpOwotICAgICAgICAgIF9lbGVtOTAucmVhZChpcHJvdCk7Ci0gICAgICAgICAgc3RydWN0LnN1cGVydmlzb3JzLmFkZChfZWxlbTkwKTsKKyAgICAgICAgICBfZWxlbTEwOCA9IG5ldyBTdXBlcnZpc29yU3VtbWFyeSgpOworICAgICAgICAgIF9lbGVtMTA4LnJlYWQoaXByb3QpOworICAgICAgICAgIHN0cnVjdC5zdXBlcnZpc29ycy5hZGQoX2VsZW0xMDgpOwogICAgICAgICB9CiAgICAgICB9CiAgICAgICBzdHJ1Y3Quc2V0X3N1cGVydmlzb3JzX2lzU2V0KHRydWUpOwogICAgICAgewotICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTGlzdCBfbGlzdDkyID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRMaXN0KG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCwgaXByb3QucmVhZEkzMigpKTsKLSAgICAgICAgc3RydWN0LnRvcG9sb2dpZXMgPSBuZXcgQXJyYXlMaXN0PFRvcG9sb2d5U3VtbWFyeT4oX2xpc3Q5Mi5zaXplKTsKLSAgICAgICAgVG9wb2xvZ3lTdW1tYXJ5IF9lbGVtOTM7Ci0gICAgICAgIGZvciAoaW50IF9pOTQgPSAwOyBfaTk0IDwgX2xpc3Q5Mi5zaXplOyArK19pOTQpCisgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRMaXN0IF9saXN0MTEwID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRMaXN0KG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCwgaXByb3QucmVhZEkzMigpKTsKKyAgICAgICAgc3RydWN0LnRvcG9sb2dpZXMgPSBuZXcgQXJyYXlMaXN0PFRvcG9sb2d5U3VtbWFyeT4oX2xpc3QxMTAuc2l6ZSk7CisgICAgICAgIFRvcG9sb2d5U3VtbWFyeSBfZWxlbTExMTsKKyAgICAgICAgZm9yIChpbnQgX2kxMTIgPSAwOyBfaTExMiA8IF9saXN0MTEwLnNpemU7ICsrX2kxMTIpCiAgICAgICAgIHsKLSAgICAgICAgICBfZWxlbTkzID0gbmV3IFRvcG9sb2d5U3VtbWFyeSgpOwotICAgICAgICAgIF9lbGVtOTMucmVhZChpcHJvdCk7Ci0gICAgICAgICAgc3RydWN0LnRvcG9sb2dpZXMuYWRkKF9lbGVtOTMpOworICAgICAgICAgIF9lbGVtMTExID0gbmV3IFRvcG9sb2d5U3VtbWFyeSgpOworICAgICAgICAgIF9lbGVtMTExLnJlYWQoaXByb3QpOworICAgICAgICAgIHN0cnVjdC50b3BvbG9naWVzLmFkZChfZWxlbTExMSk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICAgIHN0cnVjdC5zZXRfdG9wb2xvZ2llc19pc1NldCh0cnVlKTsKICAgICAgIHsKLSAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVExpc3QgX2xpc3Q5NSA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTGlzdChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIGlwcm90LnJlYWRJMzIoKSk7Ci0gICAgICAgIHN0cnVjdC5uaW1idXNlcyA9IG5ldyBBcnJheUxpc3Q8TmltYnVzU3VtbWFyeT4oX2xpc3Q5NS5zaXplKTsKLSAgICAgICAgTmltYnVzU3VtbWFyeSBfZWxlbTk2OwotICAgICAgICBmb3IgKGludCBfaTk3ID0gMDsgX2k5NyA8IF9saXN0OTUuc2l6ZTsgKytfaTk3KQorICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTGlzdCBfbGlzdDExMyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTGlzdChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIGlwcm90LnJlYWRJMzIoKSk7CisgICAgICAgIHN0cnVjdC5uaW1idXNlcyA9IG5ldyBBcnJheUxpc3Q8TmltYnVzU3VtbWFyeT4oX2xpc3QxMTMuc2l6ZSk7CisgICAgICAgIE5pbWJ1c1N1bW1hcnkgX2VsZW0xMTQ7CisgICAgICAgIGZvciAoaW50IF9pMTE1ID0gMDsgX2kxMTUgPCBfbGlzdDExMy5zaXplOyArK19pMTE1KQogICAgICAgICB7Ci0gICAgICAgICAgX2VsZW05NiA9IG5ldyBOaW1idXNTdW1tYXJ5KCk7Ci0gICAgICAgICAgX2VsZW05Ni5yZWFkKGlwcm90KTsKLSAgICAgICAgICBzdHJ1Y3QubmltYnVzZXMuYWRkKF9lbGVtOTYpOworICAgICAgICAgIF9lbGVtMTE0ID0gbmV3IE5pbWJ1c1N1bW1hcnkoKTsKKyAgICAgICAgICBfZWxlbTExNC5yZWFkKGlwcm90KTsKKyAgICAgICAgICBzdHJ1Y3QubmltYnVzZXMuYWRkKF9lbGVtMTE0KTsKICAgICAgICAgfQogICAgICAgfQogICAgICAgc3RydWN0LnNldF9uaW1idXNlc19pc1NldCh0cnVlKTsKKyAgICAgIEJpdFNldCBpbmNvbWluZyA9IGlwcm90LnJlYWRCaXRTZXQoMSk7CisgICAgICBpZiAoaW5jb21pbmcuZ2V0KDApKSB7CisgICAgICAgIHN0cnVjdC5uaW1idXNfdXB0aW1lX3NlY3MgPSBpcHJvdC5yZWFkSTMyKCk7CisgICAgICAgIHN0cnVjdC5zZXRfbmltYnVzX3VwdGltZV9zZWNzX2lzU2V0KHRydWUpOworICAgICAgfQogICAgIH0KICAgfQogCmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL0NsdXN0ZXJXb3JrZXJIZWFydGJlYXQuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvQ2x1c3RlcldvcmtlckhlYXJ0YmVhdC5qYXZhCmluZGV4IGNlMmY1ZjQuLmExYjdlMmUgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvQ2x1c3RlcldvcmtlckhlYXJ0YmVhdC5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvQ2x1c3RlcldvcmtlckhlYXJ0YmVhdC5qYXZhCkBAIC0xNiw3ICsxNiw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogLyoqCi0gKiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjIpCisgKiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjMpCiAgKgogICogRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lORwogICogIEBnZW5lcmF0ZWQKQEAgLTUxLDcgKzUxLDcgQEAKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAogQFN1cHByZXNzV2FybmluZ3MoeyJjYXN0IiwgInJhd3R5cGVzIiwgInNlcmlhbCIsICJ1bmNoZWNrZWQifSkKLUBHZW5lcmF0ZWQodmFsdWUgPSAiQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4yKSIsIGRhdGUgPSAiMjAxNS05LTMiKQorQEdlbmVyYXRlZCh2YWx1ZSA9ICJBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjMpIikKIHB1YmxpYyBjbGFzcyBDbHVzdGVyV29ya2VySGVhcnRiZWF0IGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2U8Q2x1c3RlcldvcmtlckhlYXJ0YmVhdCwgQ2x1c3RlcldvcmtlckhlYXJ0YmVhdC5fRmllbGRzPiwgamF2YS5pby5TZXJpYWxpemFibGUsIENsb25lYWJsZSwgQ29tcGFyYWJsZTxDbHVzdGVyV29ya2VySGVhcnRiZWF0PiB7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QgU1RSVUNUX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdCgiQ2x1c3RlcldvcmtlckhlYXJ0YmVhdCIpOwogCkBAIC0zNjUsMTAgKzM2NSwxMCBAQAogICAgICAgcmV0dXJuIGdldF9leGVjdXRvcl9zdGF0cygpOwogCiAgICAgY2FzZSBUSU1FX1NFQ1M6Ci0gICAgICByZXR1cm4gSW50ZWdlci52YWx1ZU9mKGdldF90aW1lX3NlY3MoKSk7CisgICAgICByZXR1cm4gZ2V0X3RpbWVfc2VjcygpOwogCiAgICAgY2FzZSBVUFRJTUVfU0VDUzoKLSAgICAgIHJldHVybiBJbnRlZ2VyLnZhbHVlT2YoZ2V0X3VwdGltZV9zZWNzKCkpOworICAgICAgcmV0dXJuIGdldF91cHRpbWVfc2VjcygpOwogCiAgICAgfQogICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKQEAgLTYzNSwxNyArNjM1LDE3IEBACiAgICAgICAgICAgY2FzZSAyOiAvLyBFWEVDVVRPUl9TVEFUUwogICAgICAgICAgICAgaWYgKHNjaGVtZUZpZWxkLnR5cGUgPT0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTUFQKSB7CiAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwIF9tYXA0NTQgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKTsKLSAgICAgICAgICAgICAgICBzdHJ1Y3QuZXhlY3V0b3Jfc3RhdHMgPSBuZXcgSGFzaE1hcDxFeGVjdXRvckluZm8sRXhlY3V0b3JTdGF0cz4oMipfbWFwNDU0LnNpemUpOwotICAgICAgICAgICAgICAgIEV4ZWN1dG9ySW5mbyBfa2V5NDU1OwotICAgICAgICAgICAgICAgIEV4ZWN1dG9yU3RhdHMgX3ZhbDQ1NjsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBfaTQ1NyA9IDA7IF9pNDU3IDwgX21hcDQ1NC5zaXplOyArK19pNDU3KQorICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgX21hcDYwOCA9IGlwcm90LnJlYWRNYXBCZWdpbigpOworICAgICAgICAgICAgICAgIHN0cnVjdC5leGVjdXRvcl9zdGF0cyA9IG5ldyBIYXNoTWFwPEV4ZWN1dG9ySW5mbyxFeGVjdXRvclN0YXRzPigyKl9tYXA2MDguc2l6ZSk7CisgICAgICAgICAgICAgICAgRXhlY3V0b3JJbmZvIF9rZXk2MDk7CisgICAgICAgICAgICAgICAgRXhlY3V0b3JTdGF0cyBfdmFsNjEwOworICAgICAgICAgICAgICAgIGZvciAoaW50IF9pNjExID0gMDsgX2k2MTEgPCBfbWFwNjA4LnNpemU7ICsrX2k2MTEpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgX2tleTQ1NSA9IG5ldyBFeGVjdXRvckluZm8oKTsKLSAgICAgICAgICAgICAgICAgIF9rZXk0NTUucmVhZChpcHJvdCk7Ci0gICAgICAgICAgICAgICAgICBfdmFsNDU2ID0gbmV3IEV4ZWN1dG9yU3RhdHMoKTsKLSAgICAgICAgICAgICAgICAgIF92YWw0NTYucmVhZChpcHJvdCk7Ci0gICAgICAgICAgICAgICAgICBzdHJ1Y3QuZXhlY3V0b3Jfc3RhdHMucHV0KF9rZXk0NTUsIF92YWw0NTYpOworICAgICAgICAgICAgICAgICAgX2tleTYwOSA9IG5ldyBFeGVjdXRvckluZm8oKTsKKyAgICAgICAgICAgICAgICAgIF9rZXk2MDkucmVhZChpcHJvdCk7CisgICAgICAgICAgICAgICAgICBfdmFsNjEwID0gbmV3IEV4ZWN1dG9yU3RhdHMoKTsKKyAgICAgICAgICAgICAgICAgIF92YWw2MTAucmVhZChpcHJvdCk7CisgICAgICAgICAgICAgICAgICBzdHJ1Y3QuZXhlY3V0b3Jfc3RhdHMucHV0KF9rZXk2MDksIF92YWw2MTApOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpcHJvdC5yZWFkTWFwRW5kKCk7CiAgICAgICAgICAgICAgIH0KQEAgLTY5MiwxMCArNjkyLDEwIEBACiAgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihFWEVDVVRPUl9TVEFUU19GSUVMRF9ERVNDKTsKICAgICAgICAgewogICAgICAgICAgIG9wcm90LndyaXRlTWFwQmVnaW4obmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNULCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIHN0cnVjdC5leGVjdXRvcl9zdGF0cy5zaXplKCkpKTsKLSAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxFeGVjdXRvckluZm8sIEV4ZWN1dG9yU3RhdHM+IF9pdGVyNDU4IDogc3RydWN0LmV4ZWN1dG9yX3N0YXRzLmVudHJ5U2V0KCkpCisgICAgICAgICAgZm9yIChNYXAuRW50cnk8RXhlY3V0b3JJbmZvLCBFeGVjdXRvclN0YXRzPiBfaXRlcjYxMiA6IHN0cnVjdC5leGVjdXRvcl9zdGF0cy5lbnRyeVNldCgpKQogICAgICAgICAgIHsKLSAgICAgICAgICAgIF9pdGVyNDU4LmdldEtleSgpLndyaXRlKG9wcm90KTsKLSAgICAgICAgICAgIF9pdGVyNDU4LmdldFZhbHVlKCkud3JpdGUob3Byb3QpOworICAgICAgICAgICAgX2l0ZXI2MTIuZ2V0S2V5KCkud3JpdGUob3Byb3QpOworICAgICAgICAgICAgX2l0ZXI2MTIuZ2V0VmFsdWUoKS53cml0ZShvcHJvdCk7CiAgICAgICAgICAgfQogICAgICAgICAgIG9wcm90LndyaXRlTWFwRW5kKCk7CiAgICAgICAgIH0KQEAgLTcyNywxMCArNzI3LDEwIEBACiAgICAgICBvcHJvdC53cml0ZVN0cmluZyhzdHJ1Y3Quc3Rvcm1faWQpOwogICAgICAgewogICAgICAgICBvcHJvdC53cml0ZUkzMihzdHJ1Y3QuZXhlY3V0b3Jfc3RhdHMuc2l6ZSgpKTsKLSAgICAgICAgZm9yIChNYXAuRW50cnk8RXhlY3V0b3JJbmZvLCBFeGVjdXRvclN0YXRzPiBfaXRlcjQ1OSA6IHN0cnVjdC5leGVjdXRvcl9zdGF0cy5lbnRyeVNldCgpKQorICAgICAgICBmb3IgKE1hcC5FbnRyeTxFeGVjdXRvckluZm8sIEV4ZWN1dG9yU3RhdHM+IF9pdGVyNjEzIDogc3RydWN0LmV4ZWN1dG9yX3N0YXRzLmVudHJ5U2V0KCkpCiAgICAgICAgIHsKLSAgICAgICAgICBfaXRlcjQ1OS5nZXRLZXkoKS53cml0ZShvcHJvdCk7Ci0gICAgICAgICAgX2l0ZXI0NTkuZ2V0VmFsdWUoKS53cml0ZShvcHJvdCk7CisgICAgICAgICAgX2l0ZXI2MTMuZ2V0S2V5KCkud3JpdGUob3Byb3QpOworICAgICAgICAgIF9pdGVyNjEzLmdldFZhbHVlKCkud3JpdGUob3Byb3QpOwogICAgICAgICB9CiAgICAgICB9CiAgICAgICBvcHJvdC53cml0ZUkzMihzdHJ1Y3QudGltZV9zZWNzKTsKQEAgLTc0MywxNyArNzQzLDE3IEBACiAgICAgICBzdHJ1Y3Quc3Rvcm1faWQgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CiAgICAgICBzdHJ1Y3Quc2V0X3N0b3JtX2lkX2lzU2V0KHRydWUpOwogICAgICAgewotICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwIF9tYXA0NjAgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCwgaXByb3QucmVhZEkzMigpKTsKLSAgICAgICAgc3RydWN0LmV4ZWN1dG9yX3N0YXRzID0gbmV3IEhhc2hNYXA8RXhlY3V0b3JJbmZvLEV4ZWN1dG9yU3RhdHM+KDIqX21hcDQ2MC5zaXplKTsKLSAgICAgICAgRXhlY3V0b3JJbmZvIF9rZXk0NjE7Ci0gICAgICAgIEV4ZWN1dG9yU3RhdHMgX3ZhbDQ2MjsKLSAgICAgICAgZm9yIChpbnQgX2k0NjMgPSAwOyBfaTQ2MyA8IF9tYXA0NjAuc2l6ZTsgKytfaTQ2MykKKyAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwNjE0ID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNULCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIGlwcm90LnJlYWRJMzIoKSk7CisgICAgICAgIHN0cnVjdC5leGVjdXRvcl9zdGF0cyA9IG5ldyBIYXNoTWFwPEV4ZWN1dG9ySW5mbyxFeGVjdXRvclN0YXRzPigyKl9tYXA2MTQuc2l6ZSk7CisgICAgICAgIEV4ZWN1dG9ySW5mbyBfa2V5NjE1OworICAgICAgICBFeGVjdXRvclN0YXRzIF92YWw2MTY7CisgICAgICAgIGZvciAoaW50IF9pNjE3ID0gMDsgX2k2MTcgPCBfbWFwNjE0LnNpemU7ICsrX2k2MTcpCiAgICAgICAgIHsKLSAgICAgICAgICBfa2V5NDYxID0gbmV3IEV4ZWN1dG9ySW5mbygpOwotICAgICAgICAgIF9rZXk0NjEucmVhZChpcHJvdCk7Ci0gICAgICAgICAgX3ZhbDQ2MiA9IG5ldyBFeGVjdXRvclN0YXRzKCk7Ci0gICAgICAgICAgX3ZhbDQ2Mi5yZWFkKGlwcm90KTsKLSAgICAgICAgICBzdHJ1Y3QuZXhlY3V0b3Jfc3RhdHMucHV0KF9rZXk0NjEsIF92YWw0NjIpOworICAgICAgICAgIF9rZXk2MTUgPSBuZXcgRXhlY3V0b3JJbmZvKCk7CisgICAgICAgICAgX2tleTYxNS5yZWFkKGlwcm90KTsKKyAgICAgICAgICBfdmFsNjE2ID0gbmV3IEV4ZWN1dG9yU3RhdHMoKTsKKyAgICAgICAgICBfdmFsNjE2LnJlYWQoaXByb3QpOworICAgICAgICAgIHN0cnVjdC5leGVjdXRvcl9zdGF0cy5wdXQoX2tleTYxNSwgX3ZhbDYxNik7CiAgICAgICAgIH0KICAgICAgIH0KICAgICAgIHN0cnVjdC5zZXRfZXhlY3V0b3Jfc3RhdHNfaXNTZXQodHJ1ZSk7CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL0NvbW1vbkFnZ3JlZ2F0ZVN0YXRzLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL0NvbW1vbkFnZ3JlZ2F0ZVN0YXRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFmZjU5MAotLS0gL2Rldi9udWxsCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvQ29tbW9uQWdncmVnYXRlU3RhdHMuamF2YQpAQCAtMCwwICsxLDkwMiBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8qKgorICogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4zKQorICoKKyAqIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkcKKyAqICBAZ2VuZXJhdGVkCisgKi8KK3BhY2thZ2UgYmFja3R5cGUuc3Rvcm0uZ2VuZXJhdGVkOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLklTY2hlbWU7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLlNjaGVtZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLlN0YW5kYXJkU2NoZW1lOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLlR1cGxlU2NoZW1lOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUdXBsZVByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5FbmNvZGluZ1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuQXN5bmNNZXRob2RDYWxsYmFjazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlci4qOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bU1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuQml0U2V0OworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLkdlbmVyYXRlZDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitAU3VwcHJlc3NXYXJuaW5ncyh7ImNhc3QiLCAicmF3dHlwZXMiLCAic2VyaWFsIiwgInVuY2hlY2tlZCJ9KQorQEdlbmVyYXRlZCh2YWx1ZSA9ICJBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjMpIikKK3B1YmxpYyBjbGFzcyBDb21tb25BZ2dyZWdhdGVTdGF0cyBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlPENvbW1vbkFnZ3JlZ2F0ZVN0YXRzLCBDb21tb25BZ2dyZWdhdGVTdGF0cy5fRmllbGRzPiwgamF2YS5pby5TZXJpYWxpemFibGUsIENsb25lYWJsZSwgQ29tcGFyYWJsZTxDb21tb25BZ2dyZWdhdGVTdGF0cz4geworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0IFNUUlVDVF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QoIkNvbW1vbkFnZ3JlZ2F0ZVN0YXRzIik7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIE5VTV9FWEVDVVRPUlNfRklFTERfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQoIm51bV9leGVjdXRvcnMiLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JMzIsIChzaG9ydCkxKTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIE5VTV9UQVNLU19GSUVMRF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCgibnVtX3Rhc2tzIiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTMyLCAoc2hvcnQpMik7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBFTUlUVEVEX0ZJRUxEX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkKCJlbWl0dGVkIiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTY0LCAoc2hvcnQpMyk7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBUUkFOU0ZFUlJFRF9GSUVMRF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCgidHJhbnNmZXJyZWQiLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JNjQsIChzaG9ydCk0KTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIEFDS0VEX0ZJRUxEX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkKCJhY2tlZCIsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkk2NCwgKHNob3J0KTUpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgRkFJTEVEX0ZJRUxEX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkKCJmYWlsZWQiLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JNjQsIChzaG9ydCk2KTsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8Q2xhc3M8PyBleHRlbmRzIElTY2hlbWU+LCBTY2hlbWVGYWN0b3J5PiBzY2hlbWVzID0gbmV3IEhhc2hNYXA8Q2xhc3M8PyBleHRlbmRzIElTY2hlbWU+LCBTY2hlbWVGYWN0b3J5PigpOworICBzdGF0aWMgeworICAgIHNjaGVtZXMucHV0KFN0YW5kYXJkU2NoZW1lLmNsYXNzLCBuZXcgQ29tbW9uQWdncmVnYXRlU3RhdHNTdGFuZGFyZFNjaGVtZUZhY3RvcnkoKSk7CisgICAgc2NoZW1lcy5wdXQoVHVwbGVTY2hlbWUuY2xhc3MsIG5ldyBDb21tb25BZ2dyZWdhdGVTdGF0c1R1cGxlU2NoZW1lRmFjdG9yeSgpKTsKKyAgfQorCisgIHByaXZhdGUgaW50IG51bV9leGVjdXRvcnM7IC8vIG9wdGlvbmFsCisgIHByaXZhdGUgaW50IG51bV90YXNrczsgLy8gb3B0aW9uYWwKKyAgcHJpdmF0ZSBsb25nIGVtaXR0ZWQ7IC8vIG9wdGlvbmFsCisgIHByaXZhdGUgbG9uZyB0cmFuc2ZlcnJlZDsgLy8gb3B0aW9uYWwKKyAgcHJpdmF0ZSBsb25nIGFja2VkOyAvLyBvcHRpb25hbAorICBwcml2YXRlIGxvbmcgZmFpbGVkOyAvLyBvcHRpb25hbAorCisgIC8qKiBUaGUgc2V0IG9mIGZpZWxkcyB0aGlzIHN0cnVjdCBjb250YWlucywgYWxvbmcgd2l0aCBjb252ZW5pZW5jZSBtZXRob2RzIGZvciBmaW5kaW5nIGFuZCBtYW5pcHVsYXRpbmcgdGhlbS4gKi8KKyAgcHVibGljIGVudW0gX0ZpZWxkcyBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZElkRW51bSB7CisgICAgTlVNX0VYRUNVVE9SUygoc2hvcnQpMSwgIm51bV9leGVjdXRvcnMiKSwKKyAgICBOVU1fVEFTS1MoKHNob3J0KTIsICJudW1fdGFza3MiKSwKKyAgICBFTUlUVEVEKChzaG9ydCkzLCAiZW1pdHRlZCIpLAorICAgIFRSQU5TRkVSUkVEKChzaG9ydCk0LCAidHJhbnNmZXJyZWQiKSwKKyAgICBBQ0tFRCgoc2hvcnQpNSwgImFja2VkIiksCisgICAgRkFJTEVEKChzaG9ydCk2LCAiZmFpbGVkIik7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBfRmllbGRzPiBieU5hbWUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIF9GaWVsZHM+KCk7CisKKyAgICBzdGF0aWMgeworICAgICAgZm9yIChfRmllbGRzIGZpZWxkIDogRW51bVNldC5hbGxPZihfRmllbGRzLmNsYXNzKSkgeworICAgICAgICBieU5hbWUucHV0KGZpZWxkLmdldEZpZWxkTmFtZSgpLCBmaWVsZCk7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCB0aGUgX0ZpZWxkcyBjb25zdGFudCB0aGF0IG1hdGNoZXMgZmllbGRJZCwgb3IgbnVsbCBpZiBpdHMgbm90IGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgX0ZpZWxkcyBmaW5kQnlUaHJpZnRJZChpbnQgZmllbGRJZCkgeworICAgICAgc3dpdGNoKGZpZWxkSWQpIHsKKyAgICAgICAgY2FzZSAxOiAvLyBOVU1fRVhFQ1VUT1JTCisgICAgICAgICAgcmV0dXJuIE5VTV9FWEVDVVRPUlM7CisgICAgICAgIGNhc2UgMjogLy8gTlVNX1RBU0tTCisgICAgICAgICAgcmV0dXJuIE5VTV9UQVNLUzsKKyAgICAgICAgY2FzZSAzOiAvLyBFTUlUVEVECisgICAgICAgICAgcmV0dXJuIEVNSVRURUQ7CisgICAgICAgIGNhc2UgNDogLy8gVFJBTlNGRVJSRUQKKyAgICAgICAgICByZXR1cm4gVFJBTlNGRVJSRUQ7CisgICAgICAgIGNhc2UgNTogLy8gQUNLRUQKKyAgICAgICAgICByZXR1cm4gQUNLRUQ7CisgICAgICAgIGNhc2UgNjogLy8gRkFJTEVECisgICAgICAgICAgcmV0dXJuIEZBSUxFRDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kIHRoZSBfRmllbGRzIGNvbnN0YW50IHRoYXQgbWF0Y2hlcyBmaWVsZElkLCB0aHJvd2luZyBhbiBleGNlcHRpb24KKyAgICAgKiBpZiBpdCBpcyBub3QgZm91bmQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBfRmllbGRzIGZpbmRCeVRocmlmdElkT3JUaHJvdyhpbnQgZmllbGRJZCkgeworICAgICAgX0ZpZWxkcyBmaWVsZHMgPSBmaW5kQnlUaHJpZnRJZChmaWVsZElkKTsKKyAgICAgIGlmIChmaWVsZHMgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRmllbGQgIiArIGZpZWxkSWQgKyAiIGRvZXNuJ3QgZXhpc3QhIik7CisgICAgICByZXR1cm4gZmllbGRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgdGhlIF9GaWVsZHMgY29uc3RhbnQgdGhhdCBtYXRjaGVzIG5hbWUsIG9yIG51bGwgaWYgaXRzIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIF9GaWVsZHMgZmluZEJ5TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgcmV0dXJuIGJ5TmFtZS5nZXQobmFtZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBzaG9ydCBfdGhyaWZ0SWQ7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX2ZpZWxkTmFtZTsKKworICAgIF9GaWVsZHMoc2hvcnQgdGhyaWZ0SWQsIFN0cmluZyBmaWVsZE5hbWUpIHsKKyAgICAgIF90aHJpZnRJZCA9IHRocmlmdElkOworICAgICAgX2ZpZWxkTmFtZSA9IGZpZWxkTmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc2hvcnQgZ2V0VGhyaWZ0RmllbGRJZCgpIHsKKyAgICAgIHJldHVybiBfdGhyaWZ0SWQ7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRGaWVsZE5hbWUoKSB7CisgICAgICByZXR1cm4gX2ZpZWxkTmFtZTsKKyAgICB9CisgIH0KKworICAvLyBpc3NldCBpZCBhc3NpZ25tZW50cworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgX19OVU1fRVhFQ1VUT1JTX0lTU0VUX0lEID0gMDsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IF9fTlVNX1RBU0tTX0lTU0VUX0lEID0gMTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IF9fRU1JVFRFRF9JU1NFVF9JRCA9IDI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBfX1RSQU5TRkVSUkVEX0lTU0VUX0lEID0gMzsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IF9fQUNLRURfSVNTRVRfSUQgPSA0OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgX19GQUlMRURfSVNTRVRfSUQgPSA1OworICBwcml2YXRlIGJ5dGUgX19pc3NldF9iaXRmaWVsZCA9IDA7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIF9GaWVsZHMgb3B0aW9uYWxzW10gPSB7X0ZpZWxkcy5OVU1fRVhFQ1VUT1JTLF9GaWVsZHMuTlVNX1RBU0tTLF9GaWVsZHMuRU1JVFRFRCxfRmllbGRzLlRSQU5TRkVSUkVELF9GaWVsZHMuQUNLRUQsX0ZpZWxkcy5GQUlMRUR9OworICBwdWJsaWMgc3RhdGljIGZpbmFsIE1hcDxfRmllbGRzLCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YT4gbWV0YURhdGFNYXA7CisgIHN0YXRpYyB7CisgICAgTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPiB0bXBNYXAgPSBuZXcgRW51bU1hcDxfRmllbGRzLCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YT4oX0ZpZWxkcy5jbGFzcyk7CisgICAgdG1wTWFwLnB1dChfRmllbGRzLk5VTV9FWEVDVVRPUlMsIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YSgibnVtX2V4ZWN1dG9ycyIsIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZFJlcXVpcmVtZW50VHlwZS5PUFRJT05BTCwgCisgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRWYWx1ZU1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkkzMikpKTsKKyAgICB0bXBNYXAucHV0KF9GaWVsZHMuTlVNX1RBU0tTLCBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEoIm51bV90YXNrcyIsIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZFJlcXVpcmVtZW50VHlwZS5PUFRJT05BTCwgCisgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRWYWx1ZU1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkkzMikpKTsKKyAgICB0bXBNYXAucHV0KF9GaWVsZHMuRU1JVFRFRCwgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhKCJlbWl0dGVkIiwgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLk9QVElPTkFMLCAKKyAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZFZhbHVlTWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTY0KSkpOworICAgIHRtcE1hcC5wdXQoX0ZpZWxkcy5UUkFOU0ZFUlJFRCwgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhKCJ0cmFuc2ZlcnJlZCIsIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZFJlcXVpcmVtZW50VHlwZS5PUFRJT05BTCwgCisgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRWYWx1ZU1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkk2NCkpKTsKKyAgICB0bXBNYXAucHV0KF9GaWVsZHMuQUNLRUQsIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YSgiYWNrZWQiLCBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRSZXF1aXJlbWVudFR5cGUuT1BUSU9OQUwsIAorICAgICAgICBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkVmFsdWVNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JNjQpKSk7CisgICAgdG1wTWFwLnB1dChfRmllbGRzLkZBSUxFRCwgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhKCJmYWlsZWQiLCBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRSZXF1aXJlbWVudFR5cGUuT1BUSU9OQUwsIAorICAgICAgICBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkVmFsdWVNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JNjQpKSk7CisgICAgbWV0YURhdGFNYXAgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAodG1wTWFwKTsKKyAgICBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YS5hZGRTdHJ1Y3RNZXRhRGF0YU1hcChDb21tb25BZ2dyZWdhdGVTdGF0cy5jbGFzcywgbWV0YURhdGFNYXApOworICB9CisKKyAgcHVibGljIENvbW1vbkFnZ3JlZ2F0ZVN0YXRzKCkgeworICB9CisKKyAgLyoqCisgICAqIFBlcmZvcm1zIGEgZGVlcCBjb3B5IG9uIDxpPm90aGVyPC9pPi4KKyAgICovCisgIHB1YmxpYyBDb21tb25BZ2dyZWdhdGVTdGF0cyhDb21tb25BZ2dyZWdhdGVTdGF0cyBvdGhlcikgeworICAgIF9faXNzZXRfYml0ZmllbGQgPSBvdGhlci5fX2lzc2V0X2JpdGZpZWxkOworICAgIHRoaXMubnVtX2V4ZWN1dG9ycyA9IG90aGVyLm51bV9leGVjdXRvcnM7CisgICAgdGhpcy5udW1fdGFza3MgPSBvdGhlci5udW1fdGFza3M7CisgICAgdGhpcy5lbWl0dGVkID0gb3RoZXIuZW1pdHRlZDsKKyAgICB0aGlzLnRyYW5zZmVycmVkID0gb3RoZXIudHJhbnNmZXJyZWQ7CisgICAgdGhpcy5hY2tlZCA9IG90aGVyLmFja2VkOworICAgIHRoaXMuZmFpbGVkID0gb3RoZXIuZmFpbGVkOworICB9CisKKyAgcHVibGljIENvbW1vbkFnZ3JlZ2F0ZVN0YXRzIGRlZXBDb3B5KCkgeworICAgIHJldHVybiBuZXcgQ29tbW9uQWdncmVnYXRlU3RhdHModGhpcyk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgc2V0X251bV9leGVjdXRvcnNfaXNTZXQoZmFsc2UpOworICAgIHRoaXMubnVtX2V4ZWN1dG9ycyA9IDA7CisgICAgc2V0X251bV90YXNrc19pc1NldChmYWxzZSk7CisgICAgdGhpcy5udW1fdGFza3MgPSAwOworICAgIHNldF9lbWl0dGVkX2lzU2V0KGZhbHNlKTsKKyAgICB0aGlzLmVtaXR0ZWQgPSAwOworICAgIHNldF90cmFuc2ZlcnJlZF9pc1NldChmYWxzZSk7CisgICAgdGhpcy50cmFuc2ZlcnJlZCA9IDA7CisgICAgc2V0X2Fja2VkX2lzU2V0KGZhbHNlKTsKKyAgICB0aGlzLmFja2VkID0gMDsKKyAgICBzZXRfZmFpbGVkX2lzU2V0KGZhbHNlKTsKKyAgICB0aGlzLmZhaWxlZCA9IDA7CisgIH0KKworICBwdWJsaWMgaW50IGdldF9udW1fZXhlY3V0b3JzKCkgeworICAgIHJldHVybiB0aGlzLm51bV9leGVjdXRvcnM7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfbnVtX2V4ZWN1dG9ycyhpbnQgbnVtX2V4ZWN1dG9ycykgeworICAgIHRoaXMubnVtX2V4ZWN1dG9ycyA9IG51bV9leGVjdXRvcnM7CisgICAgc2V0X251bV9leGVjdXRvcnNfaXNTZXQodHJ1ZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB1bnNldF9udW1fZXhlY3V0b3JzKCkgeworICAgIF9faXNzZXRfYml0ZmllbGQgPSBFbmNvZGluZ1V0aWxzLmNsZWFyQml0KF9faXNzZXRfYml0ZmllbGQsIF9fTlVNX0VYRUNVVE9SU19JU1NFVF9JRCk7CisgIH0KKworICAvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkIG51bV9leGVjdXRvcnMgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgIHB1YmxpYyBib29sZWFuIGlzX3NldF9udW1fZXhlY3V0b3JzKCkgeworICAgIHJldHVybiBFbmNvZGluZ1V0aWxzLnRlc3RCaXQoX19pc3NldF9iaXRmaWVsZCwgX19OVU1fRVhFQ1VUT1JTX0lTU0VUX0lEKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF9udW1fZXhlY3V0b3JzX2lzU2V0KGJvb2xlYW4gdmFsdWUpIHsKKyAgICBfX2lzc2V0X2JpdGZpZWxkID0gRW5jb2RpbmdVdGlscy5zZXRCaXQoX19pc3NldF9iaXRmaWVsZCwgX19OVU1fRVhFQ1VUT1JTX0lTU0VUX0lELCB2YWx1ZSk7CisgIH0KKworICBwdWJsaWMgaW50IGdldF9udW1fdGFza3MoKSB7CisgICAgcmV0dXJuIHRoaXMubnVtX3Rhc2tzOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X251bV90YXNrcyhpbnQgbnVtX3Rhc2tzKSB7CisgICAgdGhpcy5udW1fdGFza3MgPSBudW1fdGFza3M7CisgICAgc2V0X251bV90YXNrc19pc1NldCh0cnVlKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHVuc2V0X251bV90YXNrcygpIHsKKyAgICBfX2lzc2V0X2JpdGZpZWxkID0gRW5jb2RpbmdVdGlscy5jbGVhckJpdChfX2lzc2V0X2JpdGZpZWxkLCBfX05VTV9UQVNLU19JU1NFVF9JRCk7CisgIH0KKworICAvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkIG51bV90YXNrcyBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNfc2V0X251bV90YXNrcygpIHsKKyAgICByZXR1cm4gRW5jb2RpbmdVdGlscy50ZXN0Qml0KF9faXNzZXRfYml0ZmllbGQsIF9fTlVNX1RBU0tTX0lTU0VUX0lEKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF9udW1fdGFza3NfaXNTZXQoYm9vbGVhbiB2YWx1ZSkgeworICAgIF9faXNzZXRfYml0ZmllbGQgPSBFbmNvZGluZ1V0aWxzLnNldEJpdChfX2lzc2V0X2JpdGZpZWxkLCBfX05VTV9UQVNLU19JU1NFVF9JRCwgdmFsdWUpOworICB9CisKKyAgcHVibGljIGxvbmcgZ2V0X2VtaXR0ZWQoKSB7CisgICAgcmV0dXJuIHRoaXMuZW1pdHRlZDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF9lbWl0dGVkKGxvbmcgZW1pdHRlZCkgeworICAgIHRoaXMuZW1pdHRlZCA9IGVtaXR0ZWQ7CisgICAgc2V0X2VtaXR0ZWRfaXNTZXQodHJ1ZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB1bnNldF9lbWl0dGVkKCkgeworICAgIF9faXNzZXRfYml0ZmllbGQgPSBFbmNvZGluZ1V0aWxzLmNsZWFyQml0KF9faXNzZXRfYml0ZmllbGQsIF9fRU1JVFRFRF9JU1NFVF9JRCk7CisgIH0KKworICAvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkIGVtaXR0ZWQgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgIHB1YmxpYyBib29sZWFuIGlzX3NldF9lbWl0dGVkKCkgeworICAgIHJldHVybiBFbmNvZGluZ1V0aWxzLnRlc3RCaXQoX19pc3NldF9iaXRmaWVsZCwgX19FTUlUVEVEX0lTU0VUX0lEKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF9lbWl0dGVkX2lzU2V0KGJvb2xlYW4gdmFsdWUpIHsKKyAgICBfX2lzc2V0X2JpdGZpZWxkID0gRW5jb2RpbmdVdGlscy5zZXRCaXQoX19pc3NldF9iaXRmaWVsZCwgX19FTUlUVEVEX0lTU0VUX0lELCB2YWx1ZSk7CisgIH0KKworICBwdWJsaWMgbG9uZyBnZXRfdHJhbnNmZXJyZWQoKSB7CisgICAgcmV0dXJuIHRoaXMudHJhbnNmZXJyZWQ7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfdHJhbnNmZXJyZWQobG9uZyB0cmFuc2ZlcnJlZCkgeworICAgIHRoaXMudHJhbnNmZXJyZWQgPSB0cmFuc2ZlcnJlZDsKKyAgICBzZXRfdHJhbnNmZXJyZWRfaXNTZXQodHJ1ZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB1bnNldF90cmFuc2ZlcnJlZCgpIHsKKyAgICBfX2lzc2V0X2JpdGZpZWxkID0gRW5jb2RpbmdVdGlscy5jbGVhckJpdChfX2lzc2V0X2JpdGZpZWxkLCBfX1RSQU5TRkVSUkVEX0lTU0VUX0lEKTsKKyAgfQorCisgIC8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgdHJhbnNmZXJyZWQgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgIHB1YmxpYyBib29sZWFuIGlzX3NldF90cmFuc2ZlcnJlZCgpIHsKKyAgICByZXR1cm4gRW5jb2RpbmdVdGlscy50ZXN0Qml0KF9faXNzZXRfYml0ZmllbGQsIF9fVFJBTlNGRVJSRURfSVNTRVRfSUQpOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X3RyYW5zZmVycmVkX2lzU2V0KGJvb2xlYW4gdmFsdWUpIHsKKyAgICBfX2lzc2V0X2JpdGZpZWxkID0gRW5jb2RpbmdVdGlscy5zZXRCaXQoX19pc3NldF9iaXRmaWVsZCwgX19UUkFOU0ZFUlJFRF9JU1NFVF9JRCwgdmFsdWUpOworICB9CisKKyAgcHVibGljIGxvbmcgZ2V0X2Fja2VkKCkgeworICAgIHJldHVybiB0aGlzLmFja2VkOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X2Fja2VkKGxvbmcgYWNrZWQpIHsKKyAgICB0aGlzLmFja2VkID0gYWNrZWQ7CisgICAgc2V0X2Fja2VkX2lzU2V0KHRydWUpOworICB9CisKKyAgcHVibGljIHZvaWQgdW5zZXRfYWNrZWQoKSB7CisgICAgX19pc3NldF9iaXRmaWVsZCA9IEVuY29kaW5nVXRpbHMuY2xlYXJCaXQoX19pc3NldF9iaXRmaWVsZCwgX19BQ0tFRF9JU1NFVF9JRCk7CisgIH0KKworICAvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkIGFja2VkIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLworICBwdWJsaWMgYm9vbGVhbiBpc19zZXRfYWNrZWQoKSB7CisgICAgcmV0dXJuIEVuY29kaW5nVXRpbHMudGVzdEJpdChfX2lzc2V0X2JpdGZpZWxkLCBfX0FDS0VEX0lTU0VUX0lEKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF9hY2tlZF9pc1NldChib29sZWFuIHZhbHVlKSB7CisgICAgX19pc3NldF9iaXRmaWVsZCA9IEVuY29kaW5nVXRpbHMuc2V0Qml0KF9faXNzZXRfYml0ZmllbGQsIF9fQUNLRURfSVNTRVRfSUQsIHZhbHVlKTsKKyAgfQorCisgIHB1YmxpYyBsb25nIGdldF9mYWlsZWQoKSB7CisgICAgcmV0dXJuIHRoaXMuZmFpbGVkOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X2ZhaWxlZChsb25nIGZhaWxlZCkgeworICAgIHRoaXMuZmFpbGVkID0gZmFpbGVkOworICAgIHNldF9mYWlsZWRfaXNTZXQodHJ1ZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB1bnNldF9mYWlsZWQoKSB7CisgICAgX19pc3NldF9iaXRmaWVsZCA9IEVuY29kaW5nVXRpbHMuY2xlYXJCaXQoX19pc3NldF9iaXRmaWVsZCwgX19GQUlMRURfSVNTRVRfSUQpOworICB9CisKKyAgLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBmYWlsZWQgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgIHB1YmxpYyBib29sZWFuIGlzX3NldF9mYWlsZWQoKSB7CisgICAgcmV0dXJuIEVuY29kaW5nVXRpbHMudGVzdEJpdChfX2lzc2V0X2JpdGZpZWxkLCBfX0ZBSUxFRF9JU1NFVF9JRCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfZmFpbGVkX2lzU2V0KGJvb2xlYW4gdmFsdWUpIHsKKyAgICBfX2lzc2V0X2JpdGZpZWxkID0gRW5jb2RpbmdVdGlscy5zZXRCaXQoX19pc3NldF9iaXRmaWVsZCwgX19GQUlMRURfSVNTRVRfSUQsIHZhbHVlKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldEZpZWxkVmFsdWUoX0ZpZWxkcyBmaWVsZCwgT2JqZWN0IHZhbHVlKSB7CisgICAgc3dpdGNoIChmaWVsZCkgeworICAgIGNhc2UgTlVNX0VYRUNVVE9SUzoKKyAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgIHVuc2V0X251bV9leGVjdXRvcnMoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNldF9udW1fZXhlY3V0b3JzKChJbnRlZ2VyKXZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBOVU1fVEFTS1M6CisgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICB1bnNldF9udW1fdGFza3MoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNldF9udW1fdGFza3MoKEludGVnZXIpdmFsdWUpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVNSVRURUQ6CisgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICB1bnNldF9lbWl0dGVkKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzZXRfZW1pdHRlZCgoTG9uZyl2YWx1ZSk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgVFJBTlNGRVJSRUQ6CisgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICB1bnNldF90cmFuc2ZlcnJlZCgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2V0X3RyYW5zZmVycmVkKChMb25nKXZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBBQ0tFRDoKKyAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgIHVuc2V0X2Fja2VkKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzZXRfYWNrZWQoKExvbmcpdmFsdWUpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEZBSUxFRDoKKyAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgIHVuc2V0X2ZhaWxlZCgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2V0X2ZhaWxlZCgoTG9uZyl2YWx1ZSk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIH0KKyAgfQorCisgIHB1YmxpYyBPYmplY3QgZ2V0RmllbGRWYWx1ZShfRmllbGRzIGZpZWxkKSB7CisgICAgc3dpdGNoIChmaWVsZCkgeworICAgIGNhc2UgTlVNX0VYRUNVVE9SUzoKKyAgICAgIHJldHVybiBnZXRfbnVtX2V4ZWN1dG9ycygpOworCisgICAgY2FzZSBOVU1fVEFTS1M6CisgICAgICByZXR1cm4gZ2V0X251bV90YXNrcygpOworCisgICAgY2FzZSBFTUlUVEVEOgorICAgICAgcmV0dXJuIGdldF9lbWl0dGVkKCk7CisKKyAgICBjYXNlIFRSQU5TRkVSUkVEOgorICAgICAgcmV0dXJuIGdldF90cmFuc2ZlcnJlZCgpOworCisgICAgY2FzZSBBQ0tFRDoKKyAgICAgIHJldHVybiBnZXRfYWNrZWQoKTsKKworICAgIGNhc2UgRkFJTEVEOgorICAgICAgcmV0dXJuIGdldF9mYWlsZWQoKTsKKworICAgIH0KKyAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgIH0KKworICAvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkIGNvcnJlc3BvbmRpbmcgdG8gZmllbGRJRCBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNTZXQoX0ZpZWxkcyBmaWVsZCkgeworICAgIGlmIChmaWVsZCA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgc3dpdGNoIChmaWVsZCkgeworICAgIGNhc2UgTlVNX0VYRUNVVE9SUzoKKyAgICAgIHJldHVybiBpc19zZXRfbnVtX2V4ZWN1dG9ycygpOworICAgIGNhc2UgTlVNX1RBU0tTOgorICAgICAgcmV0dXJuIGlzX3NldF9udW1fdGFza3MoKTsKKyAgICBjYXNlIEVNSVRURUQ6CisgICAgICByZXR1cm4gaXNfc2V0X2VtaXR0ZWQoKTsKKyAgICBjYXNlIFRSQU5TRkVSUkVEOgorICAgICAgcmV0dXJuIGlzX3NldF90cmFuc2ZlcnJlZCgpOworICAgIGNhc2UgQUNLRUQ6CisgICAgICByZXR1cm4gaXNfc2V0X2Fja2VkKCk7CisgICAgY2FzZSBGQUlMRUQ6CisgICAgICByZXR1cm4gaXNfc2V0X2ZhaWxlZCgpOworICAgIH0KKyAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCB0aGF0KSB7CisgICAgaWYgKHRoYXQgPT0gbnVsbCkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAodGhhdCBpbnN0YW5jZW9mIENvbW1vbkFnZ3JlZ2F0ZVN0YXRzKQorICAgICAgcmV0dXJuIHRoaXMuZXF1YWxzKChDb21tb25BZ2dyZWdhdGVTdGF0cyl0aGF0KTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoQ29tbW9uQWdncmVnYXRlU3RhdHMgdGhhdCkgeworICAgIGlmICh0aGF0ID09IG51bGwpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBib29sZWFuIHRoaXNfcHJlc2VudF9udW1fZXhlY3V0b3JzID0gdHJ1ZSAmJiB0aGlzLmlzX3NldF9udW1fZXhlY3V0b3JzKCk7CisgICAgYm9vbGVhbiB0aGF0X3ByZXNlbnRfbnVtX2V4ZWN1dG9ycyA9IHRydWUgJiYgdGhhdC5pc19zZXRfbnVtX2V4ZWN1dG9ycygpOworICAgIGlmICh0aGlzX3ByZXNlbnRfbnVtX2V4ZWN1dG9ycyB8fCB0aGF0X3ByZXNlbnRfbnVtX2V4ZWN1dG9ycykgeworICAgICAgaWYgKCEodGhpc19wcmVzZW50X251bV9leGVjdXRvcnMgJiYgdGhhdF9wcmVzZW50X251bV9leGVjdXRvcnMpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBpZiAodGhpcy5udW1fZXhlY3V0b3JzICE9IHRoYXQubnVtX2V4ZWN1dG9ycykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2xlYW4gdGhpc19wcmVzZW50X251bV90YXNrcyA9IHRydWUgJiYgdGhpcy5pc19zZXRfbnVtX3Rhc2tzKCk7CisgICAgYm9vbGVhbiB0aGF0X3ByZXNlbnRfbnVtX3Rhc2tzID0gdHJ1ZSAmJiB0aGF0LmlzX3NldF9udW1fdGFza3MoKTsKKyAgICBpZiAodGhpc19wcmVzZW50X251bV90YXNrcyB8fCB0aGF0X3ByZXNlbnRfbnVtX3Rhc2tzKSB7CisgICAgICBpZiAoISh0aGlzX3ByZXNlbnRfbnVtX3Rhc2tzICYmIHRoYXRfcHJlc2VudF9udW1fdGFza3MpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBpZiAodGhpcy5udW1fdGFza3MgIT0gdGhhdC5udW1fdGFza3MpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sZWFuIHRoaXNfcHJlc2VudF9lbWl0dGVkID0gdHJ1ZSAmJiB0aGlzLmlzX3NldF9lbWl0dGVkKCk7CisgICAgYm9vbGVhbiB0aGF0X3ByZXNlbnRfZW1pdHRlZCA9IHRydWUgJiYgdGhhdC5pc19zZXRfZW1pdHRlZCgpOworICAgIGlmICh0aGlzX3ByZXNlbnRfZW1pdHRlZCB8fCB0aGF0X3ByZXNlbnRfZW1pdHRlZCkgeworICAgICAgaWYgKCEodGhpc19wcmVzZW50X2VtaXR0ZWQgJiYgdGhhdF9wcmVzZW50X2VtaXR0ZWQpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBpZiAodGhpcy5lbWl0dGVkICE9IHRoYXQuZW1pdHRlZCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2xlYW4gdGhpc19wcmVzZW50X3RyYW5zZmVycmVkID0gdHJ1ZSAmJiB0aGlzLmlzX3NldF90cmFuc2ZlcnJlZCgpOworICAgIGJvb2xlYW4gdGhhdF9wcmVzZW50X3RyYW5zZmVycmVkID0gdHJ1ZSAmJiB0aGF0LmlzX3NldF90cmFuc2ZlcnJlZCgpOworICAgIGlmICh0aGlzX3ByZXNlbnRfdHJhbnNmZXJyZWQgfHwgdGhhdF9wcmVzZW50X3RyYW5zZmVycmVkKSB7CisgICAgICBpZiAoISh0aGlzX3ByZXNlbnRfdHJhbnNmZXJyZWQgJiYgdGhhdF9wcmVzZW50X3RyYW5zZmVycmVkKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKHRoaXMudHJhbnNmZXJyZWQgIT0gdGhhdC50cmFuc2ZlcnJlZCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2xlYW4gdGhpc19wcmVzZW50X2Fja2VkID0gdHJ1ZSAmJiB0aGlzLmlzX3NldF9hY2tlZCgpOworICAgIGJvb2xlYW4gdGhhdF9wcmVzZW50X2Fja2VkID0gdHJ1ZSAmJiB0aGF0LmlzX3NldF9hY2tlZCgpOworICAgIGlmICh0aGlzX3ByZXNlbnRfYWNrZWQgfHwgdGhhdF9wcmVzZW50X2Fja2VkKSB7CisgICAgICBpZiAoISh0aGlzX3ByZXNlbnRfYWNrZWQgJiYgdGhhdF9wcmVzZW50X2Fja2VkKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKHRoaXMuYWNrZWQgIT0gdGhhdC5hY2tlZCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2xlYW4gdGhpc19wcmVzZW50X2ZhaWxlZCA9IHRydWUgJiYgdGhpcy5pc19zZXRfZmFpbGVkKCk7CisgICAgYm9vbGVhbiB0aGF0X3ByZXNlbnRfZmFpbGVkID0gdHJ1ZSAmJiB0aGF0LmlzX3NldF9mYWlsZWQoKTsKKyAgICBpZiAodGhpc19wcmVzZW50X2ZhaWxlZCB8fCB0aGF0X3ByZXNlbnRfZmFpbGVkKSB7CisgICAgICBpZiAoISh0aGlzX3ByZXNlbnRfZmFpbGVkICYmIHRoYXRfcHJlc2VudF9mYWlsZWQpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBpZiAodGhpcy5mYWlsZWQgIT0gdGhhdC5mYWlsZWQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgIExpc3Q8T2JqZWN0PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7CisKKyAgICBib29sZWFuIHByZXNlbnRfbnVtX2V4ZWN1dG9ycyA9IHRydWUgJiYgKGlzX3NldF9udW1fZXhlY3V0b3JzKCkpOworICAgIGxpc3QuYWRkKHByZXNlbnRfbnVtX2V4ZWN1dG9ycyk7CisgICAgaWYgKHByZXNlbnRfbnVtX2V4ZWN1dG9ycykKKyAgICAgIGxpc3QuYWRkKG51bV9leGVjdXRvcnMpOworCisgICAgYm9vbGVhbiBwcmVzZW50X251bV90YXNrcyA9IHRydWUgJiYgKGlzX3NldF9udW1fdGFza3MoKSk7CisgICAgbGlzdC5hZGQocHJlc2VudF9udW1fdGFza3MpOworICAgIGlmIChwcmVzZW50X251bV90YXNrcykKKyAgICAgIGxpc3QuYWRkKG51bV90YXNrcyk7CisKKyAgICBib29sZWFuIHByZXNlbnRfZW1pdHRlZCA9IHRydWUgJiYgKGlzX3NldF9lbWl0dGVkKCkpOworICAgIGxpc3QuYWRkKHByZXNlbnRfZW1pdHRlZCk7CisgICAgaWYgKHByZXNlbnRfZW1pdHRlZCkKKyAgICAgIGxpc3QuYWRkKGVtaXR0ZWQpOworCisgICAgYm9vbGVhbiBwcmVzZW50X3RyYW5zZmVycmVkID0gdHJ1ZSAmJiAoaXNfc2V0X3RyYW5zZmVycmVkKCkpOworICAgIGxpc3QuYWRkKHByZXNlbnRfdHJhbnNmZXJyZWQpOworICAgIGlmIChwcmVzZW50X3RyYW5zZmVycmVkKQorICAgICAgbGlzdC5hZGQodHJhbnNmZXJyZWQpOworCisgICAgYm9vbGVhbiBwcmVzZW50X2Fja2VkID0gdHJ1ZSAmJiAoaXNfc2V0X2Fja2VkKCkpOworICAgIGxpc3QuYWRkKHByZXNlbnRfYWNrZWQpOworICAgIGlmIChwcmVzZW50X2Fja2VkKQorICAgICAgbGlzdC5hZGQoYWNrZWQpOworCisgICAgYm9vbGVhbiBwcmVzZW50X2ZhaWxlZCA9IHRydWUgJiYgKGlzX3NldF9mYWlsZWQoKSk7CisgICAgbGlzdC5hZGQocHJlc2VudF9mYWlsZWQpOworICAgIGlmIChwcmVzZW50X2ZhaWxlZCkKKyAgICAgIGxpc3QuYWRkKGZhaWxlZCk7CisKKyAgICByZXR1cm4gbGlzdC5oYXNoQ29kZSgpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgY29tcGFyZVRvKENvbW1vbkFnZ3JlZ2F0ZVN0YXRzIG90aGVyKSB7CisgICAgaWYgKCFnZXRDbGFzcygpLmVxdWFscyhvdGhlci5nZXRDbGFzcygpKSkgeworICAgICAgcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpLmNvbXBhcmVUbyhvdGhlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgfQorCisgICAgaW50IGxhc3RDb21wYXJpc29uID0gMDsKKworICAgIGxhc3RDb21wYXJpc29uID0gQm9vbGVhbi52YWx1ZU9mKGlzX3NldF9udW1fZXhlY3V0b3JzKCkpLmNvbXBhcmVUbyhvdGhlci5pc19zZXRfbnVtX2V4ZWN1dG9ycygpKTsKKyAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgIH0KKyAgICBpZiAoaXNfc2V0X251bV9leGVjdXRvcnMoKSkgeworICAgICAgbGFzdENvbXBhcmlzb24gPSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy5udW1fZXhlY3V0b3JzLCBvdGhlci5udW1fZXhlY3V0b3JzKTsKKyAgICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICAgIH0KKyAgICB9CisgICAgbGFzdENvbXBhcmlzb24gPSBCb29sZWFuLnZhbHVlT2YoaXNfc2V0X251bV90YXNrcygpKS5jb21wYXJlVG8ob3RoZXIuaXNfc2V0X251bV90YXNrcygpKTsKKyAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgIH0KKyAgICBpZiAoaXNfc2V0X251bV90YXNrcygpKSB7CisgICAgICBsYXN0Q29tcGFyaXNvbiA9IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvbXBhcmVUbyh0aGlzLm51bV90YXNrcywgb3RoZXIubnVtX3Rhc2tzKTsKKyAgICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICAgIH0KKyAgICB9CisgICAgbGFzdENvbXBhcmlzb24gPSBCb29sZWFuLnZhbHVlT2YoaXNfc2V0X2VtaXR0ZWQoKSkuY29tcGFyZVRvKG90aGVyLmlzX3NldF9lbWl0dGVkKCkpOworICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgfQorICAgIGlmIChpc19zZXRfZW1pdHRlZCgpKSB7CisgICAgICBsYXN0Q29tcGFyaXNvbiA9IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvbXBhcmVUbyh0aGlzLmVtaXR0ZWQsIG90aGVyLmVtaXR0ZWQpOworICAgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgICAgfQorICAgIH0KKyAgICBsYXN0Q29tcGFyaXNvbiA9IEJvb2xlYW4udmFsdWVPZihpc19zZXRfdHJhbnNmZXJyZWQoKSkuY29tcGFyZVRvKG90aGVyLmlzX3NldF90cmFuc2ZlcnJlZCgpKTsKKyAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgIH0KKyAgICBpZiAoaXNfc2V0X3RyYW5zZmVycmVkKCkpIHsKKyAgICAgIGxhc3RDb21wYXJpc29uID0gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29tcGFyZVRvKHRoaXMudHJhbnNmZXJyZWQsIG90aGVyLnRyYW5zZmVycmVkKTsKKyAgICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICAgIH0KKyAgICB9CisgICAgbGFzdENvbXBhcmlzb24gPSBCb29sZWFuLnZhbHVlT2YoaXNfc2V0X2Fja2VkKCkpLmNvbXBhcmVUbyhvdGhlci5pc19zZXRfYWNrZWQoKSk7CisgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICB9CisgICAgaWYgKGlzX3NldF9hY2tlZCgpKSB7CisgICAgICBsYXN0Q29tcGFyaXNvbiA9IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvbXBhcmVUbyh0aGlzLmFja2VkLCBvdGhlci5hY2tlZCk7CisgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICB9CisgICAgfQorICAgIGxhc3RDb21wYXJpc29uID0gQm9vbGVhbi52YWx1ZU9mKGlzX3NldF9mYWlsZWQoKSkuY29tcGFyZVRvKG90aGVyLmlzX3NldF9mYWlsZWQoKSk7CisgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICB9CisgICAgaWYgKGlzX3NldF9mYWlsZWQoKSkgeworICAgICAgbGFzdENvbXBhcmlzb24gPSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy5mYWlsZWQsIG90aGVyLmZhaWxlZCk7CisgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworICB9CisKKyAgcHVibGljIF9GaWVsZHMgZmllbGRGb3JJZChpbnQgZmllbGRJZCkgeworICAgIHJldHVybiBfRmllbGRzLmZpbmRCeVRocmlmdElkKGZpZWxkSWQpOworICB9CisKKyAgcHVibGljIHZvaWQgcmVhZChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgaXByb3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICBzY2hlbWVzLmdldChpcHJvdC5nZXRTY2hlbWUoKSkuZ2V0U2NoZW1lKCkucmVhZChpcHJvdCwgdGhpcyk7CisgIH0KKworICBwdWJsaWMgdm9pZCB3cml0ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgb3Byb3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICBzY2hlbWVzLmdldChvcHJvdC5nZXRTY2hlbWUoKSkuZ2V0U2NoZW1lKCkud3JpdGUob3Byb3QsIHRoaXMpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCJDb21tb25BZ2dyZWdhdGVTdGF0cygiKTsKKyAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKKworICAgIGlmIChpc19zZXRfbnVtX2V4ZWN1dG9ycygpKSB7CisgICAgICBzYi5hcHBlbmQoIm51bV9leGVjdXRvcnM6Iik7CisgICAgICBzYi5hcHBlbmQodGhpcy5udW1fZXhlY3V0b3JzKTsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfQorICAgIGlmIChpc19zZXRfbnVtX3Rhc2tzKCkpIHsKKyAgICAgIGlmICghZmlyc3QpIHNiLmFwcGVuZCgiLCAiKTsKKyAgICAgIHNiLmFwcGVuZCgibnVtX3Rhc2tzOiIpOworICAgICAgc2IuYXBwZW5kKHRoaXMubnVtX3Rhc2tzKTsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfQorICAgIGlmIChpc19zZXRfZW1pdHRlZCgpKSB7CisgICAgICBpZiAoIWZpcnN0KSBzYi5hcHBlbmQoIiwgIik7CisgICAgICBzYi5hcHBlbmQoImVtaXR0ZWQ6Iik7CisgICAgICBzYi5hcHBlbmQodGhpcy5lbWl0dGVkKTsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfQorICAgIGlmIChpc19zZXRfdHJhbnNmZXJyZWQoKSkgeworICAgICAgaWYgKCFmaXJzdCkgc2IuYXBwZW5kKCIsICIpOworICAgICAgc2IuYXBwZW5kKCJ0cmFuc2ZlcnJlZDoiKTsKKyAgICAgIHNiLmFwcGVuZCh0aGlzLnRyYW5zZmVycmVkKTsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfQorICAgIGlmIChpc19zZXRfYWNrZWQoKSkgeworICAgICAgaWYgKCFmaXJzdCkgc2IuYXBwZW5kKCIsICIpOworICAgICAgc2IuYXBwZW5kKCJhY2tlZDoiKTsKKyAgICAgIHNiLmFwcGVuZCh0aGlzLmFja2VkKTsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfQorICAgIGlmIChpc19zZXRfZmFpbGVkKCkpIHsKKyAgICAgIGlmICghZmlyc3QpIHNiLmFwcGVuZCgiLCAiKTsKKyAgICAgIHNiLmFwcGVuZCgiZmFpbGVkOiIpOworICAgICAgc2IuYXBwZW5kKHRoaXMuZmFpbGVkKTsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfQorICAgIHNiLmFwcGVuZCgiKSIpOworICAgIHJldHVybiBzYi50b1N0cmluZygpOworICB9CisKKyAgcHVibGljIHZvaWQgdmFsaWRhdGUoKSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgLy8gY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcworICAgIC8vIGNoZWNrIGZvciBzdWItc3RydWN0IHZhbGlkaXR5CisgIH0KKworICBwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIHdyaXRlKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQ29tcGFjdFByb3RvY29sKG5ldyBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVElPU3RyZWFtVHJhbnNwb3J0KG91dCkpKTsKKyAgICB9IGNhdGNoIChvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHRlKSB7CisgICAgICB0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbih0ZSk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBpbikgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICAvLyBpdCBkb2Vzbid0IHNlZW0gbGlrZSB5b3Ugc2hvdWxkIGhhdmUgdG8gZG8gdGhpcywgYnV0IGphdmEgc2VyaWFsaXphdGlvbiBpcyB3YWNreSwgYW5kIGRvZXNuJ3QgY2FsbCB0aGUgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICAgIF9faXNzZXRfYml0ZmllbGQgPSAwOworICAgICAgcmVhZChuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbChuZXcgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRJT1N0cmVhbVRyYW5zcG9ydChpbikpKTsKKyAgICB9IGNhdGNoIChvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHRlKSB7CisgICAgICB0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbih0ZSk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ29tbW9uQWdncmVnYXRlU3RhdHNTdGFuZGFyZFNjaGVtZUZhY3RvcnkgaW1wbGVtZW50cyBTY2hlbWVGYWN0b3J5IHsKKyAgICBwdWJsaWMgQ29tbW9uQWdncmVnYXRlU3RhdHNTdGFuZGFyZFNjaGVtZSBnZXRTY2hlbWUoKSB7CisgICAgICByZXR1cm4gbmV3IENvbW1vbkFnZ3JlZ2F0ZVN0YXRzU3RhbmRhcmRTY2hlbWUoKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDb21tb25BZ2dyZWdhdGVTdGF0c1N0YW5kYXJkU2NoZW1lIGV4dGVuZHMgU3RhbmRhcmRTY2hlbWU8Q29tbW9uQWdncmVnYXRlU3RhdHM+IHsKKworICAgIHB1YmxpYyB2b2lkIHJlYWQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIGlwcm90LCBDb21tb25BZ2dyZWdhdGVTdGF0cyBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBzY2hlbWVGaWVsZDsKKyAgICAgIGlwcm90LnJlYWRTdHJ1Y3RCZWdpbigpOworICAgICAgd2hpbGUgKHRydWUpCisgICAgICB7CisgICAgICAgIHNjaGVtZUZpZWxkID0gaXByb3QucmVhZEZpZWxkQmVnaW4oKTsKKyAgICAgICAgaWYgKHNjaGVtZUZpZWxkLnR5cGUgPT0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RPUCkgeyAKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKHNjaGVtZUZpZWxkLmlkKSB7CisgICAgICAgICAgY2FzZSAxOiAvLyBOVU1fRVhFQ1VUT1JTCisgICAgICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JMzIpIHsKKyAgICAgICAgICAgICAgc3RydWN0Lm51bV9leGVjdXRvcnMgPSBpcHJvdC5yZWFkSTMyKCk7CisgICAgICAgICAgICAgIHN0cnVjdC5zZXRfbnVtX2V4ZWN1dG9yc19pc1NldCh0cnVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7IAorICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAyOiAvLyBOVU1fVEFTS1MKKyAgICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkkzMikgeworICAgICAgICAgICAgICBzdHJ1Y3QubnVtX3Rhc2tzID0gaXByb3QucmVhZEkzMigpOworICAgICAgICAgICAgICBzdHJ1Y3Quc2V0X251bV90YXNrc19pc1NldCh0cnVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7IAorICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAzOiAvLyBFTUlUVEVECisgICAgICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JNjQpIHsKKyAgICAgICAgICAgICAgc3RydWN0LmVtaXR0ZWQgPSBpcHJvdC5yZWFkSTY0KCk7CisgICAgICAgICAgICAgIHN0cnVjdC5zZXRfZW1pdHRlZF9pc1NldCh0cnVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7IAorICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSA0OiAvLyBUUkFOU0ZFUlJFRAorICAgICAgICAgICAgaWYgKHNjaGVtZUZpZWxkLnR5cGUgPT0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTY0KSB7CisgICAgICAgICAgICAgIHN0cnVjdC50cmFuc2ZlcnJlZCA9IGlwcm90LnJlYWRJNjQoKTsKKyAgICAgICAgICAgICAgc3RydWN0LnNldF90cmFuc2ZlcnJlZF9pc1NldCh0cnVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7IAorICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSA1OiAvLyBBQ0tFRAorICAgICAgICAgICAgaWYgKHNjaGVtZUZpZWxkLnR5cGUgPT0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTY0KSB7CisgICAgICAgICAgICAgIHN0cnVjdC5hY2tlZCA9IGlwcm90LnJlYWRJNjQoKTsKKyAgICAgICAgICAgICAgc3RydWN0LnNldF9hY2tlZF9pc1NldCh0cnVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7IAorICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSA2OiAvLyBGQUlMRUQKKyAgICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkk2NCkgeworICAgICAgICAgICAgICBzdHJ1Y3QuZmFpbGVkID0gaXByb3QucmVhZEk2NCgpOworICAgICAgICAgICAgICBzdHJ1Y3Quc2V0X2ZhaWxlZF9pc1NldCh0cnVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7IAorICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgc2NoZW1lRmllbGQudHlwZSk7CisgICAgICAgIH0KKyAgICAgICAgaXByb3QucmVhZEZpZWxkRW5kKCk7CisgICAgICB9CisgICAgICBpcHJvdC5yZWFkU3RydWN0RW5kKCk7CisgICAgICBzdHJ1Y3QudmFsaWRhdGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgb3Byb3QsIENvbW1vbkFnZ3JlZ2F0ZVN0YXRzIHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgc3RydWN0LnZhbGlkYXRlKCk7CisKKyAgICAgIG9wcm90LndyaXRlU3RydWN0QmVnaW4oU1RSVUNUX0RFU0MpOworICAgICAgaWYgKHN0cnVjdC5pc19zZXRfbnVtX2V4ZWN1dG9ycygpKSB7CisgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihOVU1fRVhFQ1VUT1JTX0ZJRUxEX0RFU0MpOworICAgICAgICBvcHJvdC53cml0ZUkzMihzdHJ1Y3QubnVtX2V4ZWN1dG9ycyk7CisgICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X251bV90YXNrcygpKSB7CisgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihOVU1fVEFTS1NfRklFTERfREVTQyk7CisgICAgICAgIG9wcm90LndyaXRlSTMyKHN0cnVjdC5udW1fdGFza3MpOworICAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9lbWl0dGVkKCkpIHsKKyAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKEVNSVRURURfRklFTERfREVTQyk7CisgICAgICAgIG9wcm90LndyaXRlSTY0KHN0cnVjdC5lbWl0dGVkKTsKKyAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5pc19zZXRfdHJhbnNmZXJyZWQoKSkgeworICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oVFJBTlNGRVJSRURfRklFTERfREVTQyk7CisgICAgICAgIG9wcm90LndyaXRlSTY0KHN0cnVjdC50cmFuc2ZlcnJlZCk7CisgICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X2Fja2VkKCkpIHsKKyAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKEFDS0VEX0ZJRUxEX0RFU0MpOworICAgICAgICBvcHJvdC53cml0ZUk2NChzdHJ1Y3QuYWNrZWQpOworICAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9mYWlsZWQoKSkgeworICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oRkFJTEVEX0ZJRUxEX0RFU0MpOworICAgICAgICBvcHJvdC53cml0ZUk2NChzdHJ1Y3QuZmFpbGVkKTsKKyAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgICAgfQorICAgICAgb3Byb3Qud3JpdGVGaWVsZFN0b3AoKTsKKyAgICAgIG9wcm90LndyaXRlU3RydWN0RW5kKCk7CisgICAgfQorCisgIH0KKworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDb21tb25BZ2dyZWdhdGVTdGF0c1R1cGxlU2NoZW1lRmFjdG9yeSBpbXBsZW1lbnRzIFNjaGVtZUZhY3RvcnkgeworICAgIHB1YmxpYyBDb21tb25BZ2dyZWdhdGVTdGF0c1R1cGxlU2NoZW1lIGdldFNjaGVtZSgpIHsKKyAgICAgIHJldHVybiBuZXcgQ29tbW9uQWdncmVnYXRlU3RhdHNUdXBsZVNjaGVtZSgpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIENvbW1vbkFnZ3JlZ2F0ZVN0YXRzVHVwbGVTY2hlbWUgZXh0ZW5kcyBUdXBsZVNjaGVtZTxDb21tb25BZ2dyZWdhdGVTdGF0cz4geworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIHByb3QsIENvbW1vbkFnZ3JlZ2F0ZVN0YXRzIHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgVFR1cGxlUHJvdG9jb2wgb3Byb3QgPSAoVFR1cGxlUHJvdG9jb2wpIHByb3Q7CisgICAgICBCaXRTZXQgb3B0aW9uYWxzID0gbmV3IEJpdFNldCgpOworICAgICAgaWYgKHN0cnVjdC5pc19zZXRfbnVtX2V4ZWN1dG9ycygpKSB7CisgICAgICAgIG9wdGlvbmFscy5zZXQoMCk7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9udW1fdGFza3MoKSkgeworICAgICAgICBvcHRpb25hbHMuc2V0KDEpOworICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5pc19zZXRfZW1pdHRlZCgpKSB7CisgICAgICAgIG9wdGlvbmFscy5zZXQoMik7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF90cmFuc2ZlcnJlZCgpKSB7CisgICAgICAgIG9wdGlvbmFscy5zZXQoMyk7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9hY2tlZCgpKSB7CisgICAgICAgIG9wdGlvbmFscy5zZXQoNCk7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9mYWlsZWQoKSkgeworICAgICAgICBvcHRpb25hbHMuc2V0KDUpOworICAgICAgfQorICAgICAgb3Byb3Qud3JpdGVCaXRTZXQob3B0aW9uYWxzLCA2KTsKKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X251bV9leGVjdXRvcnMoKSkgeworICAgICAgICBvcHJvdC53cml0ZUkzMihzdHJ1Y3QubnVtX2V4ZWN1dG9ycyk7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9udW1fdGFza3MoKSkgeworICAgICAgICBvcHJvdC53cml0ZUkzMihzdHJ1Y3QubnVtX3Rhc2tzKTsKKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X2VtaXR0ZWQoKSkgeworICAgICAgICBvcHJvdC53cml0ZUk2NChzdHJ1Y3QuZW1pdHRlZCk7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF90cmFuc2ZlcnJlZCgpKSB7CisgICAgICAgIG9wcm90LndyaXRlSTY0KHN0cnVjdC50cmFuc2ZlcnJlZCk7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9hY2tlZCgpKSB7CisgICAgICAgIG9wcm90LndyaXRlSTY0KHN0cnVjdC5hY2tlZCk7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9mYWlsZWQoKSkgeworICAgICAgICBvcHJvdC53cml0ZUk2NChzdHJ1Y3QuZmFpbGVkKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZWFkKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBwcm90LCBDb21tb25BZ2dyZWdhdGVTdGF0cyBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgIFRUdXBsZVByb3RvY29sIGlwcm90ID0gKFRUdXBsZVByb3RvY29sKSBwcm90OworICAgICAgQml0U2V0IGluY29taW5nID0gaXByb3QucmVhZEJpdFNldCg2KTsKKyAgICAgIGlmIChpbmNvbWluZy5nZXQoMCkpIHsKKyAgICAgICAgc3RydWN0Lm51bV9leGVjdXRvcnMgPSBpcHJvdC5yZWFkSTMyKCk7CisgICAgICAgIHN0cnVjdC5zZXRfbnVtX2V4ZWN1dG9yc19pc1NldCh0cnVlKTsKKyAgICAgIH0KKyAgICAgIGlmIChpbmNvbWluZy5nZXQoMSkpIHsKKyAgICAgICAgc3RydWN0Lm51bV90YXNrcyA9IGlwcm90LnJlYWRJMzIoKTsKKyAgICAgICAgc3RydWN0LnNldF9udW1fdGFza3NfaXNTZXQodHJ1ZSk7CisgICAgICB9CisgICAgICBpZiAoaW5jb21pbmcuZ2V0KDIpKSB7CisgICAgICAgIHN0cnVjdC5lbWl0dGVkID0gaXByb3QucmVhZEk2NCgpOworICAgICAgICBzdHJ1Y3Quc2V0X2VtaXR0ZWRfaXNTZXQodHJ1ZSk7CisgICAgICB9CisgICAgICBpZiAoaW5jb21pbmcuZ2V0KDMpKSB7CisgICAgICAgIHN0cnVjdC50cmFuc2ZlcnJlZCA9IGlwcm90LnJlYWRJNjQoKTsKKyAgICAgICAgc3RydWN0LnNldF90cmFuc2ZlcnJlZF9pc1NldCh0cnVlKTsKKyAgICAgIH0KKyAgICAgIGlmIChpbmNvbWluZy5nZXQoNCkpIHsKKyAgICAgICAgc3RydWN0LmFja2VkID0gaXByb3QucmVhZEk2NCgpOworICAgICAgICBzdHJ1Y3Quc2V0X2Fja2VkX2lzU2V0KHRydWUpOworICAgICAgfQorICAgICAgaWYgKGluY29taW5nLmdldCg1KSkgeworICAgICAgICBzdHJ1Y3QuZmFpbGVkID0gaXByb3QucmVhZEk2NCgpOworICAgICAgICBzdHJ1Y3Quc2V0X2ZhaWxlZF9pc1NldCh0cnVlKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworfQorCmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL0NvbXBvbmVudEFnZ3JlZ2F0ZVN0YXRzLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL0NvbXBvbmVudEFnZ3JlZ2F0ZVN0YXRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVhMDYwZgotLS0gL2Rldi9udWxsCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvQ29tcG9uZW50QWdncmVnYXRlU3RhdHMuamF2YQpAQCAtMCwwICsxLDc1MiBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8qKgorICogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4zKQorICoKKyAqIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkcKKyAqICBAZ2VuZXJhdGVkCisgKi8KK3BhY2thZ2UgYmFja3R5cGUuc3Rvcm0uZ2VuZXJhdGVkOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLklTY2hlbWU7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLlNjaGVtZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLlN0YW5kYXJkU2NoZW1lOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLlR1cGxlU2NoZW1lOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUdXBsZVByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5FbmNvZGluZ1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuQXN5bmNNZXRob2RDYWxsYmFjazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlci4qOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bU1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuQml0U2V0OworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLkdlbmVyYXRlZDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitAU3VwcHJlc3NXYXJuaW5ncyh7ImNhc3QiLCAicmF3dHlwZXMiLCAic2VyaWFsIiwgInVuY2hlY2tlZCJ9KQorQEdlbmVyYXRlZCh2YWx1ZSA9ICJBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjMpIikKK3B1YmxpYyBjbGFzcyBDb21wb25lbnRBZ2dyZWdhdGVTdGF0cyBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlPENvbXBvbmVudEFnZ3JlZ2F0ZVN0YXRzLCBDb21wb25lbnRBZ2dyZWdhdGVTdGF0cy5fRmllbGRzPiwgamF2YS5pby5TZXJpYWxpemFibGUsIENsb25lYWJsZSwgQ29tcGFyYWJsZTxDb21wb25lbnRBZ2dyZWdhdGVTdGF0cz4geworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0IFNUUlVDVF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QoIkNvbXBvbmVudEFnZ3JlZ2F0ZVN0YXRzIik7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIFRZUEVfRklFTERfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQoInR5cGUiLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JMzIsIChzaG9ydCkxKTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIENPTU1PTl9TVEFUU19GSUVMRF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCgiY29tbW9uX3N0YXRzIiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNULCAoc2hvcnQpMik7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBTUEVDSUZJQ19TVEFUU19GSUVMRF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCgic3BlY2lmaWNfc3RhdHMiLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIChzaG9ydCkzKTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIExBU1RfRVJST1JfRklFTERfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQoImxhc3RfZXJyb3IiLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIChzaG9ydCk0KTsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8Q2xhc3M8PyBleHRlbmRzIElTY2hlbWU+LCBTY2hlbWVGYWN0b3J5PiBzY2hlbWVzID0gbmV3IEhhc2hNYXA8Q2xhc3M8PyBleHRlbmRzIElTY2hlbWU+LCBTY2hlbWVGYWN0b3J5PigpOworICBzdGF0aWMgeworICAgIHNjaGVtZXMucHV0KFN0YW5kYXJkU2NoZW1lLmNsYXNzLCBuZXcgQ29tcG9uZW50QWdncmVnYXRlU3RhdHNTdGFuZGFyZFNjaGVtZUZhY3RvcnkoKSk7CisgICAgc2NoZW1lcy5wdXQoVHVwbGVTY2hlbWUuY2xhc3MsIG5ldyBDb21wb25lbnRBZ2dyZWdhdGVTdGF0c1R1cGxlU2NoZW1lRmFjdG9yeSgpKTsKKyAgfQorCisgIHByaXZhdGUgQ29tcG9uZW50VHlwZSB0eXBlOyAvLyBvcHRpb25hbAorICBwcml2YXRlIENvbW1vbkFnZ3JlZ2F0ZVN0YXRzIGNvbW1vbl9zdGF0czsgLy8gb3B0aW9uYWwKKyAgcHJpdmF0ZSBTcGVjaWZpY0FnZ3JlZ2F0ZVN0YXRzIHNwZWNpZmljX3N0YXRzOyAvLyBvcHRpb25hbAorICBwcml2YXRlIEVycm9ySW5mbyBsYXN0X2Vycm9yOyAvLyBvcHRpb25hbAorCisgIC8qKiBUaGUgc2V0IG9mIGZpZWxkcyB0aGlzIHN0cnVjdCBjb250YWlucywgYWxvbmcgd2l0aCBjb252ZW5pZW5jZSBtZXRob2RzIGZvciBmaW5kaW5nIGFuZCBtYW5pcHVsYXRpbmcgdGhlbS4gKi8KKyAgcHVibGljIGVudW0gX0ZpZWxkcyBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZElkRW51bSB7CisgICAgLyoqCisgICAgICogCisgICAgICogQHNlZSBDb21wb25lbnRUeXBlCisgICAgICovCisgICAgVFlQRSgoc2hvcnQpMSwgInR5cGUiKSwKKyAgICBDT01NT05fU1RBVFMoKHNob3J0KTIsICJjb21tb25fc3RhdHMiKSwKKyAgICBTUEVDSUZJQ19TVEFUUygoc2hvcnQpMywgInNwZWNpZmljX3N0YXRzIiksCisgICAgTEFTVF9FUlJPUigoc2hvcnQpNCwgImxhc3RfZXJyb3IiKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsIF9GaWVsZHM+IGJ5TmFtZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgX0ZpZWxkcz4oKTsKKworICAgIHN0YXRpYyB7CisgICAgICBmb3IgKF9GaWVsZHMgZmllbGQgOiBFbnVtU2V0LmFsbE9mKF9GaWVsZHMuY2xhc3MpKSB7CisgICAgICAgIGJ5TmFtZS5wdXQoZmllbGQuZ2V0RmllbGROYW1lKCksIGZpZWxkKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kIHRoZSBfRmllbGRzIGNvbnN0YW50IHRoYXQgbWF0Y2hlcyBmaWVsZElkLCBvciBudWxsIGlmIGl0cyBub3QgZm91bmQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBfRmllbGRzIGZpbmRCeVRocmlmdElkKGludCBmaWVsZElkKSB7CisgICAgICBzd2l0Y2goZmllbGRJZCkgeworICAgICAgICBjYXNlIDE6IC8vIFRZUEUKKyAgICAgICAgICByZXR1cm4gVFlQRTsKKyAgICAgICAgY2FzZSAyOiAvLyBDT01NT05fU1RBVFMKKyAgICAgICAgICByZXR1cm4gQ09NTU9OX1NUQVRTOworICAgICAgICBjYXNlIDM6IC8vIFNQRUNJRklDX1NUQVRTCisgICAgICAgICAgcmV0dXJuIFNQRUNJRklDX1NUQVRTOworICAgICAgICBjYXNlIDQ6IC8vIExBU1RfRVJST1IKKyAgICAgICAgICByZXR1cm4gTEFTVF9FUlJPUjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kIHRoZSBfRmllbGRzIGNvbnN0YW50IHRoYXQgbWF0Y2hlcyBmaWVsZElkLCB0aHJvd2luZyBhbiBleGNlcHRpb24KKyAgICAgKiBpZiBpdCBpcyBub3QgZm91bmQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBfRmllbGRzIGZpbmRCeVRocmlmdElkT3JUaHJvdyhpbnQgZmllbGRJZCkgeworICAgICAgX0ZpZWxkcyBmaWVsZHMgPSBmaW5kQnlUaHJpZnRJZChmaWVsZElkKTsKKyAgICAgIGlmIChmaWVsZHMgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRmllbGQgIiArIGZpZWxkSWQgKyAiIGRvZXNuJ3QgZXhpc3QhIik7CisgICAgICByZXR1cm4gZmllbGRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgdGhlIF9GaWVsZHMgY29uc3RhbnQgdGhhdCBtYXRjaGVzIG5hbWUsIG9yIG51bGwgaWYgaXRzIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIF9GaWVsZHMgZmluZEJ5TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgcmV0dXJuIGJ5TmFtZS5nZXQobmFtZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBzaG9ydCBfdGhyaWZ0SWQ7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX2ZpZWxkTmFtZTsKKworICAgIF9GaWVsZHMoc2hvcnQgdGhyaWZ0SWQsIFN0cmluZyBmaWVsZE5hbWUpIHsKKyAgICAgIF90aHJpZnRJZCA9IHRocmlmdElkOworICAgICAgX2ZpZWxkTmFtZSA9IGZpZWxkTmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc2hvcnQgZ2V0VGhyaWZ0RmllbGRJZCgpIHsKKyAgICAgIHJldHVybiBfdGhyaWZ0SWQ7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRGaWVsZE5hbWUoKSB7CisgICAgICByZXR1cm4gX2ZpZWxkTmFtZTsKKyAgICB9CisgIH0KKworICAvLyBpc3NldCBpZCBhc3NpZ25tZW50cworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBfRmllbGRzIG9wdGlvbmFsc1tdID0ge19GaWVsZHMuVFlQRSxfRmllbGRzLkNPTU1PTl9TVEFUUyxfRmllbGRzLlNQRUNJRklDX1NUQVRTLF9GaWVsZHMuTEFTVF9FUlJPUn07CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPiBtZXRhRGF0YU1hcDsKKyAgc3RhdGljIHsKKyAgICBNYXA8X0ZpZWxkcywgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGE+IHRtcE1hcCA9IG5ldyBFbnVtTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPihfRmllbGRzLmNsYXNzKTsKKyAgICB0bXBNYXAucHV0KF9GaWVsZHMuVFlQRSwgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhKCJ0eXBlIiwgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLk9QVElPTkFMLCAKKyAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5FbnVtTWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuRU5VTSwgQ29tcG9uZW50VHlwZS5jbGFzcykpKTsKKyAgICB0bXBNYXAucHV0KF9GaWVsZHMuQ09NTU9OX1NUQVRTLCBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEoImNvbW1vbl9zdGF0cyIsIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZFJlcXVpcmVtZW50VHlwZS5PUFRJT05BTCwgCisgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuU3RydWN0TWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNULCBDb21tb25BZ2dyZWdhdGVTdGF0cy5jbGFzcykpKTsKKyAgICB0bXBNYXAucHV0KF9GaWVsZHMuU1BFQ0lGSUNfU1RBVFMsIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YSgic3BlY2lmaWNfc3RhdHMiLCBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRSZXF1aXJlbWVudFR5cGUuT1BUSU9OQUwsIAorICAgICAgICBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLlN0cnVjdE1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCwgU3BlY2lmaWNBZ2dyZWdhdGVTdGF0cy5jbGFzcykpKTsKKyAgICB0bXBNYXAucHV0KF9GaWVsZHMuTEFTVF9FUlJPUiwgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhKCJsYXN0X2Vycm9yIiwgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLk9QVElPTkFMLCAKKyAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5TdHJ1Y3RNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIEVycm9ySW5mby5jbGFzcykpKTsKKyAgICBtZXRhRGF0YU1hcCA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcCh0bXBNYXApOworICAgIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhLmFkZFN0cnVjdE1ldGFEYXRhTWFwKENvbXBvbmVudEFnZ3JlZ2F0ZVN0YXRzLmNsYXNzLCBtZXRhRGF0YU1hcCk7CisgIH0KKworICBwdWJsaWMgQ29tcG9uZW50QWdncmVnYXRlU3RhdHMoKSB7CisgIH0KKworICAvKioKKyAgICogUGVyZm9ybXMgYSBkZWVwIGNvcHkgb24gPGk+b3RoZXI8L2k+LgorICAgKi8KKyAgcHVibGljIENvbXBvbmVudEFnZ3JlZ2F0ZVN0YXRzKENvbXBvbmVudEFnZ3JlZ2F0ZVN0YXRzIG90aGVyKSB7CisgICAgaWYgKG90aGVyLmlzX3NldF90eXBlKCkpIHsKKyAgICAgIHRoaXMudHlwZSA9IG90aGVyLnR5cGU7CisgICAgfQorICAgIGlmIChvdGhlci5pc19zZXRfY29tbW9uX3N0YXRzKCkpIHsKKyAgICAgIHRoaXMuY29tbW9uX3N0YXRzID0gbmV3IENvbW1vbkFnZ3JlZ2F0ZVN0YXRzKG90aGVyLmNvbW1vbl9zdGF0cyk7CisgICAgfQorICAgIGlmIChvdGhlci5pc19zZXRfc3BlY2lmaWNfc3RhdHMoKSkgeworICAgICAgdGhpcy5zcGVjaWZpY19zdGF0cyA9IG5ldyBTcGVjaWZpY0FnZ3JlZ2F0ZVN0YXRzKG90aGVyLnNwZWNpZmljX3N0YXRzKTsKKyAgICB9CisgICAgaWYgKG90aGVyLmlzX3NldF9sYXN0X2Vycm9yKCkpIHsKKyAgICAgIHRoaXMubGFzdF9lcnJvciA9IG5ldyBFcnJvckluZm8ob3RoZXIubGFzdF9lcnJvcik7CisgICAgfQorICB9CisKKyAgcHVibGljIENvbXBvbmVudEFnZ3JlZ2F0ZVN0YXRzIGRlZXBDb3B5KCkgeworICAgIHJldHVybiBuZXcgQ29tcG9uZW50QWdncmVnYXRlU3RhdHModGhpcyk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgdGhpcy50eXBlID0gbnVsbDsKKyAgICB0aGlzLmNvbW1vbl9zdGF0cyA9IG51bGw7CisgICAgdGhpcy5zcGVjaWZpY19zdGF0cyA9IG51bGw7CisgICAgdGhpcy5sYXN0X2Vycm9yID0gbnVsbDsKKyAgfQorCisgIC8qKgorICAgKiAKKyAgICogQHNlZSBDb21wb25lbnRUeXBlCisgICAqLworICBwdWJsaWMgQ29tcG9uZW50VHlwZSBnZXRfdHlwZSgpIHsKKyAgICByZXR1cm4gdGhpcy50eXBlOworICB9CisKKyAgLyoqCisgICAqIAorICAgKiBAc2VlIENvbXBvbmVudFR5cGUKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldF90eXBlKENvbXBvbmVudFR5cGUgdHlwZSkgeworICAgIHRoaXMudHlwZSA9IHR5cGU7CisgIH0KKworICBwdWJsaWMgdm9pZCB1bnNldF90eXBlKCkgeworICAgIHRoaXMudHlwZSA9IG51bGw7CisgIH0KKworICAvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkIHR5cGUgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgIHB1YmxpYyBib29sZWFuIGlzX3NldF90eXBlKCkgeworICAgIHJldHVybiB0aGlzLnR5cGUgIT0gbnVsbDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF90eXBlX2lzU2V0KGJvb2xlYW4gdmFsdWUpIHsKKyAgICBpZiAoIXZhbHVlKSB7CisgICAgICB0aGlzLnR5cGUgPSBudWxsOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBDb21tb25BZ2dyZWdhdGVTdGF0cyBnZXRfY29tbW9uX3N0YXRzKCkgeworICAgIHJldHVybiB0aGlzLmNvbW1vbl9zdGF0czsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF9jb21tb25fc3RhdHMoQ29tbW9uQWdncmVnYXRlU3RhdHMgY29tbW9uX3N0YXRzKSB7CisgICAgdGhpcy5jb21tb25fc3RhdHMgPSBjb21tb25fc3RhdHM7CisgIH0KKworICBwdWJsaWMgdm9pZCB1bnNldF9jb21tb25fc3RhdHMoKSB7CisgICAgdGhpcy5jb21tb25fc3RhdHMgPSBudWxsOworICB9CisKKyAgLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBjb21tb25fc3RhdHMgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgIHB1YmxpYyBib29sZWFuIGlzX3NldF9jb21tb25fc3RhdHMoKSB7CisgICAgcmV0dXJuIHRoaXMuY29tbW9uX3N0YXRzICE9IG51bGw7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfY29tbW9uX3N0YXRzX2lzU2V0KGJvb2xlYW4gdmFsdWUpIHsKKyAgICBpZiAoIXZhbHVlKSB7CisgICAgICB0aGlzLmNvbW1vbl9zdGF0cyA9IG51bGw7CisgICAgfQorICB9CisKKyAgcHVibGljIFNwZWNpZmljQWdncmVnYXRlU3RhdHMgZ2V0X3NwZWNpZmljX3N0YXRzKCkgeworICAgIHJldHVybiB0aGlzLnNwZWNpZmljX3N0YXRzOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X3NwZWNpZmljX3N0YXRzKFNwZWNpZmljQWdncmVnYXRlU3RhdHMgc3BlY2lmaWNfc3RhdHMpIHsKKyAgICB0aGlzLnNwZWNpZmljX3N0YXRzID0gc3BlY2lmaWNfc3RhdHM7CisgIH0KKworICBwdWJsaWMgdm9pZCB1bnNldF9zcGVjaWZpY19zdGF0cygpIHsKKyAgICB0aGlzLnNwZWNpZmljX3N0YXRzID0gbnVsbDsKKyAgfQorCisgIC8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgc3BlY2lmaWNfc3RhdHMgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgIHB1YmxpYyBib29sZWFuIGlzX3NldF9zcGVjaWZpY19zdGF0cygpIHsKKyAgICByZXR1cm4gdGhpcy5zcGVjaWZpY19zdGF0cyAhPSBudWxsOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X3NwZWNpZmljX3N0YXRzX2lzU2V0KGJvb2xlYW4gdmFsdWUpIHsKKyAgICBpZiAoIXZhbHVlKSB7CisgICAgICB0aGlzLnNwZWNpZmljX3N0YXRzID0gbnVsbDsKKyAgICB9CisgIH0KKworICBwdWJsaWMgRXJyb3JJbmZvIGdldF9sYXN0X2Vycm9yKCkgeworICAgIHJldHVybiB0aGlzLmxhc3RfZXJyb3I7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfbGFzdF9lcnJvcihFcnJvckluZm8gbGFzdF9lcnJvcikgeworICAgIHRoaXMubGFzdF9lcnJvciA9IGxhc3RfZXJyb3I7CisgIH0KKworICBwdWJsaWMgdm9pZCB1bnNldF9sYXN0X2Vycm9yKCkgeworICAgIHRoaXMubGFzdF9lcnJvciA9IG51bGw7CisgIH0KKworICAvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkIGxhc3RfZXJyb3IgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgIHB1YmxpYyBib29sZWFuIGlzX3NldF9sYXN0X2Vycm9yKCkgeworICAgIHJldHVybiB0aGlzLmxhc3RfZXJyb3IgIT0gbnVsbDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF9sYXN0X2Vycm9yX2lzU2V0KGJvb2xlYW4gdmFsdWUpIHsKKyAgICBpZiAoIXZhbHVlKSB7CisgICAgICB0aGlzLmxhc3RfZXJyb3IgPSBudWxsOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldEZpZWxkVmFsdWUoX0ZpZWxkcyBmaWVsZCwgT2JqZWN0IHZhbHVlKSB7CisgICAgc3dpdGNoIChmaWVsZCkgeworICAgIGNhc2UgVFlQRToKKyAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgIHVuc2V0X3R5cGUoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNldF90eXBlKChDb21wb25lbnRUeXBlKXZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBDT01NT05fU1RBVFM6CisgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICB1bnNldF9jb21tb25fc3RhdHMoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNldF9jb21tb25fc3RhdHMoKENvbW1vbkFnZ3JlZ2F0ZVN0YXRzKXZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBTUEVDSUZJQ19TVEFUUzoKKyAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgIHVuc2V0X3NwZWNpZmljX3N0YXRzKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzZXRfc3BlY2lmaWNfc3RhdHMoKFNwZWNpZmljQWdncmVnYXRlU3RhdHMpdmFsdWUpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIExBU1RfRVJST1I6CisgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICB1bnNldF9sYXN0X2Vycm9yKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzZXRfbGFzdF9lcnJvcigoRXJyb3JJbmZvKXZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgfQorICB9CisKKyAgcHVibGljIE9iamVjdCBnZXRGaWVsZFZhbHVlKF9GaWVsZHMgZmllbGQpIHsKKyAgICBzd2l0Y2ggKGZpZWxkKSB7CisgICAgY2FzZSBUWVBFOgorICAgICAgcmV0dXJuIGdldF90eXBlKCk7CisKKyAgICBjYXNlIENPTU1PTl9TVEFUUzoKKyAgICAgIHJldHVybiBnZXRfY29tbW9uX3N0YXRzKCk7CisKKyAgICBjYXNlIFNQRUNJRklDX1NUQVRTOgorICAgICAgcmV0dXJuIGdldF9zcGVjaWZpY19zdGF0cygpOworCisgICAgY2FzZSBMQVNUX0VSUk9SOgorICAgICAgcmV0dXJuIGdldF9sYXN0X2Vycm9yKCk7CisKKyAgICB9CisgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICB9CisKKyAgLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBjb3JyZXNwb25kaW5nIHRvIGZpZWxkSUQgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgIHB1YmxpYyBib29sZWFuIGlzU2V0KF9GaWVsZHMgZmllbGQpIHsKKyAgICBpZiAoZmllbGQgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHN3aXRjaCAoZmllbGQpIHsKKyAgICBjYXNlIFRZUEU6CisgICAgICByZXR1cm4gaXNfc2V0X3R5cGUoKTsKKyAgICBjYXNlIENPTU1PTl9TVEFUUzoKKyAgICAgIHJldHVybiBpc19zZXRfY29tbW9uX3N0YXRzKCk7CisgICAgY2FzZSBTUEVDSUZJQ19TVEFUUzoKKyAgICAgIHJldHVybiBpc19zZXRfc3BlY2lmaWNfc3RhdHMoKTsKKyAgICBjYXNlIExBU1RfRVJST1I6CisgICAgICByZXR1cm4gaXNfc2V0X2xhc3RfZXJyb3IoKTsKKyAgICB9CisgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgdGhhdCkgeworICAgIGlmICh0aGF0ID09IG51bGwpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKHRoYXQgaW5zdGFuY2VvZiBDb21wb25lbnRBZ2dyZWdhdGVTdGF0cykKKyAgICAgIHJldHVybiB0aGlzLmVxdWFscygoQ29tcG9uZW50QWdncmVnYXRlU3RhdHMpdGhhdCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gZXF1YWxzKENvbXBvbmVudEFnZ3JlZ2F0ZVN0YXRzIHRoYXQpIHsKKyAgICBpZiAodGhhdCA9PSBudWxsKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgYm9vbGVhbiB0aGlzX3ByZXNlbnRfdHlwZSA9IHRydWUgJiYgdGhpcy5pc19zZXRfdHlwZSgpOworICAgIGJvb2xlYW4gdGhhdF9wcmVzZW50X3R5cGUgPSB0cnVlICYmIHRoYXQuaXNfc2V0X3R5cGUoKTsKKyAgICBpZiAodGhpc19wcmVzZW50X3R5cGUgfHwgdGhhdF9wcmVzZW50X3R5cGUpIHsKKyAgICAgIGlmICghKHRoaXNfcHJlc2VudF90eXBlICYmIHRoYXRfcHJlc2VudF90eXBlKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKCF0aGlzLnR5cGUuZXF1YWxzKHRoYXQudHlwZSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sZWFuIHRoaXNfcHJlc2VudF9jb21tb25fc3RhdHMgPSB0cnVlICYmIHRoaXMuaXNfc2V0X2NvbW1vbl9zdGF0cygpOworICAgIGJvb2xlYW4gdGhhdF9wcmVzZW50X2NvbW1vbl9zdGF0cyA9IHRydWUgJiYgdGhhdC5pc19zZXRfY29tbW9uX3N0YXRzKCk7CisgICAgaWYgKHRoaXNfcHJlc2VudF9jb21tb25fc3RhdHMgfHwgdGhhdF9wcmVzZW50X2NvbW1vbl9zdGF0cykgeworICAgICAgaWYgKCEodGhpc19wcmVzZW50X2NvbW1vbl9zdGF0cyAmJiB0aGF0X3ByZXNlbnRfY29tbW9uX3N0YXRzKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKCF0aGlzLmNvbW1vbl9zdGF0cy5lcXVhbHModGhhdC5jb21tb25fc3RhdHMpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbGVhbiB0aGlzX3ByZXNlbnRfc3BlY2lmaWNfc3RhdHMgPSB0cnVlICYmIHRoaXMuaXNfc2V0X3NwZWNpZmljX3N0YXRzKCk7CisgICAgYm9vbGVhbiB0aGF0X3ByZXNlbnRfc3BlY2lmaWNfc3RhdHMgPSB0cnVlICYmIHRoYXQuaXNfc2V0X3NwZWNpZmljX3N0YXRzKCk7CisgICAgaWYgKHRoaXNfcHJlc2VudF9zcGVjaWZpY19zdGF0cyB8fCB0aGF0X3ByZXNlbnRfc3BlY2lmaWNfc3RhdHMpIHsKKyAgICAgIGlmICghKHRoaXNfcHJlc2VudF9zcGVjaWZpY19zdGF0cyAmJiB0aGF0X3ByZXNlbnRfc3BlY2lmaWNfc3RhdHMpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBpZiAoIXRoaXMuc3BlY2lmaWNfc3RhdHMuZXF1YWxzKHRoYXQuc3BlY2lmaWNfc3RhdHMpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbGVhbiB0aGlzX3ByZXNlbnRfbGFzdF9lcnJvciA9IHRydWUgJiYgdGhpcy5pc19zZXRfbGFzdF9lcnJvcigpOworICAgIGJvb2xlYW4gdGhhdF9wcmVzZW50X2xhc3RfZXJyb3IgPSB0cnVlICYmIHRoYXQuaXNfc2V0X2xhc3RfZXJyb3IoKTsKKyAgICBpZiAodGhpc19wcmVzZW50X2xhc3RfZXJyb3IgfHwgdGhhdF9wcmVzZW50X2xhc3RfZXJyb3IpIHsKKyAgICAgIGlmICghKHRoaXNfcHJlc2VudF9sYXN0X2Vycm9yICYmIHRoYXRfcHJlc2VudF9sYXN0X2Vycm9yKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKCF0aGlzLmxhc3RfZXJyb3IuZXF1YWxzKHRoYXQubGFzdF9lcnJvcikpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgIExpc3Q8T2JqZWN0PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7CisKKyAgICBib29sZWFuIHByZXNlbnRfdHlwZSA9IHRydWUgJiYgKGlzX3NldF90eXBlKCkpOworICAgIGxpc3QuYWRkKHByZXNlbnRfdHlwZSk7CisgICAgaWYgKHByZXNlbnRfdHlwZSkKKyAgICAgIGxpc3QuYWRkKHR5cGUuZ2V0VmFsdWUoKSk7CisKKyAgICBib29sZWFuIHByZXNlbnRfY29tbW9uX3N0YXRzID0gdHJ1ZSAmJiAoaXNfc2V0X2NvbW1vbl9zdGF0cygpKTsKKyAgICBsaXN0LmFkZChwcmVzZW50X2NvbW1vbl9zdGF0cyk7CisgICAgaWYgKHByZXNlbnRfY29tbW9uX3N0YXRzKQorICAgICAgbGlzdC5hZGQoY29tbW9uX3N0YXRzKTsKKworICAgIGJvb2xlYW4gcHJlc2VudF9zcGVjaWZpY19zdGF0cyA9IHRydWUgJiYgKGlzX3NldF9zcGVjaWZpY19zdGF0cygpKTsKKyAgICBsaXN0LmFkZChwcmVzZW50X3NwZWNpZmljX3N0YXRzKTsKKyAgICBpZiAocHJlc2VudF9zcGVjaWZpY19zdGF0cykKKyAgICAgIGxpc3QuYWRkKHNwZWNpZmljX3N0YXRzKTsKKworICAgIGJvb2xlYW4gcHJlc2VudF9sYXN0X2Vycm9yID0gdHJ1ZSAmJiAoaXNfc2V0X2xhc3RfZXJyb3IoKSk7CisgICAgbGlzdC5hZGQocHJlc2VudF9sYXN0X2Vycm9yKTsKKyAgICBpZiAocHJlc2VudF9sYXN0X2Vycm9yKQorICAgICAgbGlzdC5hZGQobGFzdF9lcnJvcik7CisKKyAgICByZXR1cm4gbGlzdC5oYXNoQ29kZSgpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgY29tcGFyZVRvKENvbXBvbmVudEFnZ3JlZ2F0ZVN0YXRzIG90aGVyKSB7CisgICAgaWYgKCFnZXRDbGFzcygpLmVxdWFscyhvdGhlci5nZXRDbGFzcygpKSkgeworICAgICAgcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpLmNvbXBhcmVUbyhvdGhlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgfQorCisgICAgaW50IGxhc3RDb21wYXJpc29uID0gMDsKKworICAgIGxhc3RDb21wYXJpc29uID0gQm9vbGVhbi52YWx1ZU9mKGlzX3NldF90eXBlKCkpLmNvbXBhcmVUbyhvdGhlci5pc19zZXRfdHlwZSgpKTsKKyAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgIH0KKyAgICBpZiAoaXNfc2V0X3R5cGUoKSkgeworICAgICAgbGFzdENvbXBhcmlzb24gPSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy50eXBlLCBvdGhlci50eXBlKTsKKyAgICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICAgIH0KKyAgICB9CisgICAgbGFzdENvbXBhcmlzb24gPSBCb29sZWFuLnZhbHVlT2YoaXNfc2V0X2NvbW1vbl9zdGF0cygpKS5jb21wYXJlVG8ob3RoZXIuaXNfc2V0X2NvbW1vbl9zdGF0cygpKTsKKyAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgIH0KKyAgICBpZiAoaXNfc2V0X2NvbW1vbl9zdGF0cygpKSB7CisgICAgICBsYXN0Q29tcGFyaXNvbiA9IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvbXBhcmVUbyh0aGlzLmNvbW1vbl9zdGF0cywgb3RoZXIuY29tbW9uX3N0YXRzKTsKKyAgICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICAgIH0KKyAgICB9CisgICAgbGFzdENvbXBhcmlzb24gPSBCb29sZWFuLnZhbHVlT2YoaXNfc2V0X3NwZWNpZmljX3N0YXRzKCkpLmNvbXBhcmVUbyhvdGhlci5pc19zZXRfc3BlY2lmaWNfc3RhdHMoKSk7CisgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICB9CisgICAgaWYgKGlzX3NldF9zcGVjaWZpY19zdGF0cygpKSB7CisgICAgICBsYXN0Q29tcGFyaXNvbiA9IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvbXBhcmVUbyh0aGlzLnNwZWNpZmljX3N0YXRzLCBvdGhlci5zcGVjaWZpY19zdGF0cyk7CisgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICB9CisgICAgfQorICAgIGxhc3RDb21wYXJpc29uID0gQm9vbGVhbi52YWx1ZU9mKGlzX3NldF9sYXN0X2Vycm9yKCkpLmNvbXBhcmVUbyhvdGhlci5pc19zZXRfbGFzdF9lcnJvcigpKTsKKyAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgIH0KKyAgICBpZiAoaXNfc2V0X2xhc3RfZXJyb3IoKSkgeworICAgICAgbGFzdENvbXBhcmlzb24gPSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy5sYXN0X2Vycm9yLCBvdGhlci5sYXN0X2Vycm9yKTsKKyAgICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7CisgIH0KKworICBwdWJsaWMgX0ZpZWxkcyBmaWVsZEZvcklkKGludCBmaWVsZElkKSB7CisgICAgcmV0dXJuIF9GaWVsZHMuZmluZEJ5VGhyaWZ0SWQoZmllbGRJZCk7CisgIH0KKworICBwdWJsaWMgdm9pZCByZWFkKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBpcHJvdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgIHNjaGVtZXMuZ2V0KGlwcm90LmdldFNjaGVtZSgpKS5nZXRTY2hlbWUoKS5yZWFkKGlwcm90LCB0aGlzKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgIHNjaGVtZXMuZ2V0KG9wcm90LmdldFNjaGVtZSgpKS5nZXRTY2hlbWUoKS53cml0ZShvcHJvdCwgdGhpcyk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoIkNvbXBvbmVudEFnZ3JlZ2F0ZVN0YXRzKCIpOworICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOworCisgICAgaWYgKGlzX3NldF90eXBlKCkpIHsKKyAgICAgIHNiLmFwcGVuZCgidHlwZToiKTsKKyAgICAgIGlmICh0aGlzLnR5cGUgPT0gbnVsbCkgeworICAgICAgICBzYi5hcHBlbmQoIm51bGwiKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNiLmFwcGVuZCh0aGlzLnR5cGUpOworICAgICAgfQorICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9CisgICAgaWYgKGlzX3NldF9jb21tb25fc3RhdHMoKSkgeworICAgICAgaWYgKCFmaXJzdCkgc2IuYXBwZW5kKCIsICIpOworICAgICAgc2IuYXBwZW5kKCJjb21tb25fc3RhdHM6Iik7CisgICAgICBpZiAodGhpcy5jb21tb25fc3RhdHMgPT0gbnVsbCkgeworICAgICAgICBzYi5hcHBlbmQoIm51bGwiKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNiLmFwcGVuZCh0aGlzLmNvbW1vbl9zdGF0cyk7CisgICAgICB9CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0KKyAgICBpZiAoaXNfc2V0X3NwZWNpZmljX3N0YXRzKCkpIHsKKyAgICAgIGlmICghZmlyc3QpIHNiLmFwcGVuZCgiLCAiKTsKKyAgICAgIHNiLmFwcGVuZCgic3BlY2lmaWNfc3RhdHM6Iik7CisgICAgICBpZiAodGhpcy5zcGVjaWZpY19zdGF0cyA9PSBudWxsKSB7CisgICAgICAgIHNiLmFwcGVuZCgibnVsbCIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2IuYXBwZW5kKHRoaXMuc3BlY2lmaWNfc3RhdHMpOworICAgICAgfQorICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9CisgICAgaWYgKGlzX3NldF9sYXN0X2Vycm9yKCkpIHsKKyAgICAgIGlmICghZmlyc3QpIHNiLmFwcGVuZCgiLCAiKTsKKyAgICAgIHNiLmFwcGVuZCgibGFzdF9lcnJvcjoiKTsKKyAgICAgIGlmICh0aGlzLmxhc3RfZXJyb3IgPT0gbnVsbCkgeworICAgICAgICBzYi5hcHBlbmQoIm51bGwiKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNiLmFwcGVuZCh0aGlzLmxhc3RfZXJyb3IpOworICAgICAgfQorICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9CisgICAgc2IuYXBwZW5kKCIpIik7CisgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAvLyBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzCisgICAgLy8gY2hlY2sgZm9yIHN1Yi1zdHJ1Y3QgdmFsaWRpdHkKKyAgICBpZiAoY29tbW9uX3N0YXRzICE9IG51bGwpIHsKKyAgICAgIGNvbW1vbl9zdGF0cy52YWxpZGF0ZSgpOworICAgIH0KKyAgICBpZiAobGFzdF9lcnJvciAhPSBudWxsKSB7CisgICAgICBsYXN0X2Vycm9yLnZhbGlkYXRlKCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICB3cml0ZShuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbChuZXcgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRJT1N0cmVhbVRyYW5zcG9ydChvdXQpKSk7CisgICAgfSBjYXRjaCAob3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB0ZSkgeworICAgICAgdGhyb3cgbmV3IGphdmEuaW8uSU9FeGNlcHRpb24odGUpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0KGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0gaW4pIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgcmVhZChuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbChuZXcgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRJT1N0cmVhbVRyYW5zcG9ydChpbikpKTsKKyAgICB9IGNhdGNoIChvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHRlKSB7CisgICAgICB0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbih0ZSk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ29tcG9uZW50QWdncmVnYXRlU3RhdHNTdGFuZGFyZFNjaGVtZUZhY3RvcnkgaW1wbGVtZW50cyBTY2hlbWVGYWN0b3J5IHsKKyAgICBwdWJsaWMgQ29tcG9uZW50QWdncmVnYXRlU3RhdHNTdGFuZGFyZFNjaGVtZSBnZXRTY2hlbWUoKSB7CisgICAgICByZXR1cm4gbmV3IENvbXBvbmVudEFnZ3JlZ2F0ZVN0YXRzU3RhbmRhcmRTY2hlbWUoKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDb21wb25lbnRBZ2dyZWdhdGVTdGF0c1N0YW5kYXJkU2NoZW1lIGV4dGVuZHMgU3RhbmRhcmRTY2hlbWU8Q29tcG9uZW50QWdncmVnYXRlU3RhdHM+IHsKKworICAgIHB1YmxpYyB2b2lkIHJlYWQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIGlwcm90LCBDb21wb25lbnRBZ2dyZWdhdGVTdGF0cyBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBzY2hlbWVGaWVsZDsKKyAgICAgIGlwcm90LnJlYWRTdHJ1Y3RCZWdpbigpOworICAgICAgd2hpbGUgKHRydWUpCisgICAgICB7CisgICAgICAgIHNjaGVtZUZpZWxkID0gaXByb3QucmVhZEZpZWxkQmVnaW4oKTsKKyAgICAgICAgaWYgKHNjaGVtZUZpZWxkLnR5cGUgPT0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RPUCkgeyAKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKHNjaGVtZUZpZWxkLmlkKSB7CisgICAgICAgICAgY2FzZSAxOiAvLyBUWVBFCisgICAgICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JMzIpIHsKKyAgICAgICAgICAgICAgc3RydWN0LnR5cGUgPSBiYWNrdHlwZS5zdG9ybS5nZW5lcmF0ZWQuQ29tcG9uZW50VHlwZS5maW5kQnlWYWx1ZShpcHJvdC5yZWFkSTMyKCkpOworICAgICAgICAgICAgICBzdHJ1Y3Quc2V0X3R5cGVfaXNTZXQodHJ1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeyAKKyAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMjogLy8gQ09NTU9OX1NUQVRTCisgICAgICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QpIHsKKyAgICAgICAgICAgICAgc3RydWN0LmNvbW1vbl9zdGF0cyA9IG5ldyBDb21tb25BZ2dyZWdhdGVTdGF0cygpOworICAgICAgICAgICAgICBzdHJ1Y3QuY29tbW9uX3N0YXRzLnJlYWQoaXByb3QpOworICAgICAgICAgICAgICBzdHJ1Y3Quc2V0X2NvbW1vbl9zdGF0c19pc1NldCh0cnVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7IAorICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAzOiAvLyBTUEVDSUZJQ19TVEFUUworICAgICAgICAgICAgaWYgKHNjaGVtZUZpZWxkLnR5cGUgPT0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNUKSB7CisgICAgICAgICAgICAgIHN0cnVjdC5zcGVjaWZpY19zdGF0cyA9IG5ldyBTcGVjaWZpY0FnZ3JlZ2F0ZVN0YXRzKCk7CisgICAgICAgICAgICAgIHN0cnVjdC5zcGVjaWZpY19zdGF0cy5yZWFkKGlwcm90KTsKKyAgICAgICAgICAgICAgc3RydWN0LnNldF9zcGVjaWZpY19zdGF0c19pc1NldCh0cnVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7IAorICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSA0OiAvLyBMQVNUX0VSUk9SCisgICAgICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QpIHsKKyAgICAgICAgICAgICAgc3RydWN0Lmxhc3RfZXJyb3IgPSBuZXcgRXJyb3JJbmZvKCk7CisgICAgICAgICAgICAgIHN0cnVjdC5sYXN0X2Vycm9yLnJlYWQoaXByb3QpOworICAgICAgICAgICAgICBzdHJ1Y3Quc2V0X2xhc3RfZXJyb3JfaXNTZXQodHJ1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeyAKKyAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOworICAgICAgICB9CisgICAgICAgIGlwcm90LnJlYWRGaWVsZEVuZCgpOworICAgICAgfQorICAgICAgaXByb3QucmVhZFN0cnVjdEVuZCgpOworICAgICAgc3RydWN0LnZhbGlkYXRlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIG9wcm90LCBDb21wb25lbnRBZ2dyZWdhdGVTdGF0cyBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgIHN0cnVjdC52YWxpZGF0ZSgpOworCisgICAgICBvcHJvdC53cml0ZVN0cnVjdEJlZ2luKFNUUlVDVF9ERVNDKTsKKyAgICAgIGlmIChzdHJ1Y3QudHlwZSAhPSBudWxsKSB7CisgICAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X3R5cGUoKSkgeworICAgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihUWVBFX0ZJRUxEX0RFU0MpOworICAgICAgICAgIG9wcm90LndyaXRlSTMyKHN0cnVjdC50eXBlLmdldFZhbHVlKCkpOworICAgICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5jb21tb25fc3RhdHMgIT0gbnVsbCkgeworICAgICAgICBpZiAoc3RydWN0LmlzX3NldF9jb21tb25fc3RhdHMoKSkgeworICAgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihDT01NT05fU1RBVFNfRklFTERfREVTQyk7CisgICAgICAgICAgc3RydWN0LmNvbW1vbl9zdGF0cy53cml0ZShvcHJvdCk7CisgICAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LnNwZWNpZmljX3N0YXRzICE9IG51bGwpIHsKKyAgICAgICAgaWYgKHN0cnVjdC5pc19zZXRfc3BlY2lmaWNfc3RhdHMoKSkgeworICAgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihTUEVDSUZJQ19TVEFUU19GSUVMRF9ERVNDKTsKKyAgICAgICAgICBzdHJ1Y3Quc3BlY2lmaWNfc3RhdHMud3JpdGUob3Byb3QpOworICAgICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5sYXN0X2Vycm9yICE9IG51bGwpIHsKKyAgICAgICAgaWYgKHN0cnVjdC5pc19zZXRfbGFzdF9lcnJvcigpKSB7CisgICAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKExBU1RfRVJST1JfRklFTERfREVTQyk7CisgICAgICAgICAgc3RydWN0Lmxhc3RfZXJyb3Iud3JpdGUob3Byb3QpOworICAgICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgb3Byb3Qud3JpdGVGaWVsZFN0b3AoKTsKKyAgICAgIG9wcm90LndyaXRlU3RydWN0RW5kKCk7CisgICAgfQorCisgIH0KKworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDb21wb25lbnRBZ2dyZWdhdGVTdGF0c1R1cGxlU2NoZW1lRmFjdG9yeSBpbXBsZW1lbnRzIFNjaGVtZUZhY3RvcnkgeworICAgIHB1YmxpYyBDb21wb25lbnRBZ2dyZWdhdGVTdGF0c1R1cGxlU2NoZW1lIGdldFNjaGVtZSgpIHsKKyAgICAgIHJldHVybiBuZXcgQ29tcG9uZW50QWdncmVnYXRlU3RhdHNUdXBsZVNjaGVtZSgpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIENvbXBvbmVudEFnZ3JlZ2F0ZVN0YXRzVHVwbGVTY2hlbWUgZXh0ZW5kcyBUdXBsZVNjaGVtZTxDb21wb25lbnRBZ2dyZWdhdGVTdGF0cz4geworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIHByb3QsIENvbXBvbmVudEFnZ3JlZ2F0ZVN0YXRzIHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgVFR1cGxlUHJvdG9jb2wgb3Byb3QgPSAoVFR1cGxlUHJvdG9jb2wpIHByb3Q7CisgICAgICBCaXRTZXQgb3B0aW9uYWxzID0gbmV3IEJpdFNldCgpOworICAgICAgaWYgKHN0cnVjdC5pc19zZXRfdHlwZSgpKSB7CisgICAgICAgIG9wdGlvbmFscy5zZXQoMCk7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9jb21tb25fc3RhdHMoKSkgeworICAgICAgICBvcHRpb25hbHMuc2V0KDEpOworICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5pc19zZXRfc3BlY2lmaWNfc3RhdHMoKSkgeworICAgICAgICBvcHRpb25hbHMuc2V0KDIpOworICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5pc19zZXRfbGFzdF9lcnJvcigpKSB7CisgICAgICAgIG9wdGlvbmFscy5zZXQoMyk7CisgICAgICB9CisgICAgICBvcHJvdC53cml0ZUJpdFNldChvcHRpb25hbHMsIDQpOworICAgICAgaWYgKHN0cnVjdC5pc19zZXRfdHlwZSgpKSB7CisgICAgICAgIG9wcm90LndyaXRlSTMyKHN0cnVjdC50eXBlLmdldFZhbHVlKCkpOworICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5pc19zZXRfY29tbW9uX3N0YXRzKCkpIHsKKyAgICAgICAgc3RydWN0LmNvbW1vbl9zdGF0cy53cml0ZShvcHJvdCk7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9zcGVjaWZpY19zdGF0cygpKSB7CisgICAgICAgIHN0cnVjdC5zcGVjaWZpY19zdGF0cy53cml0ZShvcHJvdCk7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9sYXN0X2Vycm9yKCkpIHsKKyAgICAgICAgc3RydWN0Lmxhc3RfZXJyb3Iud3JpdGUob3Byb3QpOworICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlYWQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIHByb3QsIENvbXBvbmVudEFnZ3JlZ2F0ZVN0YXRzIHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgVFR1cGxlUHJvdG9jb2wgaXByb3QgPSAoVFR1cGxlUHJvdG9jb2wpIHByb3Q7CisgICAgICBCaXRTZXQgaW5jb21pbmcgPSBpcHJvdC5yZWFkQml0U2V0KDQpOworICAgICAgaWYgKGluY29taW5nLmdldCgwKSkgeworICAgICAgICBzdHJ1Y3QudHlwZSA9IGJhY2t0eXBlLnN0b3JtLmdlbmVyYXRlZC5Db21wb25lbnRUeXBlLmZpbmRCeVZhbHVlKGlwcm90LnJlYWRJMzIoKSk7CisgICAgICAgIHN0cnVjdC5zZXRfdHlwZV9pc1NldCh0cnVlKTsKKyAgICAgIH0KKyAgICAgIGlmIChpbmNvbWluZy5nZXQoMSkpIHsKKyAgICAgICAgc3RydWN0LmNvbW1vbl9zdGF0cyA9IG5ldyBDb21tb25BZ2dyZWdhdGVTdGF0cygpOworICAgICAgICBzdHJ1Y3QuY29tbW9uX3N0YXRzLnJlYWQoaXByb3QpOworICAgICAgICBzdHJ1Y3Quc2V0X2NvbW1vbl9zdGF0c19pc1NldCh0cnVlKTsKKyAgICAgIH0KKyAgICAgIGlmIChpbmNvbWluZy5nZXQoMikpIHsKKyAgICAgICAgc3RydWN0LnNwZWNpZmljX3N0YXRzID0gbmV3IFNwZWNpZmljQWdncmVnYXRlU3RhdHMoKTsKKyAgICAgICAgc3RydWN0LnNwZWNpZmljX3N0YXRzLnJlYWQoaXByb3QpOworICAgICAgICBzdHJ1Y3Quc2V0X3NwZWNpZmljX3N0YXRzX2lzU2V0KHRydWUpOworICAgICAgfQorICAgICAgaWYgKGluY29taW5nLmdldCgzKSkgeworICAgICAgICBzdHJ1Y3QubGFzdF9lcnJvciA9IG5ldyBFcnJvckluZm8oKTsKKyAgICAgICAgc3RydWN0Lmxhc3RfZXJyb3IucmVhZChpcHJvdCk7CisgICAgICAgIHN0cnVjdC5zZXRfbGFzdF9lcnJvcl9pc1NldCh0cnVlKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworfQorCmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL0NvbXBvbmVudENvbW1vbi5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9Db21wb25lbnRDb21tb24uamF2YQppbmRleCA2ODY4NjAzLi45OTUwNzU2IDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL0NvbXBvbmVudENvbW1vbi5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvQ29tcG9uZW50Q29tbW9uLmphdmEKQEAgLTE2LDcgKzE2LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAvKioKLSAqIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMikKKyAqIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMykKICAqCiAgKiBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HCiAgKiAgQGdlbmVyYXRlZApAQCAtNTEsNyArNTEsNyBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCiBAU3VwcHJlc3NXYXJuaW5ncyh7ImNhc3QiLCAicmF3dHlwZXMiLCAic2VyaWFsIiwgInVuY2hlY2tlZCJ9KQotQEdlbmVyYXRlZCh2YWx1ZSA9ICJBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjIpIiwgZGF0ZSA9ICIyMDE1LTItNiIpCitAR2VuZXJhdGVkKHZhbHVlID0gIkF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMykiKQogcHVibGljIGNsYXNzIENvbXBvbmVudENvbW1vbiBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlPENvbXBvbmVudENvbW1vbiwgQ29tcG9uZW50Q29tbW9uLl9GaWVsZHM+LCBqYXZhLmlvLlNlcmlhbGl6YWJsZSwgQ2xvbmVhYmxlLCBDb21wYXJhYmxlPENvbXBvbmVudENvbW1vbj4gewogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0IFNUUlVDVF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QoIkNvbXBvbmVudENvbW1vbiIpOwogCkBAIC0zODYsNyArMzg2LDcgQEAKICAgICAgIHJldHVybiBnZXRfc3RyZWFtcygpOwogCiAgICAgY2FzZSBQQVJBTExFTElTTV9ISU5UOgotICAgICAgcmV0dXJuIEludGVnZXIudmFsdWVPZihnZXRfcGFyYWxsZWxpc21faGludCgpKTsKKyAgICAgIHJldHVybiBnZXRfcGFyYWxsZWxpc21faGludCgpOwogCiAgICAgY2FzZSBKU09OX0NPTkY6CiAgICAgICByZXR1cm4gZ2V0X2pzb25fY29uZigpOwpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9Db21wb25lbnRPYmplY3QuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvQ29tcG9uZW50T2JqZWN0LmphdmEKaW5kZXggNTc1MDY5Zi4uNzIyZTdkYiAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9Db21wb25lbnRPYmplY3QuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL0NvbXBvbmVudE9iamVjdC5qYXZhCkBAIC0xNiw3ICsxNiw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogLyoqCi0gKiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjIpCisgKiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjMpCiAgKgogICogRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lORwogICogIEBnZW5lcmF0ZWQKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvQ29tcG9uZW50UGFnZUluZm8uamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvQ29tcG9uZW50UGFnZUluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTUyZDAyCi0tLSAvZGV2L251bGwKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9Db21wb25lbnRQYWdlSW5mby5qYXZhCkBAIC0wLDAgKzEsMjE5NCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8qKgorICogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4zKQorICoKKyAqIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkcKKyAqICBAZ2VuZXJhdGVkCisgKi8KK3BhY2thZ2UgYmFja3R5cGUuc3Rvcm0uZ2VuZXJhdGVkOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLklTY2hlbWU7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLlNjaGVtZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLlN0YW5kYXJkU2NoZW1lOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLlR1cGxlU2NoZW1lOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUdXBsZVByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5FbmNvZGluZ1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuQXN5bmNNZXRob2RDYWxsYmFjazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlci4qOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bU1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuQml0U2V0OworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLkdlbmVyYXRlZDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitAU3VwcHJlc3NXYXJuaW5ncyh7ImNhc3QiLCAicmF3dHlwZXMiLCAic2VyaWFsIiwgInVuY2hlY2tlZCJ9KQorQEdlbmVyYXRlZCh2YWx1ZSA9ICJBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjMpIikKK3B1YmxpYyBjbGFzcyBDb21wb25lbnRQYWdlSW5mbyBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlPENvbXBvbmVudFBhZ2VJbmZvLCBDb21wb25lbnRQYWdlSW5mby5fRmllbGRzPiwgamF2YS5pby5TZXJpYWxpemFibGUsIENsb25lYWJsZSwgQ29tcGFyYWJsZTxDb21wb25lbnRQYWdlSW5mbz4geworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0IFNUUlVDVF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QoIkNvbXBvbmVudFBhZ2VJbmZvIik7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIENPTVBPTkVOVF9JRF9GSUVMRF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCgiY29tcG9uZW50X2lkIiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCAoc2hvcnQpMSk7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBDT01QT05FTlRfVFlQRV9GSUVMRF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCgiY29tcG9uZW50X3R5cGUiLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JMzIsIChzaG9ydCkyKTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIFRPUE9MT0dZX0lEX0ZJRUxEX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkKCJ0b3BvbG9neV9pZCIsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORywgKHNob3J0KTMpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgVE9QT0xPR1lfTkFNRV9GSUVMRF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCgidG9wb2xvZ3lfbmFtZSIsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORywgKHNob3J0KTQpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgTlVNX0VYRUNVVE9SU19GSUVMRF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCgibnVtX2V4ZWN1dG9ycyIsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkkzMiwgKHNob3J0KTUpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgTlVNX1RBU0tTX0ZJRUxEX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkKCJudW1fdGFza3MiLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JMzIsIChzaG9ydCk2KTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIFdJTkRPV19UT19TVEFUU19GSUVMRF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCgid2luZG93X3RvX3N0YXRzIiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTUFQLCAoc2hvcnQpNyk7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBHU0lEX1RPX0lOUFVUX1NUQVRTX0ZJRUxEX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkKCJnc2lkX3RvX2lucHV0X3N0YXRzIiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTUFQLCAoc2hvcnQpOCk7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBTSURfVE9fT1VUUFVUX1NUQVRTX0ZJRUxEX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkKCJzaWRfdG9fb3V0cHV0X3N0YXRzIiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTUFQLCAoc2hvcnQpOSk7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBFWEVDX1NUQVRTX0ZJRUxEX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkKCJleGVjX3N0YXRzIiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTElTVCwgKHNob3J0KTEwKTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIEVSUk9SU19GSUVMRF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCgiZXJyb3JzIiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTElTVCwgKHNob3J0KTExKTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIEVWRU5UTE9HX0hPU1RfRklFTERfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQoImV2ZW50bG9nX2hvc3QiLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcsIChzaG9ydCkxMik7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBFVkVOVExPR19QT1JUX0ZJRUxEX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkKCJldmVudGxvZ19wb3J0Iiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTMyLCAoc2hvcnQpMTMpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgREVCVUdfT1BUSU9OU19GSUVMRF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCgiZGVidWdfb3B0aW9ucyIsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCwgKHNob3J0KTE0KTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIFRPUE9MT0dZX1NUQVRVU19GSUVMRF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCgidG9wb2xvZ3lfc3RhdHVzIiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCAoc2hvcnQpMTUpOworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxDbGFzczw/IGV4dGVuZHMgSVNjaGVtZT4sIFNjaGVtZUZhY3Rvcnk+IHNjaGVtZXMgPSBuZXcgSGFzaE1hcDxDbGFzczw/IGV4dGVuZHMgSVNjaGVtZT4sIFNjaGVtZUZhY3Rvcnk+KCk7CisgIHN0YXRpYyB7CisgICAgc2NoZW1lcy5wdXQoU3RhbmRhcmRTY2hlbWUuY2xhc3MsIG5ldyBDb21wb25lbnRQYWdlSW5mb1N0YW5kYXJkU2NoZW1lRmFjdG9yeSgpKTsKKyAgICBzY2hlbWVzLnB1dChUdXBsZVNjaGVtZS5jbGFzcywgbmV3IENvbXBvbmVudFBhZ2VJbmZvVHVwbGVTY2hlbWVGYWN0b3J5KCkpOworICB9CisKKyAgcHJpdmF0ZSBTdHJpbmcgY29tcG9uZW50X2lkOyAvLyByZXF1aXJlZAorICBwcml2YXRlIENvbXBvbmVudFR5cGUgY29tcG9uZW50X3R5cGU7IC8vIHJlcXVpcmVkCisgIHByaXZhdGUgU3RyaW5nIHRvcG9sb2d5X2lkOyAvLyBvcHRpb25hbAorICBwcml2YXRlIFN0cmluZyB0b3BvbG9neV9uYW1lOyAvLyBvcHRpb25hbAorICBwcml2YXRlIGludCBudW1fZXhlY3V0b3JzOyAvLyBvcHRpb25hbAorICBwcml2YXRlIGludCBudW1fdGFza3M7IC8vIG9wdGlvbmFsCisgIHByaXZhdGUgTWFwPFN0cmluZyxDb21wb25lbnRBZ2dyZWdhdGVTdGF0cz4gd2luZG93X3RvX3N0YXRzOyAvLyBvcHRpb25hbAorICBwcml2YXRlIE1hcDxHbG9iYWxTdHJlYW1JZCxDb21wb25lbnRBZ2dyZWdhdGVTdGF0cz4gZ3NpZF90b19pbnB1dF9zdGF0czsgLy8gb3B0aW9uYWwKKyAgcHJpdmF0ZSBNYXA8U3RyaW5nLENvbXBvbmVudEFnZ3JlZ2F0ZVN0YXRzPiBzaWRfdG9fb3V0cHV0X3N0YXRzOyAvLyBvcHRpb25hbAorICBwcml2YXRlIExpc3Q8RXhlY3V0b3JBZ2dyZWdhdGVTdGF0cz4gZXhlY19zdGF0czsgLy8gb3B0aW9uYWwKKyAgcHJpdmF0ZSBMaXN0PEVycm9ySW5mbz4gZXJyb3JzOyAvLyBvcHRpb25hbAorICBwcml2YXRlIFN0cmluZyBldmVudGxvZ19ob3N0OyAvLyBvcHRpb25hbAorICBwcml2YXRlIGludCBldmVudGxvZ19wb3J0OyAvLyBvcHRpb25hbAorICBwcml2YXRlIERlYnVnT3B0aW9ucyBkZWJ1Z19vcHRpb25zOyAvLyBvcHRpb25hbAorICBwcml2YXRlIFN0cmluZyB0b3BvbG9neV9zdGF0dXM7IC8vIG9wdGlvbmFsCisKKyAgLyoqIFRoZSBzZXQgb2YgZmllbGRzIHRoaXMgc3RydWN0IGNvbnRhaW5zLCBhbG9uZyB3aXRoIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9yIGZpbmRpbmcgYW5kIG1hbmlwdWxhdGluZyB0aGVtLiAqLworICBwdWJsaWMgZW51bSBfRmllbGRzIGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkSWRFbnVtIHsKKyAgICBDT01QT05FTlRfSUQoKHNob3J0KTEsICJjb21wb25lbnRfaWQiKSwKKyAgICAvKioKKyAgICAgKiAKKyAgICAgKiBAc2VlIENvbXBvbmVudFR5cGUKKyAgICAgKi8KKyAgICBDT01QT05FTlRfVFlQRSgoc2hvcnQpMiwgImNvbXBvbmVudF90eXBlIiksCisgICAgVE9QT0xPR1lfSUQoKHNob3J0KTMsICJ0b3BvbG9neV9pZCIpLAorICAgIFRPUE9MT0dZX05BTUUoKHNob3J0KTQsICJ0b3BvbG9neV9uYW1lIiksCisgICAgTlVNX0VYRUNVVE9SUygoc2hvcnQpNSwgIm51bV9leGVjdXRvcnMiKSwKKyAgICBOVU1fVEFTS1MoKHNob3J0KTYsICJudW1fdGFza3MiKSwKKyAgICBXSU5ET1dfVE9fU1RBVFMoKHNob3J0KTcsICJ3aW5kb3dfdG9fc3RhdHMiKSwKKyAgICBHU0lEX1RPX0lOUFVUX1NUQVRTKChzaG9ydCk4LCAiZ3NpZF90b19pbnB1dF9zdGF0cyIpLAorICAgIFNJRF9UT19PVVRQVVRfU1RBVFMoKHNob3J0KTksICJzaWRfdG9fb3V0cHV0X3N0YXRzIiksCisgICAgRVhFQ19TVEFUUygoc2hvcnQpMTAsICJleGVjX3N0YXRzIiksCisgICAgRVJST1JTKChzaG9ydCkxMSwgImVycm9ycyIpLAorICAgIEVWRU5UTE9HX0hPU1QoKHNob3J0KTEyLCAiZXZlbnRsb2dfaG9zdCIpLAorICAgIEVWRU5UTE9HX1BPUlQoKHNob3J0KTEzLCAiZXZlbnRsb2dfcG9ydCIpLAorICAgIERFQlVHX09QVElPTlMoKHNob3J0KTE0LCAiZGVidWdfb3B0aW9ucyIpLAorICAgIFRPUE9MT0dZX1NUQVRVUygoc2hvcnQpMTUsICJ0b3BvbG9neV9zdGF0dXMiKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsIF9GaWVsZHM+IGJ5TmFtZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgX0ZpZWxkcz4oKTsKKworICAgIHN0YXRpYyB7CisgICAgICBmb3IgKF9GaWVsZHMgZmllbGQgOiBFbnVtU2V0LmFsbE9mKF9GaWVsZHMuY2xhc3MpKSB7CisgICAgICAgIGJ5TmFtZS5wdXQoZmllbGQuZ2V0RmllbGROYW1lKCksIGZpZWxkKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kIHRoZSBfRmllbGRzIGNvbnN0YW50IHRoYXQgbWF0Y2hlcyBmaWVsZElkLCBvciBudWxsIGlmIGl0cyBub3QgZm91bmQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBfRmllbGRzIGZpbmRCeVRocmlmdElkKGludCBmaWVsZElkKSB7CisgICAgICBzd2l0Y2goZmllbGRJZCkgeworICAgICAgICBjYXNlIDE6IC8vIENPTVBPTkVOVF9JRAorICAgICAgICAgIHJldHVybiBDT01QT05FTlRfSUQ7CisgICAgICAgIGNhc2UgMjogLy8gQ09NUE9ORU5UX1RZUEUKKyAgICAgICAgICByZXR1cm4gQ09NUE9ORU5UX1RZUEU7CisgICAgICAgIGNhc2UgMzogLy8gVE9QT0xPR1lfSUQKKyAgICAgICAgICByZXR1cm4gVE9QT0xPR1lfSUQ7CisgICAgICAgIGNhc2UgNDogLy8gVE9QT0xPR1lfTkFNRQorICAgICAgICAgIHJldHVybiBUT1BPTE9HWV9OQU1FOworICAgICAgICBjYXNlIDU6IC8vIE5VTV9FWEVDVVRPUlMKKyAgICAgICAgICByZXR1cm4gTlVNX0VYRUNVVE9SUzsKKyAgICAgICAgY2FzZSA2OiAvLyBOVU1fVEFTS1MKKyAgICAgICAgICByZXR1cm4gTlVNX1RBU0tTOworICAgICAgICBjYXNlIDc6IC8vIFdJTkRPV19UT19TVEFUUworICAgICAgICAgIHJldHVybiBXSU5ET1dfVE9fU1RBVFM7CisgICAgICAgIGNhc2UgODogLy8gR1NJRF9UT19JTlBVVF9TVEFUUworICAgICAgICAgIHJldHVybiBHU0lEX1RPX0lOUFVUX1NUQVRTOworICAgICAgICBjYXNlIDk6IC8vIFNJRF9UT19PVVRQVVRfU1RBVFMKKyAgICAgICAgICByZXR1cm4gU0lEX1RPX09VVFBVVF9TVEFUUzsKKyAgICAgICAgY2FzZSAxMDogLy8gRVhFQ19TVEFUUworICAgICAgICAgIHJldHVybiBFWEVDX1NUQVRTOworICAgICAgICBjYXNlIDExOiAvLyBFUlJPUlMKKyAgICAgICAgICByZXR1cm4gRVJST1JTOworICAgICAgICBjYXNlIDEyOiAvLyBFVkVOVExPR19IT1NUCisgICAgICAgICAgcmV0dXJuIEVWRU5UTE9HX0hPU1Q7CisgICAgICAgIGNhc2UgMTM6IC8vIEVWRU5UTE9HX1BPUlQKKyAgICAgICAgICByZXR1cm4gRVZFTlRMT0dfUE9SVDsKKyAgICAgICAgY2FzZSAxNDogLy8gREVCVUdfT1BUSU9OUworICAgICAgICAgIHJldHVybiBERUJVR19PUFRJT05TOworICAgICAgICBjYXNlIDE1OiAvLyBUT1BPTE9HWV9TVEFUVVMKKyAgICAgICAgICByZXR1cm4gVE9QT0xPR1lfU1RBVFVTOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgdGhlIF9GaWVsZHMgY29uc3RhbnQgdGhhdCBtYXRjaGVzIGZpZWxkSWQsIHRocm93aW5nIGFuIGV4Y2VwdGlvbgorICAgICAqIGlmIGl0IGlzIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIF9GaWVsZHMgZmluZEJ5VGhyaWZ0SWRPclRocm93KGludCBmaWVsZElkKSB7CisgICAgICBfRmllbGRzIGZpZWxkcyA9IGZpbmRCeVRocmlmdElkKGZpZWxkSWQpOworICAgICAgaWYgKGZpZWxkcyA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJGaWVsZCAiICsgZmllbGRJZCArICIgZG9lc24ndCBleGlzdCEiKTsKKyAgICAgIHJldHVybiBmaWVsZHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCB0aGUgX0ZpZWxkcyBjb25zdGFudCB0aGF0IG1hdGNoZXMgbmFtZSwgb3IgbnVsbCBpZiBpdHMgbm90IGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgX0ZpZWxkcyBmaW5kQnlOYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICByZXR1cm4gYnlOYW1lLmdldChuYW1lKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIHNob3J0IF90aHJpZnRJZDsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBfZmllbGROYW1lOworCisgICAgX0ZpZWxkcyhzaG9ydCB0aHJpZnRJZCwgU3RyaW5nIGZpZWxkTmFtZSkgeworICAgICAgX3RocmlmdElkID0gdGhyaWZ0SWQ7CisgICAgICBfZmllbGROYW1lID0gZmllbGROYW1lOworICAgIH0KKworICAgIHB1YmxpYyBzaG9ydCBnZXRUaHJpZnRGaWVsZElkKCkgeworICAgICAgcmV0dXJuIF90aHJpZnRJZDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEZpZWxkTmFtZSgpIHsKKyAgICAgIHJldHVybiBfZmllbGROYW1lOworICAgIH0KKyAgfQorCisgIC8vIGlzc2V0IGlkIGFzc2lnbm1lbnRzCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBfX05VTV9FWEVDVVRPUlNfSVNTRVRfSUQgPSAwOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgX19OVU1fVEFTS1NfSVNTRVRfSUQgPSAxOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgX19FVkVOVExPR19QT1JUX0lTU0VUX0lEID0gMjsKKyAgcHJpdmF0ZSBieXRlIF9faXNzZXRfYml0ZmllbGQgPSAwOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBfRmllbGRzIG9wdGlvbmFsc1tdID0ge19GaWVsZHMuVE9QT0xPR1lfSUQsX0ZpZWxkcy5UT1BPTE9HWV9OQU1FLF9GaWVsZHMuTlVNX0VYRUNVVE9SUyxfRmllbGRzLk5VTV9UQVNLUyxfRmllbGRzLldJTkRPV19UT19TVEFUUyxfRmllbGRzLkdTSURfVE9fSU5QVVRfU1RBVFMsX0ZpZWxkcy5TSURfVE9fT1VUUFVUX1NUQVRTLF9GaWVsZHMuRVhFQ19TVEFUUyxfRmllbGRzLkVSUk9SUyxfRmllbGRzLkVWRU5UTE9HX0hPU1QsX0ZpZWxkcy5FVkVOVExPR19QT1JULF9GaWVsZHMuREVCVUdfT1BUSU9OUyxfRmllbGRzLlRPUE9MT0dZX1NUQVRVU307CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPiBtZXRhRGF0YU1hcDsKKyAgc3RhdGljIHsKKyAgICBNYXA8X0ZpZWxkcywgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGE+IHRtcE1hcCA9IG5ldyBFbnVtTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPihfRmllbGRzLmNsYXNzKTsKKyAgICB0bXBNYXAucHV0KF9GaWVsZHMuQ09NUE9ORU5UX0lELCBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEoImNvbXBvbmVudF9pZCIsIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZFJlcXVpcmVtZW50VHlwZS5SRVFVSVJFRCwgCisgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRWYWx1ZU1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORykpKTsKKyAgICB0bXBNYXAucHV0KF9GaWVsZHMuQ09NUE9ORU5UX1RZUEUsIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YSgiY29tcG9uZW50X3R5cGUiLCBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRSZXF1aXJlbWVudFR5cGUuUkVRVUlSRUQsIAorICAgICAgICBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkVudW1NZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5FTlVNLCBDb21wb25lbnRUeXBlLmNsYXNzKSkpOworICAgIHRtcE1hcC5wdXQoX0ZpZWxkcy5UT1BPTE9HWV9JRCwgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhKCJ0b3BvbG9neV9pZCIsIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZFJlcXVpcmVtZW50VHlwZS5PUFRJT05BTCwgCisgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRWYWx1ZU1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORykpKTsKKyAgICB0bXBNYXAucHV0KF9GaWVsZHMuVE9QT0xPR1lfTkFNRSwgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhKCJ0b3BvbG9neV9uYW1lIiwgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLk9QVElPTkFMLCAKKyAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZFZhbHVlTWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HKSkpOworICAgIHRtcE1hcC5wdXQoX0ZpZWxkcy5OVU1fRVhFQ1VUT1JTLCBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEoIm51bV9leGVjdXRvcnMiLCBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRSZXF1aXJlbWVudFR5cGUuT1BUSU9OQUwsIAorICAgICAgICBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkVmFsdWVNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JMzIpKSk7CisgICAgdG1wTWFwLnB1dChfRmllbGRzLk5VTV9UQVNLUywgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhKCJudW1fdGFza3MiLCBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRSZXF1aXJlbWVudFR5cGUuT1BUSU9OQUwsIAorICAgICAgICBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkVmFsdWVNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JMzIpKSk7CisgICAgdG1wTWFwLnB1dChfRmllbGRzLldJTkRPV19UT19TVEFUUywgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhKCJ3aW5kb3dfdG9fc3RhdHMiLCBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRSZXF1aXJlbWVudFR5cGUuT1BUSU9OQUwsIAorICAgICAgICBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLk1hcE1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLk1BUCwgCisgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkVmFsdWVNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcpLCAKKyAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuU3RydWN0TWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNULCBDb21wb25lbnRBZ2dyZWdhdGVTdGF0cy5jbGFzcykpKSk7CisgICAgdG1wTWFwLnB1dChfRmllbGRzLkdTSURfVE9fSU5QVVRfU1RBVFMsIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YSgiZ3NpZF90b19pbnB1dF9zdGF0cyIsIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZFJlcXVpcmVtZW50VHlwZS5PUFRJT05BTCwgCisgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuTWFwTWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTUFQLCAKKyAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuU3RydWN0TWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNULCBHbG9iYWxTdHJlYW1JZC5jbGFzcyksIAorICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5TdHJ1Y3RNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIENvbXBvbmVudEFnZ3JlZ2F0ZVN0YXRzLmNsYXNzKSkpKTsKKyAgICB0bXBNYXAucHV0KF9GaWVsZHMuU0lEX1RPX09VVFBVVF9TVEFUUywgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhKCJzaWRfdG9fb3V0cHV0X3N0YXRzIiwgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLk9QVElPTkFMLCAKKyAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5NYXBNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5NQVAsIAorICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZFZhbHVlTWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HKSwgCisgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLlN0cnVjdE1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCwgQ29tcG9uZW50QWdncmVnYXRlU3RhdHMuY2xhc3MpKSkpOworICAgIHRtcE1hcC5wdXQoX0ZpZWxkcy5FWEVDX1NUQVRTLCBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEoImV4ZWNfc3RhdHMiLCBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRSZXF1aXJlbWVudFR5cGUuT1BUSU9OQUwsIAorICAgICAgICBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkxpc3RNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5MSVNULCAKKyAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuU3RydWN0TWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNULCBFeGVjdXRvckFnZ3JlZ2F0ZVN0YXRzLmNsYXNzKSkpKTsKKyAgICB0bXBNYXAucHV0KF9GaWVsZHMuRVJST1JTLCBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEoImVycm9ycyIsIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZFJlcXVpcmVtZW50VHlwZS5PUFRJT05BTCwgCisgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuTGlzdE1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkxJU1QsIAorICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5TdHJ1Y3RNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIEVycm9ySW5mby5jbGFzcykpKSk7CisgICAgdG1wTWFwLnB1dChfRmllbGRzLkVWRU5UTE9HX0hPU1QsIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YSgiZXZlbnRsb2dfaG9zdCIsIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZFJlcXVpcmVtZW50VHlwZS5PUFRJT05BTCwgCisgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRWYWx1ZU1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORykpKTsKKyAgICB0bXBNYXAucHV0KF9GaWVsZHMuRVZFTlRMT0dfUE9SVCwgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhKCJldmVudGxvZ19wb3J0Iiwgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLk9QVElPTkFMLCAKKyAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZFZhbHVlTWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTMyKSkpOworICAgIHRtcE1hcC5wdXQoX0ZpZWxkcy5ERUJVR19PUFRJT05TLCBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEoImRlYnVnX29wdGlvbnMiLCBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRSZXF1aXJlbWVudFR5cGUuT1BUSU9OQUwsIAorICAgICAgICBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLlN0cnVjdE1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCwgRGVidWdPcHRpb25zLmNsYXNzKSkpOworICAgIHRtcE1hcC5wdXQoX0ZpZWxkcy5UT1BPTE9HWV9TVEFUVVMsIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YSgidG9wb2xvZ3lfc3RhdHVzIiwgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLk9QVElPTkFMLCAKKyAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZFZhbHVlTWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HKSkpOworICAgIG1ldGFEYXRhTWFwID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKHRtcE1hcCk7CisgICAgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEuYWRkU3RydWN0TWV0YURhdGFNYXAoQ29tcG9uZW50UGFnZUluZm8uY2xhc3MsIG1ldGFEYXRhTWFwKTsKKyAgfQorCisgIHB1YmxpYyBDb21wb25lbnRQYWdlSW5mbygpIHsKKyAgfQorCisgIHB1YmxpYyBDb21wb25lbnRQYWdlSW5mbygKKyAgICBTdHJpbmcgY29tcG9uZW50X2lkLAorICAgIENvbXBvbmVudFR5cGUgY29tcG9uZW50X3R5cGUpCisgIHsKKyAgICB0aGlzKCk7CisgICAgdGhpcy5jb21wb25lbnRfaWQgPSBjb21wb25lbnRfaWQ7CisgICAgdGhpcy5jb21wb25lbnRfdHlwZSA9IGNvbXBvbmVudF90eXBlOworICB9CisKKyAgLyoqCisgICAqIFBlcmZvcm1zIGEgZGVlcCBjb3B5IG9uIDxpPm90aGVyPC9pPi4KKyAgICovCisgIHB1YmxpYyBDb21wb25lbnRQYWdlSW5mbyhDb21wb25lbnRQYWdlSW5mbyBvdGhlcikgeworICAgIF9faXNzZXRfYml0ZmllbGQgPSBvdGhlci5fX2lzc2V0X2JpdGZpZWxkOworICAgIGlmIChvdGhlci5pc19zZXRfY29tcG9uZW50X2lkKCkpIHsKKyAgICAgIHRoaXMuY29tcG9uZW50X2lkID0gb3RoZXIuY29tcG9uZW50X2lkOworICAgIH0KKyAgICBpZiAob3RoZXIuaXNfc2V0X2NvbXBvbmVudF90eXBlKCkpIHsKKyAgICAgIHRoaXMuY29tcG9uZW50X3R5cGUgPSBvdGhlci5jb21wb25lbnRfdHlwZTsKKyAgICB9CisgICAgaWYgKG90aGVyLmlzX3NldF90b3BvbG9neV9pZCgpKSB7CisgICAgICB0aGlzLnRvcG9sb2d5X2lkID0gb3RoZXIudG9wb2xvZ3lfaWQ7CisgICAgfQorICAgIGlmIChvdGhlci5pc19zZXRfdG9wb2xvZ3lfbmFtZSgpKSB7CisgICAgICB0aGlzLnRvcG9sb2d5X25hbWUgPSBvdGhlci50b3BvbG9neV9uYW1lOworICAgIH0KKyAgICB0aGlzLm51bV9leGVjdXRvcnMgPSBvdGhlci5udW1fZXhlY3V0b3JzOworICAgIHRoaXMubnVtX3Rhc2tzID0gb3RoZXIubnVtX3Rhc2tzOworICAgIGlmIChvdGhlci5pc19zZXRfd2luZG93X3RvX3N0YXRzKCkpIHsKKyAgICAgIE1hcDxTdHJpbmcsQ29tcG9uZW50QWdncmVnYXRlU3RhdHM+IF9fdGhpc19fd2luZG93X3RvX3N0YXRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLENvbXBvbmVudEFnZ3JlZ2F0ZVN0YXRzPihvdGhlci53aW5kb3dfdG9fc3RhdHMuc2l6ZSgpKTsKKyAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgQ29tcG9uZW50QWdncmVnYXRlU3RhdHM+IG90aGVyX2VsZW1lbnQgOiBvdGhlci53aW5kb3dfdG9fc3RhdHMuZW50cnlTZXQoKSkgeworCisgICAgICAgIFN0cmluZyBvdGhlcl9lbGVtZW50X2tleSA9IG90aGVyX2VsZW1lbnQuZ2V0S2V5KCk7CisgICAgICAgIENvbXBvbmVudEFnZ3JlZ2F0ZVN0YXRzIG90aGVyX2VsZW1lbnRfdmFsdWUgPSBvdGhlcl9lbGVtZW50LmdldFZhbHVlKCk7CisKKyAgICAgICAgU3RyaW5nIF9fdGhpc19fd2luZG93X3RvX3N0YXRzX2NvcHlfa2V5ID0gb3RoZXJfZWxlbWVudF9rZXk7CisKKyAgICAgICAgQ29tcG9uZW50QWdncmVnYXRlU3RhdHMgX190aGlzX193aW5kb3dfdG9fc3RhdHNfY29weV92YWx1ZSA9IG5ldyBDb21wb25lbnRBZ2dyZWdhdGVTdGF0cyhvdGhlcl9lbGVtZW50X3ZhbHVlKTsKKworICAgICAgICBfX3RoaXNfX3dpbmRvd190b19zdGF0cy5wdXQoX190aGlzX193aW5kb3dfdG9fc3RhdHNfY29weV9rZXksIF9fdGhpc19fd2luZG93X3RvX3N0YXRzX2NvcHlfdmFsdWUpOworICAgICAgfQorICAgICAgdGhpcy53aW5kb3dfdG9fc3RhdHMgPSBfX3RoaXNfX3dpbmRvd190b19zdGF0czsKKyAgICB9CisgICAgaWYgKG90aGVyLmlzX3NldF9nc2lkX3RvX2lucHV0X3N0YXRzKCkpIHsKKyAgICAgIE1hcDxHbG9iYWxTdHJlYW1JZCxDb21wb25lbnRBZ2dyZWdhdGVTdGF0cz4gX190aGlzX19nc2lkX3RvX2lucHV0X3N0YXRzID0gbmV3IEhhc2hNYXA8R2xvYmFsU3RyZWFtSWQsQ29tcG9uZW50QWdncmVnYXRlU3RhdHM+KG90aGVyLmdzaWRfdG9faW5wdXRfc3RhdHMuc2l6ZSgpKTsKKyAgICAgIGZvciAoTWFwLkVudHJ5PEdsb2JhbFN0cmVhbUlkLCBDb21wb25lbnRBZ2dyZWdhdGVTdGF0cz4gb3RoZXJfZWxlbWVudCA6IG90aGVyLmdzaWRfdG9faW5wdXRfc3RhdHMuZW50cnlTZXQoKSkgeworCisgICAgICAgIEdsb2JhbFN0cmVhbUlkIG90aGVyX2VsZW1lbnRfa2V5ID0gb3RoZXJfZWxlbWVudC5nZXRLZXkoKTsKKyAgICAgICAgQ29tcG9uZW50QWdncmVnYXRlU3RhdHMgb3RoZXJfZWxlbWVudF92YWx1ZSA9IG90aGVyX2VsZW1lbnQuZ2V0VmFsdWUoKTsKKworICAgICAgICBHbG9iYWxTdHJlYW1JZCBfX3RoaXNfX2dzaWRfdG9faW5wdXRfc3RhdHNfY29weV9rZXkgPSBuZXcgR2xvYmFsU3RyZWFtSWQob3RoZXJfZWxlbWVudF9rZXkpOworCisgICAgICAgIENvbXBvbmVudEFnZ3JlZ2F0ZVN0YXRzIF9fdGhpc19fZ3NpZF90b19pbnB1dF9zdGF0c19jb3B5X3ZhbHVlID0gbmV3IENvbXBvbmVudEFnZ3JlZ2F0ZVN0YXRzKG90aGVyX2VsZW1lbnRfdmFsdWUpOworCisgICAgICAgIF9fdGhpc19fZ3NpZF90b19pbnB1dF9zdGF0cy5wdXQoX190aGlzX19nc2lkX3RvX2lucHV0X3N0YXRzX2NvcHlfa2V5LCBfX3RoaXNfX2dzaWRfdG9faW5wdXRfc3RhdHNfY29weV92YWx1ZSk7CisgICAgICB9CisgICAgICB0aGlzLmdzaWRfdG9faW5wdXRfc3RhdHMgPSBfX3RoaXNfX2dzaWRfdG9faW5wdXRfc3RhdHM7CisgICAgfQorICAgIGlmIChvdGhlci5pc19zZXRfc2lkX3RvX291dHB1dF9zdGF0cygpKSB7CisgICAgICBNYXA8U3RyaW5nLENvbXBvbmVudEFnZ3JlZ2F0ZVN0YXRzPiBfX3RoaXNfX3NpZF90b19vdXRwdXRfc3RhdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsQ29tcG9uZW50QWdncmVnYXRlU3RhdHM+KG90aGVyLnNpZF90b19vdXRwdXRfc3RhdHMuc2l6ZSgpKTsKKyAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgQ29tcG9uZW50QWdncmVnYXRlU3RhdHM+IG90aGVyX2VsZW1lbnQgOiBvdGhlci5zaWRfdG9fb3V0cHV0X3N0YXRzLmVudHJ5U2V0KCkpIHsKKworICAgICAgICBTdHJpbmcgb3RoZXJfZWxlbWVudF9rZXkgPSBvdGhlcl9lbGVtZW50LmdldEtleSgpOworICAgICAgICBDb21wb25lbnRBZ2dyZWdhdGVTdGF0cyBvdGhlcl9lbGVtZW50X3ZhbHVlID0gb3RoZXJfZWxlbWVudC5nZXRWYWx1ZSgpOworCisgICAgICAgIFN0cmluZyBfX3RoaXNfX3NpZF90b19vdXRwdXRfc3RhdHNfY29weV9rZXkgPSBvdGhlcl9lbGVtZW50X2tleTsKKworICAgICAgICBDb21wb25lbnRBZ2dyZWdhdGVTdGF0cyBfX3RoaXNfX3NpZF90b19vdXRwdXRfc3RhdHNfY29weV92YWx1ZSA9IG5ldyBDb21wb25lbnRBZ2dyZWdhdGVTdGF0cyhvdGhlcl9lbGVtZW50X3ZhbHVlKTsKKworICAgICAgICBfX3RoaXNfX3NpZF90b19vdXRwdXRfc3RhdHMucHV0KF9fdGhpc19fc2lkX3RvX291dHB1dF9zdGF0c19jb3B5X2tleSwgX190aGlzX19zaWRfdG9fb3V0cHV0X3N0YXRzX2NvcHlfdmFsdWUpOworICAgICAgfQorICAgICAgdGhpcy5zaWRfdG9fb3V0cHV0X3N0YXRzID0gX190aGlzX19zaWRfdG9fb3V0cHV0X3N0YXRzOworICAgIH0KKyAgICBpZiAob3RoZXIuaXNfc2V0X2V4ZWNfc3RhdHMoKSkgeworICAgICAgTGlzdDxFeGVjdXRvckFnZ3JlZ2F0ZVN0YXRzPiBfX3RoaXNfX2V4ZWNfc3RhdHMgPSBuZXcgQXJyYXlMaXN0PEV4ZWN1dG9yQWdncmVnYXRlU3RhdHM+KG90aGVyLmV4ZWNfc3RhdHMuc2l6ZSgpKTsKKyAgICAgIGZvciAoRXhlY3V0b3JBZ2dyZWdhdGVTdGF0cyBvdGhlcl9lbGVtZW50IDogb3RoZXIuZXhlY19zdGF0cykgeworICAgICAgICBfX3RoaXNfX2V4ZWNfc3RhdHMuYWRkKG5ldyBFeGVjdXRvckFnZ3JlZ2F0ZVN0YXRzKG90aGVyX2VsZW1lbnQpKTsKKyAgICAgIH0KKyAgICAgIHRoaXMuZXhlY19zdGF0cyA9IF9fdGhpc19fZXhlY19zdGF0czsKKyAgICB9CisgICAgaWYgKG90aGVyLmlzX3NldF9lcnJvcnMoKSkgeworICAgICAgTGlzdDxFcnJvckluZm8+IF9fdGhpc19fZXJyb3JzID0gbmV3IEFycmF5TGlzdDxFcnJvckluZm8+KG90aGVyLmVycm9ycy5zaXplKCkpOworICAgICAgZm9yIChFcnJvckluZm8gb3RoZXJfZWxlbWVudCA6IG90aGVyLmVycm9ycykgeworICAgICAgICBfX3RoaXNfX2Vycm9ycy5hZGQobmV3IEVycm9ySW5mbyhvdGhlcl9lbGVtZW50KSk7CisgICAgICB9CisgICAgICB0aGlzLmVycm9ycyA9IF9fdGhpc19fZXJyb3JzOworICAgIH0KKyAgICBpZiAob3RoZXIuaXNfc2V0X2V2ZW50bG9nX2hvc3QoKSkgeworICAgICAgdGhpcy5ldmVudGxvZ19ob3N0ID0gb3RoZXIuZXZlbnRsb2dfaG9zdDsKKyAgICB9CisgICAgdGhpcy5ldmVudGxvZ19wb3J0ID0gb3RoZXIuZXZlbnRsb2dfcG9ydDsKKyAgICBpZiAob3RoZXIuaXNfc2V0X2RlYnVnX29wdGlvbnMoKSkgeworICAgICAgdGhpcy5kZWJ1Z19vcHRpb25zID0gbmV3IERlYnVnT3B0aW9ucyhvdGhlci5kZWJ1Z19vcHRpb25zKTsKKyAgICB9CisgICAgaWYgKG90aGVyLmlzX3NldF90b3BvbG9neV9zdGF0dXMoKSkgeworICAgICAgdGhpcy50b3BvbG9neV9zdGF0dXMgPSBvdGhlci50b3BvbG9neV9zdGF0dXM7CisgICAgfQorICB9CisKKyAgcHVibGljIENvbXBvbmVudFBhZ2VJbmZvIGRlZXBDb3B5KCkgeworICAgIHJldHVybiBuZXcgQ29tcG9uZW50UGFnZUluZm8odGhpcyk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgdGhpcy5jb21wb25lbnRfaWQgPSBudWxsOworICAgIHRoaXMuY29tcG9uZW50X3R5cGUgPSBudWxsOworICAgIHRoaXMudG9wb2xvZ3lfaWQgPSBudWxsOworICAgIHRoaXMudG9wb2xvZ3lfbmFtZSA9IG51bGw7CisgICAgc2V0X251bV9leGVjdXRvcnNfaXNTZXQoZmFsc2UpOworICAgIHRoaXMubnVtX2V4ZWN1dG9ycyA9IDA7CisgICAgc2V0X251bV90YXNrc19pc1NldChmYWxzZSk7CisgICAgdGhpcy5udW1fdGFza3MgPSAwOworICAgIHRoaXMud2luZG93X3RvX3N0YXRzID0gbnVsbDsKKyAgICB0aGlzLmdzaWRfdG9faW5wdXRfc3RhdHMgPSBudWxsOworICAgIHRoaXMuc2lkX3RvX291dHB1dF9zdGF0cyA9IG51bGw7CisgICAgdGhpcy5leGVjX3N0YXRzID0gbnVsbDsKKyAgICB0aGlzLmVycm9ycyA9IG51bGw7CisgICAgdGhpcy5ldmVudGxvZ19ob3N0ID0gbnVsbDsKKyAgICBzZXRfZXZlbnRsb2dfcG9ydF9pc1NldChmYWxzZSk7CisgICAgdGhpcy5ldmVudGxvZ19wb3J0ID0gMDsKKyAgICB0aGlzLmRlYnVnX29wdGlvbnMgPSBudWxsOworICAgIHRoaXMudG9wb2xvZ3lfc3RhdHVzID0gbnVsbDsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgZ2V0X2NvbXBvbmVudF9pZCgpIHsKKyAgICByZXR1cm4gdGhpcy5jb21wb25lbnRfaWQ7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfY29tcG9uZW50X2lkKFN0cmluZyBjb21wb25lbnRfaWQpIHsKKyAgICB0aGlzLmNvbXBvbmVudF9pZCA9IGNvbXBvbmVudF9pZDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHVuc2V0X2NvbXBvbmVudF9pZCgpIHsKKyAgICB0aGlzLmNvbXBvbmVudF9pZCA9IG51bGw7CisgIH0KKworICAvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkIGNvbXBvbmVudF9pZCBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNfc2V0X2NvbXBvbmVudF9pZCgpIHsKKyAgICByZXR1cm4gdGhpcy5jb21wb25lbnRfaWQgIT0gbnVsbDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF9jb21wb25lbnRfaWRfaXNTZXQoYm9vbGVhbiB2YWx1ZSkgeworICAgIGlmICghdmFsdWUpIHsKKyAgICAgIHRoaXMuY29tcG9uZW50X2lkID0gbnVsbDsKKyAgICB9CisgIH0KKworICAvKioKKyAgICogCisgICAqIEBzZWUgQ29tcG9uZW50VHlwZQorICAgKi8KKyAgcHVibGljIENvbXBvbmVudFR5cGUgZ2V0X2NvbXBvbmVudF90eXBlKCkgeworICAgIHJldHVybiB0aGlzLmNvbXBvbmVudF90eXBlOworICB9CisKKyAgLyoqCisgICAqIAorICAgKiBAc2VlIENvbXBvbmVudFR5cGUKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldF9jb21wb25lbnRfdHlwZShDb21wb25lbnRUeXBlIGNvbXBvbmVudF90eXBlKSB7CisgICAgdGhpcy5jb21wb25lbnRfdHlwZSA9IGNvbXBvbmVudF90eXBlOworICB9CisKKyAgcHVibGljIHZvaWQgdW5zZXRfY29tcG9uZW50X3R5cGUoKSB7CisgICAgdGhpcy5jb21wb25lbnRfdHlwZSA9IG51bGw7CisgIH0KKworICAvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkIGNvbXBvbmVudF90eXBlIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLworICBwdWJsaWMgYm9vbGVhbiBpc19zZXRfY29tcG9uZW50X3R5cGUoKSB7CisgICAgcmV0dXJuIHRoaXMuY29tcG9uZW50X3R5cGUgIT0gbnVsbDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF9jb21wb25lbnRfdHlwZV9pc1NldChib29sZWFuIHZhbHVlKSB7CisgICAgaWYgKCF2YWx1ZSkgeworICAgICAgdGhpcy5jb21wb25lbnRfdHlwZSA9IG51bGw7CisgICAgfQorICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRfdG9wb2xvZ3lfaWQoKSB7CisgICAgcmV0dXJuIHRoaXMudG9wb2xvZ3lfaWQ7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfdG9wb2xvZ3lfaWQoU3RyaW5nIHRvcG9sb2d5X2lkKSB7CisgICAgdGhpcy50b3BvbG9neV9pZCA9IHRvcG9sb2d5X2lkOworICB9CisKKyAgcHVibGljIHZvaWQgdW5zZXRfdG9wb2xvZ3lfaWQoKSB7CisgICAgdGhpcy50b3BvbG9neV9pZCA9IG51bGw7CisgIH0KKworICAvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkIHRvcG9sb2d5X2lkIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLworICBwdWJsaWMgYm9vbGVhbiBpc19zZXRfdG9wb2xvZ3lfaWQoKSB7CisgICAgcmV0dXJuIHRoaXMudG9wb2xvZ3lfaWQgIT0gbnVsbDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF90b3BvbG9neV9pZF9pc1NldChib29sZWFuIHZhbHVlKSB7CisgICAgaWYgKCF2YWx1ZSkgeworICAgICAgdGhpcy50b3BvbG9neV9pZCA9IG51bGw7CisgICAgfQorICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRfdG9wb2xvZ3lfbmFtZSgpIHsKKyAgICByZXR1cm4gdGhpcy50b3BvbG9neV9uYW1lOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X3RvcG9sb2d5X25hbWUoU3RyaW5nIHRvcG9sb2d5X25hbWUpIHsKKyAgICB0aGlzLnRvcG9sb2d5X25hbWUgPSB0b3BvbG9neV9uYW1lOworICB9CisKKyAgcHVibGljIHZvaWQgdW5zZXRfdG9wb2xvZ3lfbmFtZSgpIHsKKyAgICB0aGlzLnRvcG9sb2d5X25hbWUgPSBudWxsOworICB9CisKKyAgLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCB0b3BvbG9neV9uYW1lIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLworICBwdWJsaWMgYm9vbGVhbiBpc19zZXRfdG9wb2xvZ3lfbmFtZSgpIHsKKyAgICByZXR1cm4gdGhpcy50b3BvbG9neV9uYW1lICE9IG51bGw7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfdG9wb2xvZ3lfbmFtZV9pc1NldChib29sZWFuIHZhbHVlKSB7CisgICAgaWYgKCF2YWx1ZSkgeworICAgICAgdGhpcy50b3BvbG9neV9uYW1lID0gbnVsbDsKKyAgICB9CisgIH0KKworICBwdWJsaWMgaW50IGdldF9udW1fZXhlY3V0b3JzKCkgeworICAgIHJldHVybiB0aGlzLm51bV9leGVjdXRvcnM7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfbnVtX2V4ZWN1dG9ycyhpbnQgbnVtX2V4ZWN1dG9ycykgeworICAgIHRoaXMubnVtX2V4ZWN1dG9ycyA9IG51bV9leGVjdXRvcnM7CisgICAgc2V0X251bV9leGVjdXRvcnNfaXNTZXQodHJ1ZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB1bnNldF9udW1fZXhlY3V0b3JzKCkgeworICAgIF9faXNzZXRfYml0ZmllbGQgPSBFbmNvZGluZ1V0aWxzLmNsZWFyQml0KF9faXNzZXRfYml0ZmllbGQsIF9fTlVNX0VYRUNVVE9SU19JU1NFVF9JRCk7CisgIH0KKworICAvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkIG51bV9leGVjdXRvcnMgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgIHB1YmxpYyBib29sZWFuIGlzX3NldF9udW1fZXhlY3V0b3JzKCkgeworICAgIHJldHVybiBFbmNvZGluZ1V0aWxzLnRlc3RCaXQoX19pc3NldF9iaXRmaWVsZCwgX19OVU1fRVhFQ1VUT1JTX0lTU0VUX0lEKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF9udW1fZXhlY3V0b3JzX2lzU2V0KGJvb2xlYW4gdmFsdWUpIHsKKyAgICBfX2lzc2V0X2JpdGZpZWxkID0gRW5jb2RpbmdVdGlscy5zZXRCaXQoX19pc3NldF9iaXRmaWVsZCwgX19OVU1fRVhFQ1VUT1JTX0lTU0VUX0lELCB2YWx1ZSk7CisgIH0KKworICBwdWJsaWMgaW50IGdldF9udW1fdGFza3MoKSB7CisgICAgcmV0dXJuIHRoaXMubnVtX3Rhc2tzOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X251bV90YXNrcyhpbnQgbnVtX3Rhc2tzKSB7CisgICAgdGhpcy5udW1fdGFza3MgPSBudW1fdGFza3M7CisgICAgc2V0X251bV90YXNrc19pc1NldCh0cnVlKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHVuc2V0X251bV90YXNrcygpIHsKKyAgICBfX2lzc2V0X2JpdGZpZWxkID0gRW5jb2RpbmdVdGlscy5jbGVhckJpdChfX2lzc2V0X2JpdGZpZWxkLCBfX05VTV9UQVNLU19JU1NFVF9JRCk7CisgIH0KKworICAvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkIG51bV90YXNrcyBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNfc2V0X251bV90YXNrcygpIHsKKyAgICByZXR1cm4gRW5jb2RpbmdVdGlscy50ZXN0Qml0KF9faXNzZXRfYml0ZmllbGQsIF9fTlVNX1RBU0tTX0lTU0VUX0lEKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF9udW1fdGFza3NfaXNTZXQoYm9vbGVhbiB2YWx1ZSkgeworICAgIF9faXNzZXRfYml0ZmllbGQgPSBFbmNvZGluZ1V0aWxzLnNldEJpdChfX2lzc2V0X2JpdGZpZWxkLCBfX05VTV9UQVNLU19JU1NFVF9JRCwgdmFsdWUpOworICB9CisKKyAgcHVibGljIGludCBnZXRfd2luZG93X3RvX3N0YXRzX3NpemUoKSB7CisgICAgcmV0dXJuICh0aGlzLndpbmRvd190b19zdGF0cyA9PSBudWxsKSA/IDAgOiB0aGlzLndpbmRvd190b19zdGF0cy5zaXplKCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBwdXRfdG9fd2luZG93X3RvX3N0YXRzKFN0cmluZyBrZXksIENvbXBvbmVudEFnZ3JlZ2F0ZVN0YXRzIHZhbCkgeworICAgIGlmICh0aGlzLndpbmRvd190b19zdGF0cyA9PSBudWxsKSB7CisgICAgICB0aGlzLndpbmRvd190b19zdGF0cyA9IG5ldyBIYXNoTWFwPFN0cmluZyxDb21wb25lbnRBZ2dyZWdhdGVTdGF0cz4oKTsKKyAgICB9CisgICAgdGhpcy53aW5kb3dfdG9fc3RhdHMucHV0KGtleSwgdmFsKTsKKyAgfQorCisgIHB1YmxpYyBNYXA8U3RyaW5nLENvbXBvbmVudEFnZ3JlZ2F0ZVN0YXRzPiBnZXRfd2luZG93X3RvX3N0YXRzKCkgeworICAgIHJldHVybiB0aGlzLndpbmRvd190b19zdGF0czsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF93aW5kb3dfdG9fc3RhdHMoTWFwPFN0cmluZyxDb21wb25lbnRBZ2dyZWdhdGVTdGF0cz4gd2luZG93X3RvX3N0YXRzKSB7CisgICAgdGhpcy53aW5kb3dfdG9fc3RhdHMgPSB3aW5kb3dfdG9fc3RhdHM7CisgIH0KKworICBwdWJsaWMgdm9pZCB1bnNldF93aW5kb3dfdG9fc3RhdHMoKSB7CisgICAgdGhpcy53aW5kb3dfdG9fc3RhdHMgPSBudWxsOworICB9CisKKyAgLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCB3aW5kb3dfdG9fc3RhdHMgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgIHB1YmxpYyBib29sZWFuIGlzX3NldF93aW5kb3dfdG9fc3RhdHMoKSB7CisgICAgcmV0dXJuIHRoaXMud2luZG93X3RvX3N0YXRzICE9IG51bGw7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfd2luZG93X3RvX3N0YXRzX2lzU2V0KGJvb2xlYW4gdmFsdWUpIHsKKyAgICBpZiAoIXZhbHVlKSB7CisgICAgICB0aGlzLndpbmRvd190b19zdGF0cyA9IG51bGw7CisgICAgfQorICB9CisKKyAgcHVibGljIGludCBnZXRfZ3NpZF90b19pbnB1dF9zdGF0c19zaXplKCkgeworICAgIHJldHVybiAodGhpcy5nc2lkX3RvX2lucHV0X3N0YXRzID09IG51bGwpID8gMCA6IHRoaXMuZ3NpZF90b19pbnB1dF9zdGF0cy5zaXplKCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBwdXRfdG9fZ3NpZF90b19pbnB1dF9zdGF0cyhHbG9iYWxTdHJlYW1JZCBrZXksIENvbXBvbmVudEFnZ3JlZ2F0ZVN0YXRzIHZhbCkgeworICAgIGlmICh0aGlzLmdzaWRfdG9faW5wdXRfc3RhdHMgPT0gbnVsbCkgeworICAgICAgdGhpcy5nc2lkX3RvX2lucHV0X3N0YXRzID0gbmV3IEhhc2hNYXA8R2xvYmFsU3RyZWFtSWQsQ29tcG9uZW50QWdncmVnYXRlU3RhdHM+KCk7CisgICAgfQorICAgIHRoaXMuZ3NpZF90b19pbnB1dF9zdGF0cy5wdXQoa2V5LCB2YWwpOworICB9CisKKyAgcHVibGljIE1hcDxHbG9iYWxTdHJlYW1JZCxDb21wb25lbnRBZ2dyZWdhdGVTdGF0cz4gZ2V0X2dzaWRfdG9faW5wdXRfc3RhdHMoKSB7CisgICAgcmV0dXJuIHRoaXMuZ3NpZF90b19pbnB1dF9zdGF0czsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF9nc2lkX3RvX2lucHV0X3N0YXRzKE1hcDxHbG9iYWxTdHJlYW1JZCxDb21wb25lbnRBZ2dyZWdhdGVTdGF0cz4gZ3NpZF90b19pbnB1dF9zdGF0cykgeworICAgIHRoaXMuZ3NpZF90b19pbnB1dF9zdGF0cyA9IGdzaWRfdG9faW5wdXRfc3RhdHM7CisgIH0KKworICBwdWJsaWMgdm9pZCB1bnNldF9nc2lkX3RvX2lucHV0X3N0YXRzKCkgeworICAgIHRoaXMuZ3NpZF90b19pbnB1dF9zdGF0cyA9IG51bGw7CisgIH0KKworICAvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkIGdzaWRfdG9faW5wdXRfc3RhdHMgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgIHB1YmxpYyBib29sZWFuIGlzX3NldF9nc2lkX3RvX2lucHV0X3N0YXRzKCkgeworICAgIHJldHVybiB0aGlzLmdzaWRfdG9faW5wdXRfc3RhdHMgIT0gbnVsbDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF9nc2lkX3RvX2lucHV0X3N0YXRzX2lzU2V0KGJvb2xlYW4gdmFsdWUpIHsKKyAgICBpZiAoIXZhbHVlKSB7CisgICAgICB0aGlzLmdzaWRfdG9faW5wdXRfc3RhdHMgPSBudWxsOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBpbnQgZ2V0X3NpZF90b19vdXRwdXRfc3RhdHNfc2l6ZSgpIHsKKyAgICByZXR1cm4gKHRoaXMuc2lkX3RvX291dHB1dF9zdGF0cyA9PSBudWxsKSA/IDAgOiB0aGlzLnNpZF90b19vdXRwdXRfc3RhdHMuc2l6ZSgpOworICB9CisKKyAgcHVibGljIHZvaWQgcHV0X3RvX3NpZF90b19vdXRwdXRfc3RhdHMoU3RyaW5nIGtleSwgQ29tcG9uZW50QWdncmVnYXRlU3RhdHMgdmFsKSB7CisgICAgaWYgKHRoaXMuc2lkX3RvX291dHB1dF9zdGF0cyA9PSBudWxsKSB7CisgICAgICB0aGlzLnNpZF90b19vdXRwdXRfc3RhdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsQ29tcG9uZW50QWdncmVnYXRlU3RhdHM+KCk7CisgICAgfQorICAgIHRoaXMuc2lkX3RvX291dHB1dF9zdGF0cy5wdXQoa2V5LCB2YWwpOworICB9CisKKyAgcHVibGljIE1hcDxTdHJpbmcsQ29tcG9uZW50QWdncmVnYXRlU3RhdHM+IGdldF9zaWRfdG9fb3V0cHV0X3N0YXRzKCkgeworICAgIHJldHVybiB0aGlzLnNpZF90b19vdXRwdXRfc3RhdHM7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfc2lkX3RvX291dHB1dF9zdGF0cyhNYXA8U3RyaW5nLENvbXBvbmVudEFnZ3JlZ2F0ZVN0YXRzPiBzaWRfdG9fb3V0cHV0X3N0YXRzKSB7CisgICAgdGhpcy5zaWRfdG9fb3V0cHV0X3N0YXRzID0gc2lkX3RvX291dHB1dF9zdGF0czsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHVuc2V0X3NpZF90b19vdXRwdXRfc3RhdHMoKSB7CisgICAgdGhpcy5zaWRfdG9fb3V0cHV0X3N0YXRzID0gbnVsbDsKKyAgfQorCisgIC8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgc2lkX3RvX291dHB1dF9zdGF0cyBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNfc2V0X3NpZF90b19vdXRwdXRfc3RhdHMoKSB7CisgICAgcmV0dXJuIHRoaXMuc2lkX3RvX291dHB1dF9zdGF0cyAhPSBudWxsOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X3NpZF90b19vdXRwdXRfc3RhdHNfaXNTZXQoYm9vbGVhbiB2YWx1ZSkgeworICAgIGlmICghdmFsdWUpIHsKKyAgICAgIHRoaXMuc2lkX3RvX291dHB1dF9zdGF0cyA9IG51bGw7CisgICAgfQorICB9CisKKyAgcHVibGljIGludCBnZXRfZXhlY19zdGF0c19zaXplKCkgeworICAgIHJldHVybiAodGhpcy5leGVjX3N0YXRzID09IG51bGwpID8gMCA6IHRoaXMuZXhlY19zdGF0cy5zaXplKCk7CisgIH0KKworICBwdWJsaWMgamF2YS51dGlsLkl0ZXJhdG9yPEV4ZWN1dG9yQWdncmVnYXRlU3RhdHM+IGdldF9leGVjX3N0YXRzX2l0ZXJhdG9yKCkgeworICAgIHJldHVybiAodGhpcy5leGVjX3N0YXRzID09IG51bGwpID8gbnVsbCA6IHRoaXMuZXhlY19zdGF0cy5pdGVyYXRvcigpOworICB9CisKKyAgcHVibGljIHZvaWQgYWRkX3RvX2V4ZWNfc3RhdHMoRXhlY3V0b3JBZ2dyZWdhdGVTdGF0cyBlbGVtKSB7CisgICAgaWYgKHRoaXMuZXhlY19zdGF0cyA9PSBudWxsKSB7CisgICAgICB0aGlzLmV4ZWNfc3RhdHMgPSBuZXcgQXJyYXlMaXN0PEV4ZWN1dG9yQWdncmVnYXRlU3RhdHM+KCk7CisgICAgfQorICAgIHRoaXMuZXhlY19zdGF0cy5hZGQoZWxlbSk7CisgIH0KKworICBwdWJsaWMgTGlzdDxFeGVjdXRvckFnZ3JlZ2F0ZVN0YXRzPiBnZXRfZXhlY19zdGF0cygpIHsKKyAgICByZXR1cm4gdGhpcy5leGVjX3N0YXRzOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X2V4ZWNfc3RhdHMoTGlzdDxFeGVjdXRvckFnZ3JlZ2F0ZVN0YXRzPiBleGVjX3N0YXRzKSB7CisgICAgdGhpcy5leGVjX3N0YXRzID0gZXhlY19zdGF0czsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHVuc2V0X2V4ZWNfc3RhdHMoKSB7CisgICAgdGhpcy5leGVjX3N0YXRzID0gbnVsbDsKKyAgfQorCisgIC8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgZXhlY19zdGF0cyBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNfc2V0X2V4ZWNfc3RhdHMoKSB7CisgICAgcmV0dXJuIHRoaXMuZXhlY19zdGF0cyAhPSBudWxsOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X2V4ZWNfc3RhdHNfaXNTZXQoYm9vbGVhbiB2YWx1ZSkgeworICAgIGlmICghdmFsdWUpIHsKKyAgICAgIHRoaXMuZXhlY19zdGF0cyA9IG51bGw7CisgICAgfQorICB9CisKKyAgcHVibGljIGludCBnZXRfZXJyb3JzX3NpemUoKSB7CisgICAgcmV0dXJuICh0aGlzLmVycm9ycyA9PSBudWxsKSA/IDAgOiB0aGlzLmVycm9ycy5zaXplKCk7CisgIH0KKworICBwdWJsaWMgamF2YS51dGlsLkl0ZXJhdG9yPEVycm9ySW5mbz4gZ2V0X2Vycm9yc19pdGVyYXRvcigpIHsKKyAgICByZXR1cm4gKHRoaXMuZXJyb3JzID09IG51bGwpID8gbnVsbCA6IHRoaXMuZXJyb3JzLml0ZXJhdG9yKCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBhZGRfdG9fZXJyb3JzKEVycm9ySW5mbyBlbGVtKSB7CisgICAgaWYgKHRoaXMuZXJyb3JzID09IG51bGwpIHsKKyAgICAgIHRoaXMuZXJyb3JzID0gbmV3IEFycmF5TGlzdDxFcnJvckluZm8+KCk7CisgICAgfQorICAgIHRoaXMuZXJyb3JzLmFkZChlbGVtKTsKKyAgfQorCisgIHB1YmxpYyBMaXN0PEVycm9ySW5mbz4gZ2V0X2Vycm9ycygpIHsKKyAgICByZXR1cm4gdGhpcy5lcnJvcnM7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfZXJyb3JzKExpc3Q8RXJyb3JJbmZvPiBlcnJvcnMpIHsKKyAgICB0aGlzLmVycm9ycyA9IGVycm9yczsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHVuc2V0X2Vycm9ycygpIHsKKyAgICB0aGlzLmVycm9ycyA9IG51bGw7CisgIH0KKworICAvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkIGVycm9ycyBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNfc2V0X2Vycm9ycygpIHsKKyAgICByZXR1cm4gdGhpcy5lcnJvcnMgIT0gbnVsbDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF9lcnJvcnNfaXNTZXQoYm9vbGVhbiB2YWx1ZSkgeworICAgIGlmICghdmFsdWUpIHsKKyAgICAgIHRoaXMuZXJyb3JzID0gbnVsbDsKKyAgICB9CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldF9ldmVudGxvZ19ob3N0KCkgeworICAgIHJldHVybiB0aGlzLmV2ZW50bG9nX2hvc3Q7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfZXZlbnRsb2dfaG9zdChTdHJpbmcgZXZlbnRsb2dfaG9zdCkgeworICAgIHRoaXMuZXZlbnRsb2dfaG9zdCA9IGV2ZW50bG9nX2hvc3Q7CisgIH0KKworICBwdWJsaWMgdm9pZCB1bnNldF9ldmVudGxvZ19ob3N0KCkgeworICAgIHRoaXMuZXZlbnRsb2dfaG9zdCA9IG51bGw7CisgIH0KKworICAvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkIGV2ZW50bG9nX2hvc3QgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgIHB1YmxpYyBib29sZWFuIGlzX3NldF9ldmVudGxvZ19ob3N0KCkgeworICAgIHJldHVybiB0aGlzLmV2ZW50bG9nX2hvc3QgIT0gbnVsbDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF9ldmVudGxvZ19ob3N0X2lzU2V0KGJvb2xlYW4gdmFsdWUpIHsKKyAgICBpZiAoIXZhbHVlKSB7CisgICAgICB0aGlzLmV2ZW50bG9nX2hvc3QgPSBudWxsOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBpbnQgZ2V0X2V2ZW50bG9nX3BvcnQoKSB7CisgICAgcmV0dXJuIHRoaXMuZXZlbnRsb2dfcG9ydDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF9ldmVudGxvZ19wb3J0KGludCBldmVudGxvZ19wb3J0KSB7CisgICAgdGhpcy5ldmVudGxvZ19wb3J0ID0gZXZlbnRsb2dfcG9ydDsKKyAgICBzZXRfZXZlbnRsb2dfcG9ydF9pc1NldCh0cnVlKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHVuc2V0X2V2ZW50bG9nX3BvcnQoKSB7CisgICAgX19pc3NldF9iaXRmaWVsZCA9IEVuY29kaW5nVXRpbHMuY2xlYXJCaXQoX19pc3NldF9iaXRmaWVsZCwgX19FVkVOVExPR19QT1JUX0lTU0VUX0lEKTsKKyAgfQorCisgIC8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgZXZlbnRsb2dfcG9ydCBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNfc2V0X2V2ZW50bG9nX3BvcnQoKSB7CisgICAgcmV0dXJuIEVuY29kaW5nVXRpbHMudGVzdEJpdChfX2lzc2V0X2JpdGZpZWxkLCBfX0VWRU5UTE9HX1BPUlRfSVNTRVRfSUQpOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X2V2ZW50bG9nX3BvcnRfaXNTZXQoYm9vbGVhbiB2YWx1ZSkgeworICAgIF9faXNzZXRfYml0ZmllbGQgPSBFbmNvZGluZ1V0aWxzLnNldEJpdChfX2lzc2V0X2JpdGZpZWxkLCBfX0VWRU5UTE9HX1BPUlRfSVNTRVRfSUQsIHZhbHVlKTsKKyAgfQorCisgIHB1YmxpYyBEZWJ1Z09wdGlvbnMgZ2V0X2RlYnVnX29wdGlvbnMoKSB7CisgICAgcmV0dXJuIHRoaXMuZGVidWdfb3B0aW9uczsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF9kZWJ1Z19vcHRpb25zKERlYnVnT3B0aW9ucyBkZWJ1Z19vcHRpb25zKSB7CisgICAgdGhpcy5kZWJ1Z19vcHRpb25zID0gZGVidWdfb3B0aW9uczsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHVuc2V0X2RlYnVnX29wdGlvbnMoKSB7CisgICAgdGhpcy5kZWJ1Z19vcHRpb25zID0gbnVsbDsKKyAgfQorCisgIC8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgZGVidWdfb3B0aW9ucyBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNfc2V0X2RlYnVnX29wdGlvbnMoKSB7CisgICAgcmV0dXJuIHRoaXMuZGVidWdfb3B0aW9ucyAhPSBudWxsOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X2RlYnVnX29wdGlvbnNfaXNTZXQoYm9vbGVhbiB2YWx1ZSkgeworICAgIGlmICghdmFsdWUpIHsKKyAgICAgIHRoaXMuZGVidWdfb3B0aW9ucyA9IG51bGw7CisgICAgfQorICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRfdG9wb2xvZ3lfc3RhdHVzKCkgeworICAgIHJldHVybiB0aGlzLnRvcG9sb2d5X3N0YXR1czsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF90b3BvbG9neV9zdGF0dXMoU3RyaW5nIHRvcG9sb2d5X3N0YXR1cykgeworICAgIHRoaXMudG9wb2xvZ3lfc3RhdHVzID0gdG9wb2xvZ3lfc3RhdHVzOworICB9CisKKyAgcHVibGljIHZvaWQgdW5zZXRfdG9wb2xvZ3lfc3RhdHVzKCkgeworICAgIHRoaXMudG9wb2xvZ3lfc3RhdHVzID0gbnVsbDsKKyAgfQorCisgIC8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgdG9wb2xvZ3lfc3RhdHVzIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLworICBwdWJsaWMgYm9vbGVhbiBpc19zZXRfdG9wb2xvZ3lfc3RhdHVzKCkgeworICAgIHJldHVybiB0aGlzLnRvcG9sb2d5X3N0YXR1cyAhPSBudWxsOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X3RvcG9sb2d5X3N0YXR1c19pc1NldChib29sZWFuIHZhbHVlKSB7CisgICAgaWYgKCF2YWx1ZSkgeworICAgICAgdGhpcy50b3BvbG9neV9zdGF0dXMgPSBudWxsOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldEZpZWxkVmFsdWUoX0ZpZWxkcyBmaWVsZCwgT2JqZWN0IHZhbHVlKSB7CisgICAgc3dpdGNoIChmaWVsZCkgeworICAgIGNhc2UgQ09NUE9ORU5UX0lEOgorICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgdW5zZXRfY29tcG9uZW50X2lkKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzZXRfY29tcG9uZW50X2lkKChTdHJpbmcpdmFsdWUpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIENPTVBPTkVOVF9UWVBFOgorICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgdW5zZXRfY29tcG9uZW50X3R5cGUoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNldF9jb21wb25lbnRfdHlwZSgoQ29tcG9uZW50VHlwZSl2YWx1ZSk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgVE9QT0xPR1lfSUQ6CisgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICB1bnNldF90b3BvbG9neV9pZCgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2V0X3RvcG9sb2d5X2lkKChTdHJpbmcpdmFsdWUpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFRPUE9MT0dZX05BTUU6CisgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICB1bnNldF90b3BvbG9neV9uYW1lKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzZXRfdG9wb2xvZ3lfbmFtZSgoU3RyaW5nKXZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBOVU1fRVhFQ1VUT1JTOgorICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgdW5zZXRfbnVtX2V4ZWN1dG9ycygpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2V0X251bV9leGVjdXRvcnMoKEludGVnZXIpdmFsdWUpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE5VTV9UQVNLUzoKKyAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgIHVuc2V0X251bV90YXNrcygpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2V0X251bV90YXNrcygoSW50ZWdlcil2YWx1ZSk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgV0lORE9XX1RPX1NUQVRTOgorICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgdW5zZXRfd2luZG93X3RvX3N0YXRzKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzZXRfd2luZG93X3RvX3N0YXRzKChNYXA8U3RyaW5nLENvbXBvbmVudEFnZ3JlZ2F0ZVN0YXRzPil2YWx1ZSk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgR1NJRF9UT19JTlBVVF9TVEFUUzoKKyAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgIHVuc2V0X2dzaWRfdG9faW5wdXRfc3RhdHMoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNldF9nc2lkX3RvX2lucHV0X3N0YXRzKChNYXA8R2xvYmFsU3RyZWFtSWQsQ29tcG9uZW50QWdncmVnYXRlU3RhdHM+KXZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBTSURfVE9fT1VUUFVUX1NUQVRTOgorICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgdW5zZXRfc2lkX3RvX291dHB1dF9zdGF0cygpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2V0X3NpZF90b19vdXRwdXRfc3RhdHMoKE1hcDxTdHJpbmcsQ29tcG9uZW50QWdncmVnYXRlU3RhdHM+KXZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBFWEVDX1NUQVRTOgorICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgdW5zZXRfZXhlY19zdGF0cygpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2V0X2V4ZWNfc3RhdHMoKExpc3Q8RXhlY3V0b3JBZ2dyZWdhdGVTdGF0cz4pdmFsdWUpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVSUk9SUzoKKyAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgIHVuc2V0X2Vycm9ycygpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2V0X2Vycm9ycygoTGlzdDxFcnJvckluZm8+KXZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBFVkVOVExPR19IT1NUOgorICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgdW5zZXRfZXZlbnRsb2dfaG9zdCgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2V0X2V2ZW50bG9nX2hvc3QoKFN0cmluZyl2YWx1ZSk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgRVZFTlRMT0dfUE9SVDoKKyAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgIHVuc2V0X2V2ZW50bG9nX3BvcnQoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNldF9ldmVudGxvZ19wb3J0KChJbnRlZ2VyKXZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBERUJVR19PUFRJT05TOgorICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgdW5zZXRfZGVidWdfb3B0aW9ucygpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2V0X2RlYnVnX29wdGlvbnMoKERlYnVnT3B0aW9ucyl2YWx1ZSk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgVE9QT0xPR1lfU1RBVFVTOgorICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgdW5zZXRfdG9wb2xvZ3lfc3RhdHVzKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzZXRfdG9wb2xvZ3lfc3RhdHVzKChTdHJpbmcpdmFsdWUpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICB9CisgIH0KKworICBwdWJsaWMgT2JqZWN0IGdldEZpZWxkVmFsdWUoX0ZpZWxkcyBmaWVsZCkgeworICAgIHN3aXRjaCAoZmllbGQpIHsKKyAgICBjYXNlIENPTVBPTkVOVF9JRDoKKyAgICAgIHJldHVybiBnZXRfY29tcG9uZW50X2lkKCk7CisKKyAgICBjYXNlIENPTVBPTkVOVF9UWVBFOgorICAgICAgcmV0dXJuIGdldF9jb21wb25lbnRfdHlwZSgpOworCisgICAgY2FzZSBUT1BPTE9HWV9JRDoKKyAgICAgIHJldHVybiBnZXRfdG9wb2xvZ3lfaWQoKTsKKworICAgIGNhc2UgVE9QT0xPR1lfTkFNRToKKyAgICAgIHJldHVybiBnZXRfdG9wb2xvZ3lfbmFtZSgpOworCisgICAgY2FzZSBOVU1fRVhFQ1VUT1JTOgorICAgICAgcmV0dXJuIGdldF9udW1fZXhlY3V0b3JzKCk7CisKKyAgICBjYXNlIE5VTV9UQVNLUzoKKyAgICAgIHJldHVybiBnZXRfbnVtX3Rhc2tzKCk7CisKKyAgICBjYXNlIFdJTkRPV19UT19TVEFUUzoKKyAgICAgIHJldHVybiBnZXRfd2luZG93X3RvX3N0YXRzKCk7CisKKyAgICBjYXNlIEdTSURfVE9fSU5QVVRfU1RBVFM6CisgICAgICByZXR1cm4gZ2V0X2dzaWRfdG9faW5wdXRfc3RhdHMoKTsKKworICAgIGNhc2UgU0lEX1RPX09VVFBVVF9TVEFUUzoKKyAgICAgIHJldHVybiBnZXRfc2lkX3RvX291dHB1dF9zdGF0cygpOworCisgICAgY2FzZSBFWEVDX1NUQVRTOgorICAgICAgcmV0dXJuIGdldF9leGVjX3N0YXRzKCk7CisKKyAgICBjYXNlIEVSUk9SUzoKKyAgICAgIHJldHVybiBnZXRfZXJyb3JzKCk7CisKKyAgICBjYXNlIEVWRU5UTE9HX0hPU1Q6CisgICAgICByZXR1cm4gZ2V0X2V2ZW50bG9nX2hvc3QoKTsKKworICAgIGNhc2UgRVZFTlRMT0dfUE9SVDoKKyAgICAgIHJldHVybiBnZXRfZXZlbnRsb2dfcG9ydCgpOworCisgICAgY2FzZSBERUJVR19PUFRJT05TOgorICAgICAgcmV0dXJuIGdldF9kZWJ1Z19vcHRpb25zKCk7CisKKyAgICBjYXNlIFRPUE9MT0dZX1NUQVRVUzoKKyAgICAgIHJldHVybiBnZXRfdG9wb2xvZ3lfc3RhdHVzKCk7CisKKyAgICB9CisgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICB9CisKKyAgLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBjb3JyZXNwb25kaW5nIHRvIGZpZWxkSUQgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgIHB1YmxpYyBib29sZWFuIGlzU2V0KF9GaWVsZHMgZmllbGQpIHsKKyAgICBpZiAoZmllbGQgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHN3aXRjaCAoZmllbGQpIHsKKyAgICBjYXNlIENPTVBPTkVOVF9JRDoKKyAgICAgIHJldHVybiBpc19zZXRfY29tcG9uZW50X2lkKCk7CisgICAgY2FzZSBDT01QT05FTlRfVFlQRToKKyAgICAgIHJldHVybiBpc19zZXRfY29tcG9uZW50X3R5cGUoKTsKKyAgICBjYXNlIFRPUE9MT0dZX0lEOgorICAgICAgcmV0dXJuIGlzX3NldF90b3BvbG9neV9pZCgpOworICAgIGNhc2UgVE9QT0xPR1lfTkFNRToKKyAgICAgIHJldHVybiBpc19zZXRfdG9wb2xvZ3lfbmFtZSgpOworICAgIGNhc2UgTlVNX0VYRUNVVE9SUzoKKyAgICAgIHJldHVybiBpc19zZXRfbnVtX2V4ZWN1dG9ycygpOworICAgIGNhc2UgTlVNX1RBU0tTOgorICAgICAgcmV0dXJuIGlzX3NldF9udW1fdGFza3MoKTsKKyAgICBjYXNlIFdJTkRPV19UT19TVEFUUzoKKyAgICAgIHJldHVybiBpc19zZXRfd2luZG93X3RvX3N0YXRzKCk7CisgICAgY2FzZSBHU0lEX1RPX0lOUFVUX1NUQVRTOgorICAgICAgcmV0dXJuIGlzX3NldF9nc2lkX3RvX2lucHV0X3N0YXRzKCk7CisgICAgY2FzZSBTSURfVE9fT1VUUFVUX1NUQVRTOgorICAgICAgcmV0dXJuIGlzX3NldF9zaWRfdG9fb3V0cHV0X3N0YXRzKCk7CisgICAgY2FzZSBFWEVDX1NUQVRTOgorICAgICAgcmV0dXJuIGlzX3NldF9leGVjX3N0YXRzKCk7CisgICAgY2FzZSBFUlJPUlM6CisgICAgICByZXR1cm4gaXNfc2V0X2Vycm9ycygpOworICAgIGNhc2UgRVZFTlRMT0dfSE9TVDoKKyAgICAgIHJldHVybiBpc19zZXRfZXZlbnRsb2dfaG9zdCgpOworICAgIGNhc2UgRVZFTlRMT0dfUE9SVDoKKyAgICAgIHJldHVybiBpc19zZXRfZXZlbnRsb2dfcG9ydCgpOworICAgIGNhc2UgREVCVUdfT1BUSU9OUzoKKyAgICAgIHJldHVybiBpc19zZXRfZGVidWdfb3B0aW9ucygpOworICAgIGNhc2UgVE9QT0xPR1lfU1RBVFVTOgorICAgICAgcmV0dXJuIGlzX3NldF90b3BvbG9neV9zdGF0dXMoKTsKKyAgICB9CisgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgdGhhdCkgeworICAgIGlmICh0aGF0ID09IG51bGwpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKHRoYXQgaW5zdGFuY2VvZiBDb21wb25lbnRQYWdlSW5mbykKKyAgICAgIHJldHVybiB0aGlzLmVxdWFscygoQ29tcG9uZW50UGFnZUluZm8pdGhhdCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gZXF1YWxzKENvbXBvbmVudFBhZ2VJbmZvIHRoYXQpIHsKKyAgICBpZiAodGhhdCA9PSBudWxsKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgYm9vbGVhbiB0aGlzX3ByZXNlbnRfY29tcG9uZW50X2lkID0gdHJ1ZSAmJiB0aGlzLmlzX3NldF9jb21wb25lbnRfaWQoKTsKKyAgICBib29sZWFuIHRoYXRfcHJlc2VudF9jb21wb25lbnRfaWQgPSB0cnVlICYmIHRoYXQuaXNfc2V0X2NvbXBvbmVudF9pZCgpOworICAgIGlmICh0aGlzX3ByZXNlbnRfY29tcG9uZW50X2lkIHx8IHRoYXRfcHJlc2VudF9jb21wb25lbnRfaWQpIHsKKyAgICAgIGlmICghKHRoaXNfcHJlc2VudF9jb21wb25lbnRfaWQgJiYgdGhhdF9wcmVzZW50X2NvbXBvbmVudF9pZCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGlmICghdGhpcy5jb21wb25lbnRfaWQuZXF1YWxzKHRoYXQuY29tcG9uZW50X2lkKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2xlYW4gdGhpc19wcmVzZW50X2NvbXBvbmVudF90eXBlID0gdHJ1ZSAmJiB0aGlzLmlzX3NldF9jb21wb25lbnRfdHlwZSgpOworICAgIGJvb2xlYW4gdGhhdF9wcmVzZW50X2NvbXBvbmVudF90eXBlID0gdHJ1ZSAmJiB0aGF0LmlzX3NldF9jb21wb25lbnRfdHlwZSgpOworICAgIGlmICh0aGlzX3ByZXNlbnRfY29tcG9uZW50X3R5cGUgfHwgdGhhdF9wcmVzZW50X2NvbXBvbmVudF90eXBlKSB7CisgICAgICBpZiAoISh0aGlzX3ByZXNlbnRfY29tcG9uZW50X3R5cGUgJiYgdGhhdF9wcmVzZW50X2NvbXBvbmVudF90eXBlKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKCF0aGlzLmNvbXBvbmVudF90eXBlLmVxdWFscyh0aGF0LmNvbXBvbmVudF90eXBlKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2xlYW4gdGhpc19wcmVzZW50X3RvcG9sb2d5X2lkID0gdHJ1ZSAmJiB0aGlzLmlzX3NldF90b3BvbG9neV9pZCgpOworICAgIGJvb2xlYW4gdGhhdF9wcmVzZW50X3RvcG9sb2d5X2lkID0gdHJ1ZSAmJiB0aGF0LmlzX3NldF90b3BvbG9neV9pZCgpOworICAgIGlmICh0aGlzX3ByZXNlbnRfdG9wb2xvZ3lfaWQgfHwgdGhhdF9wcmVzZW50X3RvcG9sb2d5X2lkKSB7CisgICAgICBpZiAoISh0aGlzX3ByZXNlbnRfdG9wb2xvZ3lfaWQgJiYgdGhhdF9wcmVzZW50X3RvcG9sb2d5X2lkKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKCF0aGlzLnRvcG9sb2d5X2lkLmVxdWFscyh0aGF0LnRvcG9sb2d5X2lkKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2xlYW4gdGhpc19wcmVzZW50X3RvcG9sb2d5X25hbWUgPSB0cnVlICYmIHRoaXMuaXNfc2V0X3RvcG9sb2d5X25hbWUoKTsKKyAgICBib29sZWFuIHRoYXRfcHJlc2VudF90b3BvbG9neV9uYW1lID0gdHJ1ZSAmJiB0aGF0LmlzX3NldF90b3BvbG9neV9uYW1lKCk7CisgICAgaWYgKHRoaXNfcHJlc2VudF90b3BvbG9neV9uYW1lIHx8IHRoYXRfcHJlc2VudF90b3BvbG9neV9uYW1lKSB7CisgICAgICBpZiAoISh0aGlzX3ByZXNlbnRfdG9wb2xvZ3lfbmFtZSAmJiB0aGF0X3ByZXNlbnRfdG9wb2xvZ3lfbmFtZSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGlmICghdGhpcy50b3BvbG9neV9uYW1lLmVxdWFscyh0aGF0LnRvcG9sb2d5X25hbWUpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbGVhbiB0aGlzX3ByZXNlbnRfbnVtX2V4ZWN1dG9ycyA9IHRydWUgJiYgdGhpcy5pc19zZXRfbnVtX2V4ZWN1dG9ycygpOworICAgIGJvb2xlYW4gdGhhdF9wcmVzZW50X251bV9leGVjdXRvcnMgPSB0cnVlICYmIHRoYXQuaXNfc2V0X251bV9leGVjdXRvcnMoKTsKKyAgICBpZiAodGhpc19wcmVzZW50X251bV9leGVjdXRvcnMgfHwgdGhhdF9wcmVzZW50X251bV9leGVjdXRvcnMpIHsKKyAgICAgIGlmICghKHRoaXNfcHJlc2VudF9udW1fZXhlY3V0b3JzICYmIHRoYXRfcHJlc2VudF9udW1fZXhlY3V0b3JzKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKHRoaXMubnVtX2V4ZWN1dG9ycyAhPSB0aGF0Lm51bV9leGVjdXRvcnMpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sZWFuIHRoaXNfcHJlc2VudF9udW1fdGFza3MgPSB0cnVlICYmIHRoaXMuaXNfc2V0X251bV90YXNrcygpOworICAgIGJvb2xlYW4gdGhhdF9wcmVzZW50X251bV90YXNrcyA9IHRydWUgJiYgdGhhdC5pc19zZXRfbnVtX3Rhc2tzKCk7CisgICAgaWYgKHRoaXNfcHJlc2VudF9udW1fdGFza3MgfHwgdGhhdF9wcmVzZW50X251bV90YXNrcykgeworICAgICAgaWYgKCEodGhpc19wcmVzZW50X251bV90YXNrcyAmJiB0aGF0X3ByZXNlbnRfbnVtX3Rhc2tzKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKHRoaXMubnVtX3Rhc2tzICE9IHRoYXQubnVtX3Rhc2tzKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbGVhbiB0aGlzX3ByZXNlbnRfd2luZG93X3RvX3N0YXRzID0gdHJ1ZSAmJiB0aGlzLmlzX3NldF93aW5kb3dfdG9fc3RhdHMoKTsKKyAgICBib29sZWFuIHRoYXRfcHJlc2VudF93aW5kb3dfdG9fc3RhdHMgPSB0cnVlICYmIHRoYXQuaXNfc2V0X3dpbmRvd190b19zdGF0cygpOworICAgIGlmICh0aGlzX3ByZXNlbnRfd2luZG93X3RvX3N0YXRzIHx8IHRoYXRfcHJlc2VudF93aW5kb3dfdG9fc3RhdHMpIHsKKyAgICAgIGlmICghKHRoaXNfcHJlc2VudF93aW5kb3dfdG9fc3RhdHMgJiYgdGhhdF9wcmVzZW50X3dpbmRvd190b19zdGF0cykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGlmICghdGhpcy53aW5kb3dfdG9fc3RhdHMuZXF1YWxzKHRoYXQud2luZG93X3RvX3N0YXRzKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2xlYW4gdGhpc19wcmVzZW50X2dzaWRfdG9faW5wdXRfc3RhdHMgPSB0cnVlICYmIHRoaXMuaXNfc2V0X2dzaWRfdG9faW5wdXRfc3RhdHMoKTsKKyAgICBib29sZWFuIHRoYXRfcHJlc2VudF9nc2lkX3RvX2lucHV0X3N0YXRzID0gdHJ1ZSAmJiB0aGF0LmlzX3NldF9nc2lkX3RvX2lucHV0X3N0YXRzKCk7CisgICAgaWYgKHRoaXNfcHJlc2VudF9nc2lkX3RvX2lucHV0X3N0YXRzIHx8IHRoYXRfcHJlc2VudF9nc2lkX3RvX2lucHV0X3N0YXRzKSB7CisgICAgICBpZiAoISh0aGlzX3ByZXNlbnRfZ3NpZF90b19pbnB1dF9zdGF0cyAmJiB0aGF0X3ByZXNlbnRfZ3NpZF90b19pbnB1dF9zdGF0cykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGlmICghdGhpcy5nc2lkX3RvX2lucHV0X3N0YXRzLmVxdWFscyh0aGF0LmdzaWRfdG9faW5wdXRfc3RhdHMpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbGVhbiB0aGlzX3ByZXNlbnRfc2lkX3RvX291dHB1dF9zdGF0cyA9IHRydWUgJiYgdGhpcy5pc19zZXRfc2lkX3RvX291dHB1dF9zdGF0cygpOworICAgIGJvb2xlYW4gdGhhdF9wcmVzZW50X3NpZF90b19vdXRwdXRfc3RhdHMgPSB0cnVlICYmIHRoYXQuaXNfc2V0X3NpZF90b19vdXRwdXRfc3RhdHMoKTsKKyAgICBpZiAodGhpc19wcmVzZW50X3NpZF90b19vdXRwdXRfc3RhdHMgfHwgdGhhdF9wcmVzZW50X3NpZF90b19vdXRwdXRfc3RhdHMpIHsKKyAgICAgIGlmICghKHRoaXNfcHJlc2VudF9zaWRfdG9fb3V0cHV0X3N0YXRzICYmIHRoYXRfcHJlc2VudF9zaWRfdG9fb3V0cHV0X3N0YXRzKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKCF0aGlzLnNpZF90b19vdXRwdXRfc3RhdHMuZXF1YWxzKHRoYXQuc2lkX3RvX291dHB1dF9zdGF0cykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sZWFuIHRoaXNfcHJlc2VudF9leGVjX3N0YXRzID0gdHJ1ZSAmJiB0aGlzLmlzX3NldF9leGVjX3N0YXRzKCk7CisgICAgYm9vbGVhbiB0aGF0X3ByZXNlbnRfZXhlY19zdGF0cyA9IHRydWUgJiYgdGhhdC5pc19zZXRfZXhlY19zdGF0cygpOworICAgIGlmICh0aGlzX3ByZXNlbnRfZXhlY19zdGF0cyB8fCB0aGF0X3ByZXNlbnRfZXhlY19zdGF0cykgeworICAgICAgaWYgKCEodGhpc19wcmVzZW50X2V4ZWNfc3RhdHMgJiYgdGhhdF9wcmVzZW50X2V4ZWNfc3RhdHMpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBpZiAoIXRoaXMuZXhlY19zdGF0cy5lcXVhbHModGhhdC5leGVjX3N0YXRzKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2xlYW4gdGhpc19wcmVzZW50X2Vycm9ycyA9IHRydWUgJiYgdGhpcy5pc19zZXRfZXJyb3JzKCk7CisgICAgYm9vbGVhbiB0aGF0X3ByZXNlbnRfZXJyb3JzID0gdHJ1ZSAmJiB0aGF0LmlzX3NldF9lcnJvcnMoKTsKKyAgICBpZiAodGhpc19wcmVzZW50X2Vycm9ycyB8fCB0aGF0X3ByZXNlbnRfZXJyb3JzKSB7CisgICAgICBpZiAoISh0aGlzX3ByZXNlbnRfZXJyb3JzICYmIHRoYXRfcHJlc2VudF9lcnJvcnMpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBpZiAoIXRoaXMuZXJyb3JzLmVxdWFscyh0aGF0LmVycm9ycykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sZWFuIHRoaXNfcHJlc2VudF9ldmVudGxvZ19ob3N0ID0gdHJ1ZSAmJiB0aGlzLmlzX3NldF9ldmVudGxvZ19ob3N0KCk7CisgICAgYm9vbGVhbiB0aGF0X3ByZXNlbnRfZXZlbnRsb2dfaG9zdCA9IHRydWUgJiYgdGhhdC5pc19zZXRfZXZlbnRsb2dfaG9zdCgpOworICAgIGlmICh0aGlzX3ByZXNlbnRfZXZlbnRsb2dfaG9zdCB8fCB0aGF0X3ByZXNlbnRfZXZlbnRsb2dfaG9zdCkgeworICAgICAgaWYgKCEodGhpc19wcmVzZW50X2V2ZW50bG9nX2hvc3QgJiYgdGhhdF9wcmVzZW50X2V2ZW50bG9nX2hvc3QpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBpZiAoIXRoaXMuZXZlbnRsb2dfaG9zdC5lcXVhbHModGhhdC5ldmVudGxvZ19ob3N0KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2xlYW4gdGhpc19wcmVzZW50X2V2ZW50bG9nX3BvcnQgPSB0cnVlICYmIHRoaXMuaXNfc2V0X2V2ZW50bG9nX3BvcnQoKTsKKyAgICBib29sZWFuIHRoYXRfcHJlc2VudF9ldmVudGxvZ19wb3J0ID0gdHJ1ZSAmJiB0aGF0LmlzX3NldF9ldmVudGxvZ19wb3J0KCk7CisgICAgaWYgKHRoaXNfcHJlc2VudF9ldmVudGxvZ19wb3J0IHx8IHRoYXRfcHJlc2VudF9ldmVudGxvZ19wb3J0KSB7CisgICAgICBpZiAoISh0aGlzX3ByZXNlbnRfZXZlbnRsb2dfcG9ydCAmJiB0aGF0X3ByZXNlbnRfZXZlbnRsb2dfcG9ydCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGlmICh0aGlzLmV2ZW50bG9nX3BvcnQgIT0gdGhhdC5ldmVudGxvZ19wb3J0KQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbGVhbiB0aGlzX3ByZXNlbnRfZGVidWdfb3B0aW9ucyA9IHRydWUgJiYgdGhpcy5pc19zZXRfZGVidWdfb3B0aW9ucygpOworICAgIGJvb2xlYW4gdGhhdF9wcmVzZW50X2RlYnVnX29wdGlvbnMgPSB0cnVlICYmIHRoYXQuaXNfc2V0X2RlYnVnX29wdGlvbnMoKTsKKyAgICBpZiAodGhpc19wcmVzZW50X2RlYnVnX29wdGlvbnMgfHwgdGhhdF9wcmVzZW50X2RlYnVnX29wdGlvbnMpIHsKKyAgICAgIGlmICghKHRoaXNfcHJlc2VudF9kZWJ1Z19vcHRpb25zICYmIHRoYXRfcHJlc2VudF9kZWJ1Z19vcHRpb25zKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKCF0aGlzLmRlYnVnX29wdGlvbnMuZXF1YWxzKHRoYXQuZGVidWdfb3B0aW9ucykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sZWFuIHRoaXNfcHJlc2VudF90b3BvbG9neV9zdGF0dXMgPSB0cnVlICYmIHRoaXMuaXNfc2V0X3RvcG9sb2d5X3N0YXR1cygpOworICAgIGJvb2xlYW4gdGhhdF9wcmVzZW50X3RvcG9sb2d5X3N0YXR1cyA9IHRydWUgJiYgdGhhdC5pc19zZXRfdG9wb2xvZ3lfc3RhdHVzKCk7CisgICAgaWYgKHRoaXNfcHJlc2VudF90b3BvbG9neV9zdGF0dXMgfHwgdGhhdF9wcmVzZW50X3RvcG9sb2d5X3N0YXR1cykgeworICAgICAgaWYgKCEodGhpc19wcmVzZW50X3RvcG9sb2d5X3N0YXR1cyAmJiB0aGF0X3ByZXNlbnRfdG9wb2xvZ3lfc3RhdHVzKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKCF0aGlzLnRvcG9sb2d5X3N0YXR1cy5lcXVhbHModGhhdC50b3BvbG9neV9zdGF0dXMpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICBMaXN0PE9iamVjdD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOworCisgICAgYm9vbGVhbiBwcmVzZW50X2NvbXBvbmVudF9pZCA9IHRydWUgJiYgKGlzX3NldF9jb21wb25lbnRfaWQoKSk7CisgICAgbGlzdC5hZGQocHJlc2VudF9jb21wb25lbnRfaWQpOworICAgIGlmIChwcmVzZW50X2NvbXBvbmVudF9pZCkKKyAgICAgIGxpc3QuYWRkKGNvbXBvbmVudF9pZCk7CisKKyAgICBib29sZWFuIHByZXNlbnRfY29tcG9uZW50X3R5cGUgPSB0cnVlICYmIChpc19zZXRfY29tcG9uZW50X3R5cGUoKSk7CisgICAgbGlzdC5hZGQocHJlc2VudF9jb21wb25lbnRfdHlwZSk7CisgICAgaWYgKHByZXNlbnRfY29tcG9uZW50X3R5cGUpCisgICAgICBsaXN0LmFkZChjb21wb25lbnRfdHlwZS5nZXRWYWx1ZSgpKTsKKworICAgIGJvb2xlYW4gcHJlc2VudF90b3BvbG9neV9pZCA9IHRydWUgJiYgKGlzX3NldF90b3BvbG9neV9pZCgpKTsKKyAgICBsaXN0LmFkZChwcmVzZW50X3RvcG9sb2d5X2lkKTsKKyAgICBpZiAocHJlc2VudF90b3BvbG9neV9pZCkKKyAgICAgIGxpc3QuYWRkKHRvcG9sb2d5X2lkKTsKKworICAgIGJvb2xlYW4gcHJlc2VudF90b3BvbG9neV9uYW1lID0gdHJ1ZSAmJiAoaXNfc2V0X3RvcG9sb2d5X25hbWUoKSk7CisgICAgbGlzdC5hZGQocHJlc2VudF90b3BvbG9neV9uYW1lKTsKKyAgICBpZiAocHJlc2VudF90b3BvbG9neV9uYW1lKQorICAgICAgbGlzdC5hZGQodG9wb2xvZ3lfbmFtZSk7CisKKyAgICBib29sZWFuIHByZXNlbnRfbnVtX2V4ZWN1dG9ycyA9IHRydWUgJiYgKGlzX3NldF9udW1fZXhlY3V0b3JzKCkpOworICAgIGxpc3QuYWRkKHByZXNlbnRfbnVtX2V4ZWN1dG9ycyk7CisgICAgaWYgKHByZXNlbnRfbnVtX2V4ZWN1dG9ycykKKyAgICAgIGxpc3QuYWRkKG51bV9leGVjdXRvcnMpOworCisgICAgYm9vbGVhbiBwcmVzZW50X251bV90YXNrcyA9IHRydWUgJiYgKGlzX3NldF9udW1fdGFza3MoKSk7CisgICAgbGlzdC5hZGQocHJlc2VudF9udW1fdGFza3MpOworICAgIGlmIChwcmVzZW50X251bV90YXNrcykKKyAgICAgIGxpc3QuYWRkKG51bV90YXNrcyk7CisKKyAgICBib29sZWFuIHByZXNlbnRfd2luZG93X3RvX3N0YXRzID0gdHJ1ZSAmJiAoaXNfc2V0X3dpbmRvd190b19zdGF0cygpKTsKKyAgICBsaXN0LmFkZChwcmVzZW50X3dpbmRvd190b19zdGF0cyk7CisgICAgaWYgKHByZXNlbnRfd2luZG93X3RvX3N0YXRzKQorICAgICAgbGlzdC5hZGQod2luZG93X3RvX3N0YXRzKTsKKworICAgIGJvb2xlYW4gcHJlc2VudF9nc2lkX3RvX2lucHV0X3N0YXRzID0gdHJ1ZSAmJiAoaXNfc2V0X2dzaWRfdG9faW5wdXRfc3RhdHMoKSk7CisgICAgbGlzdC5hZGQocHJlc2VudF9nc2lkX3RvX2lucHV0X3N0YXRzKTsKKyAgICBpZiAocHJlc2VudF9nc2lkX3RvX2lucHV0X3N0YXRzKQorICAgICAgbGlzdC5hZGQoZ3NpZF90b19pbnB1dF9zdGF0cyk7CisKKyAgICBib29sZWFuIHByZXNlbnRfc2lkX3RvX291dHB1dF9zdGF0cyA9IHRydWUgJiYgKGlzX3NldF9zaWRfdG9fb3V0cHV0X3N0YXRzKCkpOworICAgIGxpc3QuYWRkKHByZXNlbnRfc2lkX3RvX291dHB1dF9zdGF0cyk7CisgICAgaWYgKHByZXNlbnRfc2lkX3RvX291dHB1dF9zdGF0cykKKyAgICAgIGxpc3QuYWRkKHNpZF90b19vdXRwdXRfc3RhdHMpOworCisgICAgYm9vbGVhbiBwcmVzZW50X2V4ZWNfc3RhdHMgPSB0cnVlICYmIChpc19zZXRfZXhlY19zdGF0cygpKTsKKyAgICBsaXN0LmFkZChwcmVzZW50X2V4ZWNfc3RhdHMpOworICAgIGlmIChwcmVzZW50X2V4ZWNfc3RhdHMpCisgICAgICBsaXN0LmFkZChleGVjX3N0YXRzKTsKKworICAgIGJvb2xlYW4gcHJlc2VudF9lcnJvcnMgPSB0cnVlICYmIChpc19zZXRfZXJyb3JzKCkpOworICAgIGxpc3QuYWRkKHByZXNlbnRfZXJyb3JzKTsKKyAgICBpZiAocHJlc2VudF9lcnJvcnMpCisgICAgICBsaXN0LmFkZChlcnJvcnMpOworCisgICAgYm9vbGVhbiBwcmVzZW50X2V2ZW50bG9nX2hvc3QgPSB0cnVlICYmIChpc19zZXRfZXZlbnRsb2dfaG9zdCgpKTsKKyAgICBsaXN0LmFkZChwcmVzZW50X2V2ZW50bG9nX2hvc3QpOworICAgIGlmIChwcmVzZW50X2V2ZW50bG9nX2hvc3QpCisgICAgICBsaXN0LmFkZChldmVudGxvZ19ob3N0KTsKKworICAgIGJvb2xlYW4gcHJlc2VudF9ldmVudGxvZ19wb3J0ID0gdHJ1ZSAmJiAoaXNfc2V0X2V2ZW50bG9nX3BvcnQoKSk7CisgICAgbGlzdC5hZGQocHJlc2VudF9ldmVudGxvZ19wb3J0KTsKKyAgICBpZiAocHJlc2VudF9ldmVudGxvZ19wb3J0KQorICAgICAgbGlzdC5hZGQoZXZlbnRsb2dfcG9ydCk7CisKKyAgICBib29sZWFuIHByZXNlbnRfZGVidWdfb3B0aW9ucyA9IHRydWUgJiYgKGlzX3NldF9kZWJ1Z19vcHRpb25zKCkpOworICAgIGxpc3QuYWRkKHByZXNlbnRfZGVidWdfb3B0aW9ucyk7CisgICAgaWYgKHByZXNlbnRfZGVidWdfb3B0aW9ucykKKyAgICAgIGxpc3QuYWRkKGRlYnVnX29wdGlvbnMpOworCisgICAgYm9vbGVhbiBwcmVzZW50X3RvcG9sb2d5X3N0YXR1cyA9IHRydWUgJiYgKGlzX3NldF90b3BvbG9neV9zdGF0dXMoKSk7CisgICAgbGlzdC5hZGQocHJlc2VudF90b3BvbG9neV9zdGF0dXMpOworICAgIGlmIChwcmVzZW50X3RvcG9sb2d5X3N0YXR1cykKKyAgICAgIGxpc3QuYWRkKHRvcG9sb2d5X3N0YXR1cyk7CisKKyAgICByZXR1cm4gbGlzdC5oYXNoQ29kZSgpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgY29tcGFyZVRvKENvbXBvbmVudFBhZ2VJbmZvIG90aGVyKSB7CisgICAgaWYgKCFnZXRDbGFzcygpLmVxdWFscyhvdGhlci5nZXRDbGFzcygpKSkgeworICAgICAgcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpLmNvbXBhcmVUbyhvdGhlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgfQorCisgICAgaW50IGxhc3RDb21wYXJpc29uID0gMDsKKworICAgIGxhc3RDb21wYXJpc29uID0gQm9vbGVhbi52YWx1ZU9mKGlzX3NldF9jb21wb25lbnRfaWQoKSkuY29tcGFyZVRvKG90aGVyLmlzX3NldF9jb21wb25lbnRfaWQoKSk7CisgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICB9CisgICAgaWYgKGlzX3NldF9jb21wb25lbnRfaWQoKSkgeworICAgICAgbGFzdENvbXBhcmlzb24gPSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy5jb21wb25lbnRfaWQsIG90aGVyLmNvbXBvbmVudF9pZCk7CisgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICB9CisgICAgfQorICAgIGxhc3RDb21wYXJpc29uID0gQm9vbGVhbi52YWx1ZU9mKGlzX3NldF9jb21wb25lbnRfdHlwZSgpKS5jb21wYXJlVG8ob3RoZXIuaXNfc2V0X2NvbXBvbmVudF90eXBlKCkpOworICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgfQorICAgIGlmIChpc19zZXRfY29tcG9uZW50X3R5cGUoKSkgeworICAgICAgbGFzdENvbXBhcmlzb24gPSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy5jb21wb25lbnRfdHlwZSwgb3RoZXIuY29tcG9uZW50X3R5cGUpOworICAgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgICAgfQorICAgIH0KKyAgICBsYXN0Q29tcGFyaXNvbiA9IEJvb2xlYW4udmFsdWVPZihpc19zZXRfdG9wb2xvZ3lfaWQoKSkuY29tcGFyZVRvKG90aGVyLmlzX3NldF90b3BvbG9neV9pZCgpKTsKKyAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgIH0KKyAgICBpZiAoaXNfc2V0X3RvcG9sb2d5X2lkKCkpIHsKKyAgICAgIGxhc3RDb21wYXJpc29uID0gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29tcGFyZVRvKHRoaXMudG9wb2xvZ3lfaWQsIG90aGVyLnRvcG9sb2d5X2lkKTsKKyAgICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICAgIH0KKyAgICB9CisgICAgbGFzdENvbXBhcmlzb24gPSBCb29sZWFuLnZhbHVlT2YoaXNfc2V0X3RvcG9sb2d5X25hbWUoKSkuY29tcGFyZVRvKG90aGVyLmlzX3NldF90b3BvbG9neV9uYW1lKCkpOworICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgfQorICAgIGlmIChpc19zZXRfdG9wb2xvZ3lfbmFtZSgpKSB7CisgICAgICBsYXN0Q29tcGFyaXNvbiA9IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvbXBhcmVUbyh0aGlzLnRvcG9sb2d5X25hbWUsIG90aGVyLnRvcG9sb2d5X25hbWUpOworICAgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgICAgfQorICAgIH0KKyAgICBsYXN0Q29tcGFyaXNvbiA9IEJvb2xlYW4udmFsdWVPZihpc19zZXRfbnVtX2V4ZWN1dG9ycygpKS5jb21wYXJlVG8ob3RoZXIuaXNfc2V0X251bV9leGVjdXRvcnMoKSk7CisgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICB9CisgICAgaWYgKGlzX3NldF9udW1fZXhlY3V0b3JzKCkpIHsKKyAgICAgIGxhc3RDb21wYXJpc29uID0gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29tcGFyZVRvKHRoaXMubnVtX2V4ZWN1dG9ycywgb3RoZXIubnVtX2V4ZWN1dG9ycyk7CisgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICB9CisgICAgfQorICAgIGxhc3RDb21wYXJpc29uID0gQm9vbGVhbi52YWx1ZU9mKGlzX3NldF9udW1fdGFza3MoKSkuY29tcGFyZVRvKG90aGVyLmlzX3NldF9udW1fdGFza3MoKSk7CisgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICB9CisgICAgaWYgKGlzX3NldF9udW1fdGFza3MoKSkgeworICAgICAgbGFzdENvbXBhcmlzb24gPSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy5udW1fdGFza3MsIG90aGVyLm51bV90YXNrcyk7CisgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICB9CisgICAgfQorICAgIGxhc3RDb21wYXJpc29uID0gQm9vbGVhbi52YWx1ZU9mKGlzX3NldF93aW5kb3dfdG9fc3RhdHMoKSkuY29tcGFyZVRvKG90aGVyLmlzX3NldF93aW5kb3dfdG9fc3RhdHMoKSk7CisgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICB9CisgICAgaWYgKGlzX3NldF93aW5kb3dfdG9fc3RhdHMoKSkgeworICAgICAgbGFzdENvbXBhcmlzb24gPSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy53aW5kb3dfdG9fc3RhdHMsIG90aGVyLndpbmRvd190b19zdGF0cyk7CisgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICB9CisgICAgfQorICAgIGxhc3RDb21wYXJpc29uID0gQm9vbGVhbi52YWx1ZU9mKGlzX3NldF9nc2lkX3RvX2lucHV0X3N0YXRzKCkpLmNvbXBhcmVUbyhvdGhlci5pc19zZXRfZ3NpZF90b19pbnB1dF9zdGF0cygpKTsKKyAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgIH0KKyAgICBpZiAoaXNfc2V0X2dzaWRfdG9faW5wdXRfc3RhdHMoKSkgeworICAgICAgbGFzdENvbXBhcmlzb24gPSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy5nc2lkX3RvX2lucHV0X3N0YXRzLCBvdGhlci5nc2lkX3RvX2lucHV0X3N0YXRzKTsKKyAgICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICAgIH0KKyAgICB9CisgICAgbGFzdENvbXBhcmlzb24gPSBCb29sZWFuLnZhbHVlT2YoaXNfc2V0X3NpZF90b19vdXRwdXRfc3RhdHMoKSkuY29tcGFyZVRvKG90aGVyLmlzX3NldF9zaWRfdG9fb3V0cHV0X3N0YXRzKCkpOworICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgfQorICAgIGlmIChpc19zZXRfc2lkX3RvX291dHB1dF9zdGF0cygpKSB7CisgICAgICBsYXN0Q29tcGFyaXNvbiA9IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvbXBhcmVUbyh0aGlzLnNpZF90b19vdXRwdXRfc3RhdHMsIG90aGVyLnNpZF90b19vdXRwdXRfc3RhdHMpOworICAgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgICAgfQorICAgIH0KKyAgICBsYXN0Q29tcGFyaXNvbiA9IEJvb2xlYW4udmFsdWVPZihpc19zZXRfZXhlY19zdGF0cygpKS5jb21wYXJlVG8ob3RoZXIuaXNfc2V0X2V4ZWNfc3RhdHMoKSk7CisgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICB9CisgICAgaWYgKGlzX3NldF9leGVjX3N0YXRzKCkpIHsKKyAgICAgIGxhc3RDb21wYXJpc29uID0gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29tcGFyZVRvKHRoaXMuZXhlY19zdGF0cywgb3RoZXIuZXhlY19zdGF0cyk7CisgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICB9CisgICAgfQorICAgIGxhc3RDb21wYXJpc29uID0gQm9vbGVhbi52YWx1ZU9mKGlzX3NldF9lcnJvcnMoKSkuY29tcGFyZVRvKG90aGVyLmlzX3NldF9lcnJvcnMoKSk7CisgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICB9CisgICAgaWYgKGlzX3NldF9lcnJvcnMoKSkgeworICAgICAgbGFzdENvbXBhcmlzb24gPSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy5lcnJvcnMsIG90aGVyLmVycm9ycyk7CisgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICB9CisgICAgfQorICAgIGxhc3RDb21wYXJpc29uID0gQm9vbGVhbi52YWx1ZU9mKGlzX3NldF9ldmVudGxvZ19ob3N0KCkpLmNvbXBhcmVUbyhvdGhlci5pc19zZXRfZXZlbnRsb2dfaG9zdCgpKTsKKyAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgIH0KKyAgICBpZiAoaXNfc2V0X2V2ZW50bG9nX2hvc3QoKSkgeworICAgICAgbGFzdENvbXBhcmlzb24gPSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy5ldmVudGxvZ19ob3N0LCBvdGhlci5ldmVudGxvZ19ob3N0KTsKKyAgICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICAgIH0KKyAgICB9CisgICAgbGFzdENvbXBhcmlzb24gPSBCb29sZWFuLnZhbHVlT2YoaXNfc2V0X2V2ZW50bG9nX3BvcnQoKSkuY29tcGFyZVRvKG90aGVyLmlzX3NldF9ldmVudGxvZ19wb3J0KCkpOworICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgfQorICAgIGlmIChpc19zZXRfZXZlbnRsb2dfcG9ydCgpKSB7CisgICAgICBsYXN0Q29tcGFyaXNvbiA9IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvbXBhcmVUbyh0aGlzLmV2ZW50bG9nX3BvcnQsIG90aGVyLmV2ZW50bG9nX3BvcnQpOworICAgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgICAgfQorICAgIH0KKyAgICBsYXN0Q29tcGFyaXNvbiA9IEJvb2xlYW4udmFsdWVPZihpc19zZXRfZGVidWdfb3B0aW9ucygpKS5jb21wYXJlVG8ob3RoZXIuaXNfc2V0X2RlYnVnX29wdGlvbnMoKSk7CisgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICB9CisgICAgaWYgKGlzX3NldF9kZWJ1Z19vcHRpb25zKCkpIHsKKyAgICAgIGxhc3RDb21wYXJpc29uID0gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29tcGFyZVRvKHRoaXMuZGVidWdfb3B0aW9ucywgb3RoZXIuZGVidWdfb3B0aW9ucyk7CisgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICB9CisgICAgfQorICAgIGxhc3RDb21wYXJpc29uID0gQm9vbGVhbi52YWx1ZU9mKGlzX3NldF90b3BvbG9neV9zdGF0dXMoKSkuY29tcGFyZVRvKG90aGVyLmlzX3NldF90b3BvbG9neV9zdGF0dXMoKSk7CisgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICB9CisgICAgaWYgKGlzX3NldF90b3BvbG9neV9zdGF0dXMoKSkgeworICAgICAgbGFzdENvbXBhcmlzb24gPSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy50b3BvbG9neV9zdGF0dXMsIG90aGVyLnRvcG9sb2d5X3N0YXR1cyk7CisgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworICB9CisKKyAgcHVibGljIF9GaWVsZHMgZmllbGRGb3JJZChpbnQgZmllbGRJZCkgeworICAgIHJldHVybiBfRmllbGRzLmZpbmRCeVRocmlmdElkKGZpZWxkSWQpOworICB9CisKKyAgcHVibGljIHZvaWQgcmVhZChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgaXByb3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICBzY2hlbWVzLmdldChpcHJvdC5nZXRTY2hlbWUoKSkuZ2V0U2NoZW1lKCkucmVhZChpcHJvdCwgdGhpcyk7CisgIH0KKworICBwdWJsaWMgdm9pZCB3cml0ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgb3Byb3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICBzY2hlbWVzLmdldChvcHJvdC5nZXRTY2hlbWUoKSkuZ2V0U2NoZW1lKCkud3JpdGUob3Byb3QsIHRoaXMpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCJDb21wb25lbnRQYWdlSW5mbygiKTsKKyAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKKworICAgIHNiLmFwcGVuZCgiY29tcG9uZW50X2lkOiIpOworICAgIGlmICh0aGlzLmNvbXBvbmVudF9pZCA9PSBudWxsKSB7CisgICAgICBzYi5hcHBlbmQoIm51bGwiKTsKKyAgICB9IGVsc2UgeworICAgICAgc2IuYXBwZW5kKHRoaXMuY29tcG9uZW50X2lkKTsKKyAgICB9CisgICAgZmlyc3QgPSBmYWxzZTsKKyAgICBpZiAoIWZpcnN0KSBzYi5hcHBlbmQoIiwgIik7CisgICAgc2IuYXBwZW5kKCJjb21wb25lbnRfdHlwZToiKTsKKyAgICBpZiAodGhpcy5jb21wb25lbnRfdHlwZSA9PSBudWxsKSB7CisgICAgICBzYi5hcHBlbmQoIm51bGwiKTsKKyAgICB9IGVsc2UgeworICAgICAgc2IuYXBwZW5kKHRoaXMuY29tcG9uZW50X3R5cGUpOworICAgIH0KKyAgICBmaXJzdCA9IGZhbHNlOworICAgIGlmIChpc19zZXRfdG9wb2xvZ3lfaWQoKSkgeworICAgICAgaWYgKCFmaXJzdCkgc2IuYXBwZW5kKCIsICIpOworICAgICAgc2IuYXBwZW5kKCJ0b3BvbG9neV9pZDoiKTsKKyAgICAgIGlmICh0aGlzLnRvcG9sb2d5X2lkID09IG51bGwpIHsKKyAgICAgICAgc2IuYXBwZW5kKCJudWxsIik7CisgICAgICB9IGVsc2UgeworICAgICAgICBzYi5hcHBlbmQodGhpcy50b3BvbG9neV9pZCk7CisgICAgICB9CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0KKyAgICBpZiAoaXNfc2V0X3RvcG9sb2d5X25hbWUoKSkgeworICAgICAgaWYgKCFmaXJzdCkgc2IuYXBwZW5kKCIsICIpOworICAgICAgc2IuYXBwZW5kKCJ0b3BvbG9neV9uYW1lOiIpOworICAgICAgaWYgKHRoaXMudG9wb2xvZ3lfbmFtZSA9PSBudWxsKSB7CisgICAgICAgIHNiLmFwcGVuZCgibnVsbCIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2IuYXBwZW5kKHRoaXMudG9wb2xvZ3lfbmFtZSk7CisgICAgICB9CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0KKyAgICBpZiAoaXNfc2V0X251bV9leGVjdXRvcnMoKSkgeworICAgICAgaWYgKCFmaXJzdCkgc2IuYXBwZW5kKCIsICIpOworICAgICAgc2IuYXBwZW5kKCJudW1fZXhlY3V0b3JzOiIpOworICAgICAgc2IuYXBwZW5kKHRoaXMubnVtX2V4ZWN1dG9ycyk7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0KKyAgICBpZiAoaXNfc2V0X251bV90YXNrcygpKSB7CisgICAgICBpZiAoIWZpcnN0KSBzYi5hcHBlbmQoIiwgIik7CisgICAgICBzYi5hcHBlbmQoIm51bV90YXNrczoiKTsKKyAgICAgIHNiLmFwcGVuZCh0aGlzLm51bV90YXNrcyk7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0KKyAgICBpZiAoaXNfc2V0X3dpbmRvd190b19zdGF0cygpKSB7CisgICAgICBpZiAoIWZpcnN0KSBzYi5hcHBlbmQoIiwgIik7CisgICAgICBzYi5hcHBlbmQoIndpbmRvd190b19zdGF0czoiKTsKKyAgICAgIGlmICh0aGlzLndpbmRvd190b19zdGF0cyA9PSBudWxsKSB7CisgICAgICAgIHNiLmFwcGVuZCgibnVsbCIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2IuYXBwZW5kKHRoaXMud2luZG93X3RvX3N0YXRzKTsKKyAgICAgIH0KKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfQorICAgIGlmIChpc19zZXRfZ3NpZF90b19pbnB1dF9zdGF0cygpKSB7CisgICAgICBpZiAoIWZpcnN0KSBzYi5hcHBlbmQoIiwgIik7CisgICAgICBzYi5hcHBlbmQoImdzaWRfdG9faW5wdXRfc3RhdHM6Iik7CisgICAgICBpZiAodGhpcy5nc2lkX3RvX2lucHV0X3N0YXRzID09IG51bGwpIHsKKyAgICAgICAgc2IuYXBwZW5kKCJudWxsIik7CisgICAgICB9IGVsc2UgeworICAgICAgICBzYi5hcHBlbmQodGhpcy5nc2lkX3RvX2lucHV0X3N0YXRzKTsKKyAgICAgIH0KKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfQorICAgIGlmIChpc19zZXRfc2lkX3RvX291dHB1dF9zdGF0cygpKSB7CisgICAgICBpZiAoIWZpcnN0KSBzYi5hcHBlbmQoIiwgIik7CisgICAgICBzYi5hcHBlbmQoInNpZF90b19vdXRwdXRfc3RhdHM6Iik7CisgICAgICBpZiAodGhpcy5zaWRfdG9fb3V0cHV0X3N0YXRzID09IG51bGwpIHsKKyAgICAgICAgc2IuYXBwZW5kKCJudWxsIik7CisgICAgICB9IGVsc2UgeworICAgICAgICBzYi5hcHBlbmQodGhpcy5zaWRfdG9fb3V0cHV0X3N0YXRzKTsKKyAgICAgIH0KKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfQorICAgIGlmIChpc19zZXRfZXhlY19zdGF0cygpKSB7CisgICAgICBpZiAoIWZpcnN0KSBzYi5hcHBlbmQoIiwgIik7CisgICAgICBzYi5hcHBlbmQoImV4ZWNfc3RhdHM6Iik7CisgICAgICBpZiAodGhpcy5leGVjX3N0YXRzID09IG51bGwpIHsKKyAgICAgICAgc2IuYXBwZW5kKCJudWxsIik7CisgICAgICB9IGVsc2UgeworICAgICAgICBzYi5hcHBlbmQodGhpcy5leGVjX3N0YXRzKTsKKyAgICAgIH0KKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfQorICAgIGlmIChpc19zZXRfZXJyb3JzKCkpIHsKKyAgICAgIGlmICghZmlyc3QpIHNiLmFwcGVuZCgiLCAiKTsKKyAgICAgIHNiLmFwcGVuZCgiZXJyb3JzOiIpOworICAgICAgaWYgKHRoaXMuZXJyb3JzID09IG51bGwpIHsKKyAgICAgICAgc2IuYXBwZW5kKCJudWxsIik7CisgICAgICB9IGVsc2UgeworICAgICAgICBzYi5hcHBlbmQodGhpcy5lcnJvcnMpOworICAgICAgfQorICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9CisgICAgaWYgKGlzX3NldF9ldmVudGxvZ19ob3N0KCkpIHsKKyAgICAgIGlmICghZmlyc3QpIHNiLmFwcGVuZCgiLCAiKTsKKyAgICAgIHNiLmFwcGVuZCgiZXZlbnRsb2dfaG9zdDoiKTsKKyAgICAgIGlmICh0aGlzLmV2ZW50bG9nX2hvc3QgPT0gbnVsbCkgeworICAgICAgICBzYi5hcHBlbmQoIm51bGwiKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNiLmFwcGVuZCh0aGlzLmV2ZW50bG9nX2hvc3QpOworICAgICAgfQorICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9CisgICAgaWYgKGlzX3NldF9ldmVudGxvZ19wb3J0KCkpIHsKKyAgICAgIGlmICghZmlyc3QpIHNiLmFwcGVuZCgiLCAiKTsKKyAgICAgIHNiLmFwcGVuZCgiZXZlbnRsb2dfcG9ydDoiKTsKKyAgICAgIHNiLmFwcGVuZCh0aGlzLmV2ZW50bG9nX3BvcnQpOworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9CisgICAgaWYgKGlzX3NldF9kZWJ1Z19vcHRpb25zKCkpIHsKKyAgICAgIGlmICghZmlyc3QpIHNiLmFwcGVuZCgiLCAiKTsKKyAgICAgIHNiLmFwcGVuZCgiZGVidWdfb3B0aW9uczoiKTsKKyAgICAgIGlmICh0aGlzLmRlYnVnX29wdGlvbnMgPT0gbnVsbCkgeworICAgICAgICBzYi5hcHBlbmQoIm51bGwiKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNiLmFwcGVuZCh0aGlzLmRlYnVnX29wdGlvbnMpOworICAgICAgfQorICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9CisgICAgaWYgKGlzX3NldF90b3BvbG9neV9zdGF0dXMoKSkgeworICAgICAgaWYgKCFmaXJzdCkgc2IuYXBwZW5kKCIsICIpOworICAgICAgc2IuYXBwZW5kKCJ0b3BvbG9neV9zdGF0dXM6Iik7CisgICAgICBpZiAodGhpcy50b3BvbG9neV9zdGF0dXMgPT0gbnVsbCkgeworICAgICAgICBzYi5hcHBlbmQoIm51bGwiKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNiLmFwcGVuZCh0aGlzLnRvcG9sb2d5X3N0YXR1cyk7CisgICAgICB9CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0KKyAgICBzYi5hcHBlbmQoIikiKTsKKyAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgIC8vIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMKKyAgICBpZiAoIWlzX3NldF9jb21wb25lbnRfaWQoKSkgeworICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEV4Y2VwdGlvbigiUmVxdWlyZWQgZmllbGQgJ2NvbXBvbmVudF9pZCcgaXMgdW5zZXQhIFN0cnVjdDoiICsgdG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgaWYgKCFpc19zZXRfY29tcG9uZW50X3R5cGUoKSkgeworICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEV4Y2VwdGlvbigiUmVxdWlyZWQgZmllbGQgJ2NvbXBvbmVudF90eXBlJyBpcyB1bnNldCEgU3RydWN0OiIgKyB0b1N0cmluZygpKTsKKyAgICB9CisKKyAgICAvLyBjaGVjayBmb3Igc3ViLXN0cnVjdCB2YWxpZGl0eQorICAgIGlmIChkZWJ1Z19vcHRpb25zICE9IG51bGwpIHsKKyAgICAgIGRlYnVnX29wdGlvbnMudmFsaWRhdGUoKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIHdyaXRlKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQ29tcGFjdFByb3RvY29sKG5ldyBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVElPU3RyZWFtVHJhbnNwb3J0KG91dCkpKTsKKyAgICB9IGNhdGNoIChvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHRlKSB7CisgICAgICB0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbih0ZSk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBpbikgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICAvLyBpdCBkb2Vzbid0IHNlZW0gbGlrZSB5b3Ugc2hvdWxkIGhhdmUgdG8gZG8gdGhpcywgYnV0IGphdmEgc2VyaWFsaXphdGlvbiBpcyB3YWNreSwgYW5kIGRvZXNuJ3QgY2FsbCB0aGUgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICAgIF9faXNzZXRfYml0ZmllbGQgPSAwOworICAgICAgcmVhZChuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbChuZXcgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRJT1N0cmVhbVRyYW5zcG9ydChpbikpKTsKKyAgICB9IGNhdGNoIChvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHRlKSB7CisgICAgICB0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbih0ZSk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ29tcG9uZW50UGFnZUluZm9TdGFuZGFyZFNjaGVtZUZhY3RvcnkgaW1wbGVtZW50cyBTY2hlbWVGYWN0b3J5IHsKKyAgICBwdWJsaWMgQ29tcG9uZW50UGFnZUluZm9TdGFuZGFyZFNjaGVtZSBnZXRTY2hlbWUoKSB7CisgICAgICByZXR1cm4gbmV3IENvbXBvbmVudFBhZ2VJbmZvU3RhbmRhcmRTY2hlbWUoKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDb21wb25lbnRQYWdlSW5mb1N0YW5kYXJkU2NoZW1lIGV4dGVuZHMgU3RhbmRhcmRTY2hlbWU8Q29tcG9uZW50UGFnZUluZm8+IHsKKworICAgIHB1YmxpYyB2b2lkIHJlYWQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIGlwcm90LCBDb21wb25lbnRQYWdlSW5mbyBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBzY2hlbWVGaWVsZDsKKyAgICAgIGlwcm90LnJlYWRTdHJ1Y3RCZWdpbigpOworICAgICAgd2hpbGUgKHRydWUpCisgICAgICB7CisgICAgICAgIHNjaGVtZUZpZWxkID0gaXByb3QucmVhZEZpZWxkQmVnaW4oKTsKKyAgICAgICAgaWYgKHNjaGVtZUZpZWxkLnR5cGUgPT0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RPUCkgeyAKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKHNjaGVtZUZpZWxkLmlkKSB7CisgICAgICAgICAgY2FzZSAxOiAvLyBDT01QT05FTlRfSUQKKyAgICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORykgeworICAgICAgICAgICAgICBzdHJ1Y3QuY29tcG9uZW50X2lkID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICAgICAgICBzdHJ1Y3Quc2V0X2NvbXBvbmVudF9pZF9pc1NldCh0cnVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7IAorICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAyOiAvLyBDT01QT05FTlRfVFlQRQorICAgICAgICAgICAgaWYgKHNjaGVtZUZpZWxkLnR5cGUgPT0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTMyKSB7CisgICAgICAgICAgICAgIHN0cnVjdC5jb21wb25lbnRfdHlwZSA9IGJhY2t0eXBlLnN0b3JtLmdlbmVyYXRlZC5Db21wb25lbnRUeXBlLmZpbmRCeVZhbHVlKGlwcm90LnJlYWRJMzIoKSk7CisgICAgICAgICAgICAgIHN0cnVjdC5zZXRfY29tcG9uZW50X3R5cGVfaXNTZXQodHJ1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeyAKKyAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMzogLy8gVE9QT0xPR1lfSUQKKyAgICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORykgeworICAgICAgICAgICAgICBzdHJ1Y3QudG9wb2xvZ3lfaWQgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICAgIHN0cnVjdC5zZXRfdG9wb2xvZ3lfaWRfaXNTZXQodHJ1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeyAKKyAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgNDogLy8gVE9QT0xPR1lfTkFNRQorICAgICAgICAgICAgaWYgKHNjaGVtZUZpZWxkLnR5cGUgPT0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HKSB7CisgICAgICAgICAgICAgIHN0cnVjdC50b3BvbG9neV9uYW1lID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICAgICAgICBzdHJ1Y3Quc2V0X3RvcG9sb2d5X25hbWVfaXNTZXQodHJ1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeyAKKyAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgNTogLy8gTlVNX0VYRUNVVE9SUworICAgICAgICAgICAgaWYgKHNjaGVtZUZpZWxkLnR5cGUgPT0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTMyKSB7CisgICAgICAgICAgICAgIHN0cnVjdC5udW1fZXhlY3V0b3JzID0gaXByb3QucmVhZEkzMigpOworICAgICAgICAgICAgICBzdHJ1Y3Quc2V0X251bV9leGVjdXRvcnNfaXNTZXQodHJ1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeyAKKyAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgNjogLy8gTlVNX1RBU0tTCisgICAgICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JMzIpIHsKKyAgICAgICAgICAgICAgc3RydWN0Lm51bV90YXNrcyA9IGlwcm90LnJlYWRJMzIoKTsKKyAgICAgICAgICAgICAgc3RydWN0LnNldF9udW1fdGFza3NfaXNTZXQodHJ1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeyAKKyAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgNzogLy8gV0lORE9XX1RPX1NUQVRTCisgICAgICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5NQVApIHsKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgX21hcDQyMiA9IGlwcm90LnJlYWRNYXBCZWdpbigpOworICAgICAgICAgICAgICAgIHN0cnVjdC53aW5kb3dfdG9fc3RhdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsQ29tcG9uZW50QWdncmVnYXRlU3RhdHM+KDIqX21hcDQyMi5zaXplKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgX2tleTQyMzsKKyAgICAgICAgICAgICAgICBDb21wb25lbnRBZ2dyZWdhdGVTdGF0cyBfdmFsNDI0OworICAgICAgICAgICAgICAgIGZvciAoaW50IF9pNDI1ID0gMDsgX2k0MjUgPCBfbWFwNDIyLnNpemU7ICsrX2k0MjUpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgX2tleTQyMyA9IGlwcm90LnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgIF92YWw0MjQgPSBuZXcgQ29tcG9uZW50QWdncmVnYXRlU3RhdHMoKTsKKyAgICAgICAgICAgICAgICAgIF92YWw0MjQucmVhZChpcHJvdCk7CisgICAgICAgICAgICAgICAgICBzdHJ1Y3Qud2luZG93X3RvX3N0YXRzLnB1dChfa2V5NDIzLCBfdmFsNDI0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaXByb3QucmVhZE1hcEVuZCgpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIHN0cnVjdC5zZXRfd2luZG93X3RvX3N0YXRzX2lzU2V0KHRydWUpOworICAgICAgICAgICAgfSBlbHNlIHsgCisgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgc2NoZW1lRmllbGQudHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDg6IC8vIEdTSURfVE9fSU5QVVRfU1RBVFMKKyAgICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLk1BUCkgeworICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwNDI2ID0gaXByb3QucmVhZE1hcEJlZ2luKCk7CisgICAgICAgICAgICAgICAgc3RydWN0LmdzaWRfdG9faW5wdXRfc3RhdHMgPSBuZXcgSGFzaE1hcDxHbG9iYWxTdHJlYW1JZCxDb21wb25lbnRBZ2dyZWdhdGVTdGF0cz4oMipfbWFwNDI2LnNpemUpOworICAgICAgICAgICAgICAgIEdsb2JhbFN0cmVhbUlkIF9rZXk0Mjc7CisgICAgICAgICAgICAgICAgQ29tcG9uZW50QWdncmVnYXRlU3RhdHMgX3ZhbDQyODsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBfaTQyOSA9IDA7IF9pNDI5IDwgX21hcDQyNi5zaXplOyArK19pNDI5KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIF9rZXk0MjcgPSBuZXcgR2xvYmFsU3RyZWFtSWQoKTsKKyAgICAgICAgICAgICAgICAgIF9rZXk0MjcucmVhZChpcHJvdCk7CisgICAgICAgICAgICAgICAgICBfdmFsNDI4ID0gbmV3IENvbXBvbmVudEFnZ3JlZ2F0ZVN0YXRzKCk7CisgICAgICAgICAgICAgICAgICBfdmFsNDI4LnJlYWQoaXByb3QpOworICAgICAgICAgICAgICAgICAgc3RydWN0LmdzaWRfdG9faW5wdXRfc3RhdHMucHV0KF9rZXk0MjcsIF92YWw0MjgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpcHJvdC5yZWFkTWFwRW5kKCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgc3RydWN0LnNldF9nc2lkX3RvX2lucHV0X3N0YXRzX2lzU2V0KHRydWUpOworICAgICAgICAgICAgfSBlbHNlIHsgCisgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgc2NoZW1lRmllbGQudHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDk6IC8vIFNJRF9UT19PVVRQVVRfU1RBVFMKKyAgICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLk1BUCkgeworICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwNDMwID0gaXByb3QucmVhZE1hcEJlZ2luKCk7CisgICAgICAgICAgICAgICAgc3RydWN0LnNpZF90b19vdXRwdXRfc3RhdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsQ29tcG9uZW50QWdncmVnYXRlU3RhdHM+KDIqX21hcDQzMC5zaXplKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgX2tleTQzMTsKKyAgICAgICAgICAgICAgICBDb21wb25lbnRBZ2dyZWdhdGVTdGF0cyBfdmFsNDMyOworICAgICAgICAgICAgICAgIGZvciAoaW50IF9pNDMzID0gMDsgX2k0MzMgPCBfbWFwNDMwLnNpemU7ICsrX2k0MzMpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgX2tleTQzMSA9IGlwcm90LnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgIF92YWw0MzIgPSBuZXcgQ29tcG9uZW50QWdncmVnYXRlU3RhdHMoKTsKKyAgICAgICAgICAgICAgICAgIF92YWw0MzIucmVhZChpcHJvdCk7CisgICAgICAgICAgICAgICAgICBzdHJ1Y3Quc2lkX3RvX291dHB1dF9zdGF0cy5wdXQoX2tleTQzMSwgX3ZhbDQzMik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlwcm90LnJlYWRNYXBFbmQoKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBzdHJ1Y3Quc2V0X3NpZF90b19vdXRwdXRfc3RhdHNfaXNTZXQodHJ1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeyAKKyAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMTA6IC8vIEVYRUNfU1RBVFMKKyAgICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkxJU1QpIHsKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRMaXN0IF9saXN0NDM0ID0gaXByb3QucmVhZExpc3RCZWdpbigpOworICAgICAgICAgICAgICAgIHN0cnVjdC5leGVjX3N0YXRzID0gbmV3IEFycmF5TGlzdDxFeGVjdXRvckFnZ3JlZ2F0ZVN0YXRzPihfbGlzdDQzNC5zaXplKTsKKyAgICAgICAgICAgICAgICBFeGVjdXRvckFnZ3JlZ2F0ZVN0YXRzIF9lbGVtNDM1OworICAgICAgICAgICAgICAgIGZvciAoaW50IF9pNDM2ID0gMDsgX2k0MzYgPCBfbGlzdDQzNC5zaXplOyArK19pNDM2KQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIF9lbGVtNDM1ID0gbmV3IEV4ZWN1dG9yQWdncmVnYXRlU3RhdHMoKTsKKyAgICAgICAgICAgICAgICAgIF9lbGVtNDM1LnJlYWQoaXByb3QpOworICAgICAgICAgICAgICAgICAgc3RydWN0LmV4ZWNfc3RhdHMuYWRkKF9lbGVtNDM1KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaXByb3QucmVhZExpc3RFbmQoKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBzdHJ1Y3Quc2V0X2V4ZWNfc3RhdHNfaXNTZXQodHJ1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeyAKKyAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMTE6IC8vIEVSUk9SUworICAgICAgICAgICAgaWYgKHNjaGVtZUZpZWxkLnR5cGUgPT0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTElTVCkgeworICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVExpc3QgX2xpc3Q0MzcgPSBpcHJvdC5yZWFkTGlzdEJlZ2luKCk7CisgICAgICAgICAgICAgICAgc3RydWN0LmVycm9ycyA9IG5ldyBBcnJheUxpc3Q8RXJyb3JJbmZvPihfbGlzdDQzNy5zaXplKTsKKyAgICAgICAgICAgICAgICBFcnJvckluZm8gX2VsZW00Mzg7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgX2k0MzkgPSAwOyBfaTQzOSA8IF9saXN0NDM3LnNpemU7ICsrX2k0MzkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgX2VsZW00MzggPSBuZXcgRXJyb3JJbmZvKCk7CisgICAgICAgICAgICAgICAgICBfZWxlbTQzOC5yZWFkKGlwcm90KTsKKyAgICAgICAgICAgICAgICAgIHN0cnVjdC5lcnJvcnMuYWRkKF9lbGVtNDM4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaXByb3QucmVhZExpc3RFbmQoKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBzdHJ1Y3Quc2V0X2Vycm9yc19pc1NldCh0cnVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7IAorICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAxMjogLy8gRVZFTlRMT0dfSE9TVAorICAgICAgICAgICAgaWYgKHNjaGVtZUZpZWxkLnR5cGUgPT0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HKSB7CisgICAgICAgICAgICAgIHN0cnVjdC5ldmVudGxvZ19ob3N0ID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICAgICAgICBzdHJ1Y3Quc2V0X2V2ZW50bG9nX2hvc3RfaXNTZXQodHJ1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeyAKKyAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMTM6IC8vIEVWRU5UTE9HX1BPUlQKKyAgICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkkzMikgeworICAgICAgICAgICAgICBzdHJ1Y3QuZXZlbnRsb2dfcG9ydCA9IGlwcm90LnJlYWRJMzIoKTsKKyAgICAgICAgICAgICAgc3RydWN0LnNldF9ldmVudGxvZ19wb3J0X2lzU2V0KHRydWUpOworICAgICAgICAgICAgfSBlbHNlIHsgCisgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgc2NoZW1lRmllbGQudHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDE0OiAvLyBERUJVR19PUFRJT05TCisgICAgICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QpIHsKKyAgICAgICAgICAgICAgc3RydWN0LmRlYnVnX29wdGlvbnMgPSBuZXcgRGVidWdPcHRpb25zKCk7CisgICAgICAgICAgICAgIHN0cnVjdC5kZWJ1Z19vcHRpb25zLnJlYWQoaXByb3QpOworICAgICAgICAgICAgICBzdHJ1Y3Quc2V0X2RlYnVnX29wdGlvbnNfaXNTZXQodHJ1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeyAKKyAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMTU6IC8vIFRPUE9MT0dZX1NUQVRVUworICAgICAgICAgICAgaWYgKHNjaGVtZUZpZWxkLnR5cGUgPT0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HKSB7CisgICAgICAgICAgICAgIHN0cnVjdC50b3BvbG9neV9zdGF0dXMgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICAgIHN0cnVjdC5zZXRfdG9wb2xvZ3lfc3RhdHVzX2lzU2V0KHRydWUpOworICAgICAgICAgICAgfSBlbHNlIHsgCisgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgc2NoZW1lRmllbGQudHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKKyAgICAgICAgfQorICAgICAgICBpcHJvdC5yZWFkRmllbGRFbmQoKTsKKyAgICAgIH0KKyAgICAgIGlwcm90LnJlYWRTdHJ1Y3RFbmQoKTsKKyAgICAgIHN0cnVjdC52YWxpZGF0ZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBvcHJvdCwgQ29tcG9uZW50UGFnZUluZm8gc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICBzdHJ1Y3QudmFsaWRhdGUoKTsKKworICAgICAgb3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihTVFJVQ1RfREVTQyk7CisgICAgICBpZiAoc3RydWN0LmNvbXBvbmVudF9pZCAhPSBudWxsKSB7CisgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihDT01QT05FTlRfSURfRklFTERfREVTQyk7CisgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKHN0cnVjdC5jb21wb25lbnRfaWQpOworICAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmNvbXBvbmVudF90eXBlICE9IG51bGwpIHsKKyAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKENPTVBPTkVOVF9UWVBFX0ZJRUxEX0RFU0MpOworICAgICAgICBvcHJvdC53cml0ZUkzMihzdHJ1Y3QuY29tcG9uZW50X3R5cGUuZ2V0VmFsdWUoKSk7CisgICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QudG9wb2xvZ3lfaWQgIT0gbnVsbCkgeworICAgICAgICBpZiAoc3RydWN0LmlzX3NldF90b3BvbG9neV9pZCgpKSB7CisgICAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKFRPUE9MT0dZX0lEX0ZJRUxEX0RFU0MpOworICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKHN0cnVjdC50b3BvbG9neV9pZCk7CisgICAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LnRvcG9sb2d5X25hbWUgIT0gbnVsbCkgeworICAgICAgICBpZiAoc3RydWN0LmlzX3NldF90b3BvbG9neV9uYW1lKCkpIHsKKyAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oVE9QT0xPR1lfTkFNRV9GSUVMRF9ERVNDKTsKKyAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhzdHJ1Y3QudG9wb2xvZ3lfbmFtZSk7CisgICAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9udW1fZXhlY3V0b3JzKCkpIHsKKyAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKE5VTV9FWEVDVVRPUlNfRklFTERfREVTQyk7CisgICAgICAgIG9wcm90LndyaXRlSTMyKHN0cnVjdC5udW1fZXhlY3V0b3JzKTsKKyAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5pc19zZXRfbnVtX3Rhc2tzKCkpIHsKKyAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKE5VTV9UQVNLU19GSUVMRF9ERVNDKTsKKyAgICAgICAgb3Byb3Qud3JpdGVJMzIoc3RydWN0Lm51bV90YXNrcyk7CisgICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3Qud2luZG93X3RvX3N0YXRzICE9IG51bGwpIHsKKyAgICAgICAgaWYgKHN0cnVjdC5pc19zZXRfd2luZG93X3RvX3N0YXRzKCkpIHsKKyAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oV0lORE9XX1RPX1NUQVRTX0ZJRUxEX0RFU0MpOworICAgICAgICAgIHsKKyAgICAgICAgICAgIG9wcm90LndyaXRlTWFwQmVnaW4obmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIHN0cnVjdC53aW5kb3dfdG9fc3RhdHMuc2l6ZSgpKSk7CisgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIENvbXBvbmVudEFnZ3JlZ2F0ZVN0YXRzPiBfaXRlcjQ0MCA6IHN0cnVjdC53aW5kb3dfdG9fc3RhdHMuZW50cnlTZXQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoX2l0ZXI0NDAuZ2V0S2V5KCkpOworICAgICAgICAgICAgICBfaXRlcjQ0MC5nZXRWYWx1ZSgpLndyaXRlKG9wcm90KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9wcm90LndyaXRlTWFwRW5kKCk7CisgICAgICAgICAgfQorICAgICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5nc2lkX3RvX2lucHV0X3N0YXRzICE9IG51bGwpIHsKKyAgICAgICAgaWYgKHN0cnVjdC5pc19zZXRfZ3NpZF90b19pbnB1dF9zdGF0cygpKSB7CisgICAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKEdTSURfVE9fSU5QVVRfU1RBVFNfRklFTERfREVTQyk7CisgICAgICAgICAgeworICAgICAgICAgICAgb3Byb3Qud3JpdGVNYXBCZWdpbihuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCwgc3RydWN0LmdzaWRfdG9faW5wdXRfc3RhdHMuc2l6ZSgpKSk7CisgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxHbG9iYWxTdHJlYW1JZCwgQ29tcG9uZW50QWdncmVnYXRlU3RhdHM+IF9pdGVyNDQxIDogc3RydWN0LmdzaWRfdG9faW5wdXRfc3RhdHMuZW50cnlTZXQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2l0ZXI0NDEuZ2V0S2V5KCkud3JpdGUob3Byb3QpOworICAgICAgICAgICAgICBfaXRlcjQ0MS5nZXRWYWx1ZSgpLndyaXRlKG9wcm90KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9wcm90LndyaXRlTWFwRW5kKCk7CisgICAgICAgICAgfQorICAgICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5zaWRfdG9fb3V0cHV0X3N0YXRzICE9IG51bGwpIHsKKyAgICAgICAgaWYgKHN0cnVjdC5pc19zZXRfc2lkX3RvX291dHB1dF9zdGF0cygpKSB7CisgICAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKFNJRF9UT19PVVRQVVRfU1RBVFNfRklFTERfREVTQyk7CisgICAgICAgICAgeworICAgICAgICAgICAgb3Byb3Qud3JpdGVNYXBCZWdpbihuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCwgc3RydWN0LnNpZF90b19vdXRwdXRfc3RhdHMuc2l6ZSgpKSk7CisgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIENvbXBvbmVudEFnZ3JlZ2F0ZVN0YXRzPiBfaXRlcjQ0MiA6IHN0cnVjdC5zaWRfdG9fb3V0cHV0X3N0YXRzLmVudHJ5U2V0KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKF9pdGVyNDQyLmdldEtleSgpKTsKKyAgICAgICAgICAgICAgX2l0ZXI0NDIuZ2V0VmFsdWUoKS53cml0ZShvcHJvdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvcHJvdC53cml0ZU1hcEVuZCgpOworICAgICAgICAgIH0KKyAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuZXhlY19zdGF0cyAhPSBudWxsKSB7CisgICAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X2V4ZWNfc3RhdHMoKSkgeworICAgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihFWEVDX1NUQVRTX0ZJRUxEX0RFU0MpOworICAgICAgICAgIHsKKyAgICAgICAgICAgIG9wcm90LndyaXRlTGlzdEJlZ2luKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTGlzdChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIHN0cnVjdC5leGVjX3N0YXRzLnNpemUoKSkpOworICAgICAgICAgICAgZm9yIChFeGVjdXRvckFnZ3JlZ2F0ZVN0YXRzIF9pdGVyNDQzIDogc3RydWN0LmV4ZWNfc3RhdHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9pdGVyNDQzLndyaXRlKG9wcm90KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9wcm90LndyaXRlTGlzdEVuZCgpOworICAgICAgICAgIH0KKyAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuZXJyb3JzICE9IG51bGwpIHsKKyAgICAgICAgaWYgKHN0cnVjdC5pc19zZXRfZXJyb3JzKCkpIHsKKyAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oRVJST1JTX0ZJRUxEX0RFU0MpOworICAgICAgICAgIHsKKyAgICAgICAgICAgIG9wcm90LndyaXRlTGlzdEJlZ2luKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTGlzdChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIHN0cnVjdC5lcnJvcnMuc2l6ZSgpKSk7CisgICAgICAgICAgICBmb3IgKEVycm9ySW5mbyBfaXRlcjQ0NCA6IHN0cnVjdC5lcnJvcnMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIF9pdGVyNDQ0LndyaXRlKG9wcm90KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9wcm90LndyaXRlTGlzdEVuZCgpOworICAgICAgICAgIH0KKyAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuZXZlbnRsb2dfaG9zdCAhPSBudWxsKSB7CisgICAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X2V2ZW50bG9nX2hvc3QoKSkgeworICAgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihFVkVOVExPR19IT1NUX0ZJRUxEX0RFU0MpOworICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKHN0cnVjdC5ldmVudGxvZ19ob3N0KTsKKyAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X2V2ZW50bG9nX3BvcnQoKSkgeworICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oRVZFTlRMT0dfUE9SVF9GSUVMRF9ERVNDKTsKKyAgICAgICAgb3Byb3Qud3JpdGVJMzIoc3RydWN0LmV2ZW50bG9nX3BvcnQpOworICAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmRlYnVnX29wdGlvbnMgIT0gbnVsbCkgeworICAgICAgICBpZiAoc3RydWN0LmlzX3NldF9kZWJ1Z19vcHRpb25zKCkpIHsKKyAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oREVCVUdfT1BUSU9OU19GSUVMRF9ERVNDKTsKKyAgICAgICAgICBzdHJ1Y3QuZGVidWdfb3B0aW9ucy53cml0ZShvcHJvdCk7CisgICAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LnRvcG9sb2d5X3N0YXR1cyAhPSBudWxsKSB7CisgICAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X3RvcG9sb2d5X3N0YXR1cygpKSB7CisgICAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKFRPUE9MT0dZX1NUQVRVU19GSUVMRF9ERVNDKTsKKyAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhzdHJ1Y3QudG9wb2xvZ3lfc3RhdHVzKTsKKyAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIG9wcm90LndyaXRlRmllbGRTdG9wKCk7CisgICAgICBvcHJvdC53cml0ZVN0cnVjdEVuZCgpOworICAgIH0KKworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ29tcG9uZW50UGFnZUluZm9UdXBsZVNjaGVtZUZhY3RvcnkgaW1wbGVtZW50cyBTY2hlbWVGYWN0b3J5IHsKKyAgICBwdWJsaWMgQ29tcG9uZW50UGFnZUluZm9UdXBsZVNjaGVtZSBnZXRTY2hlbWUoKSB7CisgICAgICByZXR1cm4gbmV3IENvbXBvbmVudFBhZ2VJbmZvVHVwbGVTY2hlbWUoKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDb21wb25lbnRQYWdlSW5mb1R1cGxlU2NoZW1lIGV4dGVuZHMgVHVwbGVTY2hlbWU8Q29tcG9uZW50UGFnZUluZm8+IHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBwcm90LCBDb21wb25lbnRQYWdlSW5mbyBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgIFRUdXBsZVByb3RvY29sIG9wcm90ID0gKFRUdXBsZVByb3RvY29sKSBwcm90OworICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoc3RydWN0LmNvbXBvbmVudF9pZCk7CisgICAgICBvcHJvdC53cml0ZUkzMihzdHJ1Y3QuY29tcG9uZW50X3R5cGUuZ2V0VmFsdWUoKSk7CisgICAgICBCaXRTZXQgb3B0aW9uYWxzID0gbmV3IEJpdFNldCgpOworICAgICAgaWYgKHN0cnVjdC5pc19zZXRfdG9wb2xvZ3lfaWQoKSkgeworICAgICAgICBvcHRpb25hbHMuc2V0KDApOworICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5pc19zZXRfdG9wb2xvZ3lfbmFtZSgpKSB7CisgICAgICAgIG9wdGlvbmFscy5zZXQoMSk7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9udW1fZXhlY3V0b3JzKCkpIHsKKyAgICAgICAgb3B0aW9uYWxzLnNldCgyKTsKKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X251bV90YXNrcygpKSB7CisgICAgICAgIG9wdGlvbmFscy5zZXQoMyk7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF93aW5kb3dfdG9fc3RhdHMoKSkgeworICAgICAgICBvcHRpb25hbHMuc2V0KDQpOworICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5pc19zZXRfZ3NpZF90b19pbnB1dF9zdGF0cygpKSB7CisgICAgICAgIG9wdGlvbmFscy5zZXQoNSk7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9zaWRfdG9fb3V0cHV0X3N0YXRzKCkpIHsKKyAgICAgICAgb3B0aW9uYWxzLnNldCg2KTsKKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X2V4ZWNfc3RhdHMoKSkgeworICAgICAgICBvcHRpb25hbHMuc2V0KDcpOworICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5pc19zZXRfZXJyb3JzKCkpIHsKKyAgICAgICAgb3B0aW9uYWxzLnNldCg4KTsKKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X2V2ZW50bG9nX2hvc3QoKSkgeworICAgICAgICBvcHRpb25hbHMuc2V0KDkpOworICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5pc19zZXRfZXZlbnRsb2dfcG9ydCgpKSB7CisgICAgICAgIG9wdGlvbmFscy5zZXQoMTApOworICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5pc19zZXRfZGVidWdfb3B0aW9ucygpKSB7CisgICAgICAgIG9wdGlvbmFscy5zZXQoMTEpOworICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5pc19zZXRfdG9wb2xvZ3lfc3RhdHVzKCkpIHsKKyAgICAgICAgb3B0aW9uYWxzLnNldCgxMik7CisgICAgICB9CisgICAgICBvcHJvdC53cml0ZUJpdFNldChvcHRpb25hbHMsIDEzKTsKKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X3RvcG9sb2d5X2lkKCkpIHsKKyAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoc3RydWN0LnRvcG9sb2d5X2lkKTsKKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X3RvcG9sb2d5X25hbWUoKSkgeworICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhzdHJ1Y3QudG9wb2xvZ3lfbmFtZSk7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9udW1fZXhlY3V0b3JzKCkpIHsKKyAgICAgICAgb3Byb3Qud3JpdGVJMzIoc3RydWN0Lm51bV9leGVjdXRvcnMpOworICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5pc19zZXRfbnVtX3Rhc2tzKCkpIHsKKyAgICAgICAgb3Byb3Qud3JpdGVJMzIoc3RydWN0Lm51bV90YXNrcyk7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF93aW5kb3dfdG9fc3RhdHMoKSkgeworICAgICAgICB7CisgICAgICAgICAgb3Byb3Qud3JpdGVJMzIoc3RydWN0LndpbmRvd190b19zdGF0cy5zaXplKCkpOworICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgQ29tcG9uZW50QWdncmVnYXRlU3RhdHM+IF9pdGVyNDQ1IDogc3RydWN0LndpbmRvd190b19zdGF0cy5lbnRyeVNldCgpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKF9pdGVyNDQ1LmdldEtleSgpKTsKKyAgICAgICAgICAgIF9pdGVyNDQ1LmdldFZhbHVlKCkud3JpdGUob3Byb3QpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5pc19zZXRfZ3NpZF90b19pbnB1dF9zdGF0cygpKSB7CisgICAgICAgIHsKKyAgICAgICAgICBvcHJvdC53cml0ZUkzMihzdHJ1Y3QuZ3NpZF90b19pbnB1dF9zdGF0cy5zaXplKCkpOworICAgICAgICAgIGZvciAoTWFwLkVudHJ5PEdsb2JhbFN0cmVhbUlkLCBDb21wb25lbnRBZ2dyZWdhdGVTdGF0cz4gX2l0ZXI0NDYgOiBzdHJ1Y3QuZ3NpZF90b19pbnB1dF9zdGF0cy5lbnRyeVNldCgpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIF9pdGVyNDQ2LmdldEtleSgpLndyaXRlKG9wcm90KTsKKyAgICAgICAgICAgIF9pdGVyNDQ2LmdldFZhbHVlKCkud3JpdGUob3Byb3QpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5pc19zZXRfc2lkX3RvX291dHB1dF9zdGF0cygpKSB7CisgICAgICAgIHsKKyAgICAgICAgICBvcHJvdC53cml0ZUkzMihzdHJ1Y3Quc2lkX3RvX291dHB1dF9zdGF0cy5zaXplKCkpOworICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgQ29tcG9uZW50QWdncmVnYXRlU3RhdHM+IF9pdGVyNDQ3IDogc3RydWN0LnNpZF90b19vdXRwdXRfc3RhdHMuZW50cnlTZXQoKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhfaXRlcjQ0Ny5nZXRLZXkoKSk7CisgICAgICAgICAgICBfaXRlcjQ0Ny5nZXRWYWx1ZSgpLndyaXRlKG9wcm90KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X2V4ZWNfc3RhdHMoKSkgeworICAgICAgICB7CisgICAgICAgICAgb3Byb3Qud3JpdGVJMzIoc3RydWN0LmV4ZWNfc3RhdHMuc2l6ZSgpKTsKKyAgICAgICAgICBmb3IgKEV4ZWN1dG9yQWdncmVnYXRlU3RhdHMgX2l0ZXI0NDggOiBzdHJ1Y3QuZXhlY19zdGF0cykKKyAgICAgICAgICB7CisgICAgICAgICAgICBfaXRlcjQ0OC53cml0ZShvcHJvdCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9lcnJvcnMoKSkgeworICAgICAgICB7CisgICAgICAgICAgb3Byb3Qud3JpdGVJMzIoc3RydWN0LmVycm9ycy5zaXplKCkpOworICAgICAgICAgIGZvciAoRXJyb3JJbmZvIF9pdGVyNDQ5IDogc3RydWN0LmVycm9ycykKKyAgICAgICAgICB7CisgICAgICAgICAgICBfaXRlcjQ0OS53cml0ZShvcHJvdCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9ldmVudGxvZ19ob3N0KCkpIHsKKyAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoc3RydWN0LmV2ZW50bG9nX2hvc3QpOworICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5pc19zZXRfZXZlbnRsb2dfcG9ydCgpKSB7CisgICAgICAgIG9wcm90LndyaXRlSTMyKHN0cnVjdC5ldmVudGxvZ19wb3J0KTsKKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X2RlYnVnX29wdGlvbnMoKSkgeworICAgICAgICBzdHJ1Y3QuZGVidWdfb3B0aW9ucy53cml0ZShvcHJvdCk7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF90b3BvbG9neV9zdGF0dXMoKSkgeworICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhzdHJ1Y3QudG9wb2xvZ3lfc3RhdHVzKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZWFkKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBwcm90LCBDb21wb25lbnRQYWdlSW5mbyBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgIFRUdXBsZVByb3RvY29sIGlwcm90ID0gKFRUdXBsZVByb3RvY29sKSBwcm90OworICAgICAgc3RydWN0LmNvbXBvbmVudF9pZCA9IGlwcm90LnJlYWRTdHJpbmcoKTsKKyAgICAgIHN0cnVjdC5zZXRfY29tcG9uZW50X2lkX2lzU2V0KHRydWUpOworICAgICAgc3RydWN0LmNvbXBvbmVudF90eXBlID0gYmFja3R5cGUuc3Rvcm0uZ2VuZXJhdGVkLkNvbXBvbmVudFR5cGUuZmluZEJ5VmFsdWUoaXByb3QucmVhZEkzMigpKTsKKyAgICAgIHN0cnVjdC5zZXRfY29tcG9uZW50X3R5cGVfaXNTZXQodHJ1ZSk7CisgICAgICBCaXRTZXQgaW5jb21pbmcgPSBpcHJvdC5yZWFkQml0U2V0KDEzKTsKKyAgICAgIGlmIChpbmNvbWluZy5nZXQoMCkpIHsKKyAgICAgICAgc3RydWN0LnRvcG9sb2d5X2lkID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICBzdHJ1Y3Quc2V0X3RvcG9sb2d5X2lkX2lzU2V0KHRydWUpOworICAgICAgfQorICAgICAgaWYgKGluY29taW5nLmdldCgxKSkgeworICAgICAgICBzdHJ1Y3QudG9wb2xvZ3lfbmFtZSA9IGlwcm90LnJlYWRTdHJpbmcoKTsKKyAgICAgICAgc3RydWN0LnNldF90b3BvbG9neV9uYW1lX2lzU2V0KHRydWUpOworICAgICAgfQorICAgICAgaWYgKGluY29taW5nLmdldCgyKSkgeworICAgICAgICBzdHJ1Y3QubnVtX2V4ZWN1dG9ycyA9IGlwcm90LnJlYWRJMzIoKTsKKyAgICAgICAgc3RydWN0LnNldF9udW1fZXhlY3V0b3JzX2lzU2V0KHRydWUpOworICAgICAgfQorICAgICAgaWYgKGluY29taW5nLmdldCgzKSkgeworICAgICAgICBzdHJ1Y3QubnVtX3Rhc2tzID0gaXByb3QucmVhZEkzMigpOworICAgICAgICBzdHJ1Y3Quc2V0X251bV90YXNrc19pc1NldCh0cnVlKTsKKyAgICAgIH0KKyAgICAgIGlmIChpbmNvbWluZy5nZXQoNCkpIHsKKyAgICAgICAgeworICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgX21hcDQ1MCA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORywgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNULCBpcHJvdC5yZWFkSTMyKCkpOworICAgICAgICAgIHN0cnVjdC53aW5kb3dfdG9fc3RhdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsQ29tcG9uZW50QWdncmVnYXRlU3RhdHM+KDIqX21hcDQ1MC5zaXplKTsKKyAgICAgICAgICBTdHJpbmcgX2tleTQ1MTsKKyAgICAgICAgICBDb21wb25lbnRBZ2dyZWdhdGVTdGF0cyBfdmFsNDUyOworICAgICAgICAgIGZvciAoaW50IF9pNDUzID0gMDsgX2k0NTMgPCBfbWFwNDUwLnNpemU7ICsrX2k0NTMpCisgICAgICAgICAgeworICAgICAgICAgICAgX2tleTQ1MSA9IGlwcm90LnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgIF92YWw0NTIgPSBuZXcgQ29tcG9uZW50QWdncmVnYXRlU3RhdHMoKTsKKyAgICAgICAgICAgIF92YWw0NTIucmVhZChpcHJvdCk7CisgICAgICAgICAgICBzdHJ1Y3Qud2luZG93X3RvX3N0YXRzLnB1dChfa2V5NDUxLCBfdmFsNDUyKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RydWN0LnNldF93aW5kb3dfdG9fc3RhdHNfaXNTZXQodHJ1ZSk7CisgICAgICB9CisgICAgICBpZiAoaW5jb21pbmcuZ2V0KDUpKSB7CisgICAgICAgIHsKKyAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwIF9tYXA0NTQgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCwgaXByb3QucmVhZEkzMigpKTsKKyAgICAgICAgICBzdHJ1Y3QuZ3NpZF90b19pbnB1dF9zdGF0cyA9IG5ldyBIYXNoTWFwPEdsb2JhbFN0cmVhbUlkLENvbXBvbmVudEFnZ3JlZ2F0ZVN0YXRzPigyKl9tYXA0NTQuc2l6ZSk7CisgICAgICAgICAgR2xvYmFsU3RyZWFtSWQgX2tleTQ1NTsKKyAgICAgICAgICBDb21wb25lbnRBZ2dyZWdhdGVTdGF0cyBfdmFsNDU2OworICAgICAgICAgIGZvciAoaW50IF9pNDU3ID0gMDsgX2k0NTcgPCBfbWFwNDU0LnNpemU7ICsrX2k0NTcpCisgICAgICAgICAgeworICAgICAgICAgICAgX2tleTQ1NSA9IG5ldyBHbG9iYWxTdHJlYW1JZCgpOworICAgICAgICAgICAgX2tleTQ1NS5yZWFkKGlwcm90KTsKKyAgICAgICAgICAgIF92YWw0NTYgPSBuZXcgQ29tcG9uZW50QWdncmVnYXRlU3RhdHMoKTsKKyAgICAgICAgICAgIF92YWw0NTYucmVhZChpcHJvdCk7CisgICAgICAgICAgICBzdHJ1Y3QuZ3NpZF90b19pbnB1dF9zdGF0cy5wdXQoX2tleTQ1NSwgX3ZhbDQ1Nik7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN0cnVjdC5zZXRfZ3NpZF90b19pbnB1dF9zdGF0c19pc1NldCh0cnVlKTsKKyAgICAgIH0KKyAgICAgIGlmIChpbmNvbWluZy5nZXQoNikpIHsKKyAgICAgICAgeworICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgX21hcDQ1OCA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORywgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNULCBpcHJvdC5yZWFkSTMyKCkpOworICAgICAgICAgIHN0cnVjdC5zaWRfdG9fb3V0cHV0X3N0YXRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLENvbXBvbmVudEFnZ3JlZ2F0ZVN0YXRzPigyKl9tYXA0NTguc2l6ZSk7CisgICAgICAgICAgU3RyaW5nIF9rZXk0NTk7CisgICAgICAgICAgQ29tcG9uZW50QWdncmVnYXRlU3RhdHMgX3ZhbDQ2MDsKKyAgICAgICAgICBmb3IgKGludCBfaTQ2MSA9IDA7IF9pNDYxIDwgX21hcDQ1OC5zaXplOyArK19pNDYxKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIF9rZXk0NTkgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICBfdmFsNDYwID0gbmV3IENvbXBvbmVudEFnZ3JlZ2F0ZVN0YXRzKCk7CisgICAgICAgICAgICBfdmFsNDYwLnJlYWQoaXByb3QpOworICAgICAgICAgICAgc3RydWN0LnNpZF90b19vdXRwdXRfc3RhdHMucHV0KF9rZXk0NTksIF92YWw0NjApOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdHJ1Y3Quc2V0X3NpZF90b19vdXRwdXRfc3RhdHNfaXNTZXQodHJ1ZSk7CisgICAgICB9CisgICAgICBpZiAoaW5jb21pbmcuZ2V0KDcpKSB7CisgICAgICAgIHsKKyAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTGlzdCBfbGlzdDQ2MiA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTGlzdChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIGlwcm90LnJlYWRJMzIoKSk7CisgICAgICAgICAgc3RydWN0LmV4ZWNfc3RhdHMgPSBuZXcgQXJyYXlMaXN0PEV4ZWN1dG9yQWdncmVnYXRlU3RhdHM+KF9saXN0NDYyLnNpemUpOworICAgICAgICAgIEV4ZWN1dG9yQWdncmVnYXRlU3RhdHMgX2VsZW00NjM7CisgICAgICAgICAgZm9yIChpbnQgX2k0NjQgPSAwOyBfaTQ2NCA8IF9saXN0NDYyLnNpemU7ICsrX2k0NjQpCisgICAgICAgICAgeworICAgICAgICAgICAgX2VsZW00NjMgPSBuZXcgRXhlY3V0b3JBZ2dyZWdhdGVTdGF0cygpOworICAgICAgICAgICAgX2VsZW00NjMucmVhZChpcHJvdCk7CisgICAgICAgICAgICBzdHJ1Y3QuZXhlY19zdGF0cy5hZGQoX2VsZW00NjMpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdHJ1Y3Quc2V0X2V4ZWNfc3RhdHNfaXNTZXQodHJ1ZSk7CisgICAgICB9CisgICAgICBpZiAoaW5jb21pbmcuZ2V0KDgpKSB7CisgICAgICAgIHsKKyAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTGlzdCBfbGlzdDQ2NSA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTGlzdChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIGlwcm90LnJlYWRJMzIoKSk7CisgICAgICAgICAgc3RydWN0LmVycm9ycyA9IG5ldyBBcnJheUxpc3Q8RXJyb3JJbmZvPihfbGlzdDQ2NS5zaXplKTsKKyAgICAgICAgICBFcnJvckluZm8gX2VsZW00NjY7CisgICAgICAgICAgZm9yIChpbnQgX2k0NjcgPSAwOyBfaTQ2NyA8IF9saXN0NDY1LnNpemU7ICsrX2k0NjcpCisgICAgICAgICAgeworICAgICAgICAgICAgX2VsZW00NjYgPSBuZXcgRXJyb3JJbmZvKCk7CisgICAgICAgICAgICBfZWxlbTQ2Ni5yZWFkKGlwcm90KTsKKyAgICAgICAgICAgIHN0cnVjdC5lcnJvcnMuYWRkKF9lbGVtNDY2KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RydWN0LnNldF9lcnJvcnNfaXNTZXQodHJ1ZSk7CisgICAgICB9CisgICAgICBpZiAoaW5jb21pbmcuZ2V0KDkpKSB7CisgICAgICAgIHN0cnVjdC5ldmVudGxvZ19ob3N0ID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICBzdHJ1Y3Quc2V0X2V2ZW50bG9nX2hvc3RfaXNTZXQodHJ1ZSk7CisgICAgICB9CisgICAgICBpZiAoaW5jb21pbmcuZ2V0KDEwKSkgeworICAgICAgICBzdHJ1Y3QuZXZlbnRsb2dfcG9ydCA9IGlwcm90LnJlYWRJMzIoKTsKKyAgICAgICAgc3RydWN0LnNldF9ldmVudGxvZ19wb3J0X2lzU2V0KHRydWUpOworICAgICAgfQorICAgICAgaWYgKGluY29taW5nLmdldCgxMSkpIHsKKyAgICAgICAgc3RydWN0LmRlYnVnX29wdGlvbnMgPSBuZXcgRGVidWdPcHRpb25zKCk7CisgICAgICAgIHN0cnVjdC5kZWJ1Z19vcHRpb25zLnJlYWQoaXByb3QpOworICAgICAgICBzdHJ1Y3Quc2V0X2RlYnVnX29wdGlvbnNfaXNTZXQodHJ1ZSk7CisgICAgICB9CisgICAgICBpZiAoaW5jb21pbmcuZ2V0KDEyKSkgeworICAgICAgICBzdHJ1Y3QudG9wb2xvZ3lfc3RhdHVzID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICBzdHJ1Y3Quc2V0X3RvcG9sb2d5X3N0YXR1c19pc1NldCh0cnVlKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworfQorCmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL0NvbXBvbmVudFR5cGUuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvQ29tcG9uZW50VHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4NmZlYjcKLS0tIC9kZXYvbnVsbAorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL0NvbXBvbmVudFR5cGUuamF2YQpAQCAtMCwwICsxLDYyIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLyoqCisgKiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjMpCisgKgorICogRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lORworICogIEBnZW5lcmF0ZWQKKyAqLworcGFja2FnZSBiYWNrdHlwZS5zdG9ybS5nZW5lcmF0ZWQ7CisKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEVudW07CisKK3B1YmxpYyBlbnVtIENvbXBvbmVudFR5cGUgaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5URW51bSB7CisgIEJPTFQoMSksCisgIFNQT1VUKDIpOworCisgIHByaXZhdGUgZmluYWwgaW50IHZhbHVlOworCisgIHByaXZhdGUgQ29tcG9uZW50VHlwZShpbnQgdmFsdWUpIHsKKyAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgIH0KKworICAvKioKKyAgICogR2V0IHRoZSBpbnRlZ2VyIHZhbHVlIG9mIHRoaXMgZW51bSB2YWx1ZSwgYXMgZGVmaW5lZCBpbiB0aGUgVGhyaWZ0IElETC4KKyAgICovCisgIHB1YmxpYyBpbnQgZ2V0VmFsdWUoKSB7CisgICAgcmV0dXJuIHZhbHVlOworICB9CisKKyAgLyoqCisgICAqIEZpbmQgYSB0aGUgZW51bSB0eXBlIGJ5IGl0cyBpbnRlZ2VyIHZhbHVlLCBhcyBkZWZpbmVkIGluIHRoZSBUaHJpZnQgSURMLgorICAgKiBAcmV0dXJuIG51bGwgaWYgdGhlIHZhbHVlIGlzIG5vdCBmb3VuZC4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgQ29tcG9uZW50VHlwZSBmaW5kQnlWYWx1ZShpbnQgdmFsdWUpIHsgCisgICAgc3dpdGNoICh2YWx1ZSkgeworICAgICAgY2FzZSAxOgorICAgICAgICByZXR1cm4gQk9MVDsKKyAgICAgIGNhc2UgMjoKKyAgICAgICAgcmV0dXJuIFNQT1VUOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL0NyZWRlbnRpYWxzLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL0NyZWRlbnRpYWxzLmphdmEKaW5kZXggODQ4NGIxOC4uNzVjYzViNiAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9DcmVkZW50aWFscy5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvQ3JlZGVudGlhbHMuamF2YQpAQCAtMTYsNyArMTYsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIC8qKgotICogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4yKQorICogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4zKQogICoKICAqIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkcKICAqICBAZ2VuZXJhdGVkCkBAIC01MSw3ICs1MSw3IEBACiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKIEBTdXBwcmVzc1dhcm5pbmdzKHsiY2FzdCIsICJyYXd0eXBlcyIsICJzZXJpYWwiLCAidW5jaGVja2VkIn0pCi1AR2VuZXJhdGVkKHZhbHVlID0gIkF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMikiLCBkYXRlID0gIjIwMTUtOS0zIikKK0BHZW5lcmF0ZWQodmFsdWUgPSAiQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4zKSIpCiBwdWJsaWMgY2xhc3MgQ3JlZGVudGlhbHMgaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZTxDcmVkZW50aWFscywgQ3JlZGVudGlhbHMuX0ZpZWxkcz4sIGphdmEuaW8uU2VyaWFsaXphYmxlLCBDbG9uZWFibGUsIENvbXBhcmFibGU8Q3JlZGVudGlhbHM+IHsKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdCBTVFJVQ1RfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0KCJDcmVkZW50aWFscyIpOwogCkBAIC0zNjUsMTUgKzM2NSwxNSBAQAogICAgICAgICAgIGNhc2UgMTogLy8gQ1JFRFMKICAgICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLk1BUCkgewogICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwMzQ0ID0gaXByb3QucmVhZE1hcEJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgc3RydWN0LmNyZWRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLFN0cmluZz4oMipfbWFwMzQ0LnNpemUpOwotICAgICAgICAgICAgICAgIFN0cmluZyBfa2V5MzQ1OwotICAgICAgICAgICAgICAgIFN0cmluZyBfdmFsMzQ2OwotICAgICAgICAgICAgICAgIGZvciAoaW50IF9pMzQ3ID0gMDsgX2kzNDcgPCBfbWFwMzQ0LnNpemU7ICsrX2kzNDcpCisgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwNDc4ID0gaXByb3QucmVhZE1hcEJlZ2luKCk7CisgICAgICAgICAgICAgICAgc3RydWN0LmNyZWRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLFN0cmluZz4oMipfbWFwNDc4LnNpemUpOworICAgICAgICAgICAgICAgIFN0cmluZyBfa2V5NDc5OworICAgICAgICAgICAgICAgIFN0cmluZyBfdmFsNDgwOworICAgICAgICAgICAgICAgIGZvciAoaW50IF9pNDgxID0gMDsgX2k0ODEgPCBfbWFwNDc4LnNpemU7ICsrX2k0ODEpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgX2tleTM0NSA9IGlwcm90LnJlYWRTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgIF92YWwzNDYgPSBpcHJvdC5yZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICBzdHJ1Y3QuY3JlZHMucHV0KF9rZXkzNDUsIF92YWwzNDYpOworICAgICAgICAgICAgICAgICAgX2tleTQ3OSA9IGlwcm90LnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgIF92YWw0ODAgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICBzdHJ1Y3QuY3JlZHMucHV0KF9rZXk0NzksIF92YWw0ODApOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpcHJvdC5yZWFkTWFwRW5kKCk7CiAgICAgICAgICAgICAgIH0KQEAgLTM5OSwxMCArMzk5LDEwIEBACiAgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihDUkVEU19GSUVMRF9ERVNDKTsKICAgICAgICAgewogICAgICAgICAgIG9wcm90LndyaXRlTWFwQmVnaW4obmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcsIHN0cnVjdC5jcmVkcy5zaXplKCkpKTsKLSAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gX2l0ZXIzNDggOiBzdHJ1Y3QuY3JlZHMuZW50cnlTZXQoKSkKKyAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gX2l0ZXI0ODIgOiBzdHJ1Y3QuY3JlZHMuZW50cnlTZXQoKSkKICAgICAgICAgICB7Ci0gICAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhfaXRlcjM0OC5nZXRLZXkoKSk7Ci0gICAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhfaXRlcjM0OC5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKF9pdGVyNDgyLmdldEtleSgpKTsKKyAgICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKF9pdGVyNDgyLmdldFZhbHVlKCkpOwogICAgICAgICAgIH0KICAgICAgICAgICBvcHJvdC53cml0ZU1hcEVuZCgpOwogICAgICAgICB9CkBAIC00MjcsMTAgKzQyNywxMCBAQAogICAgICAgVFR1cGxlUHJvdG9jb2wgb3Byb3QgPSAoVFR1cGxlUHJvdG9jb2wpIHByb3Q7CiAgICAgICB7CiAgICAgICAgIG9wcm90LndyaXRlSTMyKHN0cnVjdC5jcmVkcy5zaXplKCkpOwotICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gX2l0ZXIzNDkgOiBzdHJ1Y3QuY3JlZHMuZW50cnlTZXQoKSkKKyAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IF9pdGVyNDgzIDogc3RydWN0LmNyZWRzLmVudHJ5U2V0KCkpCiAgICAgICAgIHsKLSAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhfaXRlcjM0OS5nZXRLZXkoKSk7Ci0gICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoX2l0ZXIzNDkuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoX2l0ZXI0ODMuZ2V0S2V5KCkpOworICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKF9pdGVyNDgzLmdldFZhbHVlKCkpOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQpAQCAtNDM5LDE1ICs0MzksMTUgQEAKICAgICBwdWJsaWMgdm9pZCByZWFkKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBwcm90LCBDcmVkZW50aWFscyBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKICAgICAgIFRUdXBsZVByb3RvY29sIGlwcm90ID0gKFRUdXBsZVByb3RvY29sKSBwcm90OwogICAgICAgewotICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwIF9tYXAzNTAgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORywgaXByb3QucmVhZEkzMigpKTsKLSAgICAgICAgc3RydWN0LmNyZWRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLFN0cmluZz4oMipfbWFwMzUwLnNpemUpOwotICAgICAgICBTdHJpbmcgX2tleTM1MTsKLSAgICAgICAgU3RyaW5nIF92YWwzNTI7Ci0gICAgICAgIGZvciAoaW50IF9pMzUzID0gMDsgX2kzNTMgPCBfbWFwMzUwLnNpemU7ICsrX2kzNTMpCisgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgX21hcDQ4NCA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORywgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCBpcHJvdC5yZWFkSTMyKCkpOworICAgICAgICBzdHJ1Y3QuY3JlZHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsU3RyaW5nPigyKl9tYXA0ODQuc2l6ZSk7CisgICAgICAgIFN0cmluZyBfa2V5NDg1OworICAgICAgICBTdHJpbmcgX3ZhbDQ4NjsKKyAgICAgICAgZm9yIChpbnQgX2k0ODcgPSAwOyBfaTQ4NyA8IF9tYXA0ODQuc2l6ZTsgKytfaTQ4NykKICAgICAgICAgewotICAgICAgICAgIF9rZXkzNTEgPSBpcHJvdC5yZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgX3ZhbDM1MiA9IGlwcm90LnJlYWRTdHJpbmcoKTsKLSAgICAgICAgICBzdHJ1Y3QuY3JlZHMucHV0KF9rZXkzNTEsIF92YWwzNTIpOworICAgICAgICAgIF9rZXk0ODUgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgX3ZhbDQ4NiA9IGlwcm90LnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICBzdHJ1Y3QuY3JlZHMucHV0KF9rZXk0ODUsIF92YWw0ODYpOwogICAgICAgICB9CiAgICAgICB9CiAgICAgICBzdHJ1Y3Quc2V0X2NyZWRzX2lzU2V0KHRydWUpOwpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9EUlBDRXhlY3V0aW9uRXhjZXB0aW9uLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL0RSUENFeGVjdXRpb25FeGNlcHRpb24uamF2YQppbmRleCBmNjFmZmExLi43ZjEwNzc2IDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL0RSUENFeGVjdXRpb25FeGNlcHRpb24uamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL0RSUENFeGVjdXRpb25FeGNlcHRpb24uamF2YQpAQCAtMTYsNyArMTYsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIC8qKgotICogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4yKQorICogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4zKQogICoKICAqIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkcKICAqICBAZ2VuZXJhdGVkCkBAIC01MSw3ICs1MSw3IEBACiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKIEBTdXBwcmVzc1dhcm5pbmdzKHsiY2FzdCIsICJyYXd0eXBlcyIsICJzZXJpYWwiLCAidW5jaGVja2VkIn0pCi1AR2VuZXJhdGVkKHZhbHVlID0gIkF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMikiLCBkYXRlID0gIjIwMTUtMi02IikKK0BHZW5lcmF0ZWQodmFsdWUgPSAiQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4zKSIpCiBwdWJsaWMgY2xhc3MgRFJQQ0V4ZWN1dGlvbkV4Y2VwdGlvbiBleHRlbmRzIFRFeGNlcHRpb24gaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZTxEUlBDRXhlY3V0aW9uRXhjZXB0aW9uLCBEUlBDRXhlY3V0aW9uRXhjZXB0aW9uLl9GaWVsZHM+LCBqYXZhLmlvLlNlcmlhbGl6YWJsZSwgQ2xvbmVhYmxlLCBDb21wYXJhYmxlPERSUENFeGVjdXRpb25FeGNlcHRpb24+IHsKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdCBTVFJVQ1RfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0KCJEUlBDRXhlY3V0aW9uRXhjZXB0aW9uIik7CiAKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvRFJQQ1JlcXVlc3QuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvRFJQQ1JlcXVlc3QuamF2YQppbmRleCBiOTdmYTI1Li41NjlkZjZlIDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL0RSUENSZXF1ZXN0LmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9EUlBDUmVxdWVzdC5qYXZhCkBAIC0xNiw3ICsxNiw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogLyoqCi0gKiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjIpCisgKiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjMpCiAgKgogICogRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lORwogICogIEBnZW5lcmF0ZWQKQEAgLTUxLDcgKzUxLDcgQEAKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAogQFN1cHByZXNzV2FybmluZ3MoeyJjYXN0IiwgInJhd3R5cGVzIiwgInNlcmlhbCIsICJ1bmNoZWNrZWQifSkKLUBHZW5lcmF0ZWQodmFsdWUgPSAiQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4yKSIsIGRhdGUgPSAiMjAxNS0yLTYiKQorQEdlbmVyYXRlZCh2YWx1ZSA9ICJBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjMpIikKIHB1YmxpYyBjbGFzcyBEUlBDUmVxdWVzdCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlPERSUENSZXF1ZXN0LCBEUlBDUmVxdWVzdC5fRmllbGRzPiwgamF2YS5pby5TZXJpYWxpemFibGUsIENsb25lYWJsZSwgQ29tcGFyYWJsZTxEUlBDUmVxdWVzdD4gewogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0IFNUUlVDVF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QoIkRSUENSZXF1ZXN0Iik7CiAKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvRGVidWdPcHRpb25zLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL0RlYnVnT3B0aW9ucy5qYXZhCmluZGV4IDYwYzBlMjQuLmY1M2NmOTggMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvRGVidWdPcHRpb25zLmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9EZWJ1Z09wdGlvbnMuamF2YQpAQCAtMTYsNyArMTYsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIC8qKgotICogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4yKQorICogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4zKQogICoKICAqIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkcKICAqICBAZ2VuZXJhdGVkCkBAIC01MSw3ICs1MSw3IEBACiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKIEBTdXBwcmVzc1dhcm5pbmdzKHsiY2FzdCIsICJyYXd0eXBlcyIsICJzZXJpYWwiLCAidW5jaGVja2VkIn0pCi1AR2VuZXJhdGVkKHZhbHVlID0gIkF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMikiLCBkYXRlID0gIjIwMTUtOC0yNCIpCitAR2VuZXJhdGVkKHZhbHVlID0gIkF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMykiKQogcHVibGljIGNsYXNzIERlYnVnT3B0aW9ucyBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlPERlYnVnT3B0aW9ucywgRGVidWdPcHRpb25zLl9GaWVsZHM+LCBqYXZhLmlvLlNlcmlhbGl6YWJsZSwgQ2xvbmVhYmxlLCBDb21wYXJhYmxlPERlYnVnT3B0aW9ucz4gewogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0IFNUUlVDVF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QoIkRlYnVnT3B0aW9ucyIpOwogCkBAIC0yMzYsMTAgKzIzNiwxMCBAQAogICBwdWJsaWMgT2JqZWN0IGdldEZpZWxkVmFsdWUoX0ZpZWxkcyBmaWVsZCkgewogICAgIHN3aXRjaCAoZmllbGQpIHsKICAgICBjYXNlIEVOQUJMRToKLSAgICAgIHJldHVybiBCb29sZWFuLnZhbHVlT2YoaXNfZW5hYmxlKCkpOworICAgICAgcmV0dXJuIGlzX2VuYWJsZSgpOwogCiAgICAgY2FzZSBTQU1QTElOR1BDVDoKLSAgICAgIHJldHVybiBEb3VibGUudmFsdWVPZihnZXRfc2FtcGxpbmdwY3QoKSk7CisgICAgICByZXR1cm4gZ2V0X3NhbXBsaW5ncGN0KCk7CiAKICAgICB9CiAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9EaXN0cmlidXRlZFJQQy5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9EaXN0cmlidXRlZFJQQy5qYXZhCmluZGV4IGM0ZjI1ZWMuLjFhNDI0MTcgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvRGlzdHJpYnV0ZWRSUEMuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL0Rpc3RyaWJ1dGVkUlBDLmphdmEKQEAgLTE2LDcgKzE2LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAvKioKLSAqIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMikKKyAqIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMykKICAqCiAgKiBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HCiAgKiAgQGdlbmVyYXRlZApAQCAtNTEsNyArNTEsNyBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCiBAU3VwcHJlc3NXYXJuaW5ncyh7ImNhc3QiLCAicmF3dHlwZXMiLCAic2VyaWFsIiwgInVuY2hlY2tlZCJ9KQotQEdlbmVyYXRlZCh2YWx1ZSA9ICJBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjIpIiwgZGF0ZSA9ICIyMDE1LTItNiIpCitAR2VuZXJhdGVkKHZhbHVlID0gIkF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMykiKQogcHVibGljIGNsYXNzIERpc3RyaWJ1dGVkUlBDIHsKIAogICBwdWJsaWMgaW50ZXJmYWNlIElmYWNlIHsKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvRGlzdHJpYnV0ZWRSUENJbnZvY2F0aW9ucy5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9EaXN0cmlidXRlZFJQQ0ludm9jYXRpb25zLmphdmEKaW5kZXggOTRiNzk5Yi4uNDgyNzFhZCAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9EaXN0cmlidXRlZFJQQ0ludm9jYXRpb25zLmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9EaXN0cmlidXRlZFJQQ0ludm9jYXRpb25zLmphdmEKQEAgLTE2LDcgKzE2LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAvKioKLSAqIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMikKKyAqIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMykKICAqCiAgKiBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HCiAgKiAgQGdlbmVyYXRlZApAQCAtNTEsNyArNTEsNyBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCiBAU3VwcHJlc3NXYXJuaW5ncyh7ImNhc3QiLCAicmF3dHlwZXMiLCAic2VyaWFsIiwgInVuY2hlY2tlZCJ9KQotQEdlbmVyYXRlZCh2YWx1ZSA9ICJBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjIpIiwgZGF0ZSA9ICIyMDE1LTItNiIpCitAR2VuZXJhdGVkKHZhbHVlID0gIkF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMykiKQogcHVibGljIGNsYXNzIERpc3RyaWJ1dGVkUlBDSW52b2NhdGlvbnMgewogCiAgIHB1YmxpYyBpbnRlcmZhY2UgSWZhY2UgewpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9FcnJvckluZm8uamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvRXJyb3JJbmZvLmphdmEKaW5kZXggMzI0OTVjNy4uODNmMTBlNiAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9FcnJvckluZm8uamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL0Vycm9ySW5mby5qYXZhCkBAIC0xNiw3ICsxNiw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogLyoqCi0gKiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjIpCisgKiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjMpCiAgKgogICogRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lORwogICogIEBnZW5lcmF0ZWQKQEAgLTUxLDcgKzUxLDcgQEAKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAogQFN1cHByZXNzV2FybmluZ3MoeyJjYXN0IiwgInJhd3R5cGVzIiwgInNlcmlhbCIsICJ1bmNoZWNrZWQifSkKLUBHZW5lcmF0ZWQodmFsdWUgPSAiQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4yKSIsIGRhdGUgPSAiMjAxNS0yLTYiKQorQEdlbmVyYXRlZCh2YWx1ZSA9ICJBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjMpIikKIHB1YmxpYyBjbGFzcyBFcnJvckluZm8gaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZTxFcnJvckluZm8sIEVycm9ySW5mby5fRmllbGRzPiwgamF2YS5pby5TZXJpYWxpemFibGUsIENsb25lYWJsZSwgQ29tcGFyYWJsZTxFcnJvckluZm8+IHsKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdCBTVFJVQ1RfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0KCJFcnJvckluZm8iKTsKIApAQCAtMzMzLDEzICszMzMsMTMgQEAKICAgICAgIHJldHVybiBnZXRfZXJyb3IoKTsKIAogICAgIGNhc2UgRVJST1JfVElNRV9TRUNTOgotICAgICAgcmV0dXJuIEludGVnZXIudmFsdWVPZihnZXRfZXJyb3JfdGltZV9zZWNzKCkpOworICAgICAgcmV0dXJuIGdldF9lcnJvcl90aW1lX3NlY3MoKTsKIAogICAgIGNhc2UgSE9TVDoKICAgICAgIHJldHVybiBnZXRfaG9zdCgpOwogCiAgICAgY2FzZSBQT1JUOgotICAgICAgcmV0dXJuIEludGVnZXIudmFsdWVPZihnZXRfcG9ydCgpKTsKKyAgICAgIHJldHVybiBnZXRfcG9ydCgpOwogCiAgICAgfQogICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvRXhlY3V0b3JBZ2dyZWdhdGVTdGF0cy5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9FeGVjdXRvckFnZ3JlZ2F0ZVN0YXRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTlkODJiNAotLS0gL2Rldi9udWxsCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvRXhlY3V0b3JBZ2dyZWdhdGVTdGF0cy5qYXZhCkBAIC0wLDAgKzEsNTI2IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLyoqCisgKiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjMpCisgKgorICogRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lORworICogIEBnZW5lcmF0ZWQKKyAqLworcGFja2FnZSBiYWNrdHlwZS5zdG9ybS5nZW5lcmF0ZWQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuSVNjaGVtZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuU2NoZW1lRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuU3RhbmRhcmRTY2hlbWU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuVHVwbGVTY2hlbWU7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR1cGxlUHJvdG9jb2w7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LkVuY29kaW5nVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5Bc3luY01ldGhvZENhbGxiYWNrOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci5BYnN0cmFjdE5vbmJsb2NraW5nU2VydmVyLio7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5FbnVtTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5CaXRTZXQ7CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiY2FzdCIsICJyYXd0eXBlcyIsICJzZXJpYWwiLCAidW5jaGVja2VkIn0pCitAR2VuZXJhdGVkKHZhbHVlID0gIkF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMykiKQorcHVibGljIGNsYXNzIEV4ZWN1dG9yQWdncmVnYXRlU3RhdHMgaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZTxFeGVjdXRvckFnZ3JlZ2F0ZVN0YXRzLCBFeGVjdXRvckFnZ3JlZ2F0ZVN0YXRzLl9GaWVsZHM+LCBqYXZhLmlvLlNlcmlhbGl6YWJsZSwgQ2xvbmVhYmxlLCBDb21wYXJhYmxlPEV4ZWN1dG9yQWdncmVnYXRlU3RhdHM+IHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdCBTVFJVQ1RfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0KCJFeGVjdXRvckFnZ3JlZ2F0ZVN0YXRzIik7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIEVYRUNfU1VNTUFSWV9GSUVMRF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCgiZXhlY19zdW1tYXJ5Iiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNULCAoc2hvcnQpMSk7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBTVEFUU19GSUVMRF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCgic3RhdHMiLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIChzaG9ydCkyKTsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8Q2xhc3M8PyBleHRlbmRzIElTY2hlbWU+LCBTY2hlbWVGYWN0b3J5PiBzY2hlbWVzID0gbmV3IEhhc2hNYXA8Q2xhc3M8PyBleHRlbmRzIElTY2hlbWU+LCBTY2hlbWVGYWN0b3J5PigpOworICBzdGF0aWMgeworICAgIHNjaGVtZXMucHV0KFN0YW5kYXJkU2NoZW1lLmNsYXNzLCBuZXcgRXhlY3V0b3JBZ2dyZWdhdGVTdGF0c1N0YW5kYXJkU2NoZW1lRmFjdG9yeSgpKTsKKyAgICBzY2hlbWVzLnB1dChUdXBsZVNjaGVtZS5jbGFzcywgbmV3IEV4ZWN1dG9yQWdncmVnYXRlU3RhdHNUdXBsZVNjaGVtZUZhY3RvcnkoKSk7CisgIH0KKworICBwcml2YXRlIEV4ZWN1dG9yU3VtbWFyeSBleGVjX3N1bW1hcnk7IC8vIG9wdGlvbmFsCisgIHByaXZhdGUgQ29tcG9uZW50QWdncmVnYXRlU3RhdHMgc3RhdHM7IC8vIG9wdGlvbmFsCisKKyAgLyoqIFRoZSBzZXQgb2YgZmllbGRzIHRoaXMgc3RydWN0IGNvbnRhaW5zLCBhbG9uZyB3aXRoIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9yIGZpbmRpbmcgYW5kIG1hbmlwdWxhdGluZyB0aGVtLiAqLworICBwdWJsaWMgZW51bSBfRmllbGRzIGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkSWRFbnVtIHsKKyAgICBFWEVDX1NVTU1BUlkoKHNob3J0KTEsICJleGVjX3N1bW1hcnkiKSwKKyAgICBTVEFUUygoc2hvcnQpMiwgInN0YXRzIik7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBfRmllbGRzPiBieU5hbWUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIF9GaWVsZHM+KCk7CisKKyAgICBzdGF0aWMgeworICAgICAgZm9yIChfRmllbGRzIGZpZWxkIDogRW51bVNldC5hbGxPZihfRmllbGRzLmNsYXNzKSkgeworICAgICAgICBieU5hbWUucHV0KGZpZWxkLmdldEZpZWxkTmFtZSgpLCBmaWVsZCk7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCB0aGUgX0ZpZWxkcyBjb25zdGFudCB0aGF0IG1hdGNoZXMgZmllbGRJZCwgb3IgbnVsbCBpZiBpdHMgbm90IGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgX0ZpZWxkcyBmaW5kQnlUaHJpZnRJZChpbnQgZmllbGRJZCkgeworICAgICAgc3dpdGNoKGZpZWxkSWQpIHsKKyAgICAgICAgY2FzZSAxOiAvLyBFWEVDX1NVTU1BUlkKKyAgICAgICAgICByZXR1cm4gRVhFQ19TVU1NQVJZOworICAgICAgICBjYXNlIDI6IC8vIFNUQVRTCisgICAgICAgICAgcmV0dXJuIFNUQVRTOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgdGhlIF9GaWVsZHMgY29uc3RhbnQgdGhhdCBtYXRjaGVzIGZpZWxkSWQsIHRocm93aW5nIGFuIGV4Y2VwdGlvbgorICAgICAqIGlmIGl0IGlzIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIF9GaWVsZHMgZmluZEJ5VGhyaWZ0SWRPclRocm93KGludCBmaWVsZElkKSB7CisgICAgICBfRmllbGRzIGZpZWxkcyA9IGZpbmRCeVRocmlmdElkKGZpZWxkSWQpOworICAgICAgaWYgKGZpZWxkcyA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJGaWVsZCAiICsgZmllbGRJZCArICIgZG9lc24ndCBleGlzdCEiKTsKKyAgICAgIHJldHVybiBmaWVsZHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCB0aGUgX0ZpZWxkcyBjb25zdGFudCB0aGF0IG1hdGNoZXMgbmFtZSwgb3IgbnVsbCBpZiBpdHMgbm90IGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgX0ZpZWxkcyBmaW5kQnlOYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICByZXR1cm4gYnlOYW1lLmdldChuYW1lKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIHNob3J0IF90aHJpZnRJZDsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBfZmllbGROYW1lOworCisgICAgX0ZpZWxkcyhzaG9ydCB0aHJpZnRJZCwgU3RyaW5nIGZpZWxkTmFtZSkgeworICAgICAgX3RocmlmdElkID0gdGhyaWZ0SWQ7CisgICAgICBfZmllbGROYW1lID0gZmllbGROYW1lOworICAgIH0KKworICAgIHB1YmxpYyBzaG9ydCBnZXRUaHJpZnRGaWVsZElkKCkgeworICAgICAgcmV0dXJuIF90aHJpZnRJZDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEZpZWxkTmFtZSgpIHsKKyAgICAgIHJldHVybiBfZmllbGROYW1lOworICAgIH0KKyAgfQorCisgIC8vIGlzc2V0IGlkIGFzc2lnbm1lbnRzCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIF9GaWVsZHMgb3B0aW9uYWxzW10gPSB7X0ZpZWxkcy5FWEVDX1NVTU1BUlksX0ZpZWxkcy5TVEFUU307CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPiBtZXRhRGF0YU1hcDsKKyAgc3RhdGljIHsKKyAgICBNYXA8X0ZpZWxkcywgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGE+IHRtcE1hcCA9IG5ldyBFbnVtTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPihfRmllbGRzLmNsYXNzKTsKKyAgICB0bXBNYXAucHV0KF9GaWVsZHMuRVhFQ19TVU1NQVJZLCBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEoImV4ZWNfc3VtbWFyeSIsIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZFJlcXVpcmVtZW50VHlwZS5PUFRJT05BTCwgCisgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuU3RydWN0TWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNULCBFeGVjdXRvclN1bW1hcnkuY2xhc3MpKSk7CisgICAgdG1wTWFwLnB1dChfRmllbGRzLlNUQVRTLCBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEoInN0YXRzIiwgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLk9QVElPTkFMLCAKKyAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5TdHJ1Y3RNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIENvbXBvbmVudEFnZ3JlZ2F0ZVN0YXRzLmNsYXNzKSkpOworICAgIG1ldGFEYXRhTWFwID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKHRtcE1hcCk7CisgICAgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEuYWRkU3RydWN0TWV0YURhdGFNYXAoRXhlY3V0b3JBZ2dyZWdhdGVTdGF0cy5jbGFzcywgbWV0YURhdGFNYXApOworICB9CisKKyAgcHVibGljIEV4ZWN1dG9yQWdncmVnYXRlU3RhdHMoKSB7CisgIH0KKworICAvKioKKyAgICogUGVyZm9ybXMgYSBkZWVwIGNvcHkgb24gPGk+b3RoZXI8L2k+LgorICAgKi8KKyAgcHVibGljIEV4ZWN1dG9yQWdncmVnYXRlU3RhdHMoRXhlY3V0b3JBZ2dyZWdhdGVTdGF0cyBvdGhlcikgeworICAgIGlmIChvdGhlci5pc19zZXRfZXhlY19zdW1tYXJ5KCkpIHsKKyAgICAgIHRoaXMuZXhlY19zdW1tYXJ5ID0gbmV3IEV4ZWN1dG9yU3VtbWFyeShvdGhlci5leGVjX3N1bW1hcnkpOworICAgIH0KKyAgICBpZiAob3RoZXIuaXNfc2V0X3N0YXRzKCkpIHsKKyAgICAgIHRoaXMuc3RhdHMgPSBuZXcgQ29tcG9uZW50QWdncmVnYXRlU3RhdHMob3RoZXIuc3RhdHMpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBFeGVjdXRvckFnZ3JlZ2F0ZVN0YXRzIGRlZXBDb3B5KCkgeworICAgIHJldHVybiBuZXcgRXhlY3V0b3JBZ2dyZWdhdGVTdGF0cyh0aGlzKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICB0aGlzLmV4ZWNfc3VtbWFyeSA9IG51bGw7CisgICAgdGhpcy5zdGF0cyA9IG51bGw7CisgIH0KKworICBwdWJsaWMgRXhlY3V0b3JTdW1tYXJ5IGdldF9leGVjX3N1bW1hcnkoKSB7CisgICAgcmV0dXJuIHRoaXMuZXhlY19zdW1tYXJ5OworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X2V4ZWNfc3VtbWFyeShFeGVjdXRvclN1bW1hcnkgZXhlY19zdW1tYXJ5KSB7CisgICAgdGhpcy5leGVjX3N1bW1hcnkgPSBleGVjX3N1bW1hcnk7CisgIH0KKworICBwdWJsaWMgdm9pZCB1bnNldF9leGVjX3N1bW1hcnkoKSB7CisgICAgdGhpcy5leGVjX3N1bW1hcnkgPSBudWxsOworICB9CisKKyAgLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBleGVjX3N1bW1hcnkgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgIHB1YmxpYyBib29sZWFuIGlzX3NldF9leGVjX3N1bW1hcnkoKSB7CisgICAgcmV0dXJuIHRoaXMuZXhlY19zdW1tYXJ5ICE9IG51bGw7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfZXhlY19zdW1tYXJ5X2lzU2V0KGJvb2xlYW4gdmFsdWUpIHsKKyAgICBpZiAoIXZhbHVlKSB7CisgICAgICB0aGlzLmV4ZWNfc3VtbWFyeSA9IG51bGw7CisgICAgfQorICB9CisKKyAgcHVibGljIENvbXBvbmVudEFnZ3JlZ2F0ZVN0YXRzIGdldF9zdGF0cygpIHsKKyAgICByZXR1cm4gdGhpcy5zdGF0czsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF9zdGF0cyhDb21wb25lbnRBZ2dyZWdhdGVTdGF0cyBzdGF0cykgeworICAgIHRoaXMuc3RhdHMgPSBzdGF0czsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHVuc2V0X3N0YXRzKCkgeworICAgIHRoaXMuc3RhdHMgPSBudWxsOworICB9CisKKyAgLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBzdGF0cyBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNfc2V0X3N0YXRzKCkgeworICAgIHJldHVybiB0aGlzLnN0YXRzICE9IG51bGw7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfc3RhdHNfaXNTZXQoYm9vbGVhbiB2YWx1ZSkgeworICAgIGlmICghdmFsdWUpIHsKKyAgICAgIHRoaXMuc3RhdHMgPSBudWxsOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldEZpZWxkVmFsdWUoX0ZpZWxkcyBmaWVsZCwgT2JqZWN0IHZhbHVlKSB7CisgICAgc3dpdGNoIChmaWVsZCkgeworICAgIGNhc2UgRVhFQ19TVU1NQVJZOgorICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgdW5zZXRfZXhlY19zdW1tYXJ5KCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzZXRfZXhlY19zdW1tYXJ5KChFeGVjdXRvclN1bW1hcnkpdmFsdWUpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNUQVRTOgorICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgdW5zZXRfc3RhdHMoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNldF9zdGF0cygoQ29tcG9uZW50QWdncmVnYXRlU3RhdHMpdmFsdWUpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICB9CisgIH0KKworICBwdWJsaWMgT2JqZWN0IGdldEZpZWxkVmFsdWUoX0ZpZWxkcyBmaWVsZCkgeworICAgIHN3aXRjaCAoZmllbGQpIHsKKyAgICBjYXNlIEVYRUNfU1VNTUFSWToKKyAgICAgIHJldHVybiBnZXRfZXhlY19zdW1tYXJ5KCk7CisKKyAgICBjYXNlIFNUQVRTOgorICAgICAgcmV0dXJuIGdldF9zdGF0cygpOworCisgICAgfQorICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgfQorCisgIC8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgY29ycmVzcG9uZGluZyB0byBmaWVsZElEIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLworICBwdWJsaWMgYm9vbGVhbiBpc1NldChfRmllbGRzIGZpZWxkKSB7CisgICAgaWYgKGZpZWxkID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGZpZWxkKSB7CisgICAgY2FzZSBFWEVDX1NVTU1BUlk6CisgICAgICByZXR1cm4gaXNfc2V0X2V4ZWNfc3VtbWFyeSgpOworICAgIGNhc2UgU1RBVFM6CisgICAgICByZXR1cm4gaXNfc2V0X3N0YXRzKCk7CisgICAgfQorICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IHRoYXQpIHsKKyAgICBpZiAodGhhdCA9PSBudWxsKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmICh0aGF0IGluc3RhbmNlb2YgRXhlY3V0b3JBZ2dyZWdhdGVTdGF0cykKKyAgICAgIHJldHVybiB0aGlzLmVxdWFscygoRXhlY3V0b3JBZ2dyZWdhdGVTdGF0cyl0aGF0KTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoRXhlY3V0b3JBZ2dyZWdhdGVTdGF0cyB0aGF0KSB7CisgICAgaWYgKHRoYXQgPT0gbnVsbCkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGJvb2xlYW4gdGhpc19wcmVzZW50X2V4ZWNfc3VtbWFyeSA9IHRydWUgJiYgdGhpcy5pc19zZXRfZXhlY19zdW1tYXJ5KCk7CisgICAgYm9vbGVhbiB0aGF0X3ByZXNlbnRfZXhlY19zdW1tYXJ5ID0gdHJ1ZSAmJiB0aGF0LmlzX3NldF9leGVjX3N1bW1hcnkoKTsKKyAgICBpZiAodGhpc19wcmVzZW50X2V4ZWNfc3VtbWFyeSB8fCB0aGF0X3ByZXNlbnRfZXhlY19zdW1tYXJ5KSB7CisgICAgICBpZiAoISh0aGlzX3ByZXNlbnRfZXhlY19zdW1tYXJ5ICYmIHRoYXRfcHJlc2VudF9leGVjX3N1bW1hcnkpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBpZiAoIXRoaXMuZXhlY19zdW1tYXJ5LmVxdWFscyh0aGF0LmV4ZWNfc3VtbWFyeSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sZWFuIHRoaXNfcHJlc2VudF9zdGF0cyA9IHRydWUgJiYgdGhpcy5pc19zZXRfc3RhdHMoKTsKKyAgICBib29sZWFuIHRoYXRfcHJlc2VudF9zdGF0cyA9IHRydWUgJiYgdGhhdC5pc19zZXRfc3RhdHMoKTsKKyAgICBpZiAodGhpc19wcmVzZW50X3N0YXRzIHx8IHRoYXRfcHJlc2VudF9zdGF0cykgeworICAgICAgaWYgKCEodGhpc19wcmVzZW50X3N0YXRzICYmIHRoYXRfcHJlc2VudF9zdGF0cykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGlmICghdGhpcy5zdGF0cy5lcXVhbHModGhhdC5zdGF0cykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgIExpc3Q8T2JqZWN0PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7CisKKyAgICBib29sZWFuIHByZXNlbnRfZXhlY19zdW1tYXJ5ID0gdHJ1ZSAmJiAoaXNfc2V0X2V4ZWNfc3VtbWFyeSgpKTsKKyAgICBsaXN0LmFkZChwcmVzZW50X2V4ZWNfc3VtbWFyeSk7CisgICAgaWYgKHByZXNlbnRfZXhlY19zdW1tYXJ5KQorICAgICAgbGlzdC5hZGQoZXhlY19zdW1tYXJ5KTsKKworICAgIGJvb2xlYW4gcHJlc2VudF9zdGF0cyA9IHRydWUgJiYgKGlzX3NldF9zdGF0cygpKTsKKyAgICBsaXN0LmFkZChwcmVzZW50X3N0YXRzKTsKKyAgICBpZiAocHJlc2VudF9zdGF0cykKKyAgICAgIGxpc3QuYWRkKHN0YXRzKTsKKworICAgIHJldHVybiBsaXN0Lmhhc2hDb2RlKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBjb21wYXJlVG8oRXhlY3V0b3JBZ2dyZWdhdGVTdGF0cyBvdGhlcikgeworICAgIGlmICghZ2V0Q2xhc3MoKS5lcXVhbHMob3RoZXIuZ2V0Q2xhc3MoKSkpIHsKKyAgICAgIHJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKS5jb21wYXJlVG8ob3RoZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgIH0KKworICAgIGludCBsYXN0Q29tcGFyaXNvbiA9IDA7CisKKyAgICBsYXN0Q29tcGFyaXNvbiA9IEJvb2xlYW4udmFsdWVPZihpc19zZXRfZXhlY19zdW1tYXJ5KCkpLmNvbXBhcmVUbyhvdGhlci5pc19zZXRfZXhlY19zdW1tYXJ5KCkpOworICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgfQorICAgIGlmIChpc19zZXRfZXhlY19zdW1tYXJ5KCkpIHsKKyAgICAgIGxhc3RDb21wYXJpc29uID0gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29tcGFyZVRvKHRoaXMuZXhlY19zdW1tYXJ5LCBvdGhlci5leGVjX3N1bW1hcnkpOworICAgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgICAgfQorICAgIH0KKyAgICBsYXN0Q29tcGFyaXNvbiA9IEJvb2xlYW4udmFsdWVPZihpc19zZXRfc3RhdHMoKSkuY29tcGFyZVRvKG90aGVyLmlzX3NldF9zdGF0cygpKTsKKyAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgIH0KKyAgICBpZiAoaXNfc2V0X3N0YXRzKCkpIHsKKyAgICAgIGxhc3RDb21wYXJpc29uID0gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29tcGFyZVRvKHRoaXMuc3RhdHMsIG90aGVyLnN0YXRzKTsKKyAgICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7CisgIH0KKworICBwdWJsaWMgX0ZpZWxkcyBmaWVsZEZvcklkKGludCBmaWVsZElkKSB7CisgICAgcmV0dXJuIF9GaWVsZHMuZmluZEJ5VGhyaWZ0SWQoZmllbGRJZCk7CisgIH0KKworICBwdWJsaWMgdm9pZCByZWFkKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBpcHJvdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgIHNjaGVtZXMuZ2V0KGlwcm90LmdldFNjaGVtZSgpKS5nZXRTY2hlbWUoKS5yZWFkKGlwcm90LCB0aGlzKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgIHNjaGVtZXMuZ2V0KG9wcm90LmdldFNjaGVtZSgpKS5nZXRTY2hlbWUoKS53cml0ZShvcHJvdCwgdGhpcyk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoIkV4ZWN1dG9yQWdncmVnYXRlU3RhdHMoIik7CisgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7CisKKyAgICBpZiAoaXNfc2V0X2V4ZWNfc3VtbWFyeSgpKSB7CisgICAgICBzYi5hcHBlbmQoImV4ZWNfc3VtbWFyeToiKTsKKyAgICAgIGlmICh0aGlzLmV4ZWNfc3VtbWFyeSA9PSBudWxsKSB7CisgICAgICAgIHNiLmFwcGVuZCgibnVsbCIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2IuYXBwZW5kKHRoaXMuZXhlY19zdW1tYXJ5KTsKKyAgICAgIH0KKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfQorICAgIGlmIChpc19zZXRfc3RhdHMoKSkgeworICAgICAgaWYgKCFmaXJzdCkgc2IuYXBwZW5kKCIsICIpOworICAgICAgc2IuYXBwZW5kKCJzdGF0czoiKTsKKyAgICAgIGlmICh0aGlzLnN0YXRzID09IG51bGwpIHsKKyAgICAgICAgc2IuYXBwZW5kKCJudWxsIik7CisgICAgICB9IGVsc2UgeworICAgICAgICBzYi5hcHBlbmQodGhpcy5zdGF0cyk7CisgICAgICB9CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0KKyAgICBzYi5hcHBlbmQoIikiKTsKKyAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgIC8vIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMKKyAgICAvLyBjaGVjayBmb3Igc3ViLXN0cnVjdCB2YWxpZGl0eQorICAgIGlmIChleGVjX3N1bW1hcnkgIT0gbnVsbCkgeworICAgICAgZXhlY19zdW1tYXJ5LnZhbGlkYXRlKCk7CisgICAgfQorICAgIGlmIChzdGF0cyAhPSBudWxsKSB7CisgICAgICBzdGF0cy52YWxpZGF0ZSgpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgd3JpdGUobmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRDb21wYWN0UHJvdG9jb2wobmV3IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5USU9TdHJlYW1UcmFuc3BvcnQob3V0KSkpOworICAgIH0gY2F0Y2ggKG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24gdGUpIHsKKyAgICAgIHRocm93IG5ldyBqYXZhLmlvLklPRXhjZXB0aW9uKHRlKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgcmVhZE9iamVjdChqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtIGluKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIHJlYWQobmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRDb21wYWN0UHJvdG9jb2wobmV3IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5USU9TdHJlYW1UcmFuc3BvcnQoaW4pKSk7CisgICAgfSBjYXRjaCAob3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB0ZSkgeworICAgICAgdGhyb3cgbmV3IGphdmEuaW8uSU9FeGNlcHRpb24odGUpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIEV4ZWN1dG9yQWdncmVnYXRlU3RhdHNTdGFuZGFyZFNjaGVtZUZhY3RvcnkgaW1wbGVtZW50cyBTY2hlbWVGYWN0b3J5IHsKKyAgICBwdWJsaWMgRXhlY3V0b3JBZ2dyZWdhdGVTdGF0c1N0YW5kYXJkU2NoZW1lIGdldFNjaGVtZSgpIHsKKyAgICAgIHJldHVybiBuZXcgRXhlY3V0b3JBZ2dyZWdhdGVTdGF0c1N0YW5kYXJkU2NoZW1lKCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRXhlY3V0b3JBZ2dyZWdhdGVTdGF0c1N0YW5kYXJkU2NoZW1lIGV4dGVuZHMgU3RhbmRhcmRTY2hlbWU8RXhlY3V0b3JBZ2dyZWdhdGVTdGF0cz4geworCisgICAgcHVibGljIHZvaWQgcmVhZChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgaXByb3QsIEV4ZWN1dG9yQWdncmVnYXRlU3RhdHMgc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgc2NoZW1lRmllbGQ7CisgICAgICBpcHJvdC5yZWFkU3RydWN0QmVnaW4oKTsKKyAgICAgIHdoaWxlICh0cnVlKQorICAgICAgeworICAgICAgICBzY2hlbWVGaWVsZCA9IGlwcm90LnJlYWRGaWVsZEJlZ2luKCk7CisgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUT1ApIHsgCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChzY2hlbWVGaWVsZC5pZCkgeworICAgICAgICAgIGNhc2UgMTogLy8gRVhFQ19TVU1NQVJZCisgICAgICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QpIHsKKyAgICAgICAgICAgICAgc3RydWN0LmV4ZWNfc3VtbWFyeSA9IG5ldyBFeGVjdXRvclN1bW1hcnkoKTsKKyAgICAgICAgICAgICAgc3RydWN0LmV4ZWNfc3VtbWFyeS5yZWFkKGlwcm90KTsKKyAgICAgICAgICAgICAgc3RydWN0LnNldF9leGVjX3N1bW1hcnlfaXNTZXQodHJ1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeyAKKyAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMjogLy8gU1RBVFMKKyAgICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCkgeworICAgICAgICAgICAgICBzdHJ1Y3Quc3RhdHMgPSBuZXcgQ29tcG9uZW50QWdncmVnYXRlU3RhdHMoKTsKKyAgICAgICAgICAgICAgc3RydWN0LnN0YXRzLnJlYWQoaXByb3QpOworICAgICAgICAgICAgICBzdHJ1Y3Quc2V0X3N0YXRzX2lzU2V0KHRydWUpOworICAgICAgICAgICAgfSBlbHNlIHsgCisgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgc2NoZW1lRmllbGQudHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKKyAgICAgICAgfQorICAgICAgICBpcHJvdC5yZWFkRmllbGRFbmQoKTsKKyAgICAgIH0KKyAgICAgIGlwcm90LnJlYWRTdHJ1Y3RFbmQoKTsKKyAgICAgIHN0cnVjdC52YWxpZGF0ZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBvcHJvdCwgRXhlY3V0b3JBZ2dyZWdhdGVTdGF0cyBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgIHN0cnVjdC52YWxpZGF0ZSgpOworCisgICAgICBvcHJvdC53cml0ZVN0cnVjdEJlZ2luKFNUUlVDVF9ERVNDKTsKKyAgICAgIGlmIChzdHJ1Y3QuZXhlY19zdW1tYXJ5ICE9IG51bGwpIHsKKyAgICAgICAgaWYgKHN0cnVjdC5pc19zZXRfZXhlY19zdW1tYXJ5KCkpIHsKKyAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oRVhFQ19TVU1NQVJZX0ZJRUxEX0RFU0MpOworICAgICAgICAgIHN0cnVjdC5leGVjX3N1bW1hcnkud3JpdGUob3Byb3QpOworICAgICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5zdGF0cyAhPSBudWxsKSB7CisgICAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X3N0YXRzKCkpIHsKKyAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oU1RBVFNfRklFTERfREVTQyk7CisgICAgICAgICAgc3RydWN0LnN0YXRzLndyaXRlKG9wcm90KTsKKyAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIG9wcm90LndyaXRlRmllbGRTdG9wKCk7CisgICAgICBvcHJvdC53cml0ZVN0cnVjdEVuZCgpOworICAgIH0KKworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRXhlY3V0b3JBZ2dyZWdhdGVTdGF0c1R1cGxlU2NoZW1lRmFjdG9yeSBpbXBsZW1lbnRzIFNjaGVtZUZhY3RvcnkgeworICAgIHB1YmxpYyBFeGVjdXRvckFnZ3JlZ2F0ZVN0YXRzVHVwbGVTY2hlbWUgZ2V0U2NoZW1lKCkgeworICAgICAgcmV0dXJuIG5ldyBFeGVjdXRvckFnZ3JlZ2F0ZVN0YXRzVHVwbGVTY2hlbWUoKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBFeGVjdXRvckFnZ3JlZ2F0ZVN0YXRzVHVwbGVTY2hlbWUgZXh0ZW5kcyBUdXBsZVNjaGVtZTxFeGVjdXRvckFnZ3JlZ2F0ZVN0YXRzPiB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgcHJvdCwgRXhlY3V0b3JBZ2dyZWdhdGVTdGF0cyBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgIFRUdXBsZVByb3RvY29sIG9wcm90ID0gKFRUdXBsZVByb3RvY29sKSBwcm90OworICAgICAgQml0U2V0IG9wdGlvbmFscyA9IG5ldyBCaXRTZXQoKTsKKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X2V4ZWNfc3VtbWFyeSgpKSB7CisgICAgICAgIG9wdGlvbmFscy5zZXQoMCk7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9zdGF0cygpKSB7CisgICAgICAgIG9wdGlvbmFscy5zZXQoMSk7CisgICAgICB9CisgICAgICBvcHJvdC53cml0ZUJpdFNldChvcHRpb25hbHMsIDIpOworICAgICAgaWYgKHN0cnVjdC5pc19zZXRfZXhlY19zdW1tYXJ5KCkpIHsKKyAgICAgICAgc3RydWN0LmV4ZWNfc3VtbWFyeS53cml0ZShvcHJvdCk7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9zdGF0cygpKSB7CisgICAgICAgIHN0cnVjdC5zdGF0cy53cml0ZShvcHJvdCk7CisgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVhZChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgcHJvdCwgRXhlY3V0b3JBZ2dyZWdhdGVTdGF0cyBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgIFRUdXBsZVByb3RvY29sIGlwcm90ID0gKFRUdXBsZVByb3RvY29sKSBwcm90OworICAgICAgQml0U2V0IGluY29taW5nID0gaXByb3QucmVhZEJpdFNldCgyKTsKKyAgICAgIGlmIChpbmNvbWluZy5nZXQoMCkpIHsKKyAgICAgICAgc3RydWN0LmV4ZWNfc3VtbWFyeSA9IG5ldyBFeGVjdXRvclN1bW1hcnkoKTsKKyAgICAgICAgc3RydWN0LmV4ZWNfc3VtbWFyeS5yZWFkKGlwcm90KTsKKyAgICAgICAgc3RydWN0LnNldF9leGVjX3N1bW1hcnlfaXNTZXQodHJ1ZSk7CisgICAgICB9CisgICAgICBpZiAoaW5jb21pbmcuZ2V0KDEpKSB7CisgICAgICAgIHN0cnVjdC5zdGF0cyA9IG5ldyBDb21wb25lbnRBZ2dyZWdhdGVTdGF0cygpOworICAgICAgICBzdHJ1Y3Quc3RhdHMucmVhZChpcHJvdCk7CisgICAgICAgIHN0cnVjdC5zZXRfc3RhdHNfaXNTZXQodHJ1ZSk7CisgICAgICB9CisgICAgfQorICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9FeGVjdXRvckluZm8uamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvRXhlY3V0b3JJbmZvLmphdmEKaW5kZXggNDQ0MTVjZS4uMzYxM2RlNyAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9FeGVjdXRvckluZm8uamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL0V4ZWN1dG9ySW5mby5qYXZhCkBAIC0xNiw3ICsxNiw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogLyoqCi0gKiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjIpCisgKiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjMpCiAgKgogICogRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lORwogICogIEBnZW5lcmF0ZWQKQEAgLTUxLDcgKzUxLDcgQEAKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAogQFN1cHByZXNzV2FybmluZ3MoeyJjYXN0IiwgInJhd3R5cGVzIiwgInNlcmlhbCIsICJ1bmNoZWNrZWQifSkKLUBHZW5lcmF0ZWQodmFsdWUgPSAiQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4yKSIsIGRhdGUgPSAiMjAxNS0yLTYiKQorQEdlbmVyYXRlZCh2YWx1ZSA9ICJBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjMpIikKIHB1YmxpYyBjbGFzcyBFeGVjdXRvckluZm8gaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZTxFeGVjdXRvckluZm8sIEV4ZWN1dG9ySW5mby5fRmllbGRzPiwgamF2YS5pby5TZXJpYWxpemFibGUsIENsb25lYWJsZSwgQ29tcGFyYWJsZTxFeGVjdXRvckluZm8+IHsKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdCBTVFJVQ1RfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0KCJFeGVjdXRvckluZm8iKTsKIApAQCAtMjQ2LDEwICsyNDYsMTAgQEAKICAgcHVibGljIE9iamVjdCBnZXRGaWVsZFZhbHVlKF9GaWVsZHMgZmllbGQpIHsKICAgICBzd2l0Y2ggKGZpZWxkKSB7CiAgICAgY2FzZSBUQVNLX1NUQVJUOgotICAgICAgcmV0dXJuIEludGVnZXIudmFsdWVPZihnZXRfdGFza19zdGFydCgpKTsKKyAgICAgIHJldHVybiBnZXRfdGFza19zdGFydCgpOwogCiAgICAgY2FzZSBUQVNLX0VORDoKLSAgICAgIHJldHVybiBJbnRlZ2VyLnZhbHVlT2YoZ2V0X3Rhc2tfZW5kKCkpOworICAgICAgcmV0dXJuIGdldF90YXNrX2VuZCgpOwogCiAgICAgfQogICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvRXhlY3V0b3JTcGVjaWZpY1N0YXRzLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL0V4ZWN1dG9yU3BlY2lmaWNTdGF0cy5qYXZhCmluZGV4IDA2Yjc0MWMuLjA5ZmE4MGEgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvRXhlY3V0b3JTcGVjaWZpY1N0YXRzLmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9FeGVjdXRvclNwZWNpZmljU3RhdHMuamF2YQpAQCAtMTYsNyArMTYsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIC8qKgotICogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4yKQorICogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4zKQogICoKICAqIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkcKICAqICBAZ2VuZXJhdGVkCmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL0V4ZWN1dG9yU3RhdHMuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvRXhlY3V0b3JTdGF0cy5qYXZhCmluZGV4IDU4YTc5MzYuLjhhMmE3OTYgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvRXhlY3V0b3JTdGF0cy5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvRXhlY3V0b3JTdGF0cy5qYXZhCkBAIC0xNiw3ICsxNiw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogLyoqCi0gKiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjIpCisgKiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjMpCiAgKgogICogRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lORwogICogIEBnZW5lcmF0ZWQKQEAgLTUxLDcgKzUxLDcgQEAKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAogQFN1cHByZXNzV2FybmluZ3MoeyJjYXN0IiwgInJhd3R5cGVzIiwgInNlcmlhbCIsICJ1bmNoZWNrZWQifSkKLUBHZW5lcmF0ZWQodmFsdWUgPSAiQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4yKSIsIGRhdGUgPSAiMjAxNS05LTMiKQorQEdlbmVyYXRlZCh2YWx1ZSA9ICJBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjMpIikKIHB1YmxpYyBjbGFzcyBFeGVjdXRvclN0YXRzIGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2U8RXhlY3V0b3JTdGF0cywgRXhlY3V0b3JTdGF0cy5fRmllbGRzPiwgamF2YS5pby5TZXJpYWxpemFibGUsIENsb25lYWJsZSwgQ29tcGFyYWJsZTxFeGVjdXRvclN0YXRzPiB7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QgU1RSVUNUX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdCgiRXhlY3V0b3JTdGF0cyIpOwogCkBAIC0zOTcsNyArMzk3LDcgQEAKICAgICAgIHJldHVybiBnZXRfc3BlY2lmaWMoKTsKIAogICAgIGNhc2UgUkFURToKLSAgICAgIHJldHVybiBEb3VibGUudmFsdWVPZihnZXRfcmF0ZSgpKTsKKyAgICAgIHJldHVybiBnZXRfcmF0ZSgpOwogCiAgICAgfQogICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKQEAgLTY2MCwyNyArNjYwLDI3IEBACiAgICAgICAgICAgY2FzZSAxOiAvLyBFTUlUVEVECiAgICAgICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5NQVApIHsKICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgX21hcDI1OCA9IGlwcm90LnJlYWRNYXBCZWdpbigpOwotICAgICAgICAgICAgICAgIHN0cnVjdC5lbWl0dGVkID0gbmV3IEhhc2hNYXA8U3RyaW5nLE1hcDxTdHJpbmcsTG9uZz4+KDIqX21hcDI1OC5zaXplKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgX2tleTI1OTsKLSAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLExvbmc+IF92YWwyNjA7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgX2kyNjEgPSAwOyBfaTI2MSA8IF9tYXAyNTguc2l6ZTsgKytfaTI2MSkKKyAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwIF9tYXAyNzYgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKTsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QuZW1pdHRlZCA9IG5ldyBIYXNoTWFwPFN0cmluZyxNYXA8U3RyaW5nLExvbmc+PigyKl9tYXAyNzYuc2l6ZSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIF9rZXkyNzc7CisgICAgICAgICAgICAgICAgTWFwPFN0cmluZyxMb25nPiBfdmFsMjc4OworICAgICAgICAgICAgICAgIGZvciAoaW50IF9pMjc5ID0gMDsgX2kyNzkgPCBfbWFwMjc2LnNpemU7ICsrX2kyNzkpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgX2tleTI1OSA9IGlwcm90LnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgIF9rZXkyNzcgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgX21hcDI2MiA9IGlwcm90LnJlYWRNYXBCZWdpbigpOwotICAgICAgICAgICAgICAgICAgICBfdmFsMjYwID0gbmV3IEhhc2hNYXA8U3RyaW5nLExvbmc+KDIqX21hcDI2Mi5zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIF9rZXkyNjM7Ci0gICAgICAgICAgICAgICAgICAgIGxvbmcgX3ZhbDI2NDsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgX2kyNjUgPSAwOyBfaTI2NSA8IF9tYXAyNjIuc2l6ZTsgKytfaTI2NSkKKyAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwMjgwID0gaXByb3QucmVhZE1hcEJlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgIF92YWwyNzggPSBuZXcgSGFzaE1hcDxTdHJpbmcsTG9uZz4oMipfbWFwMjgwLnNpemUpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgX2tleTI4MTsKKyAgICAgICAgICAgICAgICAgICAgbG9uZyBfdmFsMjgyOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBfaTI4MyA9IDA7IF9pMjgzIDwgX21hcDI4MC5zaXplOyArK19pMjgzKQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgX2tleTI2MyA9IGlwcm90LnJlYWRTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICBfdmFsMjY0ID0gaXByb3QucmVhZEk2NCgpOwotICAgICAgICAgICAgICAgICAgICAgIF92YWwyNjAucHV0KF9rZXkyNjMsIF92YWwyNjQpOworICAgICAgICAgICAgICAgICAgICAgIF9rZXkyODEgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgX3ZhbDI4MiA9IGlwcm90LnJlYWRJNjQoKTsKKyAgICAgICAgICAgICAgICAgICAgICBfdmFsMjc4LnB1dChfa2V5MjgxLCBfdmFsMjgyKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpcHJvdC5yZWFkTWFwRW5kKCk7CiAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBzdHJ1Y3QuZW1pdHRlZC5wdXQoX2tleTI1OSwgX3ZhbDI2MCk7CisgICAgICAgICAgICAgICAgICBzdHJ1Y3QuZW1pdHRlZC5wdXQoX2tleTI3NywgX3ZhbDI3OCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlwcm90LnJlYWRNYXBFbmQoKTsKICAgICAgICAgICAgICAgfQpAQCAtNjkyLDI3ICs2OTIsMjcgQEAKICAgICAgICAgICBjYXNlIDI6IC8vIFRSQU5TRkVSUkVECiAgICAgICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5NQVApIHsKICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgX21hcDI2NiA9IGlwcm90LnJlYWRNYXBCZWdpbigpOwotICAgICAgICAgICAgICAgIHN0cnVjdC50cmFuc2ZlcnJlZCA9IG5ldyBIYXNoTWFwPFN0cmluZyxNYXA8U3RyaW5nLExvbmc+PigyKl9tYXAyNjYuc2l6ZSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIF9rZXkyNjc7Ci0gICAgICAgICAgICAgICAgTWFwPFN0cmluZyxMb25nPiBfdmFsMjY4OwotICAgICAgICAgICAgICAgIGZvciAoaW50IF9pMjY5ID0gMDsgX2kyNjkgPCBfbWFwMjY2LnNpemU7ICsrX2kyNjkpCisgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwMjg0ID0gaXByb3QucmVhZE1hcEJlZ2luKCk7CisgICAgICAgICAgICAgICAgc3RydWN0LnRyYW5zZmVycmVkID0gbmV3IEhhc2hNYXA8U3RyaW5nLE1hcDxTdHJpbmcsTG9uZz4+KDIqX21hcDI4NC5zaXplKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgX2tleTI4NTsKKyAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLExvbmc+IF92YWwyODY7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgX2kyODcgPSAwOyBfaTI4NyA8IF9tYXAyODQuc2l6ZTsgKytfaTI4NykKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBfa2V5MjY3ID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICAgICAgICAgICAgX2tleTI4NSA9IGlwcm90LnJlYWRTdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwMjcwID0gaXByb3QucmVhZE1hcEJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgICAgIF92YWwyNjggPSBuZXcgSGFzaE1hcDxTdHJpbmcsTG9uZz4oMipfbWFwMjcwLnNpemUpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgX2tleTI3MTsKLSAgICAgICAgICAgICAgICAgICAgbG9uZyBfdmFsMjcyOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBfaTI3MyA9IDA7IF9pMjczIDwgX21hcDI3MC5zaXplOyArK19pMjczKQorICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwIF9tYXAyODggPSBpcHJvdC5yZWFkTWFwQmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgX3ZhbDI4NiA9IG5ldyBIYXNoTWFwPFN0cmluZyxMb25nPigyKl9tYXAyODguc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBfa2V5Mjg5OworICAgICAgICAgICAgICAgICAgICBsb25nIF92YWwyOTA7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IF9pMjkxID0gMDsgX2kyOTEgPCBfbWFwMjg4LnNpemU7ICsrX2kyOTEpCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICBfa2V5MjcxID0gaXByb3QucmVhZFN0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgIF92YWwyNzIgPSBpcHJvdC5yZWFkSTY0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgX3ZhbDI2OC5wdXQoX2tleTI3MSwgX3ZhbDI3Mik7CisgICAgICAgICAgICAgICAgICAgICAgX2tleTI4OSA9IGlwcm90LnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICBfdmFsMjkwID0gaXByb3QucmVhZEk2NCgpOworICAgICAgICAgICAgICAgICAgICAgIF92YWwyODYucHV0KF9rZXkyODksIF92YWwyOTApOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGlwcm90LnJlYWRNYXBFbmQoKTsKICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIHN0cnVjdC50cmFuc2ZlcnJlZC5wdXQoX2tleTI2NywgX3ZhbDI2OCk7CisgICAgICAgICAgICAgICAgICBzdHJ1Y3QudHJhbnNmZXJyZWQucHV0KF9rZXkyODUsIF92YWwyODYpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpcHJvdC5yZWFkTWFwRW5kKCk7CiAgICAgICAgICAgICAgIH0KQEAgLTc1NSwxNSArNzU1LDE1IEBACiAgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihFTUlUVEVEX0ZJRUxEX0RFU0MpOwogICAgICAgICB7CiAgICAgICAgICAgb3Byb3Qud3JpdGVNYXBCZWdpbihuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLk1BUCwgc3RydWN0LmVtaXR0ZWQuc2l6ZSgpKSk7Ci0gICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBNYXA8U3RyaW5nLExvbmc+PiBfaXRlcjI3NCA6IHN0cnVjdC5lbWl0dGVkLmVudHJ5U2V0KCkpCisgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBNYXA8U3RyaW5nLExvbmc+PiBfaXRlcjI5MiA6IHN0cnVjdC5lbWl0dGVkLmVudHJ5U2V0KCkpCiAgICAgICAgICAgewotICAgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoX2l0ZXIyNzQuZ2V0S2V5KCkpOworICAgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoX2l0ZXIyOTIuZ2V0S2V5KCkpOwogICAgICAgICAgICAgewotICAgICAgICAgICAgICBvcHJvdC53cml0ZU1hcEJlZ2luKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORywgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTY0LCBfaXRlcjI3NC5nZXRWYWx1ZSgpLnNpemUoKSkpOwotICAgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIExvbmc+IF9pdGVyMjc1IDogX2l0ZXIyNzQuZ2V0VmFsdWUoKS5lbnRyeVNldCgpKQorICAgICAgICAgICAgICBvcHJvdC53cml0ZU1hcEJlZ2luKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORywgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTY0LCBfaXRlcjI5Mi5nZXRWYWx1ZSgpLnNpemUoKSkpOworICAgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIExvbmc+IF9pdGVyMjkzIDogX2l0ZXIyOTIuZ2V0VmFsdWUoKS5lbnRyeVNldCgpKQogICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoX2l0ZXIyNzUuZ2V0S2V5KCkpOwotICAgICAgICAgICAgICAgIG9wcm90LndyaXRlSTY0KF9pdGVyMjc1LmdldFZhbHVlKCkpOworICAgICAgICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKF9pdGVyMjkzLmdldEtleSgpKTsKKyAgICAgICAgICAgICAgICBvcHJvdC53cml0ZUk2NChfaXRlcjI5My5nZXRWYWx1ZSgpKTsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBvcHJvdC53cml0ZU1hcEVuZCgpOwogICAgICAgICAgICAgfQpAQCAtNzc2LDE1ICs3NzYsMTUgQEAKICAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKFRSQU5TRkVSUkVEX0ZJRUxEX0RFU0MpOwogICAgICAgICB7CiAgICAgICAgICAgb3Byb3Qud3JpdGVNYXBCZWdpbihuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLk1BUCwgc3RydWN0LnRyYW5zZmVycmVkLnNpemUoKSkpOwotICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgTWFwPFN0cmluZyxMb25nPj4gX2l0ZXIyNzYgOiBzdHJ1Y3QudHJhbnNmZXJyZWQuZW50cnlTZXQoKSkKKyAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIE1hcDxTdHJpbmcsTG9uZz4+IF9pdGVyMjk0IDogc3RydWN0LnRyYW5zZmVycmVkLmVudHJ5U2V0KCkpCiAgICAgICAgICAgewotICAgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoX2l0ZXIyNzYuZ2V0S2V5KCkpOworICAgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoX2l0ZXIyOTQuZ2V0S2V5KCkpOwogICAgICAgICAgICAgewotICAgICAgICAgICAgICBvcHJvdC53cml0ZU1hcEJlZ2luKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORywgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTY0LCBfaXRlcjI3Ni5nZXRWYWx1ZSgpLnNpemUoKSkpOwotICAgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIExvbmc+IF9pdGVyMjc3IDogX2l0ZXIyNzYuZ2V0VmFsdWUoKS5lbnRyeVNldCgpKQorICAgICAgICAgICAgICBvcHJvdC53cml0ZU1hcEJlZ2luKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORywgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTY0LCBfaXRlcjI5NC5nZXRWYWx1ZSgpLnNpemUoKSkpOworICAgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIExvbmc+IF9pdGVyMjk1IDogX2l0ZXIyOTQuZ2V0VmFsdWUoKS5lbnRyeVNldCgpKQogICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoX2l0ZXIyNzcuZ2V0S2V5KCkpOwotICAgICAgICAgICAgICAgIG9wcm90LndyaXRlSTY0KF9pdGVyMjc3LmdldFZhbHVlKCkpOworICAgICAgICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKF9pdGVyMjk1LmdldEtleSgpKTsKKyAgICAgICAgICAgICAgICBvcHJvdC53cml0ZUk2NChfaXRlcjI5NS5nZXRWYWx1ZSgpKTsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBvcHJvdC53cml0ZU1hcEVuZCgpOwogICAgICAgICAgICAgfQpAQCAtODIwLDMwICs4MjAsMzAgQEAKICAgICAgIFRUdXBsZVByb3RvY29sIG9wcm90ID0gKFRUdXBsZVByb3RvY29sKSBwcm90OwogICAgICAgewogICAgICAgICBvcHJvdC53cml0ZUkzMihzdHJ1Y3QuZW1pdHRlZC5zaXplKCkpOwotICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIE1hcDxTdHJpbmcsTG9uZz4+IF9pdGVyMjc4IDogc3RydWN0LmVtaXR0ZWQuZW50cnlTZXQoKSkKKyAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBNYXA8U3RyaW5nLExvbmc+PiBfaXRlcjI5NiA6IHN0cnVjdC5lbWl0dGVkLmVudHJ5U2V0KCkpCiAgICAgICAgIHsKLSAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhfaXRlcjI3OC5nZXRLZXkoKSk7CisgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoX2l0ZXIyOTYuZ2V0S2V5KCkpOwogICAgICAgICAgIHsKLSAgICAgICAgICAgIG9wcm90LndyaXRlSTMyKF9pdGVyMjc4LmdldFZhbHVlKCkuc2l6ZSgpKTsKLSAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgTG9uZz4gX2l0ZXIyNzkgOiBfaXRlcjI3OC5nZXRWYWx1ZSgpLmVudHJ5U2V0KCkpCisgICAgICAgICAgICBvcHJvdC53cml0ZUkzMihfaXRlcjI5Ni5nZXRWYWx1ZSgpLnNpemUoKSk7CisgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIExvbmc+IF9pdGVyMjk3IDogX2l0ZXIyOTYuZ2V0VmFsdWUoKS5lbnRyeVNldCgpKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhfaXRlcjI3OS5nZXRLZXkoKSk7Ci0gICAgICAgICAgICAgIG9wcm90LndyaXRlSTY0KF9pdGVyMjc5LmdldFZhbHVlKCkpOworICAgICAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhfaXRlcjI5Ny5nZXRLZXkoKSk7CisgICAgICAgICAgICAgIG9wcm90LndyaXRlSTY0KF9pdGVyMjk3LmdldFZhbHVlKCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgfQogICAgICAgewogICAgICAgICBvcHJvdC53cml0ZUkzMihzdHJ1Y3QudHJhbnNmZXJyZWQuc2l6ZSgpKTsKLSAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBNYXA8U3RyaW5nLExvbmc+PiBfaXRlcjI4MCA6IHN0cnVjdC50cmFuc2ZlcnJlZC5lbnRyeVNldCgpKQorICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIE1hcDxTdHJpbmcsTG9uZz4+IF9pdGVyMjk4IDogc3RydWN0LnRyYW5zZmVycmVkLmVudHJ5U2V0KCkpCiAgICAgICAgIHsKLSAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhfaXRlcjI4MC5nZXRLZXkoKSk7CisgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoX2l0ZXIyOTguZ2V0S2V5KCkpOwogICAgICAgICAgIHsKLSAgICAgICAgICAgIG9wcm90LndyaXRlSTMyKF9pdGVyMjgwLmdldFZhbHVlKCkuc2l6ZSgpKTsKLSAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgTG9uZz4gX2l0ZXIyODEgOiBfaXRlcjI4MC5nZXRWYWx1ZSgpLmVudHJ5U2V0KCkpCisgICAgICAgICAgICBvcHJvdC53cml0ZUkzMihfaXRlcjI5OC5nZXRWYWx1ZSgpLnNpemUoKSk7CisgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIExvbmc+IF9pdGVyMjk5IDogX2l0ZXIyOTguZ2V0VmFsdWUoKS5lbnRyeVNldCgpKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhfaXRlcjI4MS5nZXRLZXkoKSk7Ci0gICAgICAgICAgICAgIG9wcm90LndyaXRlSTY0KF9pdGVyMjgxLmdldFZhbHVlKCkpOworICAgICAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhfaXRlcjI5OS5nZXRLZXkoKSk7CisgICAgICAgICAgICAgIG9wcm90LndyaXRlSTY0KF9pdGVyMjk5LmdldFZhbHVlKCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtODU2LDUwICs4NTYsNTAgQEAKICAgICBwdWJsaWMgdm9pZCByZWFkKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBwcm90LCBFeGVjdXRvclN0YXRzIHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24gewogICAgICAgVFR1cGxlUHJvdG9jb2wgaXByb3QgPSAoVFR1cGxlUHJvdG9jb2wpIHByb3Q7CiAgICAgICB7Ci0gICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgX21hcDI4MiA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORywgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTUFQLCBpcHJvdC5yZWFkSTMyKCkpOwotICAgICAgICBzdHJ1Y3QuZW1pdHRlZCA9IG5ldyBIYXNoTWFwPFN0cmluZyxNYXA8U3RyaW5nLExvbmc+PigyKl9tYXAyODIuc2l6ZSk7Ci0gICAgICAgIFN0cmluZyBfa2V5MjgzOwotICAgICAgICBNYXA8U3RyaW5nLExvbmc+IF92YWwyODQ7Ci0gICAgICAgIGZvciAoaW50IF9pMjg1ID0gMDsgX2kyODUgPCBfbWFwMjgyLnNpemU7ICsrX2kyODUpCisgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgX21hcDMwMCA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORywgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTUFQLCBpcHJvdC5yZWFkSTMyKCkpOworICAgICAgICBzdHJ1Y3QuZW1pdHRlZCA9IG5ldyBIYXNoTWFwPFN0cmluZyxNYXA8U3RyaW5nLExvbmc+PigyKl9tYXAzMDAuc2l6ZSk7CisgICAgICAgIFN0cmluZyBfa2V5MzAxOworICAgICAgICBNYXA8U3RyaW5nLExvbmc+IF92YWwzMDI7CisgICAgICAgIGZvciAoaW50IF9pMzAzID0gMDsgX2kzMDMgPCBfbWFwMzAwLnNpemU7ICsrX2kzMDMpCiAgICAgICAgIHsKLSAgICAgICAgICBfa2V5MjgzID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICAgIF9rZXkzMDEgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CiAgICAgICAgICAgewotICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwMjg2ID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JNjQsIGlwcm90LnJlYWRJMzIoKSk7Ci0gICAgICAgICAgICBfdmFsMjg0ID0gbmV3IEhhc2hNYXA8U3RyaW5nLExvbmc+KDIqX21hcDI4Ni5zaXplKTsKLSAgICAgICAgICAgIFN0cmluZyBfa2V5Mjg3OwotICAgICAgICAgICAgbG9uZyBfdmFsMjg4OwotICAgICAgICAgICAgZm9yIChpbnQgX2kyODkgPSAwOyBfaTI4OSA8IF9tYXAyODYuc2l6ZTsgKytfaTI4OSkKKyAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgX21hcDMwNCA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORywgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTY0LCBpcHJvdC5yZWFkSTMyKCkpOworICAgICAgICAgICAgX3ZhbDMwMiA9IG5ldyBIYXNoTWFwPFN0cmluZyxMb25nPigyKl9tYXAzMDQuc2l6ZSk7CisgICAgICAgICAgICBTdHJpbmcgX2tleTMwNTsKKyAgICAgICAgICAgIGxvbmcgX3ZhbDMwNjsKKyAgICAgICAgICAgIGZvciAoaW50IF9pMzA3ID0gMDsgX2kzMDcgPCBfbWFwMzA0LnNpemU7ICsrX2kzMDcpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIF9rZXkyODcgPSBpcHJvdC5yZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgICAgIF92YWwyODggPSBpcHJvdC5yZWFkSTY0KCk7Ci0gICAgICAgICAgICAgIF92YWwyODQucHV0KF9rZXkyODcsIF92YWwyODgpOworICAgICAgICAgICAgICBfa2V5MzA1ID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICAgICAgICBfdmFsMzA2ID0gaXByb3QucmVhZEk2NCgpOworICAgICAgICAgICAgICBfdmFsMzAyLnB1dChfa2V5MzA1LCBfdmFsMzA2KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICB9Ci0gICAgICAgICAgc3RydWN0LmVtaXR0ZWQucHV0KF9rZXkyODMsIF92YWwyODQpOworICAgICAgICAgIHN0cnVjdC5lbWl0dGVkLnB1dChfa2V5MzAxLCBfdmFsMzAyKTsKICAgICAgICAgfQogICAgICAgfQogICAgICAgc3RydWN0LnNldF9lbWl0dGVkX2lzU2V0KHRydWUpOwogICAgICAgewotICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwIF9tYXAyOTAgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLk1BUCwgaXByb3QucmVhZEkzMigpKTsKLSAgICAgICAgc3RydWN0LnRyYW5zZmVycmVkID0gbmV3IEhhc2hNYXA8U3RyaW5nLE1hcDxTdHJpbmcsTG9uZz4+KDIqX21hcDI5MC5zaXplKTsKLSAgICAgICAgU3RyaW5nIF9rZXkyOTE7Ci0gICAgICAgIE1hcDxTdHJpbmcsTG9uZz4gX3ZhbDI5MjsKLSAgICAgICAgZm9yIChpbnQgX2kyOTMgPSAwOyBfaTI5MyA8IF9tYXAyOTAuc2l6ZTsgKytfaTI5MykKKyAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwMzA4ID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5NQVAsIGlwcm90LnJlYWRJMzIoKSk7CisgICAgICAgIHN0cnVjdC50cmFuc2ZlcnJlZCA9IG5ldyBIYXNoTWFwPFN0cmluZyxNYXA8U3RyaW5nLExvbmc+PigyKl9tYXAzMDguc2l6ZSk7CisgICAgICAgIFN0cmluZyBfa2V5MzA5OworICAgICAgICBNYXA8U3RyaW5nLExvbmc+IF92YWwzMTA7CisgICAgICAgIGZvciAoaW50IF9pMzExID0gMDsgX2kzMTEgPCBfbWFwMzA4LnNpemU7ICsrX2kzMTEpCiAgICAgICAgIHsKLSAgICAgICAgICBfa2V5MjkxID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICAgIF9rZXkzMDkgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CiAgICAgICAgICAgewotICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwMjk0ID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JNjQsIGlwcm90LnJlYWRJMzIoKSk7Ci0gICAgICAgICAgICBfdmFsMjkyID0gbmV3IEhhc2hNYXA8U3RyaW5nLExvbmc+KDIqX21hcDI5NC5zaXplKTsKLSAgICAgICAgICAgIFN0cmluZyBfa2V5Mjk1OwotICAgICAgICAgICAgbG9uZyBfdmFsMjk2OwotICAgICAgICAgICAgZm9yIChpbnQgX2kyOTcgPSAwOyBfaTI5NyA8IF9tYXAyOTQuc2l6ZTsgKytfaTI5NykKKyAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgX21hcDMxMiA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORywgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTY0LCBpcHJvdC5yZWFkSTMyKCkpOworICAgICAgICAgICAgX3ZhbDMxMCA9IG5ldyBIYXNoTWFwPFN0cmluZyxMb25nPigyKl9tYXAzMTIuc2l6ZSk7CisgICAgICAgICAgICBTdHJpbmcgX2tleTMxMzsKKyAgICAgICAgICAgIGxvbmcgX3ZhbDMxNDsKKyAgICAgICAgICAgIGZvciAoaW50IF9pMzE1ID0gMDsgX2kzMTUgPCBfbWFwMzEyLnNpemU7ICsrX2kzMTUpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIF9rZXkyOTUgPSBpcHJvdC5yZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgICAgIF92YWwyOTYgPSBpcHJvdC5yZWFkSTY0KCk7Ci0gICAgICAgICAgICAgIF92YWwyOTIucHV0KF9rZXkyOTUsIF92YWwyOTYpOworICAgICAgICAgICAgICBfa2V5MzEzID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICAgICAgICBfdmFsMzE0ID0gaXByb3QucmVhZEk2NCgpOworICAgICAgICAgICAgICBfdmFsMzEwLnB1dChfa2V5MzEzLCBfdmFsMzE0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICB9Ci0gICAgICAgICAgc3RydWN0LnRyYW5zZmVycmVkLnB1dChfa2V5MjkxLCBfdmFsMjkyKTsKKyAgICAgICAgICBzdHJ1Y3QudHJhbnNmZXJyZWQucHV0KF9rZXkzMDksIF92YWwzMTApOwogICAgICAgICB9CiAgICAgICB9CiAgICAgICBzdHJ1Y3Quc2V0X3RyYW5zZmVycmVkX2lzU2V0KHRydWUpOwpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9FeGVjdXRvclN1bW1hcnkuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvRXhlY3V0b3JTdW1tYXJ5LmphdmEKaW5kZXggNjQ5MzQyZC4uODRkZTVkNyAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9FeGVjdXRvclN1bW1hcnkuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL0V4ZWN1dG9yU3VtbWFyeS5qYXZhCkBAIC0xNiw3ICsxNiw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogLyoqCi0gKiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjIpCisgKiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjMpCiAgKgogICogRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lORwogICogIEBnZW5lcmF0ZWQKQEAgLTUxLDcgKzUxLDcgQEAKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAogQFN1cHByZXNzV2FybmluZ3MoeyJjYXN0IiwgInJhd3R5cGVzIiwgInNlcmlhbCIsICJ1bmNoZWNrZWQifSkKLUBHZW5lcmF0ZWQodmFsdWUgPSAiQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4yKSIsIGRhdGUgPSAiMjAxNS0yLTYiKQorQEdlbmVyYXRlZCh2YWx1ZSA9ICJBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjMpIikKIHB1YmxpYyBjbGFzcyBFeGVjdXRvclN1bW1hcnkgaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZTxFeGVjdXRvclN1bW1hcnksIEV4ZWN1dG9yU3VtbWFyeS5fRmllbGRzPiwgamF2YS5pby5TZXJpYWxpemFibGUsIENsb25lYWJsZSwgQ29tcGFyYWJsZTxFeGVjdXRvclN1bW1hcnk+IHsKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdCBTVFJVQ1RfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0KCJFeGVjdXRvclN1bW1hcnkiKTsKIApAQCAtNDMwLDEwICs0MzAsMTAgQEAKICAgICAgIHJldHVybiBnZXRfaG9zdCgpOwogCiAgICAgY2FzZSBQT1JUOgotICAgICAgcmV0dXJuIEludGVnZXIudmFsdWVPZihnZXRfcG9ydCgpKTsKKyAgICAgIHJldHVybiBnZXRfcG9ydCgpOwogCiAgICAgY2FzZSBVUFRJTUVfU0VDUzoKLSAgICAgIHJldHVybiBJbnRlZ2VyLnZhbHVlT2YoZ2V0X3VwdGltZV9zZWNzKCkpOworICAgICAgcmV0dXJuIGdldF91cHRpbWVfc2VjcygpOwogCiAgICAgY2FzZSBTVEFUUzoKICAgICAgIHJldHVybiBnZXRfc3RhdHMoKTsKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvR2V0SW5mb09wdGlvbnMuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvR2V0SW5mb09wdGlvbnMuamF2YQppbmRleCAyZDVkZWZjLi5kYWM0OWYxIDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL0dldEluZm9PcHRpb25zLmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9HZXRJbmZvT3B0aW9ucy5qYXZhCkBAIC0xNiw3ICsxNiw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogLyoqCi0gKiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjIpCisgKiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjMpCiAgKgogICogRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lORwogICogIEBnZW5lcmF0ZWQKQEAgLTUxLDcgKzUxLDcgQEAKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAogQFN1cHByZXNzV2FybmluZ3MoeyJjYXN0IiwgInJhd3R5cGVzIiwgInNlcmlhbCIsICJ1bmNoZWNrZWQifSkKLUBHZW5lcmF0ZWQodmFsdWUgPSAiQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4yKSIsIGRhdGUgPSAiMjAxNS0yLTYiKQorQEdlbmVyYXRlZCh2YWx1ZSA9ICJBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjMpIikKIHB1YmxpYyBjbGFzcyBHZXRJbmZvT3B0aW9ucyBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlPEdldEluZm9PcHRpb25zLCBHZXRJbmZvT3B0aW9ucy5fRmllbGRzPiwgamF2YS5pby5TZXJpYWxpemFibGUsIENsb25lYWJsZSwgQ29tcGFyYWJsZTxHZXRJbmZvT3B0aW9ucz4gewogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0IFNUUlVDVF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QoIkdldEluZm9PcHRpb25zIik7CiAKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvR2xvYmFsU3RyZWFtSWQuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvR2xvYmFsU3RyZWFtSWQuamF2YQppbmRleCAwMTdhZDRmLi43MWE2NzhmIDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL0dsb2JhbFN0cmVhbUlkLmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9HbG9iYWxTdHJlYW1JZC5qYXZhCkBAIC0xNiw3ICsxNiw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogLyoqCi0gKiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjIpCisgKiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjMpCiAgKgogICogRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lORwogICogIEBnZW5lcmF0ZWQKQEAgLTUxLDcgKzUxLDcgQEAKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAogQFN1cHByZXNzV2FybmluZ3MoeyJjYXN0IiwgInJhd3R5cGVzIiwgInNlcmlhbCIsICJ1bmNoZWNrZWQifSkKLUBHZW5lcmF0ZWQodmFsdWUgPSAiQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4yKSIsIGRhdGUgPSAiMjAxNS0yLTYiKQorQEdlbmVyYXRlZCh2YWx1ZSA9ICJBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjMpIikKIHB1YmxpYyBjbGFzcyBHbG9iYWxTdHJlYW1JZCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlPEdsb2JhbFN0cmVhbUlkLCBHbG9iYWxTdHJlYW1JZC5fRmllbGRzPiwgamF2YS5pby5TZXJpYWxpemFibGUsIENsb25lYWJsZSwgQ29tcGFyYWJsZTxHbG9iYWxTdHJlYW1JZD4gewogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0IFNUUlVDVF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QoIkdsb2JhbFN0cmVhbUlkIik7CiAKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvR3JvdXBpbmcuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvR3JvdXBpbmcuamF2YQppbmRleCAzOTk0NDk5Li41YjI5YmM2IDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL0dyb3VwaW5nLmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9Hcm91cGluZy5qYXZhCkBAIC0xNiw3ICsxNiw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogLyoqCi0gKiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjIpCisgKiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjMpCiAgKgogICogRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lORwogICogIEBnZW5lcmF0ZWQKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvSEJBdXRob3JpemF0aW9uRXhjZXB0aW9uLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL0hCQXV0aG9yaXphdGlvbkV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMjFhZjQKLS0tIC9kZXYvbnVsbAorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL0hCQXV0aG9yaXphdGlvbkV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDA2IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLyoqCisgKiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjMpCisgKgorICogRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lORworICogIEBnZW5lcmF0ZWQKKyAqLworcGFja2FnZSBiYWNrdHlwZS5zdG9ybS5nZW5lcmF0ZWQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuSVNjaGVtZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuU2NoZW1lRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuU3RhbmRhcmRTY2hlbWU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuVHVwbGVTY2hlbWU7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR1cGxlUHJvdG9jb2w7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LkVuY29kaW5nVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5Bc3luY01ldGhvZENhbGxiYWNrOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci5BYnN0cmFjdE5vbmJsb2NraW5nU2VydmVyLio7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5FbnVtTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5CaXRTZXQ7CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiY2FzdCIsICJyYXd0eXBlcyIsICJzZXJpYWwiLCAidW5jaGVja2VkIn0pCitAR2VuZXJhdGVkKHZhbHVlID0gIkF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMykiKQorcHVibGljIGNsYXNzIEhCQXV0aG9yaXphdGlvbkV4Y2VwdGlvbiBleHRlbmRzIFRFeGNlcHRpb24gaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZTxIQkF1dGhvcml6YXRpb25FeGNlcHRpb24sIEhCQXV0aG9yaXphdGlvbkV4Y2VwdGlvbi5fRmllbGRzPiwgamF2YS5pby5TZXJpYWxpemFibGUsIENsb25lYWJsZSwgQ29tcGFyYWJsZTxIQkF1dGhvcml6YXRpb25FeGNlcHRpb24+IHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdCBTVFJVQ1RfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0KCJIQkF1dGhvcml6YXRpb25FeGNlcHRpb24iKTsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgTVNHX0ZJRUxEX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkKCJtc2ciLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcsIChzaG9ydCkxKTsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8Q2xhc3M8PyBleHRlbmRzIElTY2hlbWU+LCBTY2hlbWVGYWN0b3J5PiBzY2hlbWVzID0gbmV3IEhhc2hNYXA8Q2xhc3M8PyBleHRlbmRzIElTY2hlbWU+LCBTY2hlbWVGYWN0b3J5PigpOworICBzdGF0aWMgeworICAgIHNjaGVtZXMucHV0KFN0YW5kYXJkU2NoZW1lLmNsYXNzLCBuZXcgSEJBdXRob3JpemF0aW9uRXhjZXB0aW9uU3RhbmRhcmRTY2hlbWVGYWN0b3J5KCkpOworICAgIHNjaGVtZXMucHV0KFR1cGxlU2NoZW1lLmNsYXNzLCBuZXcgSEJBdXRob3JpemF0aW9uRXhjZXB0aW9uVHVwbGVTY2hlbWVGYWN0b3J5KCkpOworICB9CisKKyAgcHJpdmF0ZSBTdHJpbmcgbXNnOyAvLyByZXF1aXJlZAorCisgIC8qKiBUaGUgc2V0IG9mIGZpZWxkcyB0aGlzIHN0cnVjdCBjb250YWlucywgYWxvbmcgd2l0aCBjb252ZW5pZW5jZSBtZXRob2RzIGZvciBmaW5kaW5nIGFuZCBtYW5pcHVsYXRpbmcgdGhlbS4gKi8KKyAgcHVibGljIGVudW0gX0ZpZWxkcyBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZElkRW51bSB7CisgICAgTVNHKChzaG9ydCkxLCAibXNnIik7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBfRmllbGRzPiBieU5hbWUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIF9GaWVsZHM+KCk7CisKKyAgICBzdGF0aWMgeworICAgICAgZm9yIChfRmllbGRzIGZpZWxkIDogRW51bVNldC5hbGxPZihfRmllbGRzLmNsYXNzKSkgeworICAgICAgICBieU5hbWUucHV0KGZpZWxkLmdldEZpZWxkTmFtZSgpLCBmaWVsZCk7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCB0aGUgX0ZpZWxkcyBjb25zdGFudCB0aGF0IG1hdGNoZXMgZmllbGRJZCwgb3IgbnVsbCBpZiBpdHMgbm90IGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgX0ZpZWxkcyBmaW5kQnlUaHJpZnRJZChpbnQgZmllbGRJZCkgeworICAgICAgc3dpdGNoKGZpZWxkSWQpIHsKKyAgICAgICAgY2FzZSAxOiAvLyBNU0cKKyAgICAgICAgICByZXR1cm4gTVNHOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgdGhlIF9GaWVsZHMgY29uc3RhbnQgdGhhdCBtYXRjaGVzIGZpZWxkSWQsIHRocm93aW5nIGFuIGV4Y2VwdGlvbgorICAgICAqIGlmIGl0IGlzIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIF9GaWVsZHMgZmluZEJ5VGhyaWZ0SWRPclRocm93KGludCBmaWVsZElkKSB7CisgICAgICBfRmllbGRzIGZpZWxkcyA9IGZpbmRCeVRocmlmdElkKGZpZWxkSWQpOworICAgICAgaWYgKGZpZWxkcyA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJGaWVsZCAiICsgZmllbGRJZCArICIgZG9lc24ndCBleGlzdCEiKTsKKyAgICAgIHJldHVybiBmaWVsZHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCB0aGUgX0ZpZWxkcyBjb25zdGFudCB0aGF0IG1hdGNoZXMgbmFtZSwgb3IgbnVsbCBpZiBpdHMgbm90IGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgX0ZpZWxkcyBmaW5kQnlOYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICByZXR1cm4gYnlOYW1lLmdldChuYW1lKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIHNob3J0IF90aHJpZnRJZDsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBfZmllbGROYW1lOworCisgICAgX0ZpZWxkcyhzaG9ydCB0aHJpZnRJZCwgU3RyaW5nIGZpZWxkTmFtZSkgeworICAgICAgX3RocmlmdElkID0gdGhyaWZ0SWQ7CisgICAgICBfZmllbGROYW1lID0gZmllbGROYW1lOworICAgIH0KKworICAgIHB1YmxpYyBzaG9ydCBnZXRUaHJpZnRGaWVsZElkKCkgeworICAgICAgcmV0dXJuIF90aHJpZnRJZDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEZpZWxkTmFtZSgpIHsKKyAgICAgIHJldHVybiBfZmllbGROYW1lOworICAgIH0KKyAgfQorCisgIC8vIGlzc2V0IGlkIGFzc2lnbm1lbnRzCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPiBtZXRhRGF0YU1hcDsKKyAgc3RhdGljIHsKKyAgICBNYXA8X0ZpZWxkcywgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGE+IHRtcE1hcCA9IG5ldyBFbnVtTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPihfRmllbGRzLmNsYXNzKTsKKyAgICB0bXBNYXAucHV0KF9GaWVsZHMuTVNHLCBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEoIm1zZyIsIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZFJlcXVpcmVtZW50VHlwZS5SRVFVSVJFRCwgCisgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRWYWx1ZU1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORykpKTsKKyAgICBtZXRhRGF0YU1hcCA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcCh0bXBNYXApOworICAgIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhLmFkZFN0cnVjdE1ldGFEYXRhTWFwKEhCQXV0aG9yaXphdGlvbkV4Y2VwdGlvbi5jbGFzcywgbWV0YURhdGFNYXApOworICB9CisKKyAgcHVibGljIEhCQXV0aG9yaXphdGlvbkV4Y2VwdGlvbigpIHsKKyAgfQorCisgIHB1YmxpYyBIQkF1dGhvcml6YXRpb25FeGNlcHRpb24oCisgICAgU3RyaW5nIG1zZykKKyAgeworICAgIHRoaXMoKTsKKyAgICB0aGlzLm1zZyA9IG1zZzsKKyAgfQorCisgIC8qKgorICAgKiBQZXJmb3JtcyBhIGRlZXAgY29weSBvbiA8aT5vdGhlcjwvaT4uCisgICAqLworICBwdWJsaWMgSEJBdXRob3JpemF0aW9uRXhjZXB0aW9uKEhCQXV0aG9yaXphdGlvbkV4Y2VwdGlvbiBvdGhlcikgeworICAgIGlmIChvdGhlci5pc19zZXRfbXNnKCkpIHsKKyAgICAgIHRoaXMubXNnID0gb3RoZXIubXNnOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBIQkF1dGhvcml6YXRpb25FeGNlcHRpb24gZGVlcENvcHkoKSB7CisgICAgcmV0dXJuIG5ldyBIQkF1dGhvcml6YXRpb25FeGNlcHRpb24odGhpcyk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgdGhpcy5tc2cgPSBudWxsOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRfbXNnKCkgeworICAgIHJldHVybiB0aGlzLm1zZzsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF9tc2coU3RyaW5nIG1zZykgeworICAgIHRoaXMubXNnID0gbXNnOworICB9CisKKyAgcHVibGljIHZvaWQgdW5zZXRfbXNnKCkgeworICAgIHRoaXMubXNnID0gbnVsbDsKKyAgfQorCisgIC8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgbXNnIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLworICBwdWJsaWMgYm9vbGVhbiBpc19zZXRfbXNnKCkgeworICAgIHJldHVybiB0aGlzLm1zZyAhPSBudWxsOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X21zZ19pc1NldChib29sZWFuIHZhbHVlKSB7CisgICAgaWYgKCF2YWx1ZSkgeworICAgICAgdGhpcy5tc2cgPSBudWxsOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldEZpZWxkVmFsdWUoX0ZpZWxkcyBmaWVsZCwgT2JqZWN0IHZhbHVlKSB7CisgICAgc3dpdGNoIChmaWVsZCkgeworICAgIGNhc2UgTVNHOgorICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgdW5zZXRfbXNnKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzZXRfbXNnKChTdHJpbmcpdmFsdWUpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICB9CisgIH0KKworICBwdWJsaWMgT2JqZWN0IGdldEZpZWxkVmFsdWUoX0ZpZWxkcyBmaWVsZCkgeworICAgIHN3aXRjaCAoZmllbGQpIHsKKyAgICBjYXNlIE1TRzoKKyAgICAgIHJldHVybiBnZXRfbXNnKCk7CisKKyAgICB9CisgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICB9CisKKyAgLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBjb3JyZXNwb25kaW5nIHRvIGZpZWxkSUQgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgIHB1YmxpYyBib29sZWFuIGlzU2V0KF9GaWVsZHMgZmllbGQpIHsKKyAgICBpZiAoZmllbGQgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHN3aXRjaCAoZmllbGQpIHsKKyAgICBjYXNlIE1TRzoKKyAgICAgIHJldHVybiBpc19zZXRfbXNnKCk7CisgICAgfQorICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IHRoYXQpIHsKKyAgICBpZiAodGhhdCA9PSBudWxsKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmICh0aGF0IGluc3RhbmNlb2YgSEJBdXRob3JpemF0aW9uRXhjZXB0aW9uKQorICAgICAgcmV0dXJuIHRoaXMuZXF1YWxzKChIQkF1dGhvcml6YXRpb25FeGNlcHRpb24pdGhhdCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gZXF1YWxzKEhCQXV0aG9yaXphdGlvbkV4Y2VwdGlvbiB0aGF0KSB7CisgICAgaWYgKHRoYXQgPT0gbnVsbCkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGJvb2xlYW4gdGhpc19wcmVzZW50X21zZyA9IHRydWUgJiYgdGhpcy5pc19zZXRfbXNnKCk7CisgICAgYm9vbGVhbiB0aGF0X3ByZXNlbnRfbXNnID0gdHJ1ZSAmJiB0aGF0LmlzX3NldF9tc2coKTsKKyAgICBpZiAodGhpc19wcmVzZW50X21zZyB8fCB0aGF0X3ByZXNlbnRfbXNnKSB7CisgICAgICBpZiAoISh0aGlzX3ByZXNlbnRfbXNnICYmIHRoYXRfcHJlc2VudF9tc2cpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBpZiAoIXRoaXMubXNnLmVxdWFscyh0aGF0Lm1zZykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgIExpc3Q8T2JqZWN0PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7CisKKyAgICBib29sZWFuIHByZXNlbnRfbXNnID0gdHJ1ZSAmJiAoaXNfc2V0X21zZygpKTsKKyAgICBsaXN0LmFkZChwcmVzZW50X21zZyk7CisgICAgaWYgKHByZXNlbnRfbXNnKQorICAgICAgbGlzdC5hZGQobXNnKTsKKworICAgIHJldHVybiBsaXN0Lmhhc2hDb2RlKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBjb21wYXJlVG8oSEJBdXRob3JpemF0aW9uRXhjZXB0aW9uIG90aGVyKSB7CisgICAgaWYgKCFnZXRDbGFzcygpLmVxdWFscyhvdGhlci5nZXRDbGFzcygpKSkgeworICAgICAgcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpLmNvbXBhcmVUbyhvdGhlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgfQorCisgICAgaW50IGxhc3RDb21wYXJpc29uID0gMDsKKworICAgIGxhc3RDb21wYXJpc29uID0gQm9vbGVhbi52YWx1ZU9mKGlzX3NldF9tc2coKSkuY29tcGFyZVRvKG90aGVyLmlzX3NldF9tc2coKSk7CisgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICB9CisgICAgaWYgKGlzX3NldF9tc2coKSkgeworICAgICAgbGFzdENvbXBhcmlzb24gPSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy5tc2csIG90aGVyLm1zZyk7CisgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworICB9CisKKyAgcHVibGljIF9GaWVsZHMgZmllbGRGb3JJZChpbnQgZmllbGRJZCkgeworICAgIHJldHVybiBfRmllbGRzLmZpbmRCeVRocmlmdElkKGZpZWxkSWQpOworICB9CisKKyAgcHVibGljIHZvaWQgcmVhZChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgaXByb3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICBzY2hlbWVzLmdldChpcHJvdC5nZXRTY2hlbWUoKSkuZ2V0U2NoZW1lKCkucmVhZChpcHJvdCwgdGhpcyk7CisgIH0KKworICBwdWJsaWMgdm9pZCB3cml0ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgb3Byb3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICBzY2hlbWVzLmdldChvcHJvdC5nZXRTY2hlbWUoKSkuZ2V0U2NoZW1lKCkud3JpdGUob3Byb3QsIHRoaXMpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCJIQkF1dGhvcml6YXRpb25FeGNlcHRpb24oIik7CisgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7CisKKyAgICBzYi5hcHBlbmQoIm1zZzoiKTsKKyAgICBpZiAodGhpcy5tc2cgPT0gbnVsbCkgeworICAgICAgc2IuYXBwZW5kKCJudWxsIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHNiLmFwcGVuZCh0aGlzLm1zZyk7CisgICAgfQorICAgIGZpcnN0ID0gZmFsc2U7CisgICAgc2IuYXBwZW5kKCIpIik7CisgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAvLyBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzCisgICAgaWYgKCFpc19zZXRfbXNnKCkpIHsKKyAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xFeGNlcHRpb24oIlJlcXVpcmVkIGZpZWxkICdtc2cnIGlzIHVuc2V0ISBTdHJ1Y3Q6IiArIHRvU3RyaW5nKCkpOworICAgIH0KKworICAgIC8vIGNoZWNrIGZvciBzdWItc3RydWN0IHZhbGlkaXR5CisgIH0KKworICBwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIHdyaXRlKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQ29tcGFjdFByb3RvY29sKG5ldyBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVElPU3RyZWFtVHJhbnNwb3J0KG91dCkpKTsKKyAgICB9IGNhdGNoIChvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHRlKSB7CisgICAgICB0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbih0ZSk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBpbikgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICByZWFkKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQ29tcGFjdFByb3RvY29sKG5ldyBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVElPU3RyZWFtVHJhbnNwb3J0KGluKSkpOworICAgIH0gY2F0Y2ggKG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24gdGUpIHsKKyAgICAgIHRocm93IG5ldyBqYXZhLmlvLklPRXhjZXB0aW9uKHRlKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBIQkF1dGhvcml6YXRpb25FeGNlcHRpb25TdGFuZGFyZFNjaGVtZUZhY3RvcnkgaW1wbGVtZW50cyBTY2hlbWVGYWN0b3J5IHsKKyAgICBwdWJsaWMgSEJBdXRob3JpemF0aW9uRXhjZXB0aW9uU3RhbmRhcmRTY2hlbWUgZ2V0U2NoZW1lKCkgeworICAgICAgcmV0dXJuIG5ldyBIQkF1dGhvcml6YXRpb25FeGNlcHRpb25TdGFuZGFyZFNjaGVtZSgpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIEhCQXV0aG9yaXphdGlvbkV4Y2VwdGlvblN0YW5kYXJkU2NoZW1lIGV4dGVuZHMgU3RhbmRhcmRTY2hlbWU8SEJBdXRob3JpemF0aW9uRXhjZXB0aW9uPiB7CisKKyAgICBwdWJsaWMgdm9pZCByZWFkKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBpcHJvdCwgSEJBdXRob3JpemF0aW9uRXhjZXB0aW9uIHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIHNjaGVtZUZpZWxkOworICAgICAgaXByb3QucmVhZFN0cnVjdEJlZ2luKCk7CisgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgIHsKKyAgICAgICAgc2NoZW1lRmllbGQgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpOworICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVE9QKSB7IAorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoc2NoZW1lRmllbGQuaWQpIHsKKyAgICAgICAgICBjYXNlIDE6IC8vIE1TRworICAgICAgICAgICAgaWYgKHNjaGVtZUZpZWxkLnR5cGUgPT0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HKSB7CisgICAgICAgICAgICAgIHN0cnVjdC5tc2cgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICAgIHN0cnVjdC5zZXRfbXNnX2lzU2V0KHRydWUpOworICAgICAgICAgICAgfSBlbHNlIHsgCisgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgc2NoZW1lRmllbGQudHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKKyAgICAgICAgfQorICAgICAgICBpcHJvdC5yZWFkRmllbGRFbmQoKTsKKyAgICAgIH0KKyAgICAgIGlwcm90LnJlYWRTdHJ1Y3RFbmQoKTsKKyAgICAgIHN0cnVjdC52YWxpZGF0ZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBvcHJvdCwgSEJBdXRob3JpemF0aW9uRXhjZXB0aW9uIHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgc3RydWN0LnZhbGlkYXRlKCk7CisKKyAgICAgIG9wcm90LndyaXRlU3RydWN0QmVnaW4oU1RSVUNUX0RFU0MpOworICAgICAgaWYgKHN0cnVjdC5tc2cgIT0gbnVsbCkgeworICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oTVNHX0ZJRUxEX0RFU0MpOworICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhzdHJ1Y3QubXNnKTsKKyAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgICAgfQorICAgICAgb3Byb3Qud3JpdGVGaWVsZFN0b3AoKTsKKyAgICAgIG9wcm90LndyaXRlU3RydWN0RW5kKCk7CisgICAgfQorCisgIH0KKworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBIQkF1dGhvcml6YXRpb25FeGNlcHRpb25UdXBsZVNjaGVtZUZhY3RvcnkgaW1wbGVtZW50cyBTY2hlbWVGYWN0b3J5IHsKKyAgICBwdWJsaWMgSEJBdXRob3JpemF0aW9uRXhjZXB0aW9uVHVwbGVTY2hlbWUgZ2V0U2NoZW1lKCkgeworICAgICAgcmV0dXJuIG5ldyBIQkF1dGhvcml6YXRpb25FeGNlcHRpb25UdXBsZVNjaGVtZSgpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIEhCQXV0aG9yaXphdGlvbkV4Y2VwdGlvblR1cGxlU2NoZW1lIGV4dGVuZHMgVHVwbGVTY2hlbWU8SEJBdXRob3JpemF0aW9uRXhjZXB0aW9uPiB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgcHJvdCwgSEJBdXRob3JpemF0aW9uRXhjZXB0aW9uIHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgVFR1cGxlUHJvdG9jb2wgb3Byb3QgPSAoVFR1cGxlUHJvdG9jb2wpIHByb3Q7CisgICAgICBvcHJvdC53cml0ZVN0cmluZyhzdHJ1Y3QubXNnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZWFkKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBwcm90LCBIQkF1dGhvcml6YXRpb25FeGNlcHRpb24gc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICBUVHVwbGVQcm90b2NvbCBpcHJvdCA9IChUVHVwbGVQcm90b2NvbCkgcHJvdDsKKyAgICAgIHN0cnVjdC5tc2cgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICBzdHJ1Y3Quc2V0X21zZ19pc1NldCh0cnVlKTsKKyAgICB9CisgIH0KKworfQorCmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL0hCRXhlY3V0aW9uRXhjZXB0aW9uLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL0hCRXhlY3V0aW9uRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYzOTFmZQotLS0gL2Rldi9udWxsCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvSEJFeGVjdXRpb25FeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDQwNiBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8qKgorICogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4zKQorICoKKyAqIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkcKKyAqICBAZ2VuZXJhdGVkCisgKi8KK3BhY2thZ2UgYmFja3R5cGUuc3Rvcm0uZ2VuZXJhdGVkOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLklTY2hlbWU7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLlNjaGVtZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLlN0YW5kYXJkU2NoZW1lOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLlR1cGxlU2NoZW1lOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUdXBsZVByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5FbmNvZGluZ1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuQXN5bmNNZXRob2RDYWxsYmFjazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlci4qOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bU1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuQml0U2V0OworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLkdlbmVyYXRlZDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitAU3VwcHJlc3NXYXJuaW5ncyh7ImNhc3QiLCAicmF3dHlwZXMiLCAic2VyaWFsIiwgInVuY2hlY2tlZCJ9KQorQEdlbmVyYXRlZCh2YWx1ZSA9ICJBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjMpIikKK3B1YmxpYyBjbGFzcyBIQkV4ZWN1dGlvbkV4Y2VwdGlvbiBleHRlbmRzIFRFeGNlcHRpb24gaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZTxIQkV4ZWN1dGlvbkV4Y2VwdGlvbiwgSEJFeGVjdXRpb25FeGNlcHRpb24uX0ZpZWxkcz4sIGphdmEuaW8uU2VyaWFsaXphYmxlLCBDbG9uZWFibGUsIENvbXBhcmFibGU8SEJFeGVjdXRpb25FeGNlcHRpb24+IHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdCBTVFJVQ1RfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0KCJIQkV4ZWN1dGlvbkV4Y2VwdGlvbiIpOworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBNU0dfRklFTERfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQoIm1zZyIsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORywgKHNob3J0KTEpOworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxDbGFzczw/IGV4dGVuZHMgSVNjaGVtZT4sIFNjaGVtZUZhY3Rvcnk+IHNjaGVtZXMgPSBuZXcgSGFzaE1hcDxDbGFzczw/IGV4dGVuZHMgSVNjaGVtZT4sIFNjaGVtZUZhY3Rvcnk+KCk7CisgIHN0YXRpYyB7CisgICAgc2NoZW1lcy5wdXQoU3RhbmRhcmRTY2hlbWUuY2xhc3MsIG5ldyBIQkV4ZWN1dGlvbkV4Y2VwdGlvblN0YW5kYXJkU2NoZW1lRmFjdG9yeSgpKTsKKyAgICBzY2hlbWVzLnB1dChUdXBsZVNjaGVtZS5jbGFzcywgbmV3IEhCRXhlY3V0aW9uRXhjZXB0aW9uVHVwbGVTY2hlbWVGYWN0b3J5KCkpOworICB9CisKKyAgcHJpdmF0ZSBTdHJpbmcgbXNnOyAvLyByZXF1aXJlZAorCisgIC8qKiBUaGUgc2V0IG9mIGZpZWxkcyB0aGlzIHN0cnVjdCBjb250YWlucywgYWxvbmcgd2l0aCBjb252ZW5pZW5jZSBtZXRob2RzIGZvciBmaW5kaW5nIGFuZCBtYW5pcHVsYXRpbmcgdGhlbS4gKi8KKyAgcHVibGljIGVudW0gX0ZpZWxkcyBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZElkRW51bSB7CisgICAgTVNHKChzaG9ydCkxLCAibXNnIik7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBfRmllbGRzPiBieU5hbWUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIF9GaWVsZHM+KCk7CisKKyAgICBzdGF0aWMgeworICAgICAgZm9yIChfRmllbGRzIGZpZWxkIDogRW51bVNldC5hbGxPZihfRmllbGRzLmNsYXNzKSkgeworICAgICAgICBieU5hbWUucHV0KGZpZWxkLmdldEZpZWxkTmFtZSgpLCBmaWVsZCk7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCB0aGUgX0ZpZWxkcyBjb25zdGFudCB0aGF0IG1hdGNoZXMgZmllbGRJZCwgb3IgbnVsbCBpZiBpdHMgbm90IGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgX0ZpZWxkcyBmaW5kQnlUaHJpZnRJZChpbnQgZmllbGRJZCkgeworICAgICAgc3dpdGNoKGZpZWxkSWQpIHsKKyAgICAgICAgY2FzZSAxOiAvLyBNU0cKKyAgICAgICAgICByZXR1cm4gTVNHOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgdGhlIF9GaWVsZHMgY29uc3RhbnQgdGhhdCBtYXRjaGVzIGZpZWxkSWQsIHRocm93aW5nIGFuIGV4Y2VwdGlvbgorICAgICAqIGlmIGl0IGlzIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIF9GaWVsZHMgZmluZEJ5VGhyaWZ0SWRPclRocm93KGludCBmaWVsZElkKSB7CisgICAgICBfRmllbGRzIGZpZWxkcyA9IGZpbmRCeVRocmlmdElkKGZpZWxkSWQpOworICAgICAgaWYgKGZpZWxkcyA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJGaWVsZCAiICsgZmllbGRJZCArICIgZG9lc24ndCBleGlzdCEiKTsKKyAgICAgIHJldHVybiBmaWVsZHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCB0aGUgX0ZpZWxkcyBjb25zdGFudCB0aGF0IG1hdGNoZXMgbmFtZSwgb3IgbnVsbCBpZiBpdHMgbm90IGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgX0ZpZWxkcyBmaW5kQnlOYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICByZXR1cm4gYnlOYW1lLmdldChuYW1lKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIHNob3J0IF90aHJpZnRJZDsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBfZmllbGROYW1lOworCisgICAgX0ZpZWxkcyhzaG9ydCB0aHJpZnRJZCwgU3RyaW5nIGZpZWxkTmFtZSkgeworICAgICAgX3RocmlmdElkID0gdGhyaWZ0SWQ7CisgICAgICBfZmllbGROYW1lID0gZmllbGROYW1lOworICAgIH0KKworICAgIHB1YmxpYyBzaG9ydCBnZXRUaHJpZnRGaWVsZElkKCkgeworICAgICAgcmV0dXJuIF90aHJpZnRJZDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEZpZWxkTmFtZSgpIHsKKyAgICAgIHJldHVybiBfZmllbGROYW1lOworICAgIH0KKyAgfQorCisgIC8vIGlzc2V0IGlkIGFzc2lnbm1lbnRzCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPiBtZXRhRGF0YU1hcDsKKyAgc3RhdGljIHsKKyAgICBNYXA8X0ZpZWxkcywgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGE+IHRtcE1hcCA9IG5ldyBFbnVtTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPihfRmllbGRzLmNsYXNzKTsKKyAgICB0bXBNYXAucHV0KF9GaWVsZHMuTVNHLCBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEoIm1zZyIsIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZFJlcXVpcmVtZW50VHlwZS5SRVFVSVJFRCwgCisgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRWYWx1ZU1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORykpKTsKKyAgICBtZXRhRGF0YU1hcCA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcCh0bXBNYXApOworICAgIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhLmFkZFN0cnVjdE1ldGFEYXRhTWFwKEhCRXhlY3V0aW9uRXhjZXB0aW9uLmNsYXNzLCBtZXRhRGF0YU1hcCk7CisgIH0KKworICBwdWJsaWMgSEJFeGVjdXRpb25FeGNlcHRpb24oKSB7CisgIH0KKworICBwdWJsaWMgSEJFeGVjdXRpb25FeGNlcHRpb24oCisgICAgU3RyaW5nIG1zZykKKyAgeworICAgIHRoaXMoKTsKKyAgICB0aGlzLm1zZyA9IG1zZzsKKyAgfQorCisgIC8qKgorICAgKiBQZXJmb3JtcyBhIGRlZXAgY29weSBvbiA8aT5vdGhlcjwvaT4uCisgICAqLworICBwdWJsaWMgSEJFeGVjdXRpb25FeGNlcHRpb24oSEJFeGVjdXRpb25FeGNlcHRpb24gb3RoZXIpIHsKKyAgICBpZiAob3RoZXIuaXNfc2V0X21zZygpKSB7CisgICAgICB0aGlzLm1zZyA9IG90aGVyLm1zZzsKKyAgICB9CisgIH0KKworICBwdWJsaWMgSEJFeGVjdXRpb25FeGNlcHRpb24gZGVlcENvcHkoKSB7CisgICAgcmV0dXJuIG5ldyBIQkV4ZWN1dGlvbkV4Y2VwdGlvbih0aGlzKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICB0aGlzLm1zZyA9IG51bGw7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldF9tc2coKSB7CisgICAgcmV0dXJuIHRoaXMubXNnOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X21zZyhTdHJpbmcgbXNnKSB7CisgICAgdGhpcy5tc2cgPSBtc2c7CisgIH0KKworICBwdWJsaWMgdm9pZCB1bnNldF9tc2coKSB7CisgICAgdGhpcy5tc2cgPSBudWxsOworICB9CisKKyAgLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBtc2cgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgIHB1YmxpYyBib29sZWFuIGlzX3NldF9tc2coKSB7CisgICAgcmV0dXJuIHRoaXMubXNnICE9IG51bGw7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfbXNnX2lzU2V0KGJvb2xlYW4gdmFsdWUpIHsKKyAgICBpZiAoIXZhbHVlKSB7CisgICAgICB0aGlzLm1zZyA9IG51bGw7CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgc2V0RmllbGRWYWx1ZShfRmllbGRzIGZpZWxkLCBPYmplY3QgdmFsdWUpIHsKKyAgICBzd2l0Y2ggKGZpZWxkKSB7CisgICAgY2FzZSBNU0c6CisgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICB1bnNldF9tc2coKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNldF9tc2coKFN0cmluZyl2YWx1ZSk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIH0KKyAgfQorCisgIHB1YmxpYyBPYmplY3QgZ2V0RmllbGRWYWx1ZShfRmllbGRzIGZpZWxkKSB7CisgICAgc3dpdGNoIChmaWVsZCkgeworICAgIGNhc2UgTVNHOgorICAgICAgcmV0dXJuIGdldF9tc2coKTsKKworICAgIH0KKyAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgIH0KKworICAvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkIGNvcnJlc3BvbmRpbmcgdG8gZmllbGRJRCBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNTZXQoX0ZpZWxkcyBmaWVsZCkgeworICAgIGlmIChmaWVsZCA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgc3dpdGNoIChmaWVsZCkgeworICAgIGNhc2UgTVNHOgorICAgICAgcmV0dXJuIGlzX3NldF9tc2coKTsKKyAgICB9CisgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgdGhhdCkgeworICAgIGlmICh0aGF0ID09IG51bGwpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKHRoYXQgaW5zdGFuY2VvZiBIQkV4ZWN1dGlvbkV4Y2VwdGlvbikKKyAgICAgIHJldHVybiB0aGlzLmVxdWFscygoSEJFeGVjdXRpb25FeGNlcHRpb24pdGhhdCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gZXF1YWxzKEhCRXhlY3V0aW9uRXhjZXB0aW9uIHRoYXQpIHsKKyAgICBpZiAodGhhdCA9PSBudWxsKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgYm9vbGVhbiB0aGlzX3ByZXNlbnRfbXNnID0gdHJ1ZSAmJiB0aGlzLmlzX3NldF9tc2coKTsKKyAgICBib29sZWFuIHRoYXRfcHJlc2VudF9tc2cgPSB0cnVlICYmIHRoYXQuaXNfc2V0X21zZygpOworICAgIGlmICh0aGlzX3ByZXNlbnRfbXNnIHx8IHRoYXRfcHJlc2VudF9tc2cpIHsKKyAgICAgIGlmICghKHRoaXNfcHJlc2VudF9tc2cgJiYgdGhhdF9wcmVzZW50X21zZykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGlmICghdGhpcy5tc2cuZXF1YWxzKHRoYXQubXNnKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgTGlzdDxPYmplY3Q+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKKworICAgIGJvb2xlYW4gcHJlc2VudF9tc2cgPSB0cnVlICYmIChpc19zZXRfbXNnKCkpOworICAgIGxpc3QuYWRkKHByZXNlbnRfbXNnKTsKKyAgICBpZiAocHJlc2VudF9tc2cpCisgICAgICBsaXN0LmFkZChtc2cpOworCisgICAgcmV0dXJuIGxpc3QuaGFzaENvZGUoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGNvbXBhcmVUbyhIQkV4ZWN1dGlvbkV4Y2VwdGlvbiBvdGhlcikgeworICAgIGlmICghZ2V0Q2xhc3MoKS5lcXVhbHMob3RoZXIuZ2V0Q2xhc3MoKSkpIHsKKyAgICAgIHJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKS5jb21wYXJlVG8ob3RoZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgIH0KKworICAgIGludCBsYXN0Q29tcGFyaXNvbiA9IDA7CisKKyAgICBsYXN0Q29tcGFyaXNvbiA9IEJvb2xlYW4udmFsdWVPZihpc19zZXRfbXNnKCkpLmNvbXBhcmVUbyhvdGhlci5pc19zZXRfbXNnKCkpOworICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgfQorICAgIGlmIChpc19zZXRfbXNnKCkpIHsKKyAgICAgIGxhc3RDb21wYXJpc29uID0gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29tcGFyZVRvKHRoaXMubXNnLCBvdGhlci5tc2cpOworICAgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHB1YmxpYyBfRmllbGRzIGZpZWxkRm9ySWQoaW50IGZpZWxkSWQpIHsKKyAgICByZXR1cm4gX0ZpZWxkcy5maW5kQnlUaHJpZnRJZChmaWVsZElkKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHJlYWQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIGlwcm90KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgc2NoZW1lcy5nZXQoaXByb3QuZ2V0U2NoZW1lKCkpLmdldFNjaGVtZSgpLnJlYWQoaXByb3QsIHRoaXMpOworICB9CisKKyAgcHVibGljIHZvaWQgd3JpdGUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIG9wcm90KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgc2NoZW1lcy5nZXQob3Byb3QuZ2V0U2NoZW1lKCkpLmdldFNjaGVtZSgpLndyaXRlKG9wcm90LCB0aGlzKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigiSEJFeGVjdXRpb25FeGNlcHRpb24oIik7CisgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7CisKKyAgICBzYi5hcHBlbmQoIm1zZzoiKTsKKyAgICBpZiAodGhpcy5tc2cgPT0gbnVsbCkgeworICAgICAgc2IuYXBwZW5kKCJudWxsIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHNiLmFwcGVuZCh0aGlzLm1zZyk7CisgICAgfQorICAgIGZpcnN0ID0gZmFsc2U7CisgICAgc2IuYXBwZW5kKCIpIik7CisgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAvLyBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzCisgICAgaWYgKCFpc19zZXRfbXNnKCkpIHsKKyAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xFeGNlcHRpb24oIlJlcXVpcmVkIGZpZWxkICdtc2cnIGlzIHVuc2V0ISBTdHJ1Y3Q6IiArIHRvU3RyaW5nKCkpOworICAgIH0KKworICAgIC8vIGNoZWNrIGZvciBzdWItc3RydWN0IHZhbGlkaXR5CisgIH0KKworICBwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIHdyaXRlKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQ29tcGFjdFByb3RvY29sKG5ldyBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVElPU3RyZWFtVHJhbnNwb3J0KG91dCkpKTsKKyAgICB9IGNhdGNoIChvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHRlKSB7CisgICAgICB0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbih0ZSk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBpbikgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICByZWFkKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQ29tcGFjdFByb3RvY29sKG5ldyBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVElPU3RyZWFtVHJhbnNwb3J0KGluKSkpOworICAgIH0gY2F0Y2ggKG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24gdGUpIHsKKyAgICAgIHRocm93IG5ldyBqYXZhLmlvLklPRXhjZXB0aW9uKHRlKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBIQkV4ZWN1dGlvbkV4Y2VwdGlvblN0YW5kYXJkU2NoZW1lRmFjdG9yeSBpbXBsZW1lbnRzIFNjaGVtZUZhY3RvcnkgeworICAgIHB1YmxpYyBIQkV4ZWN1dGlvbkV4Y2VwdGlvblN0YW5kYXJkU2NoZW1lIGdldFNjaGVtZSgpIHsKKyAgICAgIHJldHVybiBuZXcgSEJFeGVjdXRpb25FeGNlcHRpb25TdGFuZGFyZFNjaGVtZSgpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIEhCRXhlY3V0aW9uRXhjZXB0aW9uU3RhbmRhcmRTY2hlbWUgZXh0ZW5kcyBTdGFuZGFyZFNjaGVtZTxIQkV4ZWN1dGlvbkV4Y2VwdGlvbj4geworCisgICAgcHVibGljIHZvaWQgcmVhZChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgaXByb3QsIEhCRXhlY3V0aW9uRXhjZXB0aW9uIHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIHNjaGVtZUZpZWxkOworICAgICAgaXByb3QucmVhZFN0cnVjdEJlZ2luKCk7CisgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgIHsKKyAgICAgICAgc2NoZW1lRmllbGQgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpOworICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVE9QKSB7IAorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoc2NoZW1lRmllbGQuaWQpIHsKKyAgICAgICAgICBjYXNlIDE6IC8vIE1TRworICAgICAgICAgICAgaWYgKHNjaGVtZUZpZWxkLnR5cGUgPT0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HKSB7CisgICAgICAgICAgICAgIHN0cnVjdC5tc2cgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICAgIHN0cnVjdC5zZXRfbXNnX2lzU2V0KHRydWUpOworICAgICAgICAgICAgfSBlbHNlIHsgCisgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgc2NoZW1lRmllbGQudHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKKyAgICAgICAgfQorICAgICAgICBpcHJvdC5yZWFkRmllbGRFbmQoKTsKKyAgICAgIH0KKyAgICAgIGlwcm90LnJlYWRTdHJ1Y3RFbmQoKTsKKyAgICAgIHN0cnVjdC52YWxpZGF0ZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBvcHJvdCwgSEJFeGVjdXRpb25FeGNlcHRpb24gc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICBzdHJ1Y3QudmFsaWRhdGUoKTsKKworICAgICAgb3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihTVFJVQ1RfREVTQyk7CisgICAgICBpZiAoc3RydWN0Lm1zZyAhPSBudWxsKSB7CisgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihNU0dfRklFTERfREVTQyk7CisgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKHN0cnVjdC5tc2cpOworICAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgICB9CisgICAgICBvcHJvdC53cml0ZUZpZWxkU3RvcCgpOworICAgICAgb3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsKKyAgICB9CisKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIEhCRXhlY3V0aW9uRXhjZXB0aW9uVHVwbGVTY2hlbWVGYWN0b3J5IGltcGxlbWVudHMgU2NoZW1lRmFjdG9yeSB7CisgICAgcHVibGljIEhCRXhlY3V0aW9uRXhjZXB0aW9uVHVwbGVTY2hlbWUgZ2V0U2NoZW1lKCkgeworICAgICAgcmV0dXJuIG5ldyBIQkV4ZWN1dGlvbkV4Y2VwdGlvblR1cGxlU2NoZW1lKCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSEJFeGVjdXRpb25FeGNlcHRpb25UdXBsZVNjaGVtZSBleHRlbmRzIFR1cGxlU2NoZW1lPEhCRXhlY3V0aW9uRXhjZXB0aW9uPiB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgcHJvdCwgSEJFeGVjdXRpb25FeGNlcHRpb24gc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICBUVHVwbGVQcm90b2NvbCBvcHJvdCA9IChUVHVwbGVQcm90b2NvbCkgcHJvdDsKKyAgICAgIG9wcm90LndyaXRlU3RyaW5nKHN0cnVjdC5tc2cpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlYWQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIHByb3QsIEhCRXhlY3V0aW9uRXhjZXB0aW9uIHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgVFR1cGxlUHJvdG9jb2wgaXByb3QgPSAoVFR1cGxlUHJvdG9jb2wpIHByb3Q7CisgICAgICBzdHJ1Y3QubXNnID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgc3RydWN0LnNldF9tc2dfaXNTZXQodHJ1ZSk7CisgICAgfQorICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9IQk1lc3NhZ2UuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvSEJNZXNzYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNhMjE0NwotLS0gL2Rldi9udWxsCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvSEJNZXNzYWdlLmphdmEKQEAgLTAsMCArMSw2MzYgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisvKioKKyAqIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMykKKyAqCisgKiBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HCisgKiAgQGdlbmVyYXRlZAorICovCitwYWNrYWdlIGJhY2t0eXBlLnN0b3JtLmdlbmVyYXRlZDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5JU2NoZW1lOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5TY2hlbWVGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5TdGFuZGFyZFNjaGVtZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5UdXBsZVNjaGVtZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHVwbGVQcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuRW5jb2RpbmdVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLkFzeW5jTWV0aG9kQ2FsbGJhY2s7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLkFic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXIuKjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkVudW1NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bVNldDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkJpdFNldDsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQ7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworQFN1cHByZXNzV2FybmluZ3MoeyJjYXN0IiwgInJhd3R5cGVzIiwgInNlcmlhbCIsICJ1bmNoZWNrZWQifSkKK0BHZW5lcmF0ZWQodmFsdWUgPSAiQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4zKSIpCitwdWJsaWMgY2xhc3MgSEJNZXNzYWdlIGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2U8SEJNZXNzYWdlLCBIQk1lc3NhZ2UuX0ZpZWxkcz4sIGphdmEuaW8uU2VyaWFsaXphYmxlLCBDbG9uZWFibGUsIENvbXBhcmFibGU8SEJNZXNzYWdlPiB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QgU1RSVUNUX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdCgiSEJNZXNzYWdlIik7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIFRZUEVfRklFTERfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQoInR5cGUiLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JMzIsIChzaG9ydCkxKTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIERBVEFfRklFTERfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQoImRhdGEiLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIChzaG9ydCkyKTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIE1FU1NBR0VfSURfRklFTERfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQoIm1lc3NhZ2VfaWQiLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JMzIsIChzaG9ydCkzKTsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8Q2xhc3M8PyBleHRlbmRzIElTY2hlbWU+LCBTY2hlbWVGYWN0b3J5PiBzY2hlbWVzID0gbmV3IEhhc2hNYXA8Q2xhc3M8PyBleHRlbmRzIElTY2hlbWU+LCBTY2hlbWVGYWN0b3J5PigpOworICBzdGF0aWMgeworICAgIHNjaGVtZXMucHV0KFN0YW5kYXJkU2NoZW1lLmNsYXNzLCBuZXcgSEJNZXNzYWdlU3RhbmRhcmRTY2hlbWVGYWN0b3J5KCkpOworICAgIHNjaGVtZXMucHV0KFR1cGxlU2NoZW1lLmNsYXNzLCBuZXcgSEJNZXNzYWdlVHVwbGVTY2hlbWVGYWN0b3J5KCkpOworICB9CisKKyAgcHJpdmF0ZSBIQlNlcnZlck1lc3NhZ2VUeXBlIHR5cGU7IC8vIHJlcXVpcmVkCisgIHByaXZhdGUgSEJNZXNzYWdlRGF0YSBkYXRhOyAvLyByZXF1aXJlZAorICBwcml2YXRlIGludCBtZXNzYWdlX2lkOyAvLyBvcHRpb25hbAorCisgIC8qKiBUaGUgc2V0IG9mIGZpZWxkcyB0aGlzIHN0cnVjdCBjb250YWlucywgYWxvbmcgd2l0aCBjb252ZW5pZW5jZSBtZXRob2RzIGZvciBmaW5kaW5nIGFuZCBtYW5pcHVsYXRpbmcgdGhlbS4gKi8KKyAgcHVibGljIGVudW0gX0ZpZWxkcyBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZElkRW51bSB7CisgICAgLyoqCisgICAgICogCisgICAgICogQHNlZSBIQlNlcnZlck1lc3NhZ2VUeXBlCisgICAgICovCisgICAgVFlQRSgoc2hvcnQpMSwgInR5cGUiKSwKKyAgICBEQVRBKChzaG9ydCkyLCAiZGF0YSIpLAorICAgIE1FU1NBR0VfSUQoKHNob3J0KTMsICJtZXNzYWdlX2lkIik7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBfRmllbGRzPiBieU5hbWUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIF9GaWVsZHM+KCk7CisKKyAgICBzdGF0aWMgeworICAgICAgZm9yIChfRmllbGRzIGZpZWxkIDogRW51bVNldC5hbGxPZihfRmllbGRzLmNsYXNzKSkgeworICAgICAgICBieU5hbWUucHV0KGZpZWxkLmdldEZpZWxkTmFtZSgpLCBmaWVsZCk7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCB0aGUgX0ZpZWxkcyBjb25zdGFudCB0aGF0IG1hdGNoZXMgZmllbGRJZCwgb3IgbnVsbCBpZiBpdHMgbm90IGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgX0ZpZWxkcyBmaW5kQnlUaHJpZnRJZChpbnQgZmllbGRJZCkgeworICAgICAgc3dpdGNoKGZpZWxkSWQpIHsKKyAgICAgICAgY2FzZSAxOiAvLyBUWVBFCisgICAgICAgICAgcmV0dXJuIFRZUEU7CisgICAgICAgIGNhc2UgMjogLy8gREFUQQorICAgICAgICAgIHJldHVybiBEQVRBOworICAgICAgICBjYXNlIDM6IC8vIE1FU1NBR0VfSUQKKyAgICAgICAgICByZXR1cm4gTUVTU0FHRV9JRDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kIHRoZSBfRmllbGRzIGNvbnN0YW50IHRoYXQgbWF0Y2hlcyBmaWVsZElkLCB0aHJvd2luZyBhbiBleGNlcHRpb24KKyAgICAgKiBpZiBpdCBpcyBub3QgZm91bmQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBfRmllbGRzIGZpbmRCeVRocmlmdElkT3JUaHJvdyhpbnQgZmllbGRJZCkgeworICAgICAgX0ZpZWxkcyBmaWVsZHMgPSBmaW5kQnlUaHJpZnRJZChmaWVsZElkKTsKKyAgICAgIGlmIChmaWVsZHMgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRmllbGQgIiArIGZpZWxkSWQgKyAiIGRvZXNuJ3QgZXhpc3QhIik7CisgICAgICByZXR1cm4gZmllbGRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgdGhlIF9GaWVsZHMgY29uc3RhbnQgdGhhdCBtYXRjaGVzIG5hbWUsIG9yIG51bGwgaWYgaXRzIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIF9GaWVsZHMgZmluZEJ5TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgcmV0dXJuIGJ5TmFtZS5nZXQobmFtZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBzaG9ydCBfdGhyaWZ0SWQ7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX2ZpZWxkTmFtZTsKKworICAgIF9GaWVsZHMoc2hvcnQgdGhyaWZ0SWQsIFN0cmluZyBmaWVsZE5hbWUpIHsKKyAgICAgIF90aHJpZnRJZCA9IHRocmlmdElkOworICAgICAgX2ZpZWxkTmFtZSA9IGZpZWxkTmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc2hvcnQgZ2V0VGhyaWZ0RmllbGRJZCgpIHsKKyAgICAgIHJldHVybiBfdGhyaWZ0SWQ7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRGaWVsZE5hbWUoKSB7CisgICAgICByZXR1cm4gX2ZpZWxkTmFtZTsKKyAgICB9CisgIH0KKworICAvLyBpc3NldCBpZCBhc3NpZ25tZW50cworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgX19NRVNTQUdFX0lEX0lTU0VUX0lEID0gMDsKKyAgcHJpdmF0ZSBieXRlIF9faXNzZXRfYml0ZmllbGQgPSAwOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBfRmllbGRzIG9wdGlvbmFsc1tdID0ge19GaWVsZHMuTUVTU0FHRV9JRH07CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPiBtZXRhRGF0YU1hcDsKKyAgc3RhdGljIHsKKyAgICBNYXA8X0ZpZWxkcywgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGE+IHRtcE1hcCA9IG5ldyBFbnVtTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPihfRmllbGRzLmNsYXNzKTsKKyAgICB0bXBNYXAucHV0KF9GaWVsZHMuVFlQRSwgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhKCJ0eXBlIiwgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLkRFRkFVTFQsIAorICAgICAgICBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkVudW1NZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5FTlVNLCBIQlNlcnZlck1lc3NhZ2VUeXBlLmNsYXNzKSkpOworICAgIHRtcE1hcC5wdXQoX0ZpZWxkcy5EQVRBLCBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEoImRhdGEiLCBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRSZXF1aXJlbWVudFR5cGUuREVGQVVMVCwgCisgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuU3RydWN0TWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNULCBIQk1lc3NhZ2VEYXRhLmNsYXNzKSkpOworICAgIHRtcE1hcC5wdXQoX0ZpZWxkcy5NRVNTQUdFX0lELCBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEoIm1lc3NhZ2VfaWQiLCBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRSZXF1aXJlbWVudFR5cGUuT1BUSU9OQUwsIAorICAgICAgICBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkVmFsdWVNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JMzIpKSk7CisgICAgbWV0YURhdGFNYXAgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAodG1wTWFwKTsKKyAgICBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YS5hZGRTdHJ1Y3RNZXRhRGF0YU1hcChIQk1lc3NhZ2UuY2xhc3MsIG1ldGFEYXRhTWFwKTsKKyAgfQorCisgIHB1YmxpYyBIQk1lc3NhZ2UoKSB7CisgICAgdGhpcy5tZXNzYWdlX2lkID0gLTE7CisKKyAgfQorCisgIHB1YmxpYyBIQk1lc3NhZ2UoCisgICAgSEJTZXJ2ZXJNZXNzYWdlVHlwZSB0eXBlLAorICAgIEhCTWVzc2FnZURhdGEgZGF0YSkKKyAgeworICAgIHRoaXMoKTsKKyAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgIHRoaXMuZGF0YSA9IGRhdGE7CisgIH0KKworICAvKioKKyAgICogUGVyZm9ybXMgYSBkZWVwIGNvcHkgb24gPGk+b3RoZXI8L2k+LgorICAgKi8KKyAgcHVibGljIEhCTWVzc2FnZShIQk1lc3NhZ2Ugb3RoZXIpIHsKKyAgICBfX2lzc2V0X2JpdGZpZWxkID0gb3RoZXIuX19pc3NldF9iaXRmaWVsZDsKKyAgICBpZiAob3RoZXIuaXNfc2V0X3R5cGUoKSkgeworICAgICAgdGhpcy50eXBlID0gb3RoZXIudHlwZTsKKyAgICB9CisgICAgaWYgKG90aGVyLmlzX3NldF9kYXRhKCkpIHsKKyAgICAgIHRoaXMuZGF0YSA9IG5ldyBIQk1lc3NhZ2VEYXRhKG90aGVyLmRhdGEpOworICAgIH0KKyAgICB0aGlzLm1lc3NhZ2VfaWQgPSBvdGhlci5tZXNzYWdlX2lkOworICB9CisKKyAgcHVibGljIEhCTWVzc2FnZSBkZWVwQ29weSgpIHsKKyAgICByZXR1cm4gbmV3IEhCTWVzc2FnZSh0aGlzKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICB0aGlzLnR5cGUgPSBudWxsOworICAgIHRoaXMuZGF0YSA9IG51bGw7CisgICAgdGhpcy5tZXNzYWdlX2lkID0gLTE7CisKKyAgfQorCisgIC8qKgorICAgKiAKKyAgICogQHNlZSBIQlNlcnZlck1lc3NhZ2VUeXBlCisgICAqLworICBwdWJsaWMgSEJTZXJ2ZXJNZXNzYWdlVHlwZSBnZXRfdHlwZSgpIHsKKyAgICByZXR1cm4gdGhpcy50eXBlOworICB9CisKKyAgLyoqCisgICAqIAorICAgKiBAc2VlIEhCU2VydmVyTWVzc2FnZVR5cGUKKyAgICovCisgIHB1YmxpYyB2b2lkIHNldF90eXBlKEhCU2VydmVyTWVzc2FnZVR5cGUgdHlwZSkgeworICAgIHRoaXMudHlwZSA9IHR5cGU7CisgIH0KKworICBwdWJsaWMgdm9pZCB1bnNldF90eXBlKCkgeworICAgIHRoaXMudHlwZSA9IG51bGw7CisgIH0KKworICAvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkIHR5cGUgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgIHB1YmxpYyBib29sZWFuIGlzX3NldF90eXBlKCkgeworICAgIHJldHVybiB0aGlzLnR5cGUgIT0gbnVsbDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF90eXBlX2lzU2V0KGJvb2xlYW4gdmFsdWUpIHsKKyAgICBpZiAoIXZhbHVlKSB7CisgICAgICB0aGlzLnR5cGUgPSBudWxsOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBIQk1lc3NhZ2VEYXRhIGdldF9kYXRhKCkgeworICAgIHJldHVybiB0aGlzLmRhdGE7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfZGF0YShIQk1lc3NhZ2VEYXRhIGRhdGEpIHsKKyAgICB0aGlzLmRhdGEgPSBkYXRhOworICB9CisKKyAgcHVibGljIHZvaWQgdW5zZXRfZGF0YSgpIHsKKyAgICB0aGlzLmRhdGEgPSBudWxsOworICB9CisKKyAgLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBkYXRhIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLworICBwdWJsaWMgYm9vbGVhbiBpc19zZXRfZGF0YSgpIHsKKyAgICByZXR1cm4gdGhpcy5kYXRhICE9IG51bGw7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfZGF0YV9pc1NldChib29sZWFuIHZhbHVlKSB7CisgICAgaWYgKCF2YWx1ZSkgeworICAgICAgdGhpcy5kYXRhID0gbnVsbDsKKyAgICB9CisgIH0KKworICBwdWJsaWMgaW50IGdldF9tZXNzYWdlX2lkKCkgeworICAgIHJldHVybiB0aGlzLm1lc3NhZ2VfaWQ7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfbWVzc2FnZV9pZChpbnQgbWVzc2FnZV9pZCkgeworICAgIHRoaXMubWVzc2FnZV9pZCA9IG1lc3NhZ2VfaWQ7CisgICAgc2V0X21lc3NhZ2VfaWRfaXNTZXQodHJ1ZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB1bnNldF9tZXNzYWdlX2lkKCkgeworICAgIF9faXNzZXRfYml0ZmllbGQgPSBFbmNvZGluZ1V0aWxzLmNsZWFyQml0KF9faXNzZXRfYml0ZmllbGQsIF9fTUVTU0FHRV9JRF9JU1NFVF9JRCk7CisgIH0KKworICAvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkIG1lc3NhZ2VfaWQgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgIHB1YmxpYyBib29sZWFuIGlzX3NldF9tZXNzYWdlX2lkKCkgeworICAgIHJldHVybiBFbmNvZGluZ1V0aWxzLnRlc3RCaXQoX19pc3NldF9iaXRmaWVsZCwgX19NRVNTQUdFX0lEX0lTU0VUX0lEKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF9tZXNzYWdlX2lkX2lzU2V0KGJvb2xlYW4gdmFsdWUpIHsKKyAgICBfX2lzc2V0X2JpdGZpZWxkID0gRW5jb2RpbmdVdGlscy5zZXRCaXQoX19pc3NldF9iaXRmaWVsZCwgX19NRVNTQUdFX0lEX0lTU0VUX0lELCB2YWx1ZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRGaWVsZFZhbHVlKF9GaWVsZHMgZmllbGQsIE9iamVjdCB2YWx1ZSkgeworICAgIHN3aXRjaCAoZmllbGQpIHsKKyAgICBjYXNlIFRZUEU6CisgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICB1bnNldF90eXBlKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzZXRfdHlwZSgoSEJTZXJ2ZXJNZXNzYWdlVHlwZSl2YWx1ZSk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgREFUQToKKyAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgIHVuc2V0X2RhdGEoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNldF9kYXRhKChIQk1lc3NhZ2VEYXRhKXZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBNRVNTQUdFX0lEOgorICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgdW5zZXRfbWVzc2FnZV9pZCgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2V0X21lc3NhZ2VfaWQoKEludGVnZXIpdmFsdWUpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICB9CisgIH0KKworICBwdWJsaWMgT2JqZWN0IGdldEZpZWxkVmFsdWUoX0ZpZWxkcyBmaWVsZCkgeworICAgIHN3aXRjaCAoZmllbGQpIHsKKyAgICBjYXNlIFRZUEU6CisgICAgICByZXR1cm4gZ2V0X3R5cGUoKTsKKworICAgIGNhc2UgREFUQToKKyAgICAgIHJldHVybiBnZXRfZGF0YSgpOworCisgICAgY2FzZSBNRVNTQUdFX0lEOgorICAgICAgcmV0dXJuIGdldF9tZXNzYWdlX2lkKCk7CisKKyAgICB9CisgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICB9CisKKyAgLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBjb3JyZXNwb25kaW5nIHRvIGZpZWxkSUQgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgIHB1YmxpYyBib29sZWFuIGlzU2V0KF9GaWVsZHMgZmllbGQpIHsKKyAgICBpZiAoZmllbGQgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHN3aXRjaCAoZmllbGQpIHsKKyAgICBjYXNlIFRZUEU6CisgICAgICByZXR1cm4gaXNfc2V0X3R5cGUoKTsKKyAgICBjYXNlIERBVEE6CisgICAgICByZXR1cm4gaXNfc2V0X2RhdGEoKTsKKyAgICBjYXNlIE1FU1NBR0VfSUQ6CisgICAgICByZXR1cm4gaXNfc2V0X21lc3NhZ2VfaWQoKTsKKyAgICB9CisgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgdGhhdCkgeworICAgIGlmICh0aGF0ID09IG51bGwpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKHRoYXQgaW5zdGFuY2VvZiBIQk1lc3NhZ2UpCisgICAgICByZXR1cm4gdGhpcy5lcXVhbHMoKEhCTWVzc2FnZSl0aGF0KTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoSEJNZXNzYWdlIHRoYXQpIHsKKyAgICBpZiAodGhhdCA9PSBudWxsKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgYm9vbGVhbiB0aGlzX3ByZXNlbnRfdHlwZSA9IHRydWUgJiYgdGhpcy5pc19zZXRfdHlwZSgpOworICAgIGJvb2xlYW4gdGhhdF9wcmVzZW50X3R5cGUgPSB0cnVlICYmIHRoYXQuaXNfc2V0X3R5cGUoKTsKKyAgICBpZiAodGhpc19wcmVzZW50X3R5cGUgfHwgdGhhdF9wcmVzZW50X3R5cGUpIHsKKyAgICAgIGlmICghKHRoaXNfcHJlc2VudF90eXBlICYmIHRoYXRfcHJlc2VudF90eXBlKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKCF0aGlzLnR5cGUuZXF1YWxzKHRoYXQudHlwZSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sZWFuIHRoaXNfcHJlc2VudF9kYXRhID0gdHJ1ZSAmJiB0aGlzLmlzX3NldF9kYXRhKCk7CisgICAgYm9vbGVhbiB0aGF0X3ByZXNlbnRfZGF0YSA9IHRydWUgJiYgdGhhdC5pc19zZXRfZGF0YSgpOworICAgIGlmICh0aGlzX3ByZXNlbnRfZGF0YSB8fCB0aGF0X3ByZXNlbnRfZGF0YSkgeworICAgICAgaWYgKCEodGhpc19wcmVzZW50X2RhdGEgJiYgdGhhdF9wcmVzZW50X2RhdGEpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBpZiAoIXRoaXMuZGF0YS5lcXVhbHModGhhdC5kYXRhKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2xlYW4gdGhpc19wcmVzZW50X21lc3NhZ2VfaWQgPSB0cnVlICYmIHRoaXMuaXNfc2V0X21lc3NhZ2VfaWQoKTsKKyAgICBib29sZWFuIHRoYXRfcHJlc2VudF9tZXNzYWdlX2lkID0gdHJ1ZSAmJiB0aGF0LmlzX3NldF9tZXNzYWdlX2lkKCk7CisgICAgaWYgKHRoaXNfcHJlc2VudF9tZXNzYWdlX2lkIHx8IHRoYXRfcHJlc2VudF9tZXNzYWdlX2lkKSB7CisgICAgICBpZiAoISh0aGlzX3ByZXNlbnRfbWVzc2FnZV9pZCAmJiB0aGF0X3ByZXNlbnRfbWVzc2FnZV9pZCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGlmICh0aGlzLm1lc3NhZ2VfaWQgIT0gdGhhdC5tZXNzYWdlX2lkKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICBMaXN0PE9iamVjdD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOworCisgICAgYm9vbGVhbiBwcmVzZW50X3R5cGUgPSB0cnVlICYmIChpc19zZXRfdHlwZSgpKTsKKyAgICBsaXN0LmFkZChwcmVzZW50X3R5cGUpOworICAgIGlmIChwcmVzZW50X3R5cGUpCisgICAgICBsaXN0LmFkZCh0eXBlLmdldFZhbHVlKCkpOworCisgICAgYm9vbGVhbiBwcmVzZW50X2RhdGEgPSB0cnVlICYmIChpc19zZXRfZGF0YSgpKTsKKyAgICBsaXN0LmFkZChwcmVzZW50X2RhdGEpOworICAgIGlmIChwcmVzZW50X2RhdGEpCisgICAgICBsaXN0LmFkZChkYXRhKTsKKworICAgIGJvb2xlYW4gcHJlc2VudF9tZXNzYWdlX2lkID0gdHJ1ZSAmJiAoaXNfc2V0X21lc3NhZ2VfaWQoKSk7CisgICAgbGlzdC5hZGQocHJlc2VudF9tZXNzYWdlX2lkKTsKKyAgICBpZiAocHJlc2VudF9tZXNzYWdlX2lkKQorICAgICAgbGlzdC5hZGQobWVzc2FnZV9pZCk7CisKKyAgICByZXR1cm4gbGlzdC5oYXNoQ29kZSgpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgY29tcGFyZVRvKEhCTWVzc2FnZSBvdGhlcikgeworICAgIGlmICghZ2V0Q2xhc3MoKS5lcXVhbHMob3RoZXIuZ2V0Q2xhc3MoKSkpIHsKKyAgICAgIHJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKS5jb21wYXJlVG8ob3RoZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgIH0KKworICAgIGludCBsYXN0Q29tcGFyaXNvbiA9IDA7CisKKyAgICBsYXN0Q29tcGFyaXNvbiA9IEJvb2xlYW4udmFsdWVPZihpc19zZXRfdHlwZSgpKS5jb21wYXJlVG8ob3RoZXIuaXNfc2V0X3R5cGUoKSk7CisgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICB9CisgICAgaWYgKGlzX3NldF90eXBlKCkpIHsKKyAgICAgIGxhc3RDb21wYXJpc29uID0gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29tcGFyZVRvKHRoaXMudHlwZSwgb3RoZXIudHlwZSk7CisgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICB9CisgICAgfQorICAgIGxhc3RDb21wYXJpc29uID0gQm9vbGVhbi52YWx1ZU9mKGlzX3NldF9kYXRhKCkpLmNvbXBhcmVUbyhvdGhlci5pc19zZXRfZGF0YSgpKTsKKyAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgIH0KKyAgICBpZiAoaXNfc2V0X2RhdGEoKSkgeworICAgICAgbGFzdENvbXBhcmlzb24gPSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy5kYXRhLCBvdGhlci5kYXRhKTsKKyAgICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICAgIH0KKyAgICB9CisgICAgbGFzdENvbXBhcmlzb24gPSBCb29sZWFuLnZhbHVlT2YoaXNfc2V0X21lc3NhZ2VfaWQoKSkuY29tcGFyZVRvKG90aGVyLmlzX3NldF9tZXNzYWdlX2lkKCkpOworICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgfQorICAgIGlmIChpc19zZXRfbWVzc2FnZV9pZCgpKSB7CisgICAgICBsYXN0Q29tcGFyaXNvbiA9IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvbXBhcmVUbyh0aGlzLm1lc3NhZ2VfaWQsIG90aGVyLm1lc3NhZ2VfaWQpOworICAgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHB1YmxpYyBfRmllbGRzIGZpZWxkRm9ySWQoaW50IGZpZWxkSWQpIHsKKyAgICByZXR1cm4gX0ZpZWxkcy5maW5kQnlUaHJpZnRJZChmaWVsZElkKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHJlYWQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIGlwcm90KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgc2NoZW1lcy5nZXQoaXByb3QuZ2V0U2NoZW1lKCkpLmdldFNjaGVtZSgpLnJlYWQoaXByb3QsIHRoaXMpOworICB9CisKKyAgcHVibGljIHZvaWQgd3JpdGUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIG9wcm90KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgc2NoZW1lcy5nZXQob3Byb3QuZ2V0U2NoZW1lKCkpLmdldFNjaGVtZSgpLndyaXRlKG9wcm90LCB0aGlzKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigiSEJNZXNzYWdlKCIpOworICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOworCisgICAgc2IuYXBwZW5kKCJ0eXBlOiIpOworICAgIGlmICh0aGlzLnR5cGUgPT0gbnVsbCkgeworICAgICAgc2IuYXBwZW5kKCJudWxsIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHNiLmFwcGVuZCh0aGlzLnR5cGUpOworICAgIH0KKyAgICBmaXJzdCA9IGZhbHNlOworICAgIGlmICghZmlyc3QpIHNiLmFwcGVuZCgiLCAiKTsKKyAgICBzYi5hcHBlbmQoImRhdGE6Iik7CisgICAgaWYgKHRoaXMuZGF0YSA9PSBudWxsKSB7CisgICAgICBzYi5hcHBlbmQoIm51bGwiKTsKKyAgICB9IGVsc2UgeworICAgICAgc2IuYXBwZW5kKHRoaXMuZGF0YSk7CisgICAgfQorICAgIGZpcnN0ID0gZmFsc2U7CisgICAgaWYgKGlzX3NldF9tZXNzYWdlX2lkKCkpIHsKKyAgICAgIGlmICghZmlyc3QpIHNiLmFwcGVuZCgiLCAiKTsKKyAgICAgIHNiLmFwcGVuZCgibWVzc2FnZV9pZDoiKTsKKyAgICAgIHNiLmFwcGVuZCh0aGlzLm1lc3NhZ2VfaWQpOworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9CisgICAgc2IuYXBwZW5kKCIpIik7CisgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAvLyBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzCisgICAgLy8gY2hlY2sgZm9yIHN1Yi1zdHJ1Y3QgdmFsaWRpdHkKKyAgfQorCisgIHByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgd3JpdGUobmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRDb21wYWN0UHJvdG9jb2wobmV3IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5USU9TdHJlYW1UcmFuc3BvcnQob3V0KSkpOworICAgIH0gY2F0Y2ggKG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24gdGUpIHsKKyAgICAgIHRocm93IG5ldyBqYXZhLmlvLklPRXhjZXB0aW9uKHRlKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgcmVhZE9iamVjdChqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtIGluKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIC8vIGl0IGRvZXNuJ3Qgc2VlbSBsaWtlIHlvdSBzaG91bGQgaGF2ZSB0byBkbyB0aGlzLCBidXQgamF2YSBzZXJpYWxpemF0aW9uIGlzIHdhY2t5LCBhbmQgZG9lc24ndCBjYWxsIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgICAgX19pc3NldF9iaXRmaWVsZCA9IDA7CisgICAgICByZWFkKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQ29tcGFjdFByb3RvY29sKG5ldyBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVElPU3RyZWFtVHJhbnNwb3J0KGluKSkpOworICAgIH0gY2F0Y2ggKG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24gdGUpIHsKKyAgICAgIHRocm93IG5ldyBqYXZhLmlvLklPRXhjZXB0aW9uKHRlKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBIQk1lc3NhZ2VTdGFuZGFyZFNjaGVtZUZhY3RvcnkgaW1wbGVtZW50cyBTY2hlbWVGYWN0b3J5IHsKKyAgICBwdWJsaWMgSEJNZXNzYWdlU3RhbmRhcmRTY2hlbWUgZ2V0U2NoZW1lKCkgeworICAgICAgcmV0dXJuIG5ldyBIQk1lc3NhZ2VTdGFuZGFyZFNjaGVtZSgpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIEhCTWVzc2FnZVN0YW5kYXJkU2NoZW1lIGV4dGVuZHMgU3RhbmRhcmRTY2hlbWU8SEJNZXNzYWdlPiB7CisKKyAgICBwdWJsaWMgdm9pZCByZWFkKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBpcHJvdCwgSEJNZXNzYWdlIHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIHNjaGVtZUZpZWxkOworICAgICAgaXByb3QucmVhZFN0cnVjdEJlZ2luKCk7CisgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgIHsKKyAgICAgICAgc2NoZW1lRmllbGQgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpOworICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVE9QKSB7IAorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoc2NoZW1lRmllbGQuaWQpIHsKKyAgICAgICAgICBjYXNlIDE6IC8vIFRZUEUKKyAgICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkkzMikgeworICAgICAgICAgICAgICBzdHJ1Y3QudHlwZSA9IGJhY2t0eXBlLnN0b3JtLmdlbmVyYXRlZC5IQlNlcnZlck1lc3NhZ2VUeXBlLmZpbmRCeVZhbHVlKGlwcm90LnJlYWRJMzIoKSk7CisgICAgICAgICAgICAgIHN0cnVjdC5zZXRfdHlwZV9pc1NldCh0cnVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7IAorICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAyOiAvLyBEQVRBCisgICAgICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QpIHsKKyAgICAgICAgICAgICAgc3RydWN0LmRhdGEgPSBuZXcgSEJNZXNzYWdlRGF0YSgpOworICAgICAgICAgICAgICBzdHJ1Y3QuZGF0YS5yZWFkKGlwcm90KTsKKyAgICAgICAgICAgICAgc3RydWN0LnNldF9kYXRhX2lzU2V0KHRydWUpOworICAgICAgICAgICAgfSBlbHNlIHsgCisgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgc2NoZW1lRmllbGQudHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDM6IC8vIE1FU1NBR0VfSUQKKyAgICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkkzMikgeworICAgICAgICAgICAgICBzdHJ1Y3QubWVzc2FnZV9pZCA9IGlwcm90LnJlYWRJMzIoKTsKKyAgICAgICAgICAgICAgc3RydWN0LnNldF9tZXNzYWdlX2lkX2lzU2V0KHRydWUpOworICAgICAgICAgICAgfSBlbHNlIHsgCisgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgc2NoZW1lRmllbGQudHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKKyAgICAgICAgfQorICAgICAgICBpcHJvdC5yZWFkRmllbGRFbmQoKTsKKyAgICAgIH0KKyAgICAgIGlwcm90LnJlYWRTdHJ1Y3RFbmQoKTsKKyAgICAgIHN0cnVjdC52YWxpZGF0ZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBvcHJvdCwgSEJNZXNzYWdlIHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgc3RydWN0LnZhbGlkYXRlKCk7CisKKyAgICAgIG9wcm90LndyaXRlU3RydWN0QmVnaW4oU1RSVUNUX0RFU0MpOworICAgICAgaWYgKHN0cnVjdC50eXBlICE9IG51bGwpIHsKKyAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKFRZUEVfRklFTERfREVTQyk7CisgICAgICAgIG9wcm90LndyaXRlSTMyKHN0cnVjdC50eXBlLmdldFZhbHVlKCkpOworICAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmRhdGEgIT0gbnVsbCkgeworICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oREFUQV9GSUVMRF9ERVNDKTsKKyAgICAgICAgc3RydWN0LmRhdGEud3JpdGUob3Byb3QpOworICAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9tZXNzYWdlX2lkKCkpIHsKKyAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKE1FU1NBR0VfSURfRklFTERfREVTQyk7CisgICAgICAgIG9wcm90LndyaXRlSTMyKHN0cnVjdC5tZXNzYWdlX2lkKTsKKyAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgICAgfQorICAgICAgb3Byb3Qud3JpdGVGaWVsZFN0b3AoKTsKKyAgICAgIG9wcm90LndyaXRlU3RydWN0RW5kKCk7CisgICAgfQorCisgIH0KKworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBIQk1lc3NhZ2VUdXBsZVNjaGVtZUZhY3RvcnkgaW1wbGVtZW50cyBTY2hlbWVGYWN0b3J5IHsKKyAgICBwdWJsaWMgSEJNZXNzYWdlVHVwbGVTY2hlbWUgZ2V0U2NoZW1lKCkgeworICAgICAgcmV0dXJuIG5ldyBIQk1lc3NhZ2VUdXBsZVNjaGVtZSgpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIEhCTWVzc2FnZVR1cGxlU2NoZW1lIGV4dGVuZHMgVHVwbGVTY2hlbWU8SEJNZXNzYWdlPiB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgcHJvdCwgSEJNZXNzYWdlIHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgVFR1cGxlUHJvdG9jb2wgb3Byb3QgPSAoVFR1cGxlUHJvdG9jb2wpIHByb3Q7CisgICAgICBCaXRTZXQgb3B0aW9uYWxzID0gbmV3IEJpdFNldCgpOworICAgICAgaWYgKHN0cnVjdC5pc19zZXRfdHlwZSgpKSB7CisgICAgICAgIG9wdGlvbmFscy5zZXQoMCk7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9kYXRhKCkpIHsKKyAgICAgICAgb3B0aW9uYWxzLnNldCgxKTsKKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X21lc3NhZ2VfaWQoKSkgeworICAgICAgICBvcHRpb25hbHMuc2V0KDIpOworICAgICAgfQorICAgICAgb3Byb3Qud3JpdGVCaXRTZXQob3B0aW9uYWxzLCAzKTsKKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X3R5cGUoKSkgeworICAgICAgICBvcHJvdC53cml0ZUkzMihzdHJ1Y3QudHlwZS5nZXRWYWx1ZSgpKTsKKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X2RhdGEoKSkgeworICAgICAgICBzdHJ1Y3QuZGF0YS53cml0ZShvcHJvdCk7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9tZXNzYWdlX2lkKCkpIHsKKyAgICAgICAgb3Byb3Qud3JpdGVJMzIoc3RydWN0Lm1lc3NhZ2VfaWQpOworICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlYWQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIHByb3QsIEhCTWVzc2FnZSBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgIFRUdXBsZVByb3RvY29sIGlwcm90ID0gKFRUdXBsZVByb3RvY29sKSBwcm90OworICAgICAgQml0U2V0IGluY29taW5nID0gaXByb3QucmVhZEJpdFNldCgzKTsKKyAgICAgIGlmIChpbmNvbWluZy5nZXQoMCkpIHsKKyAgICAgICAgc3RydWN0LnR5cGUgPSBiYWNrdHlwZS5zdG9ybS5nZW5lcmF0ZWQuSEJTZXJ2ZXJNZXNzYWdlVHlwZS5maW5kQnlWYWx1ZShpcHJvdC5yZWFkSTMyKCkpOworICAgICAgICBzdHJ1Y3Quc2V0X3R5cGVfaXNTZXQodHJ1ZSk7CisgICAgICB9CisgICAgICBpZiAoaW5jb21pbmcuZ2V0KDEpKSB7CisgICAgICAgIHN0cnVjdC5kYXRhID0gbmV3IEhCTWVzc2FnZURhdGEoKTsKKyAgICAgICAgc3RydWN0LmRhdGEucmVhZChpcHJvdCk7CisgICAgICAgIHN0cnVjdC5zZXRfZGF0YV9pc1NldCh0cnVlKTsKKyAgICAgIH0KKyAgICAgIGlmIChpbmNvbWluZy5nZXQoMikpIHsKKyAgICAgICAgc3RydWN0Lm1lc3NhZ2VfaWQgPSBpcHJvdC5yZWFkSTMyKCk7CisgICAgICAgIHN0cnVjdC5zZXRfbWVzc2FnZV9pZF9pc1NldCh0cnVlKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworfQorCmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL0hCTWVzc2FnZURhdGEuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvSEJNZXNzYWdlRGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiYTJmOGIKLS0tIC9kZXYvbnVsbAorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL0hCTWVzc2FnZURhdGEuamF2YQpAQCAtMCwwICsxLDY0MCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8qKgorICogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4zKQorICoKKyAqIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkcKKyAqICBAZ2VuZXJhdGVkCisgKi8KK3BhY2thZ2UgYmFja3R5cGUuc3Rvcm0uZ2VuZXJhdGVkOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLklTY2hlbWU7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLlNjaGVtZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLlN0YW5kYXJkU2NoZW1lOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLlR1cGxlU2NoZW1lOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUdXBsZVByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5FbmNvZGluZ1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuQXN5bmNNZXRob2RDYWxsYmFjazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlci4qOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bU1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuQml0U2V0OworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLkdlbmVyYXRlZDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitAU3VwcHJlc3NXYXJuaW5ncyh7ImNhc3QiLCAicmF3dHlwZXMiLCAic2VyaWFsIiwgInVuY2hlY2tlZCJ9KQorcHVibGljIGNsYXNzIEhCTWVzc2FnZURhdGEgZXh0ZW5kcyBvcmcuYXBhY2hlLnRocmlmdC5UVW5pb248SEJNZXNzYWdlRGF0YSwgSEJNZXNzYWdlRGF0YS5fRmllbGRzPiB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QgU1RSVUNUX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdCgiSEJNZXNzYWdlRGF0YSIpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgUEFUSF9GSUVMRF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCgicGF0aCIsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORywgKHNob3J0KTEpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgUFVMU0VfRklFTERfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQoInB1bHNlIiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNULCAoc2hvcnQpMik7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBCT09MVkFMX0ZJRUxEX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkKCJib29sdmFsIiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuQk9PTCwgKHNob3J0KTMpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgUkVDT1JEU19GSUVMRF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCgicmVjb3JkcyIsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCwgKHNob3J0KTQpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgTk9ERVNfRklFTERfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQoIm5vZGVzIiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNULCAoc2hvcnQpNSk7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBNRVNTQUdFX0JMT0JfRklFTERfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQoIm1lc3NhZ2VfYmxvYiIsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORywgKHNob3J0KTcpOworCisgIC8qKiBUaGUgc2V0IG9mIGZpZWxkcyB0aGlzIHN0cnVjdCBjb250YWlucywgYWxvbmcgd2l0aCBjb252ZW5pZW5jZSBtZXRob2RzIGZvciBmaW5kaW5nIGFuZCBtYW5pcHVsYXRpbmcgdGhlbS4gKi8KKyAgcHVibGljIGVudW0gX0ZpZWxkcyBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZElkRW51bSB7CisgICAgUEFUSCgoc2hvcnQpMSwgInBhdGgiKSwKKyAgICBQVUxTRSgoc2hvcnQpMiwgInB1bHNlIiksCisgICAgQk9PTFZBTCgoc2hvcnQpMywgImJvb2x2YWwiKSwKKyAgICBSRUNPUkRTKChzaG9ydCk0LCAicmVjb3JkcyIpLAorICAgIE5PREVTKChzaG9ydCk1LCAibm9kZXMiKSwKKyAgICBNRVNTQUdFX0JMT0IoKHNob3J0KTcsICJtZXNzYWdlX2Jsb2IiKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsIF9GaWVsZHM+IGJ5TmFtZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgX0ZpZWxkcz4oKTsKKworICAgIHN0YXRpYyB7CisgICAgICBmb3IgKF9GaWVsZHMgZmllbGQgOiBFbnVtU2V0LmFsbE9mKF9GaWVsZHMuY2xhc3MpKSB7CisgICAgICAgIGJ5TmFtZS5wdXQoZmllbGQuZ2V0RmllbGROYW1lKCksIGZpZWxkKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kIHRoZSBfRmllbGRzIGNvbnN0YW50IHRoYXQgbWF0Y2hlcyBmaWVsZElkLCBvciBudWxsIGlmIGl0cyBub3QgZm91bmQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBfRmllbGRzIGZpbmRCeVRocmlmdElkKGludCBmaWVsZElkKSB7CisgICAgICBzd2l0Y2goZmllbGRJZCkgeworICAgICAgICBjYXNlIDE6IC8vIFBBVEgKKyAgICAgICAgICByZXR1cm4gUEFUSDsKKyAgICAgICAgY2FzZSAyOiAvLyBQVUxTRQorICAgICAgICAgIHJldHVybiBQVUxTRTsKKyAgICAgICAgY2FzZSAzOiAvLyBCT09MVkFMCisgICAgICAgICAgcmV0dXJuIEJPT0xWQUw7CisgICAgICAgIGNhc2UgNDogLy8gUkVDT1JEUworICAgICAgICAgIHJldHVybiBSRUNPUkRTOworICAgICAgICBjYXNlIDU6IC8vIE5PREVTCisgICAgICAgICAgcmV0dXJuIE5PREVTOworICAgICAgICBjYXNlIDc6IC8vIE1FU1NBR0VfQkxPQgorICAgICAgICAgIHJldHVybiBNRVNTQUdFX0JMT0I7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCB0aGUgX0ZpZWxkcyBjb25zdGFudCB0aGF0IG1hdGNoZXMgZmllbGRJZCwgdGhyb3dpbmcgYW4gZXhjZXB0aW9uCisgICAgICogaWYgaXQgaXMgbm90IGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgX0ZpZWxkcyBmaW5kQnlUaHJpZnRJZE9yVGhyb3coaW50IGZpZWxkSWQpIHsKKyAgICAgIF9GaWVsZHMgZmllbGRzID0gZmluZEJ5VGhyaWZ0SWQoZmllbGRJZCk7CisgICAgICBpZiAoZmllbGRzID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkZpZWxkICIgKyBmaWVsZElkICsgIiBkb2Vzbid0IGV4aXN0ISIpOworICAgICAgcmV0dXJuIGZpZWxkczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kIHRoZSBfRmllbGRzIGNvbnN0YW50IHRoYXQgbWF0Y2hlcyBuYW1lLCBvciBudWxsIGlmIGl0cyBub3QgZm91bmQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBfRmllbGRzIGZpbmRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgIHJldHVybiBieU5hbWUuZ2V0KG5hbWUpOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgc2hvcnQgX3RocmlmdElkOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIF9maWVsZE5hbWU7CisKKyAgICBfRmllbGRzKHNob3J0IHRocmlmdElkLCBTdHJpbmcgZmllbGROYW1lKSB7CisgICAgICBfdGhyaWZ0SWQgPSB0aHJpZnRJZDsKKyAgICAgIF9maWVsZE5hbWUgPSBmaWVsZE5hbWU7CisgICAgfQorCisgICAgcHVibGljIHNob3J0IGdldFRocmlmdEZpZWxkSWQoKSB7CisgICAgICByZXR1cm4gX3RocmlmdElkOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmllbGROYW1lKCkgeworICAgICAgcmV0dXJuIF9maWVsZE5hbWU7CisgICAgfQorICB9CisKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBNYXA8X0ZpZWxkcywgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGE+IG1ldGFEYXRhTWFwOworICBzdGF0aWMgeworICAgIE1hcDxfRmllbGRzLCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YT4gdG1wTWFwID0gbmV3IEVudW1NYXA8X0ZpZWxkcywgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGE+KF9GaWVsZHMuY2xhc3MpOworICAgIHRtcE1hcC5wdXQoX0ZpZWxkcy5QQVRILCBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEoInBhdGgiLCBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRSZXF1aXJlbWVudFR5cGUuREVGQVVMVCwgCisgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRWYWx1ZU1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORykpKTsKKyAgICB0bXBNYXAucHV0KF9GaWVsZHMuUFVMU0UsIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YSgicHVsc2UiLCBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRSZXF1aXJlbWVudFR5cGUuREVGQVVMVCwgCisgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRWYWx1ZU1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCAgICAgICAgLCAiSEJQdWxzZSIpKSk7CisgICAgdG1wTWFwLnB1dChfRmllbGRzLkJPT0xWQUwsIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YSgiYm9vbHZhbCIsIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZFJlcXVpcmVtZW50VHlwZS5ERUZBVUxULCAKKyAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZFZhbHVlTWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuQk9PTCkpKTsKKyAgICB0bXBNYXAucHV0KF9GaWVsZHMuUkVDT1JEUywgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhKCJyZWNvcmRzIiwgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLkRFRkFVTFQsIAorICAgICAgICBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkVmFsdWVNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QgICAgICAgICwgIkhCUmVjb3JkcyIpKSk7CisgICAgdG1wTWFwLnB1dChfRmllbGRzLk5PREVTLCBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEoIm5vZGVzIiwgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLkRFRkFVTFQsIAorICAgICAgICBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkVmFsdWVNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QgICAgICAgICwgIkhCTm9kZXMiKSkpOworICAgIHRtcE1hcC5wdXQoX0ZpZWxkcy5NRVNTQUdFX0JMT0IsIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YSgibWVzc2FnZV9ibG9iIiwgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLk9QVElPTkFMLCAKKyAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZFZhbHVlTWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HICAgICAgICAsIHRydWUpKSk7CisgICAgbWV0YURhdGFNYXAgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAodG1wTWFwKTsKKyAgICBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YS5hZGRTdHJ1Y3RNZXRhRGF0YU1hcChIQk1lc3NhZ2VEYXRhLmNsYXNzLCBtZXRhRGF0YU1hcCk7CisgIH0KKworICBwdWJsaWMgSEJNZXNzYWdlRGF0YSgpIHsKKyAgICBzdXBlcigpOworICB9CisKKyAgcHVibGljIEhCTWVzc2FnZURhdGEoX0ZpZWxkcyBzZXRGaWVsZCwgT2JqZWN0IHZhbHVlKSB7CisgICAgc3VwZXIoc2V0RmllbGQsIHZhbHVlKTsKKyAgfQorCisgIHB1YmxpYyBIQk1lc3NhZ2VEYXRhKEhCTWVzc2FnZURhdGEgb3RoZXIpIHsKKyAgICBzdXBlcihvdGhlcik7CisgIH0KKyAgcHVibGljIEhCTWVzc2FnZURhdGEgZGVlcENvcHkoKSB7CisgICAgcmV0dXJuIG5ldyBIQk1lc3NhZ2VEYXRhKHRoaXMpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBIQk1lc3NhZ2VEYXRhIHBhdGgoU3RyaW5nIHZhbHVlKSB7CisgICAgSEJNZXNzYWdlRGF0YSB4ID0gbmV3IEhCTWVzc2FnZURhdGEoKTsKKyAgICB4LnNldF9wYXRoKHZhbHVlKTsKKyAgICByZXR1cm4geDsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgSEJNZXNzYWdlRGF0YSBwdWxzZShIQlB1bHNlIHZhbHVlKSB7CisgICAgSEJNZXNzYWdlRGF0YSB4ID0gbmV3IEhCTWVzc2FnZURhdGEoKTsKKyAgICB4LnNldF9wdWxzZSh2YWx1ZSk7CisgICAgcmV0dXJuIHg7CisgIH0KKworICBwdWJsaWMgc3RhdGljIEhCTWVzc2FnZURhdGEgYm9vbHZhbChib29sZWFuIHZhbHVlKSB7CisgICAgSEJNZXNzYWdlRGF0YSB4ID0gbmV3IEhCTWVzc2FnZURhdGEoKTsKKyAgICB4LnNldF9ib29sdmFsKHZhbHVlKTsKKyAgICByZXR1cm4geDsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgSEJNZXNzYWdlRGF0YSByZWNvcmRzKEhCUmVjb3JkcyB2YWx1ZSkgeworICAgIEhCTWVzc2FnZURhdGEgeCA9IG5ldyBIQk1lc3NhZ2VEYXRhKCk7CisgICAgeC5zZXRfcmVjb3Jkcyh2YWx1ZSk7CisgICAgcmV0dXJuIHg7CisgIH0KKworICBwdWJsaWMgc3RhdGljIEhCTWVzc2FnZURhdGEgbm9kZXMoSEJOb2RlcyB2YWx1ZSkgeworICAgIEhCTWVzc2FnZURhdGEgeCA9IG5ldyBIQk1lc3NhZ2VEYXRhKCk7CisgICAgeC5zZXRfbm9kZXModmFsdWUpOworICAgIHJldHVybiB4OworICB9CisKKyAgcHVibGljIHN0YXRpYyBIQk1lc3NhZ2VEYXRhIG1lc3NhZ2VfYmxvYihCeXRlQnVmZmVyIHZhbHVlKSB7CisgICAgSEJNZXNzYWdlRGF0YSB4ID0gbmV3IEhCTWVzc2FnZURhdGEoKTsKKyAgICB4LnNldF9tZXNzYWdlX2Jsb2IodmFsdWUpOworICAgIHJldHVybiB4OworICB9CisKKyAgcHVibGljIHN0YXRpYyBIQk1lc3NhZ2VEYXRhIG1lc3NhZ2VfYmxvYihieXRlW10gdmFsdWUpIHsKKyAgICBIQk1lc3NhZ2VEYXRhIHggPSBuZXcgSEJNZXNzYWdlRGF0YSgpOworICAgIHguc2V0X21lc3NhZ2VfYmxvYihCeXRlQnVmZmVyLndyYXAoQXJyYXlzLmNvcHlPZih2YWx1ZSwgdmFsdWUubGVuZ3RoKSkpOworICAgIHJldHVybiB4OworICB9CisKKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgY2hlY2tUeXBlKF9GaWVsZHMgc2V0RmllbGQsIE9iamVjdCB2YWx1ZSkgdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiB7CisgICAgc3dpdGNoIChzZXRGaWVsZCkgeworICAgICAgY2FzZSBQQVRIOgorICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgQ2xhc3NDYXN0RXhjZXB0aW9uKCJXYXMgZXhwZWN0aW5nIHZhbHVlIG9mIHR5cGUgU3RyaW5nIGZvciBmaWVsZCAncGF0aCcsIGJ1dCBnb3QgIiArIHZhbHVlLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsKKyAgICAgIGNhc2UgUFVMU0U6CisgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEhCUHVsc2UpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgQ2xhc3NDYXN0RXhjZXB0aW9uKCJXYXMgZXhwZWN0aW5nIHZhbHVlIG9mIHR5cGUgSEJQdWxzZSBmb3IgZmllbGQgJ3B1bHNlJywgYnV0IGdvdCAiICsgdmFsdWUuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOworICAgICAgY2FzZSBCT09MVkFMOgorICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBCb29sZWFuKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IENsYXNzQ2FzdEV4Y2VwdGlvbigiV2FzIGV4cGVjdGluZyB2YWx1ZSBvZiB0eXBlIEJvb2xlYW4gZm9yIGZpZWxkICdib29sdmFsJywgYnV0IGdvdCAiICsgdmFsdWUuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOworICAgICAgY2FzZSBSRUNPUkRTOgorICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBIQlJlY29yZHMpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgQ2xhc3NDYXN0RXhjZXB0aW9uKCJXYXMgZXhwZWN0aW5nIHZhbHVlIG9mIHR5cGUgSEJSZWNvcmRzIGZvciBmaWVsZCAncmVjb3JkcycsIGJ1dCBnb3QgIiArIHZhbHVlLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsKKyAgICAgIGNhc2UgTk9ERVM6CisgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEhCTm9kZXMpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgQ2xhc3NDYXN0RXhjZXB0aW9uKCJXYXMgZXhwZWN0aW5nIHZhbHVlIG9mIHR5cGUgSEJOb2RlcyBmb3IgZmllbGQgJ25vZGVzJywgYnV0IGdvdCAiICsgdmFsdWUuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOworICAgICAgY2FzZSBNRVNTQUdFX0JMT0I6CisgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEJ5dGVCdWZmZXIpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgQ2xhc3NDYXN0RXhjZXB0aW9uKCJXYXMgZXhwZWN0aW5nIHZhbHVlIG9mIHR5cGUgQnl0ZUJ1ZmZlciBmb3IgZmllbGQgJ21lc3NhZ2VfYmxvYicsIGJ1dCBnb3QgIiArIHZhbHVlLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gZmllbGQgaWQgIiArIHNldEZpZWxkKTsKKyAgICB9CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIE9iamVjdCBzdGFuZGFyZFNjaGVtZVJlYWRWYWx1ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgaXByb3QsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBmaWVsZCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgIF9GaWVsZHMgc2V0RmllbGQgPSBfRmllbGRzLmZpbmRCeVRocmlmdElkKGZpZWxkLmlkKTsKKyAgICBpZiAoc2V0RmllbGQgIT0gbnVsbCkgeworICAgICAgc3dpdGNoIChzZXRGaWVsZCkgeworICAgICAgICBjYXNlIFBBVEg6CisgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gUEFUSF9GSUVMRF9ERVNDLnR5cGUpIHsKKyAgICAgICAgICAgIFN0cmluZyBwYXRoOworICAgICAgICAgICAgcGF0aCA9IGlwcm90LnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgIHJldHVybiBwYXRoOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgfQorICAgICAgICBjYXNlIFBVTFNFOgorICAgICAgICAgIGlmIChmaWVsZC50eXBlID09IFBVTFNFX0ZJRUxEX0RFU0MudHlwZSkgeworICAgICAgICAgICAgSEJQdWxzZSBwdWxzZTsKKyAgICAgICAgICAgIHB1bHNlID0gbmV3IEhCUHVsc2UoKTsKKyAgICAgICAgICAgIHB1bHNlLnJlYWQoaXByb3QpOworICAgICAgICAgICAgcmV0dXJuIHB1bHNlOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgfQorICAgICAgICBjYXNlIEJPT0xWQUw6CisgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gQk9PTFZBTF9GSUVMRF9ERVNDLnR5cGUpIHsKKyAgICAgICAgICAgIEJvb2xlYW4gYm9vbHZhbDsKKyAgICAgICAgICAgIGJvb2x2YWwgPSBpcHJvdC5yZWFkQm9vbCgpOworICAgICAgICAgICAgcmV0dXJuIGJvb2x2YWw7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICB9CisgICAgICAgIGNhc2UgUkVDT1JEUzoKKyAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PSBSRUNPUkRTX0ZJRUxEX0RFU0MudHlwZSkgeworICAgICAgICAgICAgSEJSZWNvcmRzIHJlY29yZHM7CisgICAgICAgICAgICByZWNvcmRzID0gbmV3IEhCUmVjb3JkcygpOworICAgICAgICAgICAgcmVjb3Jkcy5yZWFkKGlwcm90KTsKKyAgICAgICAgICAgIHJldHVybiByZWNvcmRzOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgfQorICAgICAgICBjYXNlIE5PREVTOgorICAgICAgICAgIGlmIChmaWVsZC50eXBlID09IE5PREVTX0ZJRUxEX0RFU0MudHlwZSkgeworICAgICAgICAgICAgSEJOb2RlcyBub2RlczsKKyAgICAgICAgICAgIG5vZGVzID0gbmV3IEhCTm9kZXMoKTsKKyAgICAgICAgICAgIG5vZGVzLnJlYWQoaXByb3QpOworICAgICAgICAgICAgcmV0dXJuIG5vZGVzOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIGZpZWxkLnR5cGUpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgfQorICAgICAgICBjYXNlIE1FU1NBR0VfQkxPQjoKKyAgICAgICAgICBpZiAoZmllbGQudHlwZSA9PSBNRVNTQUdFX0JMT0JfRklFTERfREVTQy50eXBlKSB7CisgICAgICAgICAgICBCeXRlQnVmZmVyIG1lc3NhZ2VfYmxvYjsKKyAgICAgICAgICAgIG1lc3NhZ2VfYmxvYiA9IGlwcm90LnJlYWRCaW5hcnkoKTsKKyAgICAgICAgICAgIHJldHVybiBtZXNzYWdlX2Jsb2I7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigic2V0RmllbGQgd2Fzbid0IG51bGwsIGJ1dCBkaWRuJ3QgbWF0Y2ggYW55IG9mIHRoZSBjYXNlIHN0YXRlbWVudHMhIik7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgc3RhbmRhcmRTY2hlbWVXcml0ZVZhbHVlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgIHN3aXRjaCAoc2V0RmllbGRfKSB7CisgICAgICBjYXNlIFBBVEg6CisgICAgICAgIFN0cmluZyBwYXRoID0gKFN0cmluZyl2YWx1ZV87CisgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKHBhdGgpOworICAgICAgICByZXR1cm47CisgICAgICBjYXNlIFBVTFNFOgorICAgICAgICBIQlB1bHNlIHB1bHNlID0gKEhCUHVsc2UpdmFsdWVfOworICAgICAgICBwdWxzZS53cml0ZShvcHJvdCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIGNhc2UgQk9PTFZBTDoKKyAgICAgICAgQm9vbGVhbiBib29sdmFsID0gKEJvb2xlYW4pdmFsdWVfOworICAgICAgICBvcHJvdC53cml0ZUJvb2woYm9vbHZhbCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIGNhc2UgUkVDT1JEUzoKKyAgICAgICAgSEJSZWNvcmRzIHJlY29yZHMgPSAoSEJSZWNvcmRzKXZhbHVlXzsKKyAgICAgICAgcmVjb3Jkcy53cml0ZShvcHJvdCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIGNhc2UgTk9ERVM6CisgICAgICAgIEhCTm9kZXMgbm9kZXMgPSAoSEJOb2Rlcyl2YWx1ZV87CisgICAgICAgIG5vZGVzLndyaXRlKG9wcm90KTsKKyAgICAgICAgcmV0dXJuOworICAgICAgY2FzZSBNRVNTQUdFX0JMT0I6CisgICAgICAgIEJ5dGVCdWZmZXIgbWVzc2FnZV9ibG9iID0gKEJ5dGVCdWZmZXIpdmFsdWVfOworICAgICAgICBvcHJvdC53cml0ZUJpbmFyeShtZXNzYWdlX2Jsb2IpOworICAgICAgICByZXR1cm47CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW5ub3Qgd3JpdGUgdW5pb24gd2l0aCB1bmtub3duIGZpZWxkICIgKyBzZXRGaWVsZF8pOworICAgIH0KKyAgfQorCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgT2JqZWN0IHR1cGxlU2NoZW1lUmVhZFZhbHVlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBpcHJvdCwgc2hvcnQgZmllbGRJRCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgIF9GaWVsZHMgc2V0RmllbGQgPSBfRmllbGRzLmZpbmRCeVRocmlmdElkKGZpZWxkSUQpOworICAgIGlmIChzZXRGaWVsZCAhPSBudWxsKSB7CisgICAgICBzd2l0Y2ggKHNldEZpZWxkKSB7CisgICAgICAgIGNhc2UgUEFUSDoKKyAgICAgICAgICBTdHJpbmcgcGF0aDsKKyAgICAgICAgICBwYXRoID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICAgIHJldHVybiBwYXRoOworICAgICAgICBjYXNlIFBVTFNFOgorICAgICAgICAgIEhCUHVsc2UgcHVsc2U7CisgICAgICAgICAgcHVsc2UgPSBuZXcgSEJQdWxzZSgpOworICAgICAgICAgIHB1bHNlLnJlYWQoaXByb3QpOworICAgICAgICAgIHJldHVybiBwdWxzZTsKKyAgICAgICAgY2FzZSBCT09MVkFMOgorICAgICAgICAgIEJvb2xlYW4gYm9vbHZhbDsKKyAgICAgICAgICBib29sdmFsID0gaXByb3QucmVhZEJvb2woKTsKKyAgICAgICAgICByZXR1cm4gYm9vbHZhbDsKKyAgICAgICAgY2FzZSBSRUNPUkRTOgorICAgICAgICAgIEhCUmVjb3JkcyByZWNvcmRzOworICAgICAgICAgIHJlY29yZHMgPSBuZXcgSEJSZWNvcmRzKCk7CisgICAgICAgICAgcmVjb3Jkcy5yZWFkKGlwcm90KTsKKyAgICAgICAgICByZXR1cm4gcmVjb3JkczsKKyAgICAgICAgY2FzZSBOT0RFUzoKKyAgICAgICAgICBIQk5vZGVzIG5vZGVzOworICAgICAgICAgIG5vZGVzID0gbmV3IEhCTm9kZXMoKTsKKyAgICAgICAgICBub2Rlcy5yZWFkKGlwcm90KTsKKyAgICAgICAgICByZXR1cm4gbm9kZXM7CisgICAgICAgIGNhc2UgTUVTU0FHRV9CTE9COgorICAgICAgICAgIEJ5dGVCdWZmZXIgbWVzc2FnZV9ibG9iOworICAgICAgICAgIG1lc3NhZ2VfYmxvYiA9IGlwcm90LnJlYWRCaW5hcnkoKTsKKyAgICAgICAgICByZXR1cm4gbWVzc2FnZV9ibG9iOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInNldEZpZWxkIHdhc24ndCBudWxsLCBidXQgZGlkbid0IG1hdGNoIGFueSBvZiB0aGUgY2FzZSBzdGF0ZW1lbnRzISIpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyBuZXcgVFByb3RvY29sRXhjZXB0aW9uKCJDb3VsZG4ndCBmaW5kIGEgZmllbGQgd2l0aCBmaWVsZCBpZCAiICsgZmllbGRJRCk7CisgICAgfQorICB9CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCB2b2lkIHR1cGxlU2NoZW1lV3JpdGVWYWx1ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgb3Byb3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICBzd2l0Y2ggKHNldEZpZWxkXykgeworICAgICAgY2FzZSBQQVRIOgorICAgICAgICBTdHJpbmcgcGF0aCA9IChTdHJpbmcpdmFsdWVfOworICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhwYXRoKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgY2FzZSBQVUxTRToKKyAgICAgICAgSEJQdWxzZSBwdWxzZSA9IChIQlB1bHNlKXZhbHVlXzsKKyAgICAgICAgcHVsc2Uud3JpdGUob3Byb3QpOworICAgICAgICByZXR1cm47CisgICAgICBjYXNlIEJPT0xWQUw6CisgICAgICAgIEJvb2xlYW4gYm9vbHZhbCA9IChCb29sZWFuKXZhbHVlXzsKKyAgICAgICAgb3Byb3Qud3JpdGVCb29sKGJvb2x2YWwpOworICAgICAgICByZXR1cm47CisgICAgICBjYXNlIFJFQ09SRFM6CisgICAgICAgIEhCUmVjb3JkcyByZWNvcmRzID0gKEhCUmVjb3Jkcyl2YWx1ZV87CisgICAgICAgIHJlY29yZHMud3JpdGUob3Byb3QpOworICAgICAgICByZXR1cm47CisgICAgICBjYXNlIE5PREVTOgorICAgICAgICBIQk5vZGVzIG5vZGVzID0gKEhCTm9kZXMpdmFsdWVfOworICAgICAgICBub2Rlcy53cml0ZShvcHJvdCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIGNhc2UgTUVTU0FHRV9CTE9COgorICAgICAgICBCeXRlQnVmZmVyIG1lc3NhZ2VfYmxvYiA9IChCeXRlQnVmZmVyKXZhbHVlXzsKKyAgICAgICAgb3Byb3Qud3JpdGVCaW5hcnkobWVzc2FnZV9ibG9iKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2Fubm90IHdyaXRlIHVuaW9uIHdpdGggdW5rbm93biBmaWVsZCAiICsgc2V0RmllbGRfKTsKKyAgICB9CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBnZXRGaWVsZERlc2MoX0ZpZWxkcyBzZXRGaWVsZCkgeworICAgIHN3aXRjaCAoc2V0RmllbGQpIHsKKyAgICAgIGNhc2UgUEFUSDoKKyAgICAgICAgcmV0dXJuIFBBVEhfRklFTERfREVTQzsKKyAgICAgIGNhc2UgUFVMU0U6CisgICAgICAgIHJldHVybiBQVUxTRV9GSUVMRF9ERVNDOworICAgICAgY2FzZSBCT09MVkFMOgorICAgICAgICByZXR1cm4gQk9PTFZBTF9GSUVMRF9ERVNDOworICAgICAgY2FzZSBSRUNPUkRTOgorICAgICAgICByZXR1cm4gUkVDT1JEU19GSUVMRF9ERVNDOworICAgICAgY2FzZSBOT0RFUzoKKyAgICAgICAgcmV0dXJuIE5PREVTX0ZJRUxEX0RFU0M7CisgICAgICBjYXNlIE1FU1NBR0VfQkxPQjoKKyAgICAgICAgcmV0dXJuIE1FU1NBR0VfQkxPQl9GSUVMRF9ERVNDOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biBmaWVsZCBpZCAiICsgc2V0RmllbGQpOworICAgIH0KKyAgfQorCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdCBnZXRTdHJ1Y3REZXNjKCkgeworICAgIHJldHVybiBTVFJVQ1RfREVTQzsKKyAgfQorCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgX0ZpZWxkcyBlbnVtRm9ySWQoc2hvcnQgaWQpIHsKKyAgICByZXR1cm4gX0ZpZWxkcy5maW5kQnlUaHJpZnRJZE9yVGhyb3coaWQpOworICB9CisKKyAgcHVibGljIF9GaWVsZHMgZmllbGRGb3JJZChpbnQgZmllbGRJZCkgeworICAgIHJldHVybiBfRmllbGRzLmZpbmRCeVRocmlmdElkKGZpZWxkSWQpOworICB9CisKKworICBwdWJsaWMgU3RyaW5nIGdldF9wYXRoKCkgeworICAgIGlmIChnZXRTZXRGaWVsZCgpID09IF9GaWVsZHMuUEFUSCkgeworICAgICAgcmV0dXJuIChTdHJpbmcpZ2V0RmllbGRWYWx1ZSgpOworICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ2Fubm90IGdldCBmaWVsZCAncGF0aCcgYmVjYXVzZSB1bmlvbiBpcyBjdXJyZW50bHkgc2V0IHRvICIgKyBnZXRGaWVsZERlc2MoZ2V0U2V0RmllbGQoKSkubmFtZSk7CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgc2V0X3BhdGgoU3RyaW5nIHZhbHVlKSB7CisgICAgaWYgKHZhbHVlID09IG51bGwpIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworICAgIHNldEZpZWxkXyA9IF9GaWVsZHMuUEFUSDsKKyAgICB2YWx1ZV8gPSB2YWx1ZTsKKyAgfQorCisgIHB1YmxpYyBIQlB1bHNlIGdldF9wdWxzZSgpIHsKKyAgICBpZiAoZ2V0U2V0RmllbGQoKSA9PSBfRmllbGRzLlBVTFNFKSB7CisgICAgICByZXR1cm4gKEhCUHVsc2UpZ2V0RmllbGRWYWx1ZSgpOworICAgIH0gZWxzZSB7CisgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ2Fubm90IGdldCBmaWVsZCAncHVsc2UnIGJlY2F1c2UgdW5pb24gaXMgY3VycmVudGx5IHNldCB0byAiICsgZ2V0RmllbGREZXNjKGdldFNldEZpZWxkKCkpLm5hbWUpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF9wdWxzZShIQlB1bHNlIHZhbHVlKSB7CisgICAgaWYgKHZhbHVlID09IG51bGwpIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworICAgIHNldEZpZWxkXyA9IF9GaWVsZHMuUFVMU0U7CisgICAgdmFsdWVfID0gdmFsdWU7CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBnZXRfYm9vbHZhbCgpIHsKKyAgICBpZiAoZ2V0U2V0RmllbGQoKSA9PSBfRmllbGRzLkJPT0xWQUwpIHsKKyAgICAgIHJldHVybiAoQm9vbGVhbilnZXRGaWVsZFZhbHVlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDYW5ub3QgZ2V0IGZpZWxkICdib29sdmFsJyBiZWNhdXNlIHVuaW9uIGlzIGN1cnJlbnRseSBzZXQgdG8gIiArIGdldEZpZWxkRGVzYyhnZXRTZXRGaWVsZCgpKS5uYW1lKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfYm9vbHZhbChib29sZWFuIHZhbHVlKSB7CisgICAgc2V0RmllbGRfID0gX0ZpZWxkcy5CT09MVkFMOworICAgIHZhbHVlXyA9IHZhbHVlOworICB9CisKKyAgcHVibGljIEhCUmVjb3JkcyBnZXRfcmVjb3JkcygpIHsKKyAgICBpZiAoZ2V0U2V0RmllbGQoKSA9PSBfRmllbGRzLlJFQ09SRFMpIHsKKyAgICAgIHJldHVybiAoSEJSZWNvcmRzKWdldEZpZWxkVmFsdWUoKTsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNhbm5vdCBnZXQgZmllbGQgJ3JlY29yZHMnIGJlY2F1c2UgdW5pb24gaXMgY3VycmVudGx5IHNldCB0byAiICsgZ2V0RmllbGREZXNjKGdldFNldEZpZWxkKCkpLm5hbWUpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF9yZWNvcmRzKEhCUmVjb3JkcyB2YWx1ZSkgeworICAgIGlmICh2YWx1ZSA9PSBudWxsKSB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKyAgICBzZXRGaWVsZF8gPSBfRmllbGRzLlJFQ09SRFM7CisgICAgdmFsdWVfID0gdmFsdWU7CisgIH0KKworICBwdWJsaWMgSEJOb2RlcyBnZXRfbm9kZXMoKSB7CisgICAgaWYgKGdldFNldEZpZWxkKCkgPT0gX0ZpZWxkcy5OT0RFUykgeworICAgICAgcmV0dXJuIChIQk5vZGVzKWdldEZpZWxkVmFsdWUoKTsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNhbm5vdCBnZXQgZmllbGQgJ25vZGVzJyBiZWNhdXNlIHVuaW9uIGlzIGN1cnJlbnRseSBzZXQgdG8gIiArIGdldEZpZWxkRGVzYyhnZXRTZXRGaWVsZCgpKS5uYW1lKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfbm9kZXMoSEJOb2RlcyB2YWx1ZSkgeworICAgIGlmICh2YWx1ZSA9PSBudWxsKSB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKyAgICBzZXRGaWVsZF8gPSBfRmllbGRzLk5PREVTOworICAgIHZhbHVlXyA9IHZhbHVlOworICB9CisKKyAgcHVibGljIGJ5dGVbXSBnZXRfbWVzc2FnZV9ibG9iKCkgeworICAgIHNldF9tZXNzYWdlX2Jsb2Iob3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIucmlnaHRTaXplKGJ1ZmZlcl9mb3JfbWVzc2FnZV9ibG9iKCkpKTsKKyAgICBCeXRlQnVmZmVyIGIgPSBidWZmZXJfZm9yX21lc3NhZ2VfYmxvYigpOworICAgIHJldHVybiBiID09IG51bGwgPyBudWxsIDogYi5hcnJheSgpOworICB9CisKKyAgcHVibGljIEJ5dGVCdWZmZXIgYnVmZmVyX2Zvcl9tZXNzYWdlX2Jsb2IoKSB7CisgICAgaWYgKGdldFNldEZpZWxkKCkgPT0gX0ZpZWxkcy5NRVNTQUdFX0JMT0IpIHsKKyAgICAgIHJldHVybiBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb3B5QmluYXJ5KChCeXRlQnVmZmVyKWdldEZpZWxkVmFsdWUoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDYW5ub3QgZ2V0IGZpZWxkICdtZXNzYWdlX2Jsb2InIGJlY2F1c2UgdW5pb24gaXMgY3VycmVudGx5IHNldCB0byAiICsgZ2V0RmllbGREZXNjKGdldFNldEZpZWxkKCkpLm5hbWUpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF9tZXNzYWdlX2Jsb2IoYnl0ZVtdIHZhbHVlKSB7CisgICAgc2V0X21lc3NhZ2VfYmxvYihCeXRlQnVmZmVyLndyYXAoQXJyYXlzLmNvcHlPZih2YWx1ZSwgdmFsdWUubGVuZ3RoKSkpOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X21lc3NhZ2VfYmxvYihCeXRlQnVmZmVyIHZhbHVlKSB7CisgICAgaWYgKHZhbHVlID09IG51bGwpIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworICAgIHNldEZpZWxkXyA9IF9GaWVsZHMuTUVTU0FHRV9CTE9COworICAgIHZhbHVlXyA9IHZhbHVlOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gaXNfc2V0X3BhdGgoKSB7CisgICAgcmV0dXJuIHNldEZpZWxkXyA9PSBfRmllbGRzLlBBVEg7CisgIH0KKworCisgIHB1YmxpYyBib29sZWFuIGlzX3NldF9wdWxzZSgpIHsKKyAgICByZXR1cm4gc2V0RmllbGRfID09IF9GaWVsZHMuUFVMU0U7CisgIH0KKworCisgIHB1YmxpYyBib29sZWFuIGlzX3NldF9ib29sdmFsKCkgeworICAgIHJldHVybiBzZXRGaWVsZF8gPT0gX0ZpZWxkcy5CT09MVkFMOworICB9CisKKworICBwdWJsaWMgYm9vbGVhbiBpc19zZXRfcmVjb3JkcygpIHsKKyAgICByZXR1cm4gc2V0RmllbGRfID09IF9GaWVsZHMuUkVDT1JEUzsKKyAgfQorCisKKyAgcHVibGljIGJvb2xlYW4gaXNfc2V0X25vZGVzKCkgeworICAgIHJldHVybiBzZXRGaWVsZF8gPT0gX0ZpZWxkcy5OT0RFUzsKKyAgfQorCisKKyAgcHVibGljIGJvb2xlYW4gaXNfc2V0X21lc3NhZ2VfYmxvYigpIHsKKyAgICByZXR1cm4gc2V0RmllbGRfID09IF9GaWVsZHMuTUVTU0FHRV9CTE9COworICB9CisKKworICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7CisgICAgaWYgKG90aGVyIGluc3RhbmNlb2YgSEJNZXNzYWdlRGF0YSkgeworICAgICAgcmV0dXJuIGVxdWFscygoSEJNZXNzYWdlRGF0YSlvdGhlcik7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoSEJNZXNzYWdlRGF0YSBvdGhlcikgeworICAgIHJldHVybiBvdGhlciAhPSBudWxsICYmIGdldFNldEZpZWxkKCkgPT0gb3RoZXIuZ2V0U2V0RmllbGQoKSAmJiBnZXRGaWVsZFZhbHVlKCkuZXF1YWxzKG90aGVyLmdldEZpZWxkVmFsdWUoKSk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBjb21wYXJlVG8oSEJNZXNzYWdlRGF0YSBvdGhlcikgeworICAgIGludCBsYXN0Q29tcGFyaXNvbiA9IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvbXBhcmVUbyhnZXRTZXRGaWVsZCgpLCBvdGhlci5nZXRTZXRGaWVsZCgpKTsKKyAgICBpZiAobGFzdENvbXBhcmlzb24gPT0gMCkgeworICAgICAgcmV0dXJuIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvbXBhcmVUbyhnZXRGaWVsZFZhbHVlKCksIG90aGVyLmdldEZpZWxkVmFsdWUoKSk7CisgICAgfQorICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgfQorCisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgTGlzdDxPYmplY3Q+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKKyAgICBsaXN0LmFkZCh0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRJZEVudW0gc2V0RmllbGQgPSBnZXRTZXRGaWVsZCgpOworICAgIGlmIChzZXRGaWVsZCAhPSBudWxsKSB7CisgICAgICBsaXN0LmFkZChzZXRGaWVsZC5nZXRUaHJpZnRGaWVsZElkKCkpOworICAgICAgT2JqZWN0IHZhbHVlID0gZ2V0RmllbGRWYWx1ZSgpOworICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2Ygb3JnLmFwYWNoZS50aHJpZnQuVEVudW0pIHsKKyAgICAgICAgbGlzdC5hZGQoKChvcmcuYXBhY2hlLnRocmlmdC5URW51bSlnZXRGaWVsZFZhbHVlKCkpLmdldFZhbHVlKCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgbGlzdC5hZGQodmFsdWUpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbGlzdC5oYXNoQ29kZSgpOworICB9CisgIHByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgd3JpdGUobmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRDb21wYWN0UHJvdG9jb2wobmV3IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5USU9TdHJlYW1UcmFuc3BvcnQob3V0KSkpOworICAgIH0gY2F0Y2ggKG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24gdGUpIHsKKyAgICAgIHRocm93IG5ldyBqYXZhLmlvLklPRXhjZXB0aW9uKHRlKTsKKyAgICB9CisgIH0KKworCisgIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0KGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0gaW4pIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgcmVhZChuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbChuZXcgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRJT1N0cmVhbVRyYW5zcG9ydChpbikpKTsKKyAgICB9IGNhdGNoIChvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHRlKSB7CisgICAgICB0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbih0ZSk7CisgICAgfQorICB9CisKKworfQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9IQk5vZGVzLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL0hCTm9kZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmZjNTI2Ci0tLSAvZGV2L251bGwKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9IQk5vZGVzLmphdmEKQEAgLTAsMCArMSw0NjEgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisvKioKKyAqIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMykKKyAqCisgKiBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HCisgKiAgQGdlbmVyYXRlZAorICovCitwYWNrYWdlIGJhY2t0eXBlLnN0b3JtLmdlbmVyYXRlZDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5JU2NoZW1lOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5TY2hlbWVGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5TdGFuZGFyZFNjaGVtZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5UdXBsZVNjaGVtZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHVwbGVQcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuRW5jb2RpbmdVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLkFzeW5jTWV0aG9kQ2FsbGJhY2s7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLkFic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXIuKjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkVudW1NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bVNldDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkJpdFNldDsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQ7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworQFN1cHByZXNzV2FybmluZ3MoeyJjYXN0IiwgInJhd3R5cGVzIiwgInNlcmlhbCIsICJ1bmNoZWNrZWQifSkKK0BHZW5lcmF0ZWQodmFsdWUgPSAiQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4zKSIpCitwdWJsaWMgY2xhc3MgSEJOb2RlcyBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlPEhCTm9kZXMsIEhCTm9kZXMuX0ZpZWxkcz4sIGphdmEuaW8uU2VyaWFsaXphYmxlLCBDbG9uZWFibGUsIENvbXBhcmFibGU8SEJOb2Rlcz4geworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0IFNUUlVDVF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QoIkhCTm9kZXMiKTsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgUFVMU0VfSURTX0ZJRUxEX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkKCJwdWxzZUlkcyIsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkxJU1QsIChzaG9ydCkxKTsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8Q2xhc3M8PyBleHRlbmRzIElTY2hlbWU+LCBTY2hlbWVGYWN0b3J5PiBzY2hlbWVzID0gbmV3IEhhc2hNYXA8Q2xhc3M8PyBleHRlbmRzIElTY2hlbWU+LCBTY2hlbWVGYWN0b3J5PigpOworICBzdGF0aWMgeworICAgIHNjaGVtZXMucHV0KFN0YW5kYXJkU2NoZW1lLmNsYXNzLCBuZXcgSEJOb2Rlc1N0YW5kYXJkU2NoZW1lRmFjdG9yeSgpKTsKKyAgICBzY2hlbWVzLnB1dChUdXBsZVNjaGVtZS5jbGFzcywgbmV3IEhCTm9kZXNUdXBsZVNjaGVtZUZhY3RvcnkoKSk7CisgIH0KKworICBwcml2YXRlIExpc3Q8U3RyaW5nPiBwdWxzZUlkczsgLy8gcmVxdWlyZWQKKworICAvKiogVGhlIHNldCBvZiBmaWVsZHMgdGhpcyBzdHJ1Y3QgY29udGFpbnMsIGFsb25nIHdpdGggY29udmVuaWVuY2UgbWV0aG9kcyBmb3IgZmluZGluZyBhbmQgbWFuaXB1bGF0aW5nIHRoZW0uICovCisgIHB1YmxpYyBlbnVtIF9GaWVsZHMgaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRJZEVudW0geworICAgIFBVTFNFX0lEUygoc2hvcnQpMSwgInB1bHNlSWRzIik7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBfRmllbGRzPiBieU5hbWUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIF9GaWVsZHM+KCk7CisKKyAgICBzdGF0aWMgeworICAgICAgZm9yIChfRmllbGRzIGZpZWxkIDogRW51bVNldC5hbGxPZihfRmllbGRzLmNsYXNzKSkgeworICAgICAgICBieU5hbWUucHV0KGZpZWxkLmdldEZpZWxkTmFtZSgpLCBmaWVsZCk7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCB0aGUgX0ZpZWxkcyBjb25zdGFudCB0aGF0IG1hdGNoZXMgZmllbGRJZCwgb3IgbnVsbCBpZiBpdHMgbm90IGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgX0ZpZWxkcyBmaW5kQnlUaHJpZnRJZChpbnQgZmllbGRJZCkgeworICAgICAgc3dpdGNoKGZpZWxkSWQpIHsKKyAgICAgICAgY2FzZSAxOiAvLyBQVUxTRV9JRFMKKyAgICAgICAgICByZXR1cm4gUFVMU0VfSURTOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgdGhlIF9GaWVsZHMgY29uc3RhbnQgdGhhdCBtYXRjaGVzIGZpZWxkSWQsIHRocm93aW5nIGFuIGV4Y2VwdGlvbgorICAgICAqIGlmIGl0IGlzIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIF9GaWVsZHMgZmluZEJ5VGhyaWZ0SWRPclRocm93KGludCBmaWVsZElkKSB7CisgICAgICBfRmllbGRzIGZpZWxkcyA9IGZpbmRCeVRocmlmdElkKGZpZWxkSWQpOworICAgICAgaWYgKGZpZWxkcyA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJGaWVsZCAiICsgZmllbGRJZCArICIgZG9lc24ndCBleGlzdCEiKTsKKyAgICAgIHJldHVybiBmaWVsZHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCB0aGUgX0ZpZWxkcyBjb25zdGFudCB0aGF0IG1hdGNoZXMgbmFtZSwgb3IgbnVsbCBpZiBpdHMgbm90IGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgX0ZpZWxkcyBmaW5kQnlOYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICByZXR1cm4gYnlOYW1lLmdldChuYW1lKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIHNob3J0IF90aHJpZnRJZDsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBfZmllbGROYW1lOworCisgICAgX0ZpZWxkcyhzaG9ydCB0aHJpZnRJZCwgU3RyaW5nIGZpZWxkTmFtZSkgeworICAgICAgX3RocmlmdElkID0gdGhyaWZ0SWQ7CisgICAgICBfZmllbGROYW1lID0gZmllbGROYW1lOworICAgIH0KKworICAgIHB1YmxpYyBzaG9ydCBnZXRUaHJpZnRGaWVsZElkKCkgeworICAgICAgcmV0dXJuIF90aHJpZnRJZDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEZpZWxkTmFtZSgpIHsKKyAgICAgIHJldHVybiBfZmllbGROYW1lOworICAgIH0KKyAgfQorCisgIC8vIGlzc2V0IGlkIGFzc2lnbm1lbnRzCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPiBtZXRhRGF0YU1hcDsKKyAgc3RhdGljIHsKKyAgICBNYXA8X0ZpZWxkcywgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGE+IHRtcE1hcCA9IG5ldyBFbnVtTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPihfRmllbGRzLmNsYXNzKTsKKyAgICB0bXBNYXAucHV0KF9GaWVsZHMuUFVMU0VfSURTLCBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEoInB1bHNlSWRzIiwgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLkRFRkFVTFQsIAorICAgICAgICBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkxpc3RNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5MSVNULCAKKyAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRWYWx1ZU1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORykpKSk7CisgICAgbWV0YURhdGFNYXAgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAodG1wTWFwKTsKKyAgICBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YS5hZGRTdHJ1Y3RNZXRhRGF0YU1hcChIQk5vZGVzLmNsYXNzLCBtZXRhRGF0YU1hcCk7CisgIH0KKworICBwdWJsaWMgSEJOb2RlcygpIHsKKyAgfQorCisgIHB1YmxpYyBIQk5vZGVzKAorICAgIExpc3Q8U3RyaW5nPiBwdWxzZUlkcykKKyAgeworICAgIHRoaXMoKTsKKyAgICB0aGlzLnB1bHNlSWRzID0gcHVsc2VJZHM7CisgIH0KKworICAvKioKKyAgICogUGVyZm9ybXMgYSBkZWVwIGNvcHkgb24gPGk+b3RoZXI8L2k+LgorICAgKi8KKyAgcHVibGljIEhCTm9kZXMoSEJOb2RlcyBvdGhlcikgeworICAgIGlmIChvdGhlci5pc19zZXRfcHVsc2VJZHMoKSkgeworICAgICAgTGlzdDxTdHJpbmc+IF9fdGhpc19fcHVsc2VJZHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4ob3RoZXIucHVsc2VJZHMpOworICAgICAgdGhpcy5wdWxzZUlkcyA9IF9fdGhpc19fcHVsc2VJZHM7CisgICAgfQorICB9CisKKyAgcHVibGljIEhCTm9kZXMgZGVlcENvcHkoKSB7CisgICAgcmV0dXJuIG5ldyBIQk5vZGVzKHRoaXMpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgIHRoaXMucHVsc2VJZHMgPSBudWxsOworICB9CisKKyAgcHVibGljIGludCBnZXRfcHVsc2VJZHNfc2l6ZSgpIHsKKyAgICByZXR1cm4gKHRoaXMucHVsc2VJZHMgPT0gbnVsbCkgPyAwIDogdGhpcy5wdWxzZUlkcy5zaXplKCk7CisgIH0KKworICBwdWJsaWMgamF2YS51dGlsLkl0ZXJhdG9yPFN0cmluZz4gZ2V0X3B1bHNlSWRzX2l0ZXJhdG9yKCkgeworICAgIHJldHVybiAodGhpcy5wdWxzZUlkcyA9PSBudWxsKSA/IG51bGwgOiB0aGlzLnB1bHNlSWRzLml0ZXJhdG9yKCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBhZGRfdG9fcHVsc2VJZHMoU3RyaW5nIGVsZW0pIHsKKyAgICBpZiAodGhpcy5wdWxzZUlkcyA9PSBudWxsKSB7CisgICAgICB0aGlzLnB1bHNlSWRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgfQorICAgIHRoaXMucHVsc2VJZHMuYWRkKGVsZW0pOworICB9CisKKyAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRfcHVsc2VJZHMoKSB7CisgICAgcmV0dXJuIHRoaXMucHVsc2VJZHM7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfcHVsc2VJZHMoTGlzdDxTdHJpbmc+IHB1bHNlSWRzKSB7CisgICAgdGhpcy5wdWxzZUlkcyA9IHB1bHNlSWRzOworICB9CisKKyAgcHVibGljIHZvaWQgdW5zZXRfcHVsc2VJZHMoKSB7CisgICAgdGhpcy5wdWxzZUlkcyA9IG51bGw7CisgIH0KKworICAvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkIHB1bHNlSWRzIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLworICBwdWJsaWMgYm9vbGVhbiBpc19zZXRfcHVsc2VJZHMoKSB7CisgICAgcmV0dXJuIHRoaXMucHVsc2VJZHMgIT0gbnVsbDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF9wdWxzZUlkc19pc1NldChib29sZWFuIHZhbHVlKSB7CisgICAgaWYgKCF2YWx1ZSkgeworICAgICAgdGhpcy5wdWxzZUlkcyA9IG51bGw7CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgc2V0RmllbGRWYWx1ZShfRmllbGRzIGZpZWxkLCBPYmplY3QgdmFsdWUpIHsKKyAgICBzd2l0Y2ggKGZpZWxkKSB7CisgICAgY2FzZSBQVUxTRV9JRFM6CisgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICB1bnNldF9wdWxzZUlkcygpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2V0X3B1bHNlSWRzKChMaXN0PFN0cmluZz4pdmFsdWUpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICB9CisgIH0KKworICBwdWJsaWMgT2JqZWN0IGdldEZpZWxkVmFsdWUoX0ZpZWxkcyBmaWVsZCkgeworICAgIHN3aXRjaCAoZmllbGQpIHsKKyAgICBjYXNlIFBVTFNFX0lEUzoKKyAgICAgIHJldHVybiBnZXRfcHVsc2VJZHMoKTsKKworICAgIH0KKyAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgIH0KKworICAvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkIGNvcnJlc3BvbmRpbmcgdG8gZmllbGRJRCBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNTZXQoX0ZpZWxkcyBmaWVsZCkgeworICAgIGlmIChmaWVsZCA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgc3dpdGNoIChmaWVsZCkgeworICAgIGNhc2UgUFVMU0VfSURTOgorICAgICAgcmV0dXJuIGlzX3NldF9wdWxzZUlkcygpOworICAgIH0KKyAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCB0aGF0KSB7CisgICAgaWYgKHRoYXQgPT0gbnVsbCkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAodGhhdCBpbnN0YW5jZW9mIEhCTm9kZXMpCisgICAgICByZXR1cm4gdGhpcy5lcXVhbHMoKEhCTm9kZXMpdGhhdCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gZXF1YWxzKEhCTm9kZXMgdGhhdCkgeworICAgIGlmICh0aGF0ID09IG51bGwpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBib29sZWFuIHRoaXNfcHJlc2VudF9wdWxzZUlkcyA9IHRydWUgJiYgdGhpcy5pc19zZXRfcHVsc2VJZHMoKTsKKyAgICBib29sZWFuIHRoYXRfcHJlc2VudF9wdWxzZUlkcyA9IHRydWUgJiYgdGhhdC5pc19zZXRfcHVsc2VJZHMoKTsKKyAgICBpZiAodGhpc19wcmVzZW50X3B1bHNlSWRzIHx8IHRoYXRfcHJlc2VudF9wdWxzZUlkcykgeworICAgICAgaWYgKCEodGhpc19wcmVzZW50X3B1bHNlSWRzICYmIHRoYXRfcHJlc2VudF9wdWxzZUlkcykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGlmICghdGhpcy5wdWxzZUlkcy5lcXVhbHModGhhdC5wdWxzZUlkcykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgIExpc3Q8T2JqZWN0PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7CisKKyAgICBib29sZWFuIHByZXNlbnRfcHVsc2VJZHMgPSB0cnVlICYmIChpc19zZXRfcHVsc2VJZHMoKSk7CisgICAgbGlzdC5hZGQocHJlc2VudF9wdWxzZUlkcyk7CisgICAgaWYgKHByZXNlbnRfcHVsc2VJZHMpCisgICAgICBsaXN0LmFkZChwdWxzZUlkcyk7CisKKyAgICByZXR1cm4gbGlzdC5oYXNoQ29kZSgpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgY29tcGFyZVRvKEhCTm9kZXMgb3RoZXIpIHsKKyAgICBpZiAoIWdldENsYXNzKCkuZXF1YWxzKG90aGVyLmdldENsYXNzKCkpKSB7CisgICAgICByZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCkuY29tcGFyZVRvKG90aGVyLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICB9CisKKyAgICBpbnQgbGFzdENvbXBhcmlzb24gPSAwOworCisgICAgbGFzdENvbXBhcmlzb24gPSBCb29sZWFuLnZhbHVlT2YoaXNfc2V0X3B1bHNlSWRzKCkpLmNvbXBhcmVUbyhvdGhlci5pc19zZXRfcHVsc2VJZHMoKSk7CisgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICB9CisgICAgaWYgKGlzX3NldF9wdWxzZUlkcygpKSB7CisgICAgICBsYXN0Q29tcGFyaXNvbiA9IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvbXBhcmVUbyh0aGlzLnB1bHNlSWRzLCBvdGhlci5wdWxzZUlkcyk7CisgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworICB9CisKKyAgcHVibGljIF9GaWVsZHMgZmllbGRGb3JJZChpbnQgZmllbGRJZCkgeworICAgIHJldHVybiBfRmllbGRzLmZpbmRCeVRocmlmdElkKGZpZWxkSWQpOworICB9CisKKyAgcHVibGljIHZvaWQgcmVhZChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgaXByb3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICBzY2hlbWVzLmdldChpcHJvdC5nZXRTY2hlbWUoKSkuZ2V0U2NoZW1lKCkucmVhZChpcHJvdCwgdGhpcyk7CisgIH0KKworICBwdWJsaWMgdm9pZCB3cml0ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgb3Byb3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICBzY2hlbWVzLmdldChvcHJvdC5nZXRTY2hlbWUoKSkuZ2V0U2NoZW1lKCkud3JpdGUob3Byb3QsIHRoaXMpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCJIQk5vZGVzKCIpOworICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOworCisgICAgc2IuYXBwZW5kKCJwdWxzZUlkczoiKTsKKyAgICBpZiAodGhpcy5wdWxzZUlkcyA9PSBudWxsKSB7CisgICAgICBzYi5hcHBlbmQoIm51bGwiKTsKKyAgICB9IGVsc2UgeworICAgICAgc2IuYXBwZW5kKHRoaXMucHVsc2VJZHMpOworICAgIH0KKyAgICBmaXJzdCA9IGZhbHNlOworICAgIHNiLmFwcGVuZCgiKSIpOworICAgIHJldHVybiBzYi50b1N0cmluZygpOworICB9CisKKyAgcHVibGljIHZvaWQgdmFsaWRhdGUoKSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgLy8gY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcworICAgIC8vIGNoZWNrIGZvciBzdWItc3RydWN0IHZhbGlkaXR5CisgIH0KKworICBwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIHdyaXRlKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQ29tcGFjdFByb3RvY29sKG5ldyBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVElPU3RyZWFtVHJhbnNwb3J0KG91dCkpKTsKKyAgICB9IGNhdGNoIChvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHRlKSB7CisgICAgICB0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbih0ZSk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBpbikgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICByZWFkKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQ29tcGFjdFByb3RvY29sKG5ldyBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVElPU3RyZWFtVHJhbnNwb3J0KGluKSkpOworICAgIH0gY2F0Y2ggKG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24gdGUpIHsKKyAgICAgIHRocm93IG5ldyBqYXZhLmlvLklPRXhjZXB0aW9uKHRlKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBIQk5vZGVzU3RhbmRhcmRTY2hlbWVGYWN0b3J5IGltcGxlbWVudHMgU2NoZW1lRmFjdG9yeSB7CisgICAgcHVibGljIEhCTm9kZXNTdGFuZGFyZFNjaGVtZSBnZXRTY2hlbWUoKSB7CisgICAgICByZXR1cm4gbmV3IEhCTm9kZXNTdGFuZGFyZFNjaGVtZSgpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIEhCTm9kZXNTdGFuZGFyZFNjaGVtZSBleHRlbmRzIFN0YW5kYXJkU2NoZW1lPEhCTm9kZXM+IHsKKworICAgIHB1YmxpYyB2b2lkIHJlYWQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIGlwcm90LCBIQk5vZGVzIHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIHNjaGVtZUZpZWxkOworICAgICAgaXByb3QucmVhZFN0cnVjdEJlZ2luKCk7CisgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgIHsKKyAgICAgICAgc2NoZW1lRmllbGQgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpOworICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVE9QKSB7IAorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoc2NoZW1lRmllbGQuaWQpIHsKKyAgICAgICAgICBjYXNlIDE6IC8vIFBVTFNFX0lEUworICAgICAgICAgICAgaWYgKHNjaGVtZUZpZWxkLnR5cGUgPT0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTElTVCkgeworICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVExpc3QgX2xpc3Q3MDYgPSBpcHJvdC5yZWFkTGlzdEJlZ2luKCk7CisgICAgICAgICAgICAgICAgc3RydWN0LnB1bHNlSWRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KF9saXN0NzA2LnNpemUpOworICAgICAgICAgICAgICAgIFN0cmluZyBfZWxlbTcwNzsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBfaTcwOCA9IDA7IF9pNzA4IDwgX2xpc3Q3MDYuc2l6ZTsgKytfaTcwOCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBfZWxlbTcwNyA9IGlwcm90LnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgIHN0cnVjdC5wdWxzZUlkcy5hZGQoX2VsZW03MDcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpcHJvdC5yZWFkTGlzdEVuZCgpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIHN0cnVjdC5zZXRfcHVsc2VJZHNfaXNTZXQodHJ1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeyAKKyAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOworICAgICAgICB9CisgICAgICAgIGlwcm90LnJlYWRGaWVsZEVuZCgpOworICAgICAgfQorICAgICAgaXByb3QucmVhZFN0cnVjdEVuZCgpOworICAgICAgc3RydWN0LnZhbGlkYXRlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIG9wcm90LCBIQk5vZGVzIHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgc3RydWN0LnZhbGlkYXRlKCk7CisKKyAgICAgIG9wcm90LndyaXRlU3RydWN0QmVnaW4oU1RSVUNUX0RFU0MpOworICAgICAgaWYgKHN0cnVjdC5wdWxzZUlkcyAhPSBudWxsKSB7CisgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihQVUxTRV9JRFNfRklFTERfREVTQyk7CisgICAgICAgIHsKKyAgICAgICAgICBvcHJvdC53cml0ZUxpc3RCZWdpbihuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVExpc3Qob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCBzdHJ1Y3QucHVsc2VJZHMuc2l6ZSgpKSk7CisgICAgICAgICAgZm9yIChTdHJpbmcgX2l0ZXI3MDkgOiBzdHJ1Y3QucHVsc2VJZHMpCisgICAgICAgICAgeworICAgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoX2l0ZXI3MDkpOworICAgICAgICAgIH0KKyAgICAgICAgICBvcHJvdC53cml0ZUxpc3RFbmQoKTsKKyAgICAgICAgfQorICAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgICB9CisgICAgICBvcHJvdC53cml0ZUZpZWxkU3RvcCgpOworICAgICAgb3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsKKyAgICB9CisKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIEhCTm9kZXNUdXBsZVNjaGVtZUZhY3RvcnkgaW1wbGVtZW50cyBTY2hlbWVGYWN0b3J5IHsKKyAgICBwdWJsaWMgSEJOb2Rlc1R1cGxlU2NoZW1lIGdldFNjaGVtZSgpIHsKKyAgICAgIHJldHVybiBuZXcgSEJOb2Rlc1R1cGxlU2NoZW1lKCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSEJOb2Rlc1R1cGxlU2NoZW1lIGV4dGVuZHMgVHVwbGVTY2hlbWU8SEJOb2Rlcz4geworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIHByb3QsIEhCTm9kZXMgc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICBUVHVwbGVQcm90b2NvbCBvcHJvdCA9IChUVHVwbGVQcm90b2NvbCkgcHJvdDsKKyAgICAgIEJpdFNldCBvcHRpb25hbHMgPSBuZXcgQml0U2V0KCk7CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9wdWxzZUlkcygpKSB7CisgICAgICAgIG9wdGlvbmFscy5zZXQoMCk7CisgICAgICB9CisgICAgICBvcHJvdC53cml0ZUJpdFNldChvcHRpb25hbHMsIDEpOworICAgICAgaWYgKHN0cnVjdC5pc19zZXRfcHVsc2VJZHMoKSkgeworICAgICAgICB7CisgICAgICAgICAgb3Byb3Qud3JpdGVJMzIoc3RydWN0LnB1bHNlSWRzLnNpemUoKSk7CisgICAgICAgICAgZm9yIChTdHJpbmcgX2l0ZXI3MTAgOiBzdHJ1Y3QucHVsc2VJZHMpCisgICAgICAgICAgeworICAgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoX2l0ZXI3MTApOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlYWQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIHByb3QsIEhCTm9kZXMgc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICBUVHVwbGVQcm90b2NvbCBpcHJvdCA9IChUVHVwbGVQcm90b2NvbCkgcHJvdDsKKyAgICAgIEJpdFNldCBpbmNvbWluZyA9IGlwcm90LnJlYWRCaXRTZXQoMSk7CisgICAgICBpZiAoaW5jb21pbmcuZ2V0KDApKSB7CisgICAgICAgIHsKKyAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTGlzdCBfbGlzdDcxMSA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTGlzdChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcsIGlwcm90LnJlYWRJMzIoKSk7CisgICAgICAgICAgc3RydWN0LnB1bHNlSWRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KF9saXN0NzExLnNpemUpOworICAgICAgICAgIFN0cmluZyBfZWxlbTcxMjsKKyAgICAgICAgICBmb3IgKGludCBfaTcxMyA9IDA7IF9pNzEzIDwgX2xpc3Q3MTEuc2l6ZTsgKytfaTcxMykKKyAgICAgICAgICB7CisgICAgICAgICAgICBfZWxlbTcxMiA9IGlwcm90LnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgIHN0cnVjdC5wdWxzZUlkcy5hZGQoX2VsZW03MTIpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdHJ1Y3Quc2V0X3B1bHNlSWRzX2lzU2V0KHRydWUpOworICAgICAgfQorICAgIH0KKyAgfQorCit9CisKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvSEJQdWxzZS5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9IQlB1bHNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWEyNDRmNQotLS0gL2Rldi9udWxsCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvSEJQdWxzZS5qYXZhCkBAIC0wLDAgKzEsNTIyIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLyoqCisgKiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjMpCisgKgorICogRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lORworICogIEBnZW5lcmF0ZWQKKyAqLworcGFja2FnZSBiYWNrdHlwZS5zdG9ybS5nZW5lcmF0ZWQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuSVNjaGVtZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuU2NoZW1lRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuU3RhbmRhcmRTY2hlbWU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuVHVwbGVTY2hlbWU7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR1cGxlUHJvdG9jb2w7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LkVuY29kaW5nVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5Bc3luY01ldGhvZENhbGxiYWNrOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci5BYnN0cmFjdE5vbmJsb2NraW5nU2VydmVyLio7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5FbnVtTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5CaXRTZXQ7CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiY2FzdCIsICJyYXd0eXBlcyIsICJzZXJpYWwiLCAidW5jaGVja2VkIn0pCitAR2VuZXJhdGVkKHZhbHVlID0gIkF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMykiKQorcHVibGljIGNsYXNzIEhCUHVsc2UgaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZTxIQlB1bHNlLCBIQlB1bHNlLl9GaWVsZHM+LCBqYXZhLmlvLlNlcmlhbGl6YWJsZSwgQ2xvbmVhYmxlLCBDb21wYXJhYmxlPEhCUHVsc2U+IHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdCBTVFJVQ1RfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0KCJIQlB1bHNlIik7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIElEX0ZJRUxEX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkKCJpZCIsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORywgKHNob3J0KTEpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgREVUQUlMU19GSUVMRF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCgiZGV0YWlscyIsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORywgKHNob3J0KTIpOworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxDbGFzczw/IGV4dGVuZHMgSVNjaGVtZT4sIFNjaGVtZUZhY3Rvcnk+IHNjaGVtZXMgPSBuZXcgSGFzaE1hcDxDbGFzczw/IGV4dGVuZHMgSVNjaGVtZT4sIFNjaGVtZUZhY3Rvcnk+KCk7CisgIHN0YXRpYyB7CisgICAgc2NoZW1lcy5wdXQoU3RhbmRhcmRTY2hlbWUuY2xhc3MsIG5ldyBIQlB1bHNlU3RhbmRhcmRTY2hlbWVGYWN0b3J5KCkpOworICAgIHNjaGVtZXMucHV0KFR1cGxlU2NoZW1lLmNsYXNzLCBuZXcgSEJQdWxzZVR1cGxlU2NoZW1lRmFjdG9yeSgpKTsKKyAgfQorCisgIHByaXZhdGUgU3RyaW5nIGlkOyAvLyByZXF1aXJlZAorICBwcml2YXRlIEJ5dGVCdWZmZXIgZGV0YWlsczsgLy8gcmVxdWlyZWQKKworICAvKiogVGhlIHNldCBvZiBmaWVsZHMgdGhpcyBzdHJ1Y3QgY29udGFpbnMsIGFsb25nIHdpdGggY29udmVuaWVuY2UgbWV0aG9kcyBmb3IgZmluZGluZyBhbmQgbWFuaXB1bGF0aW5nIHRoZW0uICovCisgIHB1YmxpYyBlbnVtIF9GaWVsZHMgaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRJZEVudW0geworICAgIElEKChzaG9ydCkxLCAiaWQiKSwKKyAgICBERVRBSUxTKChzaG9ydCkyLCAiZGV0YWlscyIpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgX0ZpZWxkcz4gYnlOYW1lID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBfRmllbGRzPigpOworCisgICAgc3RhdGljIHsKKyAgICAgIGZvciAoX0ZpZWxkcyBmaWVsZCA6IEVudW1TZXQuYWxsT2YoX0ZpZWxkcy5jbGFzcykpIHsKKyAgICAgICAgYnlOYW1lLnB1dChmaWVsZC5nZXRGaWVsZE5hbWUoKSwgZmllbGQpOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgdGhlIF9GaWVsZHMgY29uc3RhbnQgdGhhdCBtYXRjaGVzIGZpZWxkSWQsIG9yIG51bGwgaWYgaXRzIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIF9GaWVsZHMgZmluZEJ5VGhyaWZ0SWQoaW50IGZpZWxkSWQpIHsKKyAgICAgIHN3aXRjaChmaWVsZElkKSB7CisgICAgICAgIGNhc2UgMTogLy8gSUQKKyAgICAgICAgICByZXR1cm4gSUQ7CisgICAgICAgIGNhc2UgMjogLy8gREVUQUlMUworICAgICAgICAgIHJldHVybiBERVRBSUxTOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgdGhlIF9GaWVsZHMgY29uc3RhbnQgdGhhdCBtYXRjaGVzIGZpZWxkSWQsIHRocm93aW5nIGFuIGV4Y2VwdGlvbgorICAgICAqIGlmIGl0IGlzIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIF9GaWVsZHMgZmluZEJ5VGhyaWZ0SWRPclRocm93KGludCBmaWVsZElkKSB7CisgICAgICBfRmllbGRzIGZpZWxkcyA9IGZpbmRCeVRocmlmdElkKGZpZWxkSWQpOworICAgICAgaWYgKGZpZWxkcyA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJGaWVsZCAiICsgZmllbGRJZCArICIgZG9lc24ndCBleGlzdCEiKTsKKyAgICAgIHJldHVybiBmaWVsZHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCB0aGUgX0ZpZWxkcyBjb25zdGFudCB0aGF0IG1hdGNoZXMgbmFtZSwgb3IgbnVsbCBpZiBpdHMgbm90IGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgX0ZpZWxkcyBmaW5kQnlOYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICByZXR1cm4gYnlOYW1lLmdldChuYW1lKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIHNob3J0IF90aHJpZnRJZDsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBfZmllbGROYW1lOworCisgICAgX0ZpZWxkcyhzaG9ydCB0aHJpZnRJZCwgU3RyaW5nIGZpZWxkTmFtZSkgeworICAgICAgX3RocmlmdElkID0gdGhyaWZ0SWQ7CisgICAgICBfZmllbGROYW1lID0gZmllbGROYW1lOworICAgIH0KKworICAgIHB1YmxpYyBzaG9ydCBnZXRUaHJpZnRGaWVsZElkKCkgeworICAgICAgcmV0dXJuIF90aHJpZnRJZDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEZpZWxkTmFtZSgpIHsKKyAgICAgIHJldHVybiBfZmllbGROYW1lOworICAgIH0KKyAgfQorCisgIC8vIGlzc2V0IGlkIGFzc2lnbm1lbnRzCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPiBtZXRhRGF0YU1hcDsKKyAgc3RhdGljIHsKKyAgICBNYXA8X0ZpZWxkcywgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGE+IHRtcE1hcCA9IG5ldyBFbnVtTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPihfRmllbGRzLmNsYXNzKTsKKyAgICB0bXBNYXAucHV0KF9GaWVsZHMuSUQsIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YSgiaWQiLCBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRSZXF1aXJlbWVudFR5cGUuUkVRVUlSRUQsIAorICAgICAgICBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkVmFsdWVNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcpKSk7CisgICAgdG1wTWFwLnB1dChfRmllbGRzLkRFVEFJTFMsIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YSgiZGV0YWlscyIsIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZFJlcXVpcmVtZW50VHlwZS5ERUZBVUxULCAKKyAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZFZhbHVlTWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HICAgICAgICAsIHRydWUpKSk7CisgICAgbWV0YURhdGFNYXAgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAodG1wTWFwKTsKKyAgICBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YS5hZGRTdHJ1Y3RNZXRhRGF0YU1hcChIQlB1bHNlLmNsYXNzLCBtZXRhRGF0YU1hcCk7CisgIH0KKworICBwdWJsaWMgSEJQdWxzZSgpIHsKKyAgfQorCisgIHB1YmxpYyBIQlB1bHNlKAorICAgIFN0cmluZyBpZCwKKyAgICBCeXRlQnVmZmVyIGRldGFpbHMpCisgIHsKKyAgICB0aGlzKCk7CisgICAgdGhpcy5pZCA9IGlkOworICAgIHRoaXMuZGV0YWlscyA9IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvcHlCaW5hcnkoZGV0YWlscyk7CisgIH0KKworICAvKioKKyAgICogUGVyZm9ybXMgYSBkZWVwIGNvcHkgb24gPGk+b3RoZXI8L2k+LgorICAgKi8KKyAgcHVibGljIEhCUHVsc2UoSEJQdWxzZSBvdGhlcikgeworICAgIGlmIChvdGhlci5pc19zZXRfaWQoKSkgeworICAgICAgdGhpcy5pZCA9IG90aGVyLmlkOworICAgIH0KKyAgICBpZiAob3RoZXIuaXNfc2V0X2RldGFpbHMoKSkgeworICAgICAgdGhpcy5kZXRhaWxzID0gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29weUJpbmFyeShvdGhlci5kZXRhaWxzKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgSEJQdWxzZSBkZWVwQ29weSgpIHsKKyAgICByZXR1cm4gbmV3IEhCUHVsc2UodGhpcyk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgdGhpcy5pZCA9IG51bGw7CisgICAgdGhpcy5kZXRhaWxzID0gbnVsbDsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgZ2V0X2lkKCkgeworICAgIHJldHVybiB0aGlzLmlkOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X2lkKFN0cmluZyBpZCkgeworICAgIHRoaXMuaWQgPSBpZDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHVuc2V0X2lkKCkgeworICAgIHRoaXMuaWQgPSBudWxsOworICB9CisKKyAgLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBpZCBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNfc2V0X2lkKCkgeworICAgIHJldHVybiB0aGlzLmlkICE9IG51bGw7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfaWRfaXNTZXQoYm9vbGVhbiB2YWx1ZSkgeworICAgIGlmICghdmFsdWUpIHsKKyAgICAgIHRoaXMuaWQgPSBudWxsOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBieXRlW10gZ2V0X2RldGFpbHMoKSB7CisgICAgc2V0X2RldGFpbHMob3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIucmlnaHRTaXplKGRldGFpbHMpKTsKKyAgICByZXR1cm4gZGV0YWlscyA9PSBudWxsID8gbnVsbCA6IGRldGFpbHMuYXJyYXkoKTsKKyAgfQorCisgIHB1YmxpYyBCeXRlQnVmZmVyIGJ1ZmZlcl9mb3JfZGV0YWlscygpIHsKKyAgICByZXR1cm4gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29weUJpbmFyeShkZXRhaWxzKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF9kZXRhaWxzKGJ5dGVbXSBkZXRhaWxzKSB7CisgICAgdGhpcy5kZXRhaWxzID0gZGV0YWlscyA9PSBudWxsID8gKEJ5dGVCdWZmZXIpbnVsbCA6IEJ5dGVCdWZmZXIud3JhcChBcnJheXMuY29weU9mKGRldGFpbHMsIGRldGFpbHMubGVuZ3RoKSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfZGV0YWlscyhCeXRlQnVmZmVyIGRldGFpbHMpIHsKKyAgICB0aGlzLmRldGFpbHMgPSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb3B5QmluYXJ5KGRldGFpbHMpOworICB9CisKKyAgcHVibGljIHZvaWQgdW5zZXRfZGV0YWlscygpIHsKKyAgICB0aGlzLmRldGFpbHMgPSBudWxsOworICB9CisKKyAgLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBkZXRhaWxzIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLworICBwdWJsaWMgYm9vbGVhbiBpc19zZXRfZGV0YWlscygpIHsKKyAgICByZXR1cm4gdGhpcy5kZXRhaWxzICE9IG51bGw7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfZGV0YWlsc19pc1NldChib29sZWFuIHZhbHVlKSB7CisgICAgaWYgKCF2YWx1ZSkgeworICAgICAgdGhpcy5kZXRhaWxzID0gbnVsbDsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRGaWVsZFZhbHVlKF9GaWVsZHMgZmllbGQsIE9iamVjdCB2YWx1ZSkgeworICAgIHN3aXRjaCAoZmllbGQpIHsKKyAgICBjYXNlIElEOgorICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgdW5zZXRfaWQoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNldF9pZCgoU3RyaW5nKXZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBERVRBSUxTOgorICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgdW5zZXRfZGV0YWlscygpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2V0X2RldGFpbHMoKEJ5dGVCdWZmZXIpdmFsdWUpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICB9CisgIH0KKworICBwdWJsaWMgT2JqZWN0IGdldEZpZWxkVmFsdWUoX0ZpZWxkcyBmaWVsZCkgeworICAgIHN3aXRjaCAoZmllbGQpIHsKKyAgICBjYXNlIElEOgorICAgICAgcmV0dXJuIGdldF9pZCgpOworCisgICAgY2FzZSBERVRBSUxTOgorICAgICAgcmV0dXJuIGdldF9kZXRhaWxzKCk7CisKKyAgICB9CisgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICB9CisKKyAgLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBjb3JyZXNwb25kaW5nIHRvIGZpZWxkSUQgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgIHB1YmxpYyBib29sZWFuIGlzU2V0KF9GaWVsZHMgZmllbGQpIHsKKyAgICBpZiAoZmllbGQgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHN3aXRjaCAoZmllbGQpIHsKKyAgICBjYXNlIElEOgorICAgICAgcmV0dXJuIGlzX3NldF9pZCgpOworICAgIGNhc2UgREVUQUlMUzoKKyAgICAgIHJldHVybiBpc19zZXRfZGV0YWlscygpOworICAgIH0KKyAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCB0aGF0KSB7CisgICAgaWYgKHRoYXQgPT0gbnVsbCkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAodGhhdCBpbnN0YW5jZW9mIEhCUHVsc2UpCisgICAgICByZXR1cm4gdGhpcy5lcXVhbHMoKEhCUHVsc2UpdGhhdCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gZXF1YWxzKEhCUHVsc2UgdGhhdCkgeworICAgIGlmICh0aGF0ID09IG51bGwpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBib29sZWFuIHRoaXNfcHJlc2VudF9pZCA9IHRydWUgJiYgdGhpcy5pc19zZXRfaWQoKTsKKyAgICBib29sZWFuIHRoYXRfcHJlc2VudF9pZCA9IHRydWUgJiYgdGhhdC5pc19zZXRfaWQoKTsKKyAgICBpZiAodGhpc19wcmVzZW50X2lkIHx8IHRoYXRfcHJlc2VudF9pZCkgeworICAgICAgaWYgKCEodGhpc19wcmVzZW50X2lkICYmIHRoYXRfcHJlc2VudF9pZCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGlmICghdGhpcy5pZC5lcXVhbHModGhhdC5pZCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sZWFuIHRoaXNfcHJlc2VudF9kZXRhaWxzID0gdHJ1ZSAmJiB0aGlzLmlzX3NldF9kZXRhaWxzKCk7CisgICAgYm9vbGVhbiB0aGF0X3ByZXNlbnRfZGV0YWlscyA9IHRydWUgJiYgdGhhdC5pc19zZXRfZGV0YWlscygpOworICAgIGlmICh0aGlzX3ByZXNlbnRfZGV0YWlscyB8fCB0aGF0X3ByZXNlbnRfZGV0YWlscykgeworICAgICAgaWYgKCEodGhpc19wcmVzZW50X2RldGFpbHMgJiYgdGhhdF9wcmVzZW50X2RldGFpbHMpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBpZiAoIXRoaXMuZGV0YWlscy5lcXVhbHModGhhdC5kZXRhaWxzKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgTGlzdDxPYmplY3Q+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKKworICAgIGJvb2xlYW4gcHJlc2VudF9pZCA9IHRydWUgJiYgKGlzX3NldF9pZCgpKTsKKyAgICBsaXN0LmFkZChwcmVzZW50X2lkKTsKKyAgICBpZiAocHJlc2VudF9pZCkKKyAgICAgIGxpc3QuYWRkKGlkKTsKKworICAgIGJvb2xlYW4gcHJlc2VudF9kZXRhaWxzID0gdHJ1ZSAmJiAoaXNfc2V0X2RldGFpbHMoKSk7CisgICAgbGlzdC5hZGQocHJlc2VudF9kZXRhaWxzKTsKKyAgICBpZiAocHJlc2VudF9kZXRhaWxzKQorICAgICAgbGlzdC5hZGQoZGV0YWlscyk7CisKKyAgICByZXR1cm4gbGlzdC5oYXNoQ29kZSgpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgY29tcGFyZVRvKEhCUHVsc2Ugb3RoZXIpIHsKKyAgICBpZiAoIWdldENsYXNzKCkuZXF1YWxzKG90aGVyLmdldENsYXNzKCkpKSB7CisgICAgICByZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCkuY29tcGFyZVRvKG90aGVyLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICB9CisKKyAgICBpbnQgbGFzdENvbXBhcmlzb24gPSAwOworCisgICAgbGFzdENvbXBhcmlzb24gPSBCb29sZWFuLnZhbHVlT2YoaXNfc2V0X2lkKCkpLmNvbXBhcmVUbyhvdGhlci5pc19zZXRfaWQoKSk7CisgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICB9CisgICAgaWYgKGlzX3NldF9pZCgpKSB7CisgICAgICBsYXN0Q29tcGFyaXNvbiA9IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvbXBhcmVUbyh0aGlzLmlkLCBvdGhlci5pZCk7CisgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICB9CisgICAgfQorICAgIGxhc3RDb21wYXJpc29uID0gQm9vbGVhbi52YWx1ZU9mKGlzX3NldF9kZXRhaWxzKCkpLmNvbXBhcmVUbyhvdGhlci5pc19zZXRfZGV0YWlscygpKTsKKyAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgIH0KKyAgICBpZiAoaXNfc2V0X2RldGFpbHMoKSkgeworICAgICAgbGFzdENvbXBhcmlzb24gPSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy5kZXRhaWxzLCBvdGhlci5kZXRhaWxzKTsKKyAgICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7CisgIH0KKworICBwdWJsaWMgX0ZpZWxkcyBmaWVsZEZvcklkKGludCBmaWVsZElkKSB7CisgICAgcmV0dXJuIF9GaWVsZHMuZmluZEJ5VGhyaWZ0SWQoZmllbGRJZCk7CisgIH0KKworICBwdWJsaWMgdm9pZCByZWFkKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBpcHJvdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgIHNjaGVtZXMuZ2V0KGlwcm90LmdldFNjaGVtZSgpKS5nZXRTY2hlbWUoKS5yZWFkKGlwcm90LCB0aGlzKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgIHNjaGVtZXMuZ2V0KG9wcm90LmdldFNjaGVtZSgpKS5nZXRTY2hlbWUoKS53cml0ZShvcHJvdCwgdGhpcyk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoIkhCUHVsc2UoIik7CisgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7CisKKyAgICBzYi5hcHBlbmQoImlkOiIpOworICAgIGlmICh0aGlzLmlkID09IG51bGwpIHsKKyAgICAgIHNiLmFwcGVuZCgibnVsbCIpOworICAgIH0gZWxzZSB7CisgICAgICBzYi5hcHBlbmQodGhpcy5pZCk7CisgICAgfQorICAgIGZpcnN0ID0gZmFsc2U7CisgICAgaWYgKCFmaXJzdCkgc2IuYXBwZW5kKCIsICIpOworICAgIHNiLmFwcGVuZCgiZGV0YWlsczoiKTsKKyAgICBpZiAodGhpcy5kZXRhaWxzID09IG51bGwpIHsKKyAgICAgIHNiLmFwcGVuZCgibnVsbCIpOworICAgIH0gZWxzZSB7CisgICAgICBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci50b1N0cmluZyh0aGlzLmRldGFpbHMsIHNiKTsKKyAgICB9CisgICAgZmlyc3QgPSBmYWxzZTsKKyAgICBzYi5hcHBlbmQoIikiKTsKKyAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgIC8vIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMKKyAgICBpZiAoIWlzX3NldF9pZCgpKSB7CisgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRXhjZXB0aW9uKCJSZXF1aXJlZCBmaWVsZCAnaWQnIGlzIHVuc2V0ISBTdHJ1Y3Q6IiArIHRvU3RyaW5nKCkpOworICAgIH0KKworICAgIC8vIGNoZWNrIGZvciBzdWItc3RydWN0IHZhbGlkaXR5CisgIH0KKworICBwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIHdyaXRlKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQ29tcGFjdFByb3RvY29sKG5ldyBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVElPU3RyZWFtVHJhbnNwb3J0KG91dCkpKTsKKyAgICB9IGNhdGNoIChvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHRlKSB7CisgICAgICB0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbih0ZSk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBpbikgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICByZWFkKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQ29tcGFjdFByb3RvY29sKG5ldyBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVElPU3RyZWFtVHJhbnNwb3J0KGluKSkpOworICAgIH0gY2F0Y2ggKG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24gdGUpIHsKKyAgICAgIHRocm93IG5ldyBqYXZhLmlvLklPRXhjZXB0aW9uKHRlKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBIQlB1bHNlU3RhbmRhcmRTY2hlbWVGYWN0b3J5IGltcGxlbWVudHMgU2NoZW1lRmFjdG9yeSB7CisgICAgcHVibGljIEhCUHVsc2VTdGFuZGFyZFNjaGVtZSBnZXRTY2hlbWUoKSB7CisgICAgICByZXR1cm4gbmV3IEhCUHVsc2VTdGFuZGFyZFNjaGVtZSgpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIEhCUHVsc2VTdGFuZGFyZFNjaGVtZSBleHRlbmRzIFN0YW5kYXJkU2NoZW1lPEhCUHVsc2U+IHsKKworICAgIHB1YmxpYyB2b2lkIHJlYWQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIGlwcm90LCBIQlB1bHNlIHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIHNjaGVtZUZpZWxkOworICAgICAgaXByb3QucmVhZFN0cnVjdEJlZ2luKCk7CisgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgIHsKKyAgICAgICAgc2NoZW1lRmllbGQgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpOworICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVE9QKSB7IAorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoc2NoZW1lRmllbGQuaWQpIHsKKyAgICAgICAgICBjYXNlIDE6IC8vIElECisgICAgICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcpIHsKKyAgICAgICAgICAgICAgc3RydWN0LmlkID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICAgICAgICBzdHJ1Y3Quc2V0X2lkX2lzU2V0KHRydWUpOworICAgICAgICAgICAgfSBlbHNlIHsgCisgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgc2NoZW1lRmllbGQudHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDI6IC8vIERFVEFJTFMKKyAgICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORykgeworICAgICAgICAgICAgICBzdHJ1Y3QuZGV0YWlscyA9IGlwcm90LnJlYWRCaW5hcnkoKTsKKyAgICAgICAgICAgICAgc3RydWN0LnNldF9kZXRhaWxzX2lzU2V0KHRydWUpOworICAgICAgICAgICAgfSBlbHNlIHsgCisgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgc2NoZW1lRmllbGQudHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKKyAgICAgICAgfQorICAgICAgICBpcHJvdC5yZWFkRmllbGRFbmQoKTsKKyAgICAgIH0KKyAgICAgIGlwcm90LnJlYWRTdHJ1Y3RFbmQoKTsKKyAgICAgIHN0cnVjdC52YWxpZGF0ZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBvcHJvdCwgSEJQdWxzZSBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgIHN0cnVjdC52YWxpZGF0ZSgpOworCisgICAgICBvcHJvdC53cml0ZVN0cnVjdEJlZ2luKFNUUlVDVF9ERVNDKTsKKyAgICAgIGlmIChzdHJ1Y3QuaWQgIT0gbnVsbCkgeworICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oSURfRklFTERfREVTQyk7CisgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKHN0cnVjdC5pZCk7CisgICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuZGV0YWlscyAhPSBudWxsKSB7CisgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihERVRBSUxTX0ZJRUxEX0RFU0MpOworICAgICAgICBvcHJvdC53cml0ZUJpbmFyeShzdHJ1Y3QuZGV0YWlscyk7CisgICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICAgIH0KKyAgICAgIG9wcm90LndyaXRlRmllbGRTdG9wKCk7CisgICAgICBvcHJvdC53cml0ZVN0cnVjdEVuZCgpOworICAgIH0KKworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSEJQdWxzZVR1cGxlU2NoZW1lRmFjdG9yeSBpbXBsZW1lbnRzIFNjaGVtZUZhY3RvcnkgeworICAgIHB1YmxpYyBIQlB1bHNlVHVwbGVTY2hlbWUgZ2V0U2NoZW1lKCkgeworICAgICAgcmV0dXJuIG5ldyBIQlB1bHNlVHVwbGVTY2hlbWUoKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBIQlB1bHNlVHVwbGVTY2hlbWUgZXh0ZW5kcyBUdXBsZVNjaGVtZTxIQlB1bHNlPiB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgcHJvdCwgSEJQdWxzZSBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgIFRUdXBsZVByb3RvY29sIG9wcm90ID0gKFRUdXBsZVByb3RvY29sKSBwcm90OworICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoc3RydWN0LmlkKTsKKyAgICAgIEJpdFNldCBvcHRpb25hbHMgPSBuZXcgQml0U2V0KCk7CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9kZXRhaWxzKCkpIHsKKyAgICAgICAgb3B0aW9uYWxzLnNldCgwKTsKKyAgICAgIH0KKyAgICAgIG9wcm90LndyaXRlQml0U2V0KG9wdGlvbmFscywgMSk7CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9kZXRhaWxzKCkpIHsKKyAgICAgICAgb3Byb3Qud3JpdGVCaW5hcnkoc3RydWN0LmRldGFpbHMpOworICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlYWQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIHByb3QsIEhCUHVsc2Ugc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICBUVHVwbGVQcm90b2NvbCBpcHJvdCA9IChUVHVwbGVQcm90b2NvbCkgcHJvdDsKKyAgICAgIHN0cnVjdC5pZCA9IGlwcm90LnJlYWRTdHJpbmcoKTsKKyAgICAgIHN0cnVjdC5zZXRfaWRfaXNTZXQodHJ1ZSk7CisgICAgICBCaXRTZXQgaW5jb21pbmcgPSBpcHJvdC5yZWFkQml0U2V0KDEpOworICAgICAgaWYgKGluY29taW5nLmdldCgwKSkgeworICAgICAgICBzdHJ1Y3QuZGV0YWlscyA9IGlwcm90LnJlYWRCaW5hcnkoKTsKKyAgICAgICAgc3RydWN0LnNldF9kZXRhaWxzX2lzU2V0KHRydWUpOworICAgICAgfQorICAgIH0KKyAgfQorCit9CisKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvSEJSZWNvcmRzLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL0hCUmVjb3Jkcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NjcwNjgKLS0tIC9kZXYvbnVsbAorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL0hCUmVjb3Jkcy5qYXZhCkBAIC0wLDAgKzEsNDY2IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLyoqCisgKiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjMpCisgKgorICogRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lORworICogIEBnZW5lcmF0ZWQKKyAqLworcGFja2FnZSBiYWNrdHlwZS5zdG9ybS5nZW5lcmF0ZWQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuSVNjaGVtZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuU2NoZW1lRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuU3RhbmRhcmRTY2hlbWU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuVHVwbGVTY2hlbWU7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR1cGxlUHJvdG9jb2w7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LkVuY29kaW5nVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5Bc3luY01ldGhvZENhbGxiYWNrOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci5BYnN0cmFjdE5vbmJsb2NraW5nU2VydmVyLio7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5FbnVtTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5CaXRTZXQ7CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiY2FzdCIsICJyYXd0eXBlcyIsICJzZXJpYWwiLCAidW5jaGVja2VkIn0pCitAR2VuZXJhdGVkKHZhbHVlID0gIkF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMykiKQorcHVibGljIGNsYXNzIEhCUmVjb3JkcyBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlPEhCUmVjb3JkcywgSEJSZWNvcmRzLl9GaWVsZHM+LCBqYXZhLmlvLlNlcmlhbGl6YWJsZSwgQ2xvbmVhYmxlLCBDb21wYXJhYmxlPEhCUmVjb3Jkcz4geworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0IFNUUlVDVF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QoIkhCUmVjb3JkcyIpOworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBQVUxTRVNfRklFTERfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQoInB1bHNlcyIsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkxJU1QsIChzaG9ydCkxKTsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8Q2xhc3M8PyBleHRlbmRzIElTY2hlbWU+LCBTY2hlbWVGYWN0b3J5PiBzY2hlbWVzID0gbmV3IEhhc2hNYXA8Q2xhc3M8PyBleHRlbmRzIElTY2hlbWU+LCBTY2hlbWVGYWN0b3J5PigpOworICBzdGF0aWMgeworICAgIHNjaGVtZXMucHV0KFN0YW5kYXJkU2NoZW1lLmNsYXNzLCBuZXcgSEJSZWNvcmRzU3RhbmRhcmRTY2hlbWVGYWN0b3J5KCkpOworICAgIHNjaGVtZXMucHV0KFR1cGxlU2NoZW1lLmNsYXNzLCBuZXcgSEJSZWNvcmRzVHVwbGVTY2hlbWVGYWN0b3J5KCkpOworICB9CisKKyAgcHJpdmF0ZSBMaXN0PEhCUHVsc2U+IHB1bHNlczsgLy8gcmVxdWlyZWQKKworICAvKiogVGhlIHNldCBvZiBmaWVsZHMgdGhpcyBzdHJ1Y3QgY29udGFpbnMsIGFsb25nIHdpdGggY29udmVuaWVuY2UgbWV0aG9kcyBmb3IgZmluZGluZyBhbmQgbWFuaXB1bGF0aW5nIHRoZW0uICovCisgIHB1YmxpYyBlbnVtIF9GaWVsZHMgaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRJZEVudW0geworICAgIFBVTFNFUygoc2hvcnQpMSwgInB1bHNlcyIpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgX0ZpZWxkcz4gYnlOYW1lID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBfRmllbGRzPigpOworCisgICAgc3RhdGljIHsKKyAgICAgIGZvciAoX0ZpZWxkcyBmaWVsZCA6IEVudW1TZXQuYWxsT2YoX0ZpZWxkcy5jbGFzcykpIHsKKyAgICAgICAgYnlOYW1lLnB1dChmaWVsZC5nZXRGaWVsZE5hbWUoKSwgZmllbGQpOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgdGhlIF9GaWVsZHMgY29uc3RhbnQgdGhhdCBtYXRjaGVzIGZpZWxkSWQsIG9yIG51bGwgaWYgaXRzIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIF9GaWVsZHMgZmluZEJ5VGhyaWZ0SWQoaW50IGZpZWxkSWQpIHsKKyAgICAgIHN3aXRjaChmaWVsZElkKSB7CisgICAgICAgIGNhc2UgMTogLy8gUFVMU0VTCisgICAgICAgICAgcmV0dXJuIFBVTFNFUzsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kIHRoZSBfRmllbGRzIGNvbnN0YW50IHRoYXQgbWF0Y2hlcyBmaWVsZElkLCB0aHJvd2luZyBhbiBleGNlcHRpb24KKyAgICAgKiBpZiBpdCBpcyBub3QgZm91bmQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBfRmllbGRzIGZpbmRCeVRocmlmdElkT3JUaHJvdyhpbnQgZmllbGRJZCkgeworICAgICAgX0ZpZWxkcyBmaWVsZHMgPSBmaW5kQnlUaHJpZnRJZChmaWVsZElkKTsKKyAgICAgIGlmIChmaWVsZHMgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRmllbGQgIiArIGZpZWxkSWQgKyAiIGRvZXNuJ3QgZXhpc3QhIik7CisgICAgICByZXR1cm4gZmllbGRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgdGhlIF9GaWVsZHMgY29uc3RhbnQgdGhhdCBtYXRjaGVzIG5hbWUsIG9yIG51bGwgaWYgaXRzIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIF9GaWVsZHMgZmluZEJ5TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgcmV0dXJuIGJ5TmFtZS5nZXQobmFtZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBzaG9ydCBfdGhyaWZ0SWQ7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX2ZpZWxkTmFtZTsKKworICAgIF9GaWVsZHMoc2hvcnQgdGhyaWZ0SWQsIFN0cmluZyBmaWVsZE5hbWUpIHsKKyAgICAgIF90aHJpZnRJZCA9IHRocmlmdElkOworICAgICAgX2ZpZWxkTmFtZSA9IGZpZWxkTmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc2hvcnQgZ2V0VGhyaWZ0RmllbGRJZCgpIHsKKyAgICAgIHJldHVybiBfdGhyaWZ0SWQ7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRGaWVsZE5hbWUoKSB7CisgICAgICByZXR1cm4gX2ZpZWxkTmFtZTsKKyAgICB9CisgIH0KKworICAvLyBpc3NldCBpZCBhc3NpZ25tZW50cworICBwdWJsaWMgc3RhdGljIGZpbmFsIE1hcDxfRmllbGRzLCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YT4gbWV0YURhdGFNYXA7CisgIHN0YXRpYyB7CisgICAgTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPiB0bXBNYXAgPSBuZXcgRW51bU1hcDxfRmllbGRzLCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YT4oX0ZpZWxkcy5jbGFzcyk7CisgICAgdG1wTWFwLnB1dChfRmllbGRzLlBVTFNFUywgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhKCJwdWxzZXMiLCBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRSZXF1aXJlbWVudFR5cGUuREVGQVVMVCwgCisgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuTGlzdE1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkxJU1QsIAorICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5TdHJ1Y3RNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIEhCUHVsc2UuY2xhc3MpKSkpOworICAgIG1ldGFEYXRhTWFwID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKHRtcE1hcCk7CisgICAgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEuYWRkU3RydWN0TWV0YURhdGFNYXAoSEJSZWNvcmRzLmNsYXNzLCBtZXRhRGF0YU1hcCk7CisgIH0KKworICBwdWJsaWMgSEJSZWNvcmRzKCkgeworICB9CisKKyAgcHVibGljIEhCUmVjb3JkcygKKyAgICBMaXN0PEhCUHVsc2U+IHB1bHNlcykKKyAgeworICAgIHRoaXMoKTsKKyAgICB0aGlzLnB1bHNlcyA9IHB1bHNlczsKKyAgfQorCisgIC8qKgorICAgKiBQZXJmb3JtcyBhIGRlZXAgY29weSBvbiA8aT5vdGhlcjwvaT4uCisgICAqLworICBwdWJsaWMgSEJSZWNvcmRzKEhCUmVjb3JkcyBvdGhlcikgeworICAgIGlmIChvdGhlci5pc19zZXRfcHVsc2VzKCkpIHsKKyAgICAgIExpc3Q8SEJQdWxzZT4gX190aGlzX19wdWxzZXMgPSBuZXcgQXJyYXlMaXN0PEhCUHVsc2U+KG90aGVyLnB1bHNlcy5zaXplKCkpOworICAgICAgZm9yIChIQlB1bHNlIG90aGVyX2VsZW1lbnQgOiBvdGhlci5wdWxzZXMpIHsKKyAgICAgICAgX190aGlzX19wdWxzZXMuYWRkKG5ldyBIQlB1bHNlKG90aGVyX2VsZW1lbnQpKTsKKyAgICAgIH0KKyAgICAgIHRoaXMucHVsc2VzID0gX190aGlzX19wdWxzZXM7CisgICAgfQorICB9CisKKyAgcHVibGljIEhCUmVjb3JkcyBkZWVwQ29weSgpIHsKKyAgICByZXR1cm4gbmV3IEhCUmVjb3Jkcyh0aGlzKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICB0aGlzLnB1bHNlcyA9IG51bGw7CisgIH0KKworICBwdWJsaWMgaW50IGdldF9wdWxzZXNfc2l6ZSgpIHsKKyAgICByZXR1cm4gKHRoaXMucHVsc2VzID09IG51bGwpID8gMCA6IHRoaXMucHVsc2VzLnNpemUoKTsKKyAgfQorCisgIHB1YmxpYyBqYXZhLnV0aWwuSXRlcmF0b3I8SEJQdWxzZT4gZ2V0X3B1bHNlc19pdGVyYXRvcigpIHsKKyAgICByZXR1cm4gKHRoaXMucHVsc2VzID09IG51bGwpID8gbnVsbCA6IHRoaXMucHVsc2VzLml0ZXJhdG9yKCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBhZGRfdG9fcHVsc2VzKEhCUHVsc2UgZWxlbSkgeworICAgIGlmICh0aGlzLnB1bHNlcyA9PSBudWxsKSB7CisgICAgICB0aGlzLnB1bHNlcyA9IG5ldyBBcnJheUxpc3Q8SEJQdWxzZT4oKTsKKyAgICB9CisgICAgdGhpcy5wdWxzZXMuYWRkKGVsZW0pOworICB9CisKKyAgcHVibGljIExpc3Q8SEJQdWxzZT4gZ2V0X3B1bHNlcygpIHsKKyAgICByZXR1cm4gdGhpcy5wdWxzZXM7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfcHVsc2VzKExpc3Q8SEJQdWxzZT4gcHVsc2VzKSB7CisgICAgdGhpcy5wdWxzZXMgPSBwdWxzZXM7CisgIH0KKworICBwdWJsaWMgdm9pZCB1bnNldF9wdWxzZXMoKSB7CisgICAgdGhpcy5wdWxzZXMgPSBudWxsOworICB9CisKKyAgLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBwdWxzZXMgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgIHB1YmxpYyBib29sZWFuIGlzX3NldF9wdWxzZXMoKSB7CisgICAgcmV0dXJuIHRoaXMucHVsc2VzICE9IG51bGw7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfcHVsc2VzX2lzU2V0KGJvb2xlYW4gdmFsdWUpIHsKKyAgICBpZiAoIXZhbHVlKSB7CisgICAgICB0aGlzLnB1bHNlcyA9IG51bGw7CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgc2V0RmllbGRWYWx1ZShfRmllbGRzIGZpZWxkLCBPYmplY3QgdmFsdWUpIHsKKyAgICBzd2l0Y2ggKGZpZWxkKSB7CisgICAgY2FzZSBQVUxTRVM6CisgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICB1bnNldF9wdWxzZXMoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNldF9wdWxzZXMoKExpc3Q8SEJQdWxzZT4pdmFsdWUpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICB9CisgIH0KKworICBwdWJsaWMgT2JqZWN0IGdldEZpZWxkVmFsdWUoX0ZpZWxkcyBmaWVsZCkgeworICAgIHN3aXRjaCAoZmllbGQpIHsKKyAgICBjYXNlIFBVTFNFUzoKKyAgICAgIHJldHVybiBnZXRfcHVsc2VzKCk7CisKKyAgICB9CisgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICB9CisKKyAgLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBjb3JyZXNwb25kaW5nIHRvIGZpZWxkSUQgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgIHB1YmxpYyBib29sZWFuIGlzU2V0KF9GaWVsZHMgZmllbGQpIHsKKyAgICBpZiAoZmllbGQgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHN3aXRjaCAoZmllbGQpIHsKKyAgICBjYXNlIFBVTFNFUzoKKyAgICAgIHJldHVybiBpc19zZXRfcHVsc2VzKCk7CisgICAgfQorICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IHRoYXQpIHsKKyAgICBpZiAodGhhdCA9PSBudWxsKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmICh0aGF0IGluc3RhbmNlb2YgSEJSZWNvcmRzKQorICAgICAgcmV0dXJuIHRoaXMuZXF1YWxzKChIQlJlY29yZHMpdGhhdCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gZXF1YWxzKEhCUmVjb3JkcyB0aGF0KSB7CisgICAgaWYgKHRoYXQgPT0gbnVsbCkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGJvb2xlYW4gdGhpc19wcmVzZW50X3B1bHNlcyA9IHRydWUgJiYgdGhpcy5pc19zZXRfcHVsc2VzKCk7CisgICAgYm9vbGVhbiB0aGF0X3ByZXNlbnRfcHVsc2VzID0gdHJ1ZSAmJiB0aGF0LmlzX3NldF9wdWxzZXMoKTsKKyAgICBpZiAodGhpc19wcmVzZW50X3B1bHNlcyB8fCB0aGF0X3ByZXNlbnRfcHVsc2VzKSB7CisgICAgICBpZiAoISh0aGlzX3ByZXNlbnRfcHVsc2VzICYmIHRoYXRfcHJlc2VudF9wdWxzZXMpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBpZiAoIXRoaXMucHVsc2VzLmVxdWFscyh0aGF0LnB1bHNlcykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgIExpc3Q8T2JqZWN0PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7CisKKyAgICBib29sZWFuIHByZXNlbnRfcHVsc2VzID0gdHJ1ZSAmJiAoaXNfc2V0X3B1bHNlcygpKTsKKyAgICBsaXN0LmFkZChwcmVzZW50X3B1bHNlcyk7CisgICAgaWYgKHByZXNlbnRfcHVsc2VzKQorICAgICAgbGlzdC5hZGQocHVsc2VzKTsKKworICAgIHJldHVybiBsaXN0Lmhhc2hDb2RlKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBjb21wYXJlVG8oSEJSZWNvcmRzIG90aGVyKSB7CisgICAgaWYgKCFnZXRDbGFzcygpLmVxdWFscyhvdGhlci5nZXRDbGFzcygpKSkgeworICAgICAgcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpLmNvbXBhcmVUbyhvdGhlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgfQorCisgICAgaW50IGxhc3RDb21wYXJpc29uID0gMDsKKworICAgIGxhc3RDb21wYXJpc29uID0gQm9vbGVhbi52YWx1ZU9mKGlzX3NldF9wdWxzZXMoKSkuY29tcGFyZVRvKG90aGVyLmlzX3NldF9wdWxzZXMoKSk7CisgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICB9CisgICAgaWYgKGlzX3NldF9wdWxzZXMoKSkgeworICAgICAgbGFzdENvbXBhcmlzb24gPSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy5wdWxzZXMsIG90aGVyLnB1bHNlcyk7CisgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworICB9CisKKyAgcHVibGljIF9GaWVsZHMgZmllbGRGb3JJZChpbnQgZmllbGRJZCkgeworICAgIHJldHVybiBfRmllbGRzLmZpbmRCeVRocmlmdElkKGZpZWxkSWQpOworICB9CisKKyAgcHVibGljIHZvaWQgcmVhZChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgaXByb3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICBzY2hlbWVzLmdldChpcHJvdC5nZXRTY2hlbWUoKSkuZ2V0U2NoZW1lKCkucmVhZChpcHJvdCwgdGhpcyk7CisgIH0KKworICBwdWJsaWMgdm9pZCB3cml0ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgb3Byb3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICBzY2hlbWVzLmdldChvcHJvdC5nZXRTY2hlbWUoKSkuZ2V0U2NoZW1lKCkud3JpdGUob3Byb3QsIHRoaXMpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCJIQlJlY29yZHMoIik7CisgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7CisKKyAgICBzYi5hcHBlbmQoInB1bHNlczoiKTsKKyAgICBpZiAodGhpcy5wdWxzZXMgPT0gbnVsbCkgeworICAgICAgc2IuYXBwZW5kKCJudWxsIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHNiLmFwcGVuZCh0aGlzLnB1bHNlcyk7CisgICAgfQorICAgIGZpcnN0ID0gZmFsc2U7CisgICAgc2IuYXBwZW5kKCIpIik7CisgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAvLyBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzCisgICAgLy8gY2hlY2sgZm9yIHN1Yi1zdHJ1Y3QgdmFsaWRpdHkKKyAgfQorCisgIHByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgd3JpdGUobmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRDb21wYWN0UHJvdG9jb2wobmV3IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5USU9TdHJlYW1UcmFuc3BvcnQob3V0KSkpOworICAgIH0gY2F0Y2ggKG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24gdGUpIHsKKyAgICAgIHRocm93IG5ldyBqYXZhLmlvLklPRXhjZXB0aW9uKHRlKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgcmVhZE9iamVjdChqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtIGluKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIHJlYWQobmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRDb21wYWN0UHJvdG9jb2wobmV3IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5USU9TdHJlYW1UcmFuc3BvcnQoaW4pKSk7CisgICAgfSBjYXRjaCAob3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB0ZSkgeworICAgICAgdGhyb3cgbmV3IGphdmEuaW8uSU9FeGNlcHRpb24odGUpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIEhCUmVjb3Jkc1N0YW5kYXJkU2NoZW1lRmFjdG9yeSBpbXBsZW1lbnRzIFNjaGVtZUZhY3RvcnkgeworICAgIHB1YmxpYyBIQlJlY29yZHNTdGFuZGFyZFNjaGVtZSBnZXRTY2hlbWUoKSB7CisgICAgICByZXR1cm4gbmV3IEhCUmVjb3Jkc1N0YW5kYXJkU2NoZW1lKCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSEJSZWNvcmRzU3RhbmRhcmRTY2hlbWUgZXh0ZW5kcyBTdGFuZGFyZFNjaGVtZTxIQlJlY29yZHM+IHsKKworICAgIHB1YmxpYyB2b2lkIHJlYWQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIGlwcm90LCBIQlJlY29yZHMgc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgc2NoZW1lRmllbGQ7CisgICAgICBpcHJvdC5yZWFkU3RydWN0QmVnaW4oKTsKKyAgICAgIHdoaWxlICh0cnVlKQorICAgICAgeworICAgICAgICBzY2hlbWVGaWVsZCA9IGlwcm90LnJlYWRGaWVsZEJlZ2luKCk7CisgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUT1ApIHsgCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChzY2hlbWVGaWVsZC5pZCkgeworICAgICAgICAgIGNhc2UgMTogLy8gUFVMU0VTCisgICAgICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5MSVNUKSB7CisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTGlzdCBfbGlzdDY5OCA9IGlwcm90LnJlYWRMaXN0QmVnaW4oKTsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QucHVsc2VzID0gbmV3IEFycmF5TGlzdDxIQlB1bHNlPihfbGlzdDY5OC5zaXplKTsKKyAgICAgICAgICAgICAgICBIQlB1bHNlIF9lbGVtNjk5OworICAgICAgICAgICAgICAgIGZvciAoaW50IF9pNzAwID0gMDsgX2k3MDAgPCBfbGlzdDY5OC5zaXplOyArK19pNzAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIF9lbGVtNjk5ID0gbmV3IEhCUHVsc2UoKTsKKyAgICAgICAgICAgICAgICAgIF9lbGVtNjk5LnJlYWQoaXByb3QpOworICAgICAgICAgICAgICAgICAgc3RydWN0LnB1bHNlcy5hZGQoX2VsZW02OTkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpcHJvdC5yZWFkTGlzdEVuZCgpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIHN0cnVjdC5zZXRfcHVsc2VzX2lzU2V0KHRydWUpOworICAgICAgICAgICAgfSBlbHNlIHsgCisgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgc2NoZW1lRmllbGQudHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKKyAgICAgICAgfQorICAgICAgICBpcHJvdC5yZWFkRmllbGRFbmQoKTsKKyAgICAgIH0KKyAgICAgIGlwcm90LnJlYWRTdHJ1Y3RFbmQoKTsKKyAgICAgIHN0cnVjdC52YWxpZGF0ZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBvcHJvdCwgSEJSZWNvcmRzIHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgc3RydWN0LnZhbGlkYXRlKCk7CisKKyAgICAgIG9wcm90LndyaXRlU3RydWN0QmVnaW4oU1RSVUNUX0RFU0MpOworICAgICAgaWYgKHN0cnVjdC5wdWxzZXMgIT0gbnVsbCkgeworICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oUFVMU0VTX0ZJRUxEX0RFU0MpOworICAgICAgICB7CisgICAgICAgICAgb3Byb3Qud3JpdGVMaXN0QmVnaW4obmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRMaXN0KG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCwgc3RydWN0LnB1bHNlcy5zaXplKCkpKTsKKyAgICAgICAgICBmb3IgKEhCUHVsc2UgX2l0ZXI3MDEgOiBzdHJ1Y3QucHVsc2VzKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIF9pdGVyNzAxLndyaXRlKG9wcm90KTsKKyAgICAgICAgICB9CisgICAgICAgICAgb3Byb3Qud3JpdGVMaXN0RW5kKCk7CisgICAgICAgIH0KKyAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgICAgfQorICAgICAgb3Byb3Qud3JpdGVGaWVsZFN0b3AoKTsKKyAgICAgIG9wcm90LndyaXRlU3RydWN0RW5kKCk7CisgICAgfQorCisgIH0KKworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBIQlJlY29yZHNUdXBsZVNjaGVtZUZhY3RvcnkgaW1wbGVtZW50cyBTY2hlbWVGYWN0b3J5IHsKKyAgICBwdWJsaWMgSEJSZWNvcmRzVHVwbGVTY2hlbWUgZ2V0U2NoZW1lKCkgeworICAgICAgcmV0dXJuIG5ldyBIQlJlY29yZHNUdXBsZVNjaGVtZSgpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIEhCUmVjb3Jkc1R1cGxlU2NoZW1lIGV4dGVuZHMgVHVwbGVTY2hlbWU8SEJSZWNvcmRzPiB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgcHJvdCwgSEJSZWNvcmRzIHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgVFR1cGxlUHJvdG9jb2wgb3Byb3QgPSAoVFR1cGxlUHJvdG9jb2wpIHByb3Q7CisgICAgICBCaXRTZXQgb3B0aW9uYWxzID0gbmV3IEJpdFNldCgpOworICAgICAgaWYgKHN0cnVjdC5pc19zZXRfcHVsc2VzKCkpIHsKKyAgICAgICAgb3B0aW9uYWxzLnNldCgwKTsKKyAgICAgIH0KKyAgICAgIG9wcm90LndyaXRlQml0U2V0KG9wdGlvbmFscywgMSk7CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9wdWxzZXMoKSkgeworICAgICAgICB7CisgICAgICAgICAgb3Byb3Qud3JpdGVJMzIoc3RydWN0LnB1bHNlcy5zaXplKCkpOworICAgICAgICAgIGZvciAoSEJQdWxzZSBfaXRlcjcwMiA6IHN0cnVjdC5wdWxzZXMpCisgICAgICAgICAgeworICAgICAgICAgICAgX2l0ZXI3MDIud3JpdGUob3Byb3QpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlYWQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIHByb3QsIEhCUmVjb3JkcyBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgIFRUdXBsZVByb3RvY29sIGlwcm90ID0gKFRUdXBsZVByb3RvY29sKSBwcm90OworICAgICAgQml0U2V0IGluY29taW5nID0gaXByb3QucmVhZEJpdFNldCgxKTsKKyAgICAgIGlmIChpbmNvbWluZy5nZXQoMCkpIHsKKyAgICAgICAgeworICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRMaXN0IF9saXN0NzAzID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRMaXN0KG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCwgaXByb3QucmVhZEkzMigpKTsKKyAgICAgICAgICBzdHJ1Y3QucHVsc2VzID0gbmV3IEFycmF5TGlzdDxIQlB1bHNlPihfbGlzdDcwMy5zaXplKTsKKyAgICAgICAgICBIQlB1bHNlIF9lbGVtNzA0OworICAgICAgICAgIGZvciAoaW50IF9pNzA1ID0gMDsgX2k3MDUgPCBfbGlzdDcwMy5zaXplOyArK19pNzA1KQorICAgICAgICAgIHsKKyAgICAgICAgICAgIF9lbGVtNzA0ID0gbmV3IEhCUHVsc2UoKTsKKyAgICAgICAgICAgIF9lbGVtNzA0LnJlYWQoaXByb3QpOworICAgICAgICAgICAgc3RydWN0LnB1bHNlcy5hZGQoX2VsZW03MDQpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdHJ1Y3Quc2V0X3B1bHNlc19pc1NldCh0cnVlKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworfQorCmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL0hCU2VydmVyTWVzc2FnZVR5cGUuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvSEJTZXJ2ZXJNZXNzYWdlVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjYWZjMTQKLS0tIC9kZXYvbnVsbAorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL0hCU2VydmVyTWVzc2FnZVR5cGUuamF2YQpAQCAtMCwwICsxLDExMyBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8qKgorICogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4zKQorICoKKyAqIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkcKKyAqICBAZ2VuZXJhdGVkCisgKi8KK3BhY2thZ2UgYmFja3R5cGUuc3Rvcm0uZ2VuZXJhdGVkOworCisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFbnVtOworCitwdWJsaWMgZW51bSBIQlNlcnZlck1lc3NhZ2VUeXBlIGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVEVudW0geworICBDUkVBVEVfUEFUSCgwKSwKKyAgQ1JFQVRFX1BBVEhfUkVTUE9OU0UoMSksCisgIEVYSVNUUygyKSwKKyAgRVhJU1RTX1JFU1BPTlNFKDMpLAorICBTRU5EX1BVTFNFKDQpLAorICBTRU5EX1BVTFNFX1JFU1BPTlNFKDUpLAorICBHRVRfQUxMX1BVTFNFX0ZPUl9QQVRIKDYpLAorICBHRVRfQUxMX1BVTFNFX0ZPUl9QQVRIX1JFU1BPTlNFKDcpLAorICBHRVRfQUxMX05PREVTX0ZPUl9QQVRIKDgpLAorICBHRVRfQUxMX05PREVTX0ZPUl9QQVRIX1JFU1BPTlNFKDkpLAorICBHRVRfUFVMU0UoMTApLAorICBHRVRfUFVMU0VfUkVTUE9OU0UoMTEpLAorICBERUxFVEVfUEFUSCgxMiksCisgIERFTEVURV9QQVRIX1JFU1BPTlNFKDEzKSwKKyAgREVMRVRFX1BVTFNFX0lEKDE0KSwKKyAgREVMRVRFX1BVTFNFX0lEX1JFU1BPTlNFKDE1KSwKKyAgQ09OVFJPTF9NRVNTQUdFKDE2KSwKKyAgU0FTTF9NRVNTQUdFX1RPS0VOKDE3KSwKKyAgTk9UX0FVVEhPUklaRUQoMTgpOworCisgIHByaXZhdGUgZmluYWwgaW50IHZhbHVlOworCisgIHByaXZhdGUgSEJTZXJ2ZXJNZXNzYWdlVHlwZShpbnQgdmFsdWUpIHsKKyAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgIH0KKworICAvKioKKyAgICogR2V0IHRoZSBpbnRlZ2VyIHZhbHVlIG9mIHRoaXMgZW51bSB2YWx1ZSwgYXMgZGVmaW5lZCBpbiB0aGUgVGhyaWZ0IElETC4KKyAgICovCisgIHB1YmxpYyBpbnQgZ2V0VmFsdWUoKSB7CisgICAgcmV0dXJuIHZhbHVlOworICB9CisKKyAgLyoqCisgICAqIEZpbmQgYSB0aGUgZW51bSB0eXBlIGJ5IGl0cyBpbnRlZ2VyIHZhbHVlLCBhcyBkZWZpbmVkIGluIHRoZSBUaHJpZnQgSURMLgorICAgKiBAcmV0dXJuIG51bGwgaWYgdGhlIHZhbHVlIGlzIG5vdCBmb3VuZC4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgSEJTZXJ2ZXJNZXNzYWdlVHlwZSBmaW5kQnlWYWx1ZShpbnQgdmFsdWUpIHsgCisgICAgc3dpdGNoICh2YWx1ZSkgeworICAgICAgY2FzZSAwOgorICAgICAgICByZXR1cm4gQ1JFQVRFX1BBVEg7CisgICAgICBjYXNlIDE6CisgICAgICAgIHJldHVybiBDUkVBVEVfUEFUSF9SRVNQT05TRTsKKyAgICAgIGNhc2UgMjoKKyAgICAgICAgcmV0dXJuIEVYSVNUUzsKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgcmV0dXJuIEVYSVNUU19SRVNQT05TRTsKKyAgICAgIGNhc2UgNDoKKyAgICAgICAgcmV0dXJuIFNFTkRfUFVMU0U7CisgICAgICBjYXNlIDU6CisgICAgICAgIHJldHVybiBTRU5EX1BVTFNFX1JFU1BPTlNFOworICAgICAgY2FzZSA2OgorICAgICAgICByZXR1cm4gR0VUX0FMTF9QVUxTRV9GT1JfUEFUSDsKKyAgICAgIGNhc2UgNzoKKyAgICAgICAgcmV0dXJuIEdFVF9BTExfUFVMU0VfRk9SX1BBVEhfUkVTUE9OU0U7CisgICAgICBjYXNlIDg6CisgICAgICAgIHJldHVybiBHRVRfQUxMX05PREVTX0ZPUl9QQVRIOworICAgICAgY2FzZSA5OgorICAgICAgICByZXR1cm4gR0VUX0FMTF9OT0RFU19GT1JfUEFUSF9SRVNQT05TRTsKKyAgICAgIGNhc2UgMTA6CisgICAgICAgIHJldHVybiBHRVRfUFVMU0U7CisgICAgICBjYXNlIDExOgorICAgICAgICByZXR1cm4gR0VUX1BVTFNFX1JFU1BPTlNFOworICAgICAgY2FzZSAxMjoKKyAgICAgICAgcmV0dXJuIERFTEVURV9QQVRIOworICAgICAgY2FzZSAxMzoKKyAgICAgICAgcmV0dXJuIERFTEVURV9QQVRIX1JFU1BPTlNFOworICAgICAgY2FzZSAxNDoKKyAgICAgICAgcmV0dXJuIERFTEVURV9QVUxTRV9JRDsKKyAgICAgIGNhc2UgMTU6CisgICAgICAgIHJldHVybiBERUxFVEVfUFVMU0VfSURfUkVTUE9OU0U7CisgICAgICBjYXNlIDE2OgorICAgICAgICByZXR1cm4gQ09OVFJPTF9NRVNTQUdFOworICAgICAgY2FzZSAxNzoKKyAgICAgICAgcmV0dXJuIFNBU0xfTUVTU0FHRV9UT0tFTjsKKyAgICAgIGNhc2UgMTg6CisgICAgICAgIHJldHVybiBOT1RfQVVUSE9SSVpFRDsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9JbnZhbGlkVG9wb2xvZ3lFeGNlcHRpb24uamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvSW52YWxpZFRvcG9sb2d5RXhjZXB0aW9uLmphdmEKaW5kZXggNWE5ODQxOC4uOTM0YTBiZiAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9JbnZhbGlkVG9wb2xvZ3lFeGNlcHRpb24uamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL0ludmFsaWRUb3BvbG9neUV4Y2VwdGlvbi5qYXZhCkBAIC0xNiw3ICsxNiw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogLyoqCi0gKiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjIpCisgKiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjMpCiAgKgogICogRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lORwogICogIEBnZW5lcmF0ZWQKQEAgLTUxLDcgKzUxLDcgQEAKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAogQFN1cHByZXNzV2FybmluZ3MoeyJjYXN0IiwgInJhd3R5cGVzIiwgInNlcmlhbCIsICJ1bmNoZWNrZWQifSkKLUBHZW5lcmF0ZWQodmFsdWUgPSAiQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4yKSIsIGRhdGUgPSAiMjAxNS0yLTYiKQorQEdlbmVyYXRlZCh2YWx1ZSA9ICJBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjMpIikKIHB1YmxpYyBjbGFzcyBJbnZhbGlkVG9wb2xvZ3lFeGNlcHRpb24gZXh0ZW5kcyBURXhjZXB0aW9uIGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2U8SW52YWxpZFRvcG9sb2d5RXhjZXB0aW9uLCBJbnZhbGlkVG9wb2xvZ3lFeGNlcHRpb24uX0ZpZWxkcz4sIGphdmEuaW8uU2VyaWFsaXphYmxlLCBDbG9uZWFibGUsIENvbXBhcmFibGU8SW52YWxpZFRvcG9sb2d5RXhjZXB0aW9uPiB7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QgU1RSVUNUX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdCgiSW52YWxpZFRvcG9sb2d5RXhjZXB0aW9uIik7CiAKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvSmF2YU9iamVjdC5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9KYXZhT2JqZWN0LmphdmEKaW5kZXggZmRlMDA4Mi4uZGRkZTU5NCAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9KYXZhT2JqZWN0LmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9KYXZhT2JqZWN0LmphdmEKQEAgLTE2LDcgKzE2LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAvKioKLSAqIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMikKKyAqIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMykKICAqCiAgKiBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HCiAgKiAgQGdlbmVyYXRlZApAQCAtNTEsNyArNTEsNyBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCiBAU3VwcHJlc3NXYXJuaW5ncyh7ImNhc3QiLCAicmF3dHlwZXMiLCAic2VyaWFsIiwgInVuY2hlY2tlZCJ9KQotQEdlbmVyYXRlZCh2YWx1ZSA9ICJBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjIpIiwgZGF0ZSA9ICIyMDE1LTItNiIpCitAR2VuZXJhdGVkKHZhbHVlID0gIkF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMykiKQogcHVibGljIGNsYXNzIEphdmFPYmplY3QgaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZTxKYXZhT2JqZWN0LCBKYXZhT2JqZWN0Ll9GaWVsZHM+LCBqYXZhLmlvLlNlcmlhbGl6YWJsZSwgQ2xvbmVhYmxlLCBDb21wYXJhYmxlPEphdmFPYmplY3Q+IHsKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdCBTVFJVQ1RfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0KCJKYXZhT2JqZWN0Iik7CiAKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvSmF2YU9iamVjdEFyZy5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9KYXZhT2JqZWN0QXJnLmphdmEKaW5kZXggZTY5YmQzNC4uNDdkMGVhZiAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9KYXZhT2JqZWN0QXJnLmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9KYXZhT2JqZWN0QXJnLmphdmEKQEAgLTE2LDcgKzE2LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAvKioKLSAqIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMikKKyAqIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMykKICAqCiAgKiBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HCiAgKiAgQGdlbmVyYXRlZApkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9LaWxsT3B0aW9ucy5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9LaWxsT3B0aW9ucy5qYXZhCmluZGV4IGYxNzMzOTUuLmYzODZlYzEgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvS2lsbE9wdGlvbnMuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL0tpbGxPcHRpb25zLmphdmEKQEAgLTE2LDcgKzE2LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAvKioKLSAqIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMikKKyAqIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMykKICAqCiAgKiBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HCiAgKiAgQGdlbmVyYXRlZApAQCAtNTEsNyArNTEsNyBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCiBAU3VwcHJlc3NXYXJuaW5ncyh7ImNhc3QiLCAicmF3dHlwZXMiLCAic2VyaWFsIiwgInVuY2hlY2tlZCJ9KQotQEdlbmVyYXRlZCh2YWx1ZSA9ICJBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjIpIiwgZGF0ZSA9ICIyMDE1LTItNiIpCitAR2VuZXJhdGVkKHZhbHVlID0gIkF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMykiKQogcHVibGljIGNsYXNzIEtpbGxPcHRpb25zIGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2U8S2lsbE9wdGlvbnMsIEtpbGxPcHRpb25zLl9GaWVsZHM+LCBqYXZhLmlvLlNlcmlhbGl6YWJsZSwgQ2xvbmVhYmxlLCBDb21wYXJhYmxlPEtpbGxPcHRpb25zPiB7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QgU1RSVUNUX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdCgiS2lsbE9wdGlvbnMiKTsKIApAQCAtMTk1LDcgKzE5NSw3IEBACiAgIHB1YmxpYyBPYmplY3QgZ2V0RmllbGRWYWx1ZShfRmllbGRzIGZpZWxkKSB7CiAgICAgc3dpdGNoIChmaWVsZCkgewogICAgIGNhc2UgV0FJVF9TRUNTOgotICAgICAgcmV0dXJuIEludGVnZXIudmFsdWVPZihnZXRfd2FpdF9zZWNzKCkpOworICAgICAgcmV0dXJuIGdldF93YWl0X3NlY3MoKTsKIAogICAgIH0KICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL0xTQXBwcm92ZWRXb3JrZXJzLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL0xTQXBwcm92ZWRXb3JrZXJzLmphdmEKaW5kZXggZmQ5NzQwYi4uMjBmMGQxMCAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9MU0FwcHJvdmVkV29ya2Vycy5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvTFNBcHByb3ZlZFdvcmtlcnMuamF2YQpAQCAtMTYsNyArMTYsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIC8qKgotICogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4yKQorICogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4zKQogICoKICAqIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkcKICAqICBAZ2VuZXJhdGVkCkBAIC01MSw3ICs1MSw3IEBACiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKIEBTdXBwcmVzc1dhcm5pbmdzKHsiY2FzdCIsICJyYXd0eXBlcyIsICJzZXJpYWwiLCAidW5jaGVja2VkIn0pCi1AR2VuZXJhdGVkKHZhbHVlID0gIkF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMikiLCBkYXRlID0gIjIwMTUtOS0zIikKK0BHZW5lcmF0ZWQodmFsdWUgPSAiQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4zKSIpCiBwdWJsaWMgY2xhc3MgTFNBcHByb3ZlZFdvcmtlcnMgaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZTxMU0FwcHJvdmVkV29ya2VycywgTFNBcHByb3ZlZFdvcmtlcnMuX0ZpZWxkcz4sIGphdmEuaW8uU2VyaWFsaXphYmxlLCBDbG9uZWFibGUsIENvbXBhcmFibGU8TFNBcHByb3ZlZFdvcmtlcnM+IHsKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdCBTVFJVQ1RfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0KCJMU0FwcHJvdmVkV29ya2VycyIpOwogCkBAIC0zNjUsMTUgKzM2NSwxNSBAQAogICAgICAgICAgIGNhc2UgMTogLy8gQVBQUk9WRURfV09SS0VSUwogICAgICAgICAgICAgaWYgKHNjaGVtZUZpZWxkLnR5cGUgPT0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTUFQKSB7CiAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwIF9tYXA0ODIgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKTsKLSAgICAgICAgICAgICAgICBzdHJ1Y3QuYXBwcm92ZWRfd29ya2VycyA9IG5ldyBIYXNoTWFwPFN0cmluZyxJbnRlZ2VyPigyKl9tYXA0ODIuc2l6ZSk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIF9rZXk0ODM7Ci0gICAgICAgICAgICAgICAgaW50IF92YWw0ODQ7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgX2k0ODUgPSAwOyBfaTQ4NSA8IF9tYXA0ODIuc2l6ZTsgKytfaTQ4NSkKKyAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwIF9tYXA2MzYgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKTsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QuYXBwcm92ZWRfd29ya2VycyA9IG5ldyBIYXNoTWFwPFN0cmluZyxJbnRlZ2VyPigyKl9tYXA2MzYuc2l6ZSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIF9rZXk2Mzc7CisgICAgICAgICAgICAgICAgaW50IF92YWw2Mzg7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgX2k2MzkgPSAwOyBfaTYzOSA8IF9tYXA2MzYuc2l6ZTsgKytfaTYzOSkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBfa2V5NDgzID0gaXByb3QucmVhZFN0cmluZygpOwotICAgICAgICAgICAgICAgICAgX3ZhbDQ4NCA9IGlwcm90LnJlYWRJMzIoKTsKLSAgICAgICAgICAgICAgICAgIHN0cnVjdC5hcHByb3ZlZF93b3JrZXJzLnB1dChfa2V5NDgzLCBfdmFsNDg0KTsKKyAgICAgICAgICAgICAgICAgIF9rZXk2MzcgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICBfdmFsNjM4ID0gaXByb3QucmVhZEkzMigpOworICAgICAgICAgICAgICAgICAgc3RydWN0LmFwcHJvdmVkX3dvcmtlcnMucHV0KF9rZXk2MzcsIF92YWw2MzgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpcHJvdC5yZWFkTWFwRW5kKCk7CiAgICAgICAgICAgICAgIH0KQEAgLTM5OSwxMCArMzk5LDEwIEBACiAgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihBUFBST1ZFRF9XT1JLRVJTX0ZJRUxEX0RFU0MpOwogICAgICAgICB7CiAgICAgICAgICAgb3Byb3Qud3JpdGVNYXBCZWdpbihuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkkzMiwgc3RydWN0LmFwcHJvdmVkX3dvcmtlcnMuc2l6ZSgpKSk7Ci0gICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBJbnRlZ2VyPiBfaXRlcjQ4NiA6IHN0cnVjdC5hcHByb3ZlZF93b3JrZXJzLmVudHJ5U2V0KCkpCisgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBJbnRlZ2VyPiBfaXRlcjY0MCA6IHN0cnVjdC5hcHByb3ZlZF93b3JrZXJzLmVudHJ5U2V0KCkpCiAgICAgICAgICAgewotICAgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoX2l0ZXI0ODYuZ2V0S2V5KCkpOwotICAgICAgICAgICAgb3Byb3Qud3JpdGVJMzIoX2l0ZXI0ODYuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhfaXRlcjY0MC5nZXRLZXkoKSk7CisgICAgICAgICAgICBvcHJvdC53cml0ZUkzMihfaXRlcjY0MC5nZXRWYWx1ZSgpKTsKICAgICAgICAgICB9CiAgICAgICAgICAgb3Byb3Qud3JpdGVNYXBFbmQoKTsKICAgICAgICAgfQpAQCAtNDI3LDEwICs0MjcsMTAgQEAKICAgICAgIFRUdXBsZVByb3RvY29sIG9wcm90ID0gKFRUdXBsZVByb3RvY29sKSBwcm90OwogICAgICAgewogICAgICAgICBvcHJvdC53cml0ZUkzMihzdHJ1Y3QuYXBwcm92ZWRfd29ya2Vycy5zaXplKCkpOwotICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIEludGVnZXI+IF9pdGVyNDg3IDogc3RydWN0LmFwcHJvdmVkX3dvcmtlcnMuZW50cnlTZXQoKSkKKyAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBJbnRlZ2VyPiBfaXRlcjY0MSA6IHN0cnVjdC5hcHByb3ZlZF93b3JrZXJzLmVudHJ5U2V0KCkpCiAgICAgICAgIHsKLSAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhfaXRlcjQ4Ny5nZXRLZXkoKSk7Ci0gICAgICAgICAgb3Byb3Qud3JpdGVJMzIoX2l0ZXI0ODcuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoX2l0ZXI2NDEuZ2V0S2V5KCkpOworICAgICAgICAgIG9wcm90LndyaXRlSTMyKF9pdGVyNjQxLmdldFZhbHVlKCkpOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQpAQCAtNDM5LDE1ICs0MzksMTUgQEAKICAgICBwdWJsaWMgdm9pZCByZWFkKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBwcm90LCBMU0FwcHJvdmVkV29ya2VycyBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKICAgICAgIFRUdXBsZVByb3RvY29sIGlwcm90ID0gKFRUdXBsZVByb3RvY29sKSBwcm90OwogICAgICAgewotICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwIF9tYXA0ODggPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkkzMiwgaXByb3QucmVhZEkzMigpKTsKLSAgICAgICAgc3RydWN0LmFwcHJvdmVkX3dvcmtlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsSW50ZWdlcj4oMipfbWFwNDg4LnNpemUpOwotICAgICAgICBTdHJpbmcgX2tleTQ4OTsKLSAgICAgICAgaW50IF92YWw0OTA7Ci0gICAgICAgIGZvciAoaW50IF9pNDkxID0gMDsgX2k0OTEgPCBfbWFwNDg4LnNpemU7ICsrX2k0OTEpCisgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgX21hcDY0MiA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORywgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTMyLCBpcHJvdC5yZWFkSTMyKCkpOworICAgICAgICBzdHJ1Y3QuYXBwcm92ZWRfd29ya2VycyA9IG5ldyBIYXNoTWFwPFN0cmluZyxJbnRlZ2VyPigyKl9tYXA2NDIuc2l6ZSk7CisgICAgICAgIFN0cmluZyBfa2V5NjQzOworICAgICAgICBpbnQgX3ZhbDY0NDsKKyAgICAgICAgZm9yIChpbnQgX2k2NDUgPSAwOyBfaTY0NSA8IF9tYXA2NDIuc2l6ZTsgKytfaTY0NSkKICAgICAgICAgewotICAgICAgICAgIF9rZXk0ODkgPSBpcHJvdC5yZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgX3ZhbDQ5MCA9IGlwcm90LnJlYWRJMzIoKTsKLSAgICAgICAgICBzdHJ1Y3QuYXBwcm92ZWRfd29ya2Vycy5wdXQoX2tleTQ4OSwgX3ZhbDQ5MCk7CisgICAgICAgICAgX2tleTY0MyA9IGlwcm90LnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICBfdmFsNjQ0ID0gaXByb3QucmVhZEkzMigpOworICAgICAgICAgIHN0cnVjdC5hcHByb3ZlZF93b3JrZXJzLnB1dChfa2V5NjQzLCBfdmFsNjQ0KTsKICAgICAgICAgfQogICAgICAgfQogICAgICAgc3RydWN0LnNldF9hcHByb3ZlZF93b3JrZXJzX2lzU2V0KHRydWUpOwpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9MU1N1cGVydmlzb3JBc3NpZ25tZW50cy5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9MU1N1cGVydmlzb3JBc3NpZ25tZW50cy5qYXZhCmluZGV4IDFkODVjZWMuLmRlNGM4MDMgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvTFNTdXBlcnZpc29yQXNzaWdubWVudHMuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL0xTU3VwZXJ2aXNvckFzc2lnbm1lbnRzLmphdmEKQEAgLTE2LDcgKzE2LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAvKioKLSAqIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMikKKyAqIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMykKICAqCiAgKiBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HCiAgKiAgQGdlbmVyYXRlZApAQCAtNTEsNyArNTEsNyBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCiBAU3VwcHJlc3NXYXJuaW5ncyh7ImNhc3QiLCAicmF3dHlwZXMiLCAic2VyaWFsIiwgInVuY2hlY2tlZCJ9KQotQEdlbmVyYXRlZCh2YWx1ZSA9ICJBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjIpIiwgZGF0ZSA9ICIyMDE1LTktMyIpCitAR2VuZXJhdGVkKHZhbHVlID0gIkF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMykiKQogcHVibGljIGNsYXNzIExTU3VwZXJ2aXNvckFzc2lnbm1lbnRzIGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2U8TFNTdXBlcnZpc29yQXNzaWdubWVudHMsIExTU3VwZXJ2aXNvckFzc2lnbm1lbnRzLl9GaWVsZHM+LCBqYXZhLmlvLlNlcmlhbGl6YWJsZSwgQ2xvbmVhYmxlLCBDb21wYXJhYmxlPExTU3VwZXJ2aXNvckFzc2lnbm1lbnRzPiB7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QgU1RSVUNUX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdCgiTFNTdXBlcnZpc29yQXNzaWdubWVudHMiKTsKIApAQCAtMzc2LDE2ICszNzYsMTYgQEAKICAgICAgICAgICBjYXNlIDE6IC8vIEFTU0lHTk1FTlRTCiAgICAgICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5NQVApIHsKICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgX21hcDQ5MiA9IGlwcm90LnJlYWRNYXBCZWdpbigpOwotICAgICAgICAgICAgICAgIHN0cnVjdC5hc3NpZ25tZW50cyA9IG5ldyBIYXNoTWFwPEludGVnZXIsTG9jYWxBc3NpZ25tZW50PigyKl9tYXA0OTIuc2l6ZSk7Ci0gICAgICAgICAgICAgICAgaW50IF9rZXk0OTM7Ci0gICAgICAgICAgICAgICAgTG9jYWxBc3NpZ25tZW50IF92YWw0OTQ7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgX2k0OTUgPSAwOyBfaTQ5NSA8IF9tYXA0OTIuc2l6ZTsgKytfaTQ5NSkKKyAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwIF9tYXA2NDYgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKTsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QuYXNzaWdubWVudHMgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLExvY2FsQXNzaWdubWVudD4oMipfbWFwNjQ2LnNpemUpOworICAgICAgICAgICAgICAgIGludCBfa2V5NjQ3OworICAgICAgICAgICAgICAgIExvY2FsQXNzaWdubWVudCBfdmFsNjQ4OworICAgICAgICAgICAgICAgIGZvciAoaW50IF9pNjQ5ID0gMDsgX2k2NDkgPCBfbWFwNjQ2LnNpemU7ICsrX2k2NDkpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgX2tleTQ5MyA9IGlwcm90LnJlYWRJMzIoKTsKLSAgICAgICAgICAgICAgICAgIF92YWw0OTQgPSBuZXcgTG9jYWxBc3NpZ25tZW50KCk7Ci0gICAgICAgICAgICAgICAgICBfdmFsNDk0LnJlYWQoaXByb3QpOwotICAgICAgICAgICAgICAgICAgc3RydWN0LmFzc2lnbm1lbnRzLnB1dChfa2V5NDkzLCBfdmFsNDk0KTsKKyAgICAgICAgICAgICAgICAgIF9rZXk2NDcgPSBpcHJvdC5yZWFkSTMyKCk7CisgICAgICAgICAgICAgICAgICBfdmFsNjQ4ID0gbmV3IExvY2FsQXNzaWdubWVudCgpOworICAgICAgICAgICAgICAgICAgX3ZhbDY0OC5yZWFkKGlwcm90KTsKKyAgICAgICAgICAgICAgICAgIHN0cnVjdC5hc3NpZ25tZW50cy5wdXQoX2tleTY0NywgX3ZhbDY0OCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlwcm90LnJlYWRNYXBFbmQoKTsKICAgICAgICAgICAgICAgfQpAQCAtNDExLDEwICs0MTEsMTAgQEAKICAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKEFTU0lHTk1FTlRTX0ZJRUxEX0RFU0MpOwogICAgICAgICB7CiAgICAgICAgICAgb3Byb3Qud3JpdGVNYXBCZWdpbihuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JMzIsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCwgc3RydWN0LmFzc2lnbm1lbnRzLnNpemUoKSkpOwotICAgICAgICAgIGZvciAoTWFwLkVudHJ5PEludGVnZXIsIExvY2FsQXNzaWdubWVudD4gX2l0ZXI0OTYgOiBzdHJ1Y3QuYXNzaWdubWVudHMuZW50cnlTZXQoKSkKKyAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxJbnRlZ2VyLCBMb2NhbEFzc2lnbm1lbnQ+IF9pdGVyNjUwIDogc3RydWN0LmFzc2lnbm1lbnRzLmVudHJ5U2V0KCkpCiAgICAgICAgICAgewotICAgICAgICAgICAgb3Byb3Qud3JpdGVJMzIoX2l0ZXI0OTYuZ2V0S2V5KCkpOwotICAgICAgICAgICAgX2l0ZXI0OTYuZ2V0VmFsdWUoKS53cml0ZShvcHJvdCk7CisgICAgICAgICAgICBvcHJvdC53cml0ZUkzMihfaXRlcjY1MC5nZXRLZXkoKSk7CisgICAgICAgICAgICBfaXRlcjY1MC5nZXRWYWx1ZSgpLndyaXRlKG9wcm90KTsKICAgICAgICAgICB9CiAgICAgICAgICAgb3Byb3Qud3JpdGVNYXBFbmQoKTsKICAgICAgICAgfQpAQCAtNDM5LDEwICs0MzksMTAgQEAKICAgICAgIFRUdXBsZVByb3RvY29sIG9wcm90ID0gKFRUdXBsZVByb3RvY29sKSBwcm90OwogICAgICAgewogICAgICAgICBvcHJvdC53cml0ZUkzMihzdHJ1Y3QuYXNzaWdubWVudHMuc2l6ZSgpKTsKLSAgICAgICAgZm9yIChNYXAuRW50cnk8SW50ZWdlciwgTG9jYWxBc3NpZ25tZW50PiBfaXRlcjQ5NyA6IHN0cnVjdC5hc3NpZ25tZW50cy5lbnRyeVNldCgpKQorICAgICAgICBmb3IgKE1hcC5FbnRyeTxJbnRlZ2VyLCBMb2NhbEFzc2lnbm1lbnQ+IF9pdGVyNjUxIDogc3RydWN0LmFzc2lnbm1lbnRzLmVudHJ5U2V0KCkpCiAgICAgICAgIHsKLSAgICAgICAgICBvcHJvdC53cml0ZUkzMihfaXRlcjQ5Ny5nZXRLZXkoKSk7Ci0gICAgICAgICAgX2l0ZXI0OTcuZ2V0VmFsdWUoKS53cml0ZShvcHJvdCk7CisgICAgICAgICAgb3Byb3Qud3JpdGVJMzIoX2l0ZXI2NTEuZ2V0S2V5KCkpOworICAgICAgICAgIF9pdGVyNjUxLmdldFZhbHVlKCkud3JpdGUob3Byb3QpOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQpAQCAtNDUxLDE2ICs0NTEsMTYgQEAKICAgICBwdWJsaWMgdm9pZCByZWFkKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBwcm90LCBMU1N1cGVydmlzb3JBc3NpZ25tZW50cyBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKICAgICAgIFRUdXBsZVByb3RvY29sIGlwcm90ID0gKFRUdXBsZVByb3RvY29sKSBwcm90OwogICAgICAgewotICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwIF9tYXA0OTggPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JMzIsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCwgaXByb3QucmVhZEkzMigpKTsKLSAgICAgICAgc3RydWN0LmFzc2lnbm1lbnRzID0gbmV3IEhhc2hNYXA8SW50ZWdlcixMb2NhbEFzc2lnbm1lbnQ+KDIqX21hcDQ5OC5zaXplKTsKLSAgICAgICAgaW50IF9rZXk0OTk7Ci0gICAgICAgIExvY2FsQXNzaWdubWVudCBfdmFsNTAwOwotICAgICAgICBmb3IgKGludCBfaTUwMSA9IDA7IF9pNTAxIDwgX21hcDQ5OC5zaXplOyArK19pNTAxKQorICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwIF9tYXA2NTIgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JMzIsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCwgaXByb3QucmVhZEkzMigpKTsKKyAgICAgICAgc3RydWN0LmFzc2lnbm1lbnRzID0gbmV3IEhhc2hNYXA8SW50ZWdlcixMb2NhbEFzc2lnbm1lbnQ+KDIqX21hcDY1Mi5zaXplKTsKKyAgICAgICAgaW50IF9rZXk2NTM7CisgICAgICAgIExvY2FsQXNzaWdubWVudCBfdmFsNjU0OworICAgICAgICBmb3IgKGludCBfaTY1NSA9IDA7IF9pNjU1IDwgX21hcDY1Mi5zaXplOyArK19pNjU1KQogICAgICAgICB7Ci0gICAgICAgICAgX2tleTQ5OSA9IGlwcm90LnJlYWRJMzIoKTsKLSAgICAgICAgICBfdmFsNTAwID0gbmV3IExvY2FsQXNzaWdubWVudCgpOwotICAgICAgICAgIF92YWw1MDAucmVhZChpcHJvdCk7Ci0gICAgICAgICAgc3RydWN0LmFzc2lnbm1lbnRzLnB1dChfa2V5NDk5LCBfdmFsNTAwKTsKKyAgICAgICAgICBfa2V5NjUzID0gaXByb3QucmVhZEkzMigpOworICAgICAgICAgIF92YWw2NTQgPSBuZXcgTG9jYWxBc3NpZ25tZW50KCk7CisgICAgICAgICAgX3ZhbDY1NC5yZWFkKGlwcm90KTsKKyAgICAgICAgICBzdHJ1Y3QuYXNzaWdubWVudHMucHV0KF9rZXk2NTMsIF92YWw2NTQpOwogICAgICAgICB9CiAgICAgICB9CiAgICAgICBzdHJ1Y3Quc2V0X2Fzc2lnbm1lbnRzX2lzU2V0KHRydWUpOwpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9MU1N1cGVydmlzb3JJZC5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9MU1N1cGVydmlzb3JJZC5qYXZhCmluZGV4IDZlZTRkYWQuLjhiZTQ4ZmEgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvTFNTdXBlcnZpc29ySWQuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL0xTU3VwZXJ2aXNvcklkLmphdmEKQEAgLTE2LDcgKzE2LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAvKioKLSAqIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMikKKyAqIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMykKICAqCiAgKiBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HCiAgKiAgQGdlbmVyYXRlZApAQCAtNTEsNyArNTEsNyBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCiBAU3VwcHJlc3NXYXJuaW5ncyh7ImNhc3QiLCAicmF3dHlwZXMiLCAic2VyaWFsIiwgInVuY2hlY2tlZCJ9KQotQEdlbmVyYXRlZCh2YWx1ZSA9ICJBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjIpIiwgZGF0ZSA9ICIyMDE1LTQtMTAiKQorQEdlbmVyYXRlZCh2YWx1ZSA9ICJBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjMpIikKIHB1YmxpYyBjbGFzcyBMU1N1cGVydmlzb3JJZCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlPExTU3VwZXJ2aXNvcklkLCBMU1N1cGVydmlzb3JJZC5fRmllbGRzPiwgamF2YS5pby5TZXJpYWxpemFibGUsIENsb25lYWJsZSwgQ29tcGFyYWJsZTxMU1N1cGVydmlzb3JJZD4gewogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0IFNUUlVDVF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QoIkxTU3VwZXJ2aXNvcklkIik7CiAKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvTFNUb3BvSGlzdG9yeS5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9MU1RvcG9IaXN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlmZWExZQotLS0gL2Rldi9udWxsCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvTFNUb3BvSGlzdG9yeS5qYXZhCkBAIC0wLDAgKzEsODA1IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLyoqCisgKiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjMpCisgKgorICogRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lORworICogIEBnZW5lcmF0ZWQKKyAqLworcGFja2FnZSBiYWNrdHlwZS5zdG9ybS5nZW5lcmF0ZWQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuSVNjaGVtZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuU2NoZW1lRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuU3RhbmRhcmRTY2hlbWU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuVHVwbGVTY2hlbWU7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR1cGxlUHJvdG9jb2w7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LkVuY29kaW5nVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5Bc3luY01ldGhvZENhbGxiYWNrOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci5BYnN0cmFjdE5vbmJsb2NraW5nU2VydmVyLio7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5FbnVtTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5CaXRTZXQ7CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiY2FzdCIsICJyYXd0eXBlcyIsICJzZXJpYWwiLCAidW5jaGVja2VkIn0pCitAR2VuZXJhdGVkKHZhbHVlID0gIkF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMykiKQorcHVibGljIGNsYXNzIExTVG9wb0hpc3RvcnkgaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZTxMU1RvcG9IaXN0b3J5LCBMU1RvcG9IaXN0b3J5Ll9GaWVsZHM+LCBqYXZhLmlvLlNlcmlhbGl6YWJsZSwgQ2xvbmVhYmxlLCBDb21wYXJhYmxlPExTVG9wb0hpc3Rvcnk+IHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdCBTVFJVQ1RfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0KCJMU1RvcG9IaXN0b3J5Iik7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIFRPUE9MT0dZX0lEX0ZJRUxEX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkKCJ0b3BvbG9neV9pZCIsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORywgKHNob3J0KTEpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgVElNRV9TVEFNUF9GSUVMRF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCgidGltZV9zdGFtcCIsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkk2NCwgKHNob3J0KTIpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgVVNFUlNfRklFTERfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQoInVzZXJzIiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTElTVCwgKHNob3J0KTMpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgR1JPVVBTX0ZJRUxEX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkKCJncm91cHMiLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5MSVNULCAoc2hvcnQpNCk7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPENsYXNzPD8gZXh0ZW5kcyBJU2NoZW1lPiwgU2NoZW1lRmFjdG9yeT4gc2NoZW1lcyA9IG5ldyBIYXNoTWFwPENsYXNzPD8gZXh0ZW5kcyBJU2NoZW1lPiwgU2NoZW1lRmFjdG9yeT4oKTsKKyAgc3RhdGljIHsKKyAgICBzY2hlbWVzLnB1dChTdGFuZGFyZFNjaGVtZS5jbGFzcywgbmV3IExTVG9wb0hpc3RvcnlTdGFuZGFyZFNjaGVtZUZhY3RvcnkoKSk7CisgICAgc2NoZW1lcy5wdXQoVHVwbGVTY2hlbWUuY2xhc3MsIG5ldyBMU1RvcG9IaXN0b3J5VHVwbGVTY2hlbWVGYWN0b3J5KCkpOworICB9CisKKyAgcHJpdmF0ZSBTdHJpbmcgdG9wb2xvZ3lfaWQ7IC8vIHJlcXVpcmVkCisgIHByaXZhdGUgbG9uZyB0aW1lX3N0YW1wOyAvLyByZXF1aXJlZAorICBwcml2YXRlIExpc3Q8U3RyaW5nPiB1c2VyczsgLy8gcmVxdWlyZWQKKyAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gZ3JvdXBzOyAvLyByZXF1aXJlZAorCisgIC8qKiBUaGUgc2V0IG9mIGZpZWxkcyB0aGlzIHN0cnVjdCBjb250YWlucywgYWxvbmcgd2l0aCBjb252ZW5pZW5jZSBtZXRob2RzIGZvciBmaW5kaW5nIGFuZCBtYW5pcHVsYXRpbmcgdGhlbS4gKi8KKyAgcHVibGljIGVudW0gX0ZpZWxkcyBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZElkRW51bSB7CisgICAgVE9QT0xPR1lfSUQoKHNob3J0KTEsICJ0b3BvbG9neV9pZCIpLAorICAgIFRJTUVfU1RBTVAoKHNob3J0KTIsICJ0aW1lX3N0YW1wIiksCisgICAgVVNFUlMoKHNob3J0KTMsICJ1c2VycyIpLAorICAgIEdST1VQUygoc2hvcnQpNCwgImdyb3VwcyIpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgX0ZpZWxkcz4gYnlOYW1lID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBfRmllbGRzPigpOworCisgICAgc3RhdGljIHsKKyAgICAgIGZvciAoX0ZpZWxkcyBmaWVsZCA6IEVudW1TZXQuYWxsT2YoX0ZpZWxkcy5jbGFzcykpIHsKKyAgICAgICAgYnlOYW1lLnB1dChmaWVsZC5nZXRGaWVsZE5hbWUoKSwgZmllbGQpOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgdGhlIF9GaWVsZHMgY29uc3RhbnQgdGhhdCBtYXRjaGVzIGZpZWxkSWQsIG9yIG51bGwgaWYgaXRzIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIF9GaWVsZHMgZmluZEJ5VGhyaWZ0SWQoaW50IGZpZWxkSWQpIHsKKyAgICAgIHN3aXRjaChmaWVsZElkKSB7CisgICAgICAgIGNhc2UgMTogLy8gVE9QT0xPR1lfSUQKKyAgICAgICAgICByZXR1cm4gVE9QT0xPR1lfSUQ7CisgICAgICAgIGNhc2UgMjogLy8gVElNRV9TVEFNUAorICAgICAgICAgIHJldHVybiBUSU1FX1NUQU1QOworICAgICAgICBjYXNlIDM6IC8vIFVTRVJTCisgICAgICAgICAgcmV0dXJuIFVTRVJTOworICAgICAgICBjYXNlIDQ6IC8vIEdST1VQUworICAgICAgICAgIHJldHVybiBHUk9VUFM7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCB0aGUgX0ZpZWxkcyBjb25zdGFudCB0aGF0IG1hdGNoZXMgZmllbGRJZCwgdGhyb3dpbmcgYW4gZXhjZXB0aW9uCisgICAgICogaWYgaXQgaXMgbm90IGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgX0ZpZWxkcyBmaW5kQnlUaHJpZnRJZE9yVGhyb3coaW50IGZpZWxkSWQpIHsKKyAgICAgIF9GaWVsZHMgZmllbGRzID0gZmluZEJ5VGhyaWZ0SWQoZmllbGRJZCk7CisgICAgICBpZiAoZmllbGRzID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkZpZWxkICIgKyBmaWVsZElkICsgIiBkb2Vzbid0IGV4aXN0ISIpOworICAgICAgcmV0dXJuIGZpZWxkczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kIHRoZSBfRmllbGRzIGNvbnN0YW50IHRoYXQgbWF0Y2hlcyBuYW1lLCBvciBudWxsIGlmIGl0cyBub3QgZm91bmQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBfRmllbGRzIGZpbmRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgIHJldHVybiBieU5hbWUuZ2V0KG5hbWUpOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgc2hvcnQgX3RocmlmdElkOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIF9maWVsZE5hbWU7CisKKyAgICBfRmllbGRzKHNob3J0IHRocmlmdElkLCBTdHJpbmcgZmllbGROYW1lKSB7CisgICAgICBfdGhyaWZ0SWQgPSB0aHJpZnRJZDsKKyAgICAgIF9maWVsZE5hbWUgPSBmaWVsZE5hbWU7CisgICAgfQorCisgICAgcHVibGljIHNob3J0IGdldFRocmlmdEZpZWxkSWQoKSB7CisgICAgICByZXR1cm4gX3RocmlmdElkOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmllbGROYW1lKCkgeworICAgICAgcmV0dXJuIF9maWVsZE5hbWU7CisgICAgfQorICB9CisKKyAgLy8gaXNzZXQgaWQgYXNzaWdubWVudHMKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IF9fVElNRV9TVEFNUF9JU1NFVF9JRCA9IDA7CisgIHByaXZhdGUgYnl0ZSBfX2lzc2V0X2JpdGZpZWxkID0gMDsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBNYXA8X0ZpZWxkcywgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGE+IG1ldGFEYXRhTWFwOworICBzdGF0aWMgeworICAgIE1hcDxfRmllbGRzLCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YT4gdG1wTWFwID0gbmV3IEVudW1NYXA8X0ZpZWxkcywgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGE+KF9GaWVsZHMuY2xhc3MpOworICAgIHRtcE1hcC5wdXQoX0ZpZWxkcy5UT1BPTE9HWV9JRCwgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhKCJ0b3BvbG9neV9pZCIsIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZFJlcXVpcmVtZW50VHlwZS5SRVFVSVJFRCwgCisgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRWYWx1ZU1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORykpKTsKKyAgICB0bXBNYXAucHV0KF9GaWVsZHMuVElNRV9TVEFNUCwgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhKCJ0aW1lX3N0YW1wIiwgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLlJFUVVJUkVELCAKKyAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZFZhbHVlTWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTY0KSkpOworICAgIHRtcE1hcC5wdXQoX0ZpZWxkcy5VU0VSUywgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhKCJ1c2VycyIsIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZFJlcXVpcmVtZW50VHlwZS5SRVFVSVJFRCwgCisgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuTGlzdE1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkxJU1QsIAorICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZFZhbHVlTWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HKSkpKTsKKyAgICB0bXBNYXAucHV0KF9GaWVsZHMuR1JPVVBTLCBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEoImdyb3VwcyIsIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZFJlcXVpcmVtZW50VHlwZS5SRVFVSVJFRCwgCisgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuTGlzdE1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkxJU1QsIAorICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZFZhbHVlTWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HKSkpKTsKKyAgICBtZXRhRGF0YU1hcCA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcCh0bXBNYXApOworICAgIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhLmFkZFN0cnVjdE1ldGFEYXRhTWFwKExTVG9wb0hpc3RvcnkuY2xhc3MsIG1ldGFEYXRhTWFwKTsKKyAgfQorCisgIHB1YmxpYyBMU1RvcG9IaXN0b3J5KCkgeworICB9CisKKyAgcHVibGljIExTVG9wb0hpc3RvcnkoCisgICAgU3RyaW5nIHRvcG9sb2d5X2lkLAorICAgIGxvbmcgdGltZV9zdGFtcCwKKyAgICBMaXN0PFN0cmluZz4gdXNlcnMsCisgICAgTGlzdDxTdHJpbmc+IGdyb3VwcykKKyAgeworICAgIHRoaXMoKTsKKyAgICB0aGlzLnRvcG9sb2d5X2lkID0gdG9wb2xvZ3lfaWQ7CisgICAgdGhpcy50aW1lX3N0YW1wID0gdGltZV9zdGFtcDsKKyAgICBzZXRfdGltZV9zdGFtcF9pc1NldCh0cnVlKTsKKyAgICB0aGlzLnVzZXJzID0gdXNlcnM7CisgICAgdGhpcy5ncm91cHMgPSBncm91cHM7CisgIH0KKworICAvKioKKyAgICogUGVyZm9ybXMgYSBkZWVwIGNvcHkgb24gPGk+b3RoZXI8L2k+LgorICAgKi8KKyAgcHVibGljIExTVG9wb0hpc3RvcnkoTFNUb3BvSGlzdG9yeSBvdGhlcikgeworICAgIF9faXNzZXRfYml0ZmllbGQgPSBvdGhlci5fX2lzc2V0X2JpdGZpZWxkOworICAgIGlmIChvdGhlci5pc19zZXRfdG9wb2xvZ3lfaWQoKSkgeworICAgICAgdGhpcy50b3BvbG9neV9pZCA9IG90aGVyLnRvcG9sb2d5X2lkOworICAgIH0KKyAgICB0aGlzLnRpbWVfc3RhbXAgPSBvdGhlci50aW1lX3N0YW1wOworICAgIGlmIChvdGhlci5pc19zZXRfdXNlcnMoKSkgeworICAgICAgTGlzdDxTdHJpbmc+IF9fdGhpc19fdXNlcnMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4ob3RoZXIudXNlcnMpOworICAgICAgdGhpcy51c2VycyA9IF9fdGhpc19fdXNlcnM7CisgICAgfQorICAgIGlmIChvdGhlci5pc19zZXRfZ3JvdXBzKCkpIHsKKyAgICAgIExpc3Q8U3RyaW5nPiBfX3RoaXNfX2dyb3VwcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihvdGhlci5ncm91cHMpOworICAgICAgdGhpcy5ncm91cHMgPSBfX3RoaXNfX2dyb3VwczsKKyAgICB9CisgIH0KKworICBwdWJsaWMgTFNUb3BvSGlzdG9yeSBkZWVwQ29weSgpIHsKKyAgICByZXR1cm4gbmV3IExTVG9wb0hpc3RvcnkodGhpcyk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgdGhpcy50b3BvbG9neV9pZCA9IG51bGw7CisgICAgc2V0X3RpbWVfc3RhbXBfaXNTZXQoZmFsc2UpOworICAgIHRoaXMudGltZV9zdGFtcCA9IDA7CisgICAgdGhpcy51c2VycyA9IG51bGw7CisgICAgdGhpcy5ncm91cHMgPSBudWxsOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRfdG9wb2xvZ3lfaWQoKSB7CisgICAgcmV0dXJuIHRoaXMudG9wb2xvZ3lfaWQ7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfdG9wb2xvZ3lfaWQoU3RyaW5nIHRvcG9sb2d5X2lkKSB7CisgICAgdGhpcy50b3BvbG9neV9pZCA9IHRvcG9sb2d5X2lkOworICB9CisKKyAgcHVibGljIHZvaWQgdW5zZXRfdG9wb2xvZ3lfaWQoKSB7CisgICAgdGhpcy50b3BvbG9neV9pZCA9IG51bGw7CisgIH0KKworICAvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkIHRvcG9sb2d5X2lkIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLworICBwdWJsaWMgYm9vbGVhbiBpc19zZXRfdG9wb2xvZ3lfaWQoKSB7CisgICAgcmV0dXJuIHRoaXMudG9wb2xvZ3lfaWQgIT0gbnVsbDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF90b3BvbG9neV9pZF9pc1NldChib29sZWFuIHZhbHVlKSB7CisgICAgaWYgKCF2YWx1ZSkgeworICAgICAgdGhpcy50b3BvbG9neV9pZCA9IG51bGw7CisgICAgfQorICB9CisKKyAgcHVibGljIGxvbmcgZ2V0X3RpbWVfc3RhbXAoKSB7CisgICAgcmV0dXJuIHRoaXMudGltZV9zdGFtcDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF90aW1lX3N0YW1wKGxvbmcgdGltZV9zdGFtcCkgeworICAgIHRoaXMudGltZV9zdGFtcCA9IHRpbWVfc3RhbXA7CisgICAgc2V0X3RpbWVfc3RhbXBfaXNTZXQodHJ1ZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB1bnNldF90aW1lX3N0YW1wKCkgeworICAgIF9faXNzZXRfYml0ZmllbGQgPSBFbmNvZGluZ1V0aWxzLmNsZWFyQml0KF9faXNzZXRfYml0ZmllbGQsIF9fVElNRV9TVEFNUF9JU1NFVF9JRCk7CisgIH0KKworICAvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkIHRpbWVfc3RhbXAgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgIHB1YmxpYyBib29sZWFuIGlzX3NldF90aW1lX3N0YW1wKCkgeworICAgIHJldHVybiBFbmNvZGluZ1V0aWxzLnRlc3RCaXQoX19pc3NldF9iaXRmaWVsZCwgX19USU1FX1NUQU1QX0lTU0VUX0lEKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF90aW1lX3N0YW1wX2lzU2V0KGJvb2xlYW4gdmFsdWUpIHsKKyAgICBfX2lzc2V0X2JpdGZpZWxkID0gRW5jb2RpbmdVdGlscy5zZXRCaXQoX19pc3NldF9iaXRmaWVsZCwgX19USU1FX1NUQU1QX0lTU0VUX0lELCB2YWx1ZSk7CisgIH0KKworICBwdWJsaWMgaW50IGdldF91c2Vyc19zaXplKCkgeworICAgIHJldHVybiAodGhpcy51c2VycyA9PSBudWxsKSA/IDAgOiB0aGlzLnVzZXJzLnNpemUoKTsKKyAgfQorCisgIHB1YmxpYyBqYXZhLnV0aWwuSXRlcmF0b3I8U3RyaW5nPiBnZXRfdXNlcnNfaXRlcmF0b3IoKSB7CisgICAgcmV0dXJuICh0aGlzLnVzZXJzID09IG51bGwpID8gbnVsbCA6IHRoaXMudXNlcnMuaXRlcmF0b3IoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGFkZF90b191c2VycyhTdHJpbmcgZWxlbSkgeworICAgIGlmICh0aGlzLnVzZXJzID09IG51bGwpIHsKKyAgICAgIHRoaXMudXNlcnMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICB9CisgICAgdGhpcy51c2Vycy5hZGQoZWxlbSk7CisgIH0KKworICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldF91c2VycygpIHsKKyAgICByZXR1cm4gdGhpcy51c2VyczsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF91c2VycyhMaXN0PFN0cmluZz4gdXNlcnMpIHsKKyAgICB0aGlzLnVzZXJzID0gdXNlcnM7CisgIH0KKworICBwdWJsaWMgdm9pZCB1bnNldF91c2VycygpIHsKKyAgICB0aGlzLnVzZXJzID0gbnVsbDsKKyAgfQorCisgIC8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgdXNlcnMgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgIHB1YmxpYyBib29sZWFuIGlzX3NldF91c2VycygpIHsKKyAgICByZXR1cm4gdGhpcy51c2VycyAhPSBudWxsOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X3VzZXJzX2lzU2V0KGJvb2xlYW4gdmFsdWUpIHsKKyAgICBpZiAoIXZhbHVlKSB7CisgICAgICB0aGlzLnVzZXJzID0gbnVsbDsKKyAgICB9CisgIH0KKworICBwdWJsaWMgaW50IGdldF9ncm91cHNfc2l6ZSgpIHsKKyAgICByZXR1cm4gKHRoaXMuZ3JvdXBzID09IG51bGwpID8gMCA6IHRoaXMuZ3JvdXBzLnNpemUoKTsKKyAgfQorCisgIHB1YmxpYyBqYXZhLnV0aWwuSXRlcmF0b3I8U3RyaW5nPiBnZXRfZ3JvdXBzX2l0ZXJhdG9yKCkgeworICAgIHJldHVybiAodGhpcy5ncm91cHMgPT0gbnVsbCkgPyBudWxsIDogdGhpcy5ncm91cHMuaXRlcmF0b3IoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGFkZF90b19ncm91cHMoU3RyaW5nIGVsZW0pIHsKKyAgICBpZiAodGhpcy5ncm91cHMgPT0gbnVsbCkgeworICAgICAgdGhpcy5ncm91cHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICB9CisgICAgdGhpcy5ncm91cHMuYWRkKGVsZW0pOworICB9CisKKyAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRfZ3JvdXBzKCkgeworICAgIHJldHVybiB0aGlzLmdyb3VwczsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF9ncm91cHMoTGlzdDxTdHJpbmc+IGdyb3VwcykgeworICAgIHRoaXMuZ3JvdXBzID0gZ3JvdXBzOworICB9CisKKyAgcHVibGljIHZvaWQgdW5zZXRfZ3JvdXBzKCkgeworICAgIHRoaXMuZ3JvdXBzID0gbnVsbDsKKyAgfQorCisgIC8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgZ3JvdXBzIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLworICBwdWJsaWMgYm9vbGVhbiBpc19zZXRfZ3JvdXBzKCkgeworICAgIHJldHVybiB0aGlzLmdyb3VwcyAhPSBudWxsOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X2dyb3Vwc19pc1NldChib29sZWFuIHZhbHVlKSB7CisgICAgaWYgKCF2YWx1ZSkgeworICAgICAgdGhpcy5ncm91cHMgPSBudWxsOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldEZpZWxkVmFsdWUoX0ZpZWxkcyBmaWVsZCwgT2JqZWN0IHZhbHVlKSB7CisgICAgc3dpdGNoIChmaWVsZCkgeworICAgIGNhc2UgVE9QT0xPR1lfSUQ6CisgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICB1bnNldF90b3BvbG9neV9pZCgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2V0X3RvcG9sb2d5X2lkKChTdHJpbmcpdmFsdWUpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFRJTUVfU1RBTVA6CisgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICB1bnNldF90aW1lX3N0YW1wKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzZXRfdGltZV9zdGFtcCgoTG9uZyl2YWx1ZSk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgVVNFUlM6CisgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICB1bnNldF91c2VycygpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2V0X3VzZXJzKChMaXN0PFN0cmluZz4pdmFsdWUpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEdST1VQUzoKKyAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgIHVuc2V0X2dyb3VwcygpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2V0X2dyb3VwcygoTGlzdDxTdHJpbmc+KXZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgfQorICB9CisKKyAgcHVibGljIE9iamVjdCBnZXRGaWVsZFZhbHVlKF9GaWVsZHMgZmllbGQpIHsKKyAgICBzd2l0Y2ggKGZpZWxkKSB7CisgICAgY2FzZSBUT1BPTE9HWV9JRDoKKyAgICAgIHJldHVybiBnZXRfdG9wb2xvZ3lfaWQoKTsKKworICAgIGNhc2UgVElNRV9TVEFNUDoKKyAgICAgIHJldHVybiBnZXRfdGltZV9zdGFtcCgpOworCisgICAgY2FzZSBVU0VSUzoKKyAgICAgIHJldHVybiBnZXRfdXNlcnMoKTsKKworICAgIGNhc2UgR1JPVVBTOgorICAgICAgcmV0dXJuIGdldF9ncm91cHMoKTsKKworICAgIH0KKyAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgIH0KKworICAvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkIGNvcnJlc3BvbmRpbmcgdG8gZmllbGRJRCBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNTZXQoX0ZpZWxkcyBmaWVsZCkgeworICAgIGlmIChmaWVsZCA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgc3dpdGNoIChmaWVsZCkgeworICAgIGNhc2UgVE9QT0xPR1lfSUQ6CisgICAgICByZXR1cm4gaXNfc2V0X3RvcG9sb2d5X2lkKCk7CisgICAgY2FzZSBUSU1FX1NUQU1QOgorICAgICAgcmV0dXJuIGlzX3NldF90aW1lX3N0YW1wKCk7CisgICAgY2FzZSBVU0VSUzoKKyAgICAgIHJldHVybiBpc19zZXRfdXNlcnMoKTsKKyAgICBjYXNlIEdST1VQUzoKKyAgICAgIHJldHVybiBpc19zZXRfZ3JvdXBzKCk7CisgICAgfQorICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IHRoYXQpIHsKKyAgICBpZiAodGhhdCA9PSBudWxsKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmICh0aGF0IGluc3RhbmNlb2YgTFNUb3BvSGlzdG9yeSkKKyAgICAgIHJldHVybiB0aGlzLmVxdWFscygoTFNUb3BvSGlzdG9yeSl0aGF0KTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoTFNUb3BvSGlzdG9yeSB0aGF0KSB7CisgICAgaWYgKHRoYXQgPT0gbnVsbCkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGJvb2xlYW4gdGhpc19wcmVzZW50X3RvcG9sb2d5X2lkID0gdHJ1ZSAmJiB0aGlzLmlzX3NldF90b3BvbG9neV9pZCgpOworICAgIGJvb2xlYW4gdGhhdF9wcmVzZW50X3RvcG9sb2d5X2lkID0gdHJ1ZSAmJiB0aGF0LmlzX3NldF90b3BvbG9neV9pZCgpOworICAgIGlmICh0aGlzX3ByZXNlbnRfdG9wb2xvZ3lfaWQgfHwgdGhhdF9wcmVzZW50X3RvcG9sb2d5X2lkKSB7CisgICAgICBpZiAoISh0aGlzX3ByZXNlbnRfdG9wb2xvZ3lfaWQgJiYgdGhhdF9wcmVzZW50X3RvcG9sb2d5X2lkKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKCF0aGlzLnRvcG9sb2d5X2lkLmVxdWFscyh0aGF0LnRvcG9sb2d5X2lkKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2xlYW4gdGhpc19wcmVzZW50X3RpbWVfc3RhbXAgPSB0cnVlOworICAgIGJvb2xlYW4gdGhhdF9wcmVzZW50X3RpbWVfc3RhbXAgPSB0cnVlOworICAgIGlmICh0aGlzX3ByZXNlbnRfdGltZV9zdGFtcCB8fCB0aGF0X3ByZXNlbnRfdGltZV9zdGFtcCkgeworICAgICAgaWYgKCEodGhpc19wcmVzZW50X3RpbWVfc3RhbXAgJiYgdGhhdF9wcmVzZW50X3RpbWVfc3RhbXApKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBpZiAodGhpcy50aW1lX3N0YW1wICE9IHRoYXQudGltZV9zdGFtcCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2xlYW4gdGhpc19wcmVzZW50X3VzZXJzID0gdHJ1ZSAmJiB0aGlzLmlzX3NldF91c2VycygpOworICAgIGJvb2xlYW4gdGhhdF9wcmVzZW50X3VzZXJzID0gdHJ1ZSAmJiB0aGF0LmlzX3NldF91c2VycygpOworICAgIGlmICh0aGlzX3ByZXNlbnRfdXNlcnMgfHwgdGhhdF9wcmVzZW50X3VzZXJzKSB7CisgICAgICBpZiAoISh0aGlzX3ByZXNlbnRfdXNlcnMgJiYgdGhhdF9wcmVzZW50X3VzZXJzKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKCF0aGlzLnVzZXJzLmVxdWFscyh0aGF0LnVzZXJzKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2xlYW4gdGhpc19wcmVzZW50X2dyb3VwcyA9IHRydWUgJiYgdGhpcy5pc19zZXRfZ3JvdXBzKCk7CisgICAgYm9vbGVhbiB0aGF0X3ByZXNlbnRfZ3JvdXBzID0gdHJ1ZSAmJiB0aGF0LmlzX3NldF9ncm91cHMoKTsKKyAgICBpZiAodGhpc19wcmVzZW50X2dyb3VwcyB8fCB0aGF0X3ByZXNlbnRfZ3JvdXBzKSB7CisgICAgICBpZiAoISh0aGlzX3ByZXNlbnRfZ3JvdXBzICYmIHRoYXRfcHJlc2VudF9ncm91cHMpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBpZiAoIXRoaXMuZ3JvdXBzLmVxdWFscyh0aGF0Lmdyb3VwcykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgIExpc3Q8T2JqZWN0PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7CisKKyAgICBib29sZWFuIHByZXNlbnRfdG9wb2xvZ3lfaWQgPSB0cnVlICYmIChpc19zZXRfdG9wb2xvZ3lfaWQoKSk7CisgICAgbGlzdC5hZGQocHJlc2VudF90b3BvbG9neV9pZCk7CisgICAgaWYgKHByZXNlbnRfdG9wb2xvZ3lfaWQpCisgICAgICBsaXN0LmFkZCh0b3BvbG9neV9pZCk7CisKKyAgICBib29sZWFuIHByZXNlbnRfdGltZV9zdGFtcCA9IHRydWU7CisgICAgbGlzdC5hZGQocHJlc2VudF90aW1lX3N0YW1wKTsKKyAgICBpZiAocHJlc2VudF90aW1lX3N0YW1wKQorICAgICAgbGlzdC5hZGQodGltZV9zdGFtcCk7CisKKyAgICBib29sZWFuIHByZXNlbnRfdXNlcnMgPSB0cnVlICYmIChpc19zZXRfdXNlcnMoKSk7CisgICAgbGlzdC5hZGQocHJlc2VudF91c2Vycyk7CisgICAgaWYgKHByZXNlbnRfdXNlcnMpCisgICAgICBsaXN0LmFkZCh1c2Vycyk7CisKKyAgICBib29sZWFuIHByZXNlbnRfZ3JvdXBzID0gdHJ1ZSAmJiAoaXNfc2V0X2dyb3VwcygpKTsKKyAgICBsaXN0LmFkZChwcmVzZW50X2dyb3Vwcyk7CisgICAgaWYgKHByZXNlbnRfZ3JvdXBzKQorICAgICAgbGlzdC5hZGQoZ3JvdXBzKTsKKworICAgIHJldHVybiBsaXN0Lmhhc2hDb2RlKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBjb21wYXJlVG8oTFNUb3BvSGlzdG9yeSBvdGhlcikgeworICAgIGlmICghZ2V0Q2xhc3MoKS5lcXVhbHMob3RoZXIuZ2V0Q2xhc3MoKSkpIHsKKyAgICAgIHJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKS5jb21wYXJlVG8ob3RoZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgIH0KKworICAgIGludCBsYXN0Q29tcGFyaXNvbiA9IDA7CisKKyAgICBsYXN0Q29tcGFyaXNvbiA9IEJvb2xlYW4udmFsdWVPZihpc19zZXRfdG9wb2xvZ3lfaWQoKSkuY29tcGFyZVRvKG90aGVyLmlzX3NldF90b3BvbG9neV9pZCgpKTsKKyAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgIH0KKyAgICBpZiAoaXNfc2V0X3RvcG9sb2d5X2lkKCkpIHsKKyAgICAgIGxhc3RDb21wYXJpc29uID0gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29tcGFyZVRvKHRoaXMudG9wb2xvZ3lfaWQsIG90aGVyLnRvcG9sb2d5X2lkKTsKKyAgICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICAgIH0KKyAgICB9CisgICAgbGFzdENvbXBhcmlzb24gPSBCb29sZWFuLnZhbHVlT2YoaXNfc2V0X3RpbWVfc3RhbXAoKSkuY29tcGFyZVRvKG90aGVyLmlzX3NldF90aW1lX3N0YW1wKCkpOworICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgfQorICAgIGlmIChpc19zZXRfdGltZV9zdGFtcCgpKSB7CisgICAgICBsYXN0Q29tcGFyaXNvbiA9IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvbXBhcmVUbyh0aGlzLnRpbWVfc3RhbXAsIG90aGVyLnRpbWVfc3RhbXApOworICAgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgICAgfQorICAgIH0KKyAgICBsYXN0Q29tcGFyaXNvbiA9IEJvb2xlYW4udmFsdWVPZihpc19zZXRfdXNlcnMoKSkuY29tcGFyZVRvKG90aGVyLmlzX3NldF91c2VycygpKTsKKyAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgIH0KKyAgICBpZiAoaXNfc2V0X3VzZXJzKCkpIHsKKyAgICAgIGxhc3RDb21wYXJpc29uID0gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29tcGFyZVRvKHRoaXMudXNlcnMsIG90aGVyLnVzZXJzKTsKKyAgICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICAgIH0KKyAgICB9CisgICAgbGFzdENvbXBhcmlzb24gPSBCb29sZWFuLnZhbHVlT2YoaXNfc2V0X2dyb3VwcygpKS5jb21wYXJlVG8ob3RoZXIuaXNfc2V0X2dyb3VwcygpKTsKKyAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgIH0KKyAgICBpZiAoaXNfc2V0X2dyb3VwcygpKSB7CisgICAgICBsYXN0Q29tcGFyaXNvbiA9IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvbXBhcmVUbyh0aGlzLmdyb3Vwcywgb3RoZXIuZ3JvdXBzKTsKKyAgICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7CisgIH0KKworICBwdWJsaWMgX0ZpZWxkcyBmaWVsZEZvcklkKGludCBmaWVsZElkKSB7CisgICAgcmV0dXJuIF9GaWVsZHMuZmluZEJ5VGhyaWZ0SWQoZmllbGRJZCk7CisgIH0KKworICBwdWJsaWMgdm9pZCByZWFkKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBpcHJvdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgIHNjaGVtZXMuZ2V0KGlwcm90LmdldFNjaGVtZSgpKS5nZXRTY2hlbWUoKS5yZWFkKGlwcm90LCB0aGlzKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgIHNjaGVtZXMuZ2V0KG9wcm90LmdldFNjaGVtZSgpKS5nZXRTY2hlbWUoKS53cml0ZShvcHJvdCwgdGhpcyk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoIkxTVG9wb0hpc3RvcnkoIik7CisgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7CisKKyAgICBzYi5hcHBlbmQoInRvcG9sb2d5X2lkOiIpOworICAgIGlmICh0aGlzLnRvcG9sb2d5X2lkID09IG51bGwpIHsKKyAgICAgIHNiLmFwcGVuZCgibnVsbCIpOworICAgIH0gZWxzZSB7CisgICAgICBzYi5hcHBlbmQodGhpcy50b3BvbG9neV9pZCk7CisgICAgfQorICAgIGZpcnN0ID0gZmFsc2U7CisgICAgaWYgKCFmaXJzdCkgc2IuYXBwZW5kKCIsICIpOworICAgIHNiLmFwcGVuZCgidGltZV9zdGFtcDoiKTsKKyAgICBzYi5hcHBlbmQodGhpcy50aW1lX3N0YW1wKTsKKyAgICBmaXJzdCA9IGZhbHNlOworICAgIGlmICghZmlyc3QpIHNiLmFwcGVuZCgiLCAiKTsKKyAgICBzYi5hcHBlbmQoInVzZXJzOiIpOworICAgIGlmICh0aGlzLnVzZXJzID09IG51bGwpIHsKKyAgICAgIHNiLmFwcGVuZCgibnVsbCIpOworICAgIH0gZWxzZSB7CisgICAgICBzYi5hcHBlbmQodGhpcy51c2Vycyk7CisgICAgfQorICAgIGZpcnN0ID0gZmFsc2U7CisgICAgaWYgKCFmaXJzdCkgc2IuYXBwZW5kKCIsICIpOworICAgIHNiLmFwcGVuZCgiZ3JvdXBzOiIpOworICAgIGlmICh0aGlzLmdyb3VwcyA9PSBudWxsKSB7CisgICAgICBzYi5hcHBlbmQoIm51bGwiKTsKKyAgICB9IGVsc2UgeworICAgICAgc2IuYXBwZW5kKHRoaXMuZ3JvdXBzKTsKKyAgICB9CisgICAgZmlyc3QgPSBmYWxzZTsKKyAgICBzYi5hcHBlbmQoIikiKTsKKyAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgIC8vIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMKKyAgICBpZiAoIWlzX3NldF90b3BvbG9neV9pZCgpKSB7CisgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRXhjZXB0aW9uKCJSZXF1aXJlZCBmaWVsZCAndG9wb2xvZ3lfaWQnIGlzIHVuc2V0ISBTdHJ1Y3Q6IiArIHRvU3RyaW5nKCkpOworICAgIH0KKworICAgIGlmICghaXNfc2V0X3RpbWVfc3RhbXAoKSkgeworICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEV4Y2VwdGlvbigiUmVxdWlyZWQgZmllbGQgJ3RpbWVfc3RhbXAnIGlzIHVuc2V0ISBTdHJ1Y3Q6IiArIHRvU3RyaW5nKCkpOworICAgIH0KKworICAgIGlmICghaXNfc2V0X3VzZXJzKCkpIHsKKyAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xFeGNlcHRpb24oIlJlcXVpcmVkIGZpZWxkICd1c2VycycgaXMgdW5zZXQhIFN0cnVjdDoiICsgdG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgaWYgKCFpc19zZXRfZ3JvdXBzKCkpIHsKKyAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xFeGNlcHRpb24oIlJlcXVpcmVkIGZpZWxkICdncm91cHMnIGlzIHVuc2V0ISBTdHJ1Y3Q6IiArIHRvU3RyaW5nKCkpOworICAgIH0KKworICAgIC8vIGNoZWNrIGZvciBzdWItc3RydWN0IHZhbGlkaXR5CisgIH0KKworICBwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIHdyaXRlKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQ29tcGFjdFByb3RvY29sKG5ldyBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVElPU3RyZWFtVHJhbnNwb3J0KG91dCkpKTsKKyAgICB9IGNhdGNoIChvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHRlKSB7CisgICAgICB0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbih0ZSk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBpbikgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICAvLyBpdCBkb2Vzbid0IHNlZW0gbGlrZSB5b3Ugc2hvdWxkIGhhdmUgdG8gZG8gdGhpcywgYnV0IGphdmEgc2VyaWFsaXphdGlvbiBpcyB3YWNreSwgYW5kIGRvZXNuJ3QgY2FsbCB0aGUgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICAgIF9faXNzZXRfYml0ZmllbGQgPSAwOworICAgICAgcmVhZChuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbChuZXcgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRJT1N0cmVhbVRyYW5zcG9ydChpbikpKTsKKyAgICB9IGNhdGNoIChvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHRlKSB7CisgICAgICB0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbih0ZSk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTFNUb3BvSGlzdG9yeVN0YW5kYXJkU2NoZW1lRmFjdG9yeSBpbXBsZW1lbnRzIFNjaGVtZUZhY3RvcnkgeworICAgIHB1YmxpYyBMU1RvcG9IaXN0b3J5U3RhbmRhcmRTY2hlbWUgZ2V0U2NoZW1lKCkgeworICAgICAgcmV0dXJuIG5ldyBMU1RvcG9IaXN0b3J5U3RhbmRhcmRTY2hlbWUoKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBMU1RvcG9IaXN0b3J5U3RhbmRhcmRTY2hlbWUgZXh0ZW5kcyBTdGFuZGFyZFNjaGVtZTxMU1RvcG9IaXN0b3J5PiB7CisKKyAgICBwdWJsaWMgdm9pZCByZWFkKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBpcHJvdCwgTFNUb3BvSGlzdG9yeSBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBzY2hlbWVGaWVsZDsKKyAgICAgIGlwcm90LnJlYWRTdHJ1Y3RCZWdpbigpOworICAgICAgd2hpbGUgKHRydWUpCisgICAgICB7CisgICAgICAgIHNjaGVtZUZpZWxkID0gaXByb3QucmVhZEZpZWxkQmVnaW4oKTsKKyAgICAgICAgaWYgKHNjaGVtZUZpZWxkLnR5cGUgPT0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RPUCkgeyAKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKHNjaGVtZUZpZWxkLmlkKSB7CisgICAgICAgICAgY2FzZSAxOiAvLyBUT1BPTE9HWV9JRAorICAgICAgICAgICAgaWYgKHNjaGVtZUZpZWxkLnR5cGUgPT0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HKSB7CisgICAgICAgICAgICAgIHN0cnVjdC50b3BvbG9neV9pZCA9IGlwcm90LnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgICAgc3RydWN0LnNldF90b3BvbG9neV9pZF9pc1NldCh0cnVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7IAorICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAyOiAvLyBUSU1FX1NUQU1QCisgICAgICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JNjQpIHsKKyAgICAgICAgICAgICAgc3RydWN0LnRpbWVfc3RhbXAgPSBpcHJvdC5yZWFkSTY0KCk7CisgICAgICAgICAgICAgIHN0cnVjdC5zZXRfdGltZV9zdGFtcF9pc1NldCh0cnVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7IAorICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAzOiAvLyBVU0VSUworICAgICAgICAgICAgaWYgKHNjaGVtZUZpZWxkLnR5cGUgPT0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTElTVCkgeworICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVExpc3QgX2xpc3Q2NjQgPSBpcHJvdC5yZWFkTGlzdEJlZ2luKCk7CisgICAgICAgICAgICAgICAgc3RydWN0LnVzZXJzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KF9saXN0NjY0LnNpemUpOworICAgICAgICAgICAgICAgIFN0cmluZyBfZWxlbTY2NTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBfaTY2NiA9IDA7IF9pNjY2IDwgX2xpc3Q2NjQuc2l6ZTsgKytfaTY2NikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBfZWxlbTY2NSA9IGlwcm90LnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgIHN0cnVjdC51c2Vycy5hZGQoX2VsZW02NjUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpcHJvdC5yZWFkTGlzdEVuZCgpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIHN0cnVjdC5zZXRfdXNlcnNfaXNTZXQodHJ1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeyAKKyAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgNDogLy8gR1JPVVBTCisgICAgICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5MSVNUKSB7CisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTGlzdCBfbGlzdDY2NyA9IGlwcm90LnJlYWRMaXN0QmVnaW4oKTsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QuZ3JvdXBzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KF9saXN0NjY3LnNpemUpOworICAgICAgICAgICAgICAgIFN0cmluZyBfZWxlbTY2ODsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBfaTY2OSA9IDA7IF9pNjY5IDwgX2xpc3Q2Njcuc2l6ZTsgKytfaTY2OSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBfZWxlbTY2OCA9IGlwcm90LnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgIHN0cnVjdC5ncm91cHMuYWRkKF9lbGVtNjY4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaXByb3QucmVhZExpc3RFbmQoKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBzdHJ1Y3Quc2V0X2dyb3Vwc19pc1NldCh0cnVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7IAorICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgc2NoZW1lRmllbGQudHlwZSk7CisgICAgICAgIH0KKyAgICAgICAgaXByb3QucmVhZEZpZWxkRW5kKCk7CisgICAgICB9CisgICAgICBpcHJvdC5yZWFkU3RydWN0RW5kKCk7CisgICAgICBzdHJ1Y3QudmFsaWRhdGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgb3Byb3QsIExTVG9wb0hpc3Rvcnkgc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICBzdHJ1Y3QudmFsaWRhdGUoKTsKKworICAgICAgb3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihTVFJVQ1RfREVTQyk7CisgICAgICBpZiAoc3RydWN0LnRvcG9sb2d5X2lkICE9IG51bGwpIHsKKyAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKFRPUE9MT0dZX0lEX0ZJRUxEX0RFU0MpOworICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhzdHJ1Y3QudG9wb2xvZ3lfaWQpOworICAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgICB9CisgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oVElNRV9TVEFNUF9GSUVMRF9ERVNDKTsKKyAgICAgIG9wcm90LndyaXRlSTY0KHN0cnVjdC50aW1lX3N0YW1wKTsKKyAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICAgIGlmIChzdHJ1Y3QudXNlcnMgIT0gbnVsbCkgeworICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oVVNFUlNfRklFTERfREVTQyk7CisgICAgICAgIHsKKyAgICAgICAgICBvcHJvdC53cml0ZUxpc3RCZWdpbihuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVExpc3Qob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCBzdHJ1Y3QudXNlcnMuc2l6ZSgpKSk7CisgICAgICAgICAgZm9yIChTdHJpbmcgX2l0ZXI2NzAgOiBzdHJ1Y3QudXNlcnMpCisgICAgICAgICAgeworICAgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoX2l0ZXI2NzApOworICAgICAgICAgIH0KKyAgICAgICAgICBvcHJvdC53cml0ZUxpc3RFbmQoKTsKKyAgICAgICAgfQorICAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0Lmdyb3VwcyAhPSBudWxsKSB7CisgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihHUk9VUFNfRklFTERfREVTQyk7CisgICAgICAgIHsKKyAgICAgICAgICBvcHJvdC53cml0ZUxpc3RCZWdpbihuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVExpc3Qob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCBzdHJ1Y3QuZ3JvdXBzLnNpemUoKSkpOworICAgICAgICAgIGZvciAoU3RyaW5nIF9pdGVyNjcxIDogc3RydWN0Lmdyb3VwcykKKyAgICAgICAgICB7CisgICAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhfaXRlcjY3MSk7CisgICAgICAgICAgfQorICAgICAgICAgIG9wcm90LndyaXRlTGlzdEVuZCgpOworICAgICAgICB9CisgICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICAgIH0KKyAgICAgIG9wcm90LndyaXRlRmllbGRTdG9wKCk7CisgICAgICBvcHJvdC53cml0ZVN0cnVjdEVuZCgpOworICAgIH0KKworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTFNUb3BvSGlzdG9yeVR1cGxlU2NoZW1lRmFjdG9yeSBpbXBsZW1lbnRzIFNjaGVtZUZhY3RvcnkgeworICAgIHB1YmxpYyBMU1RvcG9IaXN0b3J5VHVwbGVTY2hlbWUgZ2V0U2NoZW1lKCkgeworICAgICAgcmV0dXJuIG5ldyBMU1RvcG9IaXN0b3J5VHVwbGVTY2hlbWUoKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBMU1RvcG9IaXN0b3J5VHVwbGVTY2hlbWUgZXh0ZW5kcyBUdXBsZVNjaGVtZTxMU1RvcG9IaXN0b3J5PiB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgcHJvdCwgTFNUb3BvSGlzdG9yeSBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgIFRUdXBsZVByb3RvY29sIG9wcm90ID0gKFRUdXBsZVByb3RvY29sKSBwcm90OworICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoc3RydWN0LnRvcG9sb2d5X2lkKTsKKyAgICAgIG9wcm90LndyaXRlSTY0KHN0cnVjdC50aW1lX3N0YW1wKTsKKyAgICAgIHsKKyAgICAgICAgb3Byb3Qud3JpdGVJMzIoc3RydWN0LnVzZXJzLnNpemUoKSk7CisgICAgICAgIGZvciAoU3RyaW5nIF9pdGVyNjcyIDogc3RydWN0LnVzZXJzKQorICAgICAgICB7CisgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoX2l0ZXI2NzIpOworICAgICAgICB9CisgICAgICB9CisgICAgICB7CisgICAgICAgIG9wcm90LndyaXRlSTMyKHN0cnVjdC5ncm91cHMuc2l6ZSgpKTsKKyAgICAgICAgZm9yIChTdHJpbmcgX2l0ZXI2NzMgOiBzdHJ1Y3QuZ3JvdXBzKQorICAgICAgICB7CisgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoX2l0ZXI2NzMpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVhZChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgcHJvdCwgTFNUb3BvSGlzdG9yeSBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgIFRUdXBsZVByb3RvY29sIGlwcm90ID0gKFRUdXBsZVByb3RvY29sKSBwcm90OworICAgICAgc3RydWN0LnRvcG9sb2d5X2lkID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgc3RydWN0LnNldF90b3BvbG9neV9pZF9pc1NldCh0cnVlKTsKKyAgICAgIHN0cnVjdC50aW1lX3N0YW1wID0gaXByb3QucmVhZEk2NCgpOworICAgICAgc3RydWN0LnNldF90aW1lX3N0YW1wX2lzU2V0KHRydWUpOworICAgICAgeworICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTGlzdCBfbGlzdDY3NCA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTGlzdChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcsIGlwcm90LnJlYWRJMzIoKSk7CisgICAgICAgIHN0cnVjdC51c2VycyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihfbGlzdDY3NC5zaXplKTsKKyAgICAgICAgU3RyaW5nIF9lbGVtNjc1OworICAgICAgICBmb3IgKGludCBfaTY3NiA9IDA7IF9pNjc2IDwgX2xpc3Q2NzQuc2l6ZTsgKytfaTY3NikKKyAgICAgICAgeworICAgICAgICAgIF9lbGVtNjc1ID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICAgIHN0cnVjdC51c2Vycy5hZGQoX2VsZW02NzUpOworICAgICAgICB9CisgICAgICB9CisgICAgICBzdHJ1Y3Quc2V0X3VzZXJzX2lzU2V0KHRydWUpOworICAgICAgeworICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTGlzdCBfbGlzdDY3NyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTGlzdChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcsIGlwcm90LnJlYWRJMzIoKSk7CisgICAgICAgIHN0cnVjdC5ncm91cHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oX2xpc3Q2Nzcuc2l6ZSk7CisgICAgICAgIFN0cmluZyBfZWxlbTY3ODsKKyAgICAgICAgZm9yIChpbnQgX2k2NzkgPSAwOyBfaTY3OSA8IF9saXN0Njc3LnNpemU7ICsrX2k2NzkpCisgICAgICAgIHsKKyAgICAgICAgICBfZWxlbTY3OCA9IGlwcm90LnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICBzdHJ1Y3QuZ3JvdXBzLmFkZChfZWxlbTY3OCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHN0cnVjdC5zZXRfZ3JvdXBzX2lzU2V0KHRydWUpOworICAgIH0KKyAgfQorCit9CisKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvTFNUb3BvSGlzdG9yeUxpc3QuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvTFNUb3BvSGlzdG9yeUxpc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjJlY2U2Ci0tLSAvZGV2L251bGwKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9MU1RvcG9IaXN0b3J5TGlzdC5qYXZhCkBAIC0wLDAgKzEsNDYwIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLyoqCisgKiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjMpCisgKgorICogRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lORworICogIEBnZW5lcmF0ZWQKKyAqLworcGFja2FnZSBiYWNrdHlwZS5zdG9ybS5nZW5lcmF0ZWQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuSVNjaGVtZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuU2NoZW1lRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuU3RhbmRhcmRTY2hlbWU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuVHVwbGVTY2hlbWU7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR1cGxlUHJvdG9jb2w7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LkVuY29kaW5nVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5Bc3luY01ldGhvZENhbGxiYWNrOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci5BYnN0cmFjdE5vbmJsb2NraW5nU2VydmVyLio7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5FbnVtTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5CaXRTZXQ7CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiY2FzdCIsICJyYXd0eXBlcyIsICJzZXJpYWwiLCAidW5jaGVja2VkIn0pCitAR2VuZXJhdGVkKHZhbHVlID0gIkF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMykiKQorcHVibGljIGNsYXNzIExTVG9wb0hpc3RvcnlMaXN0IGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2U8TFNUb3BvSGlzdG9yeUxpc3QsIExTVG9wb0hpc3RvcnlMaXN0Ll9GaWVsZHM+LCBqYXZhLmlvLlNlcmlhbGl6YWJsZSwgQ2xvbmVhYmxlLCBDb21wYXJhYmxlPExTVG9wb0hpc3RvcnlMaXN0PiB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QgU1RSVUNUX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdCgiTFNUb3BvSGlzdG9yeUxpc3QiKTsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgVE9QT19ISVNUT1JZX0ZJRUxEX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkKCJ0b3BvX2hpc3RvcnkiLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5MSVNULCAoc2hvcnQpMSk7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPENsYXNzPD8gZXh0ZW5kcyBJU2NoZW1lPiwgU2NoZW1lRmFjdG9yeT4gc2NoZW1lcyA9IG5ldyBIYXNoTWFwPENsYXNzPD8gZXh0ZW5kcyBJU2NoZW1lPiwgU2NoZW1lRmFjdG9yeT4oKTsKKyAgc3RhdGljIHsKKyAgICBzY2hlbWVzLnB1dChTdGFuZGFyZFNjaGVtZS5jbGFzcywgbmV3IExTVG9wb0hpc3RvcnlMaXN0U3RhbmRhcmRTY2hlbWVGYWN0b3J5KCkpOworICAgIHNjaGVtZXMucHV0KFR1cGxlU2NoZW1lLmNsYXNzLCBuZXcgTFNUb3BvSGlzdG9yeUxpc3RUdXBsZVNjaGVtZUZhY3RvcnkoKSk7CisgIH0KKworICBwcml2YXRlIExpc3Q8TFNUb3BvSGlzdG9yeT4gdG9wb19oaXN0b3J5OyAvLyByZXF1aXJlZAorCisgIC8qKiBUaGUgc2V0IG9mIGZpZWxkcyB0aGlzIHN0cnVjdCBjb250YWlucywgYWxvbmcgd2l0aCBjb252ZW5pZW5jZSBtZXRob2RzIGZvciBmaW5kaW5nIGFuZCBtYW5pcHVsYXRpbmcgdGhlbS4gKi8KKyAgcHVibGljIGVudW0gX0ZpZWxkcyBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZElkRW51bSB7CisgICAgVE9QT19ISVNUT1JZKChzaG9ydCkxLCAidG9wb19oaXN0b3J5Iik7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBfRmllbGRzPiBieU5hbWUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIF9GaWVsZHM+KCk7CisKKyAgICBzdGF0aWMgeworICAgICAgZm9yIChfRmllbGRzIGZpZWxkIDogRW51bVNldC5hbGxPZihfRmllbGRzLmNsYXNzKSkgeworICAgICAgICBieU5hbWUucHV0KGZpZWxkLmdldEZpZWxkTmFtZSgpLCBmaWVsZCk7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCB0aGUgX0ZpZWxkcyBjb25zdGFudCB0aGF0IG1hdGNoZXMgZmllbGRJZCwgb3IgbnVsbCBpZiBpdHMgbm90IGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgX0ZpZWxkcyBmaW5kQnlUaHJpZnRJZChpbnQgZmllbGRJZCkgeworICAgICAgc3dpdGNoKGZpZWxkSWQpIHsKKyAgICAgICAgY2FzZSAxOiAvLyBUT1BPX0hJU1RPUlkKKyAgICAgICAgICByZXR1cm4gVE9QT19ISVNUT1JZOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgdGhlIF9GaWVsZHMgY29uc3RhbnQgdGhhdCBtYXRjaGVzIGZpZWxkSWQsIHRocm93aW5nIGFuIGV4Y2VwdGlvbgorICAgICAqIGlmIGl0IGlzIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIF9GaWVsZHMgZmluZEJ5VGhyaWZ0SWRPclRocm93KGludCBmaWVsZElkKSB7CisgICAgICBfRmllbGRzIGZpZWxkcyA9IGZpbmRCeVRocmlmdElkKGZpZWxkSWQpOworICAgICAgaWYgKGZpZWxkcyA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJGaWVsZCAiICsgZmllbGRJZCArICIgZG9lc24ndCBleGlzdCEiKTsKKyAgICAgIHJldHVybiBmaWVsZHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCB0aGUgX0ZpZWxkcyBjb25zdGFudCB0aGF0IG1hdGNoZXMgbmFtZSwgb3IgbnVsbCBpZiBpdHMgbm90IGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgX0ZpZWxkcyBmaW5kQnlOYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICByZXR1cm4gYnlOYW1lLmdldChuYW1lKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIHNob3J0IF90aHJpZnRJZDsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBfZmllbGROYW1lOworCisgICAgX0ZpZWxkcyhzaG9ydCB0aHJpZnRJZCwgU3RyaW5nIGZpZWxkTmFtZSkgeworICAgICAgX3RocmlmdElkID0gdGhyaWZ0SWQ7CisgICAgICBfZmllbGROYW1lID0gZmllbGROYW1lOworICAgIH0KKworICAgIHB1YmxpYyBzaG9ydCBnZXRUaHJpZnRGaWVsZElkKCkgeworICAgICAgcmV0dXJuIF90aHJpZnRJZDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEZpZWxkTmFtZSgpIHsKKyAgICAgIHJldHVybiBfZmllbGROYW1lOworICAgIH0KKyAgfQorCisgIC8vIGlzc2V0IGlkIGFzc2lnbm1lbnRzCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPiBtZXRhRGF0YU1hcDsKKyAgc3RhdGljIHsKKyAgICBNYXA8X0ZpZWxkcywgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGE+IHRtcE1hcCA9IG5ldyBFbnVtTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPihfRmllbGRzLmNsYXNzKTsKKyAgICB0bXBNYXAucHV0KF9GaWVsZHMuVE9QT19ISVNUT1JZLCBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEoInRvcG9faGlzdG9yeSIsIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZFJlcXVpcmVtZW50VHlwZS5SRVFVSVJFRCwgCisgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuTGlzdE1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkxJU1QsIAorICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5TdHJ1Y3RNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIExTVG9wb0hpc3RvcnkuY2xhc3MpKSkpOworICAgIG1ldGFEYXRhTWFwID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKHRtcE1hcCk7CisgICAgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEuYWRkU3RydWN0TWV0YURhdGFNYXAoTFNUb3BvSGlzdG9yeUxpc3QuY2xhc3MsIG1ldGFEYXRhTWFwKTsKKyAgfQorCisgIHB1YmxpYyBMU1RvcG9IaXN0b3J5TGlzdCgpIHsKKyAgfQorCisgIHB1YmxpYyBMU1RvcG9IaXN0b3J5TGlzdCgKKyAgICBMaXN0PExTVG9wb0hpc3Rvcnk+IHRvcG9faGlzdG9yeSkKKyAgeworICAgIHRoaXMoKTsKKyAgICB0aGlzLnRvcG9faGlzdG9yeSA9IHRvcG9faGlzdG9yeTsKKyAgfQorCisgIC8qKgorICAgKiBQZXJmb3JtcyBhIGRlZXAgY29weSBvbiA8aT5vdGhlcjwvaT4uCisgICAqLworICBwdWJsaWMgTFNUb3BvSGlzdG9yeUxpc3QoTFNUb3BvSGlzdG9yeUxpc3Qgb3RoZXIpIHsKKyAgICBpZiAob3RoZXIuaXNfc2V0X3RvcG9faGlzdG9yeSgpKSB7CisgICAgICBMaXN0PExTVG9wb0hpc3Rvcnk+IF9fdGhpc19fdG9wb19oaXN0b3J5ID0gbmV3IEFycmF5TGlzdDxMU1RvcG9IaXN0b3J5PihvdGhlci50b3BvX2hpc3Rvcnkuc2l6ZSgpKTsKKyAgICAgIGZvciAoTFNUb3BvSGlzdG9yeSBvdGhlcl9lbGVtZW50IDogb3RoZXIudG9wb19oaXN0b3J5KSB7CisgICAgICAgIF9fdGhpc19fdG9wb19oaXN0b3J5LmFkZChuZXcgTFNUb3BvSGlzdG9yeShvdGhlcl9lbGVtZW50KSk7CisgICAgICB9CisgICAgICB0aGlzLnRvcG9faGlzdG9yeSA9IF9fdGhpc19fdG9wb19oaXN0b3J5OworICAgIH0KKyAgfQorCisgIHB1YmxpYyBMU1RvcG9IaXN0b3J5TGlzdCBkZWVwQ29weSgpIHsKKyAgICByZXR1cm4gbmV3IExTVG9wb0hpc3RvcnlMaXN0KHRoaXMpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgIHRoaXMudG9wb19oaXN0b3J5ID0gbnVsbDsKKyAgfQorCisgIHB1YmxpYyBpbnQgZ2V0X3RvcG9faGlzdG9yeV9zaXplKCkgeworICAgIHJldHVybiAodGhpcy50b3BvX2hpc3RvcnkgPT0gbnVsbCkgPyAwIDogdGhpcy50b3BvX2hpc3Rvcnkuc2l6ZSgpOworICB9CisKKyAgcHVibGljIGphdmEudXRpbC5JdGVyYXRvcjxMU1RvcG9IaXN0b3J5PiBnZXRfdG9wb19oaXN0b3J5X2l0ZXJhdG9yKCkgeworICAgIHJldHVybiAodGhpcy50b3BvX2hpc3RvcnkgPT0gbnVsbCkgPyBudWxsIDogdGhpcy50b3BvX2hpc3RvcnkuaXRlcmF0b3IoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGFkZF90b190b3BvX2hpc3RvcnkoTFNUb3BvSGlzdG9yeSBlbGVtKSB7CisgICAgaWYgKHRoaXMudG9wb19oaXN0b3J5ID09IG51bGwpIHsKKyAgICAgIHRoaXMudG9wb19oaXN0b3J5ID0gbmV3IEFycmF5TGlzdDxMU1RvcG9IaXN0b3J5PigpOworICAgIH0KKyAgICB0aGlzLnRvcG9faGlzdG9yeS5hZGQoZWxlbSk7CisgIH0KKworICBwdWJsaWMgTGlzdDxMU1RvcG9IaXN0b3J5PiBnZXRfdG9wb19oaXN0b3J5KCkgeworICAgIHJldHVybiB0aGlzLnRvcG9faGlzdG9yeTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF90b3BvX2hpc3RvcnkoTGlzdDxMU1RvcG9IaXN0b3J5PiB0b3BvX2hpc3RvcnkpIHsKKyAgICB0aGlzLnRvcG9faGlzdG9yeSA9IHRvcG9faGlzdG9yeTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHVuc2V0X3RvcG9faGlzdG9yeSgpIHsKKyAgICB0aGlzLnRvcG9faGlzdG9yeSA9IG51bGw7CisgIH0KKworICAvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkIHRvcG9faGlzdG9yeSBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNfc2V0X3RvcG9faGlzdG9yeSgpIHsKKyAgICByZXR1cm4gdGhpcy50b3BvX2hpc3RvcnkgIT0gbnVsbDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF90b3BvX2hpc3RvcnlfaXNTZXQoYm9vbGVhbiB2YWx1ZSkgeworICAgIGlmICghdmFsdWUpIHsKKyAgICAgIHRoaXMudG9wb19oaXN0b3J5ID0gbnVsbDsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRGaWVsZFZhbHVlKF9GaWVsZHMgZmllbGQsIE9iamVjdCB2YWx1ZSkgeworICAgIHN3aXRjaCAoZmllbGQpIHsKKyAgICBjYXNlIFRPUE9fSElTVE9SWToKKyAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgIHVuc2V0X3RvcG9faGlzdG9yeSgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2V0X3RvcG9faGlzdG9yeSgoTGlzdDxMU1RvcG9IaXN0b3J5Pil2YWx1ZSk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIH0KKyAgfQorCisgIHB1YmxpYyBPYmplY3QgZ2V0RmllbGRWYWx1ZShfRmllbGRzIGZpZWxkKSB7CisgICAgc3dpdGNoIChmaWVsZCkgeworICAgIGNhc2UgVE9QT19ISVNUT1JZOgorICAgICAgcmV0dXJuIGdldF90b3BvX2hpc3RvcnkoKTsKKworICAgIH0KKyAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgIH0KKworICAvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkIGNvcnJlc3BvbmRpbmcgdG8gZmllbGRJRCBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNTZXQoX0ZpZWxkcyBmaWVsZCkgeworICAgIGlmIChmaWVsZCA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgc3dpdGNoIChmaWVsZCkgeworICAgIGNhc2UgVE9QT19ISVNUT1JZOgorICAgICAgcmV0dXJuIGlzX3NldF90b3BvX2hpc3RvcnkoKTsKKyAgICB9CisgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgdGhhdCkgeworICAgIGlmICh0aGF0ID09IG51bGwpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKHRoYXQgaW5zdGFuY2VvZiBMU1RvcG9IaXN0b3J5TGlzdCkKKyAgICAgIHJldHVybiB0aGlzLmVxdWFscygoTFNUb3BvSGlzdG9yeUxpc3QpdGhhdCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gZXF1YWxzKExTVG9wb0hpc3RvcnlMaXN0IHRoYXQpIHsKKyAgICBpZiAodGhhdCA9PSBudWxsKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgYm9vbGVhbiB0aGlzX3ByZXNlbnRfdG9wb19oaXN0b3J5ID0gdHJ1ZSAmJiB0aGlzLmlzX3NldF90b3BvX2hpc3RvcnkoKTsKKyAgICBib29sZWFuIHRoYXRfcHJlc2VudF90b3BvX2hpc3RvcnkgPSB0cnVlICYmIHRoYXQuaXNfc2V0X3RvcG9faGlzdG9yeSgpOworICAgIGlmICh0aGlzX3ByZXNlbnRfdG9wb19oaXN0b3J5IHx8IHRoYXRfcHJlc2VudF90b3BvX2hpc3RvcnkpIHsKKyAgICAgIGlmICghKHRoaXNfcHJlc2VudF90b3BvX2hpc3RvcnkgJiYgdGhhdF9wcmVzZW50X3RvcG9faGlzdG9yeSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGlmICghdGhpcy50b3BvX2hpc3RvcnkuZXF1YWxzKHRoYXQudG9wb19oaXN0b3J5KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgTGlzdDxPYmplY3Q+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKKworICAgIGJvb2xlYW4gcHJlc2VudF90b3BvX2hpc3RvcnkgPSB0cnVlICYmIChpc19zZXRfdG9wb19oaXN0b3J5KCkpOworICAgIGxpc3QuYWRkKHByZXNlbnRfdG9wb19oaXN0b3J5KTsKKyAgICBpZiAocHJlc2VudF90b3BvX2hpc3RvcnkpCisgICAgICBsaXN0LmFkZCh0b3BvX2hpc3RvcnkpOworCisgICAgcmV0dXJuIGxpc3QuaGFzaENvZGUoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGNvbXBhcmVUbyhMU1RvcG9IaXN0b3J5TGlzdCBvdGhlcikgeworICAgIGlmICghZ2V0Q2xhc3MoKS5lcXVhbHMob3RoZXIuZ2V0Q2xhc3MoKSkpIHsKKyAgICAgIHJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKS5jb21wYXJlVG8ob3RoZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgIH0KKworICAgIGludCBsYXN0Q29tcGFyaXNvbiA9IDA7CisKKyAgICBsYXN0Q29tcGFyaXNvbiA9IEJvb2xlYW4udmFsdWVPZihpc19zZXRfdG9wb19oaXN0b3J5KCkpLmNvbXBhcmVUbyhvdGhlci5pc19zZXRfdG9wb19oaXN0b3J5KCkpOworICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgfQorICAgIGlmIChpc19zZXRfdG9wb19oaXN0b3J5KCkpIHsKKyAgICAgIGxhc3RDb21wYXJpc29uID0gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29tcGFyZVRvKHRoaXMudG9wb19oaXN0b3J5LCBvdGhlci50b3BvX2hpc3RvcnkpOworICAgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHB1YmxpYyBfRmllbGRzIGZpZWxkRm9ySWQoaW50IGZpZWxkSWQpIHsKKyAgICByZXR1cm4gX0ZpZWxkcy5maW5kQnlUaHJpZnRJZChmaWVsZElkKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHJlYWQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIGlwcm90KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgc2NoZW1lcy5nZXQoaXByb3QuZ2V0U2NoZW1lKCkpLmdldFNjaGVtZSgpLnJlYWQoaXByb3QsIHRoaXMpOworICB9CisKKyAgcHVibGljIHZvaWQgd3JpdGUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIG9wcm90KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgc2NoZW1lcy5nZXQob3Byb3QuZ2V0U2NoZW1lKCkpLmdldFNjaGVtZSgpLndyaXRlKG9wcm90LCB0aGlzKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigiTFNUb3BvSGlzdG9yeUxpc3QoIik7CisgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7CisKKyAgICBzYi5hcHBlbmQoInRvcG9faGlzdG9yeToiKTsKKyAgICBpZiAodGhpcy50b3BvX2hpc3RvcnkgPT0gbnVsbCkgeworICAgICAgc2IuYXBwZW5kKCJudWxsIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHNiLmFwcGVuZCh0aGlzLnRvcG9faGlzdG9yeSk7CisgICAgfQorICAgIGZpcnN0ID0gZmFsc2U7CisgICAgc2IuYXBwZW5kKCIpIik7CisgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAvLyBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzCisgICAgaWYgKCFpc19zZXRfdG9wb19oaXN0b3J5KCkpIHsKKyAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xFeGNlcHRpb24oIlJlcXVpcmVkIGZpZWxkICd0b3BvX2hpc3RvcnknIGlzIHVuc2V0ISBTdHJ1Y3Q6IiArIHRvU3RyaW5nKCkpOworICAgIH0KKworICAgIC8vIGNoZWNrIGZvciBzdWItc3RydWN0IHZhbGlkaXR5CisgIH0KKworICBwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIHdyaXRlKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQ29tcGFjdFByb3RvY29sKG5ldyBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVElPU3RyZWFtVHJhbnNwb3J0KG91dCkpKTsKKyAgICB9IGNhdGNoIChvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHRlKSB7CisgICAgICB0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbih0ZSk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBpbikgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICByZWFkKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQ29tcGFjdFByb3RvY29sKG5ldyBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVElPU3RyZWFtVHJhbnNwb3J0KGluKSkpOworICAgIH0gY2F0Y2ggKG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24gdGUpIHsKKyAgICAgIHRocm93IG5ldyBqYXZhLmlvLklPRXhjZXB0aW9uKHRlKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBMU1RvcG9IaXN0b3J5TGlzdFN0YW5kYXJkU2NoZW1lRmFjdG9yeSBpbXBsZW1lbnRzIFNjaGVtZUZhY3RvcnkgeworICAgIHB1YmxpYyBMU1RvcG9IaXN0b3J5TGlzdFN0YW5kYXJkU2NoZW1lIGdldFNjaGVtZSgpIHsKKyAgICAgIHJldHVybiBuZXcgTFNUb3BvSGlzdG9yeUxpc3RTdGFuZGFyZFNjaGVtZSgpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIExTVG9wb0hpc3RvcnlMaXN0U3RhbmRhcmRTY2hlbWUgZXh0ZW5kcyBTdGFuZGFyZFNjaGVtZTxMU1RvcG9IaXN0b3J5TGlzdD4geworCisgICAgcHVibGljIHZvaWQgcmVhZChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgaXByb3QsIExTVG9wb0hpc3RvcnlMaXN0IHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIHNjaGVtZUZpZWxkOworICAgICAgaXByb3QucmVhZFN0cnVjdEJlZ2luKCk7CisgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgIHsKKyAgICAgICAgc2NoZW1lRmllbGQgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpOworICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVE9QKSB7IAorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoc2NoZW1lRmllbGQuaWQpIHsKKyAgICAgICAgICBjYXNlIDE6IC8vIFRPUE9fSElTVE9SWQorICAgICAgICAgICAgaWYgKHNjaGVtZUZpZWxkLnR5cGUgPT0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTElTVCkgeworICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVExpc3QgX2xpc3Q2ODAgPSBpcHJvdC5yZWFkTGlzdEJlZ2luKCk7CisgICAgICAgICAgICAgICAgc3RydWN0LnRvcG9faGlzdG9yeSA9IG5ldyBBcnJheUxpc3Q8TFNUb3BvSGlzdG9yeT4oX2xpc3Q2ODAuc2l6ZSk7CisgICAgICAgICAgICAgICAgTFNUb3BvSGlzdG9yeSBfZWxlbTY4MTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBfaTY4MiA9IDA7IF9pNjgyIDwgX2xpc3Q2ODAuc2l6ZTsgKytfaTY4MikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBfZWxlbTY4MSA9IG5ldyBMU1RvcG9IaXN0b3J5KCk7CisgICAgICAgICAgICAgICAgICBfZWxlbTY4MS5yZWFkKGlwcm90KTsKKyAgICAgICAgICAgICAgICAgIHN0cnVjdC50b3BvX2hpc3RvcnkuYWRkKF9lbGVtNjgxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaXByb3QucmVhZExpc3RFbmQoKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBzdHJ1Y3Quc2V0X3RvcG9faGlzdG9yeV9pc1NldCh0cnVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7IAorICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgc2NoZW1lRmllbGQudHlwZSk7CisgICAgICAgIH0KKyAgICAgICAgaXByb3QucmVhZEZpZWxkRW5kKCk7CisgICAgICB9CisgICAgICBpcHJvdC5yZWFkU3RydWN0RW5kKCk7CisgICAgICBzdHJ1Y3QudmFsaWRhdGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgb3Byb3QsIExTVG9wb0hpc3RvcnlMaXN0IHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgc3RydWN0LnZhbGlkYXRlKCk7CisKKyAgICAgIG9wcm90LndyaXRlU3RydWN0QmVnaW4oU1RSVUNUX0RFU0MpOworICAgICAgaWYgKHN0cnVjdC50b3BvX2hpc3RvcnkgIT0gbnVsbCkgeworICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oVE9QT19ISVNUT1JZX0ZJRUxEX0RFU0MpOworICAgICAgICB7CisgICAgICAgICAgb3Byb3Qud3JpdGVMaXN0QmVnaW4obmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRMaXN0KG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCwgc3RydWN0LnRvcG9faGlzdG9yeS5zaXplKCkpKTsKKyAgICAgICAgICBmb3IgKExTVG9wb0hpc3RvcnkgX2l0ZXI2ODMgOiBzdHJ1Y3QudG9wb19oaXN0b3J5KQorICAgICAgICAgIHsKKyAgICAgICAgICAgIF9pdGVyNjgzLndyaXRlKG9wcm90KTsKKyAgICAgICAgICB9CisgICAgICAgICAgb3Byb3Qud3JpdGVMaXN0RW5kKCk7CisgICAgICAgIH0KKyAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgICAgfQorICAgICAgb3Byb3Qud3JpdGVGaWVsZFN0b3AoKTsKKyAgICAgIG9wcm90LndyaXRlU3RydWN0RW5kKCk7CisgICAgfQorCisgIH0KKworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBMU1RvcG9IaXN0b3J5TGlzdFR1cGxlU2NoZW1lRmFjdG9yeSBpbXBsZW1lbnRzIFNjaGVtZUZhY3RvcnkgeworICAgIHB1YmxpYyBMU1RvcG9IaXN0b3J5TGlzdFR1cGxlU2NoZW1lIGdldFNjaGVtZSgpIHsKKyAgICAgIHJldHVybiBuZXcgTFNUb3BvSGlzdG9yeUxpc3RUdXBsZVNjaGVtZSgpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIExTVG9wb0hpc3RvcnlMaXN0VHVwbGVTY2hlbWUgZXh0ZW5kcyBUdXBsZVNjaGVtZTxMU1RvcG9IaXN0b3J5TGlzdD4geworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIHByb3QsIExTVG9wb0hpc3RvcnlMaXN0IHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgVFR1cGxlUHJvdG9jb2wgb3Byb3QgPSAoVFR1cGxlUHJvdG9jb2wpIHByb3Q7CisgICAgICB7CisgICAgICAgIG9wcm90LndyaXRlSTMyKHN0cnVjdC50b3BvX2hpc3Rvcnkuc2l6ZSgpKTsKKyAgICAgICAgZm9yIChMU1RvcG9IaXN0b3J5IF9pdGVyNjg0IDogc3RydWN0LnRvcG9faGlzdG9yeSkKKyAgICAgICAgeworICAgICAgICAgIF9pdGVyNjg0LndyaXRlKG9wcm90KTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlYWQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIHByb3QsIExTVG9wb0hpc3RvcnlMaXN0IHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgVFR1cGxlUHJvdG9jb2wgaXByb3QgPSAoVFR1cGxlUHJvdG9jb2wpIHByb3Q7CisgICAgICB7CisgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRMaXN0IF9saXN0Njg1ID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRMaXN0KG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCwgaXByb3QucmVhZEkzMigpKTsKKyAgICAgICAgc3RydWN0LnRvcG9faGlzdG9yeSA9IG5ldyBBcnJheUxpc3Q8TFNUb3BvSGlzdG9yeT4oX2xpc3Q2ODUuc2l6ZSk7CisgICAgICAgIExTVG9wb0hpc3RvcnkgX2VsZW02ODY7CisgICAgICAgIGZvciAoaW50IF9pNjg3ID0gMDsgX2k2ODcgPCBfbGlzdDY4NS5zaXplOyArK19pNjg3KQorICAgICAgICB7CisgICAgICAgICAgX2VsZW02ODYgPSBuZXcgTFNUb3BvSGlzdG9yeSgpOworICAgICAgICAgIF9lbGVtNjg2LnJlYWQoaXByb3QpOworICAgICAgICAgIHN0cnVjdC50b3BvX2hpc3RvcnkuYWRkKF9lbGVtNjg2KTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgc3RydWN0LnNldF90b3BvX2hpc3RvcnlfaXNTZXQodHJ1ZSk7CisgICAgfQorICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9MU1dvcmtlckhlYXJ0YmVhdC5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9MU1dvcmtlckhlYXJ0YmVhdC5qYXZhCmluZGV4IDk4NzI2Y2MuLmQ2ZTdjMzYgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvTFNXb3JrZXJIZWFydGJlYXQuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL0xTV29ya2VySGVhcnRiZWF0LmphdmEKQEAgLTE2LDcgKzE2LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAvKioKLSAqIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMikKKyAqIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMykKICAqCiAgKiBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HCiAgKiAgQGdlbmVyYXRlZApAQCAtNTEsNyArNTEsNyBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCiBAU3VwcHJlc3NXYXJuaW5ncyh7ImNhc3QiLCAicmF3dHlwZXMiLCAic2VyaWFsIiwgInVuY2hlY2tlZCJ9KQotQEdlbmVyYXRlZCh2YWx1ZSA9ICJBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjIpIiwgZGF0ZSA9ICIyMDE1LTktMyIpCitAR2VuZXJhdGVkKHZhbHVlID0gIkF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMykiKQogcHVibGljIGNsYXNzIExTV29ya2VySGVhcnRiZWF0IGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2U8TFNXb3JrZXJIZWFydGJlYXQsIExTV29ya2VySGVhcnRiZWF0Ll9GaWVsZHM+LCBqYXZhLmlvLlNlcmlhbGl6YWJsZSwgQ2xvbmVhYmxlLCBDb21wYXJhYmxlPExTV29ya2VySGVhcnRiZWF0PiB7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QgU1RSVUNUX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdCgiTFNXb3JrZXJIZWFydGJlYXQiKTsKIApAQCAtMzU0LDcgKzM1NCw3IEBACiAgIHB1YmxpYyBPYmplY3QgZ2V0RmllbGRWYWx1ZShfRmllbGRzIGZpZWxkKSB7CiAgICAgc3dpdGNoIChmaWVsZCkgewogICAgIGNhc2UgVElNRV9TRUNTOgotICAgICAgcmV0dXJuIEludGVnZXIudmFsdWVPZihnZXRfdGltZV9zZWNzKCkpOworICAgICAgcmV0dXJuIGdldF90aW1lX3NlY3MoKTsKIAogICAgIGNhc2UgVE9QT0xPR1lfSUQ6CiAgICAgICByZXR1cm4gZ2V0X3RvcG9sb2d5X2lkKCk7CkBAIC0zNjMsNyArMzYzLDcgQEAKICAgICAgIHJldHVybiBnZXRfZXhlY3V0b3JzKCk7CiAKICAgICBjYXNlIFBPUlQ6Ci0gICAgICByZXR1cm4gSW50ZWdlci52YWx1ZU9mKGdldF9wb3J0KCkpOworICAgICAgcmV0dXJuIGdldF9wb3J0KCk7CiAKICAgICB9CiAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwpAQCAtNjM4LDE0ICs2MzgsMTQgQEAKICAgICAgICAgICBjYXNlIDM6IC8vIEVYRUNVVE9SUwogICAgICAgICAgICAgaWYgKHNjaGVtZUZpZWxkLnR5cGUgPT0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTElTVCkgewogICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVExpc3QgX2xpc3Q1MDIgPSBpcHJvdC5yZWFkTGlzdEJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgc3RydWN0LmV4ZWN1dG9ycyA9IG5ldyBBcnJheUxpc3Q8RXhlY3V0b3JJbmZvPihfbGlzdDUwMi5zaXplKTsKLSAgICAgICAgICAgICAgICBFeGVjdXRvckluZm8gX2VsZW01MDM7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgX2k1MDQgPSAwOyBfaTUwNCA8IF9saXN0NTAyLnNpemU7ICsrX2k1MDQpCisgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVExpc3QgX2xpc3Q2NTYgPSBpcHJvdC5yZWFkTGlzdEJlZ2luKCk7CisgICAgICAgICAgICAgICAgc3RydWN0LmV4ZWN1dG9ycyA9IG5ldyBBcnJheUxpc3Q8RXhlY3V0b3JJbmZvPihfbGlzdDY1Ni5zaXplKTsKKyAgICAgICAgICAgICAgICBFeGVjdXRvckluZm8gX2VsZW02NTc7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgX2k2NTggPSAwOyBfaTY1OCA8IF9saXN0NjU2LnNpemU7ICsrX2k2NTgpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgX2VsZW01MDMgPSBuZXcgRXhlY3V0b3JJbmZvKCk7Ci0gICAgICAgICAgICAgICAgICBfZWxlbTUwMy5yZWFkKGlwcm90KTsKLSAgICAgICAgICAgICAgICAgIHN0cnVjdC5leGVjdXRvcnMuYWRkKF9lbGVtNTAzKTsKKyAgICAgICAgICAgICAgICAgIF9lbGVtNjU3ID0gbmV3IEV4ZWN1dG9ySW5mbygpOworICAgICAgICAgICAgICAgICAgX2VsZW02NTcucmVhZChpcHJvdCk7CisgICAgICAgICAgICAgICAgICBzdHJ1Y3QuZXhlY3V0b3JzLmFkZChfZWxlbTY1Nyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlwcm90LnJlYWRMaXN0RW5kKCk7CiAgICAgICAgICAgICAgIH0KQEAgLTY4Nyw5ICs2ODcsOSBAQAogICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oRVhFQ1VUT1JTX0ZJRUxEX0RFU0MpOwogICAgICAgICB7CiAgICAgICAgICAgb3Byb3Qud3JpdGVMaXN0QmVnaW4obmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRMaXN0KG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCwgc3RydWN0LmV4ZWN1dG9ycy5zaXplKCkpKTsKLSAgICAgICAgICBmb3IgKEV4ZWN1dG9ySW5mbyBfaXRlcjUwNSA6IHN0cnVjdC5leGVjdXRvcnMpCisgICAgICAgICAgZm9yIChFeGVjdXRvckluZm8gX2l0ZXI2NTkgOiBzdHJ1Y3QuZXhlY3V0b3JzKQogICAgICAgICAgIHsKLSAgICAgICAgICAgIF9pdGVyNTA1LndyaXRlKG9wcm90KTsKKyAgICAgICAgICAgIF9pdGVyNjU5LndyaXRlKG9wcm90KTsKICAgICAgICAgICB9CiAgICAgICAgICAgb3Byb3Qud3JpdGVMaXN0RW5kKCk7CiAgICAgICAgIH0KQEAgLTcxOSw5ICs3MTksOSBAQAogICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoc3RydWN0LnRvcG9sb2d5X2lkKTsKICAgICAgIHsKICAgICAgICAgb3Byb3Qud3JpdGVJMzIoc3RydWN0LmV4ZWN1dG9ycy5zaXplKCkpOwotICAgICAgICBmb3IgKEV4ZWN1dG9ySW5mbyBfaXRlcjUwNiA6IHN0cnVjdC5leGVjdXRvcnMpCisgICAgICAgIGZvciAoRXhlY3V0b3JJbmZvIF9pdGVyNjYwIDogc3RydWN0LmV4ZWN1dG9ycykKICAgICAgICAgewotICAgICAgICAgIF9pdGVyNTA2LndyaXRlKG9wcm90KTsKKyAgICAgICAgICBfaXRlcjY2MC53cml0ZShvcHJvdCk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICAgIG9wcm90LndyaXRlSTMyKHN0cnVjdC5wb3J0KTsKQEAgLTczNSwxNCArNzM1LDE0IEBACiAgICAgICBzdHJ1Y3QudG9wb2xvZ3lfaWQgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CiAgICAgICBzdHJ1Y3Quc2V0X3RvcG9sb2d5X2lkX2lzU2V0KHRydWUpOwogICAgICAgewotICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTGlzdCBfbGlzdDUwNyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTGlzdChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIGlwcm90LnJlYWRJMzIoKSk7Ci0gICAgICAgIHN0cnVjdC5leGVjdXRvcnMgPSBuZXcgQXJyYXlMaXN0PEV4ZWN1dG9ySW5mbz4oX2xpc3Q1MDcuc2l6ZSk7Ci0gICAgICAgIEV4ZWN1dG9ySW5mbyBfZWxlbTUwODsKLSAgICAgICAgZm9yIChpbnQgX2k1MDkgPSAwOyBfaTUwOSA8IF9saXN0NTA3LnNpemU7ICsrX2k1MDkpCisgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRMaXN0IF9saXN0NjYxID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRMaXN0KG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCwgaXByb3QucmVhZEkzMigpKTsKKyAgICAgICAgc3RydWN0LmV4ZWN1dG9ycyA9IG5ldyBBcnJheUxpc3Q8RXhlY3V0b3JJbmZvPihfbGlzdDY2MS5zaXplKTsKKyAgICAgICAgRXhlY3V0b3JJbmZvIF9lbGVtNjYyOworICAgICAgICBmb3IgKGludCBfaTY2MyA9IDA7IF9pNjYzIDwgX2xpc3Q2NjEuc2l6ZTsgKytfaTY2MykKICAgICAgICAgewotICAgICAgICAgIF9lbGVtNTA4ID0gbmV3IEV4ZWN1dG9ySW5mbygpOwotICAgICAgICAgIF9lbGVtNTA4LnJlYWQoaXByb3QpOwotICAgICAgICAgIHN0cnVjdC5leGVjdXRvcnMuYWRkKF9lbGVtNTA4KTsKKyAgICAgICAgICBfZWxlbTY2MiA9IG5ldyBFeGVjdXRvckluZm8oKTsKKyAgICAgICAgICBfZWxlbTY2Mi5yZWFkKGlwcm90KTsKKyAgICAgICAgICBzdHJ1Y3QuZXhlY3V0b3JzLmFkZChfZWxlbTY2Mik7CiAgICAgICAgIH0KICAgICAgIH0KICAgICAgIHN0cnVjdC5zZXRfZXhlY3V0b3JzX2lzU2V0KHRydWUpOwpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9Mb2NhbEFzc2lnbm1lbnQuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvTG9jYWxBc3NpZ25tZW50LmphdmEKaW5kZXggZDk4NWNiYS4uYTM2ZTY1NCAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9Mb2NhbEFzc2lnbm1lbnQuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL0xvY2FsQXNzaWdubWVudC5qYXZhCkBAIC0xNiw3ICsxNiw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogLyoqCi0gKiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjIpCisgKiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjMpCiAgKgogICogRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lORwogICogIEBnZW5lcmF0ZWQKQEAgLTUxLDEyICs1MSwxMyBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCiBAU3VwcHJlc3NXYXJuaW5ncyh7ImNhc3QiLCAicmF3dHlwZXMiLCAic2VyaWFsIiwgInVuY2hlY2tlZCJ9KQotQEdlbmVyYXRlZCh2YWx1ZSA9ICJBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjIpIiwgZGF0ZSA9ICIyMDE1LTktMyIpCitAR2VuZXJhdGVkKHZhbHVlID0gIkF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMykiKQogcHVibGljIGNsYXNzIExvY2FsQXNzaWdubWVudCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlPExvY2FsQXNzaWdubWVudCwgTG9jYWxBc3NpZ25tZW50Ll9GaWVsZHM+LCBqYXZhLmlvLlNlcmlhbGl6YWJsZSwgQ2xvbmVhYmxlLCBDb21wYXJhYmxlPExvY2FsQXNzaWdubWVudD4gewogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0IFNUUlVDVF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QoIkxvY2FsQXNzaWdubWVudCIpOwogCiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBUT1BPTE9HWV9JRF9GSUVMRF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCgidG9wb2xvZ3lfaWQiLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcsIChzaG9ydCkxKTsKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIEVYRUNVVE9SU19GSUVMRF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCgiZXhlY3V0b3JzIiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTElTVCwgKHNob3J0KTIpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgUkVTT1VSQ0VTX0ZJRUxEX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkKCJyZXNvdXJjZXMiLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIChzaG9ydCkzKTsKIAogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8Q2xhc3M8PyBleHRlbmRzIElTY2hlbWU+LCBTY2hlbWVGYWN0b3J5PiBzY2hlbWVzID0gbmV3IEhhc2hNYXA8Q2xhc3M8PyBleHRlbmRzIElTY2hlbWU+LCBTY2hlbWVGYWN0b3J5PigpOwogICBzdGF0aWMgewpAQCAtNjYsMTEgKzY3LDEzIEBACiAKICAgcHJpdmF0ZSBTdHJpbmcgdG9wb2xvZ3lfaWQ7IC8vIHJlcXVpcmVkCiAgIHByaXZhdGUgTGlzdDxFeGVjdXRvckluZm8+IGV4ZWN1dG9yczsgLy8gcmVxdWlyZWQKKyAgcHJpdmF0ZSBXb3JrZXJSZXNvdXJjZXMgcmVzb3VyY2VzOyAvLyBvcHRpb25hbAogCiAgIC8qKiBUaGUgc2V0IG9mIGZpZWxkcyB0aGlzIHN0cnVjdCBjb250YWlucywgYWxvbmcgd2l0aCBjb252ZW5pZW5jZSBtZXRob2RzIGZvciBmaW5kaW5nIGFuZCBtYW5pcHVsYXRpbmcgdGhlbS4gKi8KICAgcHVibGljIGVudW0gX0ZpZWxkcyBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZElkRW51bSB7CiAgICAgVE9QT0xPR1lfSUQoKHNob3J0KTEsICJ0b3BvbG9neV9pZCIpLAotICAgIEVYRUNVVE9SUygoc2hvcnQpMiwgImV4ZWN1dG9ycyIpOworICAgIEVYRUNVVE9SUygoc2hvcnQpMiwgImV4ZWN1dG9ycyIpLAorICAgIFJFU09VUkNFUygoc2hvcnQpMywgInJlc291cmNlcyIpOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgX0ZpZWxkcz4gYnlOYW1lID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBfRmllbGRzPigpOwogCkBAIC04OSw2ICs5Miw4IEBACiAgICAgICAgICAgcmV0dXJuIFRPUE9MT0dZX0lEOwogICAgICAgICBjYXNlIDI6IC8vIEVYRUNVVE9SUwogICAgICAgICAgIHJldHVybiBFWEVDVVRPUlM7CisgICAgICAgIGNhc2UgMzogLy8gUkVTT1VSQ0VTCisgICAgICAgICAgcmV0dXJuIFJFU09VUkNFUzsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgIH0KQEAgLTEyOSw2ICsxMzQsNyBAQAogICB9CiAKICAgLy8gaXNzZXQgaWQgYXNzaWdubWVudHMKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgX0ZpZWxkcyBvcHRpb25hbHNbXSA9IHtfRmllbGRzLlJFU09VUkNFU307CiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPiBtZXRhRGF0YU1hcDsKICAgc3RhdGljIHsKICAgICBNYXA8X0ZpZWxkcywgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGE+IHRtcE1hcCA9IG5ldyBFbnVtTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPihfRmllbGRzLmNsYXNzKTsKQEAgLTEzNyw2ICsxNDMsOCBAQAogICAgIHRtcE1hcC5wdXQoX0ZpZWxkcy5FWEVDVVRPUlMsIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YSgiZXhlY3V0b3JzIiwgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLlJFUVVJUkVELCAKICAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5MaXN0TWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTElTVCwgCiAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLlN0cnVjdE1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCwgRXhlY3V0b3JJbmZvLmNsYXNzKSkpKTsKKyAgICB0bXBNYXAucHV0KF9GaWVsZHMuUkVTT1VSQ0VTLCBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEoInJlc291cmNlcyIsIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZFJlcXVpcmVtZW50VHlwZS5PUFRJT05BTCwgCisgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuU3RydWN0TWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNULCBXb3JrZXJSZXNvdXJjZXMuY2xhc3MpKSk7CiAgICAgbWV0YURhdGFNYXAgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAodG1wTWFwKTsKICAgICBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YS5hZGRTdHJ1Y3RNZXRhRGF0YU1hcChMb2NhbEFzc2lnbm1lbnQuY2xhc3MsIG1ldGFEYXRhTWFwKTsKICAgfQpAQCAtMTY3LDYgKzE3NSw5IEBACiAgICAgICB9CiAgICAgICB0aGlzLmV4ZWN1dG9ycyA9IF9fdGhpc19fZXhlY3V0b3JzOwogICAgIH0KKyAgICBpZiAob3RoZXIuaXNfc2V0X3Jlc291cmNlcygpKSB7CisgICAgICB0aGlzLnJlc291cmNlcyA9IG5ldyBXb3JrZXJSZXNvdXJjZXMob3RoZXIucmVzb3VyY2VzKTsKKyAgICB9CiAgIH0KIAogICBwdWJsaWMgTG9jYWxBc3NpZ25tZW50IGRlZXBDb3B5KCkgewpAQCAtMTc3LDYgKzE4OCw3IEBACiAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewogICAgIHRoaXMudG9wb2xvZ3lfaWQgPSBudWxsOwogICAgIHRoaXMuZXhlY3V0b3JzID0gbnVsbDsKKyAgICB0aGlzLnJlc291cmNlcyA9IG51bGw7CiAgIH0KIAogICBwdWJsaWMgU3RyaW5nIGdldF90b3BvbG9neV9pZCgpIHsKQEAgLTI0MCw2ICsyNTIsMjkgQEAKICAgICB9CiAgIH0KIAorICBwdWJsaWMgV29ya2VyUmVzb3VyY2VzIGdldF9yZXNvdXJjZXMoKSB7CisgICAgcmV0dXJuIHRoaXMucmVzb3VyY2VzOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X3Jlc291cmNlcyhXb3JrZXJSZXNvdXJjZXMgcmVzb3VyY2VzKSB7CisgICAgdGhpcy5yZXNvdXJjZXMgPSByZXNvdXJjZXM7CisgIH0KKworICBwdWJsaWMgdm9pZCB1bnNldF9yZXNvdXJjZXMoKSB7CisgICAgdGhpcy5yZXNvdXJjZXMgPSBudWxsOworICB9CisKKyAgLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCByZXNvdXJjZXMgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgIHB1YmxpYyBib29sZWFuIGlzX3NldF9yZXNvdXJjZXMoKSB7CisgICAgcmV0dXJuIHRoaXMucmVzb3VyY2VzICE9IG51bGw7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfcmVzb3VyY2VzX2lzU2V0KGJvb2xlYW4gdmFsdWUpIHsKKyAgICBpZiAoIXZhbHVlKSB7CisgICAgICB0aGlzLnJlc291cmNlcyA9IG51bGw7CisgICAgfQorICB9CisKICAgcHVibGljIHZvaWQgc2V0RmllbGRWYWx1ZShfRmllbGRzIGZpZWxkLCBPYmplY3QgdmFsdWUpIHsKICAgICBzd2l0Y2ggKGZpZWxkKSB7CiAgICAgY2FzZSBUT1BPTE9HWV9JRDoKQEAgLTI1OCw2ICsyOTMsMTQgQEAKICAgICAgIH0KICAgICAgIGJyZWFrOwogCisgICAgY2FzZSBSRVNPVVJDRVM6CisgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICB1bnNldF9yZXNvdXJjZXMoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNldF9yZXNvdXJjZXMoKFdvcmtlclJlc291cmNlcyl2YWx1ZSk7CisgICAgICB9CisgICAgICBicmVhazsKKwogICAgIH0KICAgfQogCkBAIC0yNjksNiArMzEyLDkgQEAKICAgICBjYXNlIEVYRUNVVE9SUzoKICAgICAgIHJldHVybiBnZXRfZXhlY3V0b3JzKCk7CiAKKyAgICBjYXNlIFJFU09VUkNFUzoKKyAgICAgIHJldHVybiBnZXRfcmVzb3VyY2VzKCk7CisKICAgICB9CiAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwogICB9CkBAIC0yODQsNiArMzMwLDggQEAKICAgICAgIHJldHVybiBpc19zZXRfdG9wb2xvZ3lfaWQoKTsKICAgICBjYXNlIEVYRUNVVE9SUzoKICAgICAgIHJldHVybiBpc19zZXRfZXhlY3V0b3JzKCk7CisgICAgY2FzZSBSRVNPVVJDRVM6CisgICAgICByZXR1cm4gaXNfc2V0X3Jlc291cmNlcygpOwogICAgIH0KICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CiAgIH0KQEAgLTMxOSw2ICszNjcsMTUgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAorICAgIGJvb2xlYW4gdGhpc19wcmVzZW50X3Jlc291cmNlcyA9IHRydWUgJiYgdGhpcy5pc19zZXRfcmVzb3VyY2VzKCk7CisgICAgYm9vbGVhbiB0aGF0X3ByZXNlbnRfcmVzb3VyY2VzID0gdHJ1ZSAmJiB0aGF0LmlzX3NldF9yZXNvdXJjZXMoKTsKKyAgICBpZiAodGhpc19wcmVzZW50X3Jlc291cmNlcyB8fCB0aGF0X3ByZXNlbnRfcmVzb3VyY2VzKSB7CisgICAgICBpZiAoISh0aGlzX3ByZXNlbnRfcmVzb3VyY2VzICYmIHRoYXRfcHJlc2VudF9yZXNvdXJjZXMpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBpZiAoIXRoaXMucmVzb3VyY2VzLmVxdWFscyh0aGF0LnJlc291cmNlcykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKICAgICByZXR1cm4gdHJ1ZTsKICAgfQogCkBAIC0zMzYsNiArMzkzLDExIEBACiAgICAgaWYgKHByZXNlbnRfZXhlY3V0b3JzKQogICAgICAgbGlzdC5hZGQoZXhlY3V0b3JzKTsKIAorICAgIGJvb2xlYW4gcHJlc2VudF9yZXNvdXJjZXMgPSB0cnVlICYmIChpc19zZXRfcmVzb3VyY2VzKCkpOworICAgIGxpc3QuYWRkKHByZXNlbnRfcmVzb3VyY2VzKTsKKyAgICBpZiAocHJlc2VudF9yZXNvdXJjZXMpCisgICAgICBsaXN0LmFkZChyZXNvdXJjZXMpOworCiAgICAgcmV0dXJuIGxpc3QuaGFzaENvZGUoKTsKICAgfQogCkBAIC0zNjcsNiArNDI5LDE2IEBACiAgICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKICAgICAgIH0KICAgICB9CisgICAgbGFzdENvbXBhcmlzb24gPSBCb29sZWFuLnZhbHVlT2YoaXNfc2V0X3Jlc291cmNlcygpKS5jb21wYXJlVG8ob3RoZXIuaXNfc2V0X3Jlc291cmNlcygpKTsKKyAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgIH0KKyAgICBpZiAoaXNfc2V0X3Jlc291cmNlcygpKSB7CisgICAgICBsYXN0Q29tcGFyaXNvbiA9IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvbXBhcmVUbyh0aGlzLnJlc291cmNlcywgb3RoZXIucmVzb3VyY2VzKTsKKyAgICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICAgIH0KKyAgICB9CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtNDAyLDYgKzQ3NCwxNiBAQAogICAgICAgc2IuYXBwZW5kKHRoaXMuZXhlY3V0b3JzKTsKICAgICB9CiAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICBpZiAoaXNfc2V0X3Jlc291cmNlcygpKSB7CisgICAgICBpZiAoIWZpcnN0KSBzYi5hcHBlbmQoIiwgIik7CisgICAgICBzYi5hcHBlbmQoInJlc291cmNlczoiKTsKKyAgICAgIGlmICh0aGlzLnJlc291cmNlcyA9PSBudWxsKSB7CisgICAgICAgIHNiLmFwcGVuZCgibnVsbCIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2IuYXBwZW5kKHRoaXMucmVzb3VyY2VzKTsKKyAgICAgIH0KKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfQogICAgIHNiLmFwcGVuZCgiKSIpOwogICAgIHJldHVybiBzYi50b1N0cmluZygpOwogICB9CkBAIC00MTcsNiArNDk5LDkgQEAKICAgICB9CiAKICAgICAvLyBjaGVjayBmb3Igc3ViLXN0cnVjdCB2YWxpZGl0eQorICAgIGlmIChyZXNvdXJjZXMgIT0gbnVsbCkgeworICAgICAgcmVzb3VyY2VzLnZhbGlkYXRlKCk7CisgICAgfQogICB9CiAKICAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewpAQCAtNDY0LDE0ICs1NDksMTQgQEAKICAgICAgICAgICBjYXNlIDI6IC8vIEVYRUNVVE9SUwogICAgICAgICAgICAgaWYgKHNjaGVtZUZpZWxkLnR5cGUgPT0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTElTVCkgewogICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVExpc3QgX2xpc3Q0NzQgPSBpcHJvdC5yZWFkTGlzdEJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgc3RydWN0LmV4ZWN1dG9ycyA9IG5ldyBBcnJheUxpc3Q8RXhlY3V0b3JJbmZvPihfbGlzdDQ3NC5zaXplKTsKLSAgICAgICAgICAgICAgICBFeGVjdXRvckluZm8gX2VsZW00NzU7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgX2k0NzYgPSAwOyBfaTQ3NiA8IF9saXN0NDc0LnNpemU7ICsrX2k0NzYpCisgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVExpc3QgX2xpc3Q2MjggPSBpcHJvdC5yZWFkTGlzdEJlZ2luKCk7CisgICAgICAgICAgICAgICAgc3RydWN0LmV4ZWN1dG9ycyA9IG5ldyBBcnJheUxpc3Q8RXhlY3V0b3JJbmZvPihfbGlzdDYyOC5zaXplKTsKKyAgICAgICAgICAgICAgICBFeGVjdXRvckluZm8gX2VsZW02Mjk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgX2k2MzAgPSAwOyBfaTYzMCA8IF9saXN0NjI4LnNpemU7ICsrX2k2MzApCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgX2VsZW00NzUgPSBuZXcgRXhlY3V0b3JJbmZvKCk7Ci0gICAgICAgICAgICAgICAgICBfZWxlbTQ3NS5yZWFkKGlwcm90KTsKLSAgICAgICAgICAgICAgICAgIHN0cnVjdC5leGVjdXRvcnMuYWRkKF9lbGVtNDc1KTsKKyAgICAgICAgICAgICAgICAgIF9lbGVtNjI5ID0gbmV3IEV4ZWN1dG9ySW5mbygpOworICAgICAgICAgICAgICAgICAgX2VsZW02MjkucmVhZChpcHJvdCk7CisgICAgICAgICAgICAgICAgICBzdHJ1Y3QuZXhlY3V0b3JzLmFkZChfZWxlbTYyOSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlwcm90LnJlYWRMaXN0RW5kKCk7CiAgICAgICAgICAgICAgIH0KQEAgLTQ4MCw2ICs1NjUsMTUgQEAKICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMzogLy8gUkVTT1VSQ0VTCisgICAgICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QpIHsKKyAgICAgICAgICAgICAgc3RydWN0LnJlc291cmNlcyA9IG5ldyBXb3JrZXJSZXNvdXJjZXMoKTsKKyAgICAgICAgICAgICAgc3RydWN0LnJlc291cmNlcy5yZWFkKGlwcm90KTsKKyAgICAgICAgICAgICAgc3RydWN0LnNldF9yZXNvdXJjZXNfaXNTZXQodHJ1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeyAKKyAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOwogICAgICAgICB9CkBAIC01MDIsMTQgKzU5NiwyMSBAQAogICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oRVhFQ1VUT1JTX0ZJRUxEX0RFU0MpOwogICAgICAgICB7CiAgICAgICAgICAgb3Byb3Qud3JpdGVMaXN0QmVnaW4obmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRMaXN0KG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCwgc3RydWN0LmV4ZWN1dG9ycy5zaXplKCkpKTsKLSAgICAgICAgICBmb3IgKEV4ZWN1dG9ySW5mbyBfaXRlcjQ3NyA6IHN0cnVjdC5leGVjdXRvcnMpCisgICAgICAgICAgZm9yIChFeGVjdXRvckluZm8gX2l0ZXI2MzEgOiBzdHJ1Y3QuZXhlY3V0b3JzKQogICAgICAgICAgIHsKLSAgICAgICAgICAgIF9pdGVyNDc3LndyaXRlKG9wcm90KTsKKyAgICAgICAgICAgIF9pdGVyNjMxLndyaXRlKG9wcm90KTsKICAgICAgICAgICB9CiAgICAgICAgICAgb3Byb3Qud3JpdGVMaXN0RW5kKCk7CiAgICAgICAgIH0KICAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOwogICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5yZXNvdXJjZXMgIT0gbnVsbCkgeworICAgICAgICBpZiAoc3RydWN0LmlzX3NldF9yZXNvdXJjZXMoKSkgeworICAgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihSRVNPVVJDRVNfRklFTERfREVTQyk7CisgICAgICAgICAgc3RydWN0LnJlc291cmNlcy53cml0ZShvcHJvdCk7CisgICAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgICAgICB9CisgICAgICB9CiAgICAgICBvcHJvdC53cml0ZUZpZWxkU3RvcCgpOwogICAgICAgb3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsKICAgICB9CkBAIC01MzAsMTEgKzYzMSwxOSBAQAogICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoc3RydWN0LnRvcG9sb2d5X2lkKTsKICAgICAgIHsKICAgICAgICAgb3Byb3Qud3JpdGVJMzIoc3RydWN0LmV4ZWN1dG9ycy5zaXplKCkpOwotICAgICAgICBmb3IgKEV4ZWN1dG9ySW5mbyBfaXRlcjQ3OCA6IHN0cnVjdC5leGVjdXRvcnMpCisgICAgICAgIGZvciAoRXhlY3V0b3JJbmZvIF9pdGVyNjMyIDogc3RydWN0LmV4ZWN1dG9ycykKICAgICAgICAgewotICAgICAgICAgIF9pdGVyNDc4LndyaXRlKG9wcm90KTsKKyAgICAgICAgICBfaXRlcjYzMi53cml0ZShvcHJvdCk7CiAgICAgICAgIH0KICAgICAgIH0KKyAgICAgIEJpdFNldCBvcHRpb25hbHMgPSBuZXcgQml0U2V0KCk7CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9yZXNvdXJjZXMoKSkgeworICAgICAgICBvcHRpb25hbHMuc2V0KDApOworICAgICAgfQorICAgICAgb3Byb3Qud3JpdGVCaXRTZXQob3B0aW9uYWxzLCAxKTsKKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X3Jlc291cmNlcygpKSB7CisgICAgICAgIHN0cnVjdC5yZXNvdXJjZXMud3JpdGUob3Byb3QpOworICAgICAgfQogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtNTQzLDE3ICs2NTIsMjMgQEAKICAgICAgIHN0cnVjdC50b3BvbG9neV9pZCA9IGlwcm90LnJlYWRTdHJpbmcoKTsKICAgICAgIHN0cnVjdC5zZXRfdG9wb2xvZ3lfaWRfaXNTZXQodHJ1ZSk7CiAgICAgICB7Ci0gICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRMaXN0IF9saXN0NDc5ID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRMaXN0KG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCwgaXByb3QucmVhZEkzMigpKTsKLSAgICAgICAgc3RydWN0LmV4ZWN1dG9ycyA9IG5ldyBBcnJheUxpc3Q8RXhlY3V0b3JJbmZvPihfbGlzdDQ3OS5zaXplKTsKLSAgICAgICAgRXhlY3V0b3JJbmZvIF9lbGVtNDgwOwotICAgICAgICBmb3IgKGludCBfaTQ4MSA9IDA7IF9pNDgxIDwgX2xpc3Q0Nzkuc2l6ZTsgKytfaTQ4MSkKKyAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVExpc3QgX2xpc3Q2MzMgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVExpc3Qob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNULCBpcHJvdC5yZWFkSTMyKCkpOworICAgICAgICBzdHJ1Y3QuZXhlY3V0b3JzID0gbmV3IEFycmF5TGlzdDxFeGVjdXRvckluZm8+KF9saXN0NjMzLnNpemUpOworICAgICAgICBFeGVjdXRvckluZm8gX2VsZW02MzQ7CisgICAgICAgIGZvciAoaW50IF9pNjM1ID0gMDsgX2k2MzUgPCBfbGlzdDYzMy5zaXplOyArK19pNjM1KQogICAgICAgICB7Ci0gICAgICAgICAgX2VsZW00ODAgPSBuZXcgRXhlY3V0b3JJbmZvKCk7Ci0gICAgICAgICAgX2VsZW00ODAucmVhZChpcHJvdCk7Ci0gICAgICAgICAgc3RydWN0LmV4ZWN1dG9ycy5hZGQoX2VsZW00ODApOworICAgICAgICAgIF9lbGVtNjM0ID0gbmV3IEV4ZWN1dG9ySW5mbygpOworICAgICAgICAgIF9lbGVtNjM0LnJlYWQoaXByb3QpOworICAgICAgICAgIHN0cnVjdC5leGVjdXRvcnMuYWRkKF9lbGVtNjM0KTsKICAgICAgICAgfQogICAgICAgfQogICAgICAgc3RydWN0LnNldF9leGVjdXRvcnNfaXNTZXQodHJ1ZSk7CisgICAgICBCaXRTZXQgaW5jb21pbmcgPSBpcHJvdC5yZWFkQml0U2V0KDEpOworICAgICAgaWYgKGluY29taW5nLmdldCgwKSkgeworICAgICAgICBzdHJ1Y3QucmVzb3VyY2VzID0gbmV3IFdvcmtlclJlc291cmNlcygpOworICAgICAgICBzdHJ1Y3QucmVzb3VyY2VzLnJlYWQoaXByb3QpOworICAgICAgICBzdHJ1Y3Quc2V0X3Jlc291cmNlc19pc1NldCh0cnVlKTsKKyAgICAgIH0KICAgICB9CiAgIH0KIApkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9Mb2NhbFN0YXRlRGF0YS5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9Mb2NhbFN0YXRlRGF0YS5qYXZhCmluZGV4IDBjZTJkN2EuLjczNDA5MjYgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvTG9jYWxTdGF0ZURhdGEuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL0xvY2FsU3RhdGVEYXRhLmphdmEKQEAgLTE2LDcgKzE2LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAvKioKLSAqIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMikKKyAqIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMykKICAqCiAgKiBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HCiAgKiAgQGdlbmVyYXRlZApAQCAtNTEsNyArNTEsNyBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCiBAU3VwcHJlc3NXYXJuaW5ncyh7ImNhc3QiLCAicmF3dHlwZXMiLCAic2VyaWFsIiwgInVuY2hlY2tlZCJ9KQotQEdlbmVyYXRlZCh2YWx1ZSA9ICJBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjIpIiwgZGF0ZSA9ICIyMDE1LTktMyIpCitAR2VuZXJhdGVkKHZhbHVlID0gIkF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMykiKQogcHVibGljIGNsYXNzIExvY2FsU3RhdGVEYXRhIGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2U8TG9jYWxTdGF0ZURhdGEsIExvY2FsU3RhdGVEYXRhLl9GaWVsZHM+LCBqYXZhLmlvLlNlcmlhbGl6YWJsZSwgQ2xvbmVhYmxlLCBDb21wYXJhYmxlPExvY2FsU3RhdGVEYXRhPiB7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QgU1RSVUNUX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdCgiTG9jYWxTdGF0ZURhdGEiKTsKIApAQCAtMzc2LDE2ICszNzYsMTYgQEAKICAgICAgICAgICBjYXNlIDE6IC8vIFNFUklBTElaRURfUEFSVFMKICAgICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLk1BUCkgewogICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwNDY0ID0gaXByb3QucmVhZE1hcEJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgc3RydWN0LnNlcmlhbGl6ZWRfcGFydHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsVGhyaWZ0U2VyaWFsaXplZE9iamVjdD4oMipfbWFwNDY0LnNpemUpOwotICAgICAgICAgICAgICAgIFN0cmluZyBfa2V5NDY1OwotICAgICAgICAgICAgICAgIFRocmlmdFNlcmlhbGl6ZWRPYmplY3QgX3ZhbDQ2NjsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBfaTQ2NyA9IDA7IF9pNDY3IDwgX21hcDQ2NC5zaXplOyArK19pNDY3KQorICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgX21hcDYxOCA9IGlwcm90LnJlYWRNYXBCZWdpbigpOworICAgICAgICAgICAgICAgIHN0cnVjdC5zZXJpYWxpemVkX3BhcnRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLFRocmlmdFNlcmlhbGl6ZWRPYmplY3Q+KDIqX21hcDYxOC5zaXplKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgX2tleTYxOTsKKyAgICAgICAgICAgICAgICBUaHJpZnRTZXJpYWxpemVkT2JqZWN0IF92YWw2MjA7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgX2k2MjEgPSAwOyBfaTYyMSA8IF9tYXA2MTguc2l6ZTsgKytfaTYyMSkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBfa2V5NDY1ID0gaXByb3QucmVhZFN0cmluZygpOwotICAgICAgICAgICAgICAgICAgX3ZhbDQ2NiA9IG5ldyBUaHJpZnRTZXJpYWxpemVkT2JqZWN0KCk7Ci0gICAgICAgICAgICAgICAgICBfdmFsNDY2LnJlYWQoaXByb3QpOwotICAgICAgICAgICAgICAgICAgc3RydWN0LnNlcmlhbGl6ZWRfcGFydHMucHV0KF9rZXk0NjUsIF92YWw0NjYpOworICAgICAgICAgICAgICAgICAgX2tleTYxOSA9IGlwcm90LnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgIF92YWw2MjAgPSBuZXcgVGhyaWZ0U2VyaWFsaXplZE9iamVjdCgpOworICAgICAgICAgICAgICAgICAgX3ZhbDYyMC5yZWFkKGlwcm90KTsKKyAgICAgICAgICAgICAgICAgIHN0cnVjdC5zZXJpYWxpemVkX3BhcnRzLnB1dChfa2V5NjE5LCBfdmFsNjIwKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaXByb3QucmVhZE1hcEVuZCgpOwogICAgICAgICAgICAgICB9CkBAIC00MTEsMTAgKzQxMSwxMCBAQAogICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oU0VSSUFMSVpFRF9QQVJUU19GSUVMRF9ERVNDKTsKICAgICAgICAgewogICAgICAgICAgIG9wcm90LndyaXRlTWFwQmVnaW4obmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIHN0cnVjdC5zZXJpYWxpemVkX3BhcnRzLnNpemUoKSkpOwotICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgVGhyaWZ0U2VyaWFsaXplZE9iamVjdD4gX2l0ZXI0NjggOiBzdHJ1Y3Quc2VyaWFsaXplZF9wYXJ0cy5lbnRyeVNldCgpKQorICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgVGhyaWZ0U2VyaWFsaXplZE9iamVjdD4gX2l0ZXI2MjIgOiBzdHJ1Y3Quc2VyaWFsaXplZF9wYXJ0cy5lbnRyeVNldCgpKQogICAgICAgICAgIHsKLSAgICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKF9pdGVyNDY4LmdldEtleSgpKTsKLSAgICAgICAgICAgIF9pdGVyNDY4LmdldFZhbHVlKCkud3JpdGUob3Byb3QpOworICAgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoX2l0ZXI2MjIuZ2V0S2V5KCkpOworICAgICAgICAgICAgX2l0ZXI2MjIuZ2V0VmFsdWUoKS53cml0ZShvcHJvdCk7CiAgICAgICAgICAgfQogICAgICAgICAgIG9wcm90LndyaXRlTWFwRW5kKCk7CiAgICAgICAgIH0KQEAgLTQzOSwxMCArNDM5LDEwIEBACiAgICAgICBUVHVwbGVQcm90b2NvbCBvcHJvdCA9IChUVHVwbGVQcm90b2NvbCkgcHJvdDsKICAgICAgIHsKICAgICAgICAgb3Byb3Qud3JpdGVJMzIoc3RydWN0LnNlcmlhbGl6ZWRfcGFydHMuc2l6ZSgpKTsKLSAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBUaHJpZnRTZXJpYWxpemVkT2JqZWN0PiBfaXRlcjQ2OSA6IHN0cnVjdC5zZXJpYWxpemVkX3BhcnRzLmVudHJ5U2V0KCkpCisgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgVGhyaWZ0U2VyaWFsaXplZE9iamVjdD4gX2l0ZXI2MjMgOiBzdHJ1Y3Quc2VyaWFsaXplZF9wYXJ0cy5lbnRyeVNldCgpKQogICAgICAgICB7Ci0gICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoX2l0ZXI0NjkuZ2V0S2V5KCkpOwotICAgICAgICAgIF9pdGVyNDY5LmdldFZhbHVlKCkud3JpdGUob3Byb3QpOworICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKF9pdGVyNjIzLmdldEtleSgpKTsKKyAgICAgICAgICBfaXRlcjYyMy5nZXRWYWx1ZSgpLndyaXRlKG9wcm90KTsKICAgICAgICAgfQogICAgICAgfQogICAgIH0KQEAgLTQ1MSwxNiArNDUxLDE2IEBACiAgICAgcHVibGljIHZvaWQgcmVhZChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgcHJvdCwgTG9jYWxTdGF0ZURhdGEgc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CiAgICAgICBUVHVwbGVQcm90b2NvbCBpcHJvdCA9IChUVHVwbGVQcm90b2NvbCkgcHJvdDsKICAgICAgIHsKLSAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwNDcwID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIGlwcm90LnJlYWRJMzIoKSk7Ci0gICAgICAgIHN0cnVjdC5zZXJpYWxpemVkX3BhcnRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLFRocmlmdFNlcmlhbGl6ZWRPYmplY3Q+KDIqX21hcDQ3MC5zaXplKTsKLSAgICAgICAgU3RyaW5nIF9rZXk0NzE7Ci0gICAgICAgIFRocmlmdFNlcmlhbGl6ZWRPYmplY3QgX3ZhbDQ3MjsKLSAgICAgICAgZm9yIChpbnQgX2k0NzMgPSAwOyBfaTQ3MyA8IF9tYXA0NzAuc2l6ZTsgKytfaTQ3MykKKyAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwNjI0ID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIGlwcm90LnJlYWRJMzIoKSk7CisgICAgICAgIHN0cnVjdC5zZXJpYWxpemVkX3BhcnRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLFRocmlmdFNlcmlhbGl6ZWRPYmplY3Q+KDIqX21hcDYyNC5zaXplKTsKKyAgICAgICAgU3RyaW5nIF9rZXk2MjU7CisgICAgICAgIFRocmlmdFNlcmlhbGl6ZWRPYmplY3QgX3ZhbDYyNjsKKyAgICAgICAgZm9yIChpbnQgX2k2MjcgPSAwOyBfaTYyNyA8IF9tYXA2MjQuc2l6ZTsgKytfaTYyNykKICAgICAgICAgewotICAgICAgICAgIF9rZXk0NzEgPSBpcHJvdC5yZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgX3ZhbDQ3MiA9IG5ldyBUaHJpZnRTZXJpYWxpemVkT2JqZWN0KCk7Ci0gICAgICAgICAgX3ZhbDQ3Mi5yZWFkKGlwcm90KTsKLSAgICAgICAgICBzdHJ1Y3Quc2VyaWFsaXplZF9wYXJ0cy5wdXQoX2tleTQ3MSwgX3ZhbDQ3Mik7CisgICAgICAgICAgX2tleTYyNSA9IGlwcm90LnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICBfdmFsNjI2ID0gbmV3IFRocmlmdFNlcmlhbGl6ZWRPYmplY3QoKTsKKyAgICAgICAgICBfdmFsNjI2LnJlYWQoaXByb3QpOworICAgICAgICAgIHN0cnVjdC5zZXJpYWxpemVkX3BhcnRzLnB1dChfa2V5NjI1LCBfdmFsNjI2KTsKICAgICAgICAgfQogICAgICAgfQogICAgICAgc3RydWN0LnNldF9zZXJpYWxpemVkX3BhcnRzX2lzU2V0KHRydWUpOwpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9Mb2dDb25maWcuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvTG9nQ29uZmlnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNiYzMyNgotLS0gL2Rldi9udWxsCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvTG9nQ29uZmlnLmphdmEKQEAgLTAsMCArMSw0NzUgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisvKioKKyAqIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMykKKyAqCisgKiBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HCisgKiAgQGdlbmVyYXRlZAorICovCitwYWNrYWdlIGJhY2t0eXBlLnN0b3JtLmdlbmVyYXRlZDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5JU2NoZW1lOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5TY2hlbWVGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5TdGFuZGFyZFNjaGVtZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5UdXBsZVNjaGVtZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHVwbGVQcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuRW5jb2RpbmdVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLkFzeW5jTWV0aG9kQ2FsbGJhY2s7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLkFic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXIuKjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkVudW1NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bVNldDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkJpdFNldDsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQ7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworQFN1cHByZXNzV2FybmluZ3MoeyJjYXN0IiwgInJhd3R5cGVzIiwgInNlcmlhbCIsICJ1bmNoZWNrZWQifSkKK0BHZW5lcmF0ZWQodmFsdWUgPSAiQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4zKSIpCitwdWJsaWMgY2xhc3MgTG9nQ29uZmlnIGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2U8TG9nQ29uZmlnLCBMb2dDb25maWcuX0ZpZWxkcz4sIGphdmEuaW8uU2VyaWFsaXphYmxlLCBDbG9uZWFibGUsIENvbXBhcmFibGU8TG9nQ29uZmlnPiB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QgU1RSVUNUX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdCgiTG9nQ29uZmlnIik7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIE5BTUVEX0xPR0dFUl9MRVZFTF9GSUVMRF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCgibmFtZWRfbG9nZ2VyX2xldmVsIiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTUFQLCAoc2hvcnQpMik7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPENsYXNzPD8gZXh0ZW5kcyBJU2NoZW1lPiwgU2NoZW1lRmFjdG9yeT4gc2NoZW1lcyA9IG5ldyBIYXNoTWFwPENsYXNzPD8gZXh0ZW5kcyBJU2NoZW1lPiwgU2NoZW1lRmFjdG9yeT4oKTsKKyAgc3RhdGljIHsKKyAgICBzY2hlbWVzLnB1dChTdGFuZGFyZFNjaGVtZS5jbGFzcywgbmV3IExvZ0NvbmZpZ1N0YW5kYXJkU2NoZW1lRmFjdG9yeSgpKTsKKyAgICBzY2hlbWVzLnB1dChUdXBsZVNjaGVtZS5jbGFzcywgbmV3IExvZ0NvbmZpZ1R1cGxlU2NoZW1lRmFjdG9yeSgpKTsKKyAgfQorCisgIHByaXZhdGUgTWFwPFN0cmluZyxMb2dMZXZlbD4gbmFtZWRfbG9nZ2VyX2xldmVsOyAvLyBvcHRpb25hbAorCisgIC8qKiBUaGUgc2V0IG9mIGZpZWxkcyB0aGlzIHN0cnVjdCBjb250YWlucywgYWxvbmcgd2l0aCBjb252ZW5pZW5jZSBtZXRob2RzIGZvciBmaW5kaW5nIGFuZCBtYW5pcHVsYXRpbmcgdGhlbS4gKi8KKyAgcHVibGljIGVudW0gX0ZpZWxkcyBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZElkRW51bSB7CisgICAgTkFNRURfTE9HR0VSX0xFVkVMKChzaG9ydCkyLCAibmFtZWRfbG9nZ2VyX2xldmVsIik7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBfRmllbGRzPiBieU5hbWUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIF9GaWVsZHM+KCk7CisKKyAgICBzdGF0aWMgeworICAgICAgZm9yIChfRmllbGRzIGZpZWxkIDogRW51bVNldC5hbGxPZihfRmllbGRzLmNsYXNzKSkgeworICAgICAgICBieU5hbWUucHV0KGZpZWxkLmdldEZpZWxkTmFtZSgpLCBmaWVsZCk7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCB0aGUgX0ZpZWxkcyBjb25zdGFudCB0aGF0IG1hdGNoZXMgZmllbGRJZCwgb3IgbnVsbCBpZiBpdHMgbm90IGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgX0ZpZWxkcyBmaW5kQnlUaHJpZnRJZChpbnQgZmllbGRJZCkgeworICAgICAgc3dpdGNoKGZpZWxkSWQpIHsKKyAgICAgICAgY2FzZSAyOiAvLyBOQU1FRF9MT0dHRVJfTEVWRUwKKyAgICAgICAgICByZXR1cm4gTkFNRURfTE9HR0VSX0xFVkVMOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgdGhlIF9GaWVsZHMgY29uc3RhbnQgdGhhdCBtYXRjaGVzIGZpZWxkSWQsIHRocm93aW5nIGFuIGV4Y2VwdGlvbgorICAgICAqIGlmIGl0IGlzIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIF9GaWVsZHMgZmluZEJ5VGhyaWZ0SWRPclRocm93KGludCBmaWVsZElkKSB7CisgICAgICBfRmllbGRzIGZpZWxkcyA9IGZpbmRCeVRocmlmdElkKGZpZWxkSWQpOworICAgICAgaWYgKGZpZWxkcyA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJGaWVsZCAiICsgZmllbGRJZCArICIgZG9lc24ndCBleGlzdCEiKTsKKyAgICAgIHJldHVybiBmaWVsZHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCB0aGUgX0ZpZWxkcyBjb25zdGFudCB0aGF0IG1hdGNoZXMgbmFtZSwgb3IgbnVsbCBpZiBpdHMgbm90IGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgX0ZpZWxkcyBmaW5kQnlOYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICByZXR1cm4gYnlOYW1lLmdldChuYW1lKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIHNob3J0IF90aHJpZnRJZDsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBfZmllbGROYW1lOworCisgICAgX0ZpZWxkcyhzaG9ydCB0aHJpZnRJZCwgU3RyaW5nIGZpZWxkTmFtZSkgeworICAgICAgX3RocmlmdElkID0gdGhyaWZ0SWQ7CisgICAgICBfZmllbGROYW1lID0gZmllbGROYW1lOworICAgIH0KKworICAgIHB1YmxpYyBzaG9ydCBnZXRUaHJpZnRGaWVsZElkKCkgeworICAgICAgcmV0dXJuIF90aHJpZnRJZDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEZpZWxkTmFtZSgpIHsKKyAgICAgIHJldHVybiBfZmllbGROYW1lOworICAgIH0KKyAgfQorCisgIC8vIGlzc2V0IGlkIGFzc2lnbm1lbnRzCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIF9GaWVsZHMgb3B0aW9uYWxzW10gPSB7X0ZpZWxkcy5OQU1FRF9MT0dHRVJfTEVWRUx9OworICBwdWJsaWMgc3RhdGljIGZpbmFsIE1hcDxfRmllbGRzLCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YT4gbWV0YURhdGFNYXA7CisgIHN0YXRpYyB7CisgICAgTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPiB0bXBNYXAgPSBuZXcgRW51bU1hcDxfRmllbGRzLCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YT4oX0ZpZWxkcy5jbGFzcyk7CisgICAgdG1wTWFwLnB1dChfRmllbGRzLk5BTUVEX0xPR0dFUl9MRVZFTCwgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhKCJuYW1lZF9sb2dnZXJfbGV2ZWwiLCBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRSZXF1aXJlbWVudFR5cGUuT1BUSU9OQUwsIAorICAgICAgICBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLk1hcE1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLk1BUCwgCisgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkVmFsdWVNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcpLCAKKyAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuU3RydWN0TWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNULCBMb2dMZXZlbC5jbGFzcykpKSk7CisgICAgbWV0YURhdGFNYXAgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAodG1wTWFwKTsKKyAgICBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YS5hZGRTdHJ1Y3RNZXRhRGF0YU1hcChMb2dDb25maWcuY2xhc3MsIG1ldGFEYXRhTWFwKTsKKyAgfQorCisgIHB1YmxpYyBMb2dDb25maWcoKSB7CisgIH0KKworICAvKioKKyAgICogUGVyZm9ybXMgYSBkZWVwIGNvcHkgb24gPGk+b3RoZXI8L2k+LgorICAgKi8KKyAgcHVibGljIExvZ0NvbmZpZyhMb2dDb25maWcgb3RoZXIpIHsKKyAgICBpZiAob3RoZXIuaXNfc2V0X25hbWVkX2xvZ2dlcl9sZXZlbCgpKSB7CisgICAgICBNYXA8U3RyaW5nLExvZ0xldmVsPiBfX3RoaXNfX25hbWVkX2xvZ2dlcl9sZXZlbCA9IG5ldyBIYXNoTWFwPFN0cmluZyxMb2dMZXZlbD4ob3RoZXIubmFtZWRfbG9nZ2VyX2xldmVsLnNpemUoKSk7CisgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIExvZ0xldmVsPiBvdGhlcl9lbGVtZW50IDogb3RoZXIubmFtZWRfbG9nZ2VyX2xldmVsLmVudHJ5U2V0KCkpIHsKKworICAgICAgICBTdHJpbmcgb3RoZXJfZWxlbWVudF9rZXkgPSBvdGhlcl9lbGVtZW50LmdldEtleSgpOworICAgICAgICBMb2dMZXZlbCBvdGhlcl9lbGVtZW50X3ZhbHVlID0gb3RoZXJfZWxlbWVudC5nZXRWYWx1ZSgpOworCisgICAgICAgIFN0cmluZyBfX3RoaXNfX25hbWVkX2xvZ2dlcl9sZXZlbF9jb3B5X2tleSA9IG90aGVyX2VsZW1lbnRfa2V5OworCisgICAgICAgIExvZ0xldmVsIF9fdGhpc19fbmFtZWRfbG9nZ2VyX2xldmVsX2NvcHlfdmFsdWUgPSBuZXcgTG9nTGV2ZWwob3RoZXJfZWxlbWVudF92YWx1ZSk7CisKKyAgICAgICAgX190aGlzX19uYW1lZF9sb2dnZXJfbGV2ZWwucHV0KF9fdGhpc19fbmFtZWRfbG9nZ2VyX2xldmVsX2NvcHlfa2V5LCBfX3RoaXNfX25hbWVkX2xvZ2dlcl9sZXZlbF9jb3B5X3ZhbHVlKTsKKyAgICAgIH0KKyAgICAgIHRoaXMubmFtZWRfbG9nZ2VyX2xldmVsID0gX190aGlzX19uYW1lZF9sb2dnZXJfbGV2ZWw7CisgICAgfQorICB9CisKKyAgcHVibGljIExvZ0NvbmZpZyBkZWVwQ29weSgpIHsKKyAgICByZXR1cm4gbmV3IExvZ0NvbmZpZyh0aGlzKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICB0aGlzLm5hbWVkX2xvZ2dlcl9sZXZlbCA9IG51bGw7CisgIH0KKworICBwdWJsaWMgaW50IGdldF9uYW1lZF9sb2dnZXJfbGV2ZWxfc2l6ZSgpIHsKKyAgICByZXR1cm4gKHRoaXMubmFtZWRfbG9nZ2VyX2xldmVsID09IG51bGwpID8gMCA6IHRoaXMubmFtZWRfbG9nZ2VyX2xldmVsLnNpemUoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHB1dF90b19uYW1lZF9sb2dnZXJfbGV2ZWwoU3RyaW5nIGtleSwgTG9nTGV2ZWwgdmFsKSB7CisgICAgaWYgKHRoaXMubmFtZWRfbG9nZ2VyX2xldmVsID09IG51bGwpIHsKKyAgICAgIHRoaXMubmFtZWRfbG9nZ2VyX2xldmVsID0gbmV3IEhhc2hNYXA8U3RyaW5nLExvZ0xldmVsPigpOworICAgIH0KKyAgICB0aGlzLm5hbWVkX2xvZ2dlcl9sZXZlbC5wdXQoa2V5LCB2YWwpOworICB9CisKKyAgcHVibGljIE1hcDxTdHJpbmcsTG9nTGV2ZWw+IGdldF9uYW1lZF9sb2dnZXJfbGV2ZWwoKSB7CisgICAgcmV0dXJuIHRoaXMubmFtZWRfbG9nZ2VyX2xldmVsOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X25hbWVkX2xvZ2dlcl9sZXZlbChNYXA8U3RyaW5nLExvZ0xldmVsPiBuYW1lZF9sb2dnZXJfbGV2ZWwpIHsKKyAgICB0aGlzLm5hbWVkX2xvZ2dlcl9sZXZlbCA9IG5hbWVkX2xvZ2dlcl9sZXZlbDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHVuc2V0X25hbWVkX2xvZ2dlcl9sZXZlbCgpIHsKKyAgICB0aGlzLm5hbWVkX2xvZ2dlcl9sZXZlbCA9IG51bGw7CisgIH0KKworICAvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkIG5hbWVkX2xvZ2dlcl9sZXZlbCBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNfc2V0X25hbWVkX2xvZ2dlcl9sZXZlbCgpIHsKKyAgICByZXR1cm4gdGhpcy5uYW1lZF9sb2dnZXJfbGV2ZWwgIT0gbnVsbDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF9uYW1lZF9sb2dnZXJfbGV2ZWxfaXNTZXQoYm9vbGVhbiB2YWx1ZSkgeworICAgIGlmICghdmFsdWUpIHsKKyAgICAgIHRoaXMubmFtZWRfbG9nZ2VyX2xldmVsID0gbnVsbDsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRGaWVsZFZhbHVlKF9GaWVsZHMgZmllbGQsIE9iamVjdCB2YWx1ZSkgeworICAgIHN3aXRjaCAoZmllbGQpIHsKKyAgICBjYXNlIE5BTUVEX0xPR0dFUl9MRVZFTDoKKyAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgIHVuc2V0X25hbWVkX2xvZ2dlcl9sZXZlbCgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2V0X25hbWVkX2xvZ2dlcl9sZXZlbCgoTWFwPFN0cmluZyxMb2dMZXZlbD4pdmFsdWUpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICB9CisgIH0KKworICBwdWJsaWMgT2JqZWN0IGdldEZpZWxkVmFsdWUoX0ZpZWxkcyBmaWVsZCkgeworICAgIHN3aXRjaCAoZmllbGQpIHsKKyAgICBjYXNlIE5BTUVEX0xPR0dFUl9MRVZFTDoKKyAgICAgIHJldHVybiBnZXRfbmFtZWRfbG9nZ2VyX2xldmVsKCk7CisKKyAgICB9CisgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICB9CisKKyAgLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBjb3JyZXNwb25kaW5nIHRvIGZpZWxkSUQgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgIHB1YmxpYyBib29sZWFuIGlzU2V0KF9GaWVsZHMgZmllbGQpIHsKKyAgICBpZiAoZmllbGQgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHN3aXRjaCAoZmllbGQpIHsKKyAgICBjYXNlIE5BTUVEX0xPR0dFUl9MRVZFTDoKKyAgICAgIHJldHVybiBpc19zZXRfbmFtZWRfbG9nZ2VyX2xldmVsKCk7CisgICAgfQorICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IHRoYXQpIHsKKyAgICBpZiAodGhhdCA9PSBudWxsKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmICh0aGF0IGluc3RhbmNlb2YgTG9nQ29uZmlnKQorICAgICAgcmV0dXJuIHRoaXMuZXF1YWxzKChMb2dDb25maWcpdGhhdCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gZXF1YWxzKExvZ0NvbmZpZyB0aGF0KSB7CisgICAgaWYgKHRoYXQgPT0gbnVsbCkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGJvb2xlYW4gdGhpc19wcmVzZW50X25hbWVkX2xvZ2dlcl9sZXZlbCA9IHRydWUgJiYgdGhpcy5pc19zZXRfbmFtZWRfbG9nZ2VyX2xldmVsKCk7CisgICAgYm9vbGVhbiB0aGF0X3ByZXNlbnRfbmFtZWRfbG9nZ2VyX2xldmVsID0gdHJ1ZSAmJiB0aGF0LmlzX3NldF9uYW1lZF9sb2dnZXJfbGV2ZWwoKTsKKyAgICBpZiAodGhpc19wcmVzZW50X25hbWVkX2xvZ2dlcl9sZXZlbCB8fCB0aGF0X3ByZXNlbnRfbmFtZWRfbG9nZ2VyX2xldmVsKSB7CisgICAgICBpZiAoISh0aGlzX3ByZXNlbnRfbmFtZWRfbG9nZ2VyX2xldmVsICYmIHRoYXRfcHJlc2VudF9uYW1lZF9sb2dnZXJfbGV2ZWwpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBpZiAoIXRoaXMubmFtZWRfbG9nZ2VyX2xldmVsLmVxdWFscyh0aGF0Lm5hbWVkX2xvZ2dlcl9sZXZlbCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgIExpc3Q8T2JqZWN0PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7CisKKyAgICBib29sZWFuIHByZXNlbnRfbmFtZWRfbG9nZ2VyX2xldmVsID0gdHJ1ZSAmJiAoaXNfc2V0X25hbWVkX2xvZ2dlcl9sZXZlbCgpKTsKKyAgICBsaXN0LmFkZChwcmVzZW50X25hbWVkX2xvZ2dlcl9sZXZlbCk7CisgICAgaWYgKHByZXNlbnRfbmFtZWRfbG9nZ2VyX2xldmVsKQorICAgICAgbGlzdC5hZGQobmFtZWRfbG9nZ2VyX2xldmVsKTsKKworICAgIHJldHVybiBsaXN0Lmhhc2hDb2RlKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBjb21wYXJlVG8oTG9nQ29uZmlnIG90aGVyKSB7CisgICAgaWYgKCFnZXRDbGFzcygpLmVxdWFscyhvdGhlci5nZXRDbGFzcygpKSkgeworICAgICAgcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpLmNvbXBhcmVUbyhvdGhlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgfQorCisgICAgaW50IGxhc3RDb21wYXJpc29uID0gMDsKKworICAgIGxhc3RDb21wYXJpc29uID0gQm9vbGVhbi52YWx1ZU9mKGlzX3NldF9uYW1lZF9sb2dnZXJfbGV2ZWwoKSkuY29tcGFyZVRvKG90aGVyLmlzX3NldF9uYW1lZF9sb2dnZXJfbGV2ZWwoKSk7CisgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICB9CisgICAgaWYgKGlzX3NldF9uYW1lZF9sb2dnZXJfbGV2ZWwoKSkgeworICAgICAgbGFzdENvbXBhcmlzb24gPSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy5uYW1lZF9sb2dnZXJfbGV2ZWwsIG90aGVyLm5hbWVkX2xvZ2dlcl9sZXZlbCk7CisgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworICB9CisKKyAgcHVibGljIF9GaWVsZHMgZmllbGRGb3JJZChpbnQgZmllbGRJZCkgeworICAgIHJldHVybiBfRmllbGRzLmZpbmRCeVRocmlmdElkKGZpZWxkSWQpOworICB9CisKKyAgcHVibGljIHZvaWQgcmVhZChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgaXByb3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICBzY2hlbWVzLmdldChpcHJvdC5nZXRTY2hlbWUoKSkuZ2V0U2NoZW1lKCkucmVhZChpcHJvdCwgdGhpcyk7CisgIH0KKworICBwdWJsaWMgdm9pZCB3cml0ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgb3Byb3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICBzY2hlbWVzLmdldChvcHJvdC5nZXRTY2hlbWUoKSkuZ2V0U2NoZW1lKCkud3JpdGUob3Byb3QsIHRoaXMpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCJMb2dDb25maWcoIik7CisgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7CisKKyAgICBpZiAoaXNfc2V0X25hbWVkX2xvZ2dlcl9sZXZlbCgpKSB7CisgICAgICBzYi5hcHBlbmQoIm5hbWVkX2xvZ2dlcl9sZXZlbDoiKTsKKyAgICAgIGlmICh0aGlzLm5hbWVkX2xvZ2dlcl9sZXZlbCA9PSBudWxsKSB7CisgICAgICAgIHNiLmFwcGVuZCgibnVsbCIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2IuYXBwZW5kKHRoaXMubmFtZWRfbG9nZ2VyX2xldmVsKTsKKyAgICAgIH0KKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfQorICAgIHNiLmFwcGVuZCgiKSIpOworICAgIHJldHVybiBzYi50b1N0cmluZygpOworICB9CisKKyAgcHVibGljIHZvaWQgdmFsaWRhdGUoKSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgLy8gY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcworICAgIC8vIGNoZWNrIGZvciBzdWItc3RydWN0IHZhbGlkaXR5CisgIH0KKworICBwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIHdyaXRlKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQ29tcGFjdFByb3RvY29sKG5ldyBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVElPU3RyZWFtVHJhbnNwb3J0KG91dCkpKTsKKyAgICB9IGNhdGNoIChvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHRlKSB7CisgICAgICB0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbih0ZSk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBpbikgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICByZWFkKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQ29tcGFjdFByb3RvY29sKG5ldyBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVElPU3RyZWFtVHJhbnNwb3J0KGluKSkpOworICAgIH0gY2F0Y2ggKG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24gdGUpIHsKKyAgICAgIHRocm93IG5ldyBqYXZhLmlvLklPRXhjZXB0aW9uKHRlKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBMb2dDb25maWdTdGFuZGFyZFNjaGVtZUZhY3RvcnkgaW1wbGVtZW50cyBTY2hlbWVGYWN0b3J5IHsKKyAgICBwdWJsaWMgTG9nQ29uZmlnU3RhbmRhcmRTY2hlbWUgZ2V0U2NoZW1lKCkgeworICAgICAgcmV0dXJuIG5ldyBMb2dDb25maWdTdGFuZGFyZFNjaGVtZSgpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIExvZ0NvbmZpZ1N0YW5kYXJkU2NoZW1lIGV4dGVuZHMgU3RhbmRhcmRTY2hlbWU8TG9nQ29uZmlnPiB7CisKKyAgICBwdWJsaWMgdm9pZCByZWFkKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBpcHJvdCwgTG9nQ29uZmlnIHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIHNjaGVtZUZpZWxkOworICAgICAgaXByb3QucmVhZFN0cnVjdEJlZ2luKCk7CisgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgIHsKKyAgICAgICAgc2NoZW1lRmllbGQgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpOworICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVE9QKSB7IAorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoc2NoZW1lRmllbGQuaWQpIHsKKyAgICAgICAgICBjYXNlIDI6IC8vIE5BTUVEX0xPR0dFUl9MRVZFTAorICAgICAgICAgICAgaWYgKHNjaGVtZUZpZWxkLnR5cGUgPT0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTUFQKSB7CisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwIF9tYXA2ODggPSBpcHJvdC5yZWFkTWFwQmVnaW4oKTsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QubmFtZWRfbG9nZ2VyX2xldmVsID0gbmV3IEhhc2hNYXA8U3RyaW5nLExvZ0xldmVsPigyKl9tYXA2ODguc2l6ZSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIF9rZXk2ODk7CisgICAgICAgICAgICAgICAgTG9nTGV2ZWwgX3ZhbDY5MDsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBfaTY5MSA9IDA7IF9pNjkxIDwgX21hcDY4OC5zaXplOyArK19pNjkxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIF9rZXk2ODkgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICBfdmFsNjkwID0gbmV3IExvZ0xldmVsKCk7CisgICAgICAgICAgICAgICAgICBfdmFsNjkwLnJlYWQoaXByb3QpOworICAgICAgICAgICAgICAgICAgc3RydWN0Lm5hbWVkX2xvZ2dlcl9sZXZlbC5wdXQoX2tleTY4OSwgX3ZhbDY5MCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlwcm90LnJlYWRNYXBFbmQoKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBzdHJ1Y3Quc2V0X25hbWVkX2xvZ2dlcl9sZXZlbF9pc1NldCh0cnVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7IAorICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgc2NoZW1lRmllbGQudHlwZSk7CisgICAgICAgIH0KKyAgICAgICAgaXByb3QucmVhZEZpZWxkRW5kKCk7CisgICAgICB9CisgICAgICBpcHJvdC5yZWFkU3RydWN0RW5kKCk7CisgICAgICBzdHJ1Y3QudmFsaWRhdGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgb3Byb3QsIExvZ0NvbmZpZyBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgIHN0cnVjdC52YWxpZGF0ZSgpOworCisgICAgICBvcHJvdC53cml0ZVN0cnVjdEJlZ2luKFNUUlVDVF9ERVNDKTsKKyAgICAgIGlmIChzdHJ1Y3QubmFtZWRfbG9nZ2VyX2xldmVsICE9IG51bGwpIHsKKyAgICAgICAgaWYgKHN0cnVjdC5pc19zZXRfbmFtZWRfbG9nZ2VyX2xldmVsKCkpIHsKKyAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oTkFNRURfTE9HR0VSX0xFVkVMX0ZJRUxEX0RFU0MpOworICAgICAgICAgIHsKKyAgICAgICAgICAgIG9wcm90LndyaXRlTWFwQmVnaW4obmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIHN0cnVjdC5uYW1lZF9sb2dnZXJfbGV2ZWwuc2l6ZSgpKSk7CisgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIExvZ0xldmVsPiBfaXRlcjY5MiA6IHN0cnVjdC5uYW1lZF9sb2dnZXJfbGV2ZWwuZW50cnlTZXQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoX2l0ZXI2OTIuZ2V0S2V5KCkpOworICAgICAgICAgICAgICBfaXRlcjY5Mi5nZXRWYWx1ZSgpLndyaXRlKG9wcm90KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9wcm90LndyaXRlTWFwRW5kKCk7CisgICAgICAgICAgfQorICAgICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgb3Byb3Qud3JpdGVGaWVsZFN0b3AoKTsKKyAgICAgIG9wcm90LndyaXRlU3RydWN0RW5kKCk7CisgICAgfQorCisgIH0KKworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBMb2dDb25maWdUdXBsZVNjaGVtZUZhY3RvcnkgaW1wbGVtZW50cyBTY2hlbWVGYWN0b3J5IHsKKyAgICBwdWJsaWMgTG9nQ29uZmlnVHVwbGVTY2hlbWUgZ2V0U2NoZW1lKCkgeworICAgICAgcmV0dXJuIG5ldyBMb2dDb25maWdUdXBsZVNjaGVtZSgpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIExvZ0NvbmZpZ1R1cGxlU2NoZW1lIGV4dGVuZHMgVHVwbGVTY2hlbWU8TG9nQ29uZmlnPiB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgcHJvdCwgTG9nQ29uZmlnIHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgVFR1cGxlUHJvdG9jb2wgb3Byb3QgPSAoVFR1cGxlUHJvdG9jb2wpIHByb3Q7CisgICAgICBCaXRTZXQgb3B0aW9uYWxzID0gbmV3IEJpdFNldCgpOworICAgICAgaWYgKHN0cnVjdC5pc19zZXRfbmFtZWRfbG9nZ2VyX2xldmVsKCkpIHsKKyAgICAgICAgb3B0aW9uYWxzLnNldCgwKTsKKyAgICAgIH0KKyAgICAgIG9wcm90LndyaXRlQml0U2V0KG9wdGlvbmFscywgMSk7CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9uYW1lZF9sb2dnZXJfbGV2ZWwoKSkgeworICAgICAgICB7CisgICAgICAgICAgb3Byb3Qud3JpdGVJMzIoc3RydWN0Lm5hbWVkX2xvZ2dlcl9sZXZlbC5zaXplKCkpOworICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgTG9nTGV2ZWw+IF9pdGVyNjkzIDogc3RydWN0Lm5hbWVkX2xvZ2dlcl9sZXZlbC5lbnRyeVNldCgpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKF9pdGVyNjkzLmdldEtleSgpKTsKKyAgICAgICAgICAgIF9pdGVyNjkzLmdldFZhbHVlKCkud3JpdGUob3Byb3QpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlYWQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIHByb3QsIExvZ0NvbmZpZyBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgIFRUdXBsZVByb3RvY29sIGlwcm90ID0gKFRUdXBsZVByb3RvY29sKSBwcm90OworICAgICAgQml0U2V0IGluY29taW5nID0gaXByb3QucmVhZEJpdFNldCgxKTsKKyAgICAgIGlmIChpbmNvbWluZy5nZXQoMCkpIHsKKyAgICAgICAgeworICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgX21hcDY5NCA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORywgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNULCBpcHJvdC5yZWFkSTMyKCkpOworICAgICAgICAgIHN0cnVjdC5uYW1lZF9sb2dnZXJfbGV2ZWwgPSBuZXcgSGFzaE1hcDxTdHJpbmcsTG9nTGV2ZWw+KDIqX21hcDY5NC5zaXplKTsKKyAgICAgICAgICBTdHJpbmcgX2tleTY5NTsKKyAgICAgICAgICBMb2dMZXZlbCBfdmFsNjk2OworICAgICAgICAgIGZvciAoaW50IF9pNjk3ID0gMDsgX2k2OTcgPCBfbWFwNjk0LnNpemU7ICsrX2k2OTcpCisgICAgICAgICAgeworICAgICAgICAgICAgX2tleTY5NSA9IGlwcm90LnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgIF92YWw2OTYgPSBuZXcgTG9nTGV2ZWwoKTsKKyAgICAgICAgICAgIF92YWw2OTYucmVhZChpcHJvdCk7CisgICAgICAgICAgICBzdHJ1Y3QubmFtZWRfbG9nZ2VyX2xldmVsLnB1dChfa2V5Njk1LCBfdmFsNjk2KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RydWN0LnNldF9uYW1lZF9sb2dnZXJfbGV2ZWxfaXNTZXQodHJ1ZSk7CisgICAgICB9CisgICAgfQorICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9Mb2dMZXZlbC5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9Mb2dMZXZlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkYzhlMTAKLS0tIC9kZXYvbnVsbAorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL0xvZ0xldmVsLmphdmEKQEAgLTAsMCArMSw4MzYgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisvKioKKyAqIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMykKKyAqCisgKiBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HCisgKiAgQGdlbmVyYXRlZAorICovCitwYWNrYWdlIGJhY2t0eXBlLnN0b3JtLmdlbmVyYXRlZDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5JU2NoZW1lOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5TY2hlbWVGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5TdGFuZGFyZFNjaGVtZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5UdXBsZVNjaGVtZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHVwbGVQcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuRW5jb2RpbmdVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLkFzeW5jTWV0aG9kQ2FsbGJhY2s7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLkFic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXIuKjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkVudW1NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bVNldDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkJpdFNldDsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQ7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworQFN1cHByZXNzV2FybmluZ3MoeyJjYXN0IiwgInJhd3R5cGVzIiwgInNlcmlhbCIsICJ1bmNoZWNrZWQifSkKK0BHZW5lcmF0ZWQodmFsdWUgPSAiQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4zKSIpCitwdWJsaWMgY2xhc3MgTG9nTGV2ZWwgaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZTxMb2dMZXZlbCwgTG9nTGV2ZWwuX0ZpZWxkcz4sIGphdmEuaW8uU2VyaWFsaXphYmxlLCBDbG9uZWFibGUsIENvbXBhcmFibGU8TG9nTGV2ZWw+IHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdCBTVFJVQ1RfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0KCJMb2dMZXZlbCIpOworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBBQ1RJT05fRklFTERfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQoImFjdGlvbiIsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkkzMiwgKHNob3J0KTEpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgVEFSR0VUX0xPR19MRVZFTF9GSUVMRF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCgidGFyZ2V0X2xvZ19sZXZlbCIsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORywgKHNob3J0KTIpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgUkVTRVRfTE9HX0xFVkVMX1RJTUVPVVRfU0VDU19GSUVMRF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCgicmVzZXRfbG9nX2xldmVsX3RpbWVvdXRfc2VjcyIsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkkzMiwgKHNob3J0KTMpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgUkVTRVRfTE9HX0xFVkVMX1RJTUVPVVRfRVBPQ0hfRklFTERfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQoInJlc2V0X2xvZ19sZXZlbF90aW1lb3V0X2Vwb2NoIiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTY0LCAoc2hvcnQpNCk7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBSRVNFVF9MT0dfTEVWRUxfRklFTERfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQoInJlc2V0X2xvZ19sZXZlbCIsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORywgKHNob3J0KTUpOworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxDbGFzczw/IGV4dGVuZHMgSVNjaGVtZT4sIFNjaGVtZUZhY3Rvcnk+IHNjaGVtZXMgPSBuZXcgSGFzaE1hcDxDbGFzczw/IGV4dGVuZHMgSVNjaGVtZT4sIFNjaGVtZUZhY3Rvcnk+KCk7CisgIHN0YXRpYyB7CisgICAgc2NoZW1lcy5wdXQoU3RhbmRhcmRTY2hlbWUuY2xhc3MsIG5ldyBMb2dMZXZlbFN0YW5kYXJkU2NoZW1lRmFjdG9yeSgpKTsKKyAgICBzY2hlbWVzLnB1dChUdXBsZVNjaGVtZS5jbGFzcywgbmV3IExvZ0xldmVsVHVwbGVTY2hlbWVGYWN0b3J5KCkpOworICB9CisKKyAgcHJpdmF0ZSBMb2dMZXZlbEFjdGlvbiBhY3Rpb247IC8vIHJlcXVpcmVkCisgIHByaXZhdGUgU3RyaW5nIHRhcmdldF9sb2dfbGV2ZWw7IC8vIG9wdGlvbmFsCisgIHByaXZhdGUgaW50IHJlc2V0X2xvZ19sZXZlbF90aW1lb3V0X3NlY3M7IC8vIG9wdGlvbmFsCisgIHByaXZhdGUgbG9uZyByZXNldF9sb2dfbGV2ZWxfdGltZW91dF9lcG9jaDsgLy8gb3B0aW9uYWwKKyAgcHJpdmF0ZSBTdHJpbmcgcmVzZXRfbG9nX2xldmVsOyAvLyBvcHRpb25hbAorCisgIC8qKiBUaGUgc2V0IG9mIGZpZWxkcyB0aGlzIHN0cnVjdCBjb250YWlucywgYWxvbmcgd2l0aCBjb252ZW5pZW5jZSBtZXRob2RzIGZvciBmaW5kaW5nIGFuZCBtYW5pcHVsYXRpbmcgdGhlbS4gKi8KKyAgcHVibGljIGVudW0gX0ZpZWxkcyBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZElkRW51bSB7CisgICAgLyoqCisgICAgICogCisgICAgICogQHNlZSBMb2dMZXZlbEFjdGlvbgorICAgICAqLworICAgIEFDVElPTigoc2hvcnQpMSwgImFjdGlvbiIpLAorICAgIFRBUkdFVF9MT0dfTEVWRUwoKHNob3J0KTIsICJ0YXJnZXRfbG9nX2xldmVsIiksCisgICAgUkVTRVRfTE9HX0xFVkVMX1RJTUVPVVRfU0VDUygoc2hvcnQpMywgInJlc2V0X2xvZ19sZXZlbF90aW1lb3V0X3NlY3MiKSwKKyAgICBSRVNFVF9MT0dfTEVWRUxfVElNRU9VVF9FUE9DSCgoc2hvcnQpNCwgInJlc2V0X2xvZ19sZXZlbF90aW1lb3V0X2Vwb2NoIiksCisgICAgUkVTRVRfTE9HX0xFVkVMKChzaG9ydCk1LCAicmVzZXRfbG9nX2xldmVsIik7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBfRmllbGRzPiBieU5hbWUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIF9GaWVsZHM+KCk7CisKKyAgICBzdGF0aWMgeworICAgICAgZm9yIChfRmllbGRzIGZpZWxkIDogRW51bVNldC5hbGxPZihfRmllbGRzLmNsYXNzKSkgeworICAgICAgICBieU5hbWUucHV0KGZpZWxkLmdldEZpZWxkTmFtZSgpLCBmaWVsZCk7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCB0aGUgX0ZpZWxkcyBjb25zdGFudCB0aGF0IG1hdGNoZXMgZmllbGRJZCwgb3IgbnVsbCBpZiBpdHMgbm90IGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgX0ZpZWxkcyBmaW5kQnlUaHJpZnRJZChpbnQgZmllbGRJZCkgeworICAgICAgc3dpdGNoKGZpZWxkSWQpIHsKKyAgICAgICAgY2FzZSAxOiAvLyBBQ1RJT04KKyAgICAgICAgICByZXR1cm4gQUNUSU9OOworICAgICAgICBjYXNlIDI6IC8vIFRBUkdFVF9MT0dfTEVWRUwKKyAgICAgICAgICByZXR1cm4gVEFSR0VUX0xPR19MRVZFTDsKKyAgICAgICAgY2FzZSAzOiAvLyBSRVNFVF9MT0dfTEVWRUxfVElNRU9VVF9TRUNTCisgICAgICAgICAgcmV0dXJuIFJFU0VUX0xPR19MRVZFTF9USU1FT1VUX1NFQ1M7CisgICAgICAgIGNhc2UgNDogLy8gUkVTRVRfTE9HX0xFVkVMX1RJTUVPVVRfRVBPQ0gKKyAgICAgICAgICByZXR1cm4gUkVTRVRfTE9HX0xFVkVMX1RJTUVPVVRfRVBPQ0g7CisgICAgICAgIGNhc2UgNTogLy8gUkVTRVRfTE9HX0xFVkVMCisgICAgICAgICAgcmV0dXJuIFJFU0VUX0xPR19MRVZFTDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kIHRoZSBfRmllbGRzIGNvbnN0YW50IHRoYXQgbWF0Y2hlcyBmaWVsZElkLCB0aHJvd2luZyBhbiBleGNlcHRpb24KKyAgICAgKiBpZiBpdCBpcyBub3QgZm91bmQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBfRmllbGRzIGZpbmRCeVRocmlmdElkT3JUaHJvdyhpbnQgZmllbGRJZCkgeworICAgICAgX0ZpZWxkcyBmaWVsZHMgPSBmaW5kQnlUaHJpZnRJZChmaWVsZElkKTsKKyAgICAgIGlmIChmaWVsZHMgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRmllbGQgIiArIGZpZWxkSWQgKyAiIGRvZXNuJ3QgZXhpc3QhIik7CisgICAgICByZXR1cm4gZmllbGRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgdGhlIF9GaWVsZHMgY29uc3RhbnQgdGhhdCBtYXRjaGVzIG5hbWUsIG9yIG51bGwgaWYgaXRzIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIF9GaWVsZHMgZmluZEJ5TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgcmV0dXJuIGJ5TmFtZS5nZXQobmFtZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBzaG9ydCBfdGhyaWZ0SWQ7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX2ZpZWxkTmFtZTsKKworICAgIF9GaWVsZHMoc2hvcnQgdGhyaWZ0SWQsIFN0cmluZyBmaWVsZE5hbWUpIHsKKyAgICAgIF90aHJpZnRJZCA9IHRocmlmdElkOworICAgICAgX2ZpZWxkTmFtZSA9IGZpZWxkTmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc2hvcnQgZ2V0VGhyaWZ0RmllbGRJZCgpIHsKKyAgICAgIHJldHVybiBfdGhyaWZ0SWQ7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRGaWVsZE5hbWUoKSB7CisgICAgICByZXR1cm4gX2ZpZWxkTmFtZTsKKyAgICB9CisgIH0KKworICAvLyBpc3NldCBpZCBhc3NpZ25tZW50cworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgX19SRVNFVF9MT0dfTEVWRUxfVElNRU9VVF9TRUNTX0lTU0VUX0lEID0gMDsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IF9fUkVTRVRfTE9HX0xFVkVMX1RJTUVPVVRfRVBPQ0hfSVNTRVRfSUQgPSAxOworICBwcml2YXRlIGJ5dGUgX19pc3NldF9iaXRmaWVsZCA9IDA7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIF9GaWVsZHMgb3B0aW9uYWxzW10gPSB7X0ZpZWxkcy5UQVJHRVRfTE9HX0xFVkVMLF9GaWVsZHMuUkVTRVRfTE9HX0xFVkVMX1RJTUVPVVRfU0VDUyxfRmllbGRzLlJFU0VUX0xPR19MRVZFTF9USU1FT1VUX0VQT0NILF9GaWVsZHMuUkVTRVRfTE9HX0xFVkVMfTsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBNYXA8X0ZpZWxkcywgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGE+IG1ldGFEYXRhTWFwOworICBzdGF0aWMgeworICAgIE1hcDxfRmllbGRzLCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YT4gdG1wTWFwID0gbmV3IEVudW1NYXA8X0ZpZWxkcywgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGE+KF9GaWVsZHMuY2xhc3MpOworICAgIHRtcE1hcC5wdXQoX0ZpZWxkcy5BQ1RJT04sIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YSgiYWN0aW9uIiwgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLlJFUVVJUkVELCAKKyAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5FbnVtTWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuRU5VTSwgTG9nTGV2ZWxBY3Rpb24uY2xhc3MpKSk7CisgICAgdG1wTWFwLnB1dChfRmllbGRzLlRBUkdFVF9MT0dfTEVWRUwsIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YSgidGFyZ2V0X2xvZ19sZXZlbCIsIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZFJlcXVpcmVtZW50VHlwZS5PUFRJT05BTCwgCisgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRWYWx1ZU1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORykpKTsKKyAgICB0bXBNYXAucHV0KF9GaWVsZHMuUkVTRVRfTE9HX0xFVkVMX1RJTUVPVVRfU0VDUywgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhKCJyZXNldF9sb2dfbGV2ZWxfdGltZW91dF9zZWNzIiwgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLk9QVElPTkFMLCAKKyAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZFZhbHVlTWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTMyKSkpOworICAgIHRtcE1hcC5wdXQoX0ZpZWxkcy5SRVNFVF9MT0dfTEVWRUxfVElNRU9VVF9FUE9DSCwgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhKCJyZXNldF9sb2dfbGV2ZWxfdGltZW91dF9lcG9jaCIsIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZFJlcXVpcmVtZW50VHlwZS5PUFRJT05BTCwgCisgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRWYWx1ZU1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkk2NCkpKTsKKyAgICB0bXBNYXAucHV0KF9GaWVsZHMuUkVTRVRfTE9HX0xFVkVMLCBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEoInJlc2V0X2xvZ19sZXZlbCIsIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZFJlcXVpcmVtZW50VHlwZS5PUFRJT05BTCwgCisgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRWYWx1ZU1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORykpKTsKKyAgICBtZXRhRGF0YU1hcCA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcCh0bXBNYXApOworICAgIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhLmFkZFN0cnVjdE1ldGFEYXRhTWFwKExvZ0xldmVsLmNsYXNzLCBtZXRhRGF0YU1hcCk7CisgIH0KKworICBwdWJsaWMgTG9nTGV2ZWwoKSB7CisgIH0KKworICBwdWJsaWMgTG9nTGV2ZWwoCisgICAgTG9nTGV2ZWxBY3Rpb24gYWN0aW9uKQorICB7CisgICAgdGhpcygpOworICAgIHRoaXMuYWN0aW9uID0gYWN0aW9uOworICB9CisKKyAgLyoqCisgICAqIFBlcmZvcm1zIGEgZGVlcCBjb3B5IG9uIDxpPm90aGVyPC9pPi4KKyAgICovCisgIHB1YmxpYyBMb2dMZXZlbChMb2dMZXZlbCBvdGhlcikgeworICAgIF9faXNzZXRfYml0ZmllbGQgPSBvdGhlci5fX2lzc2V0X2JpdGZpZWxkOworICAgIGlmIChvdGhlci5pc19zZXRfYWN0aW9uKCkpIHsKKyAgICAgIHRoaXMuYWN0aW9uID0gb3RoZXIuYWN0aW9uOworICAgIH0KKyAgICBpZiAob3RoZXIuaXNfc2V0X3RhcmdldF9sb2dfbGV2ZWwoKSkgeworICAgICAgdGhpcy50YXJnZXRfbG9nX2xldmVsID0gb3RoZXIudGFyZ2V0X2xvZ19sZXZlbDsKKyAgICB9CisgICAgdGhpcy5yZXNldF9sb2dfbGV2ZWxfdGltZW91dF9zZWNzID0gb3RoZXIucmVzZXRfbG9nX2xldmVsX3RpbWVvdXRfc2VjczsKKyAgICB0aGlzLnJlc2V0X2xvZ19sZXZlbF90aW1lb3V0X2Vwb2NoID0gb3RoZXIucmVzZXRfbG9nX2xldmVsX3RpbWVvdXRfZXBvY2g7CisgICAgaWYgKG90aGVyLmlzX3NldF9yZXNldF9sb2dfbGV2ZWwoKSkgeworICAgICAgdGhpcy5yZXNldF9sb2dfbGV2ZWwgPSBvdGhlci5yZXNldF9sb2dfbGV2ZWw7CisgICAgfQorICB9CisKKyAgcHVibGljIExvZ0xldmVsIGRlZXBDb3B5KCkgeworICAgIHJldHVybiBuZXcgTG9nTGV2ZWwodGhpcyk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgdGhpcy5hY3Rpb24gPSBudWxsOworICAgIHRoaXMudGFyZ2V0X2xvZ19sZXZlbCA9IG51bGw7CisgICAgc2V0X3Jlc2V0X2xvZ19sZXZlbF90aW1lb3V0X3NlY3NfaXNTZXQoZmFsc2UpOworICAgIHRoaXMucmVzZXRfbG9nX2xldmVsX3RpbWVvdXRfc2VjcyA9IDA7CisgICAgc2V0X3Jlc2V0X2xvZ19sZXZlbF90aW1lb3V0X2Vwb2NoX2lzU2V0KGZhbHNlKTsKKyAgICB0aGlzLnJlc2V0X2xvZ19sZXZlbF90aW1lb3V0X2Vwb2NoID0gMDsKKyAgICB0aGlzLnJlc2V0X2xvZ19sZXZlbCA9IG51bGw7CisgIH0KKworICAvKioKKyAgICogCisgICAqIEBzZWUgTG9nTGV2ZWxBY3Rpb24KKyAgICovCisgIHB1YmxpYyBMb2dMZXZlbEFjdGlvbiBnZXRfYWN0aW9uKCkgeworICAgIHJldHVybiB0aGlzLmFjdGlvbjsKKyAgfQorCisgIC8qKgorICAgKiAKKyAgICogQHNlZSBMb2dMZXZlbEFjdGlvbgorICAgKi8KKyAgcHVibGljIHZvaWQgc2V0X2FjdGlvbihMb2dMZXZlbEFjdGlvbiBhY3Rpb24pIHsKKyAgICB0aGlzLmFjdGlvbiA9IGFjdGlvbjsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHVuc2V0X2FjdGlvbigpIHsKKyAgICB0aGlzLmFjdGlvbiA9IG51bGw7CisgIH0KKworICAvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkIGFjdGlvbiBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNfc2V0X2FjdGlvbigpIHsKKyAgICByZXR1cm4gdGhpcy5hY3Rpb24gIT0gbnVsbDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF9hY3Rpb25faXNTZXQoYm9vbGVhbiB2YWx1ZSkgeworICAgIGlmICghdmFsdWUpIHsKKyAgICAgIHRoaXMuYWN0aW9uID0gbnVsbDsKKyAgICB9CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldF90YXJnZXRfbG9nX2xldmVsKCkgeworICAgIHJldHVybiB0aGlzLnRhcmdldF9sb2dfbGV2ZWw7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfdGFyZ2V0X2xvZ19sZXZlbChTdHJpbmcgdGFyZ2V0X2xvZ19sZXZlbCkgeworICAgIHRoaXMudGFyZ2V0X2xvZ19sZXZlbCA9IHRhcmdldF9sb2dfbGV2ZWw7CisgIH0KKworICBwdWJsaWMgdm9pZCB1bnNldF90YXJnZXRfbG9nX2xldmVsKCkgeworICAgIHRoaXMudGFyZ2V0X2xvZ19sZXZlbCA9IG51bGw7CisgIH0KKworICAvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkIHRhcmdldF9sb2dfbGV2ZWwgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgIHB1YmxpYyBib29sZWFuIGlzX3NldF90YXJnZXRfbG9nX2xldmVsKCkgeworICAgIHJldHVybiB0aGlzLnRhcmdldF9sb2dfbGV2ZWwgIT0gbnVsbDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF90YXJnZXRfbG9nX2xldmVsX2lzU2V0KGJvb2xlYW4gdmFsdWUpIHsKKyAgICBpZiAoIXZhbHVlKSB7CisgICAgICB0aGlzLnRhcmdldF9sb2dfbGV2ZWwgPSBudWxsOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBpbnQgZ2V0X3Jlc2V0X2xvZ19sZXZlbF90aW1lb3V0X3NlY3MoKSB7CisgICAgcmV0dXJuIHRoaXMucmVzZXRfbG9nX2xldmVsX3RpbWVvdXRfc2VjczsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF9yZXNldF9sb2dfbGV2ZWxfdGltZW91dF9zZWNzKGludCByZXNldF9sb2dfbGV2ZWxfdGltZW91dF9zZWNzKSB7CisgICAgdGhpcy5yZXNldF9sb2dfbGV2ZWxfdGltZW91dF9zZWNzID0gcmVzZXRfbG9nX2xldmVsX3RpbWVvdXRfc2VjczsKKyAgICBzZXRfcmVzZXRfbG9nX2xldmVsX3RpbWVvdXRfc2Vjc19pc1NldCh0cnVlKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHVuc2V0X3Jlc2V0X2xvZ19sZXZlbF90aW1lb3V0X3NlY3MoKSB7CisgICAgX19pc3NldF9iaXRmaWVsZCA9IEVuY29kaW5nVXRpbHMuY2xlYXJCaXQoX19pc3NldF9iaXRmaWVsZCwgX19SRVNFVF9MT0dfTEVWRUxfVElNRU9VVF9TRUNTX0lTU0VUX0lEKTsKKyAgfQorCisgIC8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgcmVzZXRfbG9nX2xldmVsX3RpbWVvdXRfc2VjcyBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNfc2V0X3Jlc2V0X2xvZ19sZXZlbF90aW1lb3V0X3NlY3MoKSB7CisgICAgcmV0dXJuIEVuY29kaW5nVXRpbHMudGVzdEJpdChfX2lzc2V0X2JpdGZpZWxkLCBfX1JFU0VUX0xPR19MRVZFTF9USU1FT1VUX1NFQ1NfSVNTRVRfSUQpOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X3Jlc2V0X2xvZ19sZXZlbF90aW1lb3V0X3NlY3NfaXNTZXQoYm9vbGVhbiB2YWx1ZSkgeworICAgIF9faXNzZXRfYml0ZmllbGQgPSBFbmNvZGluZ1V0aWxzLnNldEJpdChfX2lzc2V0X2JpdGZpZWxkLCBfX1JFU0VUX0xPR19MRVZFTF9USU1FT1VUX1NFQ1NfSVNTRVRfSUQsIHZhbHVlKTsKKyAgfQorCisgIHB1YmxpYyBsb25nIGdldF9yZXNldF9sb2dfbGV2ZWxfdGltZW91dF9lcG9jaCgpIHsKKyAgICByZXR1cm4gdGhpcy5yZXNldF9sb2dfbGV2ZWxfdGltZW91dF9lcG9jaDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF9yZXNldF9sb2dfbGV2ZWxfdGltZW91dF9lcG9jaChsb25nIHJlc2V0X2xvZ19sZXZlbF90aW1lb3V0X2Vwb2NoKSB7CisgICAgdGhpcy5yZXNldF9sb2dfbGV2ZWxfdGltZW91dF9lcG9jaCA9IHJlc2V0X2xvZ19sZXZlbF90aW1lb3V0X2Vwb2NoOworICAgIHNldF9yZXNldF9sb2dfbGV2ZWxfdGltZW91dF9lcG9jaF9pc1NldCh0cnVlKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHVuc2V0X3Jlc2V0X2xvZ19sZXZlbF90aW1lb3V0X2Vwb2NoKCkgeworICAgIF9faXNzZXRfYml0ZmllbGQgPSBFbmNvZGluZ1V0aWxzLmNsZWFyQml0KF9faXNzZXRfYml0ZmllbGQsIF9fUkVTRVRfTE9HX0xFVkVMX1RJTUVPVVRfRVBPQ0hfSVNTRVRfSUQpOworICB9CisKKyAgLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCByZXNldF9sb2dfbGV2ZWxfdGltZW91dF9lcG9jaCBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNfc2V0X3Jlc2V0X2xvZ19sZXZlbF90aW1lb3V0X2Vwb2NoKCkgeworICAgIHJldHVybiBFbmNvZGluZ1V0aWxzLnRlc3RCaXQoX19pc3NldF9iaXRmaWVsZCwgX19SRVNFVF9MT0dfTEVWRUxfVElNRU9VVF9FUE9DSF9JU1NFVF9JRCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfcmVzZXRfbG9nX2xldmVsX3RpbWVvdXRfZXBvY2hfaXNTZXQoYm9vbGVhbiB2YWx1ZSkgeworICAgIF9faXNzZXRfYml0ZmllbGQgPSBFbmNvZGluZ1V0aWxzLnNldEJpdChfX2lzc2V0X2JpdGZpZWxkLCBfX1JFU0VUX0xPR19MRVZFTF9USU1FT1VUX0VQT0NIX0lTU0VUX0lELCB2YWx1ZSk7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldF9yZXNldF9sb2dfbGV2ZWwoKSB7CisgICAgcmV0dXJuIHRoaXMucmVzZXRfbG9nX2xldmVsOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X3Jlc2V0X2xvZ19sZXZlbChTdHJpbmcgcmVzZXRfbG9nX2xldmVsKSB7CisgICAgdGhpcy5yZXNldF9sb2dfbGV2ZWwgPSByZXNldF9sb2dfbGV2ZWw7CisgIH0KKworICBwdWJsaWMgdm9pZCB1bnNldF9yZXNldF9sb2dfbGV2ZWwoKSB7CisgICAgdGhpcy5yZXNldF9sb2dfbGV2ZWwgPSBudWxsOworICB9CisKKyAgLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCByZXNldF9sb2dfbGV2ZWwgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgIHB1YmxpYyBib29sZWFuIGlzX3NldF9yZXNldF9sb2dfbGV2ZWwoKSB7CisgICAgcmV0dXJuIHRoaXMucmVzZXRfbG9nX2xldmVsICE9IG51bGw7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfcmVzZXRfbG9nX2xldmVsX2lzU2V0KGJvb2xlYW4gdmFsdWUpIHsKKyAgICBpZiAoIXZhbHVlKSB7CisgICAgICB0aGlzLnJlc2V0X2xvZ19sZXZlbCA9IG51bGw7CisgICAgfQorICB9CisKKyAgcHVibGljIHZvaWQgc2V0RmllbGRWYWx1ZShfRmllbGRzIGZpZWxkLCBPYmplY3QgdmFsdWUpIHsKKyAgICBzd2l0Y2ggKGZpZWxkKSB7CisgICAgY2FzZSBBQ1RJT046CisgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICB1bnNldF9hY3Rpb24oKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNldF9hY3Rpb24oKExvZ0xldmVsQWN0aW9uKXZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBUQVJHRVRfTE9HX0xFVkVMOgorICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgdW5zZXRfdGFyZ2V0X2xvZ19sZXZlbCgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2V0X3RhcmdldF9sb2dfbGV2ZWwoKFN0cmluZyl2YWx1ZSk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgUkVTRVRfTE9HX0xFVkVMX1RJTUVPVVRfU0VDUzoKKyAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgIHVuc2V0X3Jlc2V0X2xvZ19sZXZlbF90aW1lb3V0X3NlY3MoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNldF9yZXNldF9sb2dfbGV2ZWxfdGltZW91dF9zZWNzKChJbnRlZ2VyKXZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBSRVNFVF9MT0dfTEVWRUxfVElNRU9VVF9FUE9DSDoKKyAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgIHVuc2V0X3Jlc2V0X2xvZ19sZXZlbF90aW1lb3V0X2Vwb2NoKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzZXRfcmVzZXRfbG9nX2xldmVsX3RpbWVvdXRfZXBvY2goKExvbmcpdmFsdWUpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFJFU0VUX0xPR19MRVZFTDoKKyAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgIHVuc2V0X3Jlc2V0X2xvZ19sZXZlbCgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2V0X3Jlc2V0X2xvZ19sZXZlbCgoU3RyaW5nKXZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgfQorICB9CisKKyAgcHVibGljIE9iamVjdCBnZXRGaWVsZFZhbHVlKF9GaWVsZHMgZmllbGQpIHsKKyAgICBzd2l0Y2ggKGZpZWxkKSB7CisgICAgY2FzZSBBQ1RJT046CisgICAgICByZXR1cm4gZ2V0X2FjdGlvbigpOworCisgICAgY2FzZSBUQVJHRVRfTE9HX0xFVkVMOgorICAgICAgcmV0dXJuIGdldF90YXJnZXRfbG9nX2xldmVsKCk7CisKKyAgICBjYXNlIFJFU0VUX0xPR19MRVZFTF9USU1FT1VUX1NFQ1M6CisgICAgICByZXR1cm4gZ2V0X3Jlc2V0X2xvZ19sZXZlbF90aW1lb3V0X3NlY3MoKTsKKworICAgIGNhc2UgUkVTRVRfTE9HX0xFVkVMX1RJTUVPVVRfRVBPQ0g6CisgICAgICByZXR1cm4gZ2V0X3Jlc2V0X2xvZ19sZXZlbF90aW1lb3V0X2Vwb2NoKCk7CisKKyAgICBjYXNlIFJFU0VUX0xPR19MRVZFTDoKKyAgICAgIHJldHVybiBnZXRfcmVzZXRfbG9nX2xldmVsKCk7CisKKyAgICB9CisgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICB9CisKKyAgLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBjb3JyZXNwb25kaW5nIHRvIGZpZWxkSUQgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgIHB1YmxpYyBib29sZWFuIGlzU2V0KF9GaWVsZHMgZmllbGQpIHsKKyAgICBpZiAoZmllbGQgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHN3aXRjaCAoZmllbGQpIHsKKyAgICBjYXNlIEFDVElPTjoKKyAgICAgIHJldHVybiBpc19zZXRfYWN0aW9uKCk7CisgICAgY2FzZSBUQVJHRVRfTE9HX0xFVkVMOgorICAgICAgcmV0dXJuIGlzX3NldF90YXJnZXRfbG9nX2xldmVsKCk7CisgICAgY2FzZSBSRVNFVF9MT0dfTEVWRUxfVElNRU9VVF9TRUNTOgorICAgICAgcmV0dXJuIGlzX3NldF9yZXNldF9sb2dfbGV2ZWxfdGltZW91dF9zZWNzKCk7CisgICAgY2FzZSBSRVNFVF9MT0dfTEVWRUxfVElNRU9VVF9FUE9DSDoKKyAgICAgIHJldHVybiBpc19zZXRfcmVzZXRfbG9nX2xldmVsX3RpbWVvdXRfZXBvY2goKTsKKyAgICBjYXNlIFJFU0VUX0xPR19MRVZFTDoKKyAgICAgIHJldHVybiBpc19zZXRfcmVzZXRfbG9nX2xldmVsKCk7CisgICAgfQorICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IHRoYXQpIHsKKyAgICBpZiAodGhhdCA9PSBudWxsKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmICh0aGF0IGluc3RhbmNlb2YgTG9nTGV2ZWwpCisgICAgICByZXR1cm4gdGhpcy5lcXVhbHMoKExvZ0xldmVsKXRoYXQpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGVxdWFscyhMb2dMZXZlbCB0aGF0KSB7CisgICAgaWYgKHRoYXQgPT0gbnVsbCkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGJvb2xlYW4gdGhpc19wcmVzZW50X2FjdGlvbiA9IHRydWUgJiYgdGhpcy5pc19zZXRfYWN0aW9uKCk7CisgICAgYm9vbGVhbiB0aGF0X3ByZXNlbnRfYWN0aW9uID0gdHJ1ZSAmJiB0aGF0LmlzX3NldF9hY3Rpb24oKTsKKyAgICBpZiAodGhpc19wcmVzZW50X2FjdGlvbiB8fCB0aGF0X3ByZXNlbnRfYWN0aW9uKSB7CisgICAgICBpZiAoISh0aGlzX3ByZXNlbnRfYWN0aW9uICYmIHRoYXRfcHJlc2VudF9hY3Rpb24pKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBpZiAoIXRoaXMuYWN0aW9uLmVxdWFscyh0aGF0LmFjdGlvbikpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sZWFuIHRoaXNfcHJlc2VudF90YXJnZXRfbG9nX2xldmVsID0gdHJ1ZSAmJiB0aGlzLmlzX3NldF90YXJnZXRfbG9nX2xldmVsKCk7CisgICAgYm9vbGVhbiB0aGF0X3ByZXNlbnRfdGFyZ2V0X2xvZ19sZXZlbCA9IHRydWUgJiYgdGhhdC5pc19zZXRfdGFyZ2V0X2xvZ19sZXZlbCgpOworICAgIGlmICh0aGlzX3ByZXNlbnRfdGFyZ2V0X2xvZ19sZXZlbCB8fCB0aGF0X3ByZXNlbnRfdGFyZ2V0X2xvZ19sZXZlbCkgeworICAgICAgaWYgKCEodGhpc19wcmVzZW50X3RhcmdldF9sb2dfbGV2ZWwgJiYgdGhhdF9wcmVzZW50X3RhcmdldF9sb2dfbGV2ZWwpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBpZiAoIXRoaXMudGFyZ2V0X2xvZ19sZXZlbC5lcXVhbHModGhhdC50YXJnZXRfbG9nX2xldmVsKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2xlYW4gdGhpc19wcmVzZW50X3Jlc2V0X2xvZ19sZXZlbF90aW1lb3V0X3NlY3MgPSB0cnVlICYmIHRoaXMuaXNfc2V0X3Jlc2V0X2xvZ19sZXZlbF90aW1lb3V0X3NlY3MoKTsKKyAgICBib29sZWFuIHRoYXRfcHJlc2VudF9yZXNldF9sb2dfbGV2ZWxfdGltZW91dF9zZWNzID0gdHJ1ZSAmJiB0aGF0LmlzX3NldF9yZXNldF9sb2dfbGV2ZWxfdGltZW91dF9zZWNzKCk7CisgICAgaWYgKHRoaXNfcHJlc2VudF9yZXNldF9sb2dfbGV2ZWxfdGltZW91dF9zZWNzIHx8IHRoYXRfcHJlc2VudF9yZXNldF9sb2dfbGV2ZWxfdGltZW91dF9zZWNzKSB7CisgICAgICBpZiAoISh0aGlzX3ByZXNlbnRfcmVzZXRfbG9nX2xldmVsX3RpbWVvdXRfc2VjcyAmJiB0aGF0X3ByZXNlbnRfcmVzZXRfbG9nX2xldmVsX3RpbWVvdXRfc2VjcykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGlmICh0aGlzLnJlc2V0X2xvZ19sZXZlbF90aW1lb3V0X3NlY3MgIT0gdGhhdC5yZXNldF9sb2dfbGV2ZWxfdGltZW91dF9zZWNzKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbGVhbiB0aGlzX3ByZXNlbnRfcmVzZXRfbG9nX2xldmVsX3RpbWVvdXRfZXBvY2ggPSB0cnVlICYmIHRoaXMuaXNfc2V0X3Jlc2V0X2xvZ19sZXZlbF90aW1lb3V0X2Vwb2NoKCk7CisgICAgYm9vbGVhbiB0aGF0X3ByZXNlbnRfcmVzZXRfbG9nX2xldmVsX3RpbWVvdXRfZXBvY2ggPSB0cnVlICYmIHRoYXQuaXNfc2V0X3Jlc2V0X2xvZ19sZXZlbF90aW1lb3V0X2Vwb2NoKCk7CisgICAgaWYgKHRoaXNfcHJlc2VudF9yZXNldF9sb2dfbGV2ZWxfdGltZW91dF9lcG9jaCB8fCB0aGF0X3ByZXNlbnRfcmVzZXRfbG9nX2xldmVsX3RpbWVvdXRfZXBvY2gpIHsKKyAgICAgIGlmICghKHRoaXNfcHJlc2VudF9yZXNldF9sb2dfbGV2ZWxfdGltZW91dF9lcG9jaCAmJiB0aGF0X3ByZXNlbnRfcmVzZXRfbG9nX2xldmVsX3RpbWVvdXRfZXBvY2gpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBpZiAodGhpcy5yZXNldF9sb2dfbGV2ZWxfdGltZW91dF9lcG9jaCAhPSB0aGF0LnJlc2V0X2xvZ19sZXZlbF90aW1lb3V0X2Vwb2NoKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbGVhbiB0aGlzX3ByZXNlbnRfcmVzZXRfbG9nX2xldmVsID0gdHJ1ZSAmJiB0aGlzLmlzX3NldF9yZXNldF9sb2dfbGV2ZWwoKTsKKyAgICBib29sZWFuIHRoYXRfcHJlc2VudF9yZXNldF9sb2dfbGV2ZWwgPSB0cnVlICYmIHRoYXQuaXNfc2V0X3Jlc2V0X2xvZ19sZXZlbCgpOworICAgIGlmICh0aGlzX3ByZXNlbnRfcmVzZXRfbG9nX2xldmVsIHx8IHRoYXRfcHJlc2VudF9yZXNldF9sb2dfbGV2ZWwpIHsKKyAgICAgIGlmICghKHRoaXNfcHJlc2VudF9yZXNldF9sb2dfbGV2ZWwgJiYgdGhhdF9wcmVzZW50X3Jlc2V0X2xvZ19sZXZlbCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGlmICghdGhpcy5yZXNldF9sb2dfbGV2ZWwuZXF1YWxzKHRoYXQucmVzZXRfbG9nX2xldmVsKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgTGlzdDxPYmplY3Q+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKKworICAgIGJvb2xlYW4gcHJlc2VudF9hY3Rpb24gPSB0cnVlICYmIChpc19zZXRfYWN0aW9uKCkpOworICAgIGxpc3QuYWRkKHByZXNlbnRfYWN0aW9uKTsKKyAgICBpZiAocHJlc2VudF9hY3Rpb24pCisgICAgICBsaXN0LmFkZChhY3Rpb24uZ2V0VmFsdWUoKSk7CisKKyAgICBib29sZWFuIHByZXNlbnRfdGFyZ2V0X2xvZ19sZXZlbCA9IHRydWUgJiYgKGlzX3NldF90YXJnZXRfbG9nX2xldmVsKCkpOworICAgIGxpc3QuYWRkKHByZXNlbnRfdGFyZ2V0X2xvZ19sZXZlbCk7CisgICAgaWYgKHByZXNlbnRfdGFyZ2V0X2xvZ19sZXZlbCkKKyAgICAgIGxpc3QuYWRkKHRhcmdldF9sb2dfbGV2ZWwpOworCisgICAgYm9vbGVhbiBwcmVzZW50X3Jlc2V0X2xvZ19sZXZlbF90aW1lb3V0X3NlY3MgPSB0cnVlICYmIChpc19zZXRfcmVzZXRfbG9nX2xldmVsX3RpbWVvdXRfc2VjcygpKTsKKyAgICBsaXN0LmFkZChwcmVzZW50X3Jlc2V0X2xvZ19sZXZlbF90aW1lb3V0X3NlY3MpOworICAgIGlmIChwcmVzZW50X3Jlc2V0X2xvZ19sZXZlbF90aW1lb3V0X3NlY3MpCisgICAgICBsaXN0LmFkZChyZXNldF9sb2dfbGV2ZWxfdGltZW91dF9zZWNzKTsKKworICAgIGJvb2xlYW4gcHJlc2VudF9yZXNldF9sb2dfbGV2ZWxfdGltZW91dF9lcG9jaCA9IHRydWUgJiYgKGlzX3NldF9yZXNldF9sb2dfbGV2ZWxfdGltZW91dF9lcG9jaCgpKTsKKyAgICBsaXN0LmFkZChwcmVzZW50X3Jlc2V0X2xvZ19sZXZlbF90aW1lb3V0X2Vwb2NoKTsKKyAgICBpZiAocHJlc2VudF9yZXNldF9sb2dfbGV2ZWxfdGltZW91dF9lcG9jaCkKKyAgICAgIGxpc3QuYWRkKHJlc2V0X2xvZ19sZXZlbF90aW1lb3V0X2Vwb2NoKTsKKworICAgIGJvb2xlYW4gcHJlc2VudF9yZXNldF9sb2dfbGV2ZWwgPSB0cnVlICYmIChpc19zZXRfcmVzZXRfbG9nX2xldmVsKCkpOworICAgIGxpc3QuYWRkKHByZXNlbnRfcmVzZXRfbG9nX2xldmVsKTsKKyAgICBpZiAocHJlc2VudF9yZXNldF9sb2dfbGV2ZWwpCisgICAgICBsaXN0LmFkZChyZXNldF9sb2dfbGV2ZWwpOworCisgICAgcmV0dXJuIGxpc3QuaGFzaENvZGUoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGNvbXBhcmVUbyhMb2dMZXZlbCBvdGhlcikgeworICAgIGlmICghZ2V0Q2xhc3MoKS5lcXVhbHMob3RoZXIuZ2V0Q2xhc3MoKSkpIHsKKyAgICAgIHJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKS5jb21wYXJlVG8ob3RoZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgIH0KKworICAgIGludCBsYXN0Q29tcGFyaXNvbiA9IDA7CisKKyAgICBsYXN0Q29tcGFyaXNvbiA9IEJvb2xlYW4udmFsdWVPZihpc19zZXRfYWN0aW9uKCkpLmNvbXBhcmVUbyhvdGhlci5pc19zZXRfYWN0aW9uKCkpOworICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgfQorICAgIGlmIChpc19zZXRfYWN0aW9uKCkpIHsKKyAgICAgIGxhc3RDb21wYXJpc29uID0gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29tcGFyZVRvKHRoaXMuYWN0aW9uLCBvdGhlci5hY3Rpb24pOworICAgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgICAgfQorICAgIH0KKyAgICBsYXN0Q29tcGFyaXNvbiA9IEJvb2xlYW4udmFsdWVPZihpc19zZXRfdGFyZ2V0X2xvZ19sZXZlbCgpKS5jb21wYXJlVG8ob3RoZXIuaXNfc2V0X3RhcmdldF9sb2dfbGV2ZWwoKSk7CisgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICB9CisgICAgaWYgKGlzX3NldF90YXJnZXRfbG9nX2xldmVsKCkpIHsKKyAgICAgIGxhc3RDb21wYXJpc29uID0gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29tcGFyZVRvKHRoaXMudGFyZ2V0X2xvZ19sZXZlbCwgb3RoZXIudGFyZ2V0X2xvZ19sZXZlbCk7CisgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICB9CisgICAgfQorICAgIGxhc3RDb21wYXJpc29uID0gQm9vbGVhbi52YWx1ZU9mKGlzX3NldF9yZXNldF9sb2dfbGV2ZWxfdGltZW91dF9zZWNzKCkpLmNvbXBhcmVUbyhvdGhlci5pc19zZXRfcmVzZXRfbG9nX2xldmVsX3RpbWVvdXRfc2VjcygpKTsKKyAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgIH0KKyAgICBpZiAoaXNfc2V0X3Jlc2V0X2xvZ19sZXZlbF90aW1lb3V0X3NlY3MoKSkgeworICAgICAgbGFzdENvbXBhcmlzb24gPSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy5yZXNldF9sb2dfbGV2ZWxfdGltZW91dF9zZWNzLCBvdGhlci5yZXNldF9sb2dfbGV2ZWxfdGltZW91dF9zZWNzKTsKKyAgICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICAgIH0KKyAgICB9CisgICAgbGFzdENvbXBhcmlzb24gPSBCb29sZWFuLnZhbHVlT2YoaXNfc2V0X3Jlc2V0X2xvZ19sZXZlbF90aW1lb3V0X2Vwb2NoKCkpLmNvbXBhcmVUbyhvdGhlci5pc19zZXRfcmVzZXRfbG9nX2xldmVsX3RpbWVvdXRfZXBvY2goKSk7CisgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICB9CisgICAgaWYgKGlzX3NldF9yZXNldF9sb2dfbGV2ZWxfdGltZW91dF9lcG9jaCgpKSB7CisgICAgICBsYXN0Q29tcGFyaXNvbiA9IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvbXBhcmVUbyh0aGlzLnJlc2V0X2xvZ19sZXZlbF90aW1lb3V0X2Vwb2NoLCBvdGhlci5yZXNldF9sb2dfbGV2ZWxfdGltZW91dF9lcG9jaCk7CisgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICB9CisgICAgfQorICAgIGxhc3RDb21wYXJpc29uID0gQm9vbGVhbi52YWx1ZU9mKGlzX3NldF9yZXNldF9sb2dfbGV2ZWwoKSkuY29tcGFyZVRvKG90aGVyLmlzX3NldF9yZXNldF9sb2dfbGV2ZWwoKSk7CisgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICB9CisgICAgaWYgKGlzX3NldF9yZXNldF9sb2dfbGV2ZWwoKSkgeworICAgICAgbGFzdENvbXBhcmlzb24gPSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy5yZXNldF9sb2dfbGV2ZWwsIG90aGVyLnJlc2V0X2xvZ19sZXZlbCk7CisgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworICB9CisKKyAgcHVibGljIF9GaWVsZHMgZmllbGRGb3JJZChpbnQgZmllbGRJZCkgeworICAgIHJldHVybiBfRmllbGRzLmZpbmRCeVRocmlmdElkKGZpZWxkSWQpOworICB9CisKKyAgcHVibGljIHZvaWQgcmVhZChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgaXByb3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICBzY2hlbWVzLmdldChpcHJvdC5nZXRTY2hlbWUoKSkuZ2V0U2NoZW1lKCkucmVhZChpcHJvdCwgdGhpcyk7CisgIH0KKworICBwdWJsaWMgdm9pZCB3cml0ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgb3Byb3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICBzY2hlbWVzLmdldChvcHJvdC5nZXRTY2hlbWUoKSkuZ2V0U2NoZW1lKCkud3JpdGUob3Byb3QsIHRoaXMpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCJMb2dMZXZlbCgiKTsKKyAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKKworICAgIHNiLmFwcGVuZCgiYWN0aW9uOiIpOworICAgIGlmICh0aGlzLmFjdGlvbiA9PSBudWxsKSB7CisgICAgICBzYi5hcHBlbmQoIm51bGwiKTsKKyAgICB9IGVsc2UgeworICAgICAgc2IuYXBwZW5kKHRoaXMuYWN0aW9uKTsKKyAgICB9CisgICAgZmlyc3QgPSBmYWxzZTsKKyAgICBpZiAoaXNfc2V0X3RhcmdldF9sb2dfbGV2ZWwoKSkgeworICAgICAgaWYgKCFmaXJzdCkgc2IuYXBwZW5kKCIsICIpOworICAgICAgc2IuYXBwZW5kKCJ0YXJnZXRfbG9nX2xldmVsOiIpOworICAgICAgaWYgKHRoaXMudGFyZ2V0X2xvZ19sZXZlbCA9PSBudWxsKSB7CisgICAgICAgIHNiLmFwcGVuZCgibnVsbCIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2IuYXBwZW5kKHRoaXMudGFyZ2V0X2xvZ19sZXZlbCk7CisgICAgICB9CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0KKyAgICBpZiAoaXNfc2V0X3Jlc2V0X2xvZ19sZXZlbF90aW1lb3V0X3NlY3MoKSkgeworICAgICAgaWYgKCFmaXJzdCkgc2IuYXBwZW5kKCIsICIpOworICAgICAgc2IuYXBwZW5kKCJyZXNldF9sb2dfbGV2ZWxfdGltZW91dF9zZWNzOiIpOworICAgICAgc2IuYXBwZW5kKHRoaXMucmVzZXRfbG9nX2xldmVsX3RpbWVvdXRfc2Vjcyk7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0KKyAgICBpZiAoaXNfc2V0X3Jlc2V0X2xvZ19sZXZlbF90aW1lb3V0X2Vwb2NoKCkpIHsKKyAgICAgIGlmICghZmlyc3QpIHNiLmFwcGVuZCgiLCAiKTsKKyAgICAgIHNiLmFwcGVuZCgicmVzZXRfbG9nX2xldmVsX3RpbWVvdXRfZXBvY2g6Iik7CisgICAgICBzYi5hcHBlbmQodGhpcy5yZXNldF9sb2dfbGV2ZWxfdGltZW91dF9lcG9jaCk7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0KKyAgICBpZiAoaXNfc2V0X3Jlc2V0X2xvZ19sZXZlbCgpKSB7CisgICAgICBpZiAoIWZpcnN0KSBzYi5hcHBlbmQoIiwgIik7CisgICAgICBzYi5hcHBlbmQoInJlc2V0X2xvZ19sZXZlbDoiKTsKKyAgICAgIGlmICh0aGlzLnJlc2V0X2xvZ19sZXZlbCA9PSBudWxsKSB7CisgICAgICAgIHNiLmFwcGVuZCgibnVsbCIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2IuYXBwZW5kKHRoaXMucmVzZXRfbG9nX2xldmVsKTsKKyAgICAgIH0KKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfQorICAgIHNiLmFwcGVuZCgiKSIpOworICAgIHJldHVybiBzYi50b1N0cmluZygpOworICB9CisKKyAgcHVibGljIHZvaWQgdmFsaWRhdGUoKSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgLy8gY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcworICAgIGlmICghaXNfc2V0X2FjdGlvbigpKSB7CisgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRXhjZXB0aW9uKCJSZXF1aXJlZCBmaWVsZCAnYWN0aW9uJyBpcyB1bnNldCEgU3RydWN0OiIgKyB0b1N0cmluZygpKTsKKyAgICB9CisKKyAgICAvLyBjaGVjayBmb3Igc3ViLXN0cnVjdCB2YWxpZGl0eQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICB3cml0ZShuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbChuZXcgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRJT1N0cmVhbVRyYW5zcG9ydChvdXQpKSk7CisgICAgfSBjYXRjaCAob3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB0ZSkgeworICAgICAgdGhyb3cgbmV3IGphdmEuaW8uSU9FeGNlcHRpb24odGUpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0KGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0gaW4pIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgLy8gaXQgZG9lc24ndCBzZWVtIGxpa2UgeW91IHNob3VsZCBoYXZlIHRvIGRvIHRoaXMsIGJ1dCBqYXZhIHNlcmlhbGl6YXRpb24gaXMgd2Fja3ksIGFuZCBkb2Vzbid0IGNhbGwgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IuCisgICAgICBfX2lzc2V0X2JpdGZpZWxkID0gMDsKKyAgICAgIHJlYWQobmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRDb21wYWN0UHJvdG9jb2wobmV3IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5USU9TdHJlYW1UcmFuc3BvcnQoaW4pKSk7CisgICAgfSBjYXRjaCAob3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB0ZSkgeworICAgICAgdGhyb3cgbmV3IGphdmEuaW8uSU9FeGNlcHRpb24odGUpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIExvZ0xldmVsU3RhbmRhcmRTY2hlbWVGYWN0b3J5IGltcGxlbWVudHMgU2NoZW1lRmFjdG9yeSB7CisgICAgcHVibGljIExvZ0xldmVsU3RhbmRhcmRTY2hlbWUgZ2V0U2NoZW1lKCkgeworICAgICAgcmV0dXJuIG5ldyBMb2dMZXZlbFN0YW5kYXJkU2NoZW1lKCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTG9nTGV2ZWxTdGFuZGFyZFNjaGVtZSBleHRlbmRzIFN0YW5kYXJkU2NoZW1lPExvZ0xldmVsPiB7CisKKyAgICBwdWJsaWMgdm9pZCByZWFkKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBpcHJvdCwgTG9nTGV2ZWwgc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgc2NoZW1lRmllbGQ7CisgICAgICBpcHJvdC5yZWFkU3RydWN0QmVnaW4oKTsKKyAgICAgIHdoaWxlICh0cnVlKQorICAgICAgeworICAgICAgICBzY2hlbWVGaWVsZCA9IGlwcm90LnJlYWRGaWVsZEJlZ2luKCk7CisgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUT1ApIHsgCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChzY2hlbWVGaWVsZC5pZCkgeworICAgICAgICAgIGNhc2UgMTogLy8gQUNUSU9OCisgICAgICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JMzIpIHsKKyAgICAgICAgICAgICAgc3RydWN0LmFjdGlvbiA9IGJhY2t0eXBlLnN0b3JtLmdlbmVyYXRlZC5Mb2dMZXZlbEFjdGlvbi5maW5kQnlWYWx1ZShpcHJvdC5yZWFkSTMyKCkpOworICAgICAgICAgICAgICBzdHJ1Y3Quc2V0X2FjdGlvbl9pc1NldCh0cnVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7IAorICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAyOiAvLyBUQVJHRVRfTE9HX0xFVkVMCisgICAgICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcpIHsKKyAgICAgICAgICAgICAgc3RydWN0LnRhcmdldF9sb2dfbGV2ZWwgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICAgIHN0cnVjdC5zZXRfdGFyZ2V0X2xvZ19sZXZlbF9pc1NldCh0cnVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7IAorICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAzOiAvLyBSRVNFVF9MT0dfTEVWRUxfVElNRU9VVF9TRUNTCisgICAgICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JMzIpIHsKKyAgICAgICAgICAgICAgc3RydWN0LnJlc2V0X2xvZ19sZXZlbF90aW1lb3V0X3NlY3MgPSBpcHJvdC5yZWFkSTMyKCk7CisgICAgICAgICAgICAgIHN0cnVjdC5zZXRfcmVzZXRfbG9nX2xldmVsX3RpbWVvdXRfc2Vjc19pc1NldCh0cnVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7IAorICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSA0OiAvLyBSRVNFVF9MT0dfTEVWRUxfVElNRU9VVF9FUE9DSAorICAgICAgICAgICAgaWYgKHNjaGVtZUZpZWxkLnR5cGUgPT0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTY0KSB7CisgICAgICAgICAgICAgIHN0cnVjdC5yZXNldF9sb2dfbGV2ZWxfdGltZW91dF9lcG9jaCA9IGlwcm90LnJlYWRJNjQoKTsKKyAgICAgICAgICAgICAgc3RydWN0LnNldF9yZXNldF9sb2dfbGV2ZWxfdGltZW91dF9lcG9jaF9pc1NldCh0cnVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7IAorICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSA1OiAvLyBSRVNFVF9MT0dfTEVWRUwKKyAgICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORykgeworICAgICAgICAgICAgICBzdHJ1Y3QucmVzZXRfbG9nX2xldmVsID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICAgICAgICBzdHJ1Y3Quc2V0X3Jlc2V0X2xvZ19sZXZlbF9pc1NldCh0cnVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7IAorICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgc2NoZW1lRmllbGQudHlwZSk7CisgICAgICAgIH0KKyAgICAgICAgaXByb3QucmVhZEZpZWxkRW5kKCk7CisgICAgICB9CisgICAgICBpcHJvdC5yZWFkU3RydWN0RW5kKCk7CisgICAgICBzdHJ1Y3QudmFsaWRhdGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgb3Byb3QsIExvZ0xldmVsIHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgc3RydWN0LnZhbGlkYXRlKCk7CisKKyAgICAgIG9wcm90LndyaXRlU3RydWN0QmVnaW4oU1RSVUNUX0RFU0MpOworICAgICAgaWYgKHN0cnVjdC5hY3Rpb24gIT0gbnVsbCkgeworICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oQUNUSU9OX0ZJRUxEX0RFU0MpOworICAgICAgICBvcHJvdC53cml0ZUkzMihzdHJ1Y3QuYWN0aW9uLmdldFZhbHVlKCkpOworICAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LnRhcmdldF9sb2dfbGV2ZWwgIT0gbnVsbCkgeworICAgICAgICBpZiAoc3RydWN0LmlzX3NldF90YXJnZXRfbG9nX2xldmVsKCkpIHsKKyAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oVEFSR0VUX0xPR19MRVZFTF9GSUVMRF9ERVNDKTsKKyAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhzdHJ1Y3QudGFyZ2V0X2xvZ19sZXZlbCk7CisgICAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9yZXNldF9sb2dfbGV2ZWxfdGltZW91dF9zZWNzKCkpIHsKKyAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKFJFU0VUX0xPR19MRVZFTF9USU1FT1VUX1NFQ1NfRklFTERfREVTQyk7CisgICAgICAgIG9wcm90LndyaXRlSTMyKHN0cnVjdC5yZXNldF9sb2dfbGV2ZWxfdGltZW91dF9zZWNzKTsKKyAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5pc19zZXRfcmVzZXRfbG9nX2xldmVsX3RpbWVvdXRfZXBvY2goKSkgeworICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oUkVTRVRfTE9HX0xFVkVMX1RJTUVPVVRfRVBPQ0hfRklFTERfREVTQyk7CisgICAgICAgIG9wcm90LndyaXRlSTY0KHN0cnVjdC5yZXNldF9sb2dfbGV2ZWxfdGltZW91dF9lcG9jaCk7CisgICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QucmVzZXRfbG9nX2xldmVsICE9IG51bGwpIHsKKyAgICAgICAgaWYgKHN0cnVjdC5pc19zZXRfcmVzZXRfbG9nX2xldmVsKCkpIHsKKyAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oUkVTRVRfTE9HX0xFVkVMX0ZJRUxEX0RFU0MpOworICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKHN0cnVjdC5yZXNldF9sb2dfbGV2ZWwpOworICAgICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgb3Byb3Qud3JpdGVGaWVsZFN0b3AoKTsKKyAgICAgIG9wcm90LndyaXRlU3RydWN0RW5kKCk7CisgICAgfQorCisgIH0KKworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBMb2dMZXZlbFR1cGxlU2NoZW1lRmFjdG9yeSBpbXBsZW1lbnRzIFNjaGVtZUZhY3RvcnkgeworICAgIHB1YmxpYyBMb2dMZXZlbFR1cGxlU2NoZW1lIGdldFNjaGVtZSgpIHsKKyAgICAgIHJldHVybiBuZXcgTG9nTGV2ZWxUdXBsZVNjaGVtZSgpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIExvZ0xldmVsVHVwbGVTY2hlbWUgZXh0ZW5kcyBUdXBsZVNjaGVtZTxMb2dMZXZlbD4geworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIHByb3QsIExvZ0xldmVsIHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgVFR1cGxlUHJvdG9jb2wgb3Byb3QgPSAoVFR1cGxlUHJvdG9jb2wpIHByb3Q7CisgICAgICBvcHJvdC53cml0ZUkzMihzdHJ1Y3QuYWN0aW9uLmdldFZhbHVlKCkpOworICAgICAgQml0U2V0IG9wdGlvbmFscyA9IG5ldyBCaXRTZXQoKTsKKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X3RhcmdldF9sb2dfbGV2ZWwoKSkgeworICAgICAgICBvcHRpb25hbHMuc2V0KDApOworICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5pc19zZXRfcmVzZXRfbG9nX2xldmVsX3RpbWVvdXRfc2VjcygpKSB7CisgICAgICAgIG9wdGlvbmFscy5zZXQoMSk7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9yZXNldF9sb2dfbGV2ZWxfdGltZW91dF9lcG9jaCgpKSB7CisgICAgICAgIG9wdGlvbmFscy5zZXQoMik7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9yZXNldF9sb2dfbGV2ZWwoKSkgeworICAgICAgICBvcHRpb25hbHMuc2V0KDMpOworICAgICAgfQorICAgICAgb3Byb3Qud3JpdGVCaXRTZXQob3B0aW9uYWxzLCA0KTsKKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X3RhcmdldF9sb2dfbGV2ZWwoKSkgeworICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhzdHJ1Y3QudGFyZ2V0X2xvZ19sZXZlbCk7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9yZXNldF9sb2dfbGV2ZWxfdGltZW91dF9zZWNzKCkpIHsKKyAgICAgICAgb3Byb3Qud3JpdGVJMzIoc3RydWN0LnJlc2V0X2xvZ19sZXZlbF90aW1lb3V0X3NlY3MpOworICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5pc19zZXRfcmVzZXRfbG9nX2xldmVsX3RpbWVvdXRfZXBvY2goKSkgeworICAgICAgICBvcHJvdC53cml0ZUk2NChzdHJ1Y3QucmVzZXRfbG9nX2xldmVsX3RpbWVvdXRfZXBvY2gpOworICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5pc19zZXRfcmVzZXRfbG9nX2xldmVsKCkpIHsKKyAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoc3RydWN0LnJlc2V0X2xvZ19sZXZlbCk7CisgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVhZChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgcHJvdCwgTG9nTGV2ZWwgc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICBUVHVwbGVQcm90b2NvbCBpcHJvdCA9IChUVHVwbGVQcm90b2NvbCkgcHJvdDsKKyAgICAgIHN0cnVjdC5hY3Rpb24gPSBiYWNrdHlwZS5zdG9ybS5nZW5lcmF0ZWQuTG9nTGV2ZWxBY3Rpb24uZmluZEJ5VmFsdWUoaXByb3QucmVhZEkzMigpKTsKKyAgICAgIHN0cnVjdC5zZXRfYWN0aW9uX2lzU2V0KHRydWUpOworICAgICAgQml0U2V0IGluY29taW5nID0gaXByb3QucmVhZEJpdFNldCg0KTsKKyAgICAgIGlmIChpbmNvbWluZy5nZXQoMCkpIHsKKyAgICAgICAgc3RydWN0LnRhcmdldF9sb2dfbGV2ZWwgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgIHN0cnVjdC5zZXRfdGFyZ2V0X2xvZ19sZXZlbF9pc1NldCh0cnVlKTsKKyAgICAgIH0KKyAgICAgIGlmIChpbmNvbWluZy5nZXQoMSkpIHsKKyAgICAgICAgc3RydWN0LnJlc2V0X2xvZ19sZXZlbF90aW1lb3V0X3NlY3MgPSBpcHJvdC5yZWFkSTMyKCk7CisgICAgICAgIHN0cnVjdC5zZXRfcmVzZXRfbG9nX2xldmVsX3RpbWVvdXRfc2Vjc19pc1NldCh0cnVlKTsKKyAgICAgIH0KKyAgICAgIGlmIChpbmNvbWluZy5nZXQoMikpIHsKKyAgICAgICAgc3RydWN0LnJlc2V0X2xvZ19sZXZlbF90aW1lb3V0X2Vwb2NoID0gaXByb3QucmVhZEk2NCgpOworICAgICAgICBzdHJ1Y3Quc2V0X3Jlc2V0X2xvZ19sZXZlbF90aW1lb3V0X2Vwb2NoX2lzU2V0KHRydWUpOworICAgICAgfQorICAgICAgaWYgKGluY29taW5nLmdldCgzKSkgeworICAgICAgICBzdHJ1Y3QucmVzZXRfbG9nX2xldmVsID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICBzdHJ1Y3Quc2V0X3Jlc2V0X2xvZ19sZXZlbF9pc1NldCh0cnVlKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworfQorCmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL0xvZ0xldmVsQWN0aW9uLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL0xvZ0xldmVsQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVkMjM2NQotLS0gL2Rldi9udWxsCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvTG9nTGV2ZWxBY3Rpb24uamF2YQpAQCAtMCwwICsxLDY1IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLyoqCisgKiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjMpCisgKgorICogRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lORworICogIEBnZW5lcmF0ZWQKKyAqLworcGFja2FnZSBiYWNrdHlwZS5zdG9ybS5nZW5lcmF0ZWQ7CisKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEVudW07CisKK3B1YmxpYyBlbnVtIExvZ0xldmVsQWN0aW9uIGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVEVudW0geworICBVTkNIQU5HRUQoMSksCisgIFVQREFURSgyKSwKKyAgUkVNT1ZFKDMpOworCisgIHByaXZhdGUgZmluYWwgaW50IHZhbHVlOworCisgIHByaXZhdGUgTG9nTGV2ZWxBY3Rpb24oaW50IHZhbHVlKSB7CisgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICB9CisKKyAgLyoqCisgICAqIEdldCB0aGUgaW50ZWdlciB2YWx1ZSBvZiB0aGlzIGVudW0gdmFsdWUsIGFzIGRlZmluZWQgaW4gdGhlIFRocmlmdCBJREwuCisgICAqLworICBwdWJsaWMgaW50IGdldFZhbHVlKCkgeworICAgIHJldHVybiB2YWx1ZTsKKyAgfQorCisgIC8qKgorICAgKiBGaW5kIGEgdGhlIGVudW0gdHlwZSBieSBpdHMgaW50ZWdlciB2YWx1ZSwgYXMgZGVmaW5lZCBpbiB0aGUgVGhyaWZ0IElETC4KKyAgICogQHJldHVybiBudWxsIGlmIHRoZSB2YWx1ZSBpcyBub3QgZm91bmQuCisgICAqLworICBwdWJsaWMgc3RhdGljIExvZ0xldmVsQWN0aW9uIGZpbmRCeVZhbHVlKGludCB2YWx1ZSkgeyAKKyAgICBzd2l0Y2ggKHZhbHVlKSB7CisgICAgICBjYXNlIDE6CisgICAgICAgIHJldHVybiBVTkNIQU5HRUQ7CisgICAgICBjYXNlIDI6CisgICAgICAgIHJldHVybiBVUERBVEU7CisgICAgICBjYXNlIDM6CisgICAgICAgIHJldHVybiBSRU1PVkU7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvTmltYnVzLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL05pbWJ1cy5qYXZhCmluZGV4IDNhNWQ1ZGYuLjk4ZDJkMWMgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvTmltYnVzLmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9OaW1idXMuamF2YQpAQCAtMTYsNyArMTYsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIC8qKgotICogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4yKQorICogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4zKQogICoKICAqIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkcKICAqICBAZ2VuZXJhdGVkCkBAIC01MSw3ICs1MSw3IEBACiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKIEBTdXBwcmVzc1dhcm5pbmdzKHsiY2FzdCIsICJyYXd0eXBlcyIsICJzZXJpYWwiLCAidW5jaGVja2VkIn0pCi1AR2VuZXJhdGVkKHZhbHVlID0gIkF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMikiLCBkYXRlID0gIjIwMTUtOC0yNCIpCitAR2VuZXJhdGVkKHZhbHVlID0gIkF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMykiKQogcHVibGljIGNsYXNzIE5pbWJ1cyB7CiAKICAgcHVibGljIGludGVyZmFjZSBJZmFjZSB7CkBAIC03MCw2ICs3MCwxMCBAQAogCiAgICAgcHVibGljIHZvaWQgcmViYWxhbmNlKFN0cmluZyBuYW1lLCBSZWJhbGFuY2VPcHRpb25zIG9wdGlvbnMpIHRocm93cyBOb3RBbGl2ZUV4Y2VwdGlvbiwgSW52YWxpZFRvcG9sb2d5RXhjZXB0aW9uLCBBdXRob3JpemF0aW9uRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOwogCisgICAgcHVibGljIHZvaWQgc2V0TG9nQ29uZmlnKFN0cmluZyBuYW1lLCBMb2dDb25maWcgY29uZmlnKSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKKworICAgIHB1YmxpYyBMb2dDb25maWcgZ2V0TG9nQ29uZmlnKFN0cmluZyBuYW1lKSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKKwogICAgIC8qKgogICAgICAqIEVuYWJsZS9kaXNhYmxlIGxvZ2dpbmcgdGhlIHR1cGxlcyBnZW5lcmF0ZWQgaW4gdG9wb2xvZ3kgdmlhIGFuIGludGVybmFsIEV2ZW50TG9nZ2VyIGJvbHQuIFRoZSBjb21wb25lbnQgbmFtZSBpcyBvcHRpb25hbAogICAgICAqIGFuZCBpZiBudWxsIG9yIGVtcHR5LCB0aGUgZGVidWcgZmxhZyB3aWxsIGFwcGx5IHRvIHRoZSBlbnRpcmUgdG9wb2xvZ3kuCkBAIC04NCw2ICs4OCwxMCBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGRlYnVnKFN0cmluZyBuYW1lLCBTdHJpbmcgY29tcG9uZW50LCBib29sZWFuIGVuYWJsZSwgZG91YmxlIHNhbXBsaW5nUGVyY2VudGFnZSkgdGhyb3dzIE5vdEFsaXZlRXhjZXB0aW9uLCBBdXRob3JpemF0aW9uRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOwogCisgICAgcHVibGljIHZvaWQgc2V0V29ya2VyUHJvZmlsZXIoU3RyaW5nIGlkLCBQcm9maWxlUmVxdWVzdCBwcm9maWxlUmVxdWVzdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CisKKyAgICBwdWJsaWMgTGlzdDxQcm9maWxlUmVxdWVzdD4gZ2V0Q29tcG9uZW50UGVuZGluZ1Byb2ZpbGVBY3Rpb25zKFN0cmluZyBpZCwgU3RyaW5nIGNvbXBvbmVudF9pZCwgUHJvZmlsZUFjdGlvbiBhY3Rpb24pIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOworCiAgICAgcHVibGljIHZvaWQgdXBsb2FkTmV3Q3JlZGVudGlhbHMoU3RyaW5nIG5hbWUsIENyZWRlbnRpYWxzIGNyZWRzKSB0aHJvd3MgTm90QWxpdmVFeGNlcHRpb24sIEludmFsaWRUb3BvbG9neUV4Y2VwdGlvbiwgQXV0aG9yaXphdGlvbkV4Y2VwdGlvbiwgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKIAogICAgIHB1YmxpYyBTdHJpbmcgYmVnaW5GaWxlVXBsb2FkKCkgdGhyb3dzIEF1dGhvcml6YXRpb25FeGNlcHRpb24sIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CkBAIC0xMDQsNiArMTEyLDEwIEBACiAKICAgICBwdWJsaWMgVG9wb2xvZ3lJbmZvIGdldFRvcG9sb2d5SW5mb1dpdGhPcHRzKFN0cmluZyBpZCwgR2V0SW5mb09wdGlvbnMgb3B0aW9ucykgdGhyb3dzIE5vdEFsaXZlRXhjZXB0aW9uLCBBdXRob3JpemF0aW9uRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOwogCisgICAgcHVibGljIFRvcG9sb2d5UGFnZUluZm8gZ2V0VG9wb2xvZ3lQYWdlSW5mbyhTdHJpbmcgaWQsIFN0cmluZyB3aW5kb3csIGJvb2xlYW4gaXNfaW5jbHVkZV9zeXMpIHRocm93cyBOb3RBbGl2ZUV4Y2VwdGlvbiwgQXV0aG9yaXphdGlvbkV4Y2VwdGlvbiwgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKKworICAgIHB1YmxpYyBDb21wb25lbnRQYWdlSW5mbyBnZXRDb21wb25lbnRQYWdlSW5mbyhTdHJpbmcgdG9wb2xvZ3lfaWQsIFN0cmluZyBjb21wb25lbnRfaWQsIFN0cmluZyB3aW5kb3csIGJvb2xlYW4gaXNfaW5jbHVkZV9zeXMpIHRocm93cyBOb3RBbGl2ZUV4Y2VwdGlvbiwgQXV0aG9yaXphdGlvbkV4Y2VwdGlvbiwgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKKwogICAgIHB1YmxpYyBTdHJpbmcgZ2V0VG9wb2xvZ3lDb25mKFN0cmluZyBpZCkgdGhyb3dzIE5vdEFsaXZlRXhjZXB0aW9uLCBBdXRob3JpemF0aW9uRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOwogCiAgICAgLyoqCkBAIC0xMjAsNiArMTMyLDggQEAKICAgICAgKi8KICAgICBwdWJsaWMgU3Rvcm1Ub3BvbG9neSBnZXRVc2VyVG9wb2xvZ3koU3RyaW5nIGlkKSB0aHJvd3MgTm90QWxpdmVFeGNlcHRpb24sIEF1dGhvcml6YXRpb25FeGNlcHRpb24sIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CiAKKyAgICBwdWJsaWMgVG9wb2xvZ3lIaXN0b3J5SW5mbyBnZXRUb3BvbG9neUhpc3RvcnkoU3RyaW5nIHVzZXIpIHRocm93cyBBdXRob3JpemF0aW9uRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOworCiAgIH0KIAogICBwdWJsaWMgaW50ZXJmYWNlIEFzeW5jSWZhY2UgewpAQCAtMTM4LDggKzE1MiwxNiBAQAogCiAgICAgcHVibGljIHZvaWQgcmViYWxhbmNlKFN0cmluZyBuYW1lLCBSZWJhbGFuY2VPcHRpb25zIG9wdGlvbnMsIG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLkFzeW5jTWV0aG9kQ2FsbGJhY2sgcmVzdWx0SGFuZGxlcikgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CiAKKyAgICBwdWJsaWMgdm9pZCBzZXRMb2dDb25maWcoU3RyaW5nIG5hbWUsIExvZ0NvbmZpZyBjb25maWcsIG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLkFzeW5jTWV0aG9kQ2FsbGJhY2sgcmVzdWx0SGFuZGxlcikgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CisKKyAgICBwdWJsaWMgdm9pZCBnZXRMb2dDb25maWcoU3RyaW5nIG5hbWUsIG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLkFzeW5jTWV0aG9kQ2FsbGJhY2sgcmVzdWx0SGFuZGxlcikgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CisKICAgICBwdWJsaWMgdm9pZCBkZWJ1ZyhTdHJpbmcgbmFtZSwgU3RyaW5nIGNvbXBvbmVudCwgYm9vbGVhbiBlbmFibGUsIGRvdWJsZSBzYW1wbGluZ1BlcmNlbnRhZ2UsIG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLkFzeW5jTWV0aG9kQ2FsbGJhY2sgcmVzdWx0SGFuZGxlcikgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CiAKKyAgICBwdWJsaWMgdm9pZCBzZXRXb3JrZXJQcm9maWxlcihTdHJpbmcgaWQsIFByb2ZpbGVSZXF1ZXN0IHByb2ZpbGVSZXF1ZXN0LCBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5Bc3luY01ldGhvZENhbGxiYWNrIHJlc3VsdEhhbmRsZXIpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOworCisgICAgcHVibGljIHZvaWQgZ2V0Q29tcG9uZW50UGVuZGluZ1Byb2ZpbGVBY3Rpb25zKFN0cmluZyBpZCwgU3RyaW5nIGNvbXBvbmVudF9pZCwgUHJvZmlsZUFjdGlvbiBhY3Rpb24sIG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLkFzeW5jTWV0aG9kQ2FsbGJhY2sgcmVzdWx0SGFuZGxlcikgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CisKICAgICBwdWJsaWMgdm9pZCB1cGxvYWROZXdDcmVkZW50aWFscyhTdHJpbmcgbmFtZSwgQ3JlZGVudGlhbHMgY3JlZHMsIG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLkFzeW5jTWV0aG9kQ2FsbGJhY2sgcmVzdWx0SGFuZGxlcikgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CiAKICAgICBwdWJsaWMgdm9pZCBiZWdpbkZpbGVVcGxvYWQob3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuQXN5bmNNZXRob2RDYWxsYmFjayByZXN1bHRIYW5kbGVyKSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKQEAgLTE2MCwxMiArMTgyLDE4IEBACiAKICAgICBwdWJsaWMgdm9pZCBnZXRUb3BvbG9neUluZm9XaXRoT3B0cyhTdHJpbmcgaWQsIEdldEluZm9PcHRpb25zIG9wdGlvbnMsIG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLkFzeW5jTWV0aG9kQ2FsbGJhY2sgcmVzdWx0SGFuZGxlcikgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CiAKKyAgICBwdWJsaWMgdm9pZCBnZXRUb3BvbG9neVBhZ2VJbmZvKFN0cmluZyBpZCwgU3RyaW5nIHdpbmRvdywgYm9vbGVhbiBpc19pbmNsdWRlX3N5cywgb3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuQXN5bmNNZXRob2RDYWxsYmFjayByZXN1bHRIYW5kbGVyKSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKKworICAgIHB1YmxpYyB2b2lkIGdldENvbXBvbmVudFBhZ2VJbmZvKFN0cmluZyB0b3BvbG9neV9pZCwgU3RyaW5nIGNvbXBvbmVudF9pZCwgU3RyaW5nIHdpbmRvdywgYm9vbGVhbiBpc19pbmNsdWRlX3N5cywgb3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuQXN5bmNNZXRob2RDYWxsYmFjayByZXN1bHRIYW5kbGVyKSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKKwogICAgIHB1YmxpYyB2b2lkIGdldFRvcG9sb2d5Q29uZihTdHJpbmcgaWQsIG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLkFzeW5jTWV0aG9kQ2FsbGJhY2sgcmVzdWx0SGFuZGxlcikgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CiAKICAgICBwdWJsaWMgdm9pZCBnZXRUb3BvbG9neShTdHJpbmcgaWQsIG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLkFzeW5jTWV0aG9kQ2FsbGJhY2sgcmVzdWx0SGFuZGxlcikgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CiAKICAgICBwdWJsaWMgdm9pZCBnZXRVc2VyVG9wb2xvZ3koU3RyaW5nIGlkLCBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5Bc3luY01ldGhvZENhbGxiYWNrIHJlc3VsdEhhbmRsZXIpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOwogCisgICAgcHVibGljIHZvaWQgZ2V0VG9wb2xvZ3lIaXN0b3J5KFN0cmluZyB1c2VyLCBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5Bc3luY01ldGhvZENhbGxiYWNrIHJlc3VsdEhhbmRsZXIpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOworCiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGNsYXNzIENsaWVudCBleHRlbmRzIG9yZy5hcGFjaGUudGhyaWZ0LlRTZXJ2aWNlQ2xpZW50IGltcGxlbWVudHMgSWZhY2UgewpAQCAtMzg4LDYgKzQxNiw1MCBAQAogICAgICAgcmV0dXJuOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHNldExvZ0NvbmZpZyhTdHJpbmcgbmFtZSwgTG9nQ29uZmlnIGNvbmZpZykgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24KKyAgICB7CisgICAgICBzZW5kX3NldExvZ0NvbmZpZyhuYW1lLCBjb25maWcpOworICAgICAgcmVjdl9zZXRMb2dDb25maWcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZW5kX3NldExvZ0NvbmZpZyhTdHJpbmcgbmFtZSwgTG9nQ29uZmlnIGNvbmZpZykgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24KKyAgICB7CisgICAgICBzZXRMb2dDb25maWdfYXJncyBhcmdzID0gbmV3IHNldExvZ0NvbmZpZ19hcmdzKCk7CisgICAgICBhcmdzLnNldF9uYW1lKG5hbWUpOworICAgICAgYXJncy5zZXRfY29uZmlnKGNvbmZpZyk7CisgICAgICBzZW5kQmFzZSgic2V0TG9nQ29uZmlnIiwgYXJncyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVjdl9zZXRMb2dDb25maWcoKSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbgorICAgIHsKKyAgICAgIHNldExvZ0NvbmZpZ19yZXN1bHQgcmVzdWx0ID0gbmV3IHNldExvZ0NvbmZpZ19yZXN1bHQoKTsKKyAgICAgIHJlY2VpdmVCYXNlKHJlc3VsdCwgInNldExvZ0NvbmZpZyIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHB1YmxpYyBMb2dDb25maWcgZ2V0TG9nQ29uZmlnKFN0cmluZyBuYW1lKSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbgorICAgIHsKKyAgICAgIHNlbmRfZ2V0TG9nQ29uZmlnKG5hbWUpOworICAgICAgcmV0dXJuIHJlY3ZfZ2V0TG9nQ29uZmlnKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2VuZF9nZXRMb2dDb25maWcoU3RyaW5nIG5hbWUpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uCisgICAgeworICAgICAgZ2V0TG9nQ29uZmlnX2FyZ3MgYXJncyA9IG5ldyBnZXRMb2dDb25maWdfYXJncygpOworICAgICAgYXJncy5zZXRfbmFtZShuYW1lKTsKKyAgICAgIHNlbmRCYXNlKCJnZXRMb2dDb25maWciLCBhcmdzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTG9nQ29uZmlnIHJlY3ZfZ2V0TG9nQ29uZmlnKCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24KKyAgICB7CisgICAgICBnZXRMb2dDb25maWdfcmVzdWx0IHJlc3VsdCA9IG5ldyBnZXRMb2dDb25maWdfcmVzdWx0KCk7CisgICAgICByZWNlaXZlQmFzZShyZXN1bHQsICJnZXRMb2dDb25maWciKTsKKyAgICAgIGlmIChyZXN1bHQuaXNfc2V0X3N1Y2Nlc3MoKSkgeworICAgICAgICByZXR1cm4gcmVzdWx0LnN1Y2Nlc3M7CisgICAgICB9CisgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS50aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKG9yZy5hcGFjaGUudGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5NSVNTSU5HX1JFU1VMVCwgImdldExvZ0NvbmZpZyBmYWlsZWQ6IHVua25vd24gcmVzdWx0Iik7CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgZGVidWcoU3RyaW5nIG5hbWUsIFN0cmluZyBjb21wb25lbnQsIGJvb2xlYW4gZW5hYmxlLCBkb3VibGUgc2FtcGxpbmdQZXJjZW50YWdlKSB0aHJvd3MgTm90QWxpdmVFeGNlcHRpb24sIEF1dGhvcml6YXRpb25FeGNlcHRpb24sIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24KICAgICB7CiAgICAgICBzZW5kX2RlYnVnKG5hbWUsIGNvbXBvbmVudCwgZW5hYmxlLCBzYW1wbGluZ1BlcmNlbnRhZ2UpOwpAQCAtNDE3LDYgKzQ4OSw1MiBAQAogICAgICAgcmV0dXJuOwogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIHNldFdvcmtlclByb2ZpbGVyKFN0cmluZyBpZCwgUHJvZmlsZVJlcXVlc3QgcHJvZmlsZVJlcXVlc3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uCisgICAgeworICAgICAgc2VuZF9zZXRXb3JrZXJQcm9maWxlcihpZCwgcHJvZmlsZVJlcXVlc3QpOworICAgICAgcmVjdl9zZXRXb3JrZXJQcm9maWxlcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNlbmRfc2V0V29ya2VyUHJvZmlsZXIoU3RyaW5nIGlkLCBQcm9maWxlUmVxdWVzdCBwcm9maWxlUmVxdWVzdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24KKyAgICB7CisgICAgICBzZXRXb3JrZXJQcm9maWxlcl9hcmdzIGFyZ3MgPSBuZXcgc2V0V29ya2VyUHJvZmlsZXJfYXJncygpOworICAgICAgYXJncy5zZXRfaWQoaWQpOworICAgICAgYXJncy5zZXRfcHJvZmlsZVJlcXVlc3QocHJvZmlsZVJlcXVlc3QpOworICAgICAgc2VuZEJhc2UoInNldFdvcmtlclByb2ZpbGVyIiwgYXJncyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVjdl9zZXRXb3JrZXJQcm9maWxlcigpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uCisgICAgeworICAgICAgc2V0V29ya2VyUHJvZmlsZXJfcmVzdWx0IHJlc3VsdCA9IG5ldyBzZXRXb3JrZXJQcm9maWxlcl9yZXN1bHQoKTsKKyAgICAgIHJlY2VpdmVCYXNlKHJlc3VsdCwgInNldFdvcmtlclByb2ZpbGVyIik7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgcHVibGljIExpc3Q8UHJvZmlsZVJlcXVlc3Q+IGdldENvbXBvbmVudFBlbmRpbmdQcm9maWxlQWN0aW9ucyhTdHJpbmcgaWQsIFN0cmluZyBjb21wb25lbnRfaWQsIFByb2ZpbGVBY3Rpb24gYWN0aW9uKSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbgorICAgIHsKKyAgICAgIHNlbmRfZ2V0Q29tcG9uZW50UGVuZGluZ1Byb2ZpbGVBY3Rpb25zKGlkLCBjb21wb25lbnRfaWQsIGFjdGlvbik7CisgICAgICByZXR1cm4gcmVjdl9nZXRDb21wb25lbnRQZW5kaW5nUHJvZmlsZUFjdGlvbnMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZW5kX2dldENvbXBvbmVudFBlbmRpbmdQcm9maWxlQWN0aW9ucyhTdHJpbmcgaWQsIFN0cmluZyBjb21wb25lbnRfaWQsIFByb2ZpbGVBY3Rpb24gYWN0aW9uKSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbgorICAgIHsKKyAgICAgIGdldENvbXBvbmVudFBlbmRpbmdQcm9maWxlQWN0aW9uc19hcmdzIGFyZ3MgPSBuZXcgZ2V0Q29tcG9uZW50UGVuZGluZ1Byb2ZpbGVBY3Rpb25zX2FyZ3MoKTsKKyAgICAgIGFyZ3Muc2V0X2lkKGlkKTsKKyAgICAgIGFyZ3Muc2V0X2NvbXBvbmVudF9pZChjb21wb25lbnRfaWQpOworICAgICAgYXJncy5zZXRfYWN0aW9uKGFjdGlvbik7CisgICAgICBzZW5kQmFzZSgiZ2V0Q29tcG9uZW50UGVuZGluZ1Byb2ZpbGVBY3Rpb25zIiwgYXJncyk7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8UHJvZmlsZVJlcXVlc3Q+IHJlY3ZfZ2V0Q29tcG9uZW50UGVuZGluZ1Byb2ZpbGVBY3Rpb25zKCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24KKyAgICB7CisgICAgICBnZXRDb21wb25lbnRQZW5kaW5nUHJvZmlsZUFjdGlvbnNfcmVzdWx0IHJlc3VsdCA9IG5ldyBnZXRDb21wb25lbnRQZW5kaW5nUHJvZmlsZUFjdGlvbnNfcmVzdWx0KCk7CisgICAgICByZWNlaXZlQmFzZShyZXN1bHQsICJnZXRDb21wb25lbnRQZW5kaW5nUHJvZmlsZUFjdGlvbnMiKTsKKyAgICAgIGlmIChyZXN1bHQuaXNfc2V0X3N1Y2Nlc3MoKSkgeworICAgICAgICByZXR1cm4gcmVzdWx0LnN1Y2Nlc3M7CisgICAgICB9CisgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS50aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKG9yZy5hcGFjaGUudGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5NSVNTSU5HX1JFU1VMVCwgImdldENvbXBvbmVudFBlbmRpbmdQcm9maWxlQWN0aW9ucyBmYWlsZWQ6IHVua25vd24gcmVzdWx0Iik7CisgICAgfQorCiAgICAgcHVibGljIHZvaWQgdXBsb2FkTmV3Q3JlZGVudGlhbHMoU3RyaW5nIG5hbWUsIENyZWRlbnRpYWxzIGNyZWRzKSB0aHJvd3MgTm90QWxpdmVFeGNlcHRpb24sIEludmFsaWRUb3BvbG9neUV4Y2VwdGlvbiwgQXV0aG9yaXphdGlvbkV4Y2VwdGlvbiwgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbgogICAgIHsKICAgICAgIHNlbmRfdXBsb2FkTmV3Q3JlZGVudGlhbHMobmFtZSwgY3JlZHMpOwpAQCAtNjgwLDYgKzc5OCw2OSBAQAogICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUudGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbihvcmcuYXBhY2hlLnRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24uTUlTU0lOR19SRVNVTFQsICJnZXRUb3BvbG9neUluZm9XaXRoT3B0cyBmYWlsZWQ6IHVua25vd24gcmVzdWx0Iik7CiAgICAgfQogCisgICAgcHVibGljIFRvcG9sb2d5UGFnZUluZm8gZ2V0VG9wb2xvZ3lQYWdlSW5mbyhTdHJpbmcgaWQsIFN0cmluZyB3aW5kb3csIGJvb2xlYW4gaXNfaW5jbHVkZV9zeXMpIHRocm93cyBOb3RBbGl2ZUV4Y2VwdGlvbiwgQXV0aG9yaXphdGlvbkV4Y2VwdGlvbiwgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbgorICAgIHsKKyAgICAgIHNlbmRfZ2V0VG9wb2xvZ3lQYWdlSW5mbyhpZCwgd2luZG93LCBpc19pbmNsdWRlX3N5cyk7CisgICAgICByZXR1cm4gcmVjdl9nZXRUb3BvbG9neVBhZ2VJbmZvKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2VuZF9nZXRUb3BvbG9neVBhZ2VJbmZvKFN0cmluZyBpZCwgU3RyaW5nIHdpbmRvdywgYm9vbGVhbiBpc19pbmNsdWRlX3N5cykgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24KKyAgICB7CisgICAgICBnZXRUb3BvbG9neVBhZ2VJbmZvX2FyZ3MgYXJncyA9IG5ldyBnZXRUb3BvbG9neVBhZ2VJbmZvX2FyZ3MoKTsKKyAgICAgIGFyZ3Muc2V0X2lkKGlkKTsKKyAgICAgIGFyZ3Muc2V0X3dpbmRvdyh3aW5kb3cpOworICAgICAgYXJncy5zZXRfaXNfaW5jbHVkZV9zeXMoaXNfaW5jbHVkZV9zeXMpOworICAgICAgc2VuZEJhc2UoImdldFRvcG9sb2d5UGFnZUluZm8iLCBhcmdzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVG9wb2xvZ3lQYWdlSW5mbyByZWN2X2dldFRvcG9sb2d5UGFnZUluZm8oKSB0aHJvd3MgTm90QWxpdmVFeGNlcHRpb24sIEF1dGhvcml6YXRpb25FeGNlcHRpb24sIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24KKyAgICB7CisgICAgICBnZXRUb3BvbG9neVBhZ2VJbmZvX3Jlc3VsdCByZXN1bHQgPSBuZXcgZ2V0VG9wb2xvZ3lQYWdlSW5mb19yZXN1bHQoKTsKKyAgICAgIHJlY2VpdmVCYXNlKHJlc3VsdCwgImdldFRvcG9sb2d5UGFnZUluZm8iKTsKKyAgICAgIGlmIChyZXN1bHQuaXNfc2V0X3N1Y2Nlc3MoKSkgeworICAgICAgICByZXR1cm4gcmVzdWx0LnN1Y2Nlc3M7CisgICAgICB9CisgICAgICBpZiAocmVzdWx0LmUgIT0gbnVsbCkgeworICAgICAgICB0aHJvdyByZXN1bHQuZTsKKyAgICAgIH0KKyAgICAgIGlmIChyZXN1bHQuYXplICE9IG51bGwpIHsKKyAgICAgICAgdGhyb3cgcmVzdWx0LmF6ZTsKKyAgICAgIH0KKyAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24ob3JnLmFwYWNoZS50aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uLk1JU1NJTkdfUkVTVUxULCAiZ2V0VG9wb2xvZ3lQYWdlSW5mbyBmYWlsZWQ6IHVua25vd24gcmVzdWx0Iik7CisgICAgfQorCisgICAgcHVibGljIENvbXBvbmVudFBhZ2VJbmZvIGdldENvbXBvbmVudFBhZ2VJbmZvKFN0cmluZyB0b3BvbG9neV9pZCwgU3RyaW5nIGNvbXBvbmVudF9pZCwgU3RyaW5nIHdpbmRvdywgYm9vbGVhbiBpc19pbmNsdWRlX3N5cykgdGhyb3dzIE5vdEFsaXZlRXhjZXB0aW9uLCBBdXRob3JpemF0aW9uRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uCisgICAgeworICAgICAgc2VuZF9nZXRDb21wb25lbnRQYWdlSW5mbyh0b3BvbG9neV9pZCwgY29tcG9uZW50X2lkLCB3aW5kb3csIGlzX2luY2x1ZGVfc3lzKTsKKyAgICAgIHJldHVybiByZWN2X2dldENvbXBvbmVudFBhZ2VJbmZvKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2VuZF9nZXRDb21wb25lbnRQYWdlSW5mbyhTdHJpbmcgdG9wb2xvZ3lfaWQsIFN0cmluZyBjb21wb25lbnRfaWQsIFN0cmluZyB3aW5kb3csIGJvb2xlYW4gaXNfaW5jbHVkZV9zeXMpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uCisgICAgeworICAgICAgZ2V0Q29tcG9uZW50UGFnZUluZm9fYXJncyBhcmdzID0gbmV3IGdldENvbXBvbmVudFBhZ2VJbmZvX2FyZ3MoKTsKKyAgICAgIGFyZ3Muc2V0X3RvcG9sb2d5X2lkKHRvcG9sb2d5X2lkKTsKKyAgICAgIGFyZ3Muc2V0X2NvbXBvbmVudF9pZChjb21wb25lbnRfaWQpOworICAgICAgYXJncy5zZXRfd2luZG93KHdpbmRvdyk7CisgICAgICBhcmdzLnNldF9pc19pbmNsdWRlX3N5cyhpc19pbmNsdWRlX3N5cyk7CisgICAgICBzZW5kQmFzZSgiZ2V0Q29tcG9uZW50UGFnZUluZm8iLCBhcmdzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29tcG9uZW50UGFnZUluZm8gcmVjdl9nZXRDb21wb25lbnRQYWdlSW5mbygpIHRocm93cyBOb3RBbGl2ZUV4Y2VwdGlvbiwgQXV0aG9yaXphdGlvbkV4Y2VwdGlvbiwgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbgorICAgIHsKKyAgICAgIGdldENvbXBvbmVudFBhZ2VJbmZvX3Jlc3VsdCByZXN1bHQgPSBuZXcgZ2V0Q29tcG9uZW50UGFnZUluZm9fcmVzdWx0KCk7CisgICAgICByZWNlaXZlQmFzZShyZXN1bHQsICJnZXRDb21wb25lbnRQYWdlSW5mbyIpOworICAgICAgaWYgKHJlc3VsdC5pc19zZXRfc3VjY2VzcygpKSB7CisgICAgICAgIHJldHVybiByZXN1bHQuc3VjY2VzczsKKyAgICAgIH0KKyAgICAgIGlmIChyZXN1bHQuZSAhPSBudWxsKSB7CisgICAgICAgIHRocm93IHJlc3VsdC5lOworICAgICAgfQorICAgICAgaWYgKHJlc3VsdC5hemUgIT0gbnVsbCkgeworICAgICAgICB0aHJvdyByZXN1bHQuYXplOworICAgICAgfQorICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUudGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbihvcmcuYXBhY2hlLnRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24uTUlTU0lOR19SRVNVTFQsICJnZXRDb21wb25lbnRQYWdlSW5mbyBmYWlsZWQ6IHVua25vd24gcmVzdWx0Iik7CisgICAgfQorCiAgICAgcHVibGljIFN0cmluZyBnZXRUb3BvbG9neUNvbmYoU3RyaW5nIGlkKSB0aHJvd3MgTm90QWxpdmVFeGNlcHRpb24sIEF1dGhvcml6YXRpb25FeGNlcHRpb24sIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24KICAgICB7CiAgICAgICBzZW5kX2dldFRvcG9sb2d5Q29uZihpZCk7CkBAIC03NjcsNiArOTQ4LDMyIEBACiAgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS50aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKG9yZy5hcGFjaGUudGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5NSVNTSU5HX1JFU1VMVCwgImdldFVzZXJUb3BvbG9neSBmYWlsZWQ6IHVua25vd24gcmVzdWx0Iik7CiAgICAgfQogCisgICAgcHVibGljIFRvcG9sb2d5SGlzdG9yeUluZm8gZ2V0VG9wb2xvZ3lIaXN0b3J5KFN0cmluZyB1c2VyKSB0aHJvd3MgQXV0aG9yaXphdGlvbkV4Y2VwdGlvbiwgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbgorICAgIHsKKyAgICAgIHNlbmRfZ2V0VG9wb2xvZ3lIaXN0b3J5KHVzZXIpOworICAgICAgcmV0dXJuIHJlY3ZfZ2V0VG9wb2xvZ3lIaXN0b3J5KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2VuZF9nZXRUb3BvbG9neUhpc3RvcnkoU3RyaW5nIHVzZXIpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uCisgICAgeworICAgICAgZ2V0VG9wb2xvZ3lIaXN0b3J5X2FyZ3MgYXJncyA9IG5ldyBnZXRUb3BvbG9neUhpc3RvcnlfYXJncygpOworICAgICAgYXJncy5zZXRfdXNlcih1c2VyKTsKKyAgICAgIHNlbmRCYXNlKCJnZXRUb3BvbG9neUhpc3RvcnkiLCBhcmdzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVG9wb2xvZ3lIaXN0b3J5SW5mbyByZWN2X2dldFRvcG9sb2d5SGlzdG9yeSgpIHRocm93cyBBdXRob3JpemF0aW9uRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uCisgICAgeworICAgICAgZ2V0VG9wb2xvZ3lIaXN0b3J5X3Jlc3VsdCByZXN1bHQgPSBuZXcgZ2V0VG9wb2xvZ3lIaXN0b3J5X3Jlc3VsdCgpOworICAgICAgcmVjZWl2ZUJhc2UocmVzdWx0LCAiZ2V0VG9wb2xvZ3lIaXN0b3J5Iik7CisgICAgICBpZiAocmVzdWx0LmlzX3NldF9zdWNjZXNzKCkpIHsKKyAgICAgICAgcmV0dXJuIHJlc3VsdC5zdWNjZXNzOworICAgICAgfQorICAgICAgaWYgKHJlc3VsdC5hemUgIT0gbnVsbCkgeworICAgICAgICB0aHJvdyByZXN1bHQuYXplOworICAgICAgfQorICAgICAgdGhyb3cgbmV3IG9yZy5hcGFjaGUudGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbihvcmcuYXBhY2hlLnRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24uTUlTU0lOR19SRVNVTFQsICJnZXRUb3BvbG9neUhpc3RvcnkgZmFpbGVkOiB1bmtub3duIHJlc3VsdCIpOworICAgIH0KKwogICB9CiAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQXN5bmNDbGllbnQgZXh0ZW5kcyBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5UQXN5bmNDbGllbnQgaW1wbGVtZW50cyBBc3luY0lmYWNlIHsKICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3RvcnkgaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5UQXN5bmNDbGllbnRGYWN0b3J5PEFzeW5jQ2xpZW50PiB7CkBAIC0xMDM2LDYgKzEyNDMsNzMgQEAKICAgICAgIH0KICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCBzZXRMb2dDb25maWcoU3RyaW5nIG5hbWUsIExvZ0NvbmZpZyBjb25maWcsIG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLkFzeW5jTWV0aG9kQ2FsbGJhY2sgcmVzdWx0SGFuZGxlcikgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgY2hlY2tSZWFkeSgpOworICAgICAgc2V0TG9nQ29uZmlnX2NhbGwgbWV0aG9kX2NhbGwgPSBuZXcgc2V0TG9nQ29uZmlnX2NhbGwobmFtZSwgY29uZmlnLCByZXN1bHRIYW5kbGVyLCB0aGlzLCBfX19wcm90b2NvbEZhY3RvcnksIF9fX3RyYW5zcG9ydCk7CisgICAgICB0aGlzLl9fX2N1cnJlbnRNZXRob2QgPSBtZXRob2RfY2FsbDsKKyAgICAgIF9fX21hbmFnZXIuY2FsbChtZXRob2RfY2FsbCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBzZXRMb2dDb25maWdfY2FsbCBleHRlbmRzIG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLlRBc3luY01ldGhvZENhbGwgeworICAgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKyAgICAgIHByaXZhdGUgTG9nQ29uZmlnIGNvbmZpZzsKKyAgICAgIHB1YmxpYyBzZXRMb2dDb25maWdfY2FsbChTdHJpbmcgbmFtZSwgTG9nQ29uZmlnIGNvbmZpZywgb3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuQXN5bmNNZXRob2RDYWxsYmFjayByZXN1bHRIYW5kbGVyLCBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5UQXN5bmNDbGllbnQgY2xpZW50LCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSwgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlROb25ibG9ja2luZ1RyYW5zcG9ydCB0cmFuc3BvcnQpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIoY2xpZW50LCBwcm90b2NvbEZhY3RvcnksIHRyYW5zcG9ydCwgcmVzdWx0SGFuZGxlciwgZmFsc2UpOworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZzsKKyAgICAgIH0KKworICAgICAgcHVibGljIHZvaWQgd3JpdGVfYXJncyhvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgcHJvdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgICBwcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWVzc2FnZSgic2V0TG9nQ29uZmlnIiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1lc3NhZ2VUeXBlLkNBTEwsIDApKTsKKyAgICAgICAgc2V0TG9nQ29uZmlnX2FyZ3MgYXJncyA9IG5ldyBzZXRMb2dDb25maWdfYXJncygpOworICAgICAgICBhcmdzLnNldF9uYW1lKG5hbWUpOworICAgICAgICBhcmdzLnNldF9jb25maWcoY29uZmlnKTsKKyAgICAgICAgYXJncy53cml0ZShwcm90KTsKKyAgICAgICAgcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsKKyAgICAgIH0KKworICAgICAgcHVibGljIHZvaWQgZ2V0UmVzdWx0KCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgICBpZiAoZ2V0U3RhdGUoKSAhPSBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5UQXN5bmNNZXRob2RDYWxsLlN0YXRlLlJFU1BPTlNFX1JFQUQpIHsKKyAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJNZXRob2QgY2FsbCBub3QgZmluaXNoZWQhIik7CisgICAgICAgIH0KKyAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRNZW1vcnlJbnB1dFRyYW5zcG9ydCBtZW1vcnlUcmFuc3BvcnQgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRNZW1vcnlJbnB1dFRyYW5zcG9ydChnZXRGcmFtZUJ1ZmZlcigpLmFycmF5KCkpOworICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgcHJvdCA9IGNsaWVudC5nZXRQcm90b2NvbEZhY3RvcnkoKS5nZXRQcm90b2NvbChtZW1vcnlUcmFuc3BvcnQpOworICAgICAgICAobmV3IENsaWVudChwcm90KSkucmVjdl9zZXRMb2dDb25maWcoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnZXRMb2dDb25maWcoU3RyaW5nIG5hbWUsIG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLkFzeW5jTWV0aG9kQ2FsbGJhY2sgcmVzdWx0SGFuZGxlcikgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgY2hlY2tSZWFkeSgpOworICAgICAgZ2V0TG9nQ29uZmlnX2NhbGwgbWV0aG9kX2NhbGwgPSBuZXcgZ2V0TG9nQ29uZmlnX2NhbGwobmFtZSwgcmVzdWx0SGFuZGxlciwgdGhpcywgX19fcHJvdG9jb2xGYWN0b3J5LCBfX190cmFuc3BvcnQpOworICAgICAgdGhpcy5fX19jdXJyZW50TWV0aG9kID0gbWV0aG9kX2NhbGw7CisgICAgICBfX19tYW5hZ2VyLmNhbGwobWV0aG9kX2NhbGwpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgZ2V0TG9nQ29uZmlnX2NhbGwgZXh0ZW5kcyBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5UQXN5bmNNZXRob2RDYWxsIHsKKyAgICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisgICAgICBwdWJsaWMgZ2V0TG9nQ29uZmlnX2NhbGwoU3RyaW5nIG5hbWUsIG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLkFzeW5jTWV0aG9kQ2FsbGJhY2sgcmVzdWx0SGFuZGxlciwgb3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuVEFzeW5jQ2xpZW50IGNsaWVudCwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnksIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTm9uYmxvY2tpbmdUcmFuc3BvcnQgdHJhbnNwb3J0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyKGNsaWVudCwgcHJvdG9jb2xGYWN0b3J5LCB0cmFuc3BvcnQsIHJlc3VsdEhhbmRsZXIsIGZhbHNlKTsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgIH0KKworICAgICAgcHVibGljIHZvaWQgd3JpdGVfYXJncyhvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgcHJvdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgICBwcm90LndyaXRlTWVzc2FnZUJlZ2luKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWVzc2FnZSgiZ2V0TG9nQ29uZmlnIiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1lc3NhZ2VUeXBlLkNBTEwsIDApKTsKKyAgICAgICAgZ2V0TG9nQ29uZmlnX2FyZ3MgYXJncyA9IG5ldyBnZXRMb2dDb25maWdfYXJncygpOworICAgICAgICBhcmdzLnNldF9uYW1lKG5hbWUpOworICAgICAgICBhcmdzLndyaXRlKHByb3QpOworICAgICAgICBwcm90LndyaXRlTWVzc2FnZUVuZCgpOworICAgICAgfQorCisgICAgICBwdWJsaWMgTG9nQ29uZmlnIGdldFJlc3VsdCgpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGdldFN0YXRlKCkgIT0gb3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuVEFzeW5jTWV0aG9kQ2FsbC5TdGF0ZS5SRVNQT05TRV9SRUFEKSB7CisgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTWV0aG9kIGNhbGwgbm90IGZpbmlzaGVkISIpOworICAgICAgICB9CisgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTWVtb3J5SW5wdXRUcmFuc3BvcnQgbWVtb3J5VHJhbnNwb3J0ID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTWVtb3J5SW5wdXRUcmFuc3BvcnQoZ2V0RnJhbWVCdWZmZXIoKS5hcnJheSgpKTsKKyAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIHByb3QgPSBjbGllbnQuZ2V0UHJvdG9jb2xGYWN0b3J5KCkuZ2V0UHJvdG9jb2wobWVtb3J5VHJhbnNwb3J0KTsKKyAgICAgICAgcmV0dXJuIChuZXcgQ2xpZW50KHByb3QpKS5yZWN2X2dldExvZ0NvbmZpZygpOworICAgICAgfQorICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIGRlYnVnKFN0cmluZyBuYW1lLCBTdHJpbmcgY29tcG9uZW50LCBib29sZWFuIGVuYWJsZSwgZG91YmxlIHNhbXBsaW5nUGVyY2VudGFnZSwgb3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuQXN5bmNNZXRob2RDYWxsYmFjayByZXN1bHRIYW5kbGVyKSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CiAgICAgICBjaGVja1JlYWR5KCk7CiAgICAgICBkZWJ1Z19jYWxsIG1ldGhvZF9jYWxsID0gbmV3IGRlYnVnX2NhbGwobmFtZSwgY29tcG9uZW50LCBlbmFibGUsIHNhbXBsaW5nUGVyY2VudGFnZSwgcmVzdWx0SGFuZGxlciwgdGhpcywgX19fcHJvdG9jb2xGYWN0b3J5LCBfX190cmFuc3BvcnQpOwpAQCAtMTA3Nyw2ICsxMzUxLDc5IEBACiAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgc2V0V29ya2VyUHJvZmlsZXIoU3RyaW5nIGlkLCBQcm9maWxlUmVxdWVzdCBwcm9maWxlUmVxdWVzdCwgb3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuQXN5bmNNZXRob2RDYWxsYmFjayByZXN1bHRIYW5kbGVyKSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICBjaGVja1JlYWR5KCk7CisgICAgICBzZXRXb3JrZXJQcm9maWxlcl9jYWxsIG1ldGhvZF9jYWxsID0gbmV3IHNldFdvcmtlclByb2ZpbGVyX2NhbGwoaWQsIHByb2ZpbGVSZXF1ZXN0LCByZXN1bHRIYW5kbGVyLCB0aGlzLCBfX19wcm90b2NvbEZhY3RvcnksIF9fX3RyYW5zcG9ydCk7CisgICAgICB0aGlzLl9fX2N1cnJlbnRNZXRob2QgPSBtZXRob2RfY2FsbDsKKyAgICAgIF9fX21hbmFnZXIuY2FsbChtZXRob2RfY2FsbCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBzZXRXb3JrZXJQcm9maWxlcl9jYWxsIGV4dGVuZHMgb3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuVEFzeW5jTWV0aG9kQ2FsbCB7CisgICAgICBwcml2YXRlIFN0cmluZyBpZDsKKyAgICAgIHByaXZhdGUgUHJvZmlsZVJlcXVlc3QgcHJvZmlsZVJlcXVlc3Q7CisgICAgICBwdWJsaWMgc2V0V29ya2VyUHJvZmlsZXJfY2FsbChTdHJpbmcgaWQsIFByb2ZpbGVSZXF1ZXN0IHByb2ZpbGVSZXF1ZXN0LCBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5Bc3luY01ldGhvZENhbGxiYWNrIHJlc3VsdEhhbmRsZXIsIG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLlRBc3luY0NsaWVudCBjbGllbnQsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5LCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE5vbmJsb2NraW5nVHJhbnNwb3J0IHRyYW5zcG9ydCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgICBzdXBlcihjbGllbnQsIHByb3RvY29sRmFjdG9yeSwgdHJhbnNwb3J0LCByZXN1bHRIYW5kbGVyLCBmYWxzZSk7CisgICAgICAgIHRoaXMuaWQgPSBpZDsKKyAgICAgICAgdGhpcy5wcm9maWxlUmVxdWVzdCA9IHByb2ZpbGVSZXF1ZXN0OworICAgICAgfQorCisgICAgICBwdWJsaWMgdm9pZCB3cml0ZV9hcmdzKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBwcm90KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICAgIHByb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlKCJzZXRXb3JrZXJQcm9maWxlciIsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlVHlwZS5DQUxMLCAwKSk7CisgICAgICAgIHNldFdvcmtlclByb2ZpbGVyX2FyZ3MgYXJncyA9IG5ldyBzZXRXb3JrZXJQcm9maWxlcl9hcmdzKCk7CisgICAgICAgIGFyZ3Muc2V0X2lkKGlkKTsKKyAgICAgICAgYXJncy5zZXRfcHJvZmlsZVJlcXVlc3QocHJvZmlsZVJlcXVlc3QpOworICAgICAgICBhcmdzLndyaXRlKHByb3QpOworICAgICAgICBwcm90LndyaXRlTWVzc2FnZUVuZCgpOworICAgICAgfQorCisgICAgICBwdWJsaWMgdm9pZCBnZXRSZXN1bHQoKSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChnZXRTdGF0ZSgpICE9IG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLlRBc3luY01ldGhvZENhbGwuU3RhdGUuUkVTUE9OU0VfUkVBRCkgeworICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk1ldGhvZCBjYWxsIG5vdCBmaW5pc2hlZCEiKTsKKyAgICAgICAgfQorICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE1lbW9yeUlucHV0VHJhbnNwb3J0IG1lbW9yeVRyYW5zcG9ydCA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE1lbW9yeUlucHV0VHJhbnNwb3J0KGdldEZyYW1lQnVmZmVyKCkuYXJyYXkoKSk7CisgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBwcm90ID0gY2xpZW50LmdldFByb3RvY29sRmFjdG9yeSgpLmdldFByb3RvY29sKG1lbW9yeVRyYW5zcG9ydCk7CisgICAgICAgIChuZXcgQ2xpZW50KHByb3QpKS5yZWN2X3NldFdvcmtlclByb2ZpbGVyKCk7CisgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ2V0Q29tcG9uZW50UGVuZGluZ1Byb2ZpbGVBY3Rpb25zKFN0cmluZyBpZCwgU3RyaW5nIGNvbXBvbmVudF9pZCwgUHJvZmlsZUFjdGlvbiBhY3Rpb24sIG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLkFzeW5jTWV0aG9kQ2FsbGJhY2sgcmVzdWx0SGFuZGxlcikgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgY2hlY2tSZWFkeSgpOworICAgICAgZ2V0Q29tcG9uZW50UGVuZGluZ1Byb2ZpbGVBY3Rpb25zX2NhbGwgbWV0aG9kX2NhbGwgPSBuZXcgZ2V0Q29tcG9uZW50UGVuZGluZ1Byb2ZpbGVBY3Rpb25zX2NhbGwoaWQsIGNvbXBvbmVudF9pZCwgYWN0aW9uLCByZXN1bHRIYW5kbGVyLCB0aGlzLCBfX19wcm90b2NvbEZhY3RvcnksIF9fX3RyYW5zcG9ydCk7CisgICAgICB0aGlzLl9fX2N1cnJlbnRNZXRob2QgPSBtZXRob2RfY2FsbDsKKyAgICAgIF9fX21hbmFnZXIuY2FsbChtZXRob2RfY2FsbCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBnZXRDb21wb25lbnRQZW5kaW5nUHJvZmlsZUFjdGlvbnNfY2FsbCBleHRlbmRzIG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLlRBc3luY01ldGhvZENhbGwgeworICAgICAgcHJpdmF0ZSBTdHJpbmcgaWQ7CisgICAgICBwcml2YXRlIFN0cmluZyBjb21wb25lbnRfaWQ7CisgICAgICBwcml2YXRlIFByb2ZpbGVBY3Rpb24gYWN0aW9uOworICAgICAgcHVibGljIGdldENvbXBvbmVudFBlbmRpbmdQcm9maWxlQWN0aW9uc19jYWxsKFN0cmluZyBpZCwgU3RyaW5nIGNvbXBvbmVudF9pZCwgUHJvZmlsZUFjdGlvbiBhY3Rpb24sIG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLkFzeW5jTWV0aG9kQ2FsbGJhY2sgcmVzdWx0SGFuZGxlciwgb3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuVEFzeW5jQ2xpZW50IGNsaWVudCwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnksIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTm9uYmxvY2tpbmdUcmFuc3BvcnQgdHJhbnNwb3J0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyKGNsaWVudCwgcHJvdG9jb2xGYWN0b3J5LCB0cmFuc3BvcnQsIHJlc3VsdEhhbmRsZXIsIGZhbHNlKTsKKyAgICAgICAgdGhpcy5pZCA9IGlkOworICAgICAgICB0aGlzLmNvbXBvbmVudF9pZCA9IGNvbXBvbmVudF9pZDsKKyAgICAgICAgdGhpcy5hY3Rpb24gPSBhY3Rpb247CisgICAgICB9CisKKyAgICAgIHB1YmxpYyB2b2lkIHdyaXRlX2FyZ3Mob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIHByb3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgICAgcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1lc3NhZ2UoImdldENvbXBvbmVudFBlbmRpbmdQcm9maWxlQWN0aW9ucyIsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlVHlwZS5DQUxMLCAwKSk7CisgICAgICAgIGdldENvbXBvbmVudFBlbmRpbmdQcm9maWxlQWN0aW9uc19hcmdzIGFyZ3MgPSBuZXcgZ2V0Q29tcG9uZW50UGVuZGluZ1Byb2ZpbGVBY3Rpb25zX2FyZ3MoKTsKKyAgICAgICAgYXJncy5zZXRfaWQoaWQpOworICAgICAgICBhcmdzLnNldF9jb21wb25lbnRfaWQoY29tcG9uZW50X2lkKTsKKyAgICAgICAgYXJncy5zZXRfYWN0aW9uKGFjdGlvbik7CisgICAgICAgIGFyZ3Mud3JpdGUocHJvdCk7CisgICAgICAgIHByb3Qud3JpdGVNZXNzYWdlRW5kKCk7CisgICAgICB9CisKKyAgICAgIHB1YmxpYyBMaXN0PFByb2ZpbGVSZXF1ZXN0PiBnZXRSZXN1bHQoKSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChnZXRTdGF0ZSgpICE9IG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLlRBc3luY01ldGhvZENhbGwuU3RhdGUuUkVTUE9OU0VfUkVBRCkgeworICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk1ldGhvZCBjYWxsIG5vdCBmaW5pc2hlZCEiKTsKKyAgICAgICAgfQorICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE1lbW9yeUlucHV0VHJhbnNwb3J0IG1lbW9yeVRyYW5zcG9ydCA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE1lbW9yeUlucHV0VHJhbnNwb3J0KGdldEZyYW1lQnVmZmVyKCkuYXJyYXkoKSk7CisgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBwcm90ID0gY2xpZW50LmdldFByb3RvY29sRmFjdG9yeSgpLmdldFByb3RvY29sKG1lbW9yeVRyYW5zcG9ydCk7CisgICAgICAgIHJldHVybiAobmV3IENsaWVudChwcm90KSkucmVjdl9nZXRDb21wb25lbnRQZW5kaW5nUHJvZmlsZUFjdGlvbnMoKTsKKyAgICAgIH0KKyAgICB9CisKICAgICBwdWJsaWMgdm9pZCB1cGxvYWROZXdDcmVkZW50aWFscyhTdHJpbmcgbmFtZSwgQ3JlZGVudGlhbHMgY3JlZHMsIG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLkFzeW5jTWV0aG9kQ2FsbGJhY2sgcmVzdWx0SGFuZGxlcikgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24gewogICAgICAgY2hlY2tSZWFkeSgpOwogICAgICAgdXBsb2FkTmV3Q3JlZGVudGlhbHNfY2FsbCBtZXRob2RfY2FsbCA9IG5ldyB1cGxvYWROZXdDcmVkZW50aWFsc19jYWxsKG5hbWUsIGNyZWRzLCByZXN1bHRIYW5kbGVyLCB0aGlzLCBfX19wcm90b2NvbEZhY3RvcnksIF9fX3RyYW5zcG9ydCk7CkBAIC0xMzk3LDYgKzE3NDQsODUgQEAKICAgICAgIH0KICAgICB9CiAKKyAgICBwdWJsaWMgdm9pZCBnZXRUb3BvbG9neVBhZ2VJbmZvKFN0cmluZyBpZCwgU3RyaW5nIHdpbmRvdywgYm9vbGVhbiBpc19pbmNsdWRlX3N5cywgb3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuQXN5bmNNZXRob2RDYWxsYmFjayByZXN1bHRIYW5kbGVyKSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICBjaGVja1JlYWR5KCk7CisgICAgICBnZXRUb3BvbG9neVBhZ2VJbmZvX2NhbGwgbWV0aG9kX2NhbGwgPSBuZXcgZ2V0VG9wb2xvZ3lQYWdlSW5mb19jYWxsKGlkLCB3aW5kb3csIGlzX2luY2x1ZGVfc3lzLCByZXN1bHRIYW5kbGVyLCB0aGlzLCBfX19wcm90b2NvbEZhY3RvcnksIF9fX3RyYW5zcG9ydCk7CisgICAgICB0aGlzLl9fX2N1cnJlbnRNZXRob2QgPSBtZXRob2RfY2FsbDsKKyAgICAgIF9fX21hbmFnZXIuY2FsbChtZXRob2RfY2FsbCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBnZXRUb3BvbG9neVBhZ2VJbmZvX2NhbGwgZXh0ZW5kcyBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5UQXN5bmNNZXRob2RDYWxsIHsKKyAgICAgIHByaXZhdGUgU3RyaW5nIGlkOworICAgICAgcHJpdmF0ZSBTdHJpbmcgd2luZG93OworICAgICAgcHJpdmF0ZSBib29sZWFuIGlzX2luY2x1ZGVfc3lzOworICAgICAgcHVibGljIGdldFRvcG9sb2d5UGFnZUluZm9fY2FsbChTdHJpbmcgaWQsIFN0cmluZyB3aW5kb3csIGJvb2xlYW4gaXNfaW5jbHVkZV9zeXMsIG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLkFzeW5jTWV0aG9kQ2FsbGJhY2sgcmVzdWx0SGFuZGxlciwgb3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuVEFzeW5jQ2xpZW50IGNsaWVudCwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRmFjdG9yeSBwcm90b2NvbEZhY3RvcnksIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTm9uYmxvY2tpbmdUcmFuc3BvcnQgdHJhbnNwb3J0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyKGNsaWVudCwgcHJvdG9jb2xGYWN0b3J5LCB0cmFuc3BvcnQsIHJlc3VsdEhhbmRsZXIsIGZhbHNlKTsKKyAgICAgICAgdGhpcy5pZCA9IGlkOworICAgICAgICB0aGlzLndpbmRvdyA9IHdpbmRvdzsKKyAgICAgICAgdGhpcy5pc19pbmNsdWRlX3N5cyA9IGlzX2luY2x1ZGVfc3lzOworICAgICAgfQorCisgICAgICBwdWJsaWMgdm9pZCB3cml0ZV9hcmdzKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBwcm90KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICAgIHByb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlKCJnZXRUb3BvbG9neVBhZ2VJbmZvIiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1lc3NhZ2VUeXBlLkNBTEwsIDApKTsKKyAgICAgICAgZ2V0VG9wb2xvZ3lQYWdlSW5mb19hcmdzIGFyZ3MgPSBuZXcgZ2V0VG9wb2xvZ3lQYWdlSW5mb19hcmdzKCk7CisgICAgICAgIGFyZ3Muc2V0X2lkKGlkKTsKKyAgICAgICAgYXJncy5zZXRfd2luZG93KHdpbmRvdyk7CisgICAgICAgIGFyZ3Muc2V0X2lzX2luY2x1ZGVfc3lzKGlzX2luY2x1ZGVfc3lzKTsKKyAgICAgICAgYXJncy53cml0ZShwcm90KTsKKyAgICAgICAgcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsKKyAgICAgIH0KKworICAgICAgcHVibGljIFRvcG9sb2d5UGFnZUluZm8gZ2V0UmVzdWx0KCkgdGhyb3dzIE5vdEFsaXZlRXhjZXB0aW9uLCBBdXRob3JpemF0aW9uRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGdldFN0YXRlKCkgIT0gb3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuVEFzeW5jTWV0aG9kQ2FsbC5TdGF0ZS5SRVNQT05TRV9SRUFEKSB7CisgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTWV0aG9kIGNhbGwgbm90IGZpbmlzaGVkISIpOworICAgICAgICB9CisgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTWVtb3J5SW5wdXRUcmFuc3BvcnQgbWVtb3J5VHJhbnNwb3J0ID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTWVtb3J5SW5wdXRUcmFuc3BvcnQoZ2V0RnJhbWVCdWZmZXIoKS5hcnJheSgpKTsKKyAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIHByb3QgPSBjbGllbnQuZ2V0UHJvdG9jb2xGYWN0b3J5KCkuZ2V0UHJvdG9jb2wobWVtb3J5VHJhbnNwb3J0KTsKKyAgICAgICAgcmV0dXJuIChuZXcgQ2xpZW50KHByb3QpKS5yZWN2X2dldFRvcG9sb2d5UGFnZUluZm8oKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBnZXRDb21wb25lbnRQYWdlSW5mbyhTdHJpbmcgdG9wb2xvZ3lfaWQsIFN0cmluZyBjb21wb25lbnRfaWQsIFN0cmluZyB3aW5kb3csIGJvb2xlYW4gaXNfaW5jbHVkZV9zeXMsIG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLkFzeW5jTWV0aG9kQ2FsbGJhY2sgcmVzdWx0SGFuZGxlcikgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgY2hlY2tSZWFkeSgpOworICAgICAgZ2V0Q29tcG9uZW50UGFnZUluZm9fY2FsbCBtZXRob2RfY2FsbCA9IG5ldyBnZXRDb21wb25lbnRQYWdlSW5mb19jYWxsKHRvcG9sb2d5X2lkLCBjb21wb25lbnRfaWQsIHdpbmRvdywgaXNfaW5jbHVkZV9zeXMsIHJlc3VsdEhhbmRsZXIsIHRoaXMsIF9fX3Byb3RvY29sRmFjdG9yeSwgX19fdHJhbnNwb3J0KTsKKyAgICAgIHRoaXMuX19fY3VycmVudE1ldGhvZCA9IG1ldGhvZF9jYWxsOworICAgICAgX19fbWFuYWdlci5jYWxsKG1ldGhvZF9jYWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIGdldENvbXBvbmVudFBhZ2VJbmZvX2NhbGwgZXh0ZW5kcyBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5UQXN5bmNNZXRob2RDYWxsIHsKKyAgICAgIHByaXZhdGUgU3RyaW5nIHRvcG9sb2d5X2lkOworICAgICAgcHJpdmF0ZSBTdHJpbmcgY29tcG9uZW50X2lkOworICAgICAgcHJpdmF0ZSBTdHJpbmcgd2luZG93OworICAgICAgcHJpdmF0ZSBib29sZWFuIGlzX2luY2x1ZGVfc3lzOworICAgICAgcHVibGljIGdldENvbXBvbmVudFBhZ2VJbmZvX2NhbGwoU3RyaW5nIHRvcG9sb2d5X2lkLCBTdHJpbmcgY29tcG9uZW50X2lkLCBTdHJpbmcgd2luZG93LCBib29sZWFuIGlzX2luY2x1ZGVfc3lzLCBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5Bc3luY01ldGhvZENhbGxiYWNrIHJlc3VsdEhhbmRsZXIsIG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLlRBc3luY0NsaWVudCBjbGllbnQsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEZhY3RvcnkgcHJvdG9jb2xGYWN0b3J5LCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE5vbmJsb2NraW5nVHJhbnNwb3J0IHRyYW5zcG9ydCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgICBzdXBlcihjbGllbnQsIHByb3RvY29sRmFjdG9yeSwgdHJhbnNwb3J0LCByZXN1bHRIYW5kbGVyLCBmYWxzZSk7CisgICAgICAgIHRoaXMudG9wb2xvZ3lfaWQgPSB0b3BvbG9neV9pZDsKKyAgICAgICAgdGhpcy5jb21wb25lbnRfaWQgPSBjb21wb25lbnRfaWQ7CisgICAgICAgIHRoaXMud2luZG93ID0gd2luZG93OworICAgICAgICB0aGlzLmlzX2luY2x1ZGVfc3lzID0gaXNfaW5jbHVkZV9zeXM7CisgICAgICB9CisKKyAgICAgIHB1YmxpYyB2b2lkIHdyaXRlX2FyZ3Mob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIHByb3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgICAgcHJvdC53cml0ZU1lc3NhZ2VCZWdpbihuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1lc3NhZ2UoImdldENvbXBvbmVudFBhZ2VJbmZvIiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1lc3NhZ2VUeXBlLkNBTEwsIDApKTsKKyAgICAgICAgZ2V0Q29tcG9uZW50UGFnZUluZm9fYXJncyBhcmdzID0gbmV3IGdldENvbXBvbmVudFBhZ2VJbmZvX2FyZ3MoKTsKKyAgICAgICAgYXJncy5zZXRfdG9wb2xvZ3lfaWQodG9wb2xvZ3lfaWQpOworICAgICAgICBhcmdzLnNldF9jb21wb25lbnRfaWQoY29tcG9uZW50X2lkKTsKKyAgICAgICAgYXJncy5zZXRfd2luZG93KHdpbmRvdyk7CisgICAgICAgIGFyZ3Muc2V0X2lzX2luY2x1ZGVfc3lzKGlzX2luY2x1ZGVfc3lzKTsKKyAgICAgICAgYXJncy53cml0ZShwcm90KTsKKyAgICAgICAgcHJvdC53cml0ZU1lc3NhZ2VFbmQoKTsKKyAgICAgIH0KKworICAgICAgcHVibGljIENvbXBvbmVudFBhZ2VJbmZvIGdldFJlc3VsdCgpIHRocm93cyBOb3RBbGl2ZUV4Y2VwdGlvbiwgQXV0aG9yaXphdGlvbkV4Y2VwdGlvbiwgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChnZXRTdGF0ZSgpICE9IG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLlRBc3luY01ldGhvZENhbGwuU3RhdGUuUkVTUE9OU0VfUkVBRCkgeworICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk1ldGhvZCBjYWxsIG5vdCBmaW5pc2hlZCEiKTsKKyAgICAgICAgfQorICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE1lbW9yeUlucHV0VHJhbnNwb3J0IG1lbW9yeVRyYW5zcG9ydCA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVE1lbW9yeUlucHV0VHJhbnNwb3J0KGdldEZyYW1lQnVmZmVyKCkuYXJyYXkoKSk7CisgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBwcm90ID0gY2xpZW50LmdldFByb3RvY29sRmFjdG9yeSgpLmdldFByb3RvY29sKG1lbW9yeVRyYW5zcG9ydCk7CisgICAgICAgIHJldHVybiAobmV3IENsaWVudChwcm90KSkucmVjdl9nZXRDb21wb25lbnRQYWdlSW5mbygpOworICAgICAgfQorICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIGdldFRvcG9sb2d5Q29uZihTdHJpbmcgaWQsIG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLkFzeW5jTWV0aG9kQ2FsbGJhY2sgcmVzdWx0SGFuZGxlcikgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24gewogICAgICAgY2hlY2tSZWFkeSgpOwogICAgICAgZ2V0VG9wb2xvZ3lDb25mX2NhbGwgbWV0aG9kX2NhbGwgPSBuZXcgZ2V0VG9wb2xvZ3lDb25mX2NhbGwoaWQsIHJlc3VsdEhhbmRsZXIsIHRoaXMsIF9fX3Byb3RvY29sRmFjdG9yeSwgX19fdHJhbnNwb3J0KTsKQEAgLTE0OTMsNiArMTkxOSwzOCBAQAogICAgICAgfQogICAgIH0KIAorICAgIHB1YmxpYyB2b2lkIGdldFRvcG9sb2d5SGlzdG9yeShTdHJpbmcgdXNlciwgb3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuQXN5bmNNZXRob2RDYWxsYmFjayByZXN1bHRIYW5kbGVyKSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICBjaGVja1JlYWR5KCk7CisgICAgICBnZXRUb3BvbG9neUhpc3RvcnlfY2FsbCBtZXRob2RfY2FsbCA9IG5ldyBnZXRUb3BvbG9neUhpc3RvcnlfY2FsbCh1c2VyLCByZXN1bHRIYW5kbGVyLCB0aGlzLCBfX19wcm90b2NvbEZhY3RvcnksIF9fX3RyYW5zcG9ydCk7CisgICAgICB0aGlzLl9fX2N1cnJlbnRNZXRob2QgPSBtZXRob2RfY2FsbDsKKyAgICAgIF9fX21hbmFnZXIuY2FsbChtZXRob2RfY2FsbCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBnZXRUb3BvbG9neUhpc3RvcnlfY2FsbCBleHRlbmRzIG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLlRBc3luY01ldGhvZENhbGwgeworICAgICAgcHJpdmF0ZSBTdHJpbmcgdXNlcjsKKyAgICAgIHB1YmxpYyBnZXRUb3BvbG9neUhpc3RvcnlfY2FsbChTdHJpbmcgdXNlciwgb3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuQXN5bmNNZXRob2RDYWxsYmFjayByZXN1bHRIYW5kbGVyLCBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5UQXN5bmNDbGllbnQgY2xpZW50LCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xGYWN0b3J5IHByb3RvY29sRmFjdG9yeSwgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlROb25ibG9ja2luZ1RyYW5zcG9ydCB0cmFuc3BvcnQpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIoY2xpZW50LCBwcm90b2NvbEZhY3RvcnksIHRyYW5zcG9ydCwgcmVzdWx0SGFuZGxlciwgZmFsc2UpOworICAgICAgICB0aGlzLnVzZXIgPSB1c2VyOworICAgICAgfQorCisgICAgICBwdWJsaWMgdm9pZCB3cml0ZV9hcmdzKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBwcm90KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICAgIHByb3Qud3JpdGVNZXNzYWdlQmVnaW4obmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlKCJnZXRUb3BvbG9neUhpc3RvcnkiLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWVzc2FnZVR5cGUuQ0FMTCwgMCkpOworICAgICAgICBnZXRUb3BvbG9neUhpc3RvcnlfYXJncyBhcmdzID0gbmV3IGdldFRvcG9sb2d5SGlzdG9yeV9hcmdzKCk7CisgICAgICAgIGFyZ3Muc2V0X3VzZXIodXNlcik7CisgICAgICAgIGFyZ3Mud3JpdGUocHJvdCk7CisgICAgICAgIHByb3Qud3JpdGVNZXNzYWdlRW5kKCk7CisgICAgICB9CisKKyAgICAgIHB1YmxpYyBUb3BvbG9neUhpc3RvcnlJbmZvIGdldFJlc3VsdCgpIHRocm93cyBBdXRob3JpemF0aW9uRXhjZXB0aW9uLCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGdldFN0YXRlKCkgIT0gb3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuVEFzeW5jTWV0aG9kQ2FsbC5TdGF0ZS5SRVNQT05TRV9SRUFEKSB7CisgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTWV0aG9kIGNhbGwgbm90IGZpbmlzaGVkISIpOworICAgICAgICB9CisgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTWVtb3J5SW5wdXRUcmFuc3BvcnQgbWVtb3J5VHJhbnNwb3J0ID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UTWVtb3J5SW5wdXRUcmFuc3BvcnQoZ2V0RnJhbWVCdWZmZXIoKS5hcnJheSgpKTsKKyAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIHByb3QgPSBjbGllbnQuZ2V0UHJvdG9jb2xGYWN0b3J5KCkuZ2V0UHJvdG9jb2wobWVtb3J5VHJhbnNwb3J0KTsKKyAgICAgICAgcmV0dXJuIChuZXcgQ2xpZW50KHByb3QpKS5yZWN2X2dldFRvcG9sb2d5SGlzdG9yeSgpOworICAgICAgfQorICAgIH0KKwogICB9CiAKICAgcHVibGljIHN0YXRpYyBjbGFzcyBQcm9jZXNzb3I8SSBleHRlbmRzIElmYWNlPiBleHRlbmRzIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlUHJvY2Vzc29yPEk+IGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVFByb2Nlc3NvciB7CkBAIC0xNTEzLDcgKzE5NzEsMTEgQEAKICAgICAgIHByb2Nlc3NNYXAucHV0KCJhY3RpdmF0ZSIsIG5ldyBhY3RpdmF0ZSgpKTsKICAgICAgIHByb2Nlc3NNYXAucHV0KCJkZWFjdGl2YXRlIiwgbmV3IGRlYWN0aXZhdGUoKSk7CiAgICAgICBwcm9jZXNzTWFwLnB1dCgicmViYWxhbmNlIiwgbmV3IHJlYmFsYW5jZSgpKTsKKyAgICAgIHByb2Nlc3NNYXAucHV0KCJzZXRMb2dDb25maWciLCBuZXcgc2V0TG9nQ29uZmlnKCkpOworICAgICAgcHJvY2Vzc01hcC5wdXQoImdldExvZ0NvbmZpZyIsIG5ldyBnZXRMb2dDb25maWcoKSk7CiAgICAgICBwcm9jZXNzTWFwLnB1dCgiZGVidWciLCBuZXcgZGVidWcoKSk7CisgICAgICBwcm9jZXNzTWFwLnB1dCgic2V0V29ya2VyUHJvZmlsZXIiLCBuZXcgc2V0V29ya2VyUHJvZmlsZXIoKSk7CisgICAgICBwcm9jZXNzTWFwLnB1dCgiZ2V0Q29tcG9uZW50UGVuZGluZ1Byb2ZpbGVBY3Rpb25zIiwgbmV3IGdldENvbXBvbmVudFBlbmRpbmdQcm9maWxlQWN0aW9ucygpKTsKICAgICAgIHByb2Nlc3NNYXAucHV0KCJ1cGxvYWROZXdDcmVkZW50aWFscyIsIG5ldyB1cGxvYWROZXdDcmVkZW50aWFscygpKTsKICAgICAgIHByb2Nlc3NNYXAucHV0KCJiZWdpbkZpbGVVcGxvYWQiLCBuZXcgYmVnaW5GaWxlVXBsb2FkKCkpOwogICAgICAgcHJvY2Vzc01hcC5wdXQoInVwbG9hZENodW5rIiwgbmV3IHVwbG9hZENodW5rKCkpOwpAQCAtMTUyNCw5ICsxOTg2LDEyIEBACiAgICAgICBwcm9jZXNzTWFwLnB1dCgiZ2V0Q2x1c3RlckluZm8iLCBuZXcgZ2V0Q2x1c3RlckluZm8oKSk7CiAgICAgICBwcm9jZXNzTWFwLnB1dCgiZ2V0VG9wb2xvZ3lJbmZvIiwgbmV3IGdldFRvcG9sb2d5SW5mbygpKTsKICAgICAgIHByb2Nlc3NNYXAucHV0KCJnZXRUb3BvbG9neUluZm9XaXRoT3B0cyIsIG5ldyBnZXRUb3BvbG9neUluZm9XaXRoT3B0cygpKTsKKyAgICAgIHByb2Nlc3NNYXAucHV0KCJnZXRUb3BvbG9neVBhZ2VJbmZvIiwgbmV3IGdldFRvcG9sb2d5UGFnZUluZm8oKSk7CisgICAgICBwcm9jZXNzTWFwLnB1dCgiZ2V0Q29tcG9uZW50UGFnZUluZm8iLCBuZXcgZ2V0Q29tcG9uZW50UGFnZUluZm8oKSk7CiAgICAgICBwcm9jZXNzTWFwLnB1dCgiZ2V0VG9wb2xvZ3lDb25mIiwgbmV3IGdldFRvcG9sb2d5Q29uZigpKTsKICAgICAgIHByb2Nlc3NNYXAucHV0KCJnZXRUb3BvbG9neSIsIG5ldyBnZXRUb3BvbG9neSgpKTsKICAgICAgIHByb2Nlc3NNYXAucHV0KCJnZXRVc2VyVG9wb2xvZ3kiLCBuZXcgZ2V0VXNlclRvcG9sb2d5KCkpOworICAgICAgcHJvY2Vzc01hcC5wdXQoImdldFRvcG9sb2d5SGlzdG9yeSIsIG5ldyBnZXRUb3BvbG9neUhpc3RvcnkoKSk7CiAgICAgICByZXR1cm4gcHJvY2Vzc01hcDsKICAgICB9CiAKQEAgLTE3MTgsNiArMjE4Myw0NiBAQAogICAgICAgfQogICAgIH0KIAorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3Mgc2V0TG9nQ29uZmlnPEkgZXh0ZW5kcyBJZmFjZT4gZXh0ZW5kcyBvcmcuYXBhY2hlLnRocmlmdC5Qcm9jZXNzRnVuY3Rpb248SSwgc2V0TG9nQ29uZmlnX2FyZ3M+IHsKKyAgICAgIHB1YmxpYyBzZXRMb2dDb25maWcoKSB7CisgICAgICAgIHN1cGVyKCJzZXRMb2dDb25maWciKTsKKyAgICAgIH0KKworICAgICAgcHVibGljIHNldExvZ0NvbmZpZ19hcmdzIGdldEVtcHR5QXJnc0luc3RhbmNlKCkgeworICAgICAgICByZXR1cm4gbmV3IHNldExvZ0NvbmZpZ19hcmdzKCk7CisgICAgICB9CisKKyAgICAgIHByb3RlY3RlZCBib29sZWFuIGlzT25ld2F5KCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIHB1YmxpYyBzZXRMb2dDb25maWdfcmVzdWx0IGdldFJlc3VsdChJIGlmYWNlLCBzZXRMb2dDb25maWdfYXJncyBhcmdzKSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICAgIHNldExvZ0NvbmZpZ19yZXN1bHQgcmVzdWx0ID0gbmV3IHNldExvZ0NvbmZpZ19yZXN1bHQoKTsKKyAgICAgICAgaWZhY2Uuc2V0TG9nQ29uZmlnKGFyZ3MubmFtZSwgYXJncy5jb25maWcpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgZ2V0TG9nQ29uZmlnPEkgZXh0ZW5kcyBJZmFjZT4gZXh0ZW5kcyBvcmcuYXBhY2hlLnRocmlmdC5Qcm9jZXNzRnVuY3Rpb248SSwgZ2V0TG9nQ29uZmlnX2FyZ3M+IHsKKyAgICAgIHB1YmxpYyBnZXRMb2dDb25maWcoKSB7CisgICAgICAgIHN1cGVyKCJnZXRMb2dDb25maWciKTsKKyAgICAgIH0KKworICAgICAgcHVibGljIGdldExvZ0NvbmZpZ19hcmdzIGdldEVtcHR5QXJnc0luc3RhbmNlKCkgeworICAgICAgICByZXR1cm4gbmV3IGdldExvZ0NvbmZpZ19hcmdzKCk7CisgICAgICB9CisKKyAgICAgIHByb3RlY3RlZCBib29sZWFuIGlzT25ld2F5KCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIHB1YmxpYyBnZXRMb2dDb25maWdfcmVzdWx0IGdldFJlc3VsdChJIGlmYWNlLCBnZXRMb2dDb25maWdfYXJncyBhcmdzKSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICAgIGdldExvZ0NvbmZpZ19yZXN1bHQgcmVzdWx0ID0gbmV3IGdldExvZ0NvbmZpZ19yZXN1bHQoKTsKKyAgICAgICAgcmVzdWx0LnN1Y2Nlc3MgPSBpZmFjZS5nZXRMb2dDb25maWcoYXJncy5uYW1lKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgIH0KKyAgICB9CisKICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIGRlYnVnPEkgZXh0ZW5kcyBJZmFjZT4gZXh0ZW5kcyBvcmcuYXBhY2hlLnRocmlmdC5Qcm9jZXNzRnVuY3Rpb248SSwgZGVidWdfYXJncz4gewogICAgICAgcHVibGljIGRlYnVnKCkgewogICAgICAgICBzdXBlcigiZGVidWciKTsKQEAgLTE3NDQsNiArMjI0OSw0NiBAQAogICAgICAgfQogICAgIH0KIAorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3Mgc2V0V29ya2VyUHJvZmlsZXI8SSBleHRlbmRzIElmYWNlPiBleHRlbmRzIG9yZy5hcGFjaGUudGhyaWZ0LlByb2Nlc3NGdW5jdGlvbjxJLCBzZXRXb3JrZXJQcm9maWxlcl9hcmdzPiB7CisgICAgICBwdWJsaWMgc2V0V29ya2VyUHJvZmlsZXIoKSB7CisgICAgICAgIHN1cGVyKCJzZXRXb3JrZXJQcm9maWxlciIpOworICAgICAgfQorCisgICAgICBwdWJsaWMgc2V0V29ya2VyUHJvZmlsZXJfYXJncyBnZXRFbXB0eUFyZ3NJbnN0YW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBzZXRXb3JrZXJQcm9maWxlcl9hcmdzKCk7CisgICAgICB9CisKKyAgICAgIHByb3RlY3RlZCBib29sZWFuIGlzT25ld2F5KCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIHB1YmxpYyBzZXRXb3JrZXJQcm9maWxlcl9yZXN1bHQgZ2V0UmVzdWx0KEkgaWZhY2UsIHNldFdvcmtlclByb2ZpbGVyX2FyZ3MgYXJncykgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgICBzZXRXb3JrZXJQcm9maWxlcl9yZXN1bHQgcmVzdWx0ID0gbmV3IHNldFdvcmtlclByb2ZpbGVyX3Jlc3VsdCgpOworICAgICAgICBpZmFjZS5zZXRXb3JrZXJQcm9maWxlcihhcmdzLmlkLCBhcmdzLnByb2ZpbGVSZXF1ZXN0KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIGdldENvbXBvbmVudFBlbmRpbmdQcm9maWxlQWN0aW9uczxJIGV4dGVuZHMgSWZhY2U+IGV4dGVuZHMgb3JnLmFwYWNoZS50aHJpZnQuUHJvY2Vzc0Z1bmN0aW9uPEksIGdldENvbXBvbmVudFBlbmRpbmdQcm9maWxlQWN0aW9uc19hcmdzPiB7CisgICAgICBwdWJsaWMgZ2V0Q29tcG9uZW50UGVuZGluZ1Byb2ZpbGVBY3Rpb25zKCkgeworICAgICAgICBzdXBlcigiZ2V0Q29tcG9uZW50UGVuZGluZ1Byb2ZpbGVBY3Rpb25zIik7CisgICAgICB9CisKKyAgICAgIHB1YmxpYyBnZXRDb21wb25lbnRQZW5kaW5nUHJvZmlsZUFjdGlvbnNfYXJncyBnZXRFbXB0eUFyZ3NJbnN0YW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBnZXRDb21wb25lbnRQZW5kaW5nUHJvZmlsZUFjdGlvbnNfYXJncygpOworICAgICAgfQorCisgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc09uZXdheSgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICBwdWJsaWMgZ2V0Q29tcG9uZW50UGVuZGluZ1Byb2ZpbGVBY3Rpb25zX3Jlc3VsdCBnZXRSZXN1bHQoSSBpZmFjZSwgZ2V0Q29tcG9uZW50UGVuZGluZ1Byb2ZpbGVBY3Rpb25zX2FyZ3MgYXJncykgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgICBnZXRDb21wb25lbnRQZW5kaW5nUHJvZmlsZUFjdGlvbnNfcmVzdWx0IHJlc3VsdCA9IG5ldyBnZXRDb21wb25lbnRQZW5kaW5nUHJvZmlsZUFjdGlvbnNfcmVzdWx0KCk7CisgICAgICAgIHJlc3VsdC5zdWNjZXNzID0gaWZhY2UuZ2V0Q29tcG9uZW50UGVuZGluZ1Byb2ZpbGVBY3Rpb25zKGFyZ3MuaWQsIGFyZ3MuY29tcG9uZW50X2lkLCBhcmdzLmFjdGlvbik7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICB9CisgICAgfQorCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyB1cGxvYWROZXdDcmVkZW50aWFsczxJIGV4dGVuZHMgSWZhY2U+IGV4dGVuZHMgb3JnLmFwYWNoZS50aHJpZnQuUHJvY2Vzc0Z1bmN0aW9uPEksIHVwbG9hZE5ld0NyZWRlbnRpYWxzX2FyZ3M+IHsKICAgICAgIHB1YmxpYyB1cGxvYWROZXdDcmVkZW50aWFscygpIHsKICAgICAgICAgc3VwZXIoInVwbG9hZE5ld0NyZWRlbnRpYWxzIik7CkBAIC0xOTkyLDYgKzI1MzcsNTggQEAKICAgICAgIH0KICAgICB9CiAKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIGdldFRvcG9sb2d5UGFnZUluZm88SSBleHRlbmRzIElmYWNlPiBleHRlbmRzIG9yZy5hcGFjaGUudGhyaWZ0LlByb2Nlc3NGdW5jdGlvbjxJLCBnZXRUb3BvbG9neVBhZ2VJbmZvX2FyZ3M+IHsKKyAgICAgIHB1YmxpYyBnZXRUb3BvbG9neVBhZ2VJbmZvKCkgeworICAgICAgICBzdXBlcigiZ2V0VG9wb2xvZ3lQYWdlSW5mbyIpOworICAgICAgfQorCisgICAgICBwdWJsaWMgZ2V0VG9wb2xvZ3lQYWdlSW5mb19hcmdzIGdldEVtcHR5QXJnc0luc3RhbmNlKCkgeworICAgICAgICByZXR1cm4gbmV3IGdldFRvcG9sb2d5UGFnZUluZm9fYXJncygpOworICAgICAgfQorCisgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc09uZXdheSgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICBwdWJsaWMgZ2V0VG9wb2xvZ3lQYWdlSW5mb19yZXN1bHQgZ2V0UmVzdWx0KEkgaWZhY2UsIGdldFRvcG9sb2d5UGFnZUluZm9fYXJncyBhcmdzKSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICAgIGdldFRvcG9sb2d5UGFnZUluZm9fcmVzdWx0IHJlc3VsdCA9IG5ldyBnZXRUb3BvbG9neVBhZ2VJbmZvX3Jlc3VsdCgpOworICAgICAgICB0cnkgeworICAgICAgICAgIHJlc3VsdC5zdWNjZXNzID0gaWZhY2UuZ2V0VG9wb2xvZ3lQYWdlSW5mbyhhcmdzLmlkLCBhcmdzLndpbmRvdywgYXJncy5pc19pbmNsdWRlX3N5cyk7CisgICAgICAgIH0gY2F0Y2ggKE5vdEFsaXZlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICByZXN1bHQuZSA9IGU7CisgICAgICAgIH0gY2F0Y2ggKEF1dGhvcml6YXRpb25FeGNlcHRpb24gYXplKSB7CisgICAgICAgICAgcmVzdWx0LmF6ZSA9IGF6ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgZ2V0Q29tcG9uZW50UGFnZUluZm88SSBleHRlbmRzIElmYWNlPiBleHRlbmRzIG9yZy5hcGFjaGUudGhyaWZ0LlByb2Nlc3NGdW5jdGlvbjxJLCBnZXRDb21wb25lbnRQYWdlSW5mb19hcmdzPiB7CisgICAgICBwdWJsaWMgZ2V0Q29tcG9uZW50UGFnZUluZm8oKSB7CisgICAgICAgIHN1cGVyKCJnZXRDb21wb25lbnRQYWdlSW5mbyIpOworICAgICAgfQorCisgICAgICBwdWJsaWMgZ2V0Q29tcG9uZW50UGFnZUluZm9fYXJncyBnZXRFbXB0eUFyZ3NJbnN0YW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBnZXRDb21wb25lbnRQYWdlSW5mb19hcmdzKCk7CisgICAgICB9CisKKyAgICAgIHByb3RlY3RlZCBib29sZWFuIGlzT25ld2F5KCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIHB1YmxpYyBnZXRDb21wb25lbnRQYWdlSW5mb19yZXN1bHQgZ2V0UmVzdWx0KEkgaWZhY2UsIGdldENvbXBvbmVudFBhZ2VJbmZvX2FyZ3MgYXJncykgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgICBnZXRDb21wb25lbnRQYWdlSW5mb19yZXN1bHQgcmVzdWx0ID0gbmV3IGdldENvbXBvbmVudFBhZ2VJbmZvX3Jlc3VsdCgpOworICAgICAgICB0cnkgeworICAgICAgICAgIHJlc3VsdC5zdWNjZXNzID0gaWZhY2UuZ2V0Q29tcG9uZW50UGFnZUluZm8oYXJncy50b3BvbG9neV9pZCwgYXJncy5jb21wb25lbnRfaWQsIGFyZ3Mud2luZG93LCBhcmdzLmlzX2luY2x1ZGVfc3lzKTsKKyAgICAgICAgfSBjYXRjaCAoTm90QWxpdmVFeGNlcHRpb24gZSkgeworICAgICAgICAgIHJlc3VsdC5lID0gZTsKKyAgICAgICAgfSBjYXRjaCAoQXV0aG9yaXphdGlvbkV4Y2VwdGlvbiBhemUpIHsKKyAgICAgICAgICByZXN1bHQuYXplID0gYXplOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICB9CisgICAgfQorCiAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBnZXRUb3BvbG9neUNvbmY8SSBleHRlbmRzIElmYWNlPiBleHRlbmRzIG9yZy5hcGFjaGUudGhyaWZ0LlByb2Nlc3NGdW5jdGlvbjxJLCBnZXRUb3BvbG9neUNvbmZfYXJncz4gewogICAgICAgcHVibGljIGdldFRvcG9sb2d5Q29uZigpIHsKICAgICAgICAgc3VwZXIoImdldFRvcG9sb2d5Q29uZiIpOwpAQCAtMjA3MCw2ICsyNjY3LDMwIEBACiAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBnZXRUb3BvbG9neUhpc3Rvcnk8SSBleHRlbmRzIElmYWNlPiBleHRlbmRzIG9yZy5hcGFjaGUudGhyaWZ0LlByb2Nlc3NGdW5jdGlvbjxJLCBnZXRUb3BvbG9neUhpc3RvcnlfYXJncz4geworICAgICAgcHVibGljIGdldFRvcG9sb2d5SGlzdG9yeSgpIHsKKyAgICAgICAgc3VwZXIoImdldFRvcG9sb2d5SGlzdG9yeSIpOworICAgICAgfQorCisgICAgICBwdWJsaWMgZ2V0VG9wb2xvZ3lIaXN0b3J5X2FyZ3MgZ2V0RW1wdHlBcmdzSW5zdGFuY2UoKSB7CisgICAgICAgIHJldHVybiBuZXcgZ2V0VG9wb2xvZ3lIaXN0b3J5X2FyZ3MoKTsKKyAgICAgIH0KKworICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNPbmV3YXkoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgcHVibGljIGdldFRvcG9sb2d5SGlzdG9yeV9yZXN1bHQgZ2V0UmVzdWx0KEkgaWZhY2UsIGdldFRvcG9sb2d5SGlzdG9yeV9hcmdzIGFyZ3MpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgICAgZ2V0VG9wb2xvZ3lIaXN0b3J5X3Jlc3VsdCByZXN1bHQgPSBuZXcgZ2V0VG9wb2xvZ3lIaXN0b3J5X3Jlc3VsdCgpOworICAgICAgICB0cnkgeworICAgICAgICAgIHJlc3VsdC5zdWNjZXNzID0gaWZhY2UuZ2V0VG9wb2xvZ3lIaXN0b3J5KGFyZ3MudXNlcik7CisgICAgICAgIH0gY2F0Y2ggKEF1dGhvcml6YXRpb25FeGNlcHRpb24gYXplKSB7CisgICAgICAgICAgcmVzdWx0LmF6ZSA9IGF6ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgfQorICAgIH0KKwogICB9CiAKICAgcHVibGljIHN0YXRpYyBjbGFzcyBBc3luY1Byb2Nlc3NvcjxJIGV4dGVuZHMgQXN5bmNJZmFjZT4gZXh0ZW5kcyBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUFzeW5jUHJvY2Vzc29yPEk+IHsKQEAgLTIwOTAsNyArMjcxMSwxMSBAQAogICAgICAgcHJvY2Vzc01hcC5wdXQoImFjdGl2YXRlIiwgbmV3IGFjdGl2YXRlKCkpOwogICAgICAgcHJvY2Vzc01hcC5wdXQoImRlYWN0aXZhdGUiLCBuZXcgZGVhY3RpdmF0ZSgpKTsKICAgICAgIHByb2Nlc3NNYXAucHV0KCJyZWJhbGFuY2UiLCBuZXcgcmViYWxhbmNlKCkpOworICAgICAgcHJvY2Vzc01hcC5wdXQoInNldExvZ0NvbmZpZyIsIG5ldyBzZXRMb2dDb25maWcoKSk7CisgICAgICBwcm9jZXNzTWFwLnB1dCgiZ2V0TG9nQ29uZmlnIiwgbmV3IGdldExvZ0NvbmZpZygpKTsKICAgICAgIHByb2Nlc3NNYXAucHV0KCJkZWJ1ZyIsIG5ldyBkZWJ1ZygpKTsKKyAgICAgIHByb2Nlc3NNYXAucHV0KCJzZXRXb3JrZXJQcm9maWxlciIsIG5ldyBzZXRXb3JrZXJQcm9maWxlcigpKTsKKyAgICAgIHByb2Nlc3NNYXAucHV0KCJnZXRDb21wb25lbnRQZW5kaW5nUHJvZmlsZUFjdGlvbnMiLCBuZXcgZ2V0Q29tcG9uZW50UGVuZGluZ1Byb2ZpbGVBY3Rpb25zKCkpOwogICAgICAgcHJvY2Vzc01hcC5wdXQoInVwbG9hZE5ld0NyZWRlbnRpYWxzIiwgbmV3IHVwbG9hZE5ld0NyZWRlbnRpYWxzKCkpOwogICAgICAgcHJvY2Vzc01hcC5wdXQoImJlZ2luRmlsZVVwbG9hZCIsIG5ldyBiZWdpbkZpbGVVcGxvYWQoKSk7CiAgICAgICBwcm9jZXNzTWFwLnB1dCgidXBsb2FkQ2h1bmsiLCBuZXcgdXBsb2FkQ2h1bmsoKSk7CkBAIC0yMTAxLDkgKzI3MjYsMTIgQEAKICAgICAgIHByb2Nlc3NNYXAucHV0KCJnZXRDbHVzdGVySW5mbyIsIG5ldyBnZXRDbHVzdGVySW5mbygpKTsKICAgICAgIHByb2Nlc3NNYXAucHV0KCJnZXRUb3BvbG9neUluZm8iLCBuZXcgZ2V0VG9wb2xvZ3lJbmZvKCkpOwogICAgICAgcHJvY2Vzc01hcC5wdXQoImdldFRvcG9sb2d5SW5mb1dpdGhPcHRzIiwgbmV3IGdldFRvcG9sb2d5SW5mb1dpdGhPcHRzKCkpOworICAgICAgcHJvY2Vzc01hcC5wdXQoImdldFRvcG9sb2d5UGFnZUluZm8iLCBuZXcgZ2V0VG9wb2xvZ3lQYWdlSW5mbygpKTsKKyAgICAgIHByb2Nlc3NNYXAucHV0KCJnZXRDb21wb25lbnRQYWdlSW5mbyIsIG5ldyBnZXRDb21wb25lbnRQYWdlSW5mbygpKTsKICAgICAgIHByb2Nlc3NNYXAucHV0KCJnZXRUb3BvbG9neUNvbmYiLCBuZXcgZ2V0VG9wb2xvZ3lDb25mKCkpOwogICAgICAgcHJvY2Vzc01hcC5wdXQoImdldFRvcG9sb2d5IiwgbmV3IGdldFRvcG9sb2d5KCkpOwogICAgICAgcHJvY2Vzc01hcC5wdXQoImdldFVzZXJUb3BvbG9neSIsIG5ldyBnZXRVc2VyVG9wb2xvZ3koKSk7CisgICAgICBwcm9jZXNzTWFwLnB1dCgiZ2V0VG9wb2xvZ3lIaXN0b3J5IiwgbmV3IGdldFRvcG9sb2d5SGlzdG9yeSgpKTsKICAgICAgIHJldHVybiBwcm9jZXNzTWFwOwogICAgIH0KIApAQCAtMjU0OSw2ICszMTc3LDEwNyBAQAogICAgICAgfQogICAgIH0KIAorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3Mgc2V0TG9nQ29uZmlnPEkgZXh0ZW5kcyBBc3luY0lmYWNlPiBleHRlbmRzIG9yZy5hcGFjaGUudGhyaWZ0LkFzeW5jUHJvY2Vzc0Z1bmN0aW9uPEksIHNldExvZ0NvbmZpZ19hcmdzLCBWb2lkPiB7CisgICAgICBwdWJsaWMgc2V0TG9nQ29uZmlnKCkgeworICAgICAgICBzdXBlcigic2V0TG9nQ29uZmlnIik7CisgICAgICB9CisKKyAgICAgIHB1YmxpYyBzZXRMb2dDb25maWdfYXJncyBnZXRFbXB0eUFyZ3NJbnN0YW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBzZXRMb2dDb25maWdfYXJncygpOworICAgICAgfQorCisgICAgICBwdWJsaWMgQXN5bmNNZXRob2RDYWxsYmFjazxWb2lkPiBnZXRSZXN1bHRIYW5kbGVyKGZpbmFsIEFzeW5jRnJhbWVCdWZmZXIgZmIsIGZpbmFsIGludCBzZXFpZCkgeworICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5Bc3luY1Byb2Nlc3NGdW5jdGlvbiBmY2FsbCA9IHRoaXM7CisgICAgICAgIHJldHVybiBuZXcgQXN5bmNNZXRob2RDYWxsYmFjazxWb2lkPigpIHsgCisgICAgICAgICAgcHVibGljIHZvaWQgb25Db21wbGV0ZShWb2lkIG8pIHsKKyAgICAgICAgICAgIHNldExvZ0NvbmZpZ19yZXN1bHQgcmVzdWx0ID0gbmV3IHNldExvZ0NvbmZpZ19yZXN1bHQoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgIGZjYWxsLnNlbmRSZXNwb25zZShmYixyZXN1bHQsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlVHlwZS5SRVBMWSxzZXFpZCk7CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgIExPR0dFUi5lcnJvcigiRXhjZXB0aW9uIHdyaXRpbmcgdG8gaW50ZXJuYWwgZnJhbWUgYnVmZmVyIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmYi5jbG9zZSgpOworICAgICAgICAgIH0KKyAgICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBieXRlIG1zZ1R5cGUgPSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWVzc2FnZVR5cGUuUkVQTFk7CisgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZSBtc2c7CisgICAgICAgICAgICBzZXRMb2dDb25maWdfcmVzdWx0IHJlc3VsdCA9IG5ldyBzZXRMb2dDb25maWdfcmVzdWx0KCk7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIG1zZ1R5cGUgPSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWVzc2FnZVR5cGUuRVhDRVBUSU9OOworICAgICAgICAgICAgICBtc2cgPSAob3JnLmFwYWNoZS50aHJpZnQuVEJhc2UpbmV3IG9yZy5hcGFjaGUudGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbihvcmcuYXBhY2hlLnRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24uSU5URVJOQUxfRVJST1IsIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgIGZjYWxsLnNlbmRSZXNwb25zZShmYixtc2csbXNnVHlwZSxzZXFpZCk7CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICBMT0dHRVIuZXJyb3IoIkV4Y2VwdGlvbiB3cml0aW5nIHRvIGludGVybmFsIGZyYW1lIGJ1ZmZlciIsIGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZiLmNsb3NlKCk7CisgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgfQorCisgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc09uZXdheSgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICBwdWJsaWMgdm9pZCBzdGFydChJIGlmYWNlLCBzZXRMb2dDb25maWdfYXJncyBhcmdzLCBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5Bc3luY01ldGhvZENhbGxiYWNrPFZvaWQ+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgaWZhY2Uuc2V0TG9nQ29uZmlnKGFyZ3MubmFtZSwgYXJncy5jb25maWcscmVzdWx0SGFuZGxlcik7CisgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBnZXRMb2dDb25maWc8SSBleHRlbmRzIEFzeW5jSWZhY2U+IGV4dGVuZHMgb3JnLmFwYWNoZS50aHJpZnQuQXN5bmNQcm9jZXNzRnVuY3Rpb248SSwgZ2V0TG9nQ29uZmlnX2FyZ3MsIExvZ0NvbmZpZz4geworICAgICAgcHVibGljIGdldExvZ0NvbmZpZygpIHsKKyAgICAgICAgc3VwZXIoImdldExvZ0NvbmZpZyIpOworICAgICAgfQorCisgICAgICBwdWJsaWMgZ2V0TG9nQ29uZmlnX2FyZ3MgZ2V0RW1wdHlBcmdzSW5zdGFuY2UoKSB7CisgICAgICAgIHJldHVybiBuZXcgZ2V0TG9nQ29uZmlnX2FyZ3MoKTsKKyAgICAgIH0KKworICAgICAgcHVibGljIEFzeW5jTWV0aG9kQ2FsbGJhY2s8TG9nQ29uZmlnPiBnZXRSZXN1bHRIYW5kbGVyKGZpbmFsIEFzeW5jRnJhbWVCdWZmZXIgZmIsIGZpbmFsIGludCBzZXFpZCkgeworICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5Bc3luY1Byb2Nlc3NGdW5jdGlvbiBmY2FsbCA9IHRoaXM7CisgICAgICAgIHJldHVybiBuZXcgQXN5bmNNZXRob2RDYWxsYmFjazxMb2dDb25maWc+KCkgeyAKKyAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNvbXBsZXRlKExvZ0NvbmZpZyBvKSB7CisgICAgICAgICAgICBnZXRMb2dDb25maWdfcmVzdWx0IHJlc3VsdCA9IG5ldyBnZXRMb2dDb25maWdfcmVzdWx0KCk7CisgICAgICAgICAgICByZXN1bHQuc3VjY2VzcyA9IG87CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICBmY2FsbC5zZW5kUmVzcG9uc2UoZmIscmVzdWx0LCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWVzc2FnZVR5cGUuUkVQTFksc2VxaWQpOworICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICBMT0dHRVIuZXJyb3IoIkV4Y2VwdGlvbiB3cml0aW5nIHRvIGludGVybmFsIGZyYW1lIGJ1ZmZlciIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmIuY2xvc2UoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcihFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYnl0ZSBtc2dUeXBlID0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1lc3NhZ2VUeXBlLlJFUExZOworICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2UgbXNnOworICAgICAgICAgICAgZ2V0TG9nQ29uZmlnX3Jlc3VsdCByZXN1bHQgPSBuZXcgZ2V0TG9nQ29uZmlnX3Jlc3VsdCgpOworICAgICAgICAgICAgeworICAgICAgICAgICAgICBtc2dUeXBlID0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTjsKKyAgICAgICAgICAgICAgbXNnID0gKG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlKW5ldyBvcmcuYXBhY2hlLnRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24ob3JnLmFwYWNoZS50aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uLklOVEVSTkFMX0VSUk9SLCBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICBmY2FsbC5zZW5kUmVzcG9uc2UoZmIsbXNnLG1zZ1R5cGUsc2VxaWQpOworICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgTE9HR0VSLmVycm9yKCJFeGNlcHRpb24gd3JpdGluZyB0byBpbnRlcm5hbCBmcmFtZSBidWZmZXIiLCBleCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmYi5jbG9zZSgpOworICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgIH0KKworICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNPbmV3YXkoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgcHVibGljIHZvaWQgc3RhcnQoSSBpZmFjZSwgZ2V0TG9nQ29uZmlnX2FyZ3MgYXJncywgb3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuQXN5bmNNZXRob2RDYWxsYmFjazxMb2dDb25maWc+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgaWZhY2UuZ2V0TG9nQ29uZmlnKGFyZ3MubmFtZSxyZXN1bHRIYW5kbGVyKTsKKyAgICAgIH0KKyAgICB9CisKICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIGRlYnVnPEkgZXh0ZW5kcyBBc3luY0lmYWNlPiBleHRlbmRzIG9yZy5hcGFjaGUudGhyaWZ0LkFzeW5jUHJvY2Vzc0Z1bmN0aW9uPEksIGRlYnVnX2FyZ3MsIFZvaWQ+IHsKICAgICAgIHB1YmxpYyBkZWJ1ZygpIHsKICAgICAgICAgc3VwZXIoImRlYnVnIik7CkBAIC0yNjEwLDYgKzMzMzksMTA3IEBACiAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBzZXRXb3JrZXJQcm9maWxlcjxJIGV4dGVuZHMgQXN5bmNJZmFjZT4gZXh0ZW5kcyBvcmcuYXBhY2hlLnRocmlmdC5Bc3luY1Byb2Nlc3NGdW5jdGlvbjxJLCBzZXRXb3JrZXJQcm9maWxlcl9hcmdzLCBWb2lkPiB7CisgICAgICBwdWJsaWMgc2V0V29ya2VyUHJvZmlsZXIoKSB7CisgICAgICAgIHN1cGVyKCJzZXRXb3JrZXJQcm9maWxlciIpOworICAgICAgfQorCisgICAgICBwdWJsaWMgc2V0V29ya2VyUHJvZmlsZXJfYXJncyBnZXRFbXB0eUFyZ3NJbnN0YW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBzZXRXb3JrZXJQcm9maWxlcl9hcmdzKCk7CisgICAgICB9CisKKyAgICAgIHB1YmxpYyBBc3luY01ldGhvZENhbGxiYWNrPFZvaWQ+IGdldFJlc3VsdEhhbmRsZXIoZmluYWwgQXN5bmNGcmFtZUJ1ZmZlciBmYiwgZmluYWwgaW50IHNlcWlkKSB7CisgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LkFzeW5jUHJvY2Vzc0Z1bmN0aW9uIGZjYWxsID0gdGhpczsKKyAgICAgICAgcmV0dXJuIG5ldyBBc3luY01ldGhvZENhbGxiYWNrPFZvaWQ+KCkgeyAKKyAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNvbXBsZXRlKFZvaWQgbykgeworICAgICAgICAgICAgc2V0V29ya2VyUHJvZmlsZXJfcmVzdWx0IHJlc3VsdCA9IG5ldyBzZXRXb3JrZXJQcm9maWxlcl9yZXN1bHQoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgIGZjYWxsLnNlbmRSZXNwb25zZShmYixyZXN1bHQsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlVHlwZS5SRVBMWSxzZXFpZCk7CisgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgIExPR0dFUi5lcnJvcigiRXhjZXB0aW9uIHdyaXRpbmcgdG8gaW50ZXJuYWwgZnJhbWUgYnVmZmVyIiwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmYi5jbG9zZSgpOworICAgICAgICAgIH0KKyAgICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBieXRlIG1zZ1R5cGUgPSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWVzc2FnZVR5cGUuUkVQTFk7CisgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZSBtc2c7CisgICAgICAgICAgICBzZXRXb3JrZXJQcm9maWxlcl9yZXN1bHQgcmVzdWx0ID0gbmV3IHNldFdvcmtlclByb2ZpbGVyX3Jlc3VsdCgpOworICAgICAgICAgICAgeworICAgICAgICAgICAgICBtc2dUeXBlID0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTjsKKyAgICAgICAgICAgICAgbXNnID0gKG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlKW5ldyBvcmcuYXBhY2hlLnRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24ob3JnLmFwYWNoZS50aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uLklOVEVSTkFMX0VSUk9SLCBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICBmY2FsbC5zZW5kUmVzcG9uc2UoZmIsbXNnLG1zZ1R5cGUsc2VxaWQpOworICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgTE9HR0VSLmVycm9yKCJFeGNlcHRpb24gd3JpdGluZyB0byBpbnRlcm5hbCBmcmFtZSBidWZmZXIiLCBleCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmYi5jbG9zZSgpOworICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgIH0KKworICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNPbmV3YXkoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgcHVibGljIHZvaWQgc3RhcnQoSSBpZmFjZSwgc2V0V29ya2VyUHJvZmlsZXJfYXJncyBhcmdzLCBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5Bc3luY01ldGhvZENhbGxiYWNrPFZvaWQ+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgaWZhY2Uuc2V0V29ya2VyUHJvZmlsZXIoYXJncy5pZCwgYXJncy5wcm9maWxlUmVxdWVzdCxyZXN1bHRIYW5kbGVyKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIGdldENvbXBvbmVudFBlbmRpbmdQcm9maWxlQWN0aW9uczxJIGV4dGVuZHMgQXN5bmNJZmFjZT4gZXh0ZW5kcyBvcmcuYXBhY2hlLnRocmlmdC5Bc3luY1Byb2Nlc3NGdW5jdGlvbjxJLCBnZXRDb21wb25lbnRQZW5kaW5nUHJvZmlsZUFjdGlvbnNfYXJncywgTGlzdDxQcm9maWxlUmVxdWVzdD4+IHsKKyAgICAgIHB1YmxpYyBnZXRDb21wb25lbnRQZW5kaW5nUHJvZmlsZUFjdGlvbnMoKSB7CisgICAgICAgIHN1cGVyKCJnZXRDb21wb25lbnRQZW5kaW5nUHJvZmlsZUFjdGlvbnMiKTsKKyAgICAgIH0KKworICAgICAgcHVibGljIGdldENvbXBvbmVudFBlbmRpbmdQcm9maWxlQWN0aW9uc19hcmdzIGdldEVtcHR5QXJnc0luc3RhbmNlKCkgeworICAgICAgICByZXR1cm4gbmV3IGdldENvbXBvbmVudFBlbmRpbmdQcm9maWxlQWN0aW9uc19hcmdzKCk7CisgICAgICB9CisKKyAgICAgIHB1YmxpYyBBc3luY01ldGhvZENhbGxiYWNrPExpc3Q8UHJvZmlsZVJlcXVlc3Q+PiBnZXRSZXN1bHRIYW5kbGVyKGZpbmFsIEFzeW5jRnJhbWVCdWZmZXIgZmIsIGZpbmFsIGludCBzZXFpZCkgeworICAgICAgICBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5Bc3luY1Byb2Nlc3NGdW5jdGlvbiBmY2FsbCA9IHRoaXM7CisgICAgICAgIHJldHVybiBuZXcgQXN5bmNNZXRob2RDYWxsYmFjazxMaXN0PFByb2ZpbGVSZXF1ZXN0Pj4oKSB7IAorICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ29tcGxldGUoTGlzdDxQcm9maWxlUmVxdWVzdD4gbykgeworICAgICAgICAgICAgZ2V0Q29tcG9uZW50UGVuZGluZ1Byb2ZpbGVBY3Rpb25zX3Jlc3VsdCByZXN1bHQgPSBuZXcgZ2V0Q29tcG9uZW50UGVuZGluZ1Byb2ZpbGVBY3Rpb25zX3Jlc3VsdCgpOworICAgICAgICAgICAgcmVzdWx0LnN1Y2Nlc3MgPSBvOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgZmNhbGwuc2VuZFJlc3BvbnNlKGZiLHJlc3VsdCwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1lc3NhZ2VUeXBlLlJFUExZLHNlcWlkKTsKKyAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgTE9HR0VSLmVycm9yKCJFeGNlcHRpb24gd3JpdGluZyB0byBpbnRlcm5hbCBmcmFtZSBidWZmZXIiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZiLmNsb3NlKCk7CisgICAgICAgICAgfQorICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGJ5dGUgbXNnVHlwZSA9IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlVHlwZS5SRVBMWTsKKyAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlIG1zZzsKKyAgICAgICAgICAgIGdldENvbXBvbmVudFBlbmRpbmdQcm9maWxlQWN0aW9uc19yZXN1bHQgcmVzdWx0ID0gbmV3IGdldENvbXBvbmVudFBlbmRpbmdQcm9maWxlQWN0aW9uc19yZXN1bHQoKTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgbXNnVHlwZSA9IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlVHlwZS5FWENFUFRJT047CisgICAgICAgICAgICAgIG1zZyA9IChvcmcuYXBhY2hlLnRocmlmdC5UQmFzZSluZXcgb3JnLmFwYWNoZS50aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uKG9yZy5hcGFjaGUudGhyaWZ0LlRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5JTlRFUk5BTF9FUlJPUiwgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgZmNhbGwuc2VuZFJlc3BvbnNlKGZiLG1zZyxtc2dUeXBlLHNlcWlkKTsKKyAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgIExPR0dFUi5lcnJvcigiRXhjZXB0aW9uIHdyaXRpbmcgdG8gaW50ZXJuYWwgZnJhbWUgYnVmZmVyIiwgZXgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmIuY2xvc2UoKTsKKyAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICB9CisKKyAgICAgIHByb3RlY3RlZCBib29sZWFuIGlzT25ld2F5KCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0KEkgaWZhY2UsIGdldENvbXBvbmVudFBlbmRpbmdQcm9maWxlQWN0aW9uc19hcmdzIGFyZ3MsIG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLkFzeW5jTWV0aG9kQ2FsbGJhY2s8TGlzdDxQcm9maWxlUmVxdWVzdD4+IHJlc3VsdEhhbmRsZXIpIHRocm93cyBURXhjZXB0aW9uIHsKKyAgICAgICAgaWZhY2UuZ2V0Q29tcG9uZW50UGVuZGluZ1Byb2ZpbGVBY3Rpb25zKGFyZ3MuaWQsIGFyZ3MuY29tcG9uZW50X2lkLCBhcmdzLmFjdGlvbixyZXN1bHRIYW5kbGVyKTsKKyAgICAgIH0KKyAgICB9CisKICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIHVwbG9hZE5ld0NyZWRlbnRpYWxzPEkgZXh0ZW5kcyBBc3luY0lmYWNlPiBleHRlbmRzIG9yZy5hcGFjaGUudGhyaWZ0LkFzeW5jUHJvY2Vzc0Z1bmN0aW9uPEksIHVwbG9hZE5ld0NyZWRlbnRpYWxzX2FyZ3MsIFZvaWQ+IHsKICAgICAgIHB1YmxpYyB1cGxvYWROZXdDcmVkZW50aWFscygpIHsKICAgICAgICAgc3VwZXIoInVwbG9hZE5ld0NyZWRlbnRpYWxzIik7CkBAIC0zMTk3LDYgKzQwMjcsMTMwIEBACiAgICAgICB9CiAgICAgfQogCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBnZXRUb3BvbG9neVBhZ2VJbmZvPEkgZXh0ZW5kcyBBc3luY0lmYWNlPiBleHRlbmRzIG9yZy5hcGFjaGUudGhyaWZ0LkFzeW5jUHJvY2Vzc0Z1bmN0aW9uPEksIGdldFRvcG9sb2d5UGFnZUluZm9fYXJncywgVG9wb2xvZ3lQYWdlSW5mbz4geworICAgICAgcHVibGljIGdldFRvcG9sb2d5UGFnZUluZm8oKSB7CisgICAgICAgIHN1cGVyKCJnZXRUb3BvbG9neVBhZ2VJbmZvIik7CisgICAgICB9CisKKyAgICAgIHB1YmxpYyBnZXRUb3BvbG9neVBhZ2VJbmZvX2FyZ3MgZ2V0RW1wdHlBcmdzSW5zdGFuY2UoKSB7CisgICAgICAgIHJldHVybiBuZXcgZ2V0VG9wb2xvZ3lQYWdlSW5mb19hcmdzKCk7CisgICAgICB9CisKKyAgICAgIHB1YmxpYyBBc3luY01ldGhvZENhbGxiYWNrPFRvcG9sb2d5UGFnZUluZm8+IGdldFJlc3VsdEhhbmRsZXIoZmluYWwgQXN5bmNGcmFtZUJ1ZmZlciBmYiwgZmluYWwgaW50IHNlcWlkKSB7CisgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LkFzeW5jUHJvY2Vzc0Z1bmN0aW9uIGZjYWxsID0gdGhpczsKKyAgICAgICAgcmV0dXJuIG5ldyBBc3luY01ldGhvZENhbGxiYWNrPFRvcG9sb2d5UGFnZUluZm8+KCkgeyAKKyAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNvbXBsZXRlKFRvcG9sb2d5UGFnZUluZm8gbykgeworICAgICAgICAgICAgZ2V0VG9wb2xvZ3lQYWdlSW5mb19yZXN1bHQgcmVzdWx0ID0gbmV3IGdldFRvcG9sb2d5UGFnZUluZm9fcmVzdWx0KCk7CisgICAgICAgICAgICByZXN1bHQuc3VjY2VzcyA9IG87CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICBmY2FsbC5zZW5kUmVzcG9uc2UoZmIscmVzdWx0LCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWVzc2FnZVR5cGUuUkVQTFksc2VxaWQpOworICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICBMT0dHRVIuZXJyb3IoIkV4Y2VwdGlvbiB3cml0aW5nIHRvIGludGVybmFsIGZyYW1lIGJ1ZmZlciIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmIuY2xvc2UoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcihFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYnl0ZSBtc2dUeXBlID0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1lc3NhZ2VUeXBlLlJFUExZOworICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2UgbXNnOworICAgICAgICAgICAgZ2V0VG9wb2xvZ3lQYWdlSW5mb19yZXN1bHQgcmVzdWx0ID0gbmV3IGdldFRvcG9sb2d5UGFnZUluZm9fcmVzdWx0KCk7CisgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIE5vdEFsaXZlRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZSA9IChOb3RBbGl2ZUV4Y2VwdGlvbikgZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zZXRfZV9pc1NldCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZyA9IHJlc3VsdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBBdXRob3JpemF0aW9uRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXplID0gKEF1dGhvcml6YXRpb25FeGNlcHRpb24pIGU7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuc2V0X2F6ZV9pc1NldCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZyA9IHJlc3VsdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBlbHNlIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICBtc2dUeXBlID0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTjsKKyAgICAgICAgICAgICAgbXNnID0gKG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlKW5ldyBvcmcuYXBhY2hlLnRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24ob3JnLmFwYWNoZS50aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uLklOVEVSTkFMX0VSUk9SLCBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICBmY2FsbC5zZW5kUmVzcG9uc2UoZmIsbXNnLG1zZ1R5cGUsc2VxaWQpOworICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgTE9HR0VSLmVycm9yKCJFeGNlcHRpb24gd3JpdGluZyB0byBpbnRlcm5hbCBmcmFtZSBidWZmZXIiLCBleCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmYi5jbG9zZSgpOworICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgIH0KKworICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNPbmV3YXkoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgcHVibGljIHZvaWQgc3RhcnQoSSBpZmFjZSwgZ2V0VG9wb2xvZ3lQYWdlSW5mb19hcmdzIGFyZ3MsIG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLkFzeW5jTWV0aG9kQ2FsbGJhY2s8VG9wb2xvZ3lQYWdlSW5mbz4gcmVzdWx0SGFuZGxlcikgdGhyb3dzIFRFeGNlcHRpb24geworICAgICAgICBpZmFjZS5nZXRUb3BvbG9neVBhZ2VJbmZvKGFyZ3MuaWQsIGFyZ3Mud2luZG93LCBhcmdzLmlzX2luY2x1ZGVfc3lzLHJlc3VsdEhhbmRsZXIpOworICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgZ2V0Q29tcG9uZW50UGFnZUluZm88SSBleHRlbmRzIEFzeW5jSWZhY2U+IGV4dGVuZHMgb3JnLmFwYWNoZS50aHJpZnQuQXN5bmNQcm9jZXNzRnVuY3Rpb248SSwgZ2V0Q29tcG9uZW50UGFnZUluZm9fYXJncywgQ29tcG9uZW50UGFnZUluZm8+IHsKKyAgICAgIHB1YmxpYyBnZXRDb21wb25lbnRQYWdlSW5mbygpIHsKKyAgICAgICAgc3VwZXIoImdldENvbXBvbmVudFBhZ2VJbmZvIik7CisgICAgICB9CisKKyAgICAgIHB1YmxpYyBnZXRDb21wb25lbnRQYWdlSW5mb19hcmdzIGdldEVtcHR5QXJnc0luc3RhbmNlKCkgeworICAgICAgICByZXR1cm4gbmV3IGdldENvbXBvbmVudFBhZ2VJbmZvX2FyZ3MoKTsKKyAgICAgIH0KKworICAgICAgcHVibGljIEFzeW5jTWV0aG9kQ2FsbGJhY2s8Q29tcG9uZW50UGFnZUluZm8+IGdldFJlc3VsdEhhbmRsZXIoZmluYWwgQXN5bmNGcmFtZUJ1ZmZlciBmYiwgZmluYWwgaW50IHNlcWlkKSB7CisgICAgICAgIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LkFzeW5jUHJvY2Vzc0Z1bmN0aW9uIGZjYWxsID0gdGhpczsKKyAgICAgICAgcmV0dXJuIG5ldyBBc3luY01ldGhvZENhbGxiYWNrPENvbXBvbmVudFBhZ2VJbmZvPigpIHsgCisgICAgICAgICAgcHVibGljIHZvaWQgb25Db21wbGV0ZShDb21wb25lbnRQYWdlSW5mbyBvKSB7CisgICAgICAgICAgICBnZXRDb21wb25lbnRQYWdlSW5mb19yZXN1bHQgcmVzdWx0ID0gbmV3IGdldENvbXBvbmVudFBhZ2VJbmZvX3Jlc3VsdCgpOworICAgICAgICAgICAgcmVzdWx0LnN1Y2Nlc3MgPSBvOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgZmNhbGwuc2VuZFJlc3BvbnNlKGZiLHJlc3VsdCwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1lc3NhZ2VUeXBlLlJFUExZLHNlcWlkKTsKKyAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgTE9HR0VSLmVycm9yKCJFeGNlcHRpb24gd3JpdGluZyB0byBpbnRlcm5hbCBmcmFtZSBidWZmZXIiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZiLmNsb3NlKCk7CisgICAgICAgICAgfQorICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGJ5dGUgbXNnVHlwZSA9IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNZXNzYWdlVHlwZS5SRVBMWTsKKyAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlIG1zZzsKKyAgICAgICAgICAgIGdldENvbXBvbmVudFBhZ2VJbmZvX3Jlc3VsdCByZXN1bHQgPSBuZXcgZ2V0Q29tcG9uZW50UGFnZUluZm9fcmVzdWx0KCk7CisgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIE5vdEFsaXZlRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuZSA9IChOb3RBbGl2ZUV4Y2VwdGlvbikgZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zZXRfZV9pc1NldCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZyA9IHJlc3VsdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBBdXRob3JpemF0aW9uRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXplID0gKEF1dGhvcml6YXRpb25FeGNlcHRpb24pIGU7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuc2V0X2F6ZV9pc1NldCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZyA9IHJlc3VsdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBlbHNlIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICBtc2dUeXBlID0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTjsKKyAgICAgICAgICAgICAgbXNnID0gKG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlKW5ldyBvcmcuYXBhY2hlLnRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24ob3JnLmFwYWNoZS50aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uLklOVEVSTkFMX0VSUk9SLCBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICBmY2FsbC5zZW5kUmVzcG9uc2UoZmIsbXNnLG1zZ1R5cGUsc2VxaWQpOworICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgTE9HR0VSLmVycm9yKCJFeGNlcHRpb24gd3JpdGluZyB0byBpbnRlcm5hbCBmcmFtZSBidWZmZXIiLCBleCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmYi5jbG9zZSgpOworICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgIH0KKworICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNPbmV3YXkoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgcHVibGljIHZvaWQgc3RhcnQoSSBpZmFjZSwgZ2V0Q29tcG9uZW50UGFnZUluZm9fYXJncyBhcmdzLCBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5Bc3luY01ldGhvZENhbGxiYWNrPENvbXBvbmVudFBhZ2VJbmZvPiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIGlmYWNlLmdldENvbXBvbmVudFBhZ2VJbmZvKGFyZ3MudG9wb2xvZ3lfaWQsIGFyZ3MuY29tcG9uZW50X2lkLCBhcmdzLndpbmRvdywgYXJncy5pc19pbmNsdWRlX3N5cyxyZXN1bHRIYW5kbGVyKTsKKyAgICAgIH0KKyAgICB9CisKICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIGdldFRvcG9sb2d5Q29uZjxJIGV4dGVuZHMgQXN5bmNJZmFjZT4gZXh0ZW5kcyBvcmcuYXBhY2hlLnRocmlmdC5Bc3luY1Byb2Nlc3NGdW5jdGlvbjxJLCBnZXRUb3BvbG9neUNvbmZfYXJncywgU3RyaW5nPiB7CiAgICAgICBwdWJsaWMgZ2V0VG9wb2xvZ3lDb25mKCkgewogICAgICAgICBzdXBlcigiZ2V0VG9wb2xvZ3lDb25mIik7CkBAIC0zMzgzLDYgKzQzMzcsNjMgQEAKICAgICAgIH0KICAgICB9CiAKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIGdldFRvcG9sb2d5SGlzdG9yeTxJIGV4dGVuZHMgQXN5bmNJZmFjZT4gZXh0ZW5kcyBvcmcuYXBhY2hlLnRocmlmdC5Bc3luY1Byb2Nlc3NGdW5jdGlvbjxJLCBnZXRUb3BvbG9neUhpc3RvcnlfYXJncywgVG9wb2xvZ3lIaXN0b3J5SW5mbz4geworICAgICAgcHVibGljIGdldFRvcG9sb2d5SGlzdG9yeSgpIHsKKyAgICAgICAgc3VwZXIoImdldFRvcG9sb2d5SGlzdG9yeSIpOworICAgICAgfQorCisgICAgICBwdWJsaWMgZ2V0VG9wb2xvZ3lIaXN0b3J5X2FyZ3MgZ2V0RW1wdHlBcmdzSW5zdGFuY2UoKSB7CisgICAgICAgIHJldHVybiBuZXcgZ2V0VG9wb2xvZ3lIaXN0b3J5X2FyZ3MoKTsKKyAgICAgIH0KKworICAgICAgcHVibGljIEFzeW5jTWV0aG9kQ2FsbGJhY2s8VG9wb2xvZ3lIaXN0b3J5SW5mbz4gZ2V0UmVzdWx0SGFuZGxlcihmaW5hbCBBc3luY0ZyYW1lQnVmZmVyIGZiLCBmaW5hbCBpbnQgc2VxaWQpIHsKKyAgICAgICAgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQuQXN5bmNQcm9jZXNzRnVuY3Rpb24gZmNhbGwgPSB0aGlzOworICAgICAgICByZXR1cm4gbmV3IEFzeW5jTWV0aG9kQ2FsbGJhY2s8VG9wb2xvZ3lIaXN0b3J5SW5mbz4oKSB7IAorICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ29tcGxldGUoVG9wb2xvZ3lIaXN0b3J5SW5mbyBvKSB7CisgICAgICAgICAgICBnZXRUb3BvbG9neUhpc3RvcnlfcmVzdWx0IHJlc3VsdCA9IG5ldyBnZXRUb3BvbG9neUhpc3RvcnlfcmVzdWx0KCk7CisgICAgICAgICAgICByZXN1bHQuc3VjY2VzcyA9IG87CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICBmY2FsbC5zZW5kUmVzcG9uc2UoZmIscmVzdWx0LCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWVzc2FnZVR5cGUuUkVQTFksc2VxaWQpOworICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICBMT0dHRVIuZXJyb3IoIkV4Y2VwdGlvbiB3cml0aW5nIHRvIGludGVybmFsIGZyYW1lIGJ1ZmZlciIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmIuY2xvc2UoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcihFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYnl0ZSBtc2dUeXBlID0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1lc3NhZ2VUeXBlLlJFUExZOworICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2UgbXNnOworICAgICAgICAgICAgZ2V0VG9wb2xvZ3lIaXN0b3J5X3Jlc3VsdCByZXN1bHQgPSBuZXcgZ2V0VG9wb2xvZ3lIaXN0b3J5X3Jlc3VsdCgpOworICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBBdXRob3JpemF0aW9uRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXplID0gKEF1dGhvcml6YXRpb25FeGNlcHRpb24pIGU7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuc2V0X2F6ZV9pc1NldCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZyA9IHJlc3VsdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBlbHNlIAorICAgICAgICAgICAgeworICAgICAgICAgICAgICBtc2dUeXBlID0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTjsKKyAgICAgICAgICAgICAgbXNnID0gKG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlKW5ldyBvcmcuYXBhY2hlLnRocmlmdC5UQXBwbGljYXRpb25FeGNlcHRpb24ob3JnLmFwYWNoZS50aHJpZnQuVEFwcGxpY2F0aW9uRXhjZXB0aW9uLklOVEVSTkFMX0VSUk9SLCBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICBmY2FsbC5zZW5kUmVzcG9uc2UoZmIsbXNnLG1zZ1R5cGUsc2VxaWQpOworICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgTE9HR0VSLmVycm9yKCJFeGNlcHRpb24gd3JpdGluZyB0byBpbnRlcm5hbCBmcmFtZSBidWZmZXIiLCBleCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmYi5jbG9zZSgpOworICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgIH0KKworICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNPbmV3YXkoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgcHVibGljIHZvaWQgc3RhcnQoSSBpZmFjZSwgZ2V0VG9wb2xvZ3lIaXN0b3J5X2FyZ3MgYXJncywgb3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuQXN5bmNNZXRob2RDYWxsYmFjazxUb3BvbG9neUhpc3RvcnlJbmZvPiByZXN1bHRIYW5kbGVyKSB0aHJvd3MgVEV4Y2VwdGlvbiB7CisgICAgICAgIGlmYWNlLmdldFRvcG9sb2d5SGlzdG9yeShhcmdzLnVzZXIscmVzdWx0SGFuZGxlcik7CisgICAgICB9CisgICAgfQorCiAgIH0KIAogICBwdWJsaWMgc3RhdGljIGNsYXNzIHN1Ym1pdFRvcG9sb2d5X2FyZ3MgaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZTxzdWJtaXRUb3BvbG9neV9hcmdzLCBzdWJtaXRUb3BvbG9neV9hcmdzLl9GaWVsZHM+LCBqYXZhLmlvLlNlcmlhbGl6YWJsZSwgQ2xvbmVhYmxlLCBDb21wYXJhYmxlPHN1Ym1pdFRvcG9sb2d5X2FyZ3M+ICAgewpAQCAtMTA0MzIsNiArMTE0NDMsMTQ0MCBAQAogCiAgIH0KIAorICBwdWJsaWMgc3RhdGljIGNsYXNzIHNldExvZ0NvbmZpZ19hcmdzIGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2U8c2V0TG9nQ29uZmlnX2FyZ3MsIHNldExvZ0NvbmZpZ19hcmdzLl9GaWVsZHM+LCBqYXZhLmlvLlNlcmlhbGl6YWJsZSwgQ2xvbmVhYmxlLCBDb21wYXJhYmxlPHNldExvZ0NvbmZpZ19hcmdzPiAgIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0IFNUUlVDVF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QoInNldExvZ0NvbmZpZ19hcmdzIik7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgTkFNRV9GSUVMRF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCgibmFtZSIsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORywgKHNob3J0KTEpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBDT05GSUdfRklFTERfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQoImNvbmZpZyIsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCwgKHNob3J0KTIpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPENsYXNzPD8gZXh0ZW5kcyBJU2NoZW1lPiwgU2NoZW1lRmFjdG9yeT4gc2NoZW1lcyA9IG5ldyBIYXNoTWFwPENsYXNzPD8gZXh0ZW5kcyBJU2NoZW1lPiwgU2NoZW1lRmFjdG9yeT4oKTsKKyAgICBzdGF0aWMgeworICAgICAgc2NoZW1lcy5wdXQoU3RhbmRhcmRTY2hlbWUuY2xhc3MsIG5ldyBzZXRMb2dDb25maWdfYXJnc1N0YW5kYXJkU2NoZW1lRmFjdG9yeSgpKTsKKyAgICAgIHNjaGVtZXMucHV0KFR1cGxlU2NoZW1lLmNsYXNzLCBuZXcgc2V0TG9nQ29uZmlnX2FyZ3NUdXBsZVNjaGVtZUZhY3RvcnkoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsgLy8gcmVxdWlyZWQKKyAgICBwcml2YXRlIExvZ0NvbmZpZyBjb25maWc7IC8vIHJlcXVpcmVkCisKKyAgICAvKiogVGhlIHNldCBvZiBmaWVsZHMgdGhpcyBzdHJ1Y3QgY29udGFpbnMsIGFsb25nIHdpdGggY29udmVuaWVuY2UgbWV0aG9kcyBmb3IgZmluZGluZyBhbmQgbWFuaXB1bGF0aW5nIHRoZW0uICovCisgICAgcHVibGljIGVudW0gX0ZpZWxkcyBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZElkRW51bSB7CisgICAgICBOQU1FKChzaG9ydCkxLCAibmFtZSIpLAorICAgICAgQ09ORklHKChzaG9ydCkyLCAiY29uZmlnIik7CisKKyAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsIF9GaWVsZHM+IGJ5TmFtZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgX0ZpZWxkcz4oKTsKKworICAgICAgc3RhdGljIHsKKyAgICAgICAgZm9yIChfRmllbGRzIGZpZWxkIDogRW51bVNldC5hbGxPZihfRmllbGRzLmNsYXNzKSkgeworICAgICAgICAgIGJ5TmFtZS5wdXQoZmllbGQuZ2V0RmllbGROYW1lKCksIGZpZWxkKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEZpbmQgdGhlIF9GaWVsZHMgY29uc3RhbnQgdGhhdCBtYXRjaGVzIGZpZWxkSWQsIG9yIG51bGwgaWYgaXRzIG5vdCBmb3VuZC4KKyAgICAgICAqLworICAgICAgcHVibGljIHN0YXRpYyBfRmllbGRzIGZpbmRCeVRocmlmdElkKGludCBmaWVsZElkKSB7CisgICAgICAgIHN3aXRjaChmaWVsZElkKSB7CisgICAgICAgICAgY2FzZSAxOiAvLyBOQU1FCisgICAgICAgICAgICByZXR1cm4gTkFNRTsKKyAgICAgICAgICBjYXNlIDI6IC8vIENPTkZJRworICAgICAgICAgICAgcmV0dXJuIENPTkZJRzsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBGaW5kIHRoZSBfRmllbGRzIGNvbnN0YW50IHRoYXQgbWF0Y2hlcyBmaWVsZElkLCB0aHJvd2luZyBhbiBleGNlcHRpb24KKyAgICAgICAqIGlmIGl0IGlzIG5vdCBmb3VuZC4KKyAgICAgICAqLworICAgICAgcHVibGljIHN0YXRpYyBfRmllbGRzIGZpbmRCeVRocmlmdElkT3JUaHJvdyhpbnQgZmllbGRJZCkgeworICAgICAgICBfRmllbGRzIGZpZWxkcyA9IGZpbmRCeVRocmlmdElkKGZpZWxkSWQpOworICAgICAgICBpZiAoZmllbGRzID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkZpZWxkICIgKyBmaWVsZElkICsgIiBkb2Vzbid0IGV4aXN0ISIpOworICAgICAgICByZXR1cm4gZmllbGRzOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEZpbmQgdGhlIF9GaWVsZHMgY29uc3RhbnQgdGhhdCBtYXRjaGVzIG5hbWUsIG9yIG51bGwgaWYgaXRzIG5vdCBmb3VuZC4KKyAgICAgICAqLworICAgICAgcHVibGljIHN0YXRpYyBfRmllbGRzIGZpbmRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGJ5TmFtZS5nZXQobmFtZSk7CisgICAgICB9CisKKyAgICAgIHByaXZhdGUgZmluYWwgc2hvcnQgX3RocmlmdElkOworICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX2ZpZWxkTmFtZTsKKworICAgICAgX0ZpZWxkcyhzaG9ydCB0aHJpZnRJZCwgU3RyaW5nIGZpZWxkTmFtZSkgeworICAgICAgICBfdGhyaWZ0SWQgPSB0aHJpZnRJZDsKKyAgICAgICAgX2ZpZWxkTmFtZSA9IGZpZWxkTmFtZTsKKyAgICAgIH0KKworICAgICAgcHVibGljIHNob3J0IGdldFRocmlmdEZpZWxkSWQoKSB7CisgICAgICAgIHJldHVybiBfdGhyaWZ0SWQ7CisgICAgICB9CisKKyAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmllbGROYW1lKCkgeworICAgICAgICByZXR1cm4gX2ZpZWxkTmFtZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBpc3NldCBpZCBhc3NpZ25tZW50cworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPiBtZXRhRGF0YU1hcDsKKyAgICBzdGF0aWMgeworICAgICAgTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPiB0bXBNYXAgPSBuZXcgRW51bU1hcDxfRmllbGRzLCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YT4oX0ZpZWxkcy5jbGFzcyk7CisgICAgICB0bXBNYXAucHV0KF9GaWVsZHMuTkFNRSwgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhKCJuYW1lIiwgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLkRFRkFVTFQsIAorICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRWYWx1ZU1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORykpKTsKKyAgICAgIHRtcE1hcC5wdXQoX0ZpZWxkcy5DT05GSUcsIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YSgiY29uZmlnIiwgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLkRFRkFVTFQsIAorICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuU3RydWN0TWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNULCBMb2dDb25maWcuY2xhc3MpKSk7CisgICAgICBtZXRhRGF0YU1hcCA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcCh0bXBNYXApOworICAgICAgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEuYWRkU3RydWN0TWV0YURhdGFNYXAoc2V0TG9nQ29uZmlnX2FyZ3MuY2xhc3MsIG1ldGFEYXRhTWFwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc2V0TG9nQ29uZmlnX2FyZ3MoKSB7CisgICAgfQorCisgICAgcHVibGljIHNldExvZ0NvbmZpZ19hcmdzKAorICAgICAgU3RyaW5nIG5hbWUsCisgICAgICBMb2dDb25maWcgY29uZmlnKQorICAgIHsKKyAgICAgIHRoaXMoKTsKKyAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtcyBhIGRlZXAgY29weSBvbiA8aT5vdGhlcjwvaT4uCisgICAgICovCisgICAgcHVibGljIHNldExvZ0NvbmZpZ19hcmdzKHNldExvZ0NvbmZpZ19hcmdzIG90aGVyKSB7CisgICAgICBpZiAob3RoZXIuaXNfc2V0X25hbWUoKSkgeworICAgICAgICB0aGlzLm5hbWUgPSBvdGhlci5uYW1lOworICAgICAgfQorICAgICAgaWYgKG90aGVyLmlzX3NldF9jb25maWcoKSkgeworICAgICAgICB0aGlzLmNvbmZpZyA9IG5ldyBMb2dDb25maWcob3RoZXIuY29uZmlnKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc2V0TG9nQ29uZmlnX2FyZ3MgZGVlcENvcHkoKSB7CisgICAgICByZXR1cm4gbmV3IHNldExvZ0NvbmZpZ19hcmdzKHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgdGhpcy5uYW1lID0gbnVsbDsKKyAgICAgIHRoaXMuY29uZmlnID0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldF9uYW1lKCkgeworICAgICAgcmV0dXJuIHRoaXMubmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRfbmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1bnNldF9uYW1lKCkgeworICAgICAgdGhpcy5uYW1lID0gbnVsbDsKKyAgICB9CisKKyAgICAvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkIG5hbWUgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgICAgcHVibGljIGJvb2xlYW4gaXNfc2V0X25hbWUoKSB7CisgICAgICByZXR1cm4gdGhpcy5uYW1lICE9IG51bGw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0X25hbWVfaXNTZXQoYm9vbGVhbiB2YWx1ZSkgeworICAgICAgaWYgKCF2YWx1ZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBudWxsOworICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBMb2dDb25maWcgZ2V0X2NvbmZpZygpIHsKKyAgICAgIHJldHVybiB0aGlzLmNvbmZpZzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRfY29uZmlnKExvZ0NvbmZpZyBjb25maWcpIHsKKyAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVuc2V0X2NvbmZpZygpIHsKKyAgICAgIHRoaXMuY29uZmlnID0gbnVsbDsKKyAgICB9CisKKyAgICAvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkIGNvbmZpZyBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc19zZXRfY29uZmlnKCkgeworICAgICAgcmV0dXJuIHRoaXMuY29uZmlnICE9IG51bGw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0X2NvbmZpZ19pc1NldChib29sZWFuIHZhbHVlKSB7CisgICAgICBpZiAoIXZhbHVlKSB7CisgICAgICAgIHRoaXMuY29uZmlnID0gbnVsbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGaWVsZFZhbHVlKF9GaWVsZHMgZmllbGQsIE9iamVjdCB2YWx1ZSkgeworICAgICAgc3dpdGNoIChmaWVsZCkgeworICAgICAgY2FzZSBOQU1FOgorICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgIHVuc2V0X25hbWUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzZXRfbmFtZSgoU3RyaW5nKXZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBDT05GSUc6CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgdW5zZXRfY29uZmlnKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc2V0X2NvbmZpZygoTG9nQ29uZmlnKXZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0RmllbGRWYWx1ZShfRmllbGRzIGZpZWxkKSB7CisgICAgICBzd2l0Y2ggKGZpZWxkKSB7CisgICAgICBjYXNlIE5BTUU6CisgICAgICAgIHJldHVybiBnZXRfbmFtZSgpOworCisgICAgICBjYXNlIENPTkZJRzoKKyAgICAgICAgcmV0dXJuIGdldF9jb25maWcoKTsKKworICAgICAgfQorICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgIH0KKworICAgIC8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgY29ycmVzcG9uZGluZyB0byBmaWVsZElEIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLworICAgIHB1YmxpYyBib29sZWFuIGlzU2V0KF9GaWVsZHMgZmllbGQpIHsKKyAgICAgIGlmIChmaWVsZCA9PSBudWxsKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgIH0KKworICAgICAgc3dpdGNoIChmaWVsZCkgeworICAgICAgY2FzZSBOQU1FOgorICAgICAgICByZXR1cm4gaXNfc2V0X25hbWUoKTsKKyAgICAgIGNhc2UgQ09ORklHOgorICAgICAgICByZXR1cm4gaXNfc2V0X2NvbmZpZygpOworICAgICAgfQorICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgdGhhdCkgeworICAgICAgaWYgKHRoYXQgPT0gbnVsbCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKHRoYXQgaW5zdGFuY2VvZiBzZXRMb2dDb25maWdfYXJncykKKyAgICAgICAgcmV0dXJuIHRoaXMuZXF1YWxzKChzZXRMb2dDb25maWdfYXJncyl0aGF0KTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoc2V0TG9nQ29uZmlnX2FyZ3MgdGhhdCkgeworICAgICAgaWYgKHRoYXQgPT0gbnVsbCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICBib29sZWFuIHRoaXNfcHJlc2VudF9uYW1lID0gdHJ1ZSAmJiB0aGlzLmlzX3NldF9uYW1lKCk7CisgICAgICBib29sZWFuIHRoYXRfcHJlc2VudF9uYW1lID0gdHJ1ZSAmJiB0aGF0LmlzX3NldF9uYW1lKCk7CisgICAgICBpZiAodGhpc19wcmVzZW50X25hbWUgfHwgdGhhdF9wcmVzZW50X25hbWUpIHsKKyAgICAgICAgaWYgKCEodGhpc19wcmVzZW50X25hbWUgJiYgdGhhdF9wcmVzZW50X25hbWUpKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCF0aGlzLm5hbWUuZXF1YWxzKHRoYXQubmFtZSkpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICBib29sZWFuIHRoaXNfcHJlc2VudF9jb25maWcgPSB0cnVlICYmIHRoaXMuaXNfc2V0X2NvbmZpZygpOworICAgICAgYm9vbGVhbiB0aGF0X3ByZXNlbnRfY29uZmlnID0gdHJ1ZSAmJiB0aGF0LmlzX3NldF9jb25maWcoKTsKKyAgICAgIGlmICh0aGlzX3ByZXNlbnRfY29uZmlnIHx8IHRoYXRfcHJlc2VudF9jb25maWcpIHsKKyAgICAgICAgaWYgKCEodGhpc19wcmVzZW50X2NvbmZpZyAmJiB0aGF0X3ByZXNlbnRfY29uZmlnKSkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghdGhpcy5jb25maWcuZXF1YWxzKHRoYXQuY29uZmlnKSkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICBMaXN0PE9iamVjdD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOworCisgICAgICBib29sZWFuIHByZXNlbnRfbmFtZSA9IHRydWUgJiYgKGlzX3NldF9uYW1lKCkpOworICAgICAgbGlzdC5hZGQocHJlc2VudF9uYW1lKTsKKyAgICAgIGlmIChwcmVzZW50X25hbWUpCisgICAgICAgIGxpc3QuYWRkKG5hbWUpOworCisgICAgICBib29sZWFuIHByZXNlbnRfY29uZmlnID0gdHJ1ZSAmJiAoaXNfc2V0X2NvbmZpZygpKTsKKyAgICAgIGxpc3QuYWRkKHByZXNlbnRfY29uZmlnKTsKKyAgICAgIGlmIChwcmVzZW50X2NvbmZpZykKKyAgICAgICAgbGlzdC5hZGQoY29uZmlnKTsKKworICAgICAgcmV0dXJuIGxpc3QuaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyhzZXRMb2dDb25maWdfYXJncyBvdGhlcikgeworICAgICAgaWYgKCFnZXRDbGFzcygpLmVxdWFscyhvdGhlci5nZXRDbGFzcygpKSkgeworICAgICAgICByZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCkuY29tcGFyZVRvKG90aGVyLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgIH0KKworICAgICAgaW50IGxhc3RDb21wYXJpc29uID0gMDsKKworICAgICAgbGFzdENvbXBhcmlzb24gPSBCb29sZWFuLnZhbHVlT2YoaXNfc2V0X25hbWUoKSkuY29tcGFyZVRvKG90aGVyLmlzX3NldF9uYW1lKCkpOworICAgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgICAgfQorICAgICAgaWYgKGlzX3NldF9uYW1lKCkpIHsKKyAgICAgICAgbGFzdENvbXBhcmlzb24gPSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy5uYW1lLCBvdGhlci5uYW1lKTsKKyAgICAgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGxhc3RDb21wYXJpc29uID0gQm9vbGVhbi52YWx1ZU9mKGlzX3NldF9jb25maWcoKSkuY29tcGFyZVRvKG90aGVyLmlzX3NldF9jb25maWcoKSk7CisgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICB9CisgICAgICBpZiAoaXNfc2V0X2NvbmZpZygpKSB7CisgICAgICAgIGxhc3RDb21wYXJpc29uID0gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29tcGFyZVRvKHRoaXMuY29uZmlnLCBvdGhlci5jb25maWcpOworICAgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIF9GaWVsZHMgZmllbGRGb3JJZChpbnQgZmllbGRJZCkgeworICAgICAgcmV0dXJuIF9GaWVsZHMuZmluZEJ5VGhyaWZ0SWQoZmllbGRJZCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVhZChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgaXByb3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgIHNjaGVtZXMuZ2V0KGlwcm90LmdldFNjaGVtZSgpKS5nZXRTY2hlbWUoKS5yZWFkKGlwcm90LCB0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgb3Byb3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgIHNjaGVtZXMuZ2V0KG9wcm90LmdldFNjaGVtZSgpKS5nZXRTY2hlbWUoKS53cml0ZShvcHJvdCwgdGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigic2V0TG9nQ29uZmlnX2FyZ3MoIik7CisgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKKworICAgICAgc2IuYXBwZW5kKCJuYW1lOiIpOworICAgICAgaWYgKHRoaXMubmFtZSA9PSBudWxsKSB7CisgICAgICAgIHNiLmFwcGVuZCgibnVsbCIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2IuYXBwZW5kKHRoaXMubmFtZSk7CisgICAgICB9CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgaWYgKCFmaXJzdCkgc2IuYXBwZW5kKCIsICIpOworICAgICAgc2IuYXBwZW5kKCJjb25maWc6Iik7CisgICAgICBpZiAodGhpcy5jb25maWcgPT0gbnVsbCkgeworICAgICAgICBzYi5hcHBlbmQoIm51bGwiKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNiLmFwcGVuZCh0aGlzLmNvbmZpZyk7CisgICAgICB9CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgc2IuYXBwZW5kKCIpIik7CisgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgIC8vIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMKKyAgICAgIC8vIGNoZWNrIGZvciBzdWItc3RydWN0IHZhbGlkaXR5CisgICAgICBpZiAoY29uZmlnICE9IG51bGwpIHsKKyAgICAgICAgY29uZmlnLnZhbGlkYXRlKCk7CisgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgdHJ5IHsKKyAgICAgICAgd3JpdGUobmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRDb21wYWN0UHJvdG9jb2wobmV3IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5USU9TdHJlYW1UcmFuc3BvcnQob3V0KSkpOworICAgICAgfSBjYXRjaCAob3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB0ZSkgeworICAgICAgICB0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbih0ZSk7CisgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBpbikgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgdHJ5IHsKKyAgICAgICAgcmVhZChuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbChuZXcgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRJT1N0cmVhbVRyYW5zcG9ydChpbikpKTsKKyAgICAgIH0gY2F0Y2ggKG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24gdGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IGphdmEuaW8uSU9FeGNlcHRpb24odGUpOworICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIHNldExvZ0NvbmZpZ19hcmdzU3RhbmRhcmRTY2hlbWVGYWN0b3J5IGltcGxlbWVudHMgU2NoZW1lRmFjdG9yeSB7CisgICAgICBwdWJsaWMgc2V0TG9nQ29uZmlnX2FyZ3NTdGFuZGFyZFNjaGVtZSBnZXRTY2hlbWUoKSB7CisgICAgICAgIHJldHVybiBuZXcgc2V0TG9nQ29uZmlnX2FyZ3NTdGFuZGFyZFNjaGVtZSgpOworICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIHNldExvZ0NvbmZpZ19hcmdzU3RhbmRhcmRTY2hlbWUgZXh0ZW5kcyBTdGFuZGFyZFNjaGVtZTxzZXRMb2dDb25maWdfYXJncz4geworCisgICAgICBwdWJsaWMgdm9pZCByZWFkKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBpcHJvdCwgc2V0TG9nQ29uZmlnX2FyZ3Mgc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBzY2hlbWVGaWVsZDsKKyAgICAgICAgaXByb3QucmVhZFN0cnVjdEJlZ2luKCk7CisgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICB7CisgICAgICAgICAgc2NoZW1lRmllbGQgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpOworICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUT1ApIHsgCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgc3dpdGNoIChzY2hlbWVGaWVsZC5pZCkgeworICAgICAgICAgICAgY2FzZSAxOiAvLyBOQU1FCisgICAgICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORykgeworICAgICAgICAgICAgICAgIHN0cnVjdC5uYW1lID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICAgICAgICAgIHN0cnVjdC5zZXRfbmFtZV9pc1NldCh0cnVlKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsgCisgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjogLy8gQ09ORklHCisgICAgICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCkgeworICAgICAgICAgICAgICAgIHN0cnVjdC5jb25maWcgPSBuZXcgTG9nQ29uZmlnKCk7CisgICAgICAgICAgICAgICAgc3RydWN0LmNvbmZpZy5yZWFkKGlwcm90KTsKKyAgICAgICAgICAgICAgICBzdHJ1Y3Quc2V0X2NvbmZpZ19pc1NldCh0cnVlKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsgCisgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgc2NoZW1lRmllbGQudHlwZSk7CisgICAgICAgICAgfQorICAgICAgICAgIGlwcm90LnJlYWRGaWVsZEVuZCgpOworICAgICAgICB9CisgICAgICAgIGlwcm90LnJlYWRTdHJ1Y3RFbmQoKTsKKyAgICAgICAgc3RydWN0LnZhbGlkYXRlKCk7CisgICAgICB9CisKKyAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBvcHJvdCwgc2V0TG9nQ29uZmlnX2FyZ3Mgc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICAgIHN0cnVjdC52YWxpZGF0ZSgpOworCisgICAgICAgIG9wcm90LndyaXRlU3RydWN0QmVnaW4oU1RSVUNUX0RFU0MpOworICAgICAgICBpZiAoc3RydWN0Lm5hbWUgIT0gbnVsbCkgeworICAgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihOQU1FX0ZJRUxEX0RFU0MpOworICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKHN0cnVjdC5uYW1lKTsKKyAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cnVjdC5jb25maWcgIT0gbnVsbCkgeworICAgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihDT05GSUdfRklFTERfREVTQyk7CisgICAgICAgICAgc3RydWN0LmNvbmZpZy53cml0ZShvcHJvdCk7CisgICAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgICAgICB9CisgICAgICAgIG9wcm90LndyaXRlRmllbGRTdG9wKCk7CisgICAgICAgIG9wcm90LndyaXRlU3RydWN0RW5kKCk7CisgICAgICB9CisKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBzZXRMb2dDb25maWdfYXJnc1R1cGxlU2NoZW1lRmFjdG9yeSBpbXBsZW1lbnRzIFNjaGVtZUZhY3RvcnkgeworICAgICAgcHVibGljIHNldExvZ0NvbmZpZ19hcmdzVHVwbGVTY2hlbWUgZ2V0U2NoZW1lKCkgeworICAgICAgICByZXR1cm4gbmV3IHNldExvZ0NvbmZpZ19hcmdzVHVwbGVTY2hlbWUoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBzZXRMb2dDb25maWdfYXJnc1R1cGxlU2NoZW1lIGV4dGVuZHMgVHVwbGVTY2hlbWU8c2V0TG9nQ29uZmlnX2FyZ3M+IHsKKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCB3cml0ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgcHJvdCwgc2V0TG9nQ29uZmlnX2FyZ3Mgc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICAgIFRUdXBsZVByb3RvY29sIG9wcm90ID0gKFRUdXBsZVByb3RvY29sKSBwcm90OworICAgICAgICBCaXRTZXQgb3B0aW9uYWxzID0gbmV3IEJpdFNldCgpOworICAgICAgICBpZiAoc3RydWN0LmlzX3NldF9uYW1lKCkpIHsKKyAgICAgICAgICBvcHRpb25hbHMuc2V0KDApOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X2NvbmZpZygpKSB7CisgICAgICAgICAgb3B0aW9uYWxzLnNldCgxKTsKKyAgICAgICAgfQorICAgICAgICBvcHJvdC53cml0ZUJpdFNldChvcHRpb25hbHMsIDIpOworICAgICAgICBpZiAoc3RydWN0LmlzX3NldF9uYW1lKCkpIHsKKyAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhzdHJ1Y3QubmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cnVjdC5pc19zZXRfY29uZmlnKCkpIHsKKyAgICAgICAgICBzdHJ1Y3QuY29uZmlnLndyaXRlKG9wcm90KTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIHJlYWQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIHByb3QsIHNldExvZ0NvbmZpZ19hcmdzIHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgICBUVHVwbGVQcm90b2NvbCBpcHJvdCA9IChUVHVwbGVQcm90b2NvbCkgcHJvdDsKKyAgICAgICAgQml0U2V0IGluY29taW5nID0gaXByb3QucmVhZEJpdFNldCgyKTsKKyAgICAgICAgaWYgKGluY29taW5nLmdldCgwKSkgeworICAgICAgICAgIHN0cnVjdC5uYW1lID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICAgIHN0cnVjdC5zZXRfbmFtZV9pc1NldCh0cnVlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5jb21pbmcuZ2V0KDEpKSB7CisgICAgICAgICAgc3RydWN0LmNvbmZpZyA9IG5ldyBMb2dDb25maWcoKTsKKyAgICAgICAgICBzdHJ1Y3QuY29uZmlnLnJlYWQoaXByb3QpOworICAgICAgICAgIHN0cnVjdC5zZXRfY29uZmlnX2lzU2V0KHRydWUpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgIH0KKworICBwdWJsaWMgc3RhdGljIGNsYXNzIHNldExvZ0NvbmZpZ19yZXN1bHQgaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZTxzZXRMb2dDb25maWdfcmVzdWx0LCBzZXRMb2dDb25maWdfcmVzdWx0Ll9GaWVsZHM+LCBqYXZhLmlvLlNlcmlhbGl6YWJsZSwgQ2xvbmVhYmxlLCBDb21wYXJhYmxlPHNldExvZ0NvbmZpZ19yZXN1bHQ+ICAgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QgU1RSVUNUX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdCgic2V0TG9nQ29uZmlnX3Jlc3VsdCIpOworCisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8Q2xhc3M8PyBleHRlbmRzIElTY2hlbWU+LCBTY2hlbWVGYWN0b3J5PiBzY2hlbWVzID0gbmV3IEhhc2hNYXA8Q2xhc3M8PyBleHRlbmRzIElTY2hlbWU+LCBTY2hlbWVGYWN0b3J5PigpOworICAgIHN0YXRpYyB7CisgICAgICBzY2hlbWVzLnB1dChTdGFuZGFyZFNjaGVtZS5jbGFzcywgbmV3IHNldExvZ0NvbmZpZ19yZXN1bHRTdGFuZGFyZFNjaGVtZUZhY3RvcnkoKSk7CisgICAgICBzY2hlbWVzLnB1dChUdXBsZVNjaGVtZS5jbGFzcywgbmV3IHNldExvZ0NvbmZpZ19yZXN1bHRUdXBsZVNjaGVtZUZhY3RvcnkoKSk7CisgICAgfQorCisKKyAgICAvKiogVGhlIHNldCBvZiBmaWVsZHMgdGhpcyBzdHJ1Y3QgY29udGFpbnMsIGFsb25nIHdpdGggY29udmVuaWVuY2UgbWV0aG9kcyBmb3IgZmluZGluZyBhbmQgbWFuaXB1bGF0aW5nIHRoZW0uICovCisgICAgcHVibGljIGVudW0gX0ZpZWxkcyBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZElkRW51bSB7Cis7CisKKyAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsIF9GaWVsZHM+IGJ5TmFtZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgX0ZpZWxkcz4oKTsKKworICAgICAgc3RhdGljIHsKKyAgICAgICAgZm9yIChfRmllbGRzIGZpZWxkIDogRW51bVNldC5hbGxPZihfRmllbGRzLmNsYXNzKSkgeworICAgICAgICAgIGJ5TmFtZS5wdXQoZmllbGQuZ2V0RmllbGROYW1lKCksIGZpZWxkKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEZpbmQgdGhlIF9GaWVsZHMgY29uc3RhbnQgdGhhdCBtYXRjaGVzIGZpZWxkSWQsIG9yIG51bGwgaWYgaXRzIG5vdCBmb3VuZC4KKyAgICAgICAqLworICAgICAgcHVibGljIHN0YXRpYyBfRmllbGRzIGZpbmRCeVRocmlmdElkKGludCBmaWVsZElkKSB7CisgICAgICAgIHN3aXRjaChmaWVsZElkKSB7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogRmluZCB0aGUgX0ZpZWxkcyBjb25zdGFudCB0aGF0IG1hdGNoZXMgZmllbGRJZCwgdGhyb3dpbmcgYW4gZXhjZXB0aW9uCisgICAgICAgKiBpZiBpdCBpcyBub3QgZm91bmQuCisgICAgICAgKi8KKyAgICAgIHB1YmxpYyBzdGF0aWMgX0ZpZWxkcyBmaW5kQnlUaHJpZnRJZE9yVGhyb3coaW50IGZpZWxkSWQpIHsKKyAgICAgICAgX0ZpZWxkcyBmaWVsZHMgPSBmaW5kQnlUaHJpZnRJZChmaWVsZElkKTsKKyAgICAgICAgaWYgKGZpZWxkcyA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJGaWVsZCAiICsgZmllbGRJZCArICIgZG9lc24ndCBleGlzdCEiKTsKKyAgICAgICAgcmV0dXJuIGZpZWxkczsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBGaW5kIHRoZSBfRmllbGRzIGNvbnN0YW50IHRoYXQgbWF0Y2hlcyBuYW1lLCBvciBudWxsIGlmIGl0cyBub3QgZm91bmQuCisgICAgICAgKi8KKyAgICAgIHB1YmxpYyBzdGF0aWMgX0ZpZWxkcyBmaW5kQnlOYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiBieU5hbWUuZ2V0KG5hbWUpOworICAgICAgfQorCisgICAgICBwcml2YXRlIGZpbmFsIHNob3J0IF90aHJpZnRJZDsKKyAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIF9maWVsZE5hbWU7CisKKyAgICAgIF9GaWVsZHMoc2hvcnQgdGhyaWZ0SWQsIFN0cmluZyBmaWVsZE5hbWUpIHsKKyAgICAgICAgX3RocmlmdElkID0gdGhyaWZ0SWQ7CisgICAgICAgIF9maWVsZE5hbWUgPSBmaWVsZE5hbWU7CisgICAgICB9CisKKyAgICAgIHB1YmxpYyBzaG9ydCBnZXRUaHJpZnRGaWVsZElkKCkgeworICAgICAgICByZXR1cm4gX3RocmlmdElkOworICAgICAgfQorCisgICAgICBwdWJsaWMgU3RyaW5nIGdldEZpZWxkTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIF9maWVsZE5hbWU7CisgICAgICB9CisgICAgfQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPiBtZXRhRGF0YU1hcDsKKyAgICBzdGF0aWMgeworICAgICAgTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPiB0bXBNYXAgPSBuZXcgRW51bU1hcDxfRmllbGRzLCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YT4oX0ZpZWxkcy5jbGFzcyk7CisgICAgICBtZXRhRGF0YU1hcCA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcCh0bXBNYXApOworICAgICAgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEuYWRkU3RydWN0TWV0YURhdGFNYXAoc2V0TG9nQ29uZmlnX3Jlc3VsdC5jbGFzcywgbWV0YURhdGFNYXApOworICAgIH0KKworICAgIHB1YmxpYyBzZXRMb2dDb25maWdfcmVzdWx0KCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFBlcmZvcm1zIGEgZGVlcCBjb3B5IG9uIDxpPm90aGVyPC9pPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc2V0TG9nQ29uZmlnX3Jlc3VsdChzZXRMb2dDb25maWdfcmVzdWx0IG90aGVyKSB7CisgICAgfQorCisgICAgcHVibGljIHNldExvZ0NvbmZpZ19yZXN1bHQgZGVlcENvcHkoKSB7CisgICAgICByZXR1cm4gbmV3IHNldExvZ0NvbmZpZ19yZXN1bHQodGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RmllbGRWYWx1ZShfRmllbGRzIGZpZWxkLCBPYmplY3QgdmFsdWUpIHsKKyAgICAgIHN3aXRjaCAoZmllbGQpIHsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldEZpZWxkVmFsdWUoX0ZpZWxkcyBmaWVsZCkgeworICAgICAgc3dpdGNoIChmaWVsZCkgeworICAgICAgfQorICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgIH0KKworICAgIC8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgY29ycmVzcG9uZGluZyB0byBmaWVsZElEIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLworICAgIHB1YmxpYyBib29sZWFuIGlzU2V0KF9GaWVsZHMgZmllbGQpIHsKKyAgICAgIGlmIChmaWVsZCA9PSBudWxsKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgIH0KKworICAgICAgc3dpdGNoIChmaWVsZCkgeworICAgICAgfQorICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgdGhhdCkgeworICAgICAgaWYgKHRoYXQgPT0gbnVsbCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKHRoYXQgaW5zdGFuY2VvZiBzZXRMb2dDb25maWdfcmVzdWx0KQorICAgICAgICByZXR1cm4gdGhpcy5lcXVhbHMoKHNldExvZ0NvbmZpZ19yZXN1bHQpdGhhdCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKHNldExvZ0NvbmZpZ19yZXN1bHQgdGhhdCkgeworICAgICAgaWYgKHRoYXQgPT0gbnVsbCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgTGlzdDxPYmplY3Q+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKKworICAgICAgcmV0dXJuIGxpc3QuaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyhzZXRMb2dDb25maWdfcmVzdWx0IG90aGVyKSB7CisgICAgICBpZiAoIWdldENsYXNzKCkuZXF1YWxzKG90aGVyLmdldENsYXNzKCkpKSB7CisgICAgICAgIHJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKS5jb21wYXJlVG8ob3RoZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgfQorCisgICAgICBpbnQgbGFzdENvbXBhcmlzb24gPSAwOworCisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgX0ZpZWxkcyBmaWVsZEZvcklkKGludCBmaWVsZElkKSB7CisgICAgICByZXR1cm4gX0ZpZWxkcy5maW5kQnlUaHJpZnRJZChmaWVsZElkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZWFkKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBpcHJvdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgc2NoZW1lcy5nZXQoaXByb3QuZ2V0U2NoZW1lKCkpLmdldFNjaGVtZSgpLnJlYWQoaXByb3QsIHRoaXMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgc2NoZW1lcy5nZXQob3Byb3QuZ2V0U2NoZW1lKCkpLmdldFNjaGVtZSgpLndyaXRlKG9wcm90LCB0aGlzKTsKKyAgICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoInNldExvZ0NvbmZpZ19yZXN1bHQoIik7CisgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKKworICAgICAgc2IuYXBwZW5kKCIpIik7CisgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgIC8vIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMKKyAgICAgIC8vIGNoZWNrIGZvciBzdWItc3RydWN0IHZhbGlkaXR5CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgdHJ5IHsKKyAgICAgICAgd3JpdGUobmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRDb21wYWN0UHJvdG9jb2wobmV3IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5USU9TdHJlYW1UcmFuc3BvcnQob3V0KSkpOworICAgICAgfSBjYXRjaCAob3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB0ZSkgeworICAgICAgICB0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbih0ZSk7CisgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBpbikgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgdHJ5IHsKKyAgICAgICAgcmVhZChuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbChuZXcgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRJT1N0cmVhbVRyYW5zcG9ydChpbikpKTsKKyAgICAgIH0gY2F0Y2ggKG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24gdGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IGphdmEuaW8uSU9FeGNlcHRpb24odGUpOworICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIHNldExvZ0NvbmZpZ19yZXN1bHRTdGFuZGFyZFNjaGVtZUZhY3RvcnkgaW1wbGVtZW50cyBTY2hlbWVGYWN0b3J5IHsKKyAgICAgIHB1YmxpYyBzZXRMb2dDb25maWdfcmVzdWx0U3RhbmRhcmRTY2hlbWUgZ2V0U2NoZW1lKCkgeworICAgICAgICByZXR1cm4gbmV3IHNldExvZ0NvbmZpZ19yZXN1bHRTdGFuZGFyZFNjaGVtZSgpOworICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIHNldExvZ0NvbmZpZ19yZXN1bHRTdGFuZGFyZFNjaGVtZSBleHRlbmRzIFN0YW5kYXJkU2NoZW1lPHNldExvZ0NvbmZpZ19yZXN1bHQ+IHsKKworICAgICAgcHVibGljIHZvaWQgcmVhZChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgaXByb3QsIHNldExvZ0NvbmZpZ19yZXN1bHQgc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBzY2hlbWVGaWVsZDsKKyAgICAgICAgaXByb3QucmVhZFN0cnVjdEJlZ2luKCk7CisgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICB7CisgICAgICAgICAgc2NoZW1lRmllbGQgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpOworICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUT1ApIHsgCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgc3dpdGNoIChzY2hlbWVGaWVsZC5pZCkgeworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKKyAgICAgICAgICB9CisgICAgICAgICAgaXByb3QucmVhZEZpZWxkRW5kKCk7CisgICAgICAgIH0KKyAgICAgICAgaXByb3QucmVhZFN0cnVjdEVuZCgpOworICAgICAgICBzdHJ1Y3QudmFsaWRhdGUoKTsKKyAgICAgIH0KKworICAgICAgcHVibGljIHZvaWQgd3JpdGUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIG9wcm90LCBzZXRMb2dDb25maWdfcmVzdWx0IHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgICBzdHJ1Y3QudmFsaWRhdGUoKTsKKworICAgICAgICBvcHJvdC53cml0ZVN0cnVjdEJlZ2luKFNUUlVDVF9ERVNDKTsKKyAgICAgICAgb3Byb3Qud3JpdGVGaWVsZFN0b3AoKTsKKyAgICAgICAgb3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsKKyAgICAgIH0KKworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIHNldExvZ0NvbmZpZ19yZXN1bHRUdXBsZVNjaGVtZUZhY3RvcnkgaW1wbGVtZW50cyBTY2hlbWVGYWN0b3J5IHsKKyAgICAgIHB1YmxpYyBzZXRMb2dDb25maWdfcmVzdWx0VHVwbGVTY2hlbWUgZ2V0U2NoZW1lKCkgeworICAgICAgICByZXR1cm4gbmV3IHNldExvZ0NvbmZpZ19yZXN1bHRUdXBsZVNjaGVtZSgpOworICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIHNldExvZ0NvbmZpZ19yZXN1bHRUdXBsZVNjaGVtZSBleHRlbmRzIFR1cGxlU2NoZW1lPHNldExvZ0NvbmZpZ19yZXN1bHQ+IHsKKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCB3cml0ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgcHJvdCwgc2V0TG9nQ29uZmlnX3Jlc3VsdCBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgICAgVFR1cGxlUHJvdG9jb2wgb3Byb3QgPSAoVFR1cGxlUHJvdG9jb2wpIHByb3Q7CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgcmVhZChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgcHJvdCwgc2V0TG9nQ29uZmlnX3Jlc3VsdCBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgICAgVFR1cGxlUHJvdG9jb2wgaXByb3QgPSAoVFR1cGxlUHJvdG9jb2wpIHByb3Q7CisgICAgICB9CisgICAgfQorCisgIH0KKworICBwdWJsaWMgc3RhdGljIGNsYXNzIGdldExvZ0NvbmZpZ19hcmdzIGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2U8Z2V0TG9nQ29uZmlnX2FyZ3MsIGdldExvZ0NvbmZpZ19hcmdzLl9GaWVsZHM+LCBqYXZhLmlvLlNlcmlhbGl6YWJsZSwgQ2xvbmVhYmxlLCBDb21wYXJhYmxlPGdldExvZ0NvbmZpZ19hcmdzPiAgIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0IFNUUlVDVF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QoImdldExvZ0NvbmZpZ19hcmdzIik7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgTkFNRV9GSUVMRF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCgibmFtZSIsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORywgKHNob3J0KTEpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPENsYXNzPD8gZXh0ZW5kcyBJU2NoZW1lPiwgU2NoZW1lRmFjdG9yeT4gc2NoZW1lcyA9IG5ldyBIYXNoTWFwPENsYXNzPD8gZXh0ZW5kcyBJU2NoZW1lPiwgU2NoZW1lRmFjdG9yeT4oKTsKKyAgICBzdGF0aWMgeworICAgICAgc2NoZW1lcy5wdXQoU3RhbmRhcmRTY2hlbWUuY2xhc3MsIG5ldyBnZXRMb2dDb25maWdfYXJnc1N0YW5kYXJkU2NoZW1lRmFjdG9yeSgpKTsKKyAgICAgIHNjaGVtZXMucHV0KFR1cGxlU2NoZW1lLmNsYXNzLCBuZXcgZ2V0TG9nQ29uZmlnX2FyZ3NUdXBsZVNjaGVtZUZhY3RvcnkoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsgLy8gcmVxdWlyZWQKKworICAgIC8qKiBUaGUgc2V0IG9mIGZpZWxkcyB0aGlzIHN0cnVjdCBjb250YWlucywgYWxvbmcgd2l0aCBjb252ZW5pZW5jZSBtZXRob2RzIGZvciBmaW5kaW5nIGFuZCBtYW5pcHVsYXRpbmcgdGhlbS4gKi8KKyAgICBwdWJsaWMgZW51bSBfRmllbGRzIGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkSWRFbnVtIHsKKyAgICAgIE5BTUUoKHNob3J0KTEsICJuYW1lIik7CisKKyAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsIF9GaWVsZHM+IGJ5TmFtZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgX0ZpZWxkcz4oKTsKKworICAgICAgc3RhdGljIHsKKyAgICAgICAgZm9yIChfRmllbGRzIGZpZWxkIDogRW51bVNldC5hbGxPZihfRmllbGRzLmNsYXNzKSkgeworICAgICAgICAgIGJ5TmFtZS5wdXQoZmllbGQuZ2V0RmllbGROYW1lKCksIGZpZWxkKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEZpbmQgdGhlIF9GaWVsZHMgY29uc3RhbnQgdGhhdCBtYXRjaGVzIGZpZWxkSWQsIG9yIG51bGwgaWYgaXRzIG5vdCBmb3VuZC4KKyAgICAgICAqLworICAgICAgcHVibGljIHN0YXRpYyBfRmllbGRzIGZpbmRCeVRocmlmdElkKGludCBmaWVsZElkKSB7CisgICAgICAgIHN3aXRjaChmaWVsZElkKSB7CisgICAgICAgICAgY2FzZSAxOiAvLyBOQU1FCisgICAgICAgICAgICByZXR1cm4gTkFNRTsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBGaW5kIHRoZSBfRmllbGRzIGNvbnN0YW50IHRoYXQgbWF0Y2hlcyBmaWVsZElkLCB0aHJvd2luZyBhbiBleGNlcHRpb24KKyAgICAgICAqIGlmIGl0IGlzIG5vdCBmb3VuZC4KKyAgICAgICAqLworICAgICAgcHVibGljIHN0YXRpYyBfRmllbGRzIGZpbmRCeVRocmlmdElkT3JUaHJvdyhpbnQgZmllbGRJZCkgeworICAgICAgICBfRmllbGRzIGZpZWxkcyA9IGZpbmRCeVRocmlmdElkKGZpZWxkSWQpOworICAgICAgICBpZiAoZmllbGRzID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkZpZWxkICIgKyBmaWVsZElkICsgIiBkb2Vzbid0IGV4aXN0ISIpOworICAgICAgICByZXR1cm4gZmllbGRzOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEZpbmQgdGhlIF9GaWVsZHMgY29uc3RhbnQgdGhhdCBtYXRjaGVzIG5hbWUsIG9yIG51bGwgaWYgaXRzIG5vdCBmb3VuZC4KKyAgICAgICAqLworICAgICAgcHVibGljIHN0YXRpYyBfRmllbGRzIGZpbmRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGJ5TmFtZS5nZXQobmFtZSk7CisgICAgICB9CisKKyAgICAgIHByaXZhdGUgZmluYWwgc2hvcnQgX3RocmlmdElkOworICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX2ZpZWxkTmFtZTsKKworICAgICAgX0ZpZWxkcyhzaG9ydCB0aHJpZnRJZCwgU3RyaW5nIGZpZWxkTmFtZSkgeworICAgICAgICBfdGhyaWZ0SWQgPSB0aHJpZnRJZDsKKyAgICAgICAgX2ZpZWxkTmFtZSA9IGZpZWxkTmFtZTsKKyAgICAgIH0KKworICAgICAgcHVibGljIHNob3J0IGdldFRocmlmdEZpZWxkSWQoKSB7CisgICAgICAgIHJldHVybiBfdGhyaWZ0SWQ7CisgICAgICB9CisKKyAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmllbGROYW1lKCkgeworICAgICAgICByZXR1cm4gX2ZpZWxkTmFtZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBpc3NldCBpZCBhc3NpZ25tZW50cworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPiBtZXRhRGF0YU1hcDsKKyAgICBzdGF0aWMgeworICAgICAgTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPiB0bXBNYXAgPSBuZXcgRW51bU1hcDxfRmllbGRzLCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YT4oX0ZpZWxkcy5jbGFzcyk7CisgICAgICB0bXBNYXAucHV0KF9GaWVsZHMuTkFNRSwgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhKCJuYW1lIiwgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLkRFRkFVTFQsIAorICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRWYWx1ZU1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORykpKTsKKyAgICAgIG1ldGFEYXRhTWFwID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKHRtcE1hcCk7CisgICAgICBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YS5hZGRTdHJ1Y3RNZXRhRGF0YU1hcChnZXRMb2dDb25maWdfYXJncy5jbGFzcywgbWV0YURhdGFNYXApOworICAgIH0KKworICAgIHB1YmxpYyBnZXRMb2dDb25maWdfYXJncygpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgZ2V0TG9nQ29uZmlnX2FyZ3MoCisgICAgICBTdHJpbmcgbmFtZSkKKyAgICB7CisgICAgICB0aGlzKCk7CisgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBlcmZvcm1zIGEgZGVlcCBjb3B5IG9uIDxpPm90aGVyPC9pPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgZ2V0TG9nQ29uZmlnX2FyZ3MoZ2V0TG9nQ29uZmlnX2FyZ3Mgb3RoZXIpIHsKKyAgICAgIGlmIChvdGhlci5pc19zZXRfbmFtZSgpKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG90aGVyLm5hbWU7CisgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGdldExvZ0NvbmZpZ19hcmdzIGRlZXBDb3B5KCkgeworICAgICAgcmV0dXJuIG5ldyBnZXRMb2dDb25maWdfYXJncyh0aGlzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgIHRoaXMubmFtZSA9IG51bGw7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRfbmFtZSgpIHsKKyAgICAgIHJldHVybiB0aGlzLm5hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0X25hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdW5zZXRfbmFtZSgpIHsKKyAgICAgIHRoaXMubmFtZSA9IG51bGw7CisgICAgfQorCisgICAgLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBuYW1lIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLworICAgIHB1YmxpYyBib29sZWFuIGlzX3NldF9uYW1lKCkgeworICAgICAgcmV0dXJuIHRoaXMubmFtZSAhPSBudWxsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldF9uYW1lX2lzU2V0KGJvb2xlYW4gdmFsdWUpIHsKKyAgICAgIGlmICghdmFsdWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbnVsbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGaWVsZFZhbHVlKF9GaWVsZHMgZmllbGQsIE9iamVjdCB2YWx1ZSkgeworICAgICAgc3dpdGNoIChmaWVsZCkgeworICAgICAgY2FzZSBOQU1FOgorICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgIHVuc2V0X25hbWUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzZXRfbmFtZSgoU3RyaW5nKXZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0RmllbGRWYWx1ZShfRmllbGRzIGZpZWxkKSB7CisgICAgICBzd2l0Y2ggKGZpZWxkKSB7CisgICAgICBjYXNlIE5BTUU6CisgICAgICAgIHJldHVybiBnZXRfbmFtZSgpOworCisgICAgICB9CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBjb3JyZXNwb25kaW5nIHRvIGZpZWxkSUQgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTZXQoX0ZpZWxkcyBmaWVsZCkgeworICAgICAgaWYgKGZpZWxkID09IG51bGwpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgfQorCisgICAgICBzd2l0Y2ggKGZpZWxkKSB7CisgICAgICBjYXNlIE5BTUU6CisgICAgICAgIHJldHVybiBpc19zZXRfbmFtZSgpOworICAgICAgfQorICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgdGhhdCkgeworICAgICAgaWYgKHRoYXQgPT0gbnVsbCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKHRoYXQgaW5zdGFuY2VvZiBnZXRMb2dDb25maWdfYXJncykKKyAgICAgICAgcmV0dXJuIHRoaXMuZXF1YWxzKChnZXRMb2dDb25maWdfYXJncyl0aGF0KTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZ2V0TG9nQ29uZmlnX2FyZ3MgdGhhdCkgeworICAgICAgaWYgKHRoYXQgPT0gbnVsbCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICBib29sZWFuIHRoaXNfcHJlc2VudF9uYW1lID0gdHJ1ZSAmJiB0aGlzLmlzX3NldF9uYW1lKCk7CisgICAgICBib29sZWFuIHRoYXRfcHJlc2VudF9uYW1lID0gdHJ1ZSAmJiB0aGF0LmlzX3NldF9uYW1lKCk7CisgICAgICBpZiAodGhpc19wcmVzZW50X25hbWUgfHwgdGhhdF9wcmVzZW50X25hbWUpIHsKKyAgICAgICAgaWYgKCEodGhpc19wcmVzZW50X25hbWUgJiYgdGhhdF9wcmVzZW50X25hbWUpKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCF0aGlzLm5hbWUuZXF1YWxzKHRoYXQubmFtZSkpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgTGlzdDxPYmplY3Q+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKKworICAgICAgYm9vbGVhbiBwcmVzZW50X25hbWUgPSB0cnVlICYmIChpc19zZXRfbmFtZSgpKTsKKyAgICAgIGxpc3QuYWRkKHByZXNlbnRfbmFtZSk7CisgICAgICBpZiAocHJlc2VudF9uYW1lKQorICAgICAgICBsaXN0LmFkZChuYW1lKTsKKworICAgICAgcmV0dXJuIGxpc3QuaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyhnZXRMb2dDb25maWdfYXJncyBvdGhlcikgeworICAgICAgaWYgKCFnZXRDbGFzcygpLmVxdWFscyhvdGhlci5nZXRDbGFzcygpKSkgeworICAgICAgICByZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCkuY29tcGFyZVRvKG90aGVyLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgIH0KKworICAgICAgaW50IGxhc3RDb21wYXJpc29uID0gMDsKKworICAgICAgbGFzdENvbXBhcmlzb24gPSBCb29sZWFuLnZhbHVlT2YoaXNfc2V0X25hbWUoKSkuY29tcGFyZVRvKG90aGVyLmlzX3NldF9uYW1lKCkpOworICAgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgICAgfQorICAgICAgaWYgKGlzX3NldF9uYW1lKCkpIHsKKyAgICAgICAgbGFzdENvbXBhcmlzb24gPSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy5uYW1lLCBvdGhlci5uYW1lKTsKKyAgICAgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBfRmllbGRzIGZpZWxkRm9ySWQoaW50IGZpZWxkSWQpIHsKKyAgICAgIHJldHVybiBfRmllbGRzLmZpbmRCeVRocmlmdElkKGZpZWxkSWQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlYWQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIGlwcm90KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICBzY2hlbWVzLmdldChpcHJvdC5nZXRTY2hlbWUoKSkuZ2V0U2NoZW1lKCkucmVhZChpcHJvdCwgdGhpcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIG9wcm90KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICBzY2hlbWVzLmdldChvcHJvdC5nZXRTY2hlbWUoKSkuZ2V0U2NoZW1lKCkud3JpdGUob3Byb3QsIHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoImdldExvZ0NvbmZpZ19hcmdzKCIpOworICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7CisKKyAgICAgIHNiLmFwcGVuZCgibmFtZToiKTsKKyAgICAgIGlmICh0aGlzLm5hbWUgPT0gbnVsbCkgeworICAgICAgICBzYi5hcHBlbmQoIm51bGwiKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNiLmFwcGVuZCh0aGlzLm5hbWUpOworICAgICAgfQorICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIHNiLmFwcGVuZCgiKSIpOworICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmFsaWRhdGUoKSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICAvLyBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzCisgICAgICAvLyBjaGVjayBmb3Igc3ViLXN0cnVjdCB2YWxpZGl0eQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgIHRyeSB7CisgICAgICAgIHdyaXRlKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQ29tcGFjdFByb3RvY29sKG5ldyBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVElPU3RyZWFtVHJhbnNwb3J0KG91dCkpKTsKKyAgICAgIH0gY2F0Y2ggKG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24gdGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IGphdmEuaW8uSU9FeGNlcHRpb24odGUpOworICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0KGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0gaW4pIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgIHRyeSB7CisgICAgICAgIHJlYWQobmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRDb21wYWN0UHJvdG9jb2wobmV3IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5USU9TdHJlYW1UcmFuc3BvcnQoaW4pKSk7CisgICAgICB9IGNhdGNoIChvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHRlKSB7CisgICAgICAgIHRocm93IG5ldyBqYXZhLmlvLklPRXhjZXB0aW9uKHRlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBnZXRMb2dDb25maWdfYXJnc1N0YW5kYXJkU2NoZW1lRmFjdG9yeSBpbXBsZW1lbnRzIFNjaGVtZUZhY3RvcnkgeworICAgICAgcHVibGljIGdldExvZ0NvbmZpZ19hcmdzU3RhbmRhcmRTY2hlbWUgZ2V0U2NoZW1lKCkgeworICAgICAgICByZXR1cm4gbmV3IGdldExvZ0NvbmZpZ19hcmdzU3RhbmRhcmRTY2hlbWUoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBnZXRMb2dDb25maWdfYXJnc1N0YW5kYXJkU2NoZW1lIGV4dGVuZHMgU3RhbmRhcmRTY2hlbWU8Z2V0TG9nQ29uZmlnX2FyZ3M+IHsKKworICAgICAgcHVibGljIHZvaWQgcmVhZChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgaXByb3QsIGdldExvZ0NvbmZpZ19hcmdzIHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgc2NoZW1lRmllbGQ7CisgICAgICAgIGlwcm90LnJlYWRTdHJ1Y3RCZWdpbigpOworICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgeworICAgICAgICAgIHNjaGVtZUZpZWxkID0gaXByb3QucmVhZEZpZWxkQmVnaW4oKTsKKyAgICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVE9QKSB7IAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIHN3aXRjaCAoc2NoZW1lRmllbGQuaWQpIHsKKyAgICAgICAgICAgIGNhc2UgMTogLy8gTkFNRQorICAgICAgICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcpIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QubmFtZSA9IGlwcm90LnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBzdHJ1Y3Quc2V0X25hbWVfaXNTZXQodHJ1ZSk7CisgICAgICAgICAgICAgIH0gZWxzZSB7IAorICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgc2NoZW1lRmllbGQudHlwZSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOworICAgICAgICAgIH0KKyAgICAgICAgICBpcHJvdC5yZWFkRmllbGRFbmQoKTsKKyAgICAgICAgfQorICAgICAgICBpcHJvdC5yZWFkU3RydWN0RW5kKCk7CisgICAgICAgIHN0cnVjdC52YWxpZGF0ZSgpOworICAgICAgfQorCisgICAgICBwdWJsaWMgdm9pZCB3cml0ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgb3Byb3QsIGdldExvZ0NvbmZpZ19hcmdzIHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgICBzdHJ1Y3QudmFsaWRhdGUoKTsKKworICAgICAgICBvcHJvdC53cml0ZVN0cnVjdEJlZ2luKFNUUlVDVF9ERVNDKTsKKyAgICAgICAgaWYgKHN0cnVjdC5uYW1lICE9IG51bGwpIHsKKyAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oTkFNRV9GSUVMRF9ERVNDKTsKKyAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhzdHJ1Y3QubmFtZSk7CisgICAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgICAgICB9CisgICAgICAgIG9wcm90LndyaXRlRmllbGRTdG9wKCk7CisgICAgICAgIG9wcm90LndyaXRlU3RydWN0RW5kKCk7CisgICAgICB9CisKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBnZXRMb2dDb25maWdfYXJnc1R1cGxlU2NoZW1lRmFjdG9yeSBpbXBsZW1lbnRzIFNjaGVtZUZhY3RvcnkgeworICAgICAgcHVibGljIGdldExvZ0NvbmZpZ19hcmdzVHVwbGVTY2hlbWUgZ2V0U2NoZW1lKCkgeworICAgICAgICByZXR1cm4gbmV3IGdldExvZ0NvbmZpZ19hcmdzVHVwbGVTY2hlbWUoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBnZXRMb2dDb25maWdfYXJnc1R1cGxlU2NoZW1lIGV4dGVuZHMgVHVwbGVTY2hlbWU8Z2V0TG9nQ29uZmlnX2FyZ3M+IHsKKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCB3cml0ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgcHJvdCwgZ2V0TG9nQ29uZmlnX2FyZ3Mgc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICAgIFRUdXBsZVByb3RvY29sIG9wcm90ID0gKFRUdXBsZVByb3RvY29sKSBwcm90OworICAgICAgICBCaXRTZXQgb3B0aW9uYWxzID0gbmV3IEJpdFNldCgpOworICAgICAgICBpZiAoc3RydWN0LmlzX3NldF9uYW1lKCkpIHsKKyAgICAgICAgICBvcHRpb25hbHMuc2V0KDApOworICAgICAgICB9CisgICAgICAgIG9wcm90LndyaXRlQml0U2V0KG9wdGlvbmFscywgMSk7CisgICAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X25hbWUoKSkgeworICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKHN0cnVjdC5uYW1lKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIHJlYWQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIHByb3QsIGdldExvZ0NvbmZpZ19hcmdzIHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgICBUVHVwbGVQcm90b2NvbCBpcHJvdCA9IChUVHVwbGVQcm90b2NvbCkgcHJvdDsKKyAgICAgICAgQml0U2V0IGluY29taW5nID0gaXByb3QucmVhZEJpdFNldCgxKTsKKyAgICAgICAgaWYgKGluY29taW5nLmdldCgwKSkgeworICAgICAgICAgIHN0cnVjdC5uYW1lID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICAgIHN0cnVjdC5zZXRfbmFtZV9pc1NldCh0cnVlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICB9CisKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBnZXRMb2dDb25maWdfcmVzdWx0IGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2U8Z2V0TG9nQ29uZmlnX3Jlc3VsdCwgZ2V0TG9nQ29uZmlnX3Jlc3VsdC5fRmllbGRzPiwgamF2YS5pby5TZXJpYWxpemFibGUsIENsb25lYWJsZSwgQ29tcGFyYWJsZTxnZXRMb2dDb25maWdfcmVzdWx0PiAgIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0IFNUUlVDVF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QoImdldExvZ0NvbmZpZ19yZXN1bHQiKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBTVUNDRVNTX0ZJRUxEX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkKCJzdWNjZXNzIiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNULCAoc2hvcnQpMCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8Q2xhc3M8PyBleHRlbmRzIElTY2hlbWU+LCBTY2hlbWVGYWN0b3J5PiBzY2hlbWVzID0gbmV3IEhhc2hNYXA8Q2xhc3M8PyBleHRlbmRzIElTY2hlbWU+LCBTY2hlbWVGYWN0b3J5PigpOworICAgIHN0YXRpYyB7CisgICAgICBzY2hlbWVzLnB1dChTdGFuZGFyZFNjaGVtZS5jbGFzcywgbmV3IGdldExvZ0NvbmZpZ19yZXN1bHRTdGFuZGFyZFNjaGVtZUZhY3RvcnkoKSk7CisgICAgICBzY2hlbWVzLnB1dChUdXBsZVNjaGVtZS5jbGFzcywgbmV3IGdldExvZ0NvbmZpZ19yZXN1bHRUdXBsZVNjaGVtZUZhY3RvcnkoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBMb2dDb25maWcgc3VjY2VzczsgLy8gcmVxdWlyZWQKKworICAgIC8qKiBUaGUgc2V0IG9mIGZpZWxkcyB0aGlzIHN0cnVjdCBjb250YWlucywgYWxvbmcgd2l0aCBjb252ZW5pZW5jZSBtZXRob2RzIGZvciBmaW5kaW5nIGFuZCBtYW5pcHVsYXRpbmcgdGhlbS4gKi8KKyAgICBwdWJsaWMgZW51bSBfRmllbGRzIGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkSWRFbnVtIHsKKyAgICAgIFNVQ0NFU1MoKHNob3J0KTAsICJzdWNjZXNzIik7CisKKyAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsIF9GaWVsZHM+IGJ5TmFtZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgX0ZpZWxkcz4oKTsKKworICAgICAgc3RhdGljIHsKKyAgICAgICAgZm9yIChfRmllbGRzIGZpZWxkIDogRW51bVNldC5hbGxPZihfRmllbGRzLmNsYXNzKSkgeworICAgICAgICAgIGJ5TmFtZS5wdXQoZmllbGQuZ2V0RmllbGROYW1lKCksIGZpZWxkKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEZpbmQgdGhlIF9GaWVsZHMgY29uc3RhbnQgdGhhdCBtYXRjaGVzIGZpZWxkSWQsIG9yIG51bGwgaWYgaXRzIG5vdCBmb3VuZC4KKyAgICAgICAqLworICAgICAgcHVibGljIHN0YXRpYyBfRmllbGRzIGZpbmRCeVRocmlmdElkKGludCBmaWVsZElkKSB7CisgICAgICAgIHN3aXRjaChmaWVsZElkKSB7CisgICAgICAgICAgY2FzZSAwOiAvLyBTVUNDRVNTCisgICAgICAgICAgICByZXR1cm4gU1VDQ0VTUzsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBGaW5kIHRoZSBfRmllbGRzIGNvbnN0YW50IHRoYXQgbWF0Y2hlcyBmaWVsZElkLCB0aHJvd2luZyBhbiBleGNlcHRpb24KKyAgICAgICAqIGlmIGl0IGlzIG5vdCBmb3VuZC4KKyAgICAgICAqLworICAgICAgcHVibGljIHN0YXRpYyBfRmllbGRzIGZpbmRCeVRocmlmdElkT3JUaHJvdyhpbnQgZmllbGRJZCkgeworICAgICAgICBfRmllbGRzIGZpZWxkcyA9IGZpbmRCeVRocmlmdElkKGZpZWxkSWQpOworICAgICAgICBpZiAoZmllbGRzID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkZpZWxkICIgKyBmaWVsZElkICsgIiBkb2Vzbid0IGV4aXN0ISIpOworICAgICAgICByZXR1cm4gZmllbGRzOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEZpbmQgdGhlIF9GaWVsZHMgY29uc3RhbnQgdGhhdCBtYXRjaGVzIG5hbWUsIG9yIG51bGwgaWYgaXRzIG5vdCBmb3VuZC4KKyAgICAgICAqLworICAgICAgcHVibGljIHN0YXRpYyBfRmllbGRzIGZpbmRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGJ5TmFtZS5nZXQobmFtZSk7CisgICAgICB9CisKKyAgICAgIHByaXZhdGUgZmluYWwgc2hvcnQgX3RocmlmdElkOworICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX2ZpZWxkTmFtZTsKKworICAgICAgX0ZpZWxkcyhzaG9ydCB0aHJpZnRJZCwgU3RyaW5nIGZpZWxkTmFtZSkgeworICAgICAgICBfdGhyaWZ0SWQgPSB0aHJpZnRJZDsKKyAgICAgICAgX2ZpZWxkTmFtZSA9IGZpZWxkTmFtZTsKKyAgICAgIH0KKworICAgICAgcHVibGljIHNob3J0IGdldFRocmlmdEZpZWxkSWQoKSB7CisgICAgICAgIHJldHVybiBfdGhyaWZ0SWQ7CisgICAgICB9CisKKyAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmllbGROYW1lKCkgeworICAgICAgICByZXR1cm4gX2ZpZWxkTmFtZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBpc3NldCBpZCBhc3NpZ25tZW50cworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPiBtZXRhRGF0YU1hcDsKKyAgICBzdGF0aWMgeworICAgICAgTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPiB0bXBNYXAgPSBuZXcgRW51bU1hcDxfRmllbGRzLCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YT4oX0ZpZWxkcy5jbGFzcyk7CisgICAgICB0bXBNYXAucHV0KF9GaWVsZHMuU1VDQ0VTUywgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhKCJzdWNjZXNzIiwgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLkRFRkFVTFQsIAorICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuU3RydWN0TWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNULCBMb2dDb25maWcuY2xhc3MpKSk7CisgICAgICBtZXRhRGF0YU1hcCA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcCh0bXBNYXApOworICAgICAgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEuYWRkU3RydWN0TWV0YURhdGFNYXAoZ2V0TG9nQ29uZmlnX3Jlc3VsdC5jbGFzcywgbWV0YURhdGFNYXApOworICAgIH0KKworICAgIHB1YmxpYyBnZXRMb2dDb25maWdfcmVzdWx0KCkgeworICAgIH0KKworICAgIHB1YmxpYyBnZXRMb2dDb25maWdfcmVzdWx0KAorICAgICAgTG9nQ29uZmlnIHN1Y2Nlc3MpCisgICAgeworICAgICAgdGhpcygpOworICAgICAgdGhpcy5zdWNjZXNzID0gc3VjY2VzczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtcyBhIGRlZXAgY29weSBvbiA8aT5vdGhlcjwvaT4uCisgICAgICovCisgICAgcHVibGljIGdldExvZ0NvbmZpZ19yZXN1bHQoZ2V0TG9nQ29uZmlnX3Jlc3VsdCBvdGhlcikgeworICAgICAgaWYgKG90aGVyLmlzX3NldF9zdWNjZXNzKCkpIHsKKyAgICAgICAgdGhpcy5zdWNjZXNzID0gbmV3IExvZ0NvbmZpZyhvdGhlci5zdWNjZXNzKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZ2V0TG9nQ29uZmlnX3Jlc3VsdCBkZWVwQ29weSgpIHsKKyAgICAgIHJldHVybiBuZXcgZ2V0TG9nQ29uZmlnX3Jlc3VsdCh0aGlzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgIHRoaXMuc3VjY2VzcyA9IG51bGw7CisgICAgfQorCisgICAgcHVibGljIExvZ0NvbmZpZyBnZXRfc3VjY2VzcygpIHsKKyAgICAgIHJldHVybiB0aGlzLnN1Y2Nlc3M7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0X3N1Y2Nlc3MoTG9nQ29uZmlnIHN1Y2Nlc3MpIHsKKyAgICAgIHRoaXMuc3VjY2VzcyA9IHN1Y2Nlc3M7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdW5zZXRfc3VjY2VzcygpIHsKKyAgICAgIHRoaXMuc3VjY2VzcyA9IG51bGw7CisgICAgfQorCisgICAgLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBzdWNjZXNzIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLworICAgIHB1YmxpYyBib29sZWFuIGlzX3NldF9zdWNjZXNzKCkgeworICAgICAgcmV0dXJuIHRoaXMuc3VjY2VzcyAhPSBudWxsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldF9zdWNjZXNzX2lzU2V0KGJvb2xlYW4gdmFsdWUpIHsKKyAgICAgIGlmICghdmFsdWUpIHsKKyAgICAgICAgdGhpcy5zdWNjZXNzID0gbnVsbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGaWVsZFZhbHVlKF9GaWVsZHMgZmllbGQsIE9iamVjdCB2YWx1ZSkgeworICAgICAgc3dpdGNoIChmaWVsZCkgeworICAgICAgY2FzZSBTVUNDRVNTOgorICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgIHVuc2V0X3N1Y2Nlc3MoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzZXRfc3VjY2VzcygoTG9nQ29uZmlnKXZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBPYmplY3QgZ2V0RmllbGRWYWx1ZShfRmllbGRzIGZpZWxkKSB7CisgICAgICBzd2l0Y2ggKGZpZWxkKSB7CisgICAgICBjYXNlIFNVQ0NFU1M6CisgICAgICAgIHJldHVybiBnZXRfc3VjY2VzcygpOworCisgICAgICB9CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBjb3JyZXNwb25kaW5nIHRvIGZpZWxkSUQgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTZXQoX0ZpZWxkcyBmaWVsZCkgeworICAgICAgaWYgKGZpZWxkID09IG51bGwpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgfQorCisgICAgICBzd2l0Y2ggKGZpZWxkKSB7CisgICAgICBjYXNlIFNVQ0NFU1M6CisgICAgICAgIHJldHVybiBpc19zZXRfc3VjY2VzcygpOworICAgICAgfQorICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgdGhhdCkgeworICAgICAgaWYgKHRoYXQgPT0gbnVsbCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKHRoYXQgaW5zdGFuY2VvZiBnZXRMb2dDb25maWdfcmVzdWx0KQorICAgICAgICByZXR1cm4gdGhpcy5lcXVhbHMoKGdldExvZ0NvbmZpZ19yZXN1bHQpdGhhdCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKGdldExvZ0NvbmZpZ19yZXN1bHQgdGhhdCkgeworICAgICAgaWYgKHRoYXQgPT0gbnVsbCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICBib29sZWFuIHRoaXNfcHJlc2VudF9zdWNjZXNzID0gdHJ1ZSAmJiB0aGlzLmlzX3NldF9zdWNjZXNzKCk7CisgICAgICBib29sZWFuIHRoYXRfcHJlc2VudF9zdWNjZXNzID0gdHJ1ZSAmJiB0aGF0LmlzX3NldF9zdWNjZXNzKCk7CisgICAgICBpZiAodGhpc19wcmVzZW50X3N1Y2Nlc3MgfHwgdGhhdF9wcmVzZW50X3N1Y2Nlc3MpIHsKKyAgICAgICAgaWYgKCEodGhpc19wcmVzZW50X3N1Y2Nlc3MgJiYgdGhhdF9wcmVzZW50X3N1Y2Nlc3MpKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCF0aGlzLnN1Y2Nlc3MuZXF1YWxzKHRoYXQuc3VjY2VzcykpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgTGlzdDxPYmplY3Q+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKKworICAgICAgYm9vbGVhbiBwcmVzZW50X3N1Y2Nlc3MgPSB0cnVlICYmIChpc19zZXRfc3VjY2VzcygpKTsKKyAgICAgIGxpc3QuYWRkKHByZXNlbnRfc3VjY2Vzcyk7CisgICAgICBpZiAocHJlc2VudF9zdWNjZXNzKQorICAgICAgICBsaXN0LmFkZChzdWNjZXNzKTsKKworICAgICAgcmV0dXJuIGxpc3QuaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyhnZXRMb2dDb25maWdfcmVzdWx0IG90aGVyKSB7CisgICAgICBpZiAoIWdldENsYXNzKCkuZXF1YWxzKG90aGVyLmdldENsYXNzKCkpKSB7CisgICAgICAgIHJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKS5jb21wYXJlVG8ob3RoZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgfQorCisgICAgICBpbnQgbGFzdENvbXBhcmlzb24gPSAwOworCisgICAgICBsYXN0Q29tcGFyaXNvbiA9IEJvb2xlYW4udmFsdWVPZihpc19zZXRfc3VjY2VzcygpKS5jb21wYXJlVG8ob3RoZXIuaXNfc2V0X3N1Y2Nlc3MoKSk7CisgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICB9CisgICAgICBpZiAoaXNfc2V0X3N1Y2Nlc3MoKSkgeworICAgICAgICBsYXN0Q29tcGFyaXNvbiA9IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvbXBhcmVUbyh0aGlzLnN1Y2Nlc3MsIG90aGVyLnN1Y2Nlc3MpOworICAgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIF9GaWVsZHMgZmllbGRGb3JJZChpbnQgZmllbGRJZCkgeworICAgICAgcmV0dXJuIF9GaWVsZHMuZmluZEJ5VGhyaWZ0SWQoZmllbGRJZCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVhZChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgaXByb3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgIHNjaGVtZXMuZ2V0KGlwcm90LmdldFNjaGVtZSgpKS5nZXRTY2hlbWUoKS5yZWFkKGlwcm90LCB0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgb3Byb3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgIHNjaGVtZXMuZ2V0KG9wcm90LmdldFNjaGVtZSgpKS5nZXRTY2hlbWUoKS53cml0ZShvcHJvdCwgdGhpcyk7CisgICAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCJnZXRMb2dDb25maWdfcmVzdWx0KCIpOworICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7CisKKyAgICAgIHNiLmFwcGVuZCgic3VjY2VzczoiKTsKKyAgICAgIGlmICh0aGlzLnN1Y2Nlc3MgPT0gbnVsbCkgeworICAgICAgICBzYi5hcHBlbmQoIm51bGwiKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNiLmFwcGVuZCh0aGlzLnN1Y2Nlc3MpOworICAgICAgfQorICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIHNiLmFwcGVuZCgiKSIpOworICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmFsaWRhdGUoKSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICAvLyBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzCisgICAgICAvLyBjaGVjayBmb3Igc3ViLXN0cnVjdCB2YWxpZGl0eQorICAgICAgaWYgKHN1Y2Nlc3MgIT0gbnVsbCkgeworICAgICAgICBzdWNjZXNzLnZhbGlkYXRlKCk7CisgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgdHJ5IHsKKyAgICAgICAgd3JpdGUobmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRDb21wYWN0UHJvdG9jb2wobmV3IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5USU9TdHJlYW1UcmFuc3BvcnQob3V0KSkpOworICAgICAgfSBjYXRjaCAob3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB0ZSkgeworICAgICAgICB0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbih0ZSk7CisgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBpbikgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgdHJ5IHsKKyAgICAgICAgcmVhZChuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbChuZXcgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRJT1N0cmVhbVRyYW5zcG9ydChpbikpKTsKKyAgICAgIH0gY2F0Y2ggKG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24gdGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IGphdmEuaW8uSU9FeGNlcHRpb24odGUpOworICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIGdldExvZ0NvbmZpZ19yZXN1bHRTdGFuZGFyZFNjaGVtZUZhY3RvcnkgaW1wbGVtZW50cyBTY2hlbWVGYWN0b3J5IHsKKyAgICAgIHB1YmxpYyBnZXRMb2dDb25maWdfcmVzdWx0U3RhbmRhcmRTY2hlbWUgZ2V0U2NoZW1lKCkgeworICAgICAgICByZXR1cm4gbmV3IGdldExvZ0NvbmZpZ19yZXN1bHRTdGFuZGFyZFNjaGVtZSgpOworICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIGdldExvZ0NvbmZpZ19yZXN1bHRTdGFuZGFyZFNjaGVtZSBleHRlbmRzIFN0YW5kYXJkU2NoZW1lPGdldExvZ0NvbmZpZ19yZXN1bHQ+IHsKKworICAgICAgcHVibGljIHZvaWQgcmVhZChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgaXByb3QsIGdldExvZ0NvbmZpZ19yZXN1bHQgc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBzY2hlbWVGaWVsZDsKKyAgICAgICAgaXByb3QucmVhZFN0cnVjdEJlZ2luKCk7CisgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICB7CisgICAgICAgICAgc2NoZW1lRmllbGQgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpOworICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUT1ApIHsgCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgc3dpdGNoIChzY2hlbWVGaWVsZC5pZCkgeworICAgICAgICAgICAgY2FzZSAwOiAvLyBTVUNDRVNTCisgICAgICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCkgeworICAgICAgICAgICAgICAgIHN0cnVjdC5zdWNjZXNzID0gbmV3IExvZ0NvbmZpZygpOworICAgICAgICAgICAgICAgIHN0cnVjdC5zdWNjZXNzLnJlYWQoaXByb3QpOworICAgICAgICAgICAgICAgIHN0cnVjdC5zZXRfc3VjY2Vzc19pc1NldCh0cnVlKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsgCisgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgc2NoZW1lRmllbGQudHlwZSk7CisgICAgICAgICAgfQorICAgICAgICAgIGlwcm90LnJlYWRGaWVsZEVuZCgpOworICAgICAgICB9CisgICAgICAgIGlwcm90LnJlYWRTdHJ1Y3RFbmQoKTsKKyAgICAgICAgc3RydWN0LnZhbGlkYXRlKCk7CisgICAgICB9CisKKyAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBvcHJvdCwgZ2V0TG9nQ29uZmlnX3Jlc3VsdCBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgICAgc3RydWN0LnZhbGlkYXRlKCk7CisKKyAgICAgICAgb3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihTVFJVQ1RfREVTQyk7CisgICAgICAgIGlmIChzdHJ1Y3Quc3VjY2VzcyAhPSBudWxsKSB7CisgICAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKFNVQ0NFU1NfRklFTERfREVTQyk7CisgICAgICAgICAgc3RydWN0LnN1Y2Nlc3Mud3JpdGUob3Byb3QpOworICAgICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICAgICAgfQorICAgICAgICBvcHJvdC53cml0ZUZpZWxkU3RvcCgpOworICAgICAgICBvcHJvdC53cml0ZVN0cnVjdEVuZCgpOworICAgICAgfQorCisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgZ2V0TG9nQ29uZmlnX3Jlc3VsdFR1cGxlU2NoZW1lRmFjdG9yeSBpbXBsZW1lbnRzIFNjaGVtZUZhY3RvcnkgeworICAgICAgcHVibGljIGdldExvZ0NvbmZpZ19yZXN1bHRUdXBsZVNjaGVtZSBnZXRTY2hlbWUoKSB7CisgICAgICAgIHJldHVybiBuZXcgZ2V0TG9nQ29uZmlnX3Jlc3VsdFR1cGxlU2NoZW1lKCk7CisgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgZ2V0TG9nQ29uZmlnX3Jlc3VsdFR1cGxlU2NoZW1lIGV4dGVuZHMgVHVwbGVTY2hlbWU8Z2V0TG9nQ29uZmlnX3Jlc3VsdD4geworCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBwcm90LCBnZXRMb2dDb25maWdfcmVzdWx0IHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgICBUVHVwbGVQcm90b2NvbCBvcHJvdCA9IChUVHVwbGVQcm90b2NvbCkgcHJvdDsKKyAgICAgICAgQml0U2V0IG9wdGlvbmFscyA9IG5ldyBCaXRTZXQoKTsKKyAgICAgICAgaWYgKHN0cnVjdC5pc19zZXRfc3VjY2VzcygpKSB7CisgICAgICAgICAgb3B0aW9uYWxzLnNldCgwKTsKKyAgICAgICAgfQorICAgICAgICBvcHJvdC53cml0ZUJpdFNldChvcHRpb25hbHMsIDEpOworICAgICAgICBpZiAoc3RydWN0LmlzX3NldF9zdWNjZXNzKCkpIHsKKyAgICAgICAgICBzdHJ1Y3Quc3VjY2Vzcy53cml0ZShvcHJvdCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCByZWFkKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBwcm90LCBnZXRMb2dDb25maWdfcmVzdWx0IHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgICBUVHVwbGVQcm90b2NvbCBpcHJvdCA9IChUVHVwbGVQcm90b2NvbCkgcHJvdDsKKyAgICAgICAgQml0U2V0IGluY29taW5nID0gaXByb3QucmVhZEJpdFNldCgxKTsKKyAgICAgICAgaWYgKGluY29taW5nLmdldCgwKSkgeworICAgICAgICAgIHN0cnVjdC5zdWNjZXNzID0gbmV3IExvZ0NvbmZpZygpOworICAgICAgICAgIHN0cnVjdC5zdWNjZXNzLnJlYWQoaXByb3QpOworICAgICAgICAgIHN0cnVjdC5zZXRfc3VjY2Vzc19pc1NldCh0cnVlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICB9CisKICAgcHVibGljIHN0YXRpYyBjbGFzcyBkZWJ1Z19hcmdzIGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2U8ZGVidWdfYXJncywgZGVidWdfYXJncy5fRmllbGRzPiwgamF2YS5pby5TZXJpYWxpemFibGUsIENsb25lYWJsZSwgQ29tcGFyYWJsZTxkZWJ1Z19hcmdzPiAgIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0IFNUUlVDVF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QoImRlYnVnX2FyZ3MiKTsKIApAQCAtMTA3MjAsMTAgKzEzMTY1LDEwIEBACiAgICAgICAgIHJldHVybiBnZXRfY29tcG9uZW50KCk7CiAKICAgICAgIGNhc2UgRU5BQkxFOgotICAgICAgICByZXR1cm4gQm9vbGVhbi52YWx1ZU9mKGlzX2VuYWJsZSgpKTsKKyAgICAgICAgcmV0dXJuIGlzX2VuYWJsZSgpOwogCiAgICAgICBjYXNlIFNBTVBMSU5HX1BFUkNFTlRBR0U6Ci0gICAgICAgIHJldHVybiBEb3VibGUudmFsdWVPZihnZXRfc2FtcGxpbmdQZXJjZW50YWdlKCkpOworICAgICAgICByZXR1cm4gZ2V0X3NhbXBsaW5nUGVyY2VudGFnZSgpOwogCiAgICAgICB9CiAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CkBAIC0xMTU2MCw2ICsxNDAwNSwxNzA5IEBACiAKICAgfQogCisgIHB1YmxpYyBzdGF0aWMgY2xhc3Mgc2V0V29ya2VyUHJvZmlsZXJfYXJncyBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlPHNldFdvcmtlclByb2ZpbGVyX2FyZ3MsIHNldFdvcmtlclByb2ZpbGVyX2FyZ3MuX0ZpZWxkcz4sIGphdmEuaW8uU2VyaWFsaXphYmxlLCBDbG9uZWFibGUsIENvbXBhcmFibGU8c2V0V29ya2VyUHJvZmlsZXJfYXJncz4gICB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdCBTVFJVQ1RfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0KCJzZXRXb3JrZXJQcm9maWxlcl9hcmdzIik7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgSURfRklFTERfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQoImlkIiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCAoc2hvcnQpMSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIFBST0ZJTEVfUkVRVUVTVF9GSUVMRF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCgicHJvZmlsZVJlcXVlc3QiLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIChzaG9ydCkyKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxDbGFzczw/IGV4dGVuZHMgSVNjaGVtZT4sIFNjaGVtZUZhY3Rvcnk+IHNjaGVtZXMgPSBuZXcgSGFzaE1hcDxDbGFzczw/IGV4dGVuZHMgSVNjaGVtZT4sIFNjaGVtZUZhY3Rvcnk+KCk7CisgICAgc3RhdGljIHsKKyAgICAgIHNjaGVtZXMucHV0KFN0YW5kYXJkU2NoZW1lLmNsYXNzLCBuZXcgc2V0V29ya2VyUHJvZmlsZXJfYXJnc1N0YW5kYXJkU2NoZW1lRmFjdG9yeSgpKTsKKyAgICAgIHNjaGVtZXMucHV0KFR1cGxlU2NoZW1lLmNsYXNzLCBuZXcgc2V0V29ya2VyUHJvZmlsZXJfYXJnc1R1cGxlU2NoZW1lRmFjdG9yeSgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBpZDsgLy8gcmVxdWlyZWQKKyAgICBwcml2YXRlIFByb2ZpbGVSZXF1ZXN0IHByb2ZpbGVSZXF1ZXN0OyAvLyByZXF1aXJlZAorCisgICAgLyoqIFRoZSBzZXQgb2YgZmllbGRzIHRoaXMgc3RydWN0IGNvbnRhaW5zLCBhbG9uZyB3aXRoIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9yIGZpbmRpbmcgYW5kIG1hbmlwdWxhdGluZyB0aGVtLiAqLworICAgIHB1YmxpYyBlbnVtIF9GaWVsZHMgaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRJZEVudW0geworICAgICAgSUQoKHNob3J0KTEsICJpZCIpLAorICAgICAgUFJPRklMRV9SRVFVRVNUKChzaG9ydCkyLCAicHJvZmlsZVJlcXVlc3QiKTsKKworICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgX0ZpZWxkcz4gYnlOYW1lID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBfRmllbGRzPigpOworCisgICAgICBzdGF0aWMgeworICAgICAgICBmb3IgKF9GaWVsZHMgZmllbGQgOiBFbnVtU2V0LmFsbE9mKF9GaWVsZHMuY2xhc3MpKSB7CisgICAgICAgICAgYnlOYW1lLnB1dChmaWVsZC5nZXRGaWVsZE5hbWUoKSwgZmllbGQpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogRmluZCB0aGUgX0ZpZWxkcyBjb25zdGFudCB0aGF0IG1hdGNoZXMgZmllbGRJZCwgb3IgbnVsbCBpZiBpdHMgbm90IGZvdW5kLgorICAgICAgICovCisgICAgICBwdWJsaWMgc3RhdGljIF9GaWVsZHMgZmluZEJ5VGhyaWZ0SWQoaW50IGZpZWxkSWQpIHsKKyAgICAgICAgc3dpdGNoKGZpZWxkSWQpIHsKKyAgICAgICAgICBjYXNlIDE6IC8vIElECisgICAgICAgICAgICByZXR1cm4gSUQ7CisgICAgICAgICAgY2FzZSAyOiAvLyBQUk9GSUxFX1JFUVVFU1QKKyAgICAgICAgICAgIHJldHVybiBQUk9GSUxFX1JFUVVFU1Q7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogRmluZCB0aGUgX0ZpZWxkcyBjb25zdGFudCB0aGF0IG1hdGNoZXMgZmllbGRJZCwgdGhyb3dpbmcgYW4gZXhjZXB0aW9uCisgICAgICAgKiBpZiBpdCBpcyBub3QgZm91bmQuCisgICAgICAgKi8KKyAgICAgIHB1YmxpYyBzdGF0aWMgX0ZpZWxkcyBmaW5kQnlUaHJpZnRJZE9yVGhyb3coaW50IGZpZWxkSWQpIHsKKyAgICAgICAgX0ZpZWxkcyBmaWVsZHMgPSBmaW5kQnlUaHJpZnRJZChmaWVsZElkKTsKKyAgICAgICAgaWYgKGZpZWxkcyA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJGaWVsZCAiICsgZmllbGRJZCArICIgZG9lc24ndCBleGlzdCEiKTsKKyAgICAgICAgcmV0dXJuIGZpZWxkczsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBGaW5kIHRoZSBfRmllbGRzIGNvbnN0YW50IHRoYXQgbWF0Y2hlcyBuYW1lLCBvciBudWxsIGlmIGl0cyBub3QgZm91bmQuCisgICAgICAgKi8KKyAgICAgIHB1YmxpYyBzdGF0aWMgX0ZpZWxkcyBmaW5kQnlOYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiBieU5hbWUuZ2V0KG5hbWUpOworICAgICAgfQorCisgICAgICBwcml2YXRlIGZpbmFsIHNob3J0IF90aHJpZnRJZDsKKyAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIF9maWVsZE5hbWU7CisKKyAgICAgIF9GaWVsZHMoc2hvcnQgdGhyaWZ0SWQsIFN0cmluZyBmaWVsZE5hbWUpIHsKKyAgICAgICAgX3RocmlmdElkID0gdGhyaWZ0SWQ7CisgICAgICAgIF9maWVsZE5hbWUgPSBmaWVsZE5hbWU7CisgICAgICB9CisKKyAgICAgIHB1YmxpYyBzaG9ydCBnZXRUaHJpZnRGaWVsZElkKCkgeworICAgICAgICByZXR1cm4gX3RocmlmdElkOworICAgICAgfQorCisgICAgICBwdWJsaWMgU3RyaW5nIGdldEZpZWxkTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIF9maWVsZE5hbWU7CisgICAgICB9CisgICAgfQorCisgICAgLy8gaXNzZXQgaWQgYXNzaWdubWVudHMKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE1hcDxfRmllbGRzLCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YT4gbWV0YURhdGFNYXA7CisgICAgc3RhdGljIHsKKyAgICAgIE1hcDxfRmllbGRzLCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YT4gdG1wTWFwID0gbmV3IEVudW1NYXA8X0ZpZWxkcywgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGE+KF9GaWVsZHMuY2xhc3MpOworICAgICAgdG1wTWFwLnB1dChfRmllbGRzLklELCBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEoImlkIiwgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLkRFRkFVTFQsIAorICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRWYWx1ZU1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORykpKTsKKyAgICAgIHRtcE1hcC5wdXQoX0ZpZWxkcy5QUk9GSUxFX1JFUVVFU1QsIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YSgicHJvZmlsZVJlcXVlc3QiLCBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRSZXF1aXJlbWVudFR5cGUuREVGQVVMVCwgCisgICAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5TdHJ1Y3RNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIFByb2ZpbGVSZXF1ZXN0LmNsYXNzKSkpOworICAgICAgbWV0YURhdGFNYXAgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAodG1wTWFwKTsKKyAgICAgIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhLmFkZFN0cnVjdE1ldGFEYXRhTWFwKHNldFdvcmtlclByb2ZpbGVyX2FyZ3MuY2xhc3MsIG1ldGFEYXRhTWFwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc2V0V29ya2VyUHJvZmlsZXJfYXJncygpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgc2V0V29ya2VyUHJvZmlsZXJfYXJncygKKyAgICAgIFN0cmluZyBpZCwKKyAgICAgIFByb2ZpbGVSZXF1ZXN0IHByb2ZpbGVSZXF1ZXN0KQorICAgIHsKKyAgICAgIHRoaXMoKTsKKyAgICAgIHRoaXMuaWQgPSBpZDsKKyAgICAgIHRoaXMucHJvZmlsZVJlcXVlc3QgPSBwcm9maWxlUmVxdWVzdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtcyBhIGRlZXAgY29weSBvbiA8aT5vdGhlcjwvaT4uCisgICAgICovCisgICAgcHVibGljIHNldFdvcmtlclByb2ZpbGVyX2FyZ3Moc2V0V29ya2VyUHJvZmlsZXJfYXJncyBvdGhlcikgeworICAgICAgaWYgKG90aGVyLmlzX3NldF9pZCgpKSB7CisgICAgICAgIHRoaXMuaWQgPSBvdGhlci5pZDsKKyAgICAgIH0KKyAgICAgIGlmIChvdGhlci5pc19zZXRfcHJvZmlsZVJlcXVlc3QoKSkgeworICAgICAgICB0aGlzLnByb2ZpbGVSZXF1ZXN0ID0gbmV3IFByb2ZpbGVSZXF1ZXN0KG90aGVyLnByb2ZpbGVSZXF1ZXN0KTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc2V0V29ya2VyUHJvZmlsZXJfYXJncyBkZWVwQ29weSgpIHsKKyAgICAgIHJldHVybiBuZXcgc2V0V29ya2VyUHJvZmlsZXJfYXJncyh0aGlzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgIHRoaXMuaWQgPSBudWxsOworICAgICAgdGhpcy5wcm9maWxlUmVxdWVzdCA9IG51bGw7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRfaWQoKSB7CisgICAgICByZXR1cm4gdGhpcy5pZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRfaWQoU3RyaW5nIGlkKSB7CisgICAgICB0aGlzLmlkID0gaWQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdW5zZXRfaWQoKSB7CisgICAgICB0aGlzLmlkID0gbnVsbDsKKyAgICB9CisKKyAgICAvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkIGlkIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLworICAgIHB1YmxpYyBib29sZWFuIGlzX3NldF9pZCgpIHsKKyAgICAgIHJldHVybiB0aGlzLmlkICE9IG51bGw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0X2lkX2lzU2V0KGJvb2xlYW4gdmFsdWUpIHsKKyAgICAgIGlmICghdmFsdWUpIHsKKyAgICAgICAgdGhpcy5pZCA9IG51bGw7CisgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFByb2ZpbGVSZXF1ZXN0IGdldF9wcm9maWxlUmVxdWVzdCgpIHsKKyAgICAgIHJldHVybiB0aGlzLnByb2ZpbGVSZXF1ZXN0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldF9wcm9maWxlUmVxdWVzdChQcm9maWxlUmVxdWVzdCBwcm9maWxlUmVxdWVzdCkgeworICAgICAgdGhpcy5wcm9maWxlUmVxdWVzdCA9IHByb2ZpbGVSZXF1ZXN0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVuc2V0X3Byb2ZpbGVSZXF1ZXN0KCkgeworICAgICAgdGhpcy5wcm9maWxlUmVxdWVzdCA9IG51bGw7CisgICAgfQorCisgICAgLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBwcm9maWxlUmVxdWVzdCBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc19zZXRfcHJvZmlsZVJlcXVlc3QoKSB7CisgICAgICByZXR1cm4gdGhpcy5wcm9maWxlUmVxdWVzdCAhPSBudWxsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldF9wcm9maWxlUmVxdWVzdF9pc1NldChib29sZWFuIHZhbHVlKSB7CisgICAgICBpZiAoIXZhbHVlKSB7CisgICAgICAgIHRoaXMucHJvZmlsZVJlcXVlc3QgPSBudWxsOworICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEZpZWxkVmFsdWUoX0ZpZWxkcyBmaWVsZCwgT2JqZWN0IHZhbHVlKSB7CisgICAgICBzd2l0Y2ggKGZpZWxkKSB7CisgICAgICBjYXNlIElEOgorICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgIHVuc2V0X2lkKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc2V0X2lkKChTdHJpbmcpdmFsdWUpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIFBST0ZJTEVfUkVRVUVTVDoKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICB1bnNldF9wcm9maWxlUmVxdWVzdCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHNldF9wcm9maWxlUmVxdWVzdCgoUHJvZmlsZVJlcXVlc3QpdmFsdWUpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICB9CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRGaWVsZFZhbHVlKF9GaWVsZHMgZmllbGQpIHsKKyAgICAgIHN3aXRjaCAoZmllbGQpIHsKKyAgICAgIGNhc2UgSUQ6CisgICAgICAgIHJldHVybiBnZXRfaWQoKTsKKworICAgICAgY2FzZSBQUk9GSUxFX1JFUVVFU1Q6CisgICAgICAgIHJldHVybiBnZXRfcHJvZmlsZVJlcXVlc3QoKTsKKworICAgICAgfQorICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgIH0KKworICAgIC8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgY29ycmVzcG9uZGluZyB0byBmaWVsZElEIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLworICAgIHB1YmxpYyBib29sZWFuIGlzU2V0KF9GaWVsZHMgZmllbGQpIHsKKyAgICAgIGlmIChmaWVsZCA9PSBudWxsKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgIH0KKworICAgICAgc3dpdGNoIChmaWVsZCkgeworICAgICAgY2FzZSBJRDoKKyAgICAgICAgcmV0dXJuIGlzX3NldF9pZCgpOworICAgICAgY2FzZSBQUk9GSUxFX1JFUVVFU1Q6CisgICAgICAgIHJldHVybiBpc19zZXRfcHJvZmlsZVJlcXVlc3QoKTsKKyAgICAgIH0KKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IHRoYXQpIHsKKyAgICAgIGlmICh0aGF0ID09IG51bGwpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGlmICh0aGF0IGluc3RhbmNlb2Ygc2V0V29ya2VyUHJvZmlsZXJfYXJncykKKyAgICAgICAgcmV0dXJuIHRoaXMuZXF1YWxzKChzZXRXb3JrZXJQcm9maWxlcl9hcmdzKXRoYXQpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhzZXRXb3JrZXJQcm9maWxlcl9hcmdzIHRoYXQpIHsKKyAgICAgIGlmICh0aGF0ID09IG51bGwpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgYm9vbGVhbiB0aGlzX3ByZXNlbnRfaWQgPSB0cnVlICYmIHRoaXMuaXNfc2V0X2lkKCk7CisgICAgICBib29sZWFuIHRoYXRfcHJlc2VudF9pZCA9IHRydWUgJiYgdGhhdC5pc19zZXRfaWQoKTsKKyAgICAgIGlmICh0aGlzX3ByZXNlbnRfaWQgfHwgdGhhdF9wcmVzZW50X2lkKSB7CisgICAgICAgIGlmICghKHRoaXNfcHJlc2VudF9pZCAmJiB0aGF0X3ByZXNlbnRfaWQpKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCF0aGlzLmlkLmVxdWFscyh0aGF0LmlkKSkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIGJvb2xlYW4gdGhpc19wcmVzZW50X3Byb2ZpbGVSZXF1ZXN0ID0gdHJ1ZSAmJiB0aGlzLmlzX3NldF9wcm9maWxlUmVxdWVzdCgpOworICAgICAgYm9vbGVhbiB0aGF0X3ByZXNlbnRfcHJvZmlsZVJlcXVlc3QgPSB0cnVlICYmIHRoYXQuaXNfc2V0X3Byb2ZpbGVSZXF1ZXN0KCk7CisgICAgICBpZiAodGhpc19wcmVzZW50X3Byb2ZpbGVSZXF1ZXN0IHx8IHRoYXRfcHJlc2VudF9wcm9maWxlUmVxdWVzdCkgeworICAgICAgICBpZiAoISh0aGlzX3ByZXNlbnRfcHJvZmlsZVJlcXVlc3QgJiYgdGhhdF9wcmVzZW50X3Byb2ZpbGVSZXF1ZXN0KSkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghdGhpcy5wcm9maWxlUmVxdWVzdC5lcXVhbHModGhhdC5wcm9maWxlUmVxdWVzdCkpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgTGlzdDxPYmplY3Q+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKKworICAgICAgYm9vbGVhbiBwcmVzZW50X2lkID0gdHJ1ZSAmJiAoaXNfc2V0X2lkKCkpOworICAgICAgbGlzdC5hZGQocHJlc2VudF9pZCk7CisgICAgICBpZiAocHJlc2VudF9pZCkKKyAgICAgICAgbGlzdC5hZGQoaWQpOworCisgICAgICBib29sZWFuIHByZXNlbnRfcHJvZmlsZVJlcXVlc3QgPSB0cnVlICYmIChpc19zZXRfcHJvZmlsZVJlcXVlc3QoKSk7CisgICAgICBsaXN0LmFkZChwcmVzZW50X3Byb2ZpbGVSZXF1ZXN0KTsKKyAgICAgIGlmIChwcmVzZW50X3Byb2ZpbGVSZXF1ZXN0KQorICAgICAgICBsaXN0LmFkZChwcm9maWxlUmVxdWVzdCk7CisKKyAgICAgIHJldHVybiBsaXN0Lmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBjb21wYXJlVG8oc2V0V29ya2VyUHJvZmlsZXJfYXJncyBvdGhlcikgeworICAgICAgaWYgKCFnZXRDbGFzcygpLmVxdWFscyhvdGhlci5nZXRDbGFzcygpKSkgeworICAgICAgICByZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCkuY29tcGFyZVRvKG90aGVyLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgIH0KKworICAgICAgaW50IGxhc3RDb21wYXJpc29uID0gMDsKKworICAgICAgbGFzdENvbXBhcmlzb24gPSBCb29sZWFuLnZhbHVlT2YoaXNfc2V0X2lkKCkpLmNvbXBhcmVUbyhvdGhlci5pc19zZXRfaWQoKSk7CisgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICB9CisgICAgICBpZiAoaXNfc2V0X2lkKCkpIHsKKyAgICAgICAgbGFzdENvbXBhcmlzb24gPSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy5pZCwgb3RoZXIuaWQpOworICAgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgbGFzdENvbXBhcmlzb24gPSBCb29sZWFuLnZhbHVlT2YoaXNfc2V0X3Byb2ZpbGVSZXF1ZXN0KCkpLmNvbXBhcmVUbyhvdGhlci5pc19zZXRfcHJvZmlsZVJlcXVlc3QoKSk7CisgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICB9CisgICAgICBpZiAoaXNfc2V0X3Byb2ZpbGVSZXF1ZXN0KCkpIHsKKyAgICAgICAgbGFzdENvbXBhcmlzb24gPSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy5wcm9maWxlUmVxdWVzdCwgb3RoZXIucHJvZmlsZVJlcXVlc3QpOworICAgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIF9GaWVsZHMgZmllbGRGb3JJZChpbnQgZmllbGRJZCkgeworICAgICAgcmV0dXJuIF9GaWVsZHMuZmluZEJ5VGhyaWZ0SWQoZmllbGRJZCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVhZChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgaXByb3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgIHNjaGVtZXMuZ2V0KGlwcm90LmdldFNjaGVtZSgpKS5nZXRTY2hlbWUoKS5yZWFkKGlwcm90LCB0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgb3Byb3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgIHNjaGVtZXMuZ2V0KG9wcm90LmdldFNjaGVtZSgpKS5nZXRTY2hlbWUoKS53cml0ZShvcHJvdCwgdGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigic2V0V29ya2VyUHJvZmlsZXJfYXJncygiKTsKKyAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOworCisgICAgICBzYi5hcHBlbmQoImlkOiIpOworICAgICAgaWYgKHRoaXMuaWQgPT0gbnVsbCkgeworICAgICAgICBzYi5hcHBlbmQoIm51bGwiKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNiLmFwcGVuZCh0aGlzLmlkKTsKKyAgICAgIH0KKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICBpZiAoIWZpcnN0KSBzYi5hcHBlbmQoIiwgIik7CisgICAgICBzYi5hcHBlbmQoInByb2ZpbGVSZXF1ZXN0OiIpOworICAgICAgaWYgKHRoaXMucHJvZmlsZVJlcXVlc3QgPT0gbnVsbCkgeworICAgICAgICBzYi5hcHBlbmQoIm51bGwiKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNiLmFwcGVuZCh0aGlzLnByb2ZpbGVSZXF1ZXN0KTsKKyAgICAgIH0KKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICBzYi5hcHBlbmQoIikiKTsKKyAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgLy8gY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcworICAgICAgLy8gY2hlY2sgZm9yIHN1Yi1zdHJ1Y3QgdmFsaWRpdHkKKyAgICAgIGlmIChwcm9maWxlUmVxdWVzdCAhPSBudWxsKSB7CisgICAgICAgIHByb2ZpbGVSZXF1ZXN0LnZhbGlkYXRlKCk7CisgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgdHJ5IHsKKyAgICAgICAgd3JpdGUobmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRDb21wYWN0UHJvdG9jb2wobmV3IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5USU9TdHJlYW1UcmFuc3BvcnQob3V0KSkpOworICAgICAgfSBjYXRjaCAob3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB0ZSkgeworICAgICAgICB0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbih0ZSk7CisgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBpbikgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgdHJ5IHsKKyAgICAgICAgcmVhZChuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbChuZXcgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRJT1N0cmVhbVRyYW5zcG9ydChpbikpKTsKKyAgICAgIH0gY2F0Y2ggKG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24gdGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IGphdmEuaW8uSU9FeGNlcHRpb24odGUpOworICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIHNldFdvcmtlclByb2ZpbGVyX2FyZ3NTdGFuZGFyZFNjaGVtZUZhY3RvcnkgaW1wbGVtZW50cyBTY2hlbWVGYWN0b3J5IHsKKyAgICAgIHB1YmxpYyBzZXRXb3JrZXJQcm9maWxlcl9hcmdzU3RhbmRhcmRTY2hlbWUgZ2V0U2NoZW1lKCkgeworICAgICAgICByZXR1cm4gbmV3IHNldFdvcmtlclByb2ZpbGVyX2FyZ3NTdGFuZGFyZFNjaGVtZSgpOworICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIHNldFdvcmtlclByb2ZpbGVyX2FyZ3NTdGFuZGFyZFNjaGVtZSBleHRlbmRzIFN0YW5kYXJkU2NoZW1lPHNldFdvcmtlclByb2ZpbGVyX2FyZ3M+IHsKKworICAgICAgcHVibGljIHZvaWQgcmVhZChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgaXByb3QsIHNldFdvcmtlclByb2ZpbGVyX2FyZ3Mgc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBzY2hlbWVGaWVsZDsKKyAgICAgICAgaXByb3QucmVhZFN0cnVjdEJlZ2luKCk7CisgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICB7CisgICAgICAgICAgc2NoZW1lRmllbGQgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpOworICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUT1ApIHsgCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgc3dpdGNoIChzY2hlbWVGaWVsZC5pZCkgeworICAgICAgICAgICAgY2FzZSAxOiAvLyBJRAorICAgICAgICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcpIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QuaWQgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgc3RydWN0LnNldF9pZF9pc1NldCh0cnVlKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsgCisgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjogLy8gUFJPRklMRV9SRVFVRVNUCisgICAgICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCkgeworICAgICAgICAgICAgICAgIHN0cnVjdC5wcm9maWxlUmVxdWVzdCA9IG5ldyBQcm9maWxlUmVxdWVzdCgpOworICAgICAgICAgICAgICAgIHN0cnVjdC5wcm9maWxlUmVxdWVzdC5yZWFkKGlwcm90KTsKKyAgICAgICAgICAgICAgICBzdHJ1Y3Quc2V0X3Byb2ZpbGVSZXF1ZXN0X2lzU2V0KHRydWUpOworICAgICAgICAgICAgICB9IGVsc2UgeyAKKyAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKKyAgICAgICAgICB9CisgICAgICAgICAgaXByb3QucmVhZEZpZWxkRW5kKCk7CisgICAgICAgIH0KKyAgICAgICAgaXByb3QucmVhZFN0cnVjdEVuZCgpOworICAgICAgICBzdHJ1Y3QudmFsaWRhdGUoKTsKKyAgICAgIH0KKworICAgICAgcHVibGljIHZvaWQgd3JpdGUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIG9wcm90LCBzZXRXb3JrZXJQcm9maWxlcl9hcmdzIHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgICBzdHJ1Y3QudmFsaWRhdGUoKTsKKworICAgICAgICBvcHJvdC53cml0ZVN0cnVjdEJlZ2luKFNUUlVDVF9ERVNDKTsKKyAgICAgICAgaWYgKHN0cnVjdC5pZCAhPSBudWxsKSB7CisgICAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKElEX0ZJRUxEX0RFU0MpOworICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKHN0cnVjdC5pZCk7CisgICAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJ1Y3QucHJvZmlsZVJlcXVlc3QgIT0gbnVsbCkgeworICAgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihQUk9GSUxFX1JFUVVFU1RfRklFTERfREVTQyk7CisgICAgICAgICAgc3RydWN0LnByb2ZpbGVSZXF1ZXN0LndyaXRlKG9wcm90KTsKKyAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgICAgIH0KKyAgICAgICAgb3Byb3Qud3JpdGVGaWVsZFN0b3AoKTsKKyAgICAgICAgb3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsKKyAgICAgIH0KKworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIHNldFdvcmtlclByb2ZpbGVyX2FyZ3NUdXBsZVNjaGVtZUZhY3RvcnkgaW1wbGVtZW50cyBTY2hlbWVGYWN0b3J5IHsKKyAgICAgIHB1YmxpYyBzZXRXb3JrZXJQcm9maWxlcl9hcmdzVHVwbGVTY2hlbWUgZ2V0U2NoZW1lKCkgeworICAgICAgICByZXR1cm4gbmV3IHNldFdvcmtlclByb2ZpbGVyX2FyZ3NUdXBsZVNjaGVtZSgpOworICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIHNldFdvcmtlclByb2ZpbGVyX2FyZ3NUdXBsZVNjaGVtZSBleHRlbmRzIFR1cGxlU2NoZW1lPHNldFdvcmtlclByb2ZpbGVyX2FyZ3M+IHsKKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCB3cml0ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgcHJvdCwgc2V0V29ya2VyUHJvZmlsZXJfYXJncyBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgICAgVFR1cGxlUHJvdG9jb2wgb3Byb3QgPSAoVFR1cGxlUHJvdG9jb2wpIHByb3Q7CisgICAgICAgIEJpdFNldCBvcHRpb25hbHMgPSBuZXcgQml0U2V0KCk7CisgICAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X2lkKCkpIHsKKyAgICAgICAgICBvcHRpb25hbHMuc2V0KDApOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X3Byb2ZpbGVSZXF1ZXN0KCkpIHsKKyAgICAgICAgICBvcHRpb25hbHMuc2V0KDEpOworICAgICAgICB9CisgICAgICAgIG9wcm90LndyaXRlQml0U2V0KG9wdGlvbmFscywgMik7CisgICAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X2lkKCkpIHsKKyAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhzdHJ1Y3QuaWQpOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X3Byb2ZpbGVSZXF1ZXN0KCkpIHsKKyAgICAgICAgICBzdHJ1Y3QucHJvZmlsZVJlcXVlc3Qud3JpdGUob3Byb3QpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgcmVhZChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgcHJvdCwgc2V0V29ya2VyUHJvZmlsZXJfYXJncyBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgICAgVFR1cGxlUHJvdG9jb2wgaXByb3QgPSAoVFR1cGxlUHJvdG9jb2wpIHByb3Q7CisgICAgICAgIEJpdFNldCBpbmNvbWluZyA9IGlwcm90LnJlYWRCaXRTZXQoMik7CisgICAgICAgIGlmIChpbmNvbWluZy5nZXQoMCkpIHsKKyAgICAgICAgICBzdHJ1Y3QuaWQgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgc3RydWN0LnNldF9pZF9pc1NldCh0cnVlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5jb21pbmcuZ2V0KDEpKSB7CisgICAgICAgICAgc3RydWN0LnByb2ZpbGVSZXF1ZXN0ID0gbmV3IFByb2ZpbGVSZXF1ZXN0KCk7CisgICAgICAgICAgc3RydWN0LnByb2ZpbGVSZXF1ZXN0LnJlYWQoaXByb3QpOworICAgICAgICAgIHN0cnVjdC5zZXRfcHJvZmlsZVJlcXVlc3RfaXNTZXQodHJ1ZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgY2xhc3Mgc2V0V29ya2VyUHJvZmlsZXJfcmVzdWx0IGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2U8c2V0V29ya2VyUHJvZmlsZXJfcmVzdWx0LCBzZXRXb3JrZXJQcm9maWxlcl9yZXN1bHQuX0ZpZWxkcz4sIGphdmEuaW8uU2VyaWFsaXphYmxlLCBDbG9uZWFibGUsIENvbXBhcmFibGU8c2V0V29ya2VyUHJvZmlsZXJfcmVzdWx0PiAgIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0IFNUUlVDVF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QoInNldFdvcmtlclByb2ZpbGVyX3Jlc3VsdCIpOworCisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8Q2xhc3M8PyBleHRlbmRzIElTY2hlbWU+LCBTY2hlbWVGYWN0b3J5PiBzY2hlbWVzID0gbmV3IEhhc2hNYXA8Q2xhc3M8PyBleHRlbmRzIElTY2hlbWU+LCBTY2hlbWVGYWN0b3J5PigpOworICAgIHN0YXRpYyB7CisgICAgICBzY2hlbWVzLnB1dChTdGFuZGFyZFNjaGVtZS5jbGFzcywgbmV3IHNldFdvcmtlclByb2ZpbGVyX3Jlc3VsdFN0YW5kYXJkU2NoZW1lRmFjdG9yeSgpKTsKKyAgICAgIHNjaGVtZXMucHV0KFR1cGxlU2NoZW1lLmNsYXNzLCBuZXcgc2V0V29ya2VyUHJvZmlsZXJfcmVzdWx0VHVwbGVTY2hlbWVGYWN0b3J5KCkpOworICAgIH0KKworCisgICAgLyoqIFRoZSBzZXQgb2YgZmllbGRzIHRoaXMgc3RydWN0IGNvbnRhaW5zLCBhbG9uZyB3aXRoIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9yIGZpbmRpbmcgYW5kIG1hbmlwdWxhdGluZyB0aGVtLiAqLworICAgIHB1YmxpYyBlbnVtIF9GaWVsZHMgaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRJZEVudW0geworOworCisgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBfRmllbGRzPiBieU5hbWUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIF9GaWVsZHM+KCk7CisKKyAgICAgIHN0YXRpYyB7CisgICAgICAgIGZvciAoX0ZpZWxkcyBmaWVsZCA6IEVudW1TZXQuYWxsT2YoX0ZpZWxkcy5jbGFzcykpIHsKKyAgICAgICAgICBieU5hbWUucHV0KGZpZWxkLmdldEZpZWxkTmFtZSgpLCBmaWVsZCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBGaW5kIHRoZSBfRmllbGRzIGNvbnN0YW50IHRoYXQgbWF0Y2hlcyBmaWVsZElkLCBvciBudWxsIGlmIGl0cyBub3QgZm91bmQuCisgICAgICAgKi8KKyAgICAgIHB1YmxpYyBzdGF0aWMgX0ZpZWxkcyBmaW5kQnlUaHJpZnRJZChpbnQgZmllbGRJZCkgeworICAgICAgICBzd2l0Y2goZmllbGRJZCkgeworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEZpbmQgdGhlIF9GaWVsZHMgY29uc3RhbnQgdGhhdCBtYXRjaGVzIGZpZWxkSWQsIHRocm93aW5nIGFuIGV4Y2VwdGlvbgorICAgICAgICogaWYgaXQgaXMgbm90IGZvdW5kLgorICAgICAgICovCisgICAgICBwdWJsaWMgc3RhdGljIF9GaWVsZHMgZmluZEJ5VGhyaWZ0SWRPclRocm93KGludCBmaWVsZElkKSB7CisgICAgICAgIF9GaWVsZHMgZmllbGRzID0gZmluZEJ5VGhyaWZ0SWQoZmllbGRJZCk7CisgICAgICAgIGlmIChmaWVsZHMgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRmllbGQgIiArIGZpZWxkSWQgKyAiIGRvZXNuJ3QgZXhpc3QhIik7CisgICAgICAgIHJldHVybiBmaWVsZHM7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogRmluZCB0aGUgX0ZpZWxkcyBjb25zdGFudCB0aGF0IG1hdGNoZXMgbmFtZSwgb3IgbnVsbCBpZiBpdHMgbm90IGZvdW5kLgorICAgICAgICovCisgICAgICBwdWJsaWMgc3RhdGljIF9GaWVsZHMgZmluZEJ5TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gYnlOYW1lLmdldChuYW1lKTsKKyAgICAgIH0KKworICAgICAgcHJpdmF0ZSBmaW5hbCBzaG9ydCBfdGhyaWZ0SWQ7CisgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBfZmllbGROYW1lOworCisgICAgICBfRmllbGRzKHNob3J0IHRocmlmdElkLCBTdHJpbmcgZmllbGROYW1lKSB7CisgICAgICAgIF90aHJpZnRJZCA9IHRocmlmdElkOworICAgICAgICBfZmllbGROYW1lID0gZmllbGROYW1lOworICAgICAgfQorCisgICAgICBwdWJsaWMgc2hvcnQgZ2V0VGhyaWZ0RmllbGRJZCgpIHsKKyAgICAgICAgcmV0dXJuIF90aHJpZnRJZDsKKyAgICAgIH0KKworICAgICAgcHVibGljIFN0cmluZyBnZXRGaWVsZE5hbWUoKSB7CisgICAgICAgIHJldHVybiBfZmllbGROYW1lOworICAgICAgfQorICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE1hcDxfRmllbGRzLCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YT4gbWV0YURhdGFNYXA7CisgICAgc3RhdGljIHsKKyAgICAgIE1hcDxfRmllbGRzLCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YT4gdG1wTWFwID0gbmV3IEVudW1NYXA8X0ZpZWxkcywgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGE+KF9GaWVsZHMuY2xhc3MpOworICAgICAgbWV0YURhdGFNYXAgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAodG1wTWFwKTsKKyAgICAgIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhLmFkZFN0cnVjdE1ldGFEYXRhTWFwKHNldFdvcmtlclByb2ZpbGVyX3Jlc3VsdC5jbGFzcywgbWV0YURhdGFNYXApOworICAgIH0KKworICAgIHB1YmxpYyBzZXRXb3JrZXJQcm9maWxlcl9yZXN1bHQoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGVyZm9ybXMgYSBkZWVwIGNvcHkgb24gPGk+b3RoZXI8L2k+LgorICAgICAqLworICAgIHB1YmxpYyBzZXRXb3JrZXJQcm9maWxlcl9yZXN1bHQoc2V0V29ya2VyUHJvZmlsZXJfcmVzdWx0IG90aGVyKSB7CisgICAgfQorCisgICAgcHVibGljIHNldFdvcmtlclByb2ZpbGVyX3Jlc3VsdCBkZWVwQ29weSgpIHsKKyAgICAgIHJldHVybiBuZXcgc2V0V29ya2VyUHJvZmlsZXJfcmVzdWx0KHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEZpZWxkVmFsdWUoX0ZpZWxkcyBmaWVsZCwgT2JqZWN0IHZhbHVlKSB7CisgICAgICBzd2l0Y2ggKGZpZWxkKSB7CisgICAgICB9CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRGaWVsZFZhbHVlKF9GaWVsZHMgZmllbGQpIHsKKyAgICAgIHN3aXRjaCAoZmllbGQpIHsKKyAgICAgIH0KKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICAvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkIGNvcnJlc3BvbmRpbmcgdG8gZmllbGRJRCBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NldChfRmllbGRzIGZpZWxkKSB7CisgICAgICBpZiAoZmllbGQgPT0gbnVsbCkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICB9CisKKyAgICAgIHN3aXRjaCAoZmllbGQpIHsKKyAgICAgIH0KKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IHRoYXQpIHsKKyAgICAgIGlmICh0aGF0ID09IG51bGwpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGlmICh0aGF0IGluc3RhbmNlb2Ygc2V0V29ya2VyUHJvZmlsZXJfcmVzdWx0KQorICAgICAgICByZXR1cm4gdGhpcy5lcXVhbHMoKHNldFdvcmtlclByb2ZpbGVyX3Jlc3VsdCl0aGF0KTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoc2V0V29ya2VyUHJvZmlsZXJfcmVzdWx0IHRoYXQpIHsKKyAgICAgIGlmICh0aGF0ID09IG51bGwpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgIExpc3Q8T2JqZWN0PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7CisKKyAgICAgIHJldHVybiBsaXN0Lmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBjb21wYXJlVG8oc2V0V29ya2VyUHJvZmlsZXJfcmVzdWx0IG90aGVyKSB7CisgICAgICBpZiAoIWdldENsYXNzKCkuZXF1YWxzKG90aGVyLmdldENsYXNzKCkpKSB7CisgICAgICAgIHJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKS5jb21wYXJlVG8ob3RoZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgfQorCisgICAgICBpbnQgbGFzdENvbXBhcmlzb24gPSAwOworCisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgX0ZpZWxkcyBmaWVsZEZvcklkKGludCBmaWVsZElkKSB7CisgICAgICByZXR1cm4gX0ZpZWxkcy5maW5kQnlUaHJpZnRJZChmaWVsZElkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZWFkKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBpcHJvdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgc2NoZW1lcy5nZXQoaXByb3QuZ2V0U2NoZW1lKCkpLmdldFNjaGVtZSgpLnJlYWQoaXByb3QsIHRoaXMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgc2NoZW1lcy5nZXQob3Byb3QuZ2V0U2NoZW1lKCkpLmdldFNjaGVtZSgpLndyaXRlKG9wcm90LCB0aGlzKTsKKyAgICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoInNldFdvcmtlclByb2ZpbGVyX3Jlc3VsdCgiKTsKKyAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOworCisgICAgICBzYi5hcHBlbmQoIikiKTsKKyAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgLy8gY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcworICAgICAgLy8gY2hlY2sgZm9yIHN1Yi1zdHJ1Y3QgdmFsaWRpdHkKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICB0cnkgeworICAgICAgICB3cml0ZShuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbChuZXcgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRJT1N0cmVhbVRyYW5zcG9ydChvdXQpKSk7CisgICAgICB9IGNhdGNoIChvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHRlKSB7CisgICAgICAgIHRocm93IG5ldyBqYXZhLmlvLklPRXhjZXB0aW9uKHRlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVhZE9iamVjdChqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtIGluKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICB0cnkgeworICAgICAgICByZWFkKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQ29tcGFjdFByb3RvY29sKG5ldyBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVElPU3RyZWFtVHJhbnNwb3J0KGluKSkpOworICAgICAgfSBjYXRjaCAob3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB0ZSkgeworICAgICAgICB0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbih0ZSk7CisgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3Mgc2V0V29ya2VyUHJvZmlsZXJfcmVzdWx0U3RhbmRhcmRTY2hlbWVGYWN0b3J5IGltcGxlbWVudHMgU2NoZW1lRmFjdG9yeSB7CisgICAgICBwdWJsaWMgc2V0V29ya2VyUHJvZmlsZXJfcmVzdWx0U3RhbmRhcmRTY2hlbWUgZ2V0U2NoZW1lKCkgeworICAgICAgICByZXR1cm4gbmV3IHNldFdvcmtlclByb2ZpbGVyX3Jlc3VsdFN0YW5kYXJkU2NoZW1lKCk7CisgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3Mgc2V0V29ya2VyUHJvZmlsZXJfcmVzdWx0U3RhbmRhcmRTY2hlbWUgZXh0ZW5kcyBTdGFuZGFyZFNjaGVtZTxzZXRXb3JrZXJQcm9maWxlcl9yZXN1bHQ+IHsKKworICAgICAgcHVibGljIHZvaWQgcmVhZChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgaXByb3QsIHNldFdvcmtlclByb2ZpbGVyX3Jlc3VsdCBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIHNjaGVtZUZpZWxkOworICAgICAgICBpcHJvdC5yZWFkU3RydWN0QmVnaW4oKTsKKyAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgIHsKKyAgICAgICAgICBzY2hlbWVGaWVsZCA9IGlwcm90LnJlYWRGaWVsZEJlZ2luKCk7CisgICAgICAgICAgaWYgKHNjaGVtZUZpZWxkLnR5cGUgPT0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RPUCkgeyAKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBzd2l0Y2ggKHNjaGVtZUZpZWxkLmlkKSB7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOworICAgICAgICAgIH0KKyAgICAgICAgICBpcHJvdC5yZWFkRmllbGRFbmQoKTsKKyAgICAgICAgfQorICAgICAgICBpcHJvdC5yZWFkU3RydWN0RW5kKCk7CisgICAgICAgIHN0cnVjdC52YWxpZGF0ZSgpOworICAgICAgfQorCisgICAgICBwdWJsaWMgdm9pZCB3cml0ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgb3Byb3QsIHNldFdvcmtlclByb2ZpbGVyX3Jlc3VsdCBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgICAgc3RydWN0LnZhbGlkYXRlKCk7CisKKyAgICAgICAgb3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihTVFJVQ1RfREVTQyk7CisgICAgICAgIG9wcm90LndyaXRlRmllbGRTdG9wKCk7CisgICAgICAgIG9wcm90LndyaXRlU3RydWN0RW5kKCk7CisgICAgICB9CisKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBzZXRXb3JrZXJQcm9maWxlcl9yZXN1bHRUdXBsZVNjaGVtZUZhY3RvcnkgaW1wbGVtZW50cyBTY2hlbWVGYWN0b3J5IHsKKyAgICAgIHB1YmxpYyBzZXRXb3JrZXJQcm9maWxlcl9yZXN1bHRUdXBsZVNjaGVtZSBnZXRTY2hlbWUoKSB7CisgICAgICAgIHJldHVybiBuZXcgc2V0V29ya2VyUHJvZmlsZXJfcmVzdWx0VHVwbGVTY2hlbWUoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBzZXRXb3JrZXJQcm9maWxlcl9yZXN1bHRUdXBsZVNjaGVtZSBleHRlbmRzIFR1cGxlU2NoZW1lPHNldFdvcmtlclByb2ZpbGVyX3Jlc3VsdD4geworCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBwcm90LCBzZXRXb3JrZXJQcm9maWxlcl9yZXN1bHQgc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICAgIFRUdXBsZVByb3RvY29sIG9wcm90ID0gKFRUdXBsZVByb3RvY29sKSBwcm90OworICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIHJlYWQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIHByb3QsIHNldFdvcmtlclByb2ZpbGVyX3Jlc3VsdCBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgICAgVFR1cGxlUHJvdG9jb2wgaXByb3QgPSAoVFR1cGxlUHJvdG9jb2wpIHByb3Q7CisgICAgICB9CisgICAgfQorCisgIH0KKworICBwdWJsaWMgc3RhdGljIGNsYXNzIGdldENvbXBvbmVudFBlbmRpbmdQcm9maWxlQWN0aW9uc19hcmdzIGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2U8Z2V0Q29tcG9uZW50UGVuZGluZ1Byb2ZpbGVBY3Rpb25zX2FyZ3MsIGdldENvbXBvbmVudFBlbmRpbmdQcm9maWxlQWN0aW9uc19hcmdzLl9GaWVsZHM+LCBqYXZhLmlvLlNlcmlhbGl6YWJsZSwgQ2xvbmVhYmxlLCBDb21wYXJhYmxlPGdldENvbXBvbmVudFBlbmRpbmdQcm9maWxlQWN0aW9uc19hcmdzPiAgIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0IFNUUlVDVF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QoImdldENvbXBvbmVudFBlbmRpbmdQcm9maWxlQWN0aW9uc19hcmdzIik7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgSURfRklFTERfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQoImlkIiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCAoc2hvcnQpMSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIENPTVBPTkVOVF9JRF9GSUVMRF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCgiY29tcG9uZW50X2lkIiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCAoc2hvcnQpMik7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIEFDVElPTl9GSUVMRF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCgiYWN0aW9uIiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTMyLCAoc2hvcnQpMyk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8Q2xhc3M8PyBleHRlbmRzIElTY2hlbWU+LCBTY2hlbWVGYWN0b3J5PiBzY2hlbWVzID0gbmV3IEhhc2hNYXA8Q2xhc3M8PyBleHRlbmRzIElTY2hlbWU+LCBTY2hlbWVGYWN0b3J5PigpOworICAgIHN0YXRpYyB7CisgICAgICBzY2hlbWVzLnB1dChTdGFuZGFyZFNjaGVtZS5jbGFzcywgbmV3IGdldENvbXBvbmVudFBlbmRpbmdQcm9maWxlQWN0aW9uc19hcmdzU3RhbmRhcmRTY2hlbWVGYWN0b3J5KCkpOworICAgICAgc2NoZW1lcy5wdXQoVHVwbGVTY2hlbWUuY2xhc3MsIG5ldyBnZXRDb21wb25lbnRQZW5kaW5nUHJvZmlsZUFjdGlvbnNfYXJnc1R1cGxlU2NoZW1lRmFjdG9yeSgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBpZDsgLy8gcmVxdWlyZWQKKyAgICBwcml2YXRlIFN0cmluZyBjb21wb25lbnRfaWQ7IC8vIHJlcXVpcmVkCisgICAgcHJpdmF0ZSBQcm9maWxlQWN0aW9uIGFjdGlvbjsgLy8gcmVxdWlyZWQKKworICAgIC8qKiBUaGUgc2V0IG9mIGZpZWxkcyB0aGlzIHN0cnVjdCBjb250YWlucywgYWxvbmcgd2l0aCBjb252ZW5pZW5jZSBtZXRob2RzIGZvciBmaW5kaW5nIGFuZCBtYW5pcHVsYXRpbmcgdGhlbS4gKi8KKyAgICBwdWJsaWMgZW51bSBfRmllbGRzIGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkSWRFbnVtIHsKKyAgICAgIElEKChzaG9ydCkxLCAiaWQiKSwKKyAgICAgIENPTVBPTkVOVF9JRCgoc2hvcnQpMiwgImNvbXBvbmVudF9pZCIpLAorICAgICAgLyoqCisgICAgICAgKiAKKyAgICAgICAqIEBzZWUgUHJvZmlsZUFjdGlvbgorICAgICAgICovCisgICAgICBBQ1RJT04oKHNob3J0KTMsICJhY3Rpb24iKTsKKworICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgX0ZpZWxkcz4gYnlOYW1lID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBfRmllbGRzPigpOworCisgICAgICBzdGF0aWMgeworICAgICAgICBmb3IgKF9GaWVsZHMgZmllbGQgOiBFbnVtU2V0LmFsbE9mKF9GaWVsZHMuY2xhc3MpKSB7CisgICAgICAgICAgYnlOYW1lLnB1dChmaWVsZC5nZXRGaWVsZE5hbWUoKSwgZmllbGQpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogRmluZCB0aGUgX0ZpZWxkcyBjb25zdGFudCB0aGF0IG1hdGNoZXMgZmllbGRJZCwgb3IgbnVsbCBpZiBpdHMgbm90IGZvdW5kLgorICAgICAgICovCisgICAgICBwdWJsaWMgc3RhdGljIF9GaWVsZHMgZmluZEJ5VGhyaWZ0SWQoaW50IGZpZWxkSWQpIHsKKyAgICAgICAgc3dpdGNoKGZpZWxkSWQpIHsKKyAgICAgICAgICBjYXNlIDE6IC8vIElECisgICAgICAgICAgICByZXR1cm4gSUQ7CisgICAgICAgICAgY2FzZSAyOiAvLyBDT01QT05FTlRfSUQKKyAgICAgICAgICAgIHJldHVybiBDT01QT05FTlRfSUQ7CisgICAgICAgICAgY2FzZSAzOiAvLyBBQ1RJT04KKyAgICAgICAgICAgIHJldHVybiBBQ1RJT047CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogRmluZCB0aGUgX0ZpZWxkcyBjb25zdGFudCB0aGF0IG1hdGNoZXMgZmllbGRJZCwgdGhyb3dpbmcgYW4gZXhjZXB0aW9uCisgICAgICAgKiBpZiBpdCBpcyBub3QgZm91bmQuCisgICAgICAgKi8KKyAgICAgIHB1YmxpYyBzdGF0aWMgX0ZpZWxkcyBmaW5kQnlUaHJpZnRJZE9yVGhyb3coaW50IGZpZWxkSWQpIHsKKyAgICAgICAgX0ZpZWxkcyBmaWVsZHMgPSBmaW5kQnlUaHJpZnRJZChmaWVsZElkKTsKKyAgICAgICAgaWYgKGZpZWxkcyA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJGaWVsZCAiICsgZmllbGRJZCArICIgZG9lc24ndCBleGlzdCEiKTsKKyAgICAgICAgcmV0dXJuIGZpZWxkczsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBGaW5kIHRoZSBfRmllbGRzIGNvbnN0YW50IHRoYXQgbWF0Y2hlcyBuYW1lLCBvciBudWxsIGlmIGl0cyBub3QgZm91bmQuCisgICAgICAgKi8KKyAgICAgIHB1YmxpYyBzdGF0aWMgX0ZpZWxkcyBmaW5kQnlOYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiBieU5hbWUuZ2V0KG5hbWUpOworICAgICAgfQorCisgICAgICBwcml2YXRlIGZpbmFsIHNob3J0IF90aHJpZnRJZDsKKyAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIF9maWVsZE5hbWU7CisKKyAgICAgIF9GaWVsZHMoc2hvcnQgdGhyaWZ0SWQsIFN0cmluZyBmaWVsZE5hbWUpIHsKKyAgICAgICAgX3RocmlmdElkID0gdGhyaWZ0SWQ7CisgICAgICAgIF9maWVsZE5hbWUgPSBmaWVsZE5hbWU7CisgICAgICB9CisKKyAgICAgIHB1YmxpYyBzaG9ydCBnZXRUaHJpZnRGaWVsZElkKCkgeworICAgICAgICByZXR1cm4gX3RocmlmdElkOworICAgICAgfQorCisgICAgICBwdWJsaWMgU3RyaW5nIGdldEZpZWxkTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIF9maWVsZE5hbWU7CisgICAgICB9CisgICAgfQorCisgICAgLy8gaXNzZXQgaWQgYXNzaWdubWVudHMKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE1hcDxfRmllbGRzLCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YT4gbWV0YURhdGFNYXA7CisgICAgc3RhdGljIHsKKyAgICAgIE1hcDxfRmllbGRzLCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YT4gdG1wTWFwID0gbmV3IEVudW1NYXA8X0ZpZWxkcywgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGE+KF9GaWVsZHMuY2xhc3MpOworICAgICAgdG1wTWFwLnB1dChfRmllbGRzLklELCBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEoImlkIiwgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLkRFRkFVTFQsIAorICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRWYWx1ZU1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORykpKTsKKyAgICAgIHRtcE1hcC5wdXQoX0ZpZWxkcy5DT01QT05FTlRfSUQsIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YSgiY29tcG9uZW50X2lkIiwgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLkRFRkFVTFQsIAorICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRWYWx1ZU1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORykpKTsKKyAgICAgIHRtcE1hcC5wdXQoX0ZpZWxkcy5BQ1RJT04sIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YSgiYWN0aW9uIiwgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLkRFRkFVTFQsIAorICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRW51bU1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkVOVU0sIFByb2ZpbGVBY3Rpb24uY2xhc3MpKSk7CisgICAgICBtZXRhRGF0YU1hcCA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcCh0bXBNYXApOworICAgICAgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEuYWRkU3RydWN0TWV0YURhdGFNYXAoZ2V0Q29tcG9uZW50UGVuZGluZ1Byb2ZpbGVBY3Rpb25zX2FyZ3MuY2xhc3MsIG1ldGFEYXRhTWFwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZ2V0Q29tcG9uZW50UGVuZGluZ1Byb2ZpbGVBY3Rpb25zX2FyZ3MoKSB7CisgICAgfQorCisgICAgcHVibGljIGdldENvbXBvbmVudFBlbmRpbmdQcm9maWxlQWN0aW9uc19hcmdzKAorICAgICAgU3RyaW5nIGlkLAorICAgICAgU3RyaW5nIGNvbXBvbmVudF9pZCwKKyAgICAgIFByb2ZpbGVBY3Rpb24gYWN0aW9uKQorICAgIHsKKyAgICAgIHRoaXMoKTsKKyAgICAgIHRoaXMuaWQgPSBpZDsKKyAgICAgIHRoaXMuY29tcG9uZW50X2lkID0gY29tcG9uZW50X2lkOworICAgICAgdGhpcy5hY3Rpb24gPSBhY3Rpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogUGVyZm9ybXMgYSBkZWVwIGNvcHkgb24gPGk+b3RoZXI8L2k+LgorICAgICAqLworICAgIHB1YmxpYyBnZXRDb21wb25lbnRQZW5kaW5nUHJvZmlsZUFjdGlvbnNfYXJncyhnZXRDb21wb25lbnRQZW5kaW5nUHJvZmlsZUFjdGlvbnNfYXJncyBvdGhlcikgeworICAgICAgaWYgKG90aGVyLmlzX3NldF9pZCgpKSB7CisgICAgICAgIHRoaXMuaWQgPSBvdGhlci5pZDsKKyAgICAgIH0KKyAgICAgIGlmIChvdGhlci5pc19zZXRfY29tcG9uZW50X2lkKCkpIHsKKyAgICAgICAgdGhpcy5jb21wb25lbnRfaWQgPSBvdGhlci5jb21wb25lbnRfaWQ7CisgICAgICB9CisgICAgICBpZiAob3RoZXIuaXNfc2V0X2FjdGlvbigpKSB7CisgICAgICAgIHRoaXMuYWN0aW9uID0gb3RoZXIuYWN0aW9uOworICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBnZXRDb21wb25lbnRQZW5kaW5nUHJvZmlsZUFjdGlvbnNfYXJncyBkZWVwQ29weSgpIHsKKyAgICAgIHJldHVybiBuZXcgZ2V0Q29tcG9uZW50UGVuZGluZ1Byb2ZpbGVBY3Rpb25zX2FyZ3ModGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgICB0aGlzLmlkID0gbnVsbDsKKyAgICAgIHRoaXMuY29tcG9uZW50X2lkID0gbnVsbDsKKyAgICAgIHRoaXMuYWN0aW9uID0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldF9pZCgpIHsKKyAgICAgIHJldHVybiB0aGlzLmlkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldF9pZChTdHJpbmcgaWQpIHsKKyAgICAgIHRoaXMuaWQgPSBpZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1bnNldF9pZCgpIHsKKyAgICAgIHRoaXMuaWQgPSBudWxsOworICAgIH0KKworICAgIC8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgaWQgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgICAgcHVibGljIGJvb2xlYW4gaXNfc2V0X2lkKCkgeworICAgICAgcmV0dXJuIHRoaXMuaWQgIT0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRfaWRfaXNTZXQoYm9vbGVhbiB2YWx1ZSkgeworICAgICAgaWYgKCF2YWx1ZSkgeworICAgICAgICB0aGlzLmlkID0gbnVsbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldF9jb21wb25lbnRfaWQoKSB7CisgICAgICByZXR1cm4gdGhpcy5jb21wb25lbnRfaWQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0X2NvbXBvbmVudF9pZChTdHJpbmcgY29tcG9uZW50X2lkKSB7CisgICAgICB0aGlzLmNvbXBvbmVudF9pZCA9IGNvbXBvbmVudF9pZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1bnNldF9jb21wb25lbnRfaWQoKSB7CisgICAgICB0aGlzLmNvbXBvbmVudF9pZCA9IG51bGw7CisgICAgfQorCisgICAgLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBjb21wb25lbnRfaWQgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgICAgcHVibGljIGJvb2xlYW4gaXNfc2V0X2NvbXBvbmVudF9pZCgpIHsKKyAgICAgIHJldHVybiB0aGlzLmNvbXBvbmVudF9pZCAhPSBudWxsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldF9jb21wb25lbnRfaWRfaXNTZXQoYm9vbGVhbiB2YWx1ZSkgeworICAgICAgaWYgKCF2YWx1ZSkgeworICAgICAgICB0aGlzLmNvbXBvbmVudF9pZCA9IG51bGw7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogCisgICAgICogQHNlZSBQcm9maWxlQWN0aW9uCisgICAgICovCisgICAgcHVibGljIFByb2ZpbGVBY3Rpb24gZ2V0X2FjdGlvbigpIHsKKyAgICAgIHJldHVybiB0aGlzLmFjdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAKKyAgICAgKiBAc2VlIFByb2ZpbGVBY3Rpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRfYWN0aW9uKFByb2ZpbGVBY3Rpb24gYWN0aW9uKSB7CisgICAgICB0aGlzLmFjdGlvbiA9IGFjdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1bnNldF9hY3Rpb24oKSB7CisgICAgICB0aGlzLmFjdGlvbiA9IG51bGw7CisgICAgfQorCisgICAgLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBhY3Rpb24gaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgICAgcHVibGljIGJvb2xlYW4gaXNfc2V0X2FjdGlvbigpIHsKKyAgICAgIHJldHVybiB0aGlzLmFjdGlvbiAhPSBudWxsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldF9hY3Rpb25faXNTZXQoYm9vbGVhbiB2YWx1ZSkgeworICAgICAgaWYgKCF2YWx1ZSkgeworICAgICAgICB0aGlzLmFjdGlvbiA9IG51bGw7CisgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RmllbGRWYWx1ZShfRmllbGRzIGZpZWxkLCBPYmplY3QgdmFsdWUpIHsKKyAgICAgIHN3aXRjaCAoZmllbGQpIHsKKyAgICAgIGNhc2UgSUQ6CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgdW5zZXRfaWQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzZXRfaWQoKFN0cmluZyl2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgQ09NUE9ORU5UX0lEOgorICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgIHVuc2V0X2NvbXBvbmVudF9pZCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHNldF9jb21wb25lbnRfaWQoKFN0cmluZyl2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgQUNUSU9OOgorICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgIHVuc2V0X2FjdGlvbigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHNldF9hY3Rpb24oKFByb2ZpbGVBY3Rpb24pdmFsdWUpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICB9CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRGaWVsZFZhbHVlKF9GaWVsZHMgZmllbGQpIHsKKyAgICAgIHN3aXRjaCAoZmllbGQpIHsKKyAgICAgIGNhc2UgSUQ6CisgICAgICAgIHJldHVybiBnZXRfaWQoKTsKKworICAgICAgY2FzZSBDT01QT05FTlRfSUQ6CisgICAgICAgIHJldHVybiBnZXRfY29tcG9uZW50X2lkKCk7CisKKyAgICAgIGNhc2UgQUNUSU9OOgorICAgICAgICByZXR1cm4gZ2V0X2FjdGlvbigpOworCisgICAgICB9CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBjb3JyZXNwb25kaW5nIHRvIGZpZWxkSUQgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTZXQoX0ZpZWxkcyBmaWVsZCkgeworICAgICAgaWYgKGZpZWxkID09IG51bGwpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgfQorCisgICAgICBzd2l0Y2ggKGZpZWxkKSB7CisgICAgICBjYXNlIElEOgorICAgICAgICByZXR1cm4gaXNfc2V0X2lkKCk7CisgICAgICBjYXNlIENPTVBPTkVOVF9JRDoKKyAgICAgICAgcmV0dXJuIGlzX3NldF9jb21wb25lbnRfaWQoKTsKKyAgICAgIGNhc2UgQUNUSU9OOgorICAgICAgICByZXR1cm4gaXNfc2V0X2FjdGlvbigpOworICAgICAgfQorICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgdGhhdCkgeworICAgICAgaWYgKHRoYXQgPT0gbnVsbCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKHRoYXQgaW5zdGFuY2VvZiBnZXRDb21wb25lbnRQZW5kaW5nUHJvZmlsZUFjdGlvbnNfYXJncykKKyAgICAgICAgcmV0dXJuIHRoaXMuZXF1YWxzKChnZXRDb21wb25lbnRQZW5kaW5nUHJvZmlsZUFjdGlvbnNfYXJncyl0aGF0KTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZ2V0Q29tcG9uZW50UGVuZGluZ1Byb2ZpbGVBY3Rpb25zX2FyZ3MgdGhhdCkgeworICAgICAgaWYgKHRoYXQgPT0gbnVsbCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICBib29sZWFuIHRoaXNfcHJlc2VudF9pZCA9IHRydWUgJiYgdGhpcy5pc19zZXRfaWQoKTsKKyAgICAgIGJvb2xlYW4gdGhhdF9wcmVzZW50X2lkID0gdHJ1ZSAmJiB0aGF0LmlzX3NldF9pZCgpOworICAgICAgaWYgKHRoaXNfcHJlc2VudF9pZCB8fCB0aGF0X3ByZXNlbnRfaWQpIHsKKyAgICAgICAgaWYgKCEodGhpc19wcmVzZW50X2lkICYmIHRoYXRfcHJlc2VudF9pZCkpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIXRoaXMuaWQuZXF1YWxzKHRoYXQuaWQpKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgYm9vbGVhbiB0aGlzX3ByZXNlbnRfY29tcG9uZW50X2lkID0gdHJ1ZSAmJiB0aGlzLmlzX3NldF9jb21wb25lbnRfaWQoKTsKKyAgICAgIGJvb2xlYW4gdGhhdF9wcmVzZW50X2NvbXBvbmVudF9pZCA9IHRydWUgJiYgdGhhdC5pc19zZXRfY29tcG9uZW50X2lkKCk7CisgICAgICBpZiAodGhpc19wcmVzZW50X2NvbXBvbmVudF9pZCB8fCB0aGF0X3ByZXNlbnRfY29tcG9uZW50X2lkKSB7CisgICAgICAgIGlmICghKHRoaXNfcHJlc2VudF9jb21wb25lbnRfaWQgJiYgdGhhdF9wcmVzZW50X2NvbXBvbmVudF9pZCkpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIXRoaXMuY29tcG9uZW50X2lkLmVxdWFscyh0aGF0LmNvbXBvbmVudF9pZCkpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICBib29sZWFuIHRoaXNfcHJlc2VudF9hY3Rpb24gPSB0cnVlICYmIHRoaXMuaXNfc2V0X2FjdGlvbigpOworICAgICAgYm9vbGVhbiB0aGF0X3ByZXNlbnRfYWN0aW9uID0gdHJ1ZSAmJiB0aGF0LmlzX3NldF9hY3Rpb24oKTsKKyAgICAgIGlmICh0aGlzX3ByZXNlbnRfYWN0aW9uIHx8IHRoYXRfcHJlc2VudF9hY3Rpb24pIHsKKyAgICAgICAgaWYgKCEodGhpc19wcmVzZW50X2FjdGlvbiAmJiB0aGF0X3ByZXNlbnRfYWN0aW9uKSkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghdGhpcy5hY3Rpb24uZXF1YWxzKHRoYXQuYWN0aW9uKSkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICBMaXN0PE9iamVjdD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOworCisgICAgICBib29sZWFuIHByZXNlbnRfaWQgPSB0cnVlICYmIChpc19zZXRfaWQoKSk7CisgICAgICBsaXN0LmFkZChwcmVzZW50X2lkKTsKKyAgICAgIGlmIChwcmVzZW50X2lkKQorICAgICAgICBsaXN0LmFkZChpZCk7CisKKyAgICAgIGJvb2xlYW4gcHJlc2VudF9jb21wb25lbnRfaWQgPSB0cnVlICYmIChpc19zZXRfY29tcG9uZW50X2lkKCkpOworICAgICAgbGlzdC5hZGQocHJlc2VudF9jb21wb25lbnRfaWQpOworICAgICAgaWYgKHByZXNlbnRfY29tcG9uZW50X2lkKQorICAgICAgICBsaXN0LmFkZChjb21wb25lbnRfaWQpOworCisgICAgICBib29sZWFuIHByZXNlbnRfYWN0aW9uID0gdHJ1ZSAmJiAoaXNfc2V0X2FjdGlvbigpKTsKKyAgICAgIGxpc3QuYWRkKHByZXNlbnRfYWN0aW9uKTsKKyAgICAgIGlmIChwcmVzZW50X2FjdGlvbikKKyAgICAgICAgbGlzdC5hZGQoYWN0aW9uLmdldFZhbHVlKCkpOworCisgICAgICByZXR1cm4gbGlzdC5oYXNoQ29kZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKGdldENvbXBvbmVudFBlbmRpbmdQcm9maWxlQWN0aW9uc19hcmdzIG90aGVyKSB7CisgICAgICBpZiAoIWdldENsYXNzKCkuZXF1YWxzKG90aGVyLmdldENsYXNzKCkpKSB7CisgICAgICAgIHJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKS5jb21wYXJlVG8ob3RoZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgfQorCisgICAgICBpbnQgbGFzdENvbXBhcmlzb24gPSAwOworCisgICAgICBsYXN0Q29tcGFyaXNvbiA9IEJvb2xlYW4udmFsdWVPZihpc19zZXRfaWQoKSkuY29tcGFyZVRvKG90aGVyLmlzX3NldF9pZCgpKTsKKyAgICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICAgIH0KKyAgICAgIGlmIChpc19zZXRfaWQoKSkgeworICAgICAgICBsYXN0Q29tcGFyaXNvbiA9IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvbXBhcmVUbyh0aGlzLmlkLCBvdGhlci5pZCk7CisgICAgICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgICAgICB9CisgICAgICB9CisgICAgICBsYXN0Q29tcGFyaXNvbiA9IEJvb2xlYW4udmFsdWVPZihpc19zZXRfY29tcG9uZW50X2lkKCkpLmNvbXBhcmVUbyhvdGhlci5pc19zZXRfY29tcG9uZW50X2lkKCkpOworICAgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgICAgfQorICAgICAgaWYgKGlzX3NldF9jb21wb25lbnRfaWQoKSkgeworICAgICAgICBsYXN0Q29tcGFyaXNvbiA9IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvbXBhcmVUbyh0aGlzLmNvbXBvbmVudF9pZCwgb3RoZXIuY29tcG9uZW50X2lkKTsKKyAgICAgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGxhc3RDb21wYXJpc29uID0gQm9vbGVhbi52YWx1ZU9mKGlzX3NldF9hY3Rpb24oKSkuY29tcGFyZVRvKG90aGVyLmlzX3NldF9hY3Rpb24oKSk7CisgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICB9CisgICAgICBpZiAoaXNfc2V0X2FjdGlvbigpKSB7CisgICAgICAgIGxhc3RDb21wYXJpc29uID0gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29tcGFyZVRvKHRoaXMuYWN0aW9uLCBvdGhlci5hY3Rpb24pOworICAgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIF9GaWVsZHMgZmllbGRGb3JJZChpbnQgZmllbGRJZCkgeworICAgICAgcmV0dXJuIF9GaWVsZHMuZmluZEJ5VGhyaWZ0SWQoZmllbGRJZCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVhZChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgaXByb3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgIHNjaGVtZXMuZ2V0KGlwcm90LmdldFNjaGVtZSgpKS5nZXRTY2hlbWUoKS5yZWFkKGlwcm90LCB0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgb3Byb3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgIHNjaGVtZXMuZ2V0KG9wcm90LmdldFNjaGVtZSgpKS5nZXRTY2hlbWUoKS53cml0ZShvcHJvdCwgdGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigiZ2V0Q29tcG9uZW50UGVuZGluZ1Byb2ZpbGVBY3Rpb25zX2FyZ3MoIik7CisgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKKworICAgICAgc2IuYXBwZW5kKCJpZDoiKTsKKyAgICAgIGlmICh0aGlzLmlkID09IG51bGwpIHsKKyAgICAgICAgc2IuYXBwZW5kKCJudWxsIik7CisgICAgICB9IGVsc2UgeworICAgICAgICBzYi5hcHBlbmQodGhpcy5pZCk7CisgICAgICB9CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgaWYgKCFmaXJzdCkgc2IuYXBwZW5kKCIsICIpOworICAgICAgc2IuYXBwZW5kKCJjb21wb25lbnRfaWQ6Iik7CisgICAgICBpZiAodGhpcy5jb21wb25lbnRfaWQgPT0gbnVsbCkgeworICAgICAgICBzYi5hcHBlbmQoIm51bGwiKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNiLmFwcGVuZCh0aGlzLmNvbXBvbmVudF9pZCk7CisgICAgICB9CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgaWYgKCFmaXJzdCkgc2IuYXBwZW5kKCIsICIpOworICAgICAgc2IuYXBwZW5kKCJhY3Rpb246Iik7CisgICAgICBpZiAodGhpcy5hY3Rpb24gPT0gbnVsbCkgeworICAgICAgICBzYi5hcHBlbmQoIm51bGwiKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNiLmFwcGVuZCh0aGlzLmFjdGlvbik7CisgICAgICB9CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgc2IuYXBwZW5kKCIpIik7CisgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgIC8vIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMKKyAgICAgIC8vIGNoZWNrIGZvciBzdWItc3RydWN0IHZhbGlkaXR5CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgdHJ5IHsKKyAgICAgICAgd3JpdGUobmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRDb21wYWN0UHJvdG9jb2wobmV3IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5USU9TdHJlYW1UcmFuc3BvcnQob3V0KSkpOworICAgICAgfSBjYXRjaCAob3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB0ZSkgeworICAgICAgICB0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbih0ZSk7CisgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBpbikgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgdHJ5IHsKKyAgICAgICAgcmVhZChuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbChuZXcgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRJT1N0cmVhbVRyYW5zcG9ydChpbikpKTsKKyAgICAgIH0gY2F0Y2ggKG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24gdGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IGphdmEuaW8uSU9FeGNlcHRpb24odGUpOworICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIGdldENvbXBvbmVudFBlbmRpbmdQcm9maWxlQWN0aW9uc19hcmdzU3RhbmRhcmRTY2hlbWVGYWN0b3J5IGltcGxlbWVudHMgU2NoZW1lRmFjdG9yeSB7CisgICAgICBwdWJsaWMgZ2V0Q29tcG9uZW50UGVuZGluZ1Byb2ZpbGVBY3Rpb25zX2FyZ3NTdGFuZGFyZFNjaGVtZSBnZXRTY2hlbWUoKSB7CisgICAgICAgIHJldHVybiBuZXcgZ2V0Q29tcG9uZW50UGVuZGluZ1Byb2ZpbGVBY3Rpb25zX2FyZ3NTdGFuZGFyZFNjaGVtZSgpOworICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIGdldENvbXBvbmVudFBlbmRpbmdQcm9maWxlQWN0aW9uc19hcmdzU3RhbmRhcmRTY2hlbWUgZXh0ZW5kcyBTdGFuZGFyZFNjaGVtZTxnZXRDb21wb25lbnRQZW5kaW5nUHJvZmlsZUFjdGlvbnNfYXJncz4geworCisgICAgICBwdWJsaWMgdm9pZCByZWFkKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBpcHJvdCwgZ2V0Q29tcG9uZW50UGVuZGluZ1Byb2ZpbGVBY3Rpb25zX2FyZ3Mgc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBzY2hlbWVGaWVsZDsKKyAgICAgICAgaXByb3QucmVhZFN0cnVjdEJlZ2luKCk7CisgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICB7CisgICAgICAgICAgc2NoZW1lRmllbGQgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpOworICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUT1ApIHsgCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgc3dpdGNoIChzY2hlbWVGaWVsZC5pZCkgeworICAgICAgICAgICAgY2FzZSAxOiAvLyBJRAorICAgICAgICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcpIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QuaWQgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgc3RydWN0LnNldF9pZF9pc1NldCh0cnVlKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsgCisgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjogLy8gQ09NUE9ORU5UX0lECisgICAgICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORykgeworICAgICAgICAgICAgICAgIHN0cnVjdC5jb21wb25lbnRfaWQgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgc3RydWN0LnNldF9jb21wb25lbnRfaWRfaXNTZXQodHJ1ZSk7CisgICAgICAgICAgICAgIH0gZWxzZSB7IAorICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgc2NoZW1lRmllbGQudHlwZSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM6IC8vIEFDVElPTgorICAgICAgICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JMzIpIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QuYWN0aW9uID0gYmFja3R5cGUuc3Rvcm0uZ2VuZXJhdGVkLlByb2ZpbGVBY3Rpb24uZmluZEJ5VmFsdWUoaXByb3QucmVhZEkzMigpKTsKKyAgICAgICAgICAgICAgICBzdHJ1Y3Quc2V0X2FjdGlvbl9pc1NldCh0cnVlKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsgCisgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgc2NoZW1lRmllbGQudHlwZSk7CisgICAgICAgICAgfQorICAgICAgICAgIGlwcm90LnJlYWRGaWVsZEVuZCgpOworICAgICAgICB9CisgICAgICAgIGlwcm90LnJlYWRTdHJ1Y3RFbmQoKTsKKyAgICAgICAgc3RydWN0LnZhbGlkYXRlKCk7CisgICAgICB9CisKKyAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBvcHJvdCwgZ2V0Q29tcG9uZW50UGVuZGluZ1Byb2ZpbGVBY3Rpb25zX2FyZ3Mgc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICAgIHN0cnVjdC52YWxpZGF0ZSgpOworCisgICAgICAgIG9wcm90LndyaXRlU3RydWN0QmVnaW4oU1RSVUNUX0RFU0MpOworICAgICAgICBpZiAoc3RydWN0LmlkICE9IG51bGwpIHsKKyAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oSURfRklFTERfREVTQyk7CisgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoc3RydWN0LmlkKTsKKyAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cnVjdC5jb21wb25lbnRfaWQgIT0gbnVsbCkgeworICAgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihDT01QT05FTlRfSURfRklFTERfREVTQyk7CisgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoc3RydWN0LmNvbXBvbmVudF9pZCk7CisgICAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJ1Y3QuYWN0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oQUNUSU9OX0ZJRUxEX0RFU0MpOworICAgICAgICAgIG9wcm90LndyaXRlSTMyKHN0cnVjdC5hY3Rpb24uZ2V0VmFsdWUoKSk7CisgICAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgICAgICB9CisgICAgICAgIG9wcm90LndyaXRlRmllbGRTdG9wKCk7CisgICAgICAgIG9wcm90LndyaXRlU3RydWN0RW5kKCk7CisgICAgICB9CisKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBnZXRDb21wb25lbnRQZW5kaW5nUHJvZmlsZUFjdGlvbnNfYXJnc1R1cGxlU2NoZW1lRmFjdG9yeSBpbXBsZW1lbnRzIFNjaGVtZUZhY3RvcnkgeworICAgICAgcHVibGljIGdldENvbXBvbmVudFBlbmRpbmdQcm9maWxlQWN0aW9uc19hcmdzVHVwbGVTY2hlbWUgZ2V0U2NoZW1lKCkgeworICAgICAgICByZXR1cm4gbmV3IGdldENvbXBvbmVudFBlbmRpbmdQcm9maWxlQWN0aW9uc19hcmdzVHVwbGVTY2hlbWUoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBnZXRDb21wb25lbnRQZW5kaW5nUHJvZmlsZUFjdGlvbnNfYXJnc1R1cGxlU2NoZW1lIGV4dGVuZHMgVHVwbGVTY2hlbWU8Z2V0Q29tcG9uZW50UGVuZGluZ1Byb2ZpbGVBY3Rpb25zX2FyZ3M+IHsKKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCB3cml0ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgcHJvdCwgZ2V0Q29tcG9uZW50UGVuZGluZ1Byb2ZpbGVBY3Rpb25zX2FyZ3Mgc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICAgIFRUdXBsZVByb3RvY29sIG9wcm90ID0gKFRUdXBsZVByb3RvY29sKSBwcm90OworICAgICAgICBCaXRTZXQgb3B0aW9uYWxzID0gbmV3IEJpdFNldCgpOworICAgICAgICBpZiAoc3RydWN0LmlzX3NldF9pZCgpKSB7CisgICAgICAgICAgb3B0aW9uYWxzLnNldCgwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RydWN0LmlzX3NldF9jb21wb25lbnRfaWQoKSkgeworICAgICAgICAgIG9wdGlvbmFscy5zZXQoMSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cnVjdC5pc19zZXRfYWN0aW9uKCkpIHsKKyAgICAgICAgICBvcHRpb25hbHMuc2V0KDIpOworICAgICAgICB9CisgICAgICAgIG9wcm90LndyaXRlQml0U2V0KG9wdGlvbmFscywgMyk7CisgICAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X2lkKCkpIHsKKyAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhzdHJ1Y3QuaWQpOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X2NvbXBvbmVudF9pZCgpKSB7CisgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoc3RydWN0LmNvbXBvbmVudF9pZCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cnVjdC5pc19zZXRfYWN0aW9uKCkpIHsKKyAgICAgICAgICBvcHJvdC53cml0ZUkzMihzdHJ1Y3QuYWN0aW9uLmdldFZhbHVlKCkpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgcmVhZChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgcHJvdCwgZ2V0Q29tcG9uZW50UGVuZGluZ1Byb2ZpbGVBY3Rpb25zX2FyZ3Mgc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICAgIFRUdXBsZVByb3RvY29sIGlwcm90ID0gKFRUdXBsZVByb3RvY29sKSBwcm90OworICAgICAgICBCaXRTZXQgaW5jb21pbmcgPSBpcHJvdC5yZWFkQml0U2V0KDMpOworICAgICAgICBpZiAoaW5jb21pbmcuZ2V0KDApKSB7CisgICAgICAgICAgc3RydWN0LmlkID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICAgIHN0cnVjdC5zZXRfaWRfaXNTZXQodHJ1ZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGluY29taW5nLmdldCgxKSkgeworICAgICAgICAgIHN0cnVjdC5jb21wb25lbnRfaWQgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgc3RydWN0LnNldF9jb21wb25lbnRfaWRfaXNTZXQodHJ1ZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGluY29taW5nLmdldCgyKSkgeworICAgICAgICAgIHN0cnVjdC5hY3Rpb24gPSBiYWNrdHlwZS5zdG9ybS5nZW5lcmF0ZWQuUHJvZmlsZUFjdGlvbi5maW5kQnlWYWx1ZShpcHJvdC5yZWFkSTMyKCkpOworICAgICAgICAgIHN0cnVjdC5zZXRfYWN0aW9uX2lzU2V0KHRydWUpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgIH0KKworICBwdWJsaWMgc3RhdGljIGNsYXNzIGdldENvbXBvbmVudFBlbmRpbmdQcm9maWxlQWN0aW9uc19yZXN1bHQgaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZTxnZXRDb21wb25lbnRQZW5kaW5nUHJvZmlsZUFjdGlvbnNfcmVzdWx0LCBnZXRDb21wb25lbnRQZW5kaW5nUHJvZmlsZUFjdGlvbnNfcmVzdWx0Ll9GaWVsZHM+LCBqYXZhLmlvLlNlcmlhbGl6YWJsZSwgQ2xvbmVhYmxlLCBDb21wYXJhYmxlPGdldENvbXBvbmVudFBlbmRpbmdQcm9maWxlQWN0aW9uc19yZXN1bHQ+ICAgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QgU1RSVUNUX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdCgiZ2V0Q29tcG9uZW50UGVuZGluZ1Byb2ZpbGVBY3Rpb25zX3Jlc3VsdCIpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIFNVQ0NFU1NfRklFTERfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQoInN1Y2Nlc3MiLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5MSVNULCAoc2hvcnQpMCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8Q2xhc3M8PyBleHRlbmRzIElTY2hlbWU+LCBTY2hlbWVGYWN0b3J5PiBzY2hlbWVzID0gbmV3IEhhc2hNYXA8Q2xhc3M8PyBleHRlbmRzIElTY2hlbWU+LCBTY2hlbWVGYWN0b3J5PigpOworICAgIHN0YXRpYyB7CisgICAgICBzY2hlbWVzLnB1dChTdGFuZGFyZFNjaGVtZS5jbGFzcywgbmV3IGdldENvbXBvbmVudFBlbmRpbmdQcm9maWxlQWN0aW9uc19yZXN1bHRTdGFuZGFyZFNjaGVtZUZhY3RvcnkoKSk7CisgICAgICBzY2hlbWVzLnB1dChUdXBsZVNjaGVtZS5jbGFzcywgbmV3IGdldENvbXBvbmVudFBlbmRpbmdQcm9maWxlQWN0aW9uc19yZXN1bHRUdXBsZVNjaGVtZUZhY3RvcnkoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBMaXN0PFByb2ZpbGVSZXF1ZXN0PiBzdWNjZXNzOyAvLyByZXF1aXJlZAorCisgICAgLyoqIFRoZSBzZXQgb2YgZmllbGRzIHRoaXMgc3RydWN0IGNvbnRhaW5zLCBhbG9uZyB3aXRoIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9yIGZpbmRpbmcgYW5kIG1hbmlwdWxhdGluZyB0aGVtLiAqLworICAgIHB1YmxpYyBlbnVtIF9GaWVsZHMgaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRJZEVudW0geworICAgICAgU1VDQ0VTUygoc2hvcnQpMCwgInN1Y2Nlc3MiKTsKKworICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgX0ZpZWxkcz4gYnlOYW1lID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBfRmllbGRzPigpOworCisgICAgICBzdGF0aWMgeworICAgICAgICBmb3IgKF9GaWVsZHMgZmllbGQgOiBFbnVtU2V0LmFsbE9mKF9GaWVsZHMuY2xhc3MpKSB7CisgICAgICAgICAgYnlOYW1lLnB1dChmaWVsZC5nZXRGaWVsZE5hbWUoKSwgZmllbGQpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogRmluZCB0aGUgX0ZpZWxkcyBjb25zdGFudCB0aGF0IG1hdGNoZXMgZmllbGRJZCwgb3IgbnVsbCBpZiBpdHMgbm90IGZvdW5kLgorICAgICAgICovCisgICAgICBwdWJsaWMgc3RhdGljIF9GaWVsZHMgZmluZEJ5VGhyaWZ0SWQoaW50IGZpZWxkSWQpIHsKKyAgICAgICAgc3dpdGNoKGZpZWxkSWQpIHsKKyAgICAgICAgICBjYXNlIDA6IC8vIFNVQ0NFU1MKKyAgICAgICAgICAgIHJldHVybiBTVUNDRVNTOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEZpbmQgdGhlIF9GaWVsZHMgY29uc3RhbnQgdGhhdCBtYXRjaGVzIGZpZWxkSWQsIHRocm93aW5nIGFuIGV4Y2VwdGlvbgorICAgICAgICogaWYgaXQgaXMgbm90IGZvdW5kLgorICAgICAgICovCisgICAgICBwdWJsaWMgc3RhdGljIF9GaWVsZHMgZmluZEJ5VGhyaWZ0SWRPclRocm93KGludCBmaWVsZElkKSB7CisgICAgICAgIF9GaWVsZHMgZmllbGRzID0gZmluZEJ5VGhyaWZ0SWQoZmllbGRJZCk7CisgICAgICAgIGlmIChmaWVsZHMgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRmllbGQgIiArIGZpZWxkSWQgKyAiIGRvZXNuJ3QgZXhpc3QhIik7CisgICAgICAgIHJldHVybiBmaWVsZHM7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogRmluZCB0aGUgX0ZpZWxkcyBjb25zdGFudCB0aGF0IG1hdGNoZXMgbmFtZSwgb3IgbnVsbCBpZiBpdHMgbm90IGZvdW5kLgorICAgICAgICovCisgICAgICBwdWJsaWMgc3RhdGljIF9GaWVsZHMgZmluZEJ5TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gYnlOYW1lLmdldChuYW1lKTsKKyAgICAgIH0KKworICAgICAgcHJpdmF0ZSBmaW5hbCBzaG9ydCBfdGhyaWZ0SWQ7CisgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBfZmllbGROYW1lOworCisgICAgICBfRmllbGRzKHNob3J0IHRocmlmdElkLCBTdHJpbmcgZmllbGROYW1lKSB7CisgICAgICAgIF90aHJpZnRJZCA9IHRocmlmdElkOworICAgICAgICBfZmllbGROYW1lID0gZmllbGROYW1lOworICAgICAgfQorCisgICAgICBwdWJsaWMgc2hvcnQgZ2V0VGhyaWZ0RmllbGRJZCgpIHsKKyAgICAgICAgcmV0dXJuIF90aHJpZnRJZDsKKyAgICAgIH0KKworICAgICAgcHVibGljIFN0cmluZyBnZXRGaWVsZE5hbWUoKSB7CisgICAgICAgIHJldHVybiBfZmllbGROYW1lOworICAgICAgfQorICAgIH0KKworICAgIC8vIGlzc2V0IGlkIGFzc2lnbm1lbnRzCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBNYXA8X0ZpZWxkcywgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGE+IG1ldGFEYXRhTWFwOworICAgIHN0YXRpYyB7CisgICAgICBNYXA8X0ZpZWxkcywgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGE+IHRtcE1hcCA9IG5ldyBFbnVtTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPihfRmllbGRzLmNsYXNzKTsKKyAgICAgIHRtcE1hcC5wdXQoX0ZpZWxkcy5TVUNDRVNTLCBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEoInN1Y2Nlc3MiLCBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRSZXF1aXJlbWVudFR5cGUuREVGQVVMVCwgCisgICAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5MaXN0TWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTElTVCwgCisgICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuU3RydWN0TWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNULCBQcm9maWxlUmVxdWVzdC5jbGFzcykpKSk7CisgICAgICBtZXRhRGF0YU1hcCA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcCh0bXBNYXApOworICAgICAgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEuYWRkU3RydWN0TWV0YURhdGFNYXAoZ2V0Q29tcG9uZW50UGVuZGluZ1Byb2ZpbGVBY3Rpb25zX3Jlc3VsdC5jbGFzcywgbWV0YURhdGFNYXApOworICAgIH0KKworICAgIHB1YmxpYyBnZXRDb21wb25lbnRQZW5kaW5nUHJvZmlsZUFjdGlvbnNfcmVzdWx0KCkgeworICAgIH0KKworICAgIHB1YmxpYyBnZXRDb21wb25lbnRQZW5kaW5nUHJvZmlsZUFjdGlvbnNfcmVzdWx0KAorICAgICAgTGlzdDxQcm9maWxlUmVxdWVzdD4gc3VjY2VzcykKKyAgICB7CisgICAgICB0aGlzKCk7CisgICAgICB0aGlzLnN1Y2Nlc3MgPSBzdWNjZXNzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBlcmZvcm1zIGEgZGVlcCBjb3B5IG9uIDxpPm90aGVyPC9pPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgZ2V0Q29tcG9uZW50UGVuZGluZ1Byb2ZpbGVBY3Rpb25zX3Jlc3VsdChnZXRDb21wb25lbnRQZW5kaW5nUHJvZmlsZUFjdGlvbnNfcmVzdWx0IG90aGVyKSB7CisgICAgICBpZiAob3RoZXIuaXNfc2V0X3N1Y2Nlc3MoKSkgeworICAgICAgICBMaXN0PFByb2ZpbGVSZXF1ZXN0PiBfX3RoaXNfX3N1Y2Nlc3MgPSBuZXcgQXJyYXlMaXN0PFByb2ZpbGVSZXF1ZXN0PihvdGhlci5zdWNjZXNzLnNpemUoKSk7CisgICAgICAgIGZvciAoUHJvZmlsZVJlcXVlc3Qgb3RoZXJfZWxlbWVudCA6IG90aGVyLnN1Y2Nlc3MpIHsKKyAgICAgICAgICBfX3RoaXNfX3N1Y2Nlc3MuYWRkKG5ldyBQcm9maWxlUmVxdWVzdChvdGhlcl9lbGVtZW50KSk7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5zdWNjZXNzID0gX190aGlzX19zdWNjZXNzOworICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBnZXRDb21wb25lbnRQZW5kaW5nUHJvZmlsZUFjdGlvbnNfcmVzdWx0IGRlZXBDb3B5KCkgeworICAgICAgcmV0dXJuIG5ldyBnZXRDb21wb25lbnRQZW5kaW5nUHJvZmlsZUFjdGlvbnNfcmVzdWx0KHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgdGhpcy5zdWNjZXNzID0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldF9zdWNjZXNzX3NpemUoKSB7CisgICAgICByZXR1cm4gKHRoaXMuc3VjY2VzcyA9PSBudWxsKSA/IDAgOiB0aGlzLnN1Y2Nlc3Muc2l6ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBqYXZhLnV0aWwuSXRlcmF0b3I8UHJvZmlsZVJlcXVlc3Q+IGdldF9zdWNjZXNzX2l0ZXJhdG9yKCkgeworICAgICAgcmV0dXJuICh0aGlzLnN1Y2Nlc3MgPT0gbnVsbCkgPyBudWxsIDogdGhpcy5zdWNjZXNzLml0ZXJhdG9yKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkX3RvX3N1Y2Nlc3MoUHJvZmlsZVJlcXVlc3QgZWxlbSkgeworICAgICAgaWYgKHRoaXMuc3VjY2VzcyA9PSBudWxsKSB7CisgICAgICAgIHRoaXMuc3VjY2VzcyA9IG5ldyBBcnJheUxpc3Q8UHJvZmlsZVJlcXVlc3Q+KCk7CisgICAgICB9CisgICAgICB0aGlzLnN1Y2Nlc3MuYWRkKGVsZW0pOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PFByb2ZpbGVSZXF1ZXN0PiBnZXRfc3VjY2VzcygpIHsKKyAgICAgIHJldHVybiB0aGlzLnN1Y2Nlc3M7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0X3N1Y2Nlc3MoTGlzdDxQcm9maWxlUmVxdWVzdD4gc3VjY2VzcykgeworICAgICAgdGhpcy5zdWNjZXNzID0gc3VjY2VzczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1bnNldF9zdWNjZXNzKCkgeworICAgICAgdGhpcy5zdWNjZXNzID0gbnVsbDsKKyAgICB9CisKKyAgICAvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkIHN1Y2Nlc3MgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgICAgcHVibGljIGJvb2xlYW4gaXNfc2V0X3N1Y2Nlc3MoKSB7CisgICAgICByZXR1cm4gdGhpcy5zdWNjZXNzICE9IG51bGw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0X3N1Y2Nlc3NfaXNTZXQoYm9vbGVhbiB2YWx1ZSkgeworICAgICAgaWYgKCF2YWx1ZSkgeworICAgICAgICB0aGlzLnN1Y2Nlc3MgPSBudWxsOworICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEZpZWxkVmFsdWUoX0ZpZWxkcyBmaWVsZCwgT2JqZWN0IHZhbHVlKSB7CisgICAgICBzd2l0Y2ggKGZpZWxkKSB7CisgICAgICBjYXNlIFNVQ0NFU1M6CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgdW5zZXRfc3VjY2VzcygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHNldF9zdWNjZXNzKChMaXN0PFByb2ZpbGVSZXF1ZXN0Pil2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldEZpZWxkVmFsdWUoX0ZpZWxkcyBmaWVsZCkgeworICAgICAgc3dpdGNoIChmaWVsZCkgeworICAgICAgY2FzZSBTVUNDRVNTOgorICAgICAgICByZXR1cm4gZ2V0X3N1Y2Nlc3MoKTsKKworICAgICAgfQorICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgIH0KKworICAgIC8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgY29ycmVzcG9uZGluZyB0byBmaWVsZElEIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLworICAgIHB1YmxpYyBib29sZWFuIGlzU2V0KF9GaWVsZHMgZmllbGQpIHsKKyAgICAgIGlmIChmaWVsZCA9PSBudWxsKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgIH0KKworICAgICAgc3dpdGNoIChmaWVsZCkgeworICAgICAgY2FzZSBTVUNDRVNTOgorICAgICAgICByZXR1cm4gaXNfc2V0X3N1Y2Nlc3MoKTsKKyAgICAgIH0KKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IHRoYXQpIHsKKyAgICAgIGlmICh0aGF0ID09IG51bGwpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGlmICh0aGF0IGluc3RhbmNlb2YgZ2V0Q29tcG9uZW50UGVuZGluZ1Byb2ZpbGVBY3Rpb25zX3Jlc3VsdCkKKyAgICAgICAgcmV0dXJuIHRoaXMuZXF1YWxzKChnZXRDb21wb25lbnRQZW5kaW5nUHJvZmlsZUFjdGlvbnNfcmVzdWx0KXRoYXQpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhnZXRDb21wb25lbnRQZW5kaW5nUHJvZmlsZUFjdGlvbnNfcmVzdWx0IHRoYXQpIHsKKyAgICAgIGlmICh0aGF0ID09IG51bGwpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgYm9vbGVhbiB0aGlzX3ByZXNlbnRfc3VjY2VzcyA9IHRydWUgJiYgdGhpcy5pc19zZXRfc3VjY2VzcygpOworICAgICAgYm9vbGVhbiB0aGF0X3ByZXNlbnRfc3VjY2VzcyA9IHRydWUgJiYgdGhhdC5pc19zZXRfc3VjY2VzcygpOworICAgICAgaWYgKHRoaXNfcHJlc2VudF9zdWNjZXNzIHx8IHRoYXRfcHJlc2VudF9zdWNjZXNzKSB7CisgICAgICAgIGlmICghKHRoaXNfcHJlc2VudF9zdWNjZXNzICYmIHRoYXRfcHJlc2VudF9zdWNjZXNzKSkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghdGhpcy5zdWNjZXNzLmVxdWFscyh0aGF0LnN1Y2Nlc3MpKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgIExpc3Q8T2JqZWN0PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7CisKKyAgICAgIGJvb2xlYW4gcHJlc2VudF9zdWNjZXNzID0gdHJ1ZSAmJiAoaXNfc2V0X3N1Y2Nlc3MoKSk7CisgICAgICBsaXN0LmFkZChwcmVzZW50X3N1Y2Nlc3MpOworICAgICAgaWYgKHByZXNlbnRfc3VjY2VzcykKKyAgICAgICAgbGlzdC5hZGQoc3VjY2Vzcyk7CisKKyAgICAgIHJldHVybiBsaXN0Lmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBjb21wYXJlVG8oZ2V0Q29tcG9uZW50UGVuZGluZ1Byb2ZpbGVBY3Rpb25zX3Jlc3VsdCBvdGhlcikgeworICAgICAgaWYgKCFnZXRDbGFzcygpLmVxdWFscyhvdGhlci5nZXRDbGFzcygpKSkgeworICAgICAgICByZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCkuY29tcGFyZVRvKG90aGVyLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgIH0KKworICAgICAgaW50IGxhc3RDb21wYXJpc29uID0gMDsKKworICAgICAgbGFzdENvbXBhcmlzb24gPSBCb29sZWFuLnZhbHVlT2YoaXNfc2V0X3N1Y2Nlc3MoKSkuY29tcGFyZVRvKG90aGVyLmlzX3NldF9zdWNjZXNzKCkpOworICAgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgICAgfQorICAgICAgaWYgKGlzX3NldF9zdWNjZXNzKCkpIHsKKyAgICAgICAgbGFzdENvbXBhcmlzb24gPSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy5zdWNjZXNzLCBvdGhlci5zdWNjZXNzKTsKKyAgICAgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBfRmllbGRzIGZpZWxkRm9ySWQoaW50IGZpZWxkSWQpIHsKKyAgICAgIHJldHVybiBfRmllbGRzLmZpbmRCeVRocmlmdElkKGZpZWxkSWQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlYWQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIGlwcm90KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICBzY2hlbWVzLmdldChpcHJvdC5nZXRTY2hlbWUoKSkuZ2V0U2NoZW1lKCkucmVhZChpcHJvdCwgdGhpcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIG9wcm90KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICBzY2hlbWVzLmdldChvcHJvdC5nZXRTY2hlbWUoKSkuZ2V0U2NoZW1lKCkud3JpdGUob3Byb3QsIHRoaXMpOworICAgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigiZ2V0Q29tcG9uZW50UGVuZGluZ1Byb2ZpbGVBY3Rpb25zX3Jlc3VsdCgiKTsKKyAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOworCisgICAgICBzYi5hcHBlbmQoInN1Y2Nlc3M6Iik7CisgICAgICBpZiAodGhpcy5zdWNjZXNzID09IG51bGwpIHsKKyAgICAgICAgc2IuYXBwZW5kKCJudWxsIik7CisgICAgICB9IGVsc2UgeworICAgICAgICBzYi5hcHBlbmQodGhpcy5zdWNjZXNzKTsKKyAgICAgIH0KKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICBzYi5hcHBlbmQoIikiKTsKKyAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgLy8gY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcworICAgICAgLy8gY2hlY2sgZm9yIHN1Yi1zdHJ1Y3QgdmFsaWRpdHkKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICB0cnkgeworICAgICAgICB3cml0ZShuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbChuZXcgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRJT1N0cmVhbVRyYW5zcG9ydChvdXQpKSk7CisgICAgICB9IGNhdGNoIChvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHRlKSB7CisgICAgICAgIHRocm93IG5ldyBqYXZhLmlvLklPRXhjZXB0aW9uKHRlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVhZE9iamVjdChqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtIGluKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICB0cnkgeworICAgICAgICByZWFkKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQ29tcGFjdFByb3RvY29sKG5ldyBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVElPU3RyZWFtVHJhbnNwb3J0KGluKSkpOworICAgICAgfSBjYXRjaCAob3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB0ZSkgeworICAgICAgICB0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbih0ZSk7CisgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgZ2V0Q29tcG9uZW50UGVuZGluZ1Byb2ZpbGVBY3Rpb25zX3Jlc3VsdFN0YW5kYXJkU2NoZW1lRmFjdG9yeSBpbXBsZW1lbnRzIFNjaGVtZUZhY3RvcnkgeworICAgICAgcHVibGljIGdldENvbXBvbmVudFBlbmRpbmdQcm9maWxlQWN0aW9uc19yZXN1bHRTdGFuZGFyZFNjaGVtZSBnZXRTY2hlbWUoKSB7CisgICAgICAgIHJldHVybiBuZXcgZ2V0Q29tcG9uZW50UGVuZGluZ1Byb2ZpbGVBY3Rpb25zX3Jlc3VsdFN0YW5kYXJkU2NoZW1lKCk7CisgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgZ2V0Q29tcG9uZW50UGVuZGluZ1Byb2ZpbGVBY3Rpb25zX3Jlc3VsdFN0YW5kYXJkU2NoZW1lIGV4dGVuZHMgU3RhbmRhcmRTY2hlbWU8Z2V0Q29tcG9uZW50UGVuZGluZ1Byb2ZpbGVBY3Rpb25zX3Jlc3VsdD4geworCisgICAgICBwdWJsaWMgdm9pZCByZWFkKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBpcHJvdCwgZ2V0Q29tcG9uZW50UGVuZGluZ1Byb2ZpbGVBY3Rpb25zX3Jlc3VsdCBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIHNjaGVtZUZpZWxkOworICAgICAgICBpcHJvdC5yZWFkU3RydWN0QmVnaW4oKTsKKyAgICAgICAgd2hpbGUgKHRydWUpCisgICAgICAgIHsKKyAgICAgICAgICBzY2hlbWVGaWVsZCA9IGlwcm90LnJlYWRGaWVsZEJlZ2luKCk7CisgICAgICAgICAgaWYgKHNjaGVtZUZpZWxkLnR5cGUgPT0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RPUCkgeyAKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0KKyAgICAgICAgICBzd2l0Y2ggKHNjaGVtZUZpZWxkLmlkKSB7CisgICAgICAgICAgICBjYXNlIDA6IC8vIFNVQ0NFU1MKKyAgICAgICAgICAgICAgaWYgKHNjaGVtZUZpZWxkLnR5cGUgPT0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTElTVCkgeworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRMaXN0IF9saXN0NzIyID0gaXByb3QucmVhZExpc3RCZWdpbigpOworICAgICAgICAgICAgICAgICAgc3RydWN0LnN1Y2Nlc3MgPSBuZXcgQXJyYXlMaXN0PFByb2ZpbGVSZXF1ZXN0PihfbGlzdDcyMi5zaXplKTsKKyAgICAgICAgICAgICAgICAgIFByb2ZpbGVSZXF1ZXN0IF9lbGVtNzIzOworICAgICAgICAgICAgICAgICAgZm9yIChpbnQgX2k3MjQgPSAwOyBfaTcyNCA8IF9saXN0NzIyLnNpemU7ICsrX2k3MjQpCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIF9lbGVtNzIzID0gbmV3IFByb2ZpbGVSZXF1ZXN0KCk7CisgICAgICAgICAgICAgICAgICAgIF9lbGVtNzIzLnJlYWQoaXByb3QpOworICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Quc3VjY2Vzcy5hZGQoX2VsZW03MjMpOworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgaXByb3QucmVhZExpc3RFbmQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RydWN0LnNldF9zdWNjZXNzX2lzU2V0KHRydWUpOworICAgICAgICAgICAgICB9IGVsc2UgeyAKKyAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKKyAgICAgICAgICB9CisgICAgICAgICAgaXByb3QucmVhZEZpZWxkRW5kKCk7CisgICAgICAgIH0KKyAgICAgICAgaXByb3QucmVhZFN0cnVjdEVuZCgpOworICAgICAgICBzdHJ1Y3QudmFsaWRhdGUoKTsKKyAgICAgIH0KKworICAgICAgcHVibGljIHZvaWQgd3JpdGUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIG9wcm90LCBnZXRDb21wb25lbnRQZW5kaW5nUHJvZmlsZUFjdGlvbnNfcmVzdWx0IHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgICBzdHJ1Y3QudmFsaWRhdGUoKTsKKworICAgICAgICBvcHJvdC53cml0ZVN0cnVjdEJlZ2luKFNUUlVDVF9ERVNDKTsKKyAgICAgICAgaWYgKHN0cnVjdC5zdWNjZXNzICE9IG51bGwpIHsKKyAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oU1VDQ0VTU19GSUVMRF9ERVNDKTsKKyAgICAgICAgICB7CisgICAgICAgICAgICBvcHJvdC53cml0ZUxpc3RCZWdpbihuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVExpc3Qob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNULCBzdHJ1Y3Quc3VjY2Vzcy5zaXplKCkpKTsKKyAgICAgICAgICAgIGZvciAoUHJvZmlsZVJlcXVlc3QgX2l0ZXI3MjUgOiBzdHJ1Y3Quc3VjY2VzcykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2l0ZXI3MjUud3JpdGUob3Byb3QpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3Byb3Qud3JpdGVMaXN0RW5kKCk7CisgICAgICAgICAgfQorICAgICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICAgICAgfQorICAgICAgICBvcHJvdC53cml0ZUZpZWxkU3RvcCgpOworICAgICAgICBvcHJvdC53cml0ZVN0cnVjdEVuZCgpOworICAgICAgfQorCisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgZ2V0Q29tcG9uZW50UGVuZGluZ1Byb2ZpbGVBY3Rpb25zX3Jlc3VsdFR1cGxlU2NoZW1lRmFjdG9yeSBpbXBsZW1lbnRzIFNjaGVtZUZhY3RvcnkgeworICAgICAgcHVibGljIGdldENvbXBvbmVudFBlbmRpbmdQcm9maWxlQWN0aW9uc19yZXN1bHRUdXBsZVNjaGVtZSBnZXRTY2hlbWUoKSB7CisgICAgICAgIHJldHVybiBuZXcgZ2V0Q29tcG9uZW50UGVuZGluZ1Byb2ZpbGVBY3Rpb25zX3Jlc3VsdFR1cGxlU2NoZW1lKCk7CisgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgZ2V0Q29tcG9uZW50UGVuZGluZ1Byb2ZpbGVBY3Rpb25zX3Jlc3VsdFR1cGxlU2NoZW1lIGV4dGVuZHMgVHVwbGVTY2hlbWU8Z2V0Q29tcG9uZW50UGVuZGluZ1Byb2ZpbGVBY3Rpb25zX3Jlc3VsdD4geworCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBwcm90LCBnZXRDb21wb25lbnRQZW5kaW5nUHJvZmlsZUFjdGlvbnNfcmVzdWx0IHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgICBUVHVwbGVQcm90b2NvbCBvcHJvdCA9IChUVHVwbGVQcm90b2NvbCkgcHJvdDsKKyAgICAgICAgQml0U2V0IG9wdGlvbmFscyA9IG5ldyBCaXRTZXQoKTsKKyAgICAgICAgaWYgKHN0cnVjdC5pc19zZXRfc3VjY2VzcygpKSB7CisgICAgICAgICAgb3B0aW9uYWxzLnNldCgwKTsKKyAgICAgICAgfQorICAgICAgICBvcHJvdC53cml0ZUJpdFNldChvcHRpb25hbHMsIDEpOworICAgICAgICBpZiAoc3RydWN0LmlzX3NldF9zdWNjZXNzKCkpIHsKKyAgICAgICAgICB7CisgICAgICAgICAgICBvcHJvdC53cml0ZUkzMihzdHJ1Y3Quc3VjY2Vzcy5zaXplKCkpOworICAgICAgICAgICAgZm9yIChQcm9maWxlUmVxdWVzdCBfaXRlcjcyNiA6IHN0cnVjdC5zdWNjZXNzKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBfaXRlcjcyNi53cml0ZShvcHJvdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgcmVhZChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgcHJvdCwgZ2V0Q29tcG9uZW50UGVuZGluZ1Byb2ZpbGVBY3Rpb25zX3Jlc3VsdCBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgICAgVFR1cGxlUHJvdG9jb2wgaXByb3QgPSAoVFR1cGxlUHJvdG9jb2wpIHByb3Q7CisgICAgICAgIEJpdFNldCBpbmNvbWluZyA9IGlwcm90LnJlYWRCaXRTZXQoMSk7CisgICAgICAgIGlmIChpbmNvbWluZy5nZXQoMCkpIHsKKyAgICAgICAgICB7CisgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTGlzdCBfbGlzdDcyNyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTGlzdChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIGlwcm90LnJlYWRJMzIoKSk7CisgICAgICAgICAgICBzdHJ1Y3Quc3VjY2VzcyA9IG5ldyBBcnJheUxpc3Q8UHJvZmlsZVJlcXVlc3Q+KF9saXN0NzI3LnNpemUpOworICAgICAgICAgICAgUHJvZmlsZVJlcXVlc3QgX2VsZW03Mjg7CisgICAgICAgICAgICBmb3IgKGludCBfaTcyOSA9IDA7IF9pNzI5IDwgX2xpc3Q3Mjcuc2l6ZTsgKytfaTcyOSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgX2VsZW03MjggPSBuZXcgUHJvZmlsZVJlcXVlc3QoKTsKKyAgICAgICAgICAgICAgX2VsZW03MjgucmVhZChpcHJvdCk7CisgICAgICAgICAgICAgIHN0cnVjdC5zdWNjZXNzLmFkZChfZWxlbTcyOCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIHN0cnVjdC5zZXRfc3VjY2Vzc19pc1NldCh0cnVlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICB9CisKICAgcHVibGljIHN0YXRpYyBjbGFzcyB1cGxvYWROZXdDcmVkZW50aWFsc19hcmdzIGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2U8dXBsb2FkTmV3Q3JlZGVudGlhbHNfYXJncywgdXBsb2FkTmV3Q3JlZGVudGlhbHNfYXJncy5fRmllbGRzPiwgamF2YS5pby5TZXJpYWxpemFibGUsIENsb25lYWJsZSwgQ29tcGFyYWJsZTx1cGxvYWROZXdDcmVkZW50aWFsc19hcmdzPiAgIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0IFNUUlVDVF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QoInVwbG9hZE5ld0NyZWRlbnRpYWxzX2FyZ3MiKTsKIApAQCAtMTk5MTEsNiArMjQwNTksMjM4OCBAQAogCiAgIH0KIAorICBwdWJsaWMgc3RhdGljIGNsYXNzIGdldFRvcG9sb2d5UGFnZUluZm9fYXJncyBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlPGdldFRvcG9sb2d5UGFnZUluZm9fYXJncywgZ2V0VG9wb2xvZ3lQYWdlSW5mb19hcmdzLl9GaWVsZHM+LCBqYXZhLmlvLlNlcmlhbGl6YWJsZSwgQ2xvbmVhYmxlLCBDb21wYXJhYmxlPGdldFRvcG9sb2d5UGFnZUluZm9fYXJncz4gICB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdCBTVFJVQ1RfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0KCJnZXRUb3BvbG9neVBhZ2VJbmZvX2FyZ3MiKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBJRF9GSUVMRF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCgiaWQiLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcsIChzaG9ydCkxKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgV0lORE9XX0ZJRUxEX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkKCJ3aW5kb3ciLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcsIChzaG9ydCkyKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgSVNfSU5DTFVERV9TWVNfRklFTERfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQoImlzX2luY2x1ZGVfc3lzIiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuQk9PTCwgKHNob3J0KTMpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPENsYXNzPD8gZXh0ZW5kcyBJU2NoZW1lPiwgU2NoZW1lRmFjdG9yeT4gc2NoZW1lcyA9IG5ldyBIYXNoTWFwPENsYXNzPD8gZXh0ZW5kcyBJU2NoZW1lPiwgU2NoZW1lRmFjdG9yeT4oKTsKKyAgICBzdGF0aWMgeworICAgICAgc2NoZW1lcy5wdXQoU3RhbmRhcmRTY2hlbWUuY2xhc3MsIG5ldyBnZXRUb3BvbG9neVBhZ2VJbmZvX2FyZ3NTdGFuZGFyZFNjaGVtZUZhY3RvcnkoKSk7CisgICAgICBzY2hlbWVzLnB1dChUdXBsZVNjaGVtZS5jbGFzcywgbmV3IGdldFRvcG9sb2d5UGFnZUluZm9fYXJnc1R1cGxlU2NoZW1lRmFjdG9yeSgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBpZDsgLy8gcmVxdWlyZWQKKyAgICBwcml2YXRlIFN0cmluZyB3aW5kb3c7IC8vIHJlcXVpcmVkCisgICAgcHJpdmF0ZSBib29sZWFuIGlzX2luY2x1ZGVfc3lzOyAvLyByZXF1aXJlZAorCisgICAgLyoqIFRoZSBzZXQgb2YgZmllbGRzIHRoaXMgc3RydWN0IGNvbnRhaW5zLCBhbG9uZyB3aXRoIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9yIGZpbmRpbmcgYW5kIG1hbmlwdWxhdGluZyB0aGVtLiAqLworICAgIHB1YmxpYyBlbnVtIF9GaWVsZHMgaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRJZEVudW0geworICAgICAgSUQoKHNob3J0KTEsICJpZCIpLAorICAgICAgV0lORE9XKChzaG9ydCkyLCAid2luZG93IiksCisgICAgICBJU19JTkNMVURFX1NZUygoc2hvcnQpMywgImlzX2luY2x1ZGVfc3lzIik7CisKKyAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsIF9GaWVsZHM+IGJ5TmFtZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgX0ZpZWxkcz4oKTsKKworICAgICAgc3RhdGljIHsKKyAgICAgICAgZm9yIChfRmllbGRzIGZpZWxkIDogRW51bVNldC5hbGxPZihfRmllbGRzLmNsYXNzKSkgeworICAgICAgICAgIGJ5TmFtZS5wdXQoZmllbGQuZ2V0RmllbGROYW1lKCksIGZpZWxkKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEZpbmQgdGhlIF9GaWVsZHMgY29uc3RhbnQgdGhhdCBtYXRjaGVzIGZpZWxkSWQsIG9yIG51bGwgaWYgaXRzIG5vdCBmb3VuZC4KKyAgICAgICAqLworICAgICAgcHVibGljIHN0YXRpYyBfRmllbGRzIGZpbmRCeVRocmlmdElkKGludCBmaWVsZElkKSB7CisgICAgICAgIHN3aXRjaChmaWVsZElkKSB7CisgICAgICAgICAgY2FzZSAxOiAvLyBJRAorICAgICAgICAgICAgcmV0dXJuIElEOworICAgICAgICAgIGNhc2UgMjogLy8gV0lORE9XCisgICAgICAgICAgICByZXR1cm4gV0lORE9XOworICAgICAgICAgIGNhc2UgMzogLy8gSVNfSU5DTFVERV9TWVMKKyAgICAgICAgICAgIHJldHVybiBJU19JTkNMVURFX1NZUzsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBGaW5kIHRoZSBfRmllbGRzIGNvbnN0YW50IHRoYXQgbWF0Y2hlcyBmaWVsZElkLCB0aHJvd2luZyBhbiBleGNlcHRpb24KKyAgICAgICAqIGlmIGl0IGlzIG5vdCBmb3VuZC4KKyAgICAgICAqLworICAgICAgcHVibGljIHN0YXRpYyBfRmllbGRzIGZpbmRCeVRocmlmdElkT3JUaHJvdyhpbnQgZmllbGRJZCkgeworICAgICAgICBfRmllbGRzIGZpZWxkcyA9IGZpbmRCeVRocmlmdElkKGZpZWxkSWQpOworICAgICAgICBpZiAoZmllbGRzID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkZpZWxkICIgKyBmaWVsZElkICsgIiBkb2Vzbid0IGV4aXN0ISIpOworICAgICAgICByZXR1cm4gZmllbGRzOworICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEZpbmQgdGhlIF9GaWVsZHMgY29uc3RhbnQgdGhhdCBtYXRjaGVzIG5hbWUsIG9yIG51bGwgaWYgaXRzIG5vdCBmb3VuZC4KKyAgICAgICAqLworICAgICAgcHVibGljIHN0YXRpYyBfRmllbGRzIGZpbmRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGJ5TmFtZS5nZXQobmFtZSk7CisgICAgICB9CisKKyAgICAgIHByaXZhdGUgZmluYWwgc2hvcnQgX3RocmlmdElkOworICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX2ZpZWxkTmFtZTsKKworICAgICAgX0ZpZWxkcyhzaG9ydCB0aHJpZnRJZCwgU3RyaW5nIGZpZWxkTmFtZSkgeworICAgICAgICBfdGhyaWZ0SWQgPSB0aHJpZnRJZDsKKyAgICAgICAgX2ZpZWxkTmFtZSA9IGZpZWxkTmFtZTsKKyAgICAgIH0KKworICAgICAgcHVibGljIHNob3J0IGdldFRocmlmdEZpZWxkSWQoKSB7CisgICAgICAgIHJldHVybiBfdGhyaWZ0SWQ7CisgICAgICB9CisKKyAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmllbGROYW1lKCkgeworICAgICAgICByZXR1cm4gX2ZpZWxkTmFtZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBpc3NldCBpZCBhc3NpZ25tZW50cworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBfX0lTX0lOQ0xVREVfU1lTX0lTU0VUX0lEID0gMDsKKyAgICBwcml2YXRlIGJ5dGUgX19pc3NldF9iaXRmaWVsZCA9IDA7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBNYXA8X0ZpZWxkcywgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGE+IG1ldGFEYXRhTWFwOworICAgIHN0YXRpYyB7CisgICAgICBNYXA8X0ZpZWxkcywgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGE+IHRtcE1hcCA9IG5ldyBFbnVtTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPihfRmllbGRzLmNsYXNzKTsKKyAgICAgIHRtcE1hcC5wdXQoX0ZpZWxkcy5JRCwgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhKCJpZCIsIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZFJlcXVpcmVtZW50VHlwZS5ERUZBVUxULCAKKyAgICAgICAgICBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkVmFsdWVNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcpKSk7CisgICAgICB0bXBNYXAucHV0KF9GaWVsZHMuV0lORE9XLCBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEoIndpbmRvdyIsIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZFJlcXVpcmVtZW50VHlwZS5ERUZBVUxULCAKKyAgICAgICAgICBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkVmFsdWVNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcpKSk7CisgICAgICB0bXBNYXAucHV0KF9GaWVsZHMuSVNfSU5DTFVERV9TWVMsIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YSgiaXNfaW5jbHVkZV9zeXMiLCBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRSZXF1aXJlbWVudFR5cGUuREVGQVVMVCwgCisgICAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZFZhbHVlTWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuQk9PTCkpKTsKKyAgICAgIG1ldGFEYXRhTWFwID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKHRtcE1hcCk7CisgICAgICBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YS5hZGRTdHJ1Y3RNZXRhRGF0YU1hcChnZXRUb3BvbG9neVBhZ2VJbmZvX2FyZ3MuY2xhc3MsIG1ldGFEYXRhTWFwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZ2V0VG9wb2xvZ3lQYWdlSW5mb19hcmdzKCkgeworICAgIH0KKworICAgIHB1YmxpYyBnZXRUb3BvbG9neVBhZ2VJbmZvX2FyZ3MoCisgICAgICBTdHJpbmcgaWQsCisgICAgICBTdHJpbmcgd2luZG93LAorICAgICAgYm9vbGVhbiBpc19pbmNsdWRlX3N5cykKKyAgICB7CisgICAgICB0aGlzKCk7CisgICAgICB0aGlzLmlkID0gaWQ7CisgICAgICB0aGlzLndpbmRvdyA9IHdpbmRvdzsKKyAgICAgIHRoaXMuaXNfaW5jbHVkZV9zeXMgPSBpc19pbmNsdWRlX3N5czsKKyAgICAgIHNldF9pc19pbmNsdWRlX3N5c19pc1NldCh0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtcyBhIGRlZXAgY29weSBvbiA8aT5vdGhlcjwvaT4uCisgICAgICovCisgICAgcHVibGljIGdldFRvcG9sb2d5UGFnZUluZm9fYXJncyhnZXRUb3BvbG9neVBhZ2VJbmZvX2FyZ3Mgb3RoZXIpIHsKKyAgICAgIF9faXNzZXRfYml0ZmllbGQgPSBvdGhlci5fX2lzc2V0X2JpdGZpZWxkOworICAgICAgaWYgKG90aGVyLmlzX3NldF9pZCgpKSB7CisgICAgICAgIHRoaXMuaWQgPSBvdGhlci5pZDsKKyAgICAgIH0KKyAgICAgIGlmIChvdGhlci5pc19zZXRfd2luZG93KCkpIHsKKyAgICAgICAgdGhpcy53aW5kb3cgPSBvdGhlci53aW5kb3c7CisgICAgICB9CisgICAgICB0aGlzLmlzX2luY2x1ZGVfc3lzID0gb3RoZXIuaXNfaW5jbHVkZV9zeXM7CisgICAgfQorCisgICAgcHVibGljIGdldFRvcG9sb2d5UGFnZUluZm9fYXJncyBkZWVwQ29weSgpIHsKKyAgICAgIHJldHVybiBuZXcgZ2V0VG9wb2xvZ3lQYWdlSW5mb19hcmdzKHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgdGhpcy5pZCA9IG51bGw7CisgICAgICB0aGlzLndpbmRvdyA9IG51bGw7CisgICAgICBzZXRfaXNfaW5jbHVkZV9zeXNfaXNTZXQoZmFsc2UpOworICAgICAgdGhpcy5pc19pbmNsdWRlX3N5cyA9IGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0X2lkKCkgeworICAgICAgcmV0dXJuIHRoaXMuaWQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0X2lkKFN0cmluZyBpZCkgeworICAgICAgdGhpcy5pZCA9IGlkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVuc2V0X2lkKCkgeworICAgICAgdGhpcy5pZCA9IG51bGw7CisgICAgfQorCisgICAgLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBpZCBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc19zZXRfaWQoKSB7CisgICAgICByZXR1cm4gdGhpcy5pZCAhPSBudWxsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldF9pZF9pc1NldChib29sZWFuIHZhbHVlKSB7CisgICAgICBpZiAoIXZhbHVlKSB7CisgICAgICAgIHRoaXMuaWQgPSBudWxsOworICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0X3dpbmRvdygpIHsKKyAgICAgIHJldHVybiB0aGlzLndpbmRvdzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRfd2luZG93KFN0cmluZyB3aW5kb3cpIHsKKyAgICAgIHRoaXMud2luZG93ID0gd2luZG93OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVuc2V0X3dpbmRvdygpIHsKKyAgICAgIHRoaXMud2luZG93ID0gbnVsbDsKKyAgICB9CisKKyAgICAvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkIHdpbmRvdyBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc19zZXRfd2luZG93KCkgeworICAgICAgcmV0dXJuIHRoaXMud2luZG93ICE9IG51bGw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0X3dpbmRvd19pc1NldChib29sZWFuIHZhbHVlKSB7CisgICAgICBpZiAoIXZhbHVlKSB7CisgICAgICAgIHRoaXMud2luZG93ID0gbnVsbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc19pc19pbmNsdWRlX3N5cygpIHsKKyAgICAgIHJldHVybiB0aGlzLmlzX2luY2x1ZGVfc3lzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldF9pc19pbmNsdWRlX3N5cyhib29sZWFuIGlzX2luY2x1ZGVfc3lzKSB7CisgICAgICB0aGlzLmlzX2luY2x1ZGVfc3lzID0gaXNfaW5jbHVkZV9zeXM7CisgICAgICBzZXRfaXNfaW5jbHVkZV9zeXNfaXNTZXQodHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdW5zZXRfaXNfaW5jbHVkZV9zeXMoKSB7CisgICAgICBfX2lzc2V0X2JpdGZpZWxkID0gRW5jb2RpbmdVdGlscy5jbGVhckJpdChfX2lzc2V0X2JpdGZpZWxkLCBfX0lTX0lOQ0xVREVfU1lTX0lTU0VUX0lEKTsKKyAgICB9CisKKyAgICAvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkIGlzX2luY2x1ZGVfc3lzIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLworICAgIHB1YmxpYyBib29sZWFuIGlzX3NldF9pc19pbmNsdWRlX3N5cygpIHsKKyAgICAgIHJldHVybiBFbmNvZGluZ1V0aWxzLnRlc3RCaXQoX19pc3NldF9iaXRmaWVsZCwgX19JU19JTkNMVURFX1NZU19JU1NFVF9JRCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0X2lzX2luY2x1ZGVfc3lzX2lzU2V0KGJvb2xlYW4gdmFsdWUpIHsKKyAgICAgIF9faXNzZXRfYml0ZmllbGQgPSBFbmNvZGluZ1V0aWxzLnNldEJpdChfX2lzc2V0X2JpdGZpZWxkLCBfX0lTX0lOQ0xVREVfU1lTX0lTU0VUX0lELCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RmllbGRWYWx1ZShfRmllbGRzIGZpZWxkLCBPYmplY3QgdmFsdWUpIHsKKyAgICAgIHN3aXRjaCAoZmllbGQpIHsKKyAgICAgIGNhc2UgSUQ6CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgdW5zZXRfaWQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzZXRfaWQoKFN0cmluZyl2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgV0lORE9XOgorICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgIHVuc2V0X3dpbmRvdygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHNldF93aW5kb3coKFN0cmluZyl2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgSVNfSU5DTFVERV9TWVM6CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgdW5zZXRfaXNfaW5jbHVkZV9zeXMoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzZXRfaXNfaW5jbHVkZV9zeXMoKEJvb2xlYW4pdmFsdWUpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICB9CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRGaWVsZFZhbHVlKF9GaWVsZHMgZmllbGQpIHsKKyAgICAgIHN3aXRjaCAoZmllbGQpIHsKKyAgICAgIGNhc2UgSUQ6CisgICAgICAgIHJldHVybiBnZXRfaWQoKTsKKworICAgICAgY2FzZSBXSU5ET1c6CisgICAgICAgIHJldHVybiBnZXRfd2luZG93KCk7CisKKyAgICAgIGNhc2UgSVNfSU5DTFVERV9TWVM6CisgICAgICAgIHJldHVybiBpc19pc19pbmNsdWRlX3N5cygpOworCisgICAgICB9CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBjb3JyZXNwb25kaW5nIHRvIGZpZWxkSUQgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTZXQoX0ZpZWxkcyBmaWVsZCkgeworICAgICAgaWYgKGZpZWxkID09IG51bGwpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgfQorCisgICAgICBzd2l0Y2ggKGZpZWxkKSB7CisgICAgICBjYXNlIElEOgorICAgICAgICByZXR1cm4gaXNfc2V0X2lkKCk7CisgICAgICBjYXNlIFdJTkRPVzoKKyAgICAgICAgcmV0dXJuIGlzX3NldF93aW5kb3coKTsKKyAgICAgIGNhc2UgSVNfSU5DTFVERV9TWVM6CisgICAgICAgIHJldHVybiBpc19zZXRfaXNfaW5jbHVkZV9zeXMoKTsKKyAgICAgIH0KKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IHRoYXQpIHsKKyAgICAgIGlmICh0aGF0ID09IG51bGwpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGlmICh0aGF0IGluc3RhbmNlb2YgZ2V0VG9wb2xvZ3lQYWdlSW5mb19hcmdzKQorICAgICAgICByZXR1cm4gdGhpcy5lcXVhbHMoKGdldFRvcG9sb2d5UGFnZUluZm9fYXJncyl0aGF0KTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZ2V0VG9wb2xvZ3lQYWdlSW5mb19hcmdzIHRoYXQpIHsKKyAgICAgIGlmICh0aGF0ID09IG51bGwpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgYm9vbGVhbiB0aGlzX3ByZXNlbnRfaWQgPSB0cnVlICYmIHRoaXMuaXNfc2V0X2lkKCk7CisgICAgICBib29sZWFuIHRoYXRfcHJlc2VudF9pZCA9IHRydWUgJiYgdGhhdC5pc19zZXRfaWQoKTsKKyAgICAgIGlmICh0aGlzX3ByZXNlbnRfaWQgfHwgdGhhdF9wcmVzZW50X2lkKSB7CisgICAgICAgIGlmICghKHRoaXNfcHJlc2VudF9pZCAmJiB0aGF0X3ByZXNlbnRfaWQpKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCF0aGlzLmlkLmVxdWFscyh0aGF0LmlkKSkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIGJvb2xlYW4gdGhpc19wcmVzZW50X3dpbmRvdyA9IHRydWUgJiYgdGhpcy5pc19zZXRfd2luZG93KCk7CisgICAgICBib29sZWFuIHRoYXRfcHJlc2VudF93aW5kb3cgPSB0cnVlICYmIHRoYXQuaXNfc2V0X3dpbmRvdygpOworICAgICAgaWYgKHRoaXNfcHJlc2VudF93aW5kb3cgfHwgdGhhdF9wcmVzZW50X3dpbmRvdykgeworICAgICAgICBpZiAoISh0aGlzX3ByZXNlbnRfd2luZG93ICYmIHRoYXRfcHJlc2VudF93aW5kb3cpKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCF0aGlzLndpbmRvdy5lcXVhbHModGhhdC53aW5kb3cpKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgYm9vbGVhbiB0aGlzX3ByZXNlbnRfaXNfaW5jbHVkZV9zeXMgPSB0cnVlOworICAgICAgYm9vbGVhbiB0aGF0X3ByZXNlbnRfaXNfaW5jbHVkZV9zeXMgPSB0cnVlOworICAgICAgaWYgKHRoaXNfcHJlc2VudF9pc19pbmNsdWRlX3N5cyB8fCB0aGF0X3ByZXNlbnRfaXNfaW5jbHVkZV9zeXMpIHsKKyAgICAgICAgaWYgKCEodGhpc19wcmVzZW50X2lzX2luY2x1ZGVfc3lzICYmIHRoYXRfcHJlc2VudF9pc19pbmNsdWRlX3N5cykpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAodGhpcy5pc19pbmNsdWRlX3N5cyAhPSB0aGF0LmlzX2luY2x1ZGVfc3lzKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgIExpc3Q8T2JqZWN0PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7CisKKyAgICAgIGJvb2xlYW4gcHJlc2VudF9pZCA9IHRydWUgJiYgKGlzX3NldF9pZCgpKTsKKyAgICAgIGxpc3QuYWRkKHByZXNlbnRfaWQpOworICAgICAgaWYgKHByZXNlbnRfaWQpCisgICAgICAgIGxpc3QuYWRkKGlkKTsKKworICAgICAgYm9vbGVhbiBwcmVzZW50X3dpbmRvdyA9IHRydWUgJiYgKGlzX3NldF93aW5kb3coKSk7CisgICAgICBsaXN0LmFkZChwcmVzZW50X3dpbmRvdyk7CisgICAgICBpZiAocHJlc2VudF93aW5kb3cpCisgICAgICAgIGxpc3QuYWRkKHdpbmRvdyk7CisKKyAgICAgIGJvb2xlYW4gcHJlc2VudF9pc19pbmNsdWRlX3N5cyA9IHRydWU7CisgICAgICBsaXN0LmFkZChwcmVzZW50X2lzX2luY2x1ZGVfc3lzKTsKKyAgICAgIGlmIChwcmVzZW50X2lzX2luY2x1ZGVfc3lzKQorICAgICAgICBsaXN0LmFkZChpc19pbmNsdWRlX3N5cyk7CisKKyAgICAgIHJldHVybiBsaXN0Lmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBjb21wYXJlVG8oZ2V0VG9wb2xvZ3lQYWdlSW5mb19hcmdzIG90aGVyKSB7CisgICAgICBpZiAoIWdldENsYXNzKCkuZXF1YWxzKG90aGVyLmdldENsYXNzKCkpKSB7CisgICAgICAgIHJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKS5jb21wYXJlVG8ob3RoZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgfQorCisgICAgICBpbnQgbGFzdENvbXBhcmlzb24gPSAwOworCisgICAgICBsYXN0Q29tcGFyaXNvbiA9IEJvb2xlYW4udmFsdWVPZihpc19zZXRfaWQoKSkuY29tcGFyZVRvKG90aGVyLmlzX3NldF9pZCgpKTsKKyAgICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICAgIH0KKyAgICAgIGlmIChpc19zZXRfaWQoKSkgeworICAgICAgICBsYXN0Q29tcGFyaXNvbiA9IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvbXBhcmVUbyh0aGlzLmlkLCBvdGhlci5pZCk7CisgICAgICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgICAgICB9CisgICAgICB9CisgICAgICBsYXN0Q29tcGFyaXNvbiA9IEJvb2xlYW4udmFsdWVPZihpc19zZXRfd2luZG93KCkpLmNvbXBhcmVUbyhvdGhlci5pc19zZXRfd2luZG93KCkpOworICAgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgICAgfQorICAgICAgaWYgKGlzX3NldF93aW5kb3coKSkgeworICAgICAgICBsYXN0Q29tcGFyaXNvbiA9IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvbXBhcmVUbyh0aGlzLndpbmRvdywgb3RoZXIud2luZG93KTsKKyAgICAgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGxhc3RDb21wYXJpc29uID0gQm9vbGVhbi52YWx1ZU9mKGlzX3NldF9pc19pbmNsdWRlX3N5cygpKS5jb21wYXJlVG8ob3RoZXIuaXNfc2V0X2lzX2luY2x1ZGVfc3lzKCkpOworICAgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgICAgfQorICAgICAgaWYgKGlzX3NldF9pc19pbmNsdWRlX3N5cygpKSB7CisgICAgICAgIGxhc3RDb21wYXJpc29uID0gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29tcGFyZVRvKHRoaXMuaXNfaW5jbHVkZV9zeXMsIG90aGVyLmlzX2luY2x1ZGVfc3lzKTsKKyAgICAgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBfRmllbGRzIGZpZWxkRm9ySWQoaW50IGZpZWxkSWQpIHsKKyAgICAgIHJldHVybiBfRmllbGRzLmZpbmRCeVRocmlmdElkKGZpZWxkSWQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlYWQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIGlwcm90KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICBzY2hlbWVzLmdldChpcHJvdC5nZXRTY2hlbWUoKSkuZ2V0U2NoZW1lKCkucmVhZChpcHJvdCwgdGhpcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIG9wcm90KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICBzY2hlbWVzLmdldChvcHJvdC5nZXRTY2hlbWUoKSkuZ2V0U2NoZW1lKCkud3JpdGUob3Byb3QsIHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoImdldFRvcG9sb2d5UGFnZUluZm9fYXJncygiKTsKKyAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOworCisgICAgICBzYi5hcHBlbmQoImlkOiIpOworICAgICAgaWYgKHRoaXMuaWQgPT0gbnVsbCkgeworICAgICAgICBzYi5hcHBlbmQoIm51bGwiKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNiLmFwcGVuZCh0aGlzLmlkKTsKKyAgICAgIH0KKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICBpZiAoIWZpcnN0KSBzYi5hcHBlbmQoIiwgIik7CisgICAgICBzYi5hcHBlbmQoIndpbmRvdzoiKTsKKyAgICAgIGlmICh0aGlzLndpbmRvdyA9PSBudWxsKSB7CisgICAgICAgIHNiLmFwcGVuZCgibnVsbCIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2IuYXBwZW5kKHRoaXMud2luZG93KTsKKyAgICAgIH0KKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICBpZiAoIWZpcnN0KSBzYi5hcHBlbmQoIiwgIik7CisgICAgICBzYi5hcHBlbmQoImlzX2luY2x1ZGVfc3lzOiIpOworICAgICAgc2IuYXBwZW5kKHRoaXMuaXNfaW5jbHVkZV9zeXMpOworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIHNiLmFwcGVuZCgiKSIpOworICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmFsaWRhdGUoKSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICAvLyBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzCisgICAgICAvLyBjaGVjayBmb3Igc3ViLXN0cnVjdCB2YWxpZGl0eQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgIHRyeSB7CisgICAgICAgIHdyaXRlKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQ29tcGFjdFByb3RvY29sKG5ldyBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVElPU3RyZWFtVHJhbnNwb3J0KG91dCkpKTsKKyAgICAgIH0gY2F0Y2ggKG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24gdGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IGphdmEuaW8uSU9FeGNlcHRpb24odGUpOworICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0KGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0gaW4pIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgIHRyeSB7CisgICAgICAgIC8vIGl0IGRvZXNuJ3Qgc2VlbSBsaWtlIHlvdSBzaG91bGQgaGF2ZSB0byBkbyB0aGlzLCBidXQgamF2YSBzZXJpYWxpemF0aW9uIGlzIHdhY2t5LCBhbmQgZG9lc24ndCBjYWxsIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgICAgICBfX2lzc2V0X2JpdGZpZWxkID0gMDsKKyAgICAgICAgcmVhZChuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbChuZXcgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRJT1N0cmVhbVRyYW5zcG9ydChpbikpKTsKKyAgICAgIH0gY2F0Y2ggKG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24gdGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IGphdmEuaW8uSU9FeGNlcHRpb24odGUpOworICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIGdldFRvcG9sb2d5UGFnZUluZm9fYXJnc1N0YW5kYXJkU2NoZW1lRmFjdG9yeSBpbXBsZW1lbnRzIFNjaGVtZUZhY3RvcnkgeworICAgICAgcHVibGljIGdldFRvcG9sb2d5UGFnZUluZm9fYXJnc1N0YW5kYXJkU2NoZW1lIGdldFNjaGVtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBnZXRUb3BvbG9neVBhZ2VJbmZvX2FyZ3NTdGFuZGFyZFNjaGVtZSgpOworICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIGdldFRvcG9sb2d5UGFnZUluZm9fYXJnc1N0YW5kYXJkU2NoZW1lIGV4dGVuZHMgU3RhbmRhcmRTY2hlbWU8Z2V0VG9wb2xvZ3lQYWdlSW5mb19hcmdzPiB7CisKKyAgICAgIHB1YmxpYyB2b2lkIHJlYWQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIGlwcm90LCBnZXRUb3BvbG9neVBhZ2VJbmZvX2FyZ3Mgc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBzY2hlbWVGaWVsZDsKKyAgICAgICAgaXByb3QucmVhZFN0cnVjdEJlZ2luKCk7CisgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICB7CisgICAgICAgICAgc2NoZW1lRmllbGQgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpOworICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUT1ApIHsgCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgc3dpdGNoIChzY2hlbWVGaWVsZC5pZCkgeworICAgICAgICAgICAgY2FzZSAxOiAvLyBJRAorICAgICAgICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcpIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QuaWQgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgc3RydWN0LnNldF9pZF9pc1NldCh0cnVlKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsgCisgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjogLy8gV0lORE9XCisgICAgICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORykgeworICAgICAgICAgICAgICAgIHN0cnVjdC53aW5kb3cgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgc3RydWN0LnNldF93aW5kb3dfaXNTZXQodHJ1ZSk7CisgICAgICAgICAgICAgIH0gZWxzZSB7IAorICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgc2NoZW1lRmllbGQudHlwZSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM6IC8vIElTX0lOQ0xVREVfU1lTCisgICAgICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkJPT0wpIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QuaXNfaW5jbHVkZV9zeXMgPSBpcHJvdC5yZWFkQm9vbCgpOworICAgICAgICAgICAgICAgIHN0cnVjdC5zZXRfaXNfaW5jbHVkZV9zeXNfaXNTZXQodHJ1ZSk7CisgICAgICAgICAgICAgIH0gZWxzZSB7IAorICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgc2NoZW1lRmllbGQudHlwZSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOworICAgICAgICAgIH0KKyAgICAgICAgICBpcHJvdC5yZWFkRmllbGRFbmQoKTsKKyAgICAgICAgfQorICAgICAgICBpcHJvdC5yZWFkU3RydWN0RW5kKCk7CisgICAgICAgIHN0cnVjdC52YWxpZGF0ZSgpOworICAgICAgfQorCisgICAgICBwdWJsaWMgdm9pZCB3cml0ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgb3Byb3QsIGdldFRvcG9sb2d5UGFnZUluZm9fYXJncyBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgICAgc3RydWN0LnZhbGlkYXRlKCk7CisKKyAgICAgICAgb3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihTVFJVQ1RfREVTQyk7CisgICAgICAgIGlmIChzdHJ1Y3QuaWQgIT0gbnVsbCkgeworICAgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihJRF9GSUVMRF9ERVNDKTsKKyAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhzdHJ1Y3QuaWQpOworICAgICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RydWN0LndpbmRvdyAhPSBudWxsKSB7CisgICAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKFdJTkRPV19GSUVMRF9ERVNDKTsKKyAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhzdHJ1Y3Qud2luZG93KTsKKyAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgICAgIH0KKyAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKElTX0lOQ0xVREVfU1lTX0ZJRUxEX0RFU0MpOworICAgICAgICBvcHJvdC53cml0ZUJvb2woc3RydWN0LmlzX2luY2x1ZGVfc3lzKTsKKyAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgICAgICBvcHJvdC53cml0ZUZpZWxkU3RvcCgpOworICAgICAgICBvcHJvdC53cml0ZVN0cnVjdEVuZCgpOworICAgICAgfQorCisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgZ2V0VG9wb2xvZ3lQYWdlSW5mb19hcmdzVHVwbGVTY2hlbWVGYWN0b3J5IGltcGxlbWVudHMgU2NoZW1lRmFjdG9yeSB7CisgICAgICBwdWJsaWMgZ2V0VG9wb2xvZ3lQYWdlSW5mb19hcmdzVHVwbGVTY2hlbWUgZ2V0U2NoZW1lKCkgeworICAgICAgICByZXR1cm4gbmV3IGdldFRvcG9sb2d5UGFnZUluZm9fYXJnc1R1cGxlU2NoZW1lKCk7CisgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgZ2V0VG9wb2xvZ3lQYWdlSW5mb19hcmdzVHVwbGVTY2hlbWUgZXh0ZW5kcyBUdXBsZVNjaGVtZTxnZXRUb3BvbG9neVBhZ2VJbmZvX2FyZ3M+IHsKKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCB3cml0ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgcHJvdCwgZ2V0VG9wb2xvZ3lQYWdlSW5mb19hcmdzIHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgICBUVHVwbGVQcm90b2NvbCBvcHJvdCA9IChUVHVwbGVQcm90b2NvbCkgcHJvdDsKKyAgICAgICAgQml0U2V0IG9wdGlvbmFscyA9IG5ldyBCaXRTZXQoKTsKKyAgICAgICAgaWYgKHN0cnVjdC5pc19zZXRfaWQoKSkgeworICAgICAgICAgIG9wdGlvbmFscy5zZXQoMCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cnVjdC5pc19zZXRfd2luZG93KCkpIHsKKyAgICAgICAgICBvcHRpb25hbHMuc2V0KDEpOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X2lzX2luY2x1ZGVfc3lzKCkpIHsKKyAgICAgICAgICBvcHRpb25hbHMuc2V0KDIpOworICAgICAgICB9CisgICAgICAgIG9wcm90LndyaXRlQml0U2V0KG9wdGlvbmFscywgMyk7CisgICAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X2lkKCkpIHsKKyAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhzdHJ1Y3QuaWQpOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X3dpbmRvdygpKSB7CisgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoc3RydWN0LndpbmRvdyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cnVjdC5pc19zZXRfaXNfaW5jbHVkZV9zeXMoKSkgeworICAgICAgICAgIG9wcm90LndyaXRlQm9vbChzdHJ1Y3QuaXNfaW5jbHVkZV9zeXMpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgcmVhZChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgcHJvdCwgZ2V0VG9wb2xvZ3lQYWdlSW5mb19hcmdzIHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgICBUVHVwbGVQcm90b2NvbCBpcHJvdCA9IChUVHVwbGVQcm90b2NvbCkgcHJvdDsKKyAgICAgICAgQml0U2V0IGluY29taW5nID0gaXByb3QucmVhZEJpdFNldCgzKTsKKyAgICAgICAgaWYgKGluY29taW5nLmdldCgwKSkgeworICAgICAgICAgIHN0cnVjdC5pZCA9IGlwcm90LnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICBzdHJ1Y3Quc2V0X2lkX2lzU2V0KHRydWUpOworICAgICAgICB9CisgICAgICAgIGlmIChpbmNvbWluZy5nZXQoMSkpIHsKKyAgICAgICAgICBzdHJ1Y3Qud2luZG93ID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICAgIHN0cnVjdC5zZXRfd2luZG93X2lzU2V0KHRydWUpOworICAgICAgICB9CisgICAgICAgIGlmIChpbmNvbWluZy5nZXQoMikpIHsKKyAgICAgICAgICBzdHJ1Y3QuaXNfaW5jbHVkZV9zeXMgPSBpcHJvdC5yZWFkQm9vbCgpOworICAgICAgICAgIHN0cnVjdC5zZXRfaXNfaW5jbHVkZV9zeXNfaXNTZXQodHJ1ZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgZ2V0VG9wb2xvZ3lQYWdlSW5mb19yZXN1bHQgaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZTxnZXRUb3BvbG9neVBhZ2VJbmZvX3Jlc3VsdCwgZ2V0VG9wb2xvZ3lQYWdlSW5mb19yZXN1bHQuX0ZpZWxkcz4sIGphdmEuaW8uU2VyaWFsaXphYmxlLCBDbG9uZWFibGUsIENvbXBhcmFibGU8Z2V0VG9wb2xvZ3lQYWdlSW5mb19yZXN1bHQ+ICAgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QgU1RSVUNUX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdCgiZ2V0VG9wb2xvZ3lQYWdlSW5mb19yZXN1bHQiKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBTVUNDRVNTX0ZJRUxEX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkKCJzdWNjZXNzIiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNULCAoc2hvcnQpMCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIEVfRklFTERfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQoImUiLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIChzaG9ydCkxKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgQVpFX0ZJRUxEX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkKCJhemUiLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIChzaG9ydCkyKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxDbGFzczw/IGV4dGVuZHMgSVNjaGVtZT4sIFNjaGVtZUZhY3Rvcnk+IHNjaGVtZXMgPSBuZXcgSGFzaE1hcDxDbGFzczw/IGV4dGVuZHMgSVNjaGVtZT4sIFNjaGVtZUZhY3Rvcnk+KCk7CisgICAgc3RhdGljIHsKKyAgICAgIHNjaGVtZXMucHV0KFN0YW5kYXJkU2NoZW1lLmNsYXNzLCBuZXcgZ2V0VG9wb2xvZ3lQYWdlSW5mb19yZXN1bHRTdGFuZGFyZFNjaGVtZUZhY3RvcnkoKSk7CisgICAgICBzY2hlbWVzLnB1dChUdXBsZVNjaGVtZS5jbGFzcywgbmV3IGdldFRvcG9sb2d5UGFnZUluZm9fcmVzdWx0VHVwbGVTY2hlbWVGYWN0b3J5KCkpOworICAgIH0KKworICAgIHByaXZhdGUgVG9wb2xvZ3lQYWdlSW5mbyBzdWNjZXNzOyAvLyByZXF1aXJlZAorICAgIHByaXZhdGUgTm90QWxpdmVFeGNlcHRpb24gZTsgLy8gcmVxdWlyZWQKKyAgICBwcml2YXRlIEF1dGhvcml6YXRpb25FeGNlcHRpb24gYXplOyAvLyByZXF1aXJlZAorCisgICAgLyoqIFRoZSBzZXQgb2YgZmllbGRzIHRoaXMgc3RydWN0IGNvbnRhaW5zLCBhbG9uZyB3aXRoIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9yIGZpbmRpbmcgYW5kIG1hbmlwdWxhdGluZyB0aGVtLiAqLworICAgIHB1YmxpYyBlbnVtIF9GaWVsZHMgaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRJZEVudW0geworICAgICAgU1VDQ0VTUygoc2hvcnQpMCwgInN1Y2Nlc3MiKSwKKyAgICAgIEUoKHNob3J0KTEsICJlIiksCisgICAgICBBWkUoKHNob3J0KTIsICJhemUiKTsKKworICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgX0ZpZWxkcz4gYnlOYW1lID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBfRmllbGRzPigpOworCisgICAgICBzdGF0aWMgeworICAgICAgICBmb3IgKF9GaWVsZHMgZmllbGQgOiBFbnVtU2V0LmFsbE9mKF9GaWVsZHMuY2xhc3MpKSB7CisgICAgICAgICAgYnlOYW1lLnB1dChmaWVsZC5nZXRGaWVsZE5hbWUoKSwgZmllbGQpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogRmluZCB0aGUgX0ZpZWxkcyBjb25zdGFudCB0aGF0IG1hdGNoZXMgZmllbGRJZCwgb3IgbnVsbCBpZiBpdHMgbm90IGZvdW5kLgorICAgICAgICovCisgICAgICBwdWJsaWMgc3RhdGljIF9GaWVsZHMgZmluZEJ5VGhyaWZ0SWQoaW50IGZpZWxkSWQpIHsKKyAgICAgICAgc3dpdGNoKGZpZWxkSWQpIHsKKyAgICAgICAgICBjYXNlIDA6IC8vIFNVQ0NFU1MKKyAgICAgICAgICAgIHJldHVybiBTVUNDRVNTOworICAgICAgICAgIGNhc2UgMTogLy8gRQorICAgICAgICAgICAgcmV0dXJuIEU7CisgICAgICAgICAgY2FzZSAyOiAvLyBBWkUKKyAgICAgICAgICAgIHJldHVybiBBWkU7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogRmluZCB0aGUgX0ZpZWxkcyBjb25zdGFudCB0aGF0IG1hdGNoZXMgZmllbGRJZCwgdGhyb3dpbmcgYW4gZXhjZXB0aW9uCisgICAgICAgKiBpZiBpdCBpcyBub3QgZm91bmQuCisgICAgICAgKi8KKyAgICAgIHB1YmxpYyBzdGF0aWMgX0ZpZWxkcyBmaW5kQnlUaHJpZnRJZE9yVGhyb3coaW50IGZpZWxkSWQpIHsKKyAgICAgICAgX0ZpZWxkcyBmaWVsZHMgPSBmaW5kQnlUaHJpZnRJZChmaWVsZElkKTsKKyAgICAgICAgaWYgKGZpZWxkcyA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJGaWVsZCAiICsgZmllbGRJZCArICIgZG9lc24ndCBleGlzdCEiKTsKKyAgICAgICAgcmV0dXJuIGZpZWxkczsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBGaW5kIHRoZSBfRmllbGRzIGNvbnN0YW50IHRoYXQgbWF0Y2hlcyBuYW1lLCBvciBudWxsIGlmIGl0cyBub3QgZm91bmQuCisgICAgICAgKi8KKyAgICAgIHB1YmxpYyBzdGF0aWMgX0ZpZWxkcyBmaW5kQnlOYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiBieU5hbWUuZ2V0KG5hbWUpOworICAgICAgfQorCisgICAgICBwcml2YXRlIGZpbmFsIHNob3J0IF90aHJpZnRJZDsKKyAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIF9maWVsZE5hbWU7CisKKyAgICAgIF9GaWVsZHMoc2hvcnQgdGhyaWZ0SWQsIFN0cmluZyBmaWVsZE5hbWUpIHsKKyAgICAgICAgX3RocmlmdElkID0gdGhyaWZ0SWQ7CisgICAgICAgIF9maWVsZE5hbWUgPSBmaWVsZE5hbWU7CisgICAgICB9CisKKyAgICAgIHB1YmxpYyBzaG9ydCBnZXRUaHJpZnRGaWVsZElkKCkgeworICAgICAgICByZXR1cm4gX3RocmlmdElkOworICAgICAgfQorCisgICAgICBwdWJsaWMgU3RyaW5nIGdldEZpZWxkTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIF9maWVsZE5hbWU7CisgICAgICB9CisgICAgfQorCisgICAgLy8gaXNzZXQgaWQgYXNzaWdubWVudHMKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE1hcDxfRmllbGRzLCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YT4gbWV0YURhdGFNYXA7CisgICAgc3RhdGljIHsKKyAgICAgIE1hcDxfRmllbGRzLCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YT4gdG1wTWFwID0gbmV3IEVudW1NYXA8X0ZpZWxkcywgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGE+KF9GaWVsZHMuY2xhc3MpOworICAgICAgdG1wTWFwLnB1dChfRmllbGRzLlNVQ0NFU1MsIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YSgic3VjY2VzcyIsIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZFJlcXVpcmVtZW50VHlwZS5ERUZBVUxULCAKKyAgICAgICAgICBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLlN0cnVjdE1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCwgVG9wb2xvZ3lQYWdlSW5mby5jbGFzcykpKTsKKyAgICAgIHRtcE1hcC5wdXQoX0ZpZWxkcy5FLCBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEoImUiLCBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRSZXF1aXJlbWVudFR5cGUuREVGQVVMVCwgCisgICAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZFZhbHVlTWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNUKSkpOworICAgICAgdG1wTWFwLnB1dChfRmllbGRzLkFaRSwgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhKCJhemUiLCBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRSZXF1aXJlbWVudFR5cGUuREVGQVVMVCwgCisgICAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZFZhbHVlTWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNUKSkpOworICAgICAgbWV0YURhdGFNYXAgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAodG1wTWFwKTsKKyAgICAgIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhLmFkZFN0cnVjdE1ldGFEYXRhTWFwKGdldFRvcG9sb2d5UGFnZUluZm9fcmVzdWx0LmNsYXNzLCBtZXRhRGF0YU1hcCk7CisgICAgfQorCisgICAgcHVibGljIGdldFRvcG9sb2d5UGFnZUluZm9fcmVzdWx0KCkgeworICAgIH0KKworICAgIHB1YmxpYyBnZXRUb3BvbG9neVBhZ2VJbmZvX3Jlc3VsdCgKKyAgICAgIFRvcG9sb2d5UGFnZUluZm8gc3VjY2VzcywKKyAgICAgIE5vdEFsaXZlRXhjZXB0aW9uIGUsCisgICAgICBBdXRob3JpemF0aW9uRXhjZXB0aW9uIGF6ZSkKKyAgICB7CisgICAgICB0aGlzKCk7CisgICAgICB0aGlzLnN1Y2Nlc3MgPSBzdWNjZXNzOworICAgICAgdGhpcy5lID0gZTsKKyAgICAgIHRoaXMuYXplID0gYXplOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBlcmZvcm1zIGEgZGVlcCBjb3B5IG9uIDxpPm90aGVyPC9pPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgZ2V0VG9wb2xvZ3lQYWdlSW5mb19yZXN1bHQoZ2V0VG9wb2xvZ3lQYWdlSW5mb19yZXN1bHQgb3RoZXIpIHsKKyAgICAgIGlmIChvdGhlci5pc19zZXRfc3VjY2VzcygpKSB7CisgICAgICAgIHRoaXMuc3VjY2VzcyA9IG5ldyBUb3BvbG9neVBhZ2VJbmZvKG90aGVyLnN1Y2Nlc3MpOworICAgICAgfQorICAgICAgaWYgKG90aGVyLmlzX3NldF9lKCkpIHsKKyAgICAgICAgdGhpcy5lID0gbmV3IE5vdEFsaXZlRXhjZXB0aW9uKG90aGVyLmUpOworICAgICAgfQorICAgICAgaWYgKG90aGVyLmlzX3NldF9hemUoKSkgeworICAgICAgICB0aGlzLmF6ZSA9IG5ldyBBdXRob3JpemF0aW9uRXhjZXB0aW9uKG90aGVyLmF6ZSk7CisgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGdldFRvcG9sb2d5UGFnZUluZm9fcmVzdWx0IGRlZXBDb3B5KCkgeworICAgICAgcmV0dXJuIG5ldyBnZXRUb3BvbG9neVBhZ2VJbmZvX3Jlc3VsdCh0aGlzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgIHRoaXMuc3VjY2VzcyA9IG51bGw7CisgICAgICB0aGlzLmUgPSBudWxsOworICAgICAgdGhpcy5hemUgPSBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBUb3BvbG9neVBhZ2VJbmZvIGdldF9zdWNjZXNzKCkgeworICAgICAgcmV0dXJuIHRoaXMuc3VjY2VzczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRfc3VjY2VzcyhUb3BvbG9neVBhZ2VJbmZvIHN1Y2Nlc3MpIHsKKyAgICAgIHRoaXMuc3VjY2VzcyA9IHN1Y2Nlc3M7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdW5zZXRfc3VjY2VzcygpIHsKKyAgICAgIHRoaXMuc3VjY2VzcyA9IG51bGw7CisgICAgfQorCisgICAgLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBzdWNjZXNzIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLworICAgIHB1YmxpYyBib29sZWFuIGlzX3NldF9zdWNjZXNzKCkgeworICAgICAgcmV0dXJuIHRoaXMuc3VjY2VzcyAhPSBudWxsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldF9zdWNjZXNzX2lzU2V0KGJvb2xlYW4gdmFsdWUpIHsKKyAgICAgIGlmICghdmFsdWUpIHsKKyAgICAgICAgdGhpcy5zdWNjZXNzID0gbnVsbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgTm90QWxpdmVFeGNlcHRpb24gZ2V0X2UoKSB7CisgICAgICByZXR1cm4gdGhpcy5lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldF9lKE5vdEFsaXZlRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRoaXMuZSA9IGU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdW5zZXRfZSgpIHsKKyAgICAgIHRoaXMuZSA9IG51bGw7CisgICAgfQorCisgICAgLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBlIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLworICAgIHB1YmxpYyBib29sZWFuIGlzX3NldF9lKCkgeworICAgICAgcmV0dXJuIHRoaXMuZSAhPSBudWxsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldF9lX2lzU2V0KGJvb2xlYW4gdmFsdWUpIHsKKyAgICAgIGlmICghdmFsdWUpIHsKKyAgICAgICAgdGhpcy5lID0gbnVsbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgQXV0aG9yaXphdGlvbkV4Y2VwdGlvbiBnZXRfYXplKCkgeworICAgICAgcmV0dXJuIHRoaXMuYXplOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldF9hemUoQXV0aG9yaXphdGlvbkV4Y2VwdGlvbiBhemUpIHsKKyAgICAgIHRoaXMuYXplID0gYXplOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVuc2V0X2F6ZSgpIHsKKyAgICAgIHRoaXMuYXplID0gbnVsbDsKKyAgICB9CisKKyAgICAvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkIGF6ZSBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc19zZXRfYXplKCkgeworICAgICAgcmV0dXJuIHRoaXMuYXplICE9IG51bGw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0X2F6ZV9pc1NldChib29sZWFuIHZhbHVlKSB7CisgICAgICBpZiAoIXZhbHVlKSB7CisgICAgICAgIHRoaXMuYXplID0gbnVsbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGaWVsZFZhbHVlKF9GaWVsZHMgZmllbGQsIE9iamVjdCB2YWx1ZSkgeworICAgICAgc3dpdGNoIChmaWVsZCkgeworICAgICAgY2FzZSBTVUNDRVNTOgorICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgIHVuc2V0X3N1Y2Nlc3MoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzZXRfc3VjY2VzcygoVG9wb2xvZ3lQYWdlSW5mbyl2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgRToKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICB1bnNldF9lKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc2V0X2UoKE5vdEFsaXZlRXhjZXB0aW9uKXZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBBWkU6CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgdW5zZXRfYXplKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc2V0X2F6ZSgoQXV0aG9yaXphdGlvbkV4Y2VwdGlvbil2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldEZpZWxkVmFsdWUoX0ZpZWxkcyBmaWVsZCkgeworICAgICAgc3dpdGNoIChmaWVsZCkgeworICAgICAgY2FzZSBTVUNDRVNTOgorICAgICAgICByZXR1cm4gZ2V0X3N1Y2Nlc3MoKTsKKworICAgICAgY2FzZSBFOgorICAgICAgICByZXR1cm4gZ2V0X2UoKTsKKworICAgICAgY2FzZSBBWkU6CisgICAgICAgIHJldHVybiBnZXRfYXplKCk7CisKKyAgICAgIH0KKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICAvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkIGNvcnJlc3BvbmRpbmcgdG8gZmllbGRJRCBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NldChfRmllbGRzIGZpZWxkKSB7CisgICAgICBpZiAoZmllbGQgPT0gbnVsbCkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICB9CisKKyAgICAgIHN3aXRjaCAoZmllbGQpIHsKKyAgICAgIGNhc2UgU1VDQ0VTUzoKKyAgICAgICAgcmV0dXJuIGlzX3NldF9zdWNjZXNzKCk7CisgICAgICBjYXNlIEU6CisgICAgICAgIHJldHVybiBpc19zZXRfZSgpOworICAgICAgY2FzZSBBWkU6CisgICAgICAgIHJldHVybiBpc19zZXRfYXplKCk7CisgICAgICB9CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCB0aGF0KSB7CisgICAgICBpZiAodGhhdCA9PSBudWxsKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBpZiAodGhhdCBpbnN0YW5jZW9mIGdldFRvcG9sb2d5UGFnZUluZm9fcmVzdWx0KQorICAgICAgICByZXR1cm4gdGhpcy5lcXVhbHMoKGdldFRvcG9sb2d5UGFnZUluZm9fcmVzdWx0KXRoYXQpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhnZXRUb3BvbG9neVBhZ2VJbmZvX3Jlc3VsdCB0aGF0KSB7CisgICAgICBpZiAodGhhdCA9PSBudWxsKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgIGJvb2xlYW4gdGhpc19wcmVzZW50X3N1Y2Nlc3MgPSB0cnVlICYmIHRoaXMuaXNfc2V0X3N1Y2Nlc3MoKTsKKyAgICAgIGJvb2xlYW4gdGhhdF9wcmVzZW50X3N1Y2Nlc3MgPSB0cnVlICYmIHRoYXQuaXNfc2V0X3N1Y2Nlc3MoKTsKKyAgICAgIGlmICh0aGlzX3ByZXNlbnRfc3VjY2VzcyB8fCB0aGF0X3ByZXNlbnRfc3VjY2VzcykgeworICAgICAgICBpZiAoISh0aGlzX3ByZXNlbnRfc3VjY2VzcyAmJiB0aGF0X3ByZXNlbnRfc3VjY2VzcykpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIXRoaXMuc3VjY2Vzcy5lcXVhbHModGhhdC5zdWNjZXNzKSkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIGJvb2xlYW4gdGhpc19wcmVzZW50X2UgPSB0cnVlICYmIHRoaXMuaXNfc2V0X2UoKTsKKyAgICAgIGJvb2xlYW4gdGhhdF9wcmVzZW50X2UgPSB0cnVlICYmIHRoYXQuaXNfc2V0X2UoKTsKKyAgICAgIGlmICh0aGlzX3ByZXNlbnRfZSB8fCB0aGF0X3ByZXNlbnRfZSkgeworICAgICAgICBpZiAoISh0aGlzX3ByZXNlbnRfZSAmJiB0aGF0X3ByZXNlbnRfZSkpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIXRoaXMuZS5lcXVhbHModGhhdC5lKSkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIGJvb2xlYW4gdGhpc19wcmVzZW50X2F6ZSA9IHRydWUgJiYgdGhpcy5pc19zZXRfYXplKCk7CisgICAgICBib29sZWFuIHRoYXRfcHJlc2VudF9hemUgPSB0cnVlICYmIHRoYXQuaXNfc2V0X2F6ZSgpOworICAgICAgaWYgKHRoaXNfcHJlc2VudF9hemUgfHwgdGhhdF9wcmVzZW50X2F6ZSkgeworICAgICAgICBpZiAoISh0aGlzX3ByZXNlbnRfYXplICYmIHRoYXRfcHJlc2VudF9hemUpKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCF0aGlzLmF6ZS5lcXVhbHModGhhdC5hemUpKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgIExpc3Q8T2JqZWN0PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7CisKKyAgICAgIGJvb2xlYW4gcHJlc2VudF9zdWNjZXNzID0gdHJ1ZSAmJiAoaXNfc2V0X3N1Y2Nlc3MoKSk7CisgICAgICBsaXN0LmFkZChwcmVzZW50X3N1Y2Nlc3MpOworICAgICAgaWYgKHByZXNlbnRfc3VjY2VzcykKKyAgICAgICAgbGlzdC5hZGQoc3VjY2Vzcyk7CisKKyAgICAgIGJvb2xlYW4gcHJlc2VudF9lID0gdHJ1ZSAmJiAoaXNfc2V0X2UoKSk7CisgICAgICBsaXN0LmFkZChwcmVzZW50X2UpOworICAgICAgaWYgKHByZXNlbnRfZSkKKyAgICAgICAgbGlzdC5hZGQoZSk7CisKKyAgICAgIGJvb2xlYW4gcHJlc2VudF9hemUgPSB0cnVlICYmIChpc19zZXRfYXplKCkpOworICAgICAgbGlzdC5hZGQocHJlc2VudF9hemUpOworICAgICAgaWYgKHByZXNlbnRfYXplKQorICAgICAgICBsaXN0LmFkZChhemUpOworCisgICAgICByZXR1cm4gbGlzdC5oYXNoQ29kZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKGdldFRvcG9sb2d5UGFnZUluZm9fcmVzdWx0IG90aGVyKSB7CisgICAgICBpZiAoIWdldENsYXNzKCkuZXF1YWxzKG90aGVyLmdldENsYXNzKCkpKSB7CisgICAgICAgIHJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKS5jb21wYXJlVG8ob3RoZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgfQorCisgICAgICBpbnQgbGFzdENvbXBhcmlzb24gPSAwOworCisgICAgICBsYXN0Q29tcGFyaXNvbiA9IEJvb2xlYW4udmFsdWVPZihpc19zZXRfc3VjY2VzcygpKS5jb21wYXJlVG8ob3RoZXIuaXNfc2V0X3N1Y2Nlc3MoKSk7CisgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICB9CisgICAgICBpZiAoaXNfc2V0X3N1Y2Nlc3MoKSkgeworICAgICAgICBsYXN0Q29tcGFyaXNvbiA9IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvbXBhcmVUbyh0aGlzLnN1Y2Nlc3MsIG90aGVyLnN1Y2Nlc3MpOworICAgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgbGFzdENvbXBhcmlzb24gPSBCb29sZWFuLnZhbHVlT2YoaXNfc2V0X2UoKSkuY29tcGFyZVRvKG90aGVyLmlzX3NldF9lKCkpOworICAgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgICAgfQorICAgICAgaWYgKGlzX3NldF9lKCkpIHsKKyAgICAgICAgbGFzdENvbXBhcmlzb24gPSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy5lLCBvdGhlci5lKTsKKyAgICAgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGxhc3RDb21wYXJpc29uID0gQm9vbGVhbi52YWx1ZU9mKGlzX3NldF9hemUoKSkuY29tcGFyZVRvKG90aGVyLmlzX3NldF9hemUoKSk7CisgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICB9CisgICAgICBpZiAoaXNfc2V0X2F6ZSgpKSB7CisgICAgICAgIGxhc3RDb21wYXJpc29uID0gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29tcGFyZVRvKHRoaXMuYXplLCBvdGhlci5hemUpOworICAgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIF9GaWVsZHMgZmllbGRGb3JJZChpbnQgZmllbGRJZCkgeworICAgICAgcmV0dXJuIF9GaWVsZHMuZmluZEJ5VGhyaWZ0SWQoZmllbGRJZCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVhZChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgaXByb3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgIHNjaGVtZXMuZ2V0KGlwcm90LmdldFNjaGVtZSgpKS5nZXRTY2hlbWUoKS5yZWFkKGlwcm90LCB0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgb3Byb3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgIHNjaGVtZXMuZ2V0KG9wcm90LmdldFNjaGVtZSgpKS5nZXRTY2hlbWUoKS53cml0ZShvcHJvdCwgdGhpcyk7CisgICAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCJnZXRUb3BvbG9neVBhZ2VJbmZvX3Jlc3VsdCgiKTsKKyAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOworCisgICAgICBzYi5hcHBlbmQoInN1Y2Nlc3M6Iik7CisgICAgICBpZiAodGhpcy5zdWNjZXNzID09IG51bGwpIHsKKyAgICAgICAgc2IuYXBwZW5kKCJudWxsIik7CisgICAgICB9IGVsc2UgeworICAgICAgICBzYi5hcHBlbmQodGhpcy5zdWNjZXNzKTsKKyAgICAgIH0KKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICBpZiAoIWZpcnN0KSBzYi5hcHBlbmQoIiwgIik7CisgICAgICBzYi5hcHBlbmQoImU6Iik7CisgICAgICBpZiAodGhpcy5lID09IG51bGwpIHsKKyAgICAgICAgc2IuYXBwZW5kKCJudWxsIik7CisgICAgICB9IGVsc2UgeworICAgICAgICBzYi5hcHBlbmQodGhpcy5lKTsKKyAgICAgIH0KKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICBpZiAoIWZpcnN0KSBzYi5hcHBlbmQoIiwgIik7CisgICAgICBzYi5hcHBlbmQoImF6ZToiKTsKKyAgICAgIGlmICh0aGlzLmF6ZSA9PSBudWxsKSB7CisgICAgICAgIHNiLmFwcGVuZCgibnVsbCIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2IuYXBwZW5kKHRoaXMuYXplKTsKKyAgICAgIH0KKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICBzYi5hcHBlbmQoIikiKTsKKyAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgLy8gY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcworICAgICAgLy8gY2hlY2sgZm9yIHN1Yi1zdHJ1Y3QgdmFsaWRpdHkKKyAgICAgIGlmIChzdWNjZXNzICE9IG51bGwpIHsKKyAgICAgICAgc3VjY2Vzcy52YWxpZGF0ZSgpOworICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgIHRyeSB7CisgICAgICAgIHdyaXRlKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQ29tcGFjdFByb3RvY29sKG5ldyBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVElPU3RyZWFtVHJhbnNwb3J0KG91dCkpKTsKKyAgICAgIH0gY2F0Y2ggKG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24gdGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IGphdmEuaW8uSU9FeGNlcHRpb24odGUpOworICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0KGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0gaW4pIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgIHRyeSB7CisgICAgICAgIHJlYWQobmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRDb21wYWN0UHJvdG9jb2wobmV3IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5USU9TdHJlYW1UcmFuc3BvcnQoaW4pKSk7CisgICAgICB9IGNhdGNoIChvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHRlKSB7CisgICAgICAgIHRocm93IG5ldyBqYXZhLmlvLklPRXhjZXB0aW9uKHRlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBnZXRUb3BvbG9neVBhZ2VJbmZvX3Jlc3VsdFN0YW5kYXJkU2NoZW1lRmFjdG9yeSBpbXBsZW1lbnRzIFNjaGVtZUZhY3RvcnkgeworICAgICAgcHVibGljIGdldFRvcG9sb2d5UGFnZUluZm9fcmVzdWx0U3RhbmRhcmRTY2hlbWUgZ2V0U2NoZW1lKCkgeworICAgICAgICByZXR1cm4gbmV3IGdldFRvcG9sb2d5UGFnZUluZm9fcmVzdWx0U3RhbmRhcmRTY2hlbWUoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBnZXRUb3BvbG9neVBhZ2VJbmZvX3Jlc3VsdFN0YW5kYXJkU2NoZW1lIGV4dGVuZHMgU3RhbmRhcmRTY2hlbWU8Z2V0VG9wb2xvZ3lQYWdlSW5mb19yZXN1bHQ+IHsKKworICAgICAgcHVibGljIHZvaWQgcmVhZChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgaXByb3QsIGdldFRvcG9sb2d5UGFnZUluZm9fcmVzdWx0IHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgc2NoZW1lRmllbGQ7CisgICAgICAgIGlwcm90LnJlYWRTdHJ1Y3RCZWdpbigpOworICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgeworICAgICAgICAgIHNjaGVtZUZpZWxkID0gaXByb3QucmVhZEZpZWxkQmVnaW4oKTsKKyAgICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVE9QKSB7IAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIHN3aXRjaCAoc2NoZW1lRmllbGQuaWQpIHsKKyAgICAgICAgICAgIGNhc2UgMDogLy8gU1VDQ0VTUworICAgICAgICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QpIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3Quc3VjY2VzcyA9IG5ldyBUb3BvbG9neVBhZ2VJbmZvKCk7CisgICAgICAgICAgICAgICAgc3RydWN0LnN1Y2Nlc3MucmVhZChpcHJvdCk7CisgICAgICAgICAgICAgICAgc3RydWN0LnNldF9zdWNjZXNzX2lzU2V0KHRydWUpOworICAgICAgICAgICAgICB9IGVsc2UgeyAKKyAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOiAvLyBFCisgICAgICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCkgeworICAgICAgICAgICAgICAgIHN0cnVjdC5lID0gbmV3IE5vdEFsaXZlRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgc3RydWN0LmUucmVhZChpcHJvdCk7CisgICAgICAgICAgICAgICAgc3RydWN0LnNldF9lX2lzU2V0KHRydWUpOworICAgICAgICAgICAgICB9IGVsc2UgeyAKKyAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOiAvLyBBWkUKKyAgICAgICAgICAgICAgaWYgKHNjaGVtZUZpZWxkLnR5cGUgPT0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNUKSB7CisgICAgICAgICAgICAgICAgc3RydWN0LmF6ZSA9IG5ldyBBdXRob3JpemF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgc3RydWN0LmF6ZS5yZWFkKGlwcm90KTsKKyAgICAgICAgICAgICAgICBzdHJ1Y3Quc2V0X2F6ZV9pc1NldCh0cnVlKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsgCisgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgc2NoZW1lRmllbGQudHlwZSk7CisgICAgICAgICAgfQorICAgICAgICAgIGlwcm90LnJlYWRGaWVsZEVuZCgpOworICAgICAgICB9CisgICAgICAgIGlwcm90LnJlYWRTdHJ1Y3RFbmQoKTsKKyAgICAgICAgc3RydWN0LnZhbGlkYXRlKCk7CisgICAgICB9CisKKyAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBvcHJvdCwgZ2V0VG9wb2xvZ3lQYWdlSW5mb19yZXN1bHQgc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICAgIHN0cnVjdC52YWxpZGF0ZSgpOworCisgICAgICAgIG9wcm90LndyaXRlU3RydWN0QmVnaW4oU1RSVUNUX0RFU0MpOworICAgICAgICBpZiAoc3RydWN0LnN1Y2Nlc3MgIT0gbnVsbCkgeworICAgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihTVUNDRVNTX0ZJRUxEX0RFU0MpOworICAgICAgICAgIHN0cnVjdC5zdWNjZXNzLndyaXRlKG9wcm90KTsKKyAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cnVjdC5lICE9IG51bGwpIHsKKyAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oRV9GSUVMRF9ERVNDKTsKKyAgICAgICAgICBzdHJ1Y3QuZS53cml0ZShvcHJvdCk7CisgICAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJ1Y3QuYXplICE9IG51bGwpIHsKKyAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oQVpFX0ZJRUxEX0RFU0MpOworICAgICAgICAgIHN0cnVjdC5hemUud3JpdGUob3Byb3QpOworICAgICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICAgICAgfQorICAgICAgICBvcHJvdC53cml0ZUZpZWxkU3RvcCgpOworICAgICAgICBvcHJvdC53cml0ZVN0cnVjdEVuZCgpOworICAgICAgfQorCisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgZ2V0VG9wb2xvZ3lQYWdlSW5mb19yZXN1bHRUdXBsZVNjaGVtZUZhY3RvcnkgaW1wbGVtZW50cyBTY2hlbWVGYWN0b3J5IHsKKyAgICAgIHB1YmxpYyBnZXRUb3BvbG9neVBhZ2VJbmZvX3Jlc3VsdFR1cGxlU2NoZW1lIGdldFNjaGVtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBnZXRUb3BvbG9neVBhZ2VJbmZvX3Jlc3VsdFR1cGxlU2NoZW1lKCk7CisgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgZ2V0VG9wb2xvZ3lQYWdlSW5mb19yZXN1bHRUdXBsZVNjaGVtZSBleHRlbmRzIFR1cGxlU2NoZW1lPGdldFRvcG9sb2d5UGFnZUluZm9fcmVzdWx0PiB7CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgd3JpdGUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIHByb3QsIGdldFRvcG9sb2d5UGFnZUluZm9fcmVzdWx0IHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgICBUVHVwbGVQcm90b2NvbCBvcHJvdCA9IChUVHVwbGVQcm90b2NvbCkgcHJvdDsKKyAgICAgICAgQml0U2V0IG9wdGlvbmFscyA9IG5ldyBCaXRTZXQoKTsKKyAgICAgICAgaWYgKHN0cnVjdC5pc19zZXRfc3VjY2VzcygpKSB7CisgICAgICAgICAgb3B0aW9uYWxzLnNldCgwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RydWN0LmlzX3NldF9lKCkpIHsKKyAgICAgICAgICBvcHRpb25hbHMuc2V0KDEpOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X2F6ZSgpKSB7CisgICAgICAgICAgb3B0aW9uYWxzLnNldCgyKTsKKyAgICAgICAgfQorICAgICAgICBvcHJvdC53cml0ZUJpdFNldChvcHRpb25hbHMsIDMpOworICAgICAgICBpZiAoc3RydWN0LmlzX3NldF9zdWNjZXNzKCkpIHsKKyAgICAgICAgICBzdHJ1Y3Quc3VjY2Vzcy53cml0ZShvcHJvdCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cnVjdC5pc19zZXRfZSgpKSB7CisgICAgICAgICAgc3RydWN0LmUud3JpdGUob3Byb3QpOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X2F6ZSgpKSB7CisgICAgICAgICAgc3RydWN0LmF6ZS53cml0ZShvcHJvdCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCByZWFkKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBwcm90LCBnZXRUb3BvbG9neVBhZ2VJbmZvX3Jlc3VsdCBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgICAgVFR1cGxlUHJvdG9jb2wgaXByb3QgPSAoVFR1cGxlUHJvdG9jb2wpIHByb3Q7CisgICAgICAgIEJpdFNldCBpbmNvbWluZyA9IGlwcm90LnJlYWRCaXRTZXQoMyk7CisgICAgICAgIGlmIChpbmNvbWluZy5nZXQoMCkpIHsKKyAgICAgICAgICBzdHJ1Y3Quc3VjY2VzcyA9IG5ldyBUb3BvbG9neVBhZ2VJbmZvKCk7CisgICAgICAgICAgc3RydWN0LnN1Y2Nlc3MucmVhZChpcHJvdCk7CisgICAgICAgICAgc3RydWN0LnNldF9zdWNjZXNzX2lzU2V0KHRydWUpOworICAgICAgICB9CisgICAgICAgIGlmIChpbmNvbWluZy5nZXQoMSkpIHsKKyAgICAgICAgICBzdHJ1Y3QuZSA9IG5ldyBOb3RBbGl2ZUV4Y2VwdGlvbigpOworICAgICAgICAgIHN0cnVjdC5lLnJlYWQoaXByb3QpOworICAgICAgICAgIHN0cnVjdC5zZXRfZV9pc1NldCh0cnVlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5jb21pbmcuZ2V0KDIpKSB7CisgICAgICAgICAgc3RydWN0LmF6ZSA9IG5ldyBBdXRob3JpemF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgICAgc3RydWN0LmF6ZS5yZWFkKGlwcm90KTsKKyAgICAgICAgICBzdHJ1Y3Quc2V0X2F6ZV9pc1NldCh0cnVlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICB9CisKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBnZXRDb21wb25lbnRQYWdlSW5mb19hcmdzIGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2U8Z2V0Q29tcG9uZW50UGFnZUluZm9fYXJncywgZ2V0Q29tcG9uZW50UGFnZUluZm9fYXJncy5fRmllbGRzPiwgamF2YS5pby5TZXJpYWxpemFibGUsIENsb25lYWJsZSwgQ29tcGFyYWJsZTxnZXRDb21wb25lbnRQYWdlSW5mb19hcmdzPiAgIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0IFNUUlVDVF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QoImdldENvbXBvbmVudFBhZ2VJbmZvX2FyZ3MiKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBUT1BPTE9HWV9JRF9GSUVMRF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCgidG9wb2xvZ3lfaWQiLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcsIChzaG9ydCkxKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgQ09NUE9ORU5UX0lEX0ZJRUxEX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkKCJjb21wb25lbnRfaWQiLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcsIChzaG9ydCkyKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgV0lORE9XX0ZJRUxEX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkKCJ3aW5kb3ciLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcsIChzaG9ydCkzKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgSVNfSU5DTFVERV9TWVNfRklFTERfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQoImlzX2luY2x1ZGVfc3lzIiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuQk9PTCwgKHNob3J0KTQpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPENsYXNzPD8gZXh0ZW5kcyBJU2NoZW1lPiwgU2NoZW1lRmFjdG9yeT4gc2NoZW1lcyA9IG5ldyBIYXNoTWFwPENsYXNzPD8gZXh0ZW5kcyBJU2NoZW1lPiwgU2NoZW1lRmFjdG9yeT4oKTsKKyAgICBzdGF0aWMgeworICAgICAgc2NoZW1lcy5wdXQoU3RhbmRhcmRTY2hlbWUuY2xhc3MsIG5ldyBnZXRDb21wb25lbnRQYWdlSW5mb19hcmdzU3RhbmRhcmRTY2hlbWVGYWN0b3J5KCkpOworICAgICAgc2NoZW1lcy5wdXQoVHVwbGVTY2hlbWUuY2xhc3MsIG5ldyBnZXRDb21wb25lbnRQYWdlSW5mb19hcmdzVHVwbGVTY2hlbWVGYWN0b3J5KCkpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIHRvcG9sb2d5X2lkOyAvLyByZXF1aXJlZAorICAgIHByaXZhdGUgU3RyaW5nIGNvbXBvbmVudF9pZDsgLy8gcmVxdWlyZWQKKyAgICBwcml2YXRlIFN0cmluZyB3aW5kb3c7IC8vIHJlcXVpcmVkCisgICAgcHJpdmF0ZSBib29sZWFuIGlzX2luY2x1ZGVfc3lzOyAvLyByZXF1aXJlZAorCisgICAgLyoqIFRoZSBzZXQgb2YgZmllbGRzIHRoaXMgc3RydWN0IGNvbnRhaW5zLCBhbG9uZyB3aXRoIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9yIGZpbmRpbmcgYW5kIG1hbmlwdWxhdGluZyB0aGVtLiAqLworICAgIHB1YmxpYyBlbnVtIF9GaWVsZHMgaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRJZEVudW0geworICAgICAgVE9QT0xPR1lfSUQoKHNob3J0KTEsICJ0b3BvbG9neV9pZCIpLAorICAgICAgQ09NUE9ORU5UX0lEKChzaG9ydCkyLCAiY29tcG9uZW50X2lkIiksCisgICAgICBXSU5ET1coKHNob3J0KTMsICJ3aW5kb3ciKSwKKyAgICAgIElTX0lOQ0xVREVfU1lTKChzaG9ydCk0LCAiaXNfaW5jbHVkZV9zeXMiKTsKKworICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgX0ZpZWxkcz4gYnlOYW1lID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBfRmllbGRzPigpOworCisgICAgICBzdGF0aWMgeworICAgICAgICBmb3IgKF9GaWVsZHMgZmllbGQgOiBFbnVtU2V0LmFsbE9mKF9GaWVsZHMuY2xhc3MpKSB7CisgICAgICAgICAgYnlOYW1lLnB1dChmaWVsZC5nZXRGaWVsZE5hbWUoKSwgZmllbGQpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogRmluZCB0aGUgX0ZpZWxkcyBjb25zdGFudCB0aGF0IG1hdGNoZXMgZmllbGRJZCwgb3IgbnVsbCBpZiBpdHMgbm90IGZvdW5kLgorICAgICAgICovCisgICAgICBwdWJsaWMgc3RhdGljIF9GaWVsZHMgZmluZEJ5VGhyaWZ0SWQoaW50IGZpZWxkSWQpIHsKKyAgICAgICAgc3dpdGNoKGZpZWxkSWQpIHsKKyAgICAgICAgICBjYXNlIDE6IC8vIFRPUE9MT0dZX0lECisgICAgICAgICAgICByZXR1cm4gVE9QT0xPR1lfSUQ7CisgICAgICAgICAgY2FzZSAyOiAvLyBDT01QT05FTlRfSUQKKyAgICAgICAgICAgIHJldHVybiBDT01QT05FTlRfSUQ7CisgICAgICAgICAgY2FzZSAzOiAvLyBXSU5ET1cKKyAgICAgICAgICAgIHJldHVybiBXSU5ET1c7CisgICAgICAgICAgY2FzZSA0OiAvLyBJU19JTkNMVURFX1NZUworICAgICAgICAgICAgcmV0dXJuIElTX0lOQ0xVREVfU1lTOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEZpbmQgdGhlIF9GaWVsZHMgY29uc3RhbnQgdGhhdCBtYXRjaGVzIGZpZWxkSWQsIHRocm93aW5nIGFuIGV4Y2VwdGlvbgorICAgICAgICogaWYgaXQgaXMgbm90IGZvdW5kLgorICAgICAgICovCisgICAgICBwdWJsaWMgc3RhdGljIF9GaWVsZHMgZmluZEJ5VGhyaWZ0SWRPclRocm93KGludCBmaWVsZElkKSB7CisgICAgICAgIF9GaWVsZHMgZmllbGRzID0gZmluZEJ5VGhyaWZ0SWQoZmllbGRJZCk7CisgICAgICAgIGlmIChmaWVsZHMgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRmllbGQgIiArIGZpZWxkSWQgKyAiIGRvZXNuJ3QgZXhpc3QhIik7CisgICAgICAgIHJldHVybiBmaWVsZHM7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogRmluZCB0aGUgX0ZpZWxkcyBjb25zdGFudCB0aGF0IG1hdGNoZXMgbmFtZSwgb3IgbnVsbCBpZiBpdHMgbm90IGZvdW5kLgorICAgICAgICovCisgICAgICBwdWJsaWMgc3RhdGljIF9GaWVsZHMgZmluZEJ5TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gYnlOYW1lLmdldChuYW1lKTsKKyAgICAgIH0KKworICAgICAgcHJpdmF0ZSBmaW5hbCBzaG9ydCBfdGhyaWZ0SWQ7CisgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBfZmllbGROYW1lOworCisgICAgICBfRmllbGRzKHNob3J0IHRocmlmdElkLCBTdHJpbmcgZmllbGROYW1lKSB7CisgICAgICAgIF90aHJpZnRJZCA9IHRocmlmdElkOworICAgICAgICBfZmllbGROYW1lID0gZmllbGROYW1lOworICAgICAgfQorCisgICAgICBwdWJsaWMgc2hvcnQgZ2V0VGhyaWZ0RmllbGRJZCgpIHsKKyAgICAgICAgcmV0dXJuIF90aHJpZnRJZDsKKyAgICAgIH0KKworICAgICAgcHVibGljIFN0cmluZyBnZXRGaWVsZE5hbWUoKSB7CisgICAgICAgIHJldHVybiBfZmllbGROYW1lOworICAgICAgfQorICAgIH0KKworICAgIC8vIGlzc2V0IGlkIGFzc2lnbm1lbnRzCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IF9fSVNfSU5DTFVERV9TWVNfSVNTRVRfSUQgPSAwOworICAgIHByaXZhdGUgYnl0ZSBfX2lzc2V0X2JpdGZpZWxkID0gMDsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE1hcDxfRmllbGRzLCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YT4gbWV0YURhdGFNYXA7CisgICAgc3RhdGljIHsKKyAgICAgIE1hcDxfRmllbGRzLCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YT4gdG1wTWFwID0gbmV3IEVudW1NYXA8X0ZpZWxkcywgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGE+KF9GaWVsZHMuY2xhc3MpOworICAgICAgdG1wTWFwLnB1dChfRmllbGRzLlRPUE9MT0dZX0lELCBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEoInRvcG9sb2d5X2lkIiwgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLkRFRkFVTFQsIAorICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRWYWx1ZU1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORykpKTsKKyAgICAgIHRtcE1hcC5wdXQoX0ZpZWxkcy5DT01QT05FTlRfSUQsIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YSgiY29tcG9uZW50X2lkIiwgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLkRFRkFVTFQsIAorICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRWYWx1ZU1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORykpKTsKKyAgICAgIHRtcE1hcC5wdXQoX0ZpZWxkcy5XSU5ET1csIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YSgid2luZG93Iiwgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLkRFRkFVTFQsIAorICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRWYWx1ZU1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORykpKTsKKyAgICAgIHRtcE1hcC5wdXQoX0ZpZWxkcy5JU19JTkNMVURFX1NZUywgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhKCJpc19pbmNsdWRlX3N5cyIsIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZFJlcXVpcmVtZW50VHlwZS5ERUZBVUxULCAKKyAgICAgICAgICBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkVmFsdWVNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5CT09MKSkpOworICAgICAgbWV0YURhdGFNYXAgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAodG1wTWFwKTsKKyAgICAgIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhLmFkZFN0cnVjdE1ldGFEYXRhTWFwKGdldENvbXBvbmVudFBhZ2VJbmZvX2FyZ3MuY2xhc3MsIG1ldGFEYXRhTWFwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZ2V0Q29tcG9uZW50UGFnZUluZm9fYXJncygpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgZ2V0Q29tcG9uZW50UGFnZUluZm9fYXJncygKKyAgICAgIFN0cmluZyB0b3BvbG9neV9pZCwKKyAgICAgIFN0cmluZyBjb21wb25lbnRfaWQsCisgICAgICBTdHJpbmcgd2luZG93LAorICAgICAgYm9vbGVhbiBpc19pbmNsdWRlX3N5cykKKyAgICB7CisgICAgICB0aGlzKCk7CisgICAgICB0aGlzLnRvcG9sb2d5X2lkID0gdG9wb2xvZ3lfaWQ7CisgICAgICB0aGlzLmNvbXBvbmVudF9pZCA9IGNvbXBvbmVudF9pZDsKKyAgICAgIHRoaXMud2luZG93ID0gd2luZG93OworICAgICAgdGhpcy5pc19pbmNsdWRlX3N5cyA9IGlzX2luY2x1ZGVfc3lzOworICAgICAgc2V0X2lzX2luY2x1ZGVfc3lzX2lzU2V0KHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBlcmZvcm1zIGEgZGVlcCBjb3B5IG9uIDxpPm90aGVyPC9pPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgZ2V0Q29tcG9uZW50UGFnZUluZm9fYXJncyhnZXRDb21wb25lbnRQYWdlSW5mb19hcmdzIG90aGVyKSB7CisgICAgICBfX2lzc2V0X2JpdGZpZWxkID0gb3RoZXIuX19pc3NldF9iaXRmaWVsZDsKKyAgICAgIGlmIChvdGhlci5pc19zZXRfdG9wb2xvZ3lfaWQoKSkgeworICAgICAgICB0aGlzLnRvcG9sb2d5X2lkID0gb3RoZXIudG9wb2xvZ3lfaWQ7CisgICAgICB9CisgICAgICBpZiAob3RoZXIuaXNfc2V0X2NvbXBvbmVudF9pZCgpKSB7CisgICAgICAgIHRoaXMuY29tcG9uZW50X2lkID0gb3RoZXIuY29tcG9uZW50X2lkOworICAgICAgfQorICAgICAgaWYgKG90aGVyLmlzX3NldF93aW5kb3coKSkgeworICAgICAgICB0aGlzLndpbmRvdyA9IG90aGVyLndpbmRvdzsKKyAgICAgIH0KKyAgICAgIHRoaXMuaXNfaW5jbHVkZV9zeXMgPSBvdGhlci5pc19pbmNsdWRlX3N5czsKKyAgICB9CisKKyAgICBwdWJsaWMgZ2V0Q29tcG9uZW50UGFnZUluZm9fYXJncyBkZWVwQ29weSgpIHsKKyAgICAgIHJldHVybiBuZXcgZ2V0Q29tcG9uZW50UGFnZUluZm9fYXJncyh0aGlzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgIHRoaXMudG9wb2xvZ3lfaWQgPSBudWxsOworICAgICAgdGhpcy5jb21wb25lbnRfaWQgPSBudWxsOworICAgICAgdGhpcy53aW5kb3cgPSBudWxsOworICAgICAgc2V0X2lzX2luY2x1ZGVfc3lzX2lzU2V0KGZhbHNlKTsKKyAgICAgIHRoaXMuaXNfaW5jbHVkZV9zeXMgPSBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldF90b3BvbG9neV9pZCgpIHsKKyAgICAgIHJldHVybiB0aGlzLnRvcG9sb2d5X2lkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldF90b3BvbG9neV9pZChTdHJpbmcgdG9wb2xvZ3lfaWQpIHsKKyAgICAgIHRoaXMudG9wb2xvZ3lfaWQgPSB0b3BvbG9neV9pZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1bnNldF90b3BvbG9neV9pZCgpIHsKKyAgICAgIHRoaXMudG9wb2xvZ3lfaWQgPSBudWxsOworICAgIH0KKworICAgIC8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgdG9wb2xvZ3lfaWQgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgICAgcHVibGljIGJvb2xlYW4gaXNfc2V0X3RvcG9sb2d5X2lkKCkgeworICAgICAgcmV0dXJuIHRoaXMudG9wb2xvZ3lfaWQgIT0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRfdG9wb2xvZ3lfaWRfaXNTZXQoYm9vbGVhbiB2YWx1ZSkgeworICAgICAgaWYgKCF2YWx1ZSkgeworICAgICAgICB0aGlzLnRvcG9sb2d5X2lkID0gbnVsbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldF9jb21wb25lbnRfaWQoKSB7CisgICAgICByZXR1cm4gdGhpcy5jb21wb25lbnRfaWQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0X2NvbXBvbmVudF9pZChTdHJpbmcgY29tcG9uZW50X2lkKSB7CisgICAgICB0aGlzLmNvbXBvbmVudF9pZCA9IGNvbXBvbmVudF9pZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1bnNldF9jb21wb25lbnRfaWQoKSB7CisgICAgICB0aGlzLmNvbXBvbmVudF9pZCA9IG51bGw7CisgICAgfQorCisgICAgLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBjb21wb25lbnRfaWQgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgICAgcHVibGljIGJvb2xlYW4gaXNfc2V0X2NvbXBvbmVudF9pZCgpIHsKKyAgICAgIHJldHVybiB0aGlzLmNvbXBvbmVudF9pZCAhPSBudWxsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldF9jb21wb25lbnRfaWRfaXNTZXQoYm9vbGVhbiB2YWx1ZSkgeworICAgICAgaWYgKCF2YWx1ZSkgeworICAgICAgICB0aGlzLmNvbXBvbmVudF9pZCA9IG51bGw7CisgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRfd2luZG93KCkgeworICAgICAgcmV0dXJuIHRoaXMud2luZG93OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldF93aW5kb3coU3RyaW5nIHdpbmRvdykgeworICAgICAgdGhpcy53aW5kb3cgPSB3aW5kb3c7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdW5zZXRfd2luZG93KCkgeworICAgICAgdGhpcy53aW5kb3cgPSBudWxsOworICAgIH0KKworICAgIC8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgd2luZG93IGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLworICAgIHB1YmxpYyBib29sZWFuIGlzX3NldF93aW5kb3coKSB7CisgICAgICByZXR1cm4gdGhpcy53aW5kb3cgIT0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRfd2luZG93X2lzU2V0KGJvb2xlYW4gdmFsdWUpIHsKKyAgICAgIGlmICghdmFsdWUpIHsKKyAgICAgICAgdGhpcy53aW5kb3cgPSBudWxsOworICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzX2lzX2luY2x1ZGVfc3lzKCkgeworICAgICAgcmV0dXJuIHRoaXMuaXNfaW5jbHVkZV9zeXM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0X2lzX2luY2x1ZGVfc3lzKGJvb2xlYW4gaXNfaW5jbHVkZV9zeXMpIHsKKyAgICAgIHRoaXMuaXNfaW5jbHVkZV9zeXMgPSBpc19pbmNsdWRlX3N5czsKKyAgICAgIHNldF9pc19pbmNsdWRlX3N5c19pc1NldCh0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1bnNldF9pc19pbmNsdWRlX3N5cygpIHsKKyAgICAgIF9faXNzZXRfYml0ZmllbGQgPSBFbmNvZGluZ1V0aWxzLmNsZWFyQml0KF9faXNzZXRfYml0ZmllbGQsIF9fSVNfSU5DTFVERV9TWVNfSVNTRVRfSUQpOworICAgIH0KKworICAgIC8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgaXNfaW5jbHVkZV9zeXMgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgICAgcHVibGljIGJvb2xlYW4gaXNfc2V0X2lzX2luY2x1ZGVfc3lzKCkgeworICAgICAgcmV0dXJuIEVuY29kaW5nVXRpbHMudGVzdEJpdChfX2lzc2V0X2JpdGZpZWxkLCBfX0lTX0lOQ0xVREVfU1lTX0lTU0VUX0lEKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRfaXNfaW5jbHVkZV9zeXNfaXNTZXQoYm9vbGVhbiB2YWx1ZSkgeworICAgICAgX19pc3NldF9iaXRmaWVsZCA9IEVuY29kaW5nVXRpbHMuc2V0Qml0KF9faXNzZXRfYml0ZmllbGQsIF9fSVNfSU5DTFVERV9TWVNfSVNTRVRfSUQsIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGaWVsZFZhbHVlKF9GaWVsZHMgZmllbGQsIE9iamVjdCB2YWx1ZSkgeworICAgICAgc3dpdGNoIChmaWVsZCkgeworICAgICAgY2FzZSBUT1BPTE9HWV9JRDoKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICB1bnNldF90b3BvbG9neV9pZCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHNldF90b3BvbG9neV9pZCgoU3RyaW5nKXZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBDT01QT05FTlRfSUQ6CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgdW5zZXRfY29tcG9uZW50X2lkKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc2V0X2NvbXBvbmVudF9pZCgoU3RyaW5nKXZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBXSU5ET1c6CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgdW5zZXRfd2luZG93KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc2V0X3dpbmRvdygoU3RyaW5nKXZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBJU19JTkNMVURFX1NZUzoKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICB1bnNldF9pc19pbmNsdWRlX3N5cygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHNldF9pc19pbmNsdWRlX3N5cygoQm9vbGVhbil2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgT2JqZWN0IGdldEZpZWxkVmFsdWUoX0ZpZWxkcyBmaWVsZCkgeworICAgICAgc3dpdGNoIChmaWVsZCkgeworICAgICAgY2FzZSBUT1BPTE9HWV9JRDoKKyAgICAgICAgcmV0dXJuIGdldF90b3BvbG9neV9pZCgpOworCisgICAgICBjYXNlIENPTVBPTkVOVF9JRDoKKyAgICAgICAgcmV0dXJuIGdldF9jb21wb25lbnRfaWQoKTsKKworICAgICAgY2FzZSBXSU5ET1c6CisgICAgICAgIHJldHVybiBnZXRfd2luZG93KCk7CisKKyAgICAgIGNhc2UgSVNfSU5DTFVERV9TWVM6CisgICAgICAgIHJldHVybiBpc19pc19pbmNsdWRlX3N5cygpOworCisgICAgICB9CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBjb3JyZXNwb25kaW5nIHRvIGZpZWxkSUQgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTZXQoX0ZpZWxkcyBmaWVsZCkgeworICAgICAgaWYgKGZpZWxkID09IG51bGwpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgfQorCisgICAgICBzd2l0Y2ggKGZpZWxkKSB7CisgICAgICBjYXNlIFRPUE9MT0dZX0lEOgorICAgICAgICByZXR1cm4gaXNfc2V0X3RvcG9sb2d5X2lkKCk7CisgICAgICBjYXNlIENPTVBPTkVOVF9JRDoKKyAgICAgICAgcmV0dXJuIGlzX3NldF9jb21wb25lbnRfaWQoKTsKKyAgICAgIGNhc2UgV0lORE9XOgorICAgICAgICByZXR1cm4gaXNfc2V0X3dpbmRvdygpOworICAgICAgY2FzZSBJU19JTkNMVURFX1NZUzoKKyAgICAgICAgcmV0dXJuIGlzX3NldF9pc19pbmNsdWRlX3N5cygpOworICAgICAgfQorICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgdGhhdCkgeworICAgICAgaWYgKHRoYXQgPT0gbnVsbCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKHRoYXQgaW5zdGFuY2VvZiBnZXRDb21wb25lbnRQYWdlSW5mb19hcmdzKQorICAgICAgICByZXR1cm4gdGhpcy5lcXVhbHMoKGdldENvbXBvbmVudFBhZ2VJbmZvX2FyZ3MpdGhhdCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKGdldENvbXBvbmVudFBhZ2VJbmZvX2FyZ3MgdGhhdCkgeworICAgICAgaWYgKHRoYXQgPT0gbnVsbCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICBib29sZWFuIHRoaXNfcHJlc2VudF90b3BvbG9neV9pZCA9IHRydWUgJiYgdGhpcy5pc19zZXRfdG9wb2xvZ3lfaWQoKTsKKyAgICAgIGJvb2xlYW4gdGhhdF9wcmVzZW50X3RvcG9sb2d5X2lkID0gdHJ1ZSAmJiB0aGF0LmlzX3NldF90b3BvbG9neV9pZCgpOworICAgICAgaWYgKHRoaXNfcHJlc2VudF90b3BvbG9neV9pZCB8fCB0aGF0X3ByZXNlbnRfdG9wb2xvZ3lfaWQpIHsKKyAgICAgICAgaWYgKCEodGhpc19wcmVzZW50X3RvcG9sb2d5X2lkICYmIHRoYXRfcHJlc2VudF90b3BvbG9neV9pZCkpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIXRoaXMudG9wb2xvZ3lfaWQuZXF1YWxzKHRoYXQudG9wb2xvZ3lfaWQpKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgYm9vbGVhbiB0aGlzX3ByZXNlbnRfY29tcG9uZW50X2lkID0gdHJ1ZSAmJiB0aGlzLmlzX3NldF9jb21wb25lbnRfaWQoKTsKKyAgICAgIGJvb2xlYW4gdGhhdF9wcmVzZW50X2NvbXBvbmVudF9pZCA9IHRydWUgJiYgdGhhdC5pc19zZXRfY29tcG9uZW50X2lkKCk7CisgICAgICBpZiAodGhpc19wcmVzZW50X2NvbXBvbmVudF9pZCB8fCB0aGF0X3ByZXNlbnRfY29tcG9uZW50X2lkKSB7CisgICAgICAgIGlmICghKHRoaXNfcHJlc2VudF9jb21wb25lbnRfaWQgJiYgdGhhdF9wcmVzZW50X2NvbXBvbmVudF9pZCkpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIXRoaXMuY29tcG9uZW50X2lkLmVxdWFscyh0aGF0LmNvbXBvbmVudF9pZCkpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICBib29sZWFuIHRoaXNfcHJlc2VudF93aW5kb3cgPSB0cnVlICYmIHRoaXMuaXNfc2V0X3dpbmRvdygpOworICAgICAgYm9vbGVhbiB0aGF0X3ByZXNlbnRfd2luZG93ID0gdHJ1ZSAmJiB0aGF0LmlzX3NldF93aW5kb3coKTsKKyAgICAgIGlmICh0aGlzX3ByZXNlbnRfd2luZG93IHx8IHRoYXRfcHJlc2VudF93aW5kb3cpIHsKKyAgICAgICAgaWYgKCEodGhpc19wcmVzZW50X3dpbmRvdyAmJiB0aGF0X3ByZXNlbnRfd2luZG93KSkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghdGhpcy53aW5kb3cuZXF1YWxzKHRoYXQud2luZG93KSkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIGJvb2xlYW4gdGhpc19wcmVzZW50X2lzX2luY2x1ZGVfc3lzID0gdHJ1ZTsKKyAgICAgIGJvb2xlYW4gdGhhdF9wcmVzZW50X2lzX2luY2x1ZGVfc3lzID0gdHJ1ZTsKKyAgICAgIGlmICh0aGlzX3ByZXNlbnRfaXNfaW5jbHVkZV9zeXMgfHwgdGhhdF9wcmVzZW50X2lzX2luY2x1ZGVfc3lzKSB7CisgICAgICAgIGlmICghKHRoaXNfcHJlc2VudF9pc19pbmNsdWRlX3N5cyAmJiB0aGF0X3ByZXNlbnRfaXNfaW5jbHVkZV9zeXMpKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKHRoaXMuaXNfaW5jbHVkZV9zeXMgIT0gdGhhdC5pc19pbmNsdWRlX3N5cykKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICBMaXN0PE9iamVjdD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOworCisgICAgICBib29sZWFuIHByZXNlbnRfdG9wb2xvZ3lfaWQgPSB0cnVlICYmIChpc19zZXRfdG9wb2xvZ3lfaWQoKSk7CisgICAgICBsaXN0LmFkZChwcmVzZW50X3RvcG9sb2d5X2lkKTsKKyAgICAgIGlmIChwcmVzZW50X3RvcG9sb2d5X2lkKQorICAgICAgICBsaXN0LmFkZCh0b3BvbG9neV9pZCk7CisKKyAgICAgIGJvb2xlYW4gcHJlc2VudF9jb21wb25lbnRfaWQgPSB0cnVlICYmIChpc19zZXRfY29tcG9uZW50X2lkKCkpOworICAgICAgbGlzdC5hZGQocHJlc2VudF9jb21wb25lbnRfaWQpOworICAgICAgaWYgKHByZXNlbnRfY29tcG9uZW50X2lkKQorICAgICAgICBsaXN0LmFkZChjb21wb25lbnRfaWQpOworCisgICAgICBib29sZWFuIHByZXNlbnRfd2luZG93ID0gdHJ1ZSAmJiAoaXNfc2V0X3dpbmRvdygpKTsKKyAgICAgIGxpc3QuYWRkKHByZXNlbnRfd2luZG93KTsKKyAgICAgIGlmIChwcmVzZW50X3dpbmRvdykKKyAgICAgICAgbGlzdC5hZGQod2luZG93KTsKKworICAgICAgYm9vbGVhbiBwcmVzZW50X2lzX2luY2x1ZGVfc3lzID0gdHJ1ZTsKKyAgICAgIGxpc3QuYWRkKHByZXNlbnRfaXNfaW5jbHVkZV9zeXMpOworICAgICAgaWYgKHByZXNlbnRfaXNfaW5jbHVkZV9zeXMpCisgICAgICAgIGxpc3QuYWRkKGlzX2luY2x1ZGVfc3lzKTsKKworICAgICAgcmV0dXJuIGxpc3QuaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyhnZXRDb21wb25lbnRQYWdlSW5mb19hcmdzIG90aGVyKSB7CisgICAgICBpZiAoIWdldENsYXNzKCkuZXF1YWxzKG90aGVyLmdldENsYXNzKCkpKSB7CisgICAgICAgIHJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKS5jb21wYXJlVG8ob3RoZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgfQorCisgICAgICBpbnQgbGFzdENvbXBhcmlzb24gPSAwOworCisgICAgICBsYXN0Q29tcGFyaXNvbiA9IEJvb2xlYW4udmFsdWVPZihpc19zZXRfdG9wb2xvZ3lfaWQoKSkuY29tcGFyZVRvKG90aGVyLmlzX3NldF90b3BvbG9neV9pZCgpKTsKKyAgICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICAgIH0KKyAgICAgIGlmIChpc19zZXRfdG9wb2xvZ3lfaWQoKSkgeworICAgICAgICBsYXN0Q29tcGFyaXNvbiA9IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvbXBhcmVUbyh0aGlzLnRvcG9sb2d5X2lkLCBvdGhlci50b3BvbG9neV9pZCk7CisgICAgICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgICAgICB9CisgICAgICB9CisgICAgICBsYXN0Q29tcGFyaXNvbiA9IEJvb2xlYW4udmFsdWVPZihpc19zZXRfY29tcG9uZW50X2lkKCkpLmNvbXBhcmVUbyhvdGhlci5pc19zZXRfY29tcG9uZW50X2lkKCkpOworICAgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgICAgfQorICAgICAgaWYgKGlzX3NldF9jb21wb25lbnRfaWQoKSkgeworICAgICAgICBsYXN0Q29tcGFyaXNvbiA9IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvbXBhcmVUbyh0aGlzLmNvbXBvbmVudF9pZCwgb3RoZXIuY29tcG9uZW50X2lkKTsKKyAgICAgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGxhc3RDb21wYXJpc29uID0gQm9vbGVhbi52YWx1ZU9mKGlzX3NldF93aW5kb3coKSkuY29tcGFyZVRvKG90aGVyLmlzX3NldF93aW5kb3coKSk7CisgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICB9CisgICAgICBpZiAoaXNfc2V0X3dpbmRvdygpKSB7CisgICAgICAgIGxhc3RDb21wYXJpc29uID0gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29tcGFyZVRvKHRoaXMud2luZG93LCBvdGhlci53aW5kb3cpOworICAgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgbGFzdENvbXBhcmlzb24gPSBCb29sZWFuLnZhbHVlT2YoaXNfc2V0X2lzX2luY2x1ZGVfc3lzKCkpLmNvbXBhcmVUbyhvdGhlci5pc19zZXRfaXNfaW5jbHVkZV9zeXMoKSk7CisgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICB9CisgICAgICBpZiAoaXNfc2V0X2lzX2luY2x1ZGVfc3lzKCkpIHsKKyAgICAgICAgbGFzdENvbXBhcmlzb24gPSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy5pc19pbmNsdWRlX3N5cywgb3RoZXIuaXNfaW5jbHVkZV9zeXMpOworICAgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIF9GaWVsZHMgZmllbGRGb3JJZChpbnQgZmllbGRJZCkgeworICAgICAgcmV0dXJuIF9GaWVsZHMuZmluZEJ5VGhyaWZ0SWQoZmllbGRJZCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVhZChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgaXByb3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgIHNjaGVtZXMuZ2V0KGlwcm90LmdldFNjaGVtZSgpKS5nZXRTY2hlbWUoKS5yZWFkKGlwcm90LCB0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgb3Byb3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgIHNjaGVtZXMuZ2V0KG9wcm90LmdldFNjaGVtZSgpKS5nZXRTY2hlbWUoKS53cml0ZShvcHJvdCwgdGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigiZ2V0Q29tcG9uZW50UGFnZUluZm9fYXJncygiKTsKKyAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOworCisgICAgICBzYi5hcHBlbmQoInRvcG9sb2d5X2lkOiIpOworICAgICAgaWYgKHRoaXMudG9wb2xvZ3lfaWQgPT0gbnVsbCkgeworICAgICAgICBzYi5hcHBlbmQoIm51bGwiKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNiLmFwcGVuZCh0aGlzLnRvcG9sb2d5X2lkKTsKKyAgICAgIH0KKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICBpZiAoIWZpcnN0KSBzYi5hcHBlbmQoIiwgIik7CisgICAgICBzYi5hcHBlbmQoImNvbXBvbmVudF9pZDoiKTsKKyAgICAgIGlmICh0aGlzLmNvbXBvbmVudF9pZCA9PSBudWxsKSB7CisgICAgICAgIHNiLmFwcGVuZCgibnVsbCIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2IuYXBwZW5kKHRoaXMuY29tcG9uZW50X2lkKTsKKyAgICAgIH0KKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICBpZiAoIWZpcnN0KSBzYi5hcHBlbmQoIiwgIik7CisgICAgICBzYi5hcHBlbmQoIndpbmRvdzoiKTsKKyAgICAgIGlmICh0aGlzLndpbmRvdyA9PSBudWxsKSB7CisgICAgICAgIHNiLmFwcGVuZCgibnVsbCIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2IuYXBwZW5kKHRoaXMud2luZG93KTsKKyAgICAgIH0KKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICBpZiAoIWZpcnN0KSBzYi5hcHBlbmQoIiwgIik7CisgICAgICBzYi5hcHBlbmQoImlzX2luY2x1ZGVfc3lzOiIpOworICAgICAgc2IuYXBwZW5kKHRoaXMuaXNfaW5jbHVkZV9zeXMpOworICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgIHNiLmFwcGVuZCgiKSIpOworICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdmFsaWRhdGUoKSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICAvLyBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzCisgICAgICAvLyBjaGVjayBmb3Igc3ViLXN0cnVjdCB2YWxpZGl0eQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgIHRyeSB7CisgICAgICAgIHdyaXRlKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQ29tcGFjdFByb3RvY29sKG5ldyBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVElPU3RyZWFtVHJhbnNwb3J0KG91dCkpKTsKKyAgICAgIH0gY2F0Y2ggKG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24gdGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IGphdmEuaW8uSU9FeGNlcHRpb24odGUpOworICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0KGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0gaW4pIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgIHRyeSB7CisgICAgICAgIC8vIGl0IGRvZXNuJ3Qgc2VlbSBsaWtlIHlvdSBzaG91bGQgaGF2ZSB0byBkbyB0aGlzLCBidXQgamF2YSBzZXJpYWxpemF0aW9uIGlzIHdhY2t5LCBhbmQgZG9lc24ndCBjYWxsIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgICAgICBfX2lzc2V0X2JpdGZpZWxkID0gMDsKKyAgICAgICAgcmVhZChuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbChuZXcgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRJT1N0cmVhbVRyYW5zcG9ydChpbikpKTsKKyAgICAgIH0gY2F0Y2ggKG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24gdGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IGphdmEuaW8uSU9FeGNlcHRpb24odGUpOworICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIGdldENvbXBvbmVudFBhZ2VJbmZvX2FyZ3NTdGFuZGFyZFNjaGVtZUZhY3RvcnkgaW1wbGVtZW50cyBTY2hlbWVGYWN0b3J5IHsKKyAgICAgIHB1YmxpYyBnZXRDb21wb25lbnRQYWdlSW5mb19hcmdzU3RhbmRhcmRTY2hlbWUgZ2V0U2NoZW1lKCkgeworICAgICAgICByZXR1cm4gbmV3IGdldENvbXBvbmVudFBhZ2VJbmZvX2FyZ3NTdGFuZGFyZFNjaGVtZSgpOworICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIGdldENvbXBvbmVudFBhZ2VJbmZvX2FyZ3NTdGFuZGFyZFNjaGVtZSBleHRlbmRzIFN0YW5kYXJkU2NoZW1lPGdldENvbXBvbmVudFBhZ2VJbmZvX2FyZ3M+IHsKKworICAgICAgcHVibGljIHZvaWQgcmVhZChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgaXByb3QsIGdldENvbXBvbmVudFBhZ2VJbmZvX2FyZ3Mgc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBzY2hlbWVGaWVsZDsKKyAgICAgICAgaXByb3QucmVhZFN0cnVjdEJlZ2luKCk7CisgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICB7CisgICAgICAgICAgc2NoZW1lRmllbGQgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpOworICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUT1ApIHsgCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgc3dpdGNoIChzY2hlbWVGaWVsZC5pZCkgeworICAgICAgICAgICAgY2FzZSAxOiAvLyBUT1BPTE9HWV9JRAorICAgICAgICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcpIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QudG9wb2xvZ3lfaWQgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgc3RydWN0LnNldF90b3BvbG9neV9pZF9pc1NldCh0cnVlKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsgCisgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjogLy8gQ09NUE9ORU5UX0lECisgICAgICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORykgeworICAgICAgICAgICAgICAgIHN0cnVjdC5jb21wb25lbnRfaWQgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgc3RydWN0LnNldF9jb21wb25lbnRfaWRfaXNTZXQodHJ1ZSk7CisgICAgICAgICAgICAgIH0gZWxzZSB7IAorICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgc2NoZW1lRmllbGQudHlwZSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM6IC8vIFdJTkRPVworICAgICAgICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcpIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3Qud2luZG93ID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICAgICAgICAgIHN0cnVjdC5zZXRfd2luZG93X2lzU2V0KHRydWUpOworICAgICAgICAgICAgICB9IGVsc2UgeyAKKyAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA0OiAvLyBJU19JTkNMVURFX1NZUworICAgICAgICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5CT09MKSB7CisgICAgICAgICAgICAgICAgc3RydWN0LmlzX2luY2x1ZGVfc3lzID0gaXByb3QucmVhZEJvb2woKTsKKyAgICAgICAgICAgICAgICBzdHJ1Y3Quc2V0X2lzX2luY2x1ZGVfc3lzX2lzU2V0KHRydWUpOworICAgICAgICAgICAgICB9IGVsc2UgeyAKKyAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKKyAgICAgICAgICB9CisgICAgICAgICAgaXByb3QucmVhZEZpZWxkRW5kKCk7CisgICAgICAgIH0KKyAgICAgICAgaXByb3QucmVhZFN0cnVjdEVuZCgpOworICAgICAgICBzdHJ1Y3QudmFsaWRhdGUoKTsKKyAgICAgIH0KKworICAgICAgcHVibGljIHZvaWQgd3JpdGUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIG9wcm90LCBnZXRDb21wb25lbnRQYWdlSW5mb19hcmdzIHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgICBzdHJ1Y3QudmFsaWRhdGUoKTsKKworICAgICAgICBvcHJvdC53cml0ZVN0cnVjdEJlZ2luKFNUUlVDVF9ERVNDKTsKKyAgICAgICAgaWYgKHN0cnVjdC50b3BvbG9neV9pZCAhPSBudWxsKSB7CisgICAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKFRPUE9MT0dZX0lEX0ZJRUxEX0RFU0MpOworICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKHN0cnVjdC50b3BvbG9neV9pZCk7CisgICAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJ1Y3QuY29tcG9uZW50X2lkICE9IG51bGwpIHsKKyAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oQ09NUE9ORU5UX0lEX0ZJRUxEX0RFU0MpOworICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKHN0cnVjdC5jb21wb25lbnRfaWQpOworICAgICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RydWN0LndpbmRvdyAhPSBudWxsKSB7CisgICAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKFdJTkRPV19GSUVMRF9ERVNDKTsKKyAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhzdHJ1Y3Qud2luZG93KTsKKyAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgICAgIH0KKyAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKElTX0lOQ0xVREVfU1lTX0ZJRUxEX0RFU0MpOworICAgICAgICBvcHJvdC53cml0ZUJvb2woc3RydWN0LmlzX2luY2x1ZGVfc3lzKTsKKyAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgICAgICBvcHJvdC53cml0ZUZpZWxkU3RvcCgpOworICAgICAgICBvcHJvdC53cml0ZVN0cnVjdEVuZCgpOworICAgICAgfQorCisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgZ2V0Q29tcG9uZW50UGFnZUluZm9fYXJnc1R1cGxlU2NoZW1lRmFjdG9yeSBpbXBsZW1lbnRzIFNjaGVtZUZhY3RvcnkgeworICAgICAgcHVibGljIGdldENvbXBvbmVudFBhZ2VJbmZvX2FyZ3NUdXBsZVNjaGVtZSBnZXRTY2hlbWUoKSB7CisgICAgICAgIHJldHVybiBuZXcgZ2V0Q29tcG9uZW50UGFnZUluZm9fYXJnc1R1cGxlU2NoZW1lKCk7CisgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgZ2V0Q29tcG9uZW50UGFnZUluZm9fYXJnc1R1cGxlU2NoZW1lIGV4dGVuZHMgVHVwbGVTY2hlbWU8Z2V0Q29tcG9uZW50UGFnZUluZm9fYXJncz4geworCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBwcm90LCBnZXRDb21wb25lbnRQYWdlSW5mb19hcmdzIHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgICBUVHVwbGVQcm90b2NvbCBvcHJvdCA9IChUVHVwbGVQcm90b2NvbCkgcHJvdDsKKyAgICAgICAgQml0U2V0IG9wdGlvbmFscyA9IG5ldyBCaXRTZXQoKTsKKyAgICAgICAgaWYgKHN0cnVjdC5pc19zZXRfdG9wb2xvZ3lfaWQoKSkgeworICAgICAgICAgIG9wdGlvbmFscy5zZXQoMCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cnVjdC5pc19zZXRfY29tcG9uZW50X2lkKCkpIHsKKyAgICAgICAgICBvcHRpb25hbHMuc2V0KDEpOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X3dpbmRvdygpKSB7CisgICAgICAgICAgb3B0aW9uYWxzLnNldCgyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RydWN0LmlzX3NldF9pc19pbmNsdWRlX3N5cygpKSB7CisgICAgICAgICAgb3B0aW9uYWxzLnNldCgzKTsKKyAgICAgICAgfQorICAgICAgICBvcHJvdC53cml0ZUJpdFNldChvcHRpb25hbHMsIDQpOworICAgICAgICBpZiAoc3RydWN0LmlzX3NldF90b3BvbG9neV9pZCgpKSB7CisgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoc3RydWN0LnRvcG9sb2d5X2lkKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RydWN0LmlzX3NldF9jb21wb25lbnRfaWQoKSkgeworICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKHN0cnVjdC5jb21wb25lbnRfaWQpOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X3dpbmRvdygpKSB7CisgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoc3RydWN0LndpbmRvdyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cnVjdC5pc19zZXRfaXNfaW5jbHVkZV9zeXMoKSkgeworICAgICAgICAgIG9wcm90LndyaXRlQm9vbChzdHJ1Y3QuaXNfaW5jbHVkZV9zeXMpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgcmVhZChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgcHJvdCwgZ2V0Q29tcG9uZW50UGFnZUluZm9fYXJncyBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgICAgVFR1cGxlUHJvdG9jb2wgaXByb3QgPSAoVFR1cGxlUHJvdG9jb2wpIHByb3Q7CisgICAgICAgIEJpdFNldCBpbmNvbWluZyA9IGlwcm90LnJlYWRCaXRTZXQoNCk7CisgICAgICAgIGlmIChpbmNvbWluZy5nZXQoMCkpIHsKKyAgICAgICAgICBzdHJ1Y3QudG9wb2xvZ3lfaWQgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgc3RydWN0LnNldF90b3BvbG9neV9pZF9pc1NldCh0cnVlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5jb21pbmcuZ2V0KDEpKSB7CisgICAgICAgICAgc3RydWN0LmNvbXBvbmVudF9pZCA9IGlwcm90LnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICBzdHJ1Y3Quc2V0X2NvbXBvbmVudF9pZF9pc1NldCh0cnVlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5jb21pbmcuZ2V0KDIpKSB7CisgICAgICAgICAgc3RydWN0LndpbmRvdyA9IGlwcm90LnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICBzdHJ1Y3Quc2V0X3dpbmRvd19pc1NldCh0cnVlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5jb21pbmcuZ2V0KDMpKSB7CisgICAgICAgICAgc3RydWN0LmlzX2luY2x1ZGVfc3lzID0gaXByb3QucmVhZEJvb2woKTsKKyAgICAgICAgICBzdHJ1Y3Quc2V0X2lzX2luY2x1ZGVfc3lzX2lzU2V0KHRydWUpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgIH0KKworICBwdWJsaWMgc3RhdGljIGNsYXNzIGdldENvbXBvbmVudFBhZ2VJbmZvX3Jlc3VsdCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlPGdldENvbXBvbmVudFBhZ2VJbmZvX3Jlc3VsdCwgZ2V0Q29tcG9uZW50UGFnZUluZm9fcmVzdWx0Ll9GaWVsZHM+LCBqYXZhLmlvLlNlcmlhbGl6YWJsZSwgQ2xvbmVhYmxlLCBDb21wYXJhYmxlPGdldENvbXBvbmVudFBhZ2VJbmZvX3Jlc3VsdD4gICB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdCBTVFJVQ1RfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0KCJnZXRDb21wb25lbnRQYWdlSW5mb19yZXN1bHQiKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBTVUNDRVNTX0ZJRUxEX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkKCJzdWNjZXNzIiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNULCAoc2hvcnQpMCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIEVfRklFTERfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQoImUiLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIChzaG9ydCkxKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgQVpFX0ZJRUxEX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkKCJhemUiLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIChzaG9ydCkyKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxDbGFzczw/IGV4dGVuZHMgSVNjaGVtZT4sIFNjaGVtZUZhY3Rvcnk+IHNjaGVtZXMgPSBuZXcgSGFzaE1hcDxDbGFzczw/IGV4dGVuZHMgSVNjaGVtZT4sIFNjaGVtZUZhY3Rvcnk+KCk7CisgICAgc3RhdGljIHsKKyAgICAgIHNjaGVtZXMucHV0KFN0YW5kYXJkU2NoZW1lLmNsYXNzLCBuZXcgZ2V0Q29tcG9uZW50UGFnZUluZm9fcmVzdWx0U3RhbmRhcmRTY2hlbWVGYWN0b3J5KCkpOworICAgICAgc2NoZW1lcy5wdXQoVHVwbGVTY2hlbWUuY2xhc3MsIG5ldyBnZXRDb21wb25lbnRQYWdlSW5mb19yZXN1bHRUdXBsZVNjaGVtZUZhY3RvcnkoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBDb21wb25lbnRQYWdlSW5mbyBzdWNjZXNzOyAvLyByZXF1aXJlZAorICAgIHByaXZhdGUgTm90QWxpdmVFeGNlcHRpb24gZTsgLy8gcmVxdWlyZWQKKyAgICBwcml2YXRlIEF1dGhvcml6YXRpb25FeGNlcHRpb24gYXplOyAvLyByZXF1aXJlZAorCisgICAgLyoqIFRoZSBzZXQgb2YgZmllbGRzIHRoaXMgc3RydWN0IGNvbnRhaW5zLCBhbG9uZyB3aXRoIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9yIGZpbmRpbmcgYW5kIG1hbmlwdWxhdGluZyB0aGVtLiAqLworICAgIHB1YmxpYyBlbnVtIF9GaWVsZHMgaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRJZEVudW0geworICAgICAgU1VDQ0VTUygoc2hvcnQpMCwgInN1Y2Nlc3MiKSwKKyAgICAgIEUoKHNob3J0KTEsICJlIiksCisgICAgICBBWkUoKHNob3J0KTIsICJhemUiKTsKKworICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgX0ZpZWxkcz4gYnlOYW1lID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBfRmllbGRzPigpOworCisgICAgICBzdGF0aWMgeworICAgICAgICBmb3IgKF9GaWVsZHMgZmllbGQgOiBFbnVtU2V0LmFsbE9mKF9GaWVsZHMuY2xhc3MpKSB7CisgICAgICAgICAgYnlOYW1lLnB1dChmaWVsZC5nZXRGaWVsZE5hbWUoKSwgZmllbGQpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogRmluZCB0aGUgX0ZpZWxkcyBjb25zdGFudCB0aGF0IG1hdGNoZXMgZmllbGRJZCwgb3IgbnVsbCBpZiBpdHMgbm90IGZvdW5kLgorICAgICAgICovCisgICAgICBwdWJsaWMgc3RhdGljIF9GaWVsZHMgZmluZEJ5VGhyaWZ0SWQoaW50IGZpZWxkSWQpIHsKKyAgICAgICAgc3dpdGNoKGZpZWxkSWQpIHsKKyAgICAgICAgICBjYXNlIDA6IC8vIFNVQ0NFU1MKKyAgICAgICAgICAgIHJldHVybiBTVUNDRVNTOworICAgICAgICAgIGNhc2UgMTogLy8gRQorICAgICAgICAgICAgcmV0dXJuIEU7CisgICAgICAgICAgY2FzZSAyOiAvLyBBWkUKKyAgICAgICAgICAgIHJldHVybiBBWkU7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogRmluZCB0aGUgX0ZpZWxkcyBjb25zdGFudCB0aGF0IG1hdGNoZXMgZmllbGRJZCwgdGhyb3dpbmcgYW4gZXhjZXB0aW9uCisgICAgICAgKiBpZiBpdCBpcyBub3QgZm91bmQuCisgICAgICAgKi8KKyAgICAgIHB1YmxpYyBzdGF0aWMgX0ZpZWxkcyBmaW5kQnlUaHJpZnRJZE9yVGhyb3coaW50IGZpZWxkSWQpIHsKKyAgICAgICAgX0ZpZWxkcyBmaWVsZHMgPSBmaW5kQnlUaHJpZnRJZChmaWVsZElkKTsKKyAgICAgICAgaWYgKGZpZWxkcyA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJGaWVsZCAiICsgZmllbGRJZCArICIgZG9lc24ndCBleGlzdCEiKTsKKyAgICAgICAgcmV0dXJuIGZpZWxkczsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBGaW5kIHRoZSBfRmllbGRzIGNvbnN0YW50IHRoYXQgbWF0Y2hlcyBuYW1lLCBvciBudWxsIGlmIGl0cyBub3QgZm91bmQuCisgICAgICAgKi8KKyAgICAgIHB1YmxpYyBzdGF0aWMgX0ZpZWxkcyBmaW5kQnlOYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiBieU5hbWUuZ2V0KG5hbWUpOworICAgICAgfQorCisgICAgICBwcml2YXRlIGZpbmFsIHNob3J0IF90aHJpZnRJZDsKKyAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIF9maWVsZE5hbWU7CisKKyAgICAgIF9GaWVsZHMoc2hvcnQgdGhyaWZ0SWQsIFN0cmluZyBmaWVsZE5hbWUpIHsKKyAgICAgICAgX3RocmlmdElkID0gdGhyaWZ0SWQ7CisgICAgICAgIF9maWVsZE5hbWUgPSBmaWVsZE5hbWU7CisgICAgICB9CisKKyAgICAgIHB1YmxpYyBzaG9ydCBnZXRUaHJpZnRGaWVsZElkKCkgeworICAgICAgICByZXR1cm4gX3RocmlmdElkOworICAgICAgfQorCisgICAgICBwdWJsaWMgU3RyaW5nIGdldEZpZWxkTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIF9maWVsZE5hbWU7CisgICAgICB9CisgICAgfQorCisgICAgLy8gaXNzZXQgaWQgYXNzaWdubWVudHMKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE1hcDxfRmllbGRzLCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YT4gbWV0YURhdGFNYXA7CisgICAgc3RhdGljIHsKKyAgICAgIE1hcDxfRmllbGRzLCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YT4gdG1wTWFwID0gbmV3IEVudW1NYXA8X0ZpZWxkcywgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGE+KF9GaWVsZHMuY2xhc3MpOworICAgICAgdG1wTWFwLnB1dChfRmllbGRzLlNVQ0NFU1MsIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YSgic3VjY2VzcyIsIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZFJlcXVpcmVtZW50VHlwZS5ERUZBVUxULCAKKyAgICAgICAgICBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLlN0cnVjdE1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCwgQ29tcG9uZW50UGFnZUluZm8uY2xhc3MpKSk7CisgICAgICB0bXBNYXAucHV0KF9GaWVsZHMuRSwgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhKCJlIiwgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLkRFRkFVTFQsIAorICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRWYWx1ZU1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCkpKTsKKyAgICAgIHRtcE1hcC5wdXQoX0ZpZWxkcy5BWkUsIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YSgiYXplIiwgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLkRFRkFVTFQsIAorICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRWYWx1ZU1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCkpKTsKKyAgICAgIG1ldGFEYXRhTWFwID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKHRtcE1hcCk7CisgICAgICBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YS5hZGRTdHJ1Y3RNZXRhRGF0YU1hcChnZXRDb21wb25lbnRQYWdlSW5mb19yZXN1bHQuY2xhc3MsIG1ldGFEYXRhTWFwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgZ2V0Q29tcG9uZW50UGFnZUluZm9fcmVzdWx0KCkgeworICAgIH0KKworICAgIHB1YmxpYyBnZXRDb21wb25lbnRQYWdlSW5mb19yZXN1bHQoCisgICAgICBDb21wb25lbnRQYWdlSW5mbyBzdWNjZXNzLAorICAgICAgTm90QWxpdmVFeGNlcHRpb24gZSwKKyAgICAgIEF1dGhvcml6YXRpb25FeGNlcHRpb24gYXplKQorICAgIHsKKyAgICAgIHRoaXMoKTsKKyAgICAgIHRoaXMuc3VjY2VzcyA9IHN1Y2Nlc3M7CisgICAgICB0aGlzLmUgPSBlOworICAgICAgdGhpcy5hemUgPSBhemU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGVyZm9ybXMgYSBkZWVwIGNvcHkgb24gPGk+b3RoZXI8L2k+LgorICAgICAqLworICAgIHB1YmxpYyBnZXRDb21wb25lbnRQYWdlSW5mb19yZXN1bHQoZ2V0Q29tcG9uZW50UGFnZUluZm9fcmVzdWx0IG90aGVyKSB7CisgICAgICBpZiAob3RoZXIuaXNfc2V0X3N1Y2Nlc3MoKSkgeworICAgICAgICB0aGlzLnN1Y2Nlc3MgPSBuZXcgQ29tcG9uZW50UGFnZUluZm8ob3RoZXIuc3VjY2Vzcyk7CisgICAgICB9CisgICAgICBpZiAob3RoZXIuaXNfc2V0X2UoKSkgeworICAgICAgICB0aGlzLmUgPSBuZXcgTm90QWxpdmVFeGNlcHRpb24ob3RoZXIuZSk7CisgICAgICB9CisgICAgICBpZiAob3RoZXIuaXNfc2V0X2F6ZSgpKSB7CisgICAgICAgIHRoaXMuYXplID0gbmV3IEF1dGhvcml6YXRpb25FeGNlcHRpb24ob3RoZXIuYXplKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZ2V0Q29tcG9uZW50UGFnZUluZm9fcmVzdWx0IGRlZXBDb3B5KCkgeworICAgICAgcmV0dXJuIG5ldyBnZXRDb21wb25lbnRQYWdlSW5mb19yZXN1bHQodGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgICB0aGlzLnN1Y2Nlc3MgPSBudWxsOworICAgICAgdGhpcy5lID0gbnVsbDsKKyAgICAgIHRoaXMuYXplID0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29tcG9uZW50UGFnZUluZm8gZ2V0X3N1Y2Nlc3MoKSB7CisgICAgICByZXR1cm4gdGhpcy5zdWNjZXNzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldF9zdWNjZXNzKENvbXBvbmVudFBhZ2VJbmZvIHN1Y2Nlc3MpIHsKKyAgICAgIHRoaXMuc3VjY2VzcyA9IHN1Y2Nlc3M7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdW5zZXRfc3VjY2VzcygpIHsKKyAgICAgIHRoaXMuc3VjY2VzcyA9IG51bGw7CisgICAgfQorCisgICAgLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBzdWNjZXNzIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLworICAgIHB1YmxpYyBib29sZWFuIGlzX3NldF9zdWNjZXNzKCkgeworICAgICAgcmV0dXJuIHRoaXMuc3VjY2VzcyAhPSBudWxsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldF9zdWNjZXNzX2lzU2V0KGJvb2xlYW4gdmFsdWUpIHsKKyAgICAgIGlmICghdmFsdWUpIHsKKyAgICAgICAgdGhpcy5zdWNjZXNzID0gbnVsbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgTm90QWxpdmVFeGNlcHRpb24gZ2V0X2UoKSB7CisgICAgICByZXR1cm4gdGhpcy5lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldF9lKE5vdEFsaXZlRXhjZXB0aW9uIGUpIHsKKyAgICAgIHRoaXMuZSA9IGU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdW5zZXRfZSgpIHsKKyAgICAgIHRoaXMuZSA9IG51bGw7CisgICAgfQorCisgICAgLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBlIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLworICAgIHB1YmxpYyBib29sZWFuIGlzX3NldF9lKCkgeworICAgICAgcmV0dXJuIHRoaXMuZSAhPSBudWxsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldF9lX2lzU2V0KGJvb2xlYW4gdmFsdWUpIHsKKyAgICAgIGlmICghdmFsdWUpIHsKKyAgICAgICAgdGhpcy5lID0gbnVsbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgQXV0aG9yaXphdGlvbkV4Y2VwdGlvbiBnZXRfYXplKCkgeworICAgICAgcmV0dXJuIHRoaXMuYXplOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldF9hemUoQXV0aG9yaXphdGlvbkV4Y2VwdGlvbiBhemUpIHsKKyAgICAgIHRoaXMuYXplID0gYXplOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVuc2V0X2F6ZSgpIHsKKyAgICAgIHRoaXMuYXplID0gbnVsbDsKKyAgICB9CisKKyAgICAvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkIGF6ZSBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc19zZXRfYXplKCkgeworICAgICAgcmV0dXJuIHRoaXMuYXplICE9IG51bGw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0X2F6ZV9pc1NldChib29sZWFuIHZhbHVlKSB7CisgICAgICBpZiAoIXZhbHVlKSB7CisgICAgICAgIHRoaXMuYXplID0gbnVsbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGaWVsZFZhbHVlKF9GaWVsZHMgZmllbGQsIE9iamVjdCB2YWx1ZSkgeworICAgICAgc3dpdGNoIChmaWVsZCkgeworICAgICAgY2FzZSBTVUNDRVNTOgorICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgIHVuc2V0X3N1Y2Nlc3MoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzZXRfc3VjY2VzcygoQ29tcG9uZW50UGFnZUluZm8pdmFsdWUpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEU6CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgdW5zZXRfZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHNldF9lKChOb3RBbGl2ZUV4Y2VwdGlvbil2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgQVpFOgorICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgIHVuc2V0X2F6ZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHNldF9hemUoKEF1dGhvcml6YXRpb25FeGNlcHRpb24pdmFsdWUpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICB9CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRGaWVsZFZhbHVlKF9GaWVsZHMgZmllbGQpIHsKKyAgICAgIHN3aXRjaCAoZmllbGQpIHsKKyAgICAgIGNhc2UgU1VDQ0VTUzoKKyAgICAgICAgcmV0dXJuIGdldF9zdWNjZXNzKCk7CisKKyAgICAgIGNhc2UgRToKKyAgICAgICAgcmV0dXJuIGdldF9lKCk7CisKKyAgICAgIGNhc2UgQVpFOgorICAgICAgICByZXR1cm4gZ2V0X2F6ZSgpOworCisgICAgICB9CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBjb3JyZXNwb25kaW5nIHRvIGZpZWxkSUQgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTZXQoX0ZpZWxkcyBmaWVsZCkgeworICAgICAgaWYgKGZpZWxkID09IG51bGwpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgfQorCisgICAgICBzd2l0Y2ggKGZpZWxkKSB7CisgICAgICBjYXNlIFNVQ0NFU1M6CisgICAgICAgIHJldHVybiBpc19zZXRfc3VjY2VzcygpOworICAgICAgY2FzZSBFOgorICAgICAgICByZXR1cm4gaXNfc2V0X2UoKTsKKyAgICAgIGNhc2UgQVpFOgorICAgICAgICByZXR1cm4gaXNfc2V0X2F6ZSgpOworICAgICAgfQorICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgdGhhdCkgeworICAgICAgaWYgKHRoYXQgPT0gbnVsbCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKHRoYXQgaW5zdGFuY2VvZiBnZXRDb21wb25lbnRQYWdlSW5mb19yZXN1bHQpCisgICAgICAgIHJldHVybiB0aGlzLmVxdWFscygoZ2V0Q29tcG9uZW50UGFnZUluZm9fcmVzdWx0KXRoYXQpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhnZXRDb21wb25lbnRQYWdlSW5mb19yZXN1bHQgdGhhdCkgeworICAgICAgaWYgKHRoYXQgPT0gbnVsbCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICBib29sZWFuIHRoaXNfcHJlc2VudF9zdWNjZXNzID0gdHJ1ZSAmJiB0aGlzLmlzX3NldF9zdWNjZXNzKCk7CisgICAgICBib29sZWFuIHRoYXRfcHJlc2VudF9zdWNjZXNzID0gdHJ1ZSAmJiB0aGF0LmlzX3NldF9zdWNjZXNzKCk7CisgICAgICBpZiAodGhpc19wcmVzZW50X3N1Y2Nlc3MgfHwgdGhhdF9wcmVzZW50X3N1Y2Nlc3MpIHsKKyAgICAgICAgaWYgKCEodGhpc19wcmVzZW50X3N1Y2Nlc3MgJiYgdGhhdF9wcmVzZW50X3N1Y2Nlc3MpKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCF0aGlzLnN1Y2Nlc3MuZXF1YWxzKHRoYXQuc3VjY2VzcykpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICBib29sZWFuIHRoaXNfcHJlc2VudF9lID0gdHJ1ZSAmJiB0aGlzLmlzX3NldF9lKCk7CisgICAgICBib29sZWFuIHRoYXRfcHJlc2VudF9lID0gdHJ1ZSAmJiB0aGF0LmlzX3NldF9lKCk7CisgICAgICBpZiAodGhpc19wcmVzZW50X2UgfHwgdGhhdF9wcmVzZW50X2UpIHsKKyAgICAgICAgaWYgKCEodGhpc19wcmVzZW50X2UgJiYgdGhhdF9wcmVzZW50X2UpKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCF0aGlzLmUuZXF1YWxzKHRoYXQuZSkpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICBib29sZWFuIHRoaXNfcHJlc2VudF9hemUgPSB0cnVlICYmIHRoaXMuaXNfc2V0X2F6ZSgpOworICAgICAgYm9vbGVhbiB0aGF0X3ByZXNlbnRfYXplID0gdHJ1ZSAmJiB0aGF0LmlzX3NldF9hemUoKTsKKyAgICAgIGlmICh0aGlzX3ByZXNlbnRfYXplIHx8IHRoYXRfcHJlc2VudF9hemUpIHsKKyAgICAgICAgaWYgKCEodGhpc19wcmVzZW50X2F6ZSAmJiB0aGF0X3ByZXNlbnRfYXplKSkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghdGhpcy5hemUuZXF1YWxzKHRoYXQuYXplKSkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICBMaXN0PE9iamVjdD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOworCisgICAgICBib29sZWFuIHByZXNlbnRfc3VjY2VzcyA9IHRydWUgJiYgKGlzX3NldF9zdWNjZXNzKCkpOworICAgICAgbGlzdC5hZGQocHJlc2VudF9zdWNjZXNzKTsKKyAgICAgIGlmIChwcmVzZW50X3N1Y2Nlc3MpCisgICAgICAgIGxpc3QuYWRkKHN1Y2Nlc3MpOworCisgICAgICBib29sZWFuIHByZXNlbnRfZSA9IHRydWUgJiYgKGlzX3NldF9lKCkpOworICAgICAgbGlzdC5hZGQocHJlc2VudF9lKTsKKyAgICAgIGlmIChwcmVzZW50X2UpCisgICAgICAgIGxpc3QuYWRkKGUpOworCisgICAgICBib29sZWFuIHByZXNlbnRfYXplID0gdHJ1ZSAmJiAoaXNfc2V0X2F6ZSgpKTsKKyAgICAgIGxpc3QuYWRkKHByZXNlbnRfYXplKTsKKyAgICAgIGlmIChwcmVzZW50X2F6ZSkKKyAgICAgICAgbGlzdC5hZGQoYXplKTsKKworICAgICAgcmV0dXJuIGxpc3QuaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyhnZXRDb21wb25lbnRQYWdlSW5mb19yZXN1bHQgb3RoZXIpIHsKKyAgICAgIGlmICghZ2V0Q2xhc3MoKS5lcXVhbHMob3RoZXIuZ2V0Q2xhc3MoKSkpIHsKKyAgICAgICAgcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpLmNvbXBhcmVUbyhvdGhlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICB9CisKKyAgICAgIGludCBsYXN0Q29tcGFyaXNvbiA9IDA7CisKKyAgICAgIGxhc3RDb21wYXJpc29uID0gQm9vbGVhbi52YWx1ZU9mKGlzX3NldF9zdWNjZXNzKCkpLmNvbXBhcmVUbyhvdGhlci5pc19zZXRfc3VjY2VzcygpKTsKKyAgICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICAgIH0KKyAgICAgIGlmIChpc19zZXRfc3VjY2VzcygpKSB7CisgICAgICAgIGxhc3RDb21wYXJpc29uID0gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29tcGFyZVRvKHRoaXMuc3VjY2Vzcywgb3RoZXIuc3VjY2Vzcyk7CisgICAgICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgICAgICB9CisgICAgICB9CisgICAgICBsYXN0Q29tcGFyaXNvbiA9IEJvb2xlYW4udmFsdWVPZihpc19zZXRfZSgpKS5jb21wYXJlVG8ob3RoZXIuaXNfc2V0X2UoKSk7CisgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICB9CisgICAgICBpZiAoaXNfc2V0X2UoKSkgeworICAgICAgICBsYXN0Q29tcGFyaXNvbiA9IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvbXBhcmVUbyh0aGlzLmUsIG90aGVyLmUpOworICAgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgbGFzdENvbXBhcmlzb24gPSBCb29sZWFuLnZhbHVlT2YoaXNfc2V0X2F6ZSgpKS5jb21wYXJlVG8ob3RoZXIuaXNfc2V0X2F6ZSgpKTsKKyAgICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICAgIH0KKyAgICAgIGlmIChpc19zZXRfYXplKCkpIHsKKyAgICAgICAgbGFzdENvbXBhcmlzb24gPSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy5hemUsIG90aGVyLmF6ZSk7CisgICAgICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgX0ZpZWxkcyBmaWVsZEZvcklkKGludCBmaWVsZElkKSB7CisgICAgICByZXR1cm4gX0ZpZWxkcy5maW5kQnlUaHJpZnRJZChmaWVsZElkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZWFkKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBpcHJvdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgc2NoZW1lcy5nZXQoaXByb3QuZ2V0U2NoZW1lKCkpLmdldFNjaGVtZSgpLnJlYWQoaXByb3QsIHRoaXMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgc2NoZW1lcy5nZXQob3Byb3QuZ2V0U2NoZW1lKCkpLmdldFNjaGVtZSgpLndyaXRlKG9wcm90LCB0aGlzKTsKKyAgICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoImdldENvbXBvbmVudFBhZ2VJbmZvX3Jlc3VsdCgiKTsKKyAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOworCisgICAgICBzYi5hcHBlbmQoInN1Y2Nlc3M6Iik7CisgICAgICBpZiAodGhpcy5zdWNjZXNzID09IG51bGwpIHsKKyAgICAgICAgc2IuYXBwZW5kKCJudWxsIik7CisgICAgICB9IGVsc2UgeworICAgICAgICBzYi5hcHBlbmQodGhpcy5zdWNjZXNzKTsKKyAgICAgIH0KKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICBpZiAoIWZpcnN0KSBzYi5hcHBlbmQoIiwgIik7CisgICAgICBzYi5hcHBlbmQoImU6Iik7CisgICAgICBpZiAodGhpcy5lID09IG51bGwpIHsKKyAgICAgICAgc2IuYXBwZW5kKCJudWxsIik7CisgICAgICB9IGVsc2UgeworICAgICAgICBzYi5hcHBlbmQodGhpcy5lKTsKKyAgICAgIH0KKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICBpZiAoIWZpcnN0KSBzYi5hcHBlbmQoIiwgIik7CisgICAgICBzYi5hcHBlbmQoImF6ZToiKTsKKyAgICAgIGlmICh0aGlzLmF6ZSA9PSBudWxsKSB7CisgICAgICAgIHNiLmFwcGVuZCgibnVsbCIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2IuYXBwZW5kKHRoaXMuYXplKTsKKyAgICAgIH0KKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICBzYi5hcHBlbmQoIikiKTsKKyAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgLy8gY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcworICAgICAgLy8gY2hlY2sgZm9yIHN1Yi1zdHJ1Y3QgdmFsaWRpdHkKKyAgICAgIGlmIChzdWNjZXNzICE9IG51bGwpIHsKKyAgICAgICAgc3VjY2Vzcy52YWxpZGF0ZSgpOworICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgIHRyeSB7CisgICAgICAgIHdyaXRlKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQ29tcGFjdFByb3RvY29sKG5ldyBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVElPU3RyZWFtVHJhbnNwb3J0KG91dCkpKTsKKyAgICAgIH0gY2F0Y2ggKG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24gdGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IGphdmEuaW8uSU9FeGNlcHRpb24odGUpOworICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0KGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0gaW4pIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgIHRyeSB7CisgICAgICAgIHJlYWQobmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRDb21wYWN0UHJvdG9jb2wobmV3IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5USU9TdHJlYW1UcmFuc3BvcnQoaW4pKSk7CisgICAgICB9IGNhdGNoIChvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHRlKSB7CisgICAgICAgIHRocm93IG5ldyBqYXZhLmlvLklPRXhjZXB0aW9uKHRlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBnZXRDb21wb25lbnRQYWdlSW5mb19yZXN1bHRTdGFuZGFyZFNjaGVtZUZhY3RvcnkgaW1wbGVtZW50cyBTY2hlbWVGYWN0b3J5IHsKKyAgICAgIHB1YmxpYyBnZXRDb21wb25lbnRQYWdlSW5mb19yZXN1bHRTdGFuZGFyZFNjaGVtZSBnZXRTY2hlbWUoKSB7CisgICAgICAgIHJldHVybiBuZXcgZ2V0Q29tcG9uZW50UGFnZUluZm9fcmVzdWx0U3RhbmRhcmRTY2hlbWUoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBnZXRDb21wb25lbnRQYWdlSW5mb19yZXN1bHRTdGFuZGFyZFNjaGVtZSBleHRlbmRzIFN0YW5kYXJkU2NoZW1lPGdldENvbXBvbmVudFBhZ2VJbmZvX3Jlc3VsdD4geworCisgICAgICBwdWJsaWMgdm9pZCByZWFkKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBpcHJvdCwgZ2V0Q29tcG9uZW50UGFnZUluZm9fcmVzdWx0IHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgc2NoZW1lRmllbGQ7CisgICAgICAgIGlwcm90LnJlYWRTdHJ1Y3RCZWdpbigpOworICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgeworICAgICAgICAgIHNjaGVtZUZpZWxkID0gaXByb3QucmVhZEZpZWxkQmVnaW4oKTsKKyAgICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVE9QKSB7IAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIHN3aXRjaCAoc2NoZW1lRmllbGQuaWQpIHsKKyAgICAgICAgICAgIGNhc2UgMDogLy8gU1VDQ0VTUworICAgICAgICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QpIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3Quc3VjY2VzcyA9IG5ldyBDb21wb25lbnRQYWdlSW5mbygpOworICAgICAgICAgICAgICAgIHN0cnVjdC5zdWNjZXNzLnJlYWQoaXByb3QpOworICAgICAgICAgICAgICAgIHN0cnVjdC5zZXRfc3VjY2Vzc19pc1NldCh0cnVlKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsgCisgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTogLy8gRQorICAgICAgICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QpIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QuZSA9IG5ldyBOb3RBbGl2ZUV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIHN0cnVjdC5lLnJlYWQoaXByb3QpOworICAgICAgICAgICAgICAgIHN0cnVjdC5zZXRfZV9pc1NldCh0cnVlKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsgCisgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjogLy8gQVpFCisgICAgICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCkgeworICAgICAgICAgICAgICAgIHN0cnVjdC5hemUgPSBuZXcgQXV0aG9yaXphdGlvbkV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIHN0cnVjdC5hemUucmVhZChpcHJvdCk7CisgICAgICAgICAgICAgICAgc3RydWN0LnNldF9hemVfaXNTZXQodHJ1ZSk7CisgICAgICAgICAgICAgIH0gZWxzZSB7IAorICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgc2NoZW1lRmllbGQudHlwZSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOworICAgICAgICAgIH0KKyAgICAgICAgICBpcHJvdC5yZWFkRmllbGRFbmQoKTsKKyAgICAgICAgfQorICAgICAgICBpcHJvdC5yZWFkU3RydWN0RW5kKCk7CisgICAgICAgIHN0cnVjdC52YWxpZGF0ZSgpOworICAgICAgfQorCisgICAgICBwdWJsaWMgdm9pZCB3cml0ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgb3Byb3QsIGdldENvbXBvbmVudFBhZ2VJbmZvX3Jlc3VsdCBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgICAgc3RydWN0LnZhbGlkYXRlKCk7CisKKyAgICAgICAgb3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihTVFJVQ1RfREVTQyk7CisgICAgICAgIGlmIChzdHJ1Y3Quc3VjY2VzcyAhPSBudWxsKSB7CisgICAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKFNVQ0NFU1NfRklFTERfREVTQyk7CisgICAgICAgICAgc3RydWN0LnN1Y2Nlc3Mud3JpdGUob3Byb3QpOworICAgICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RydWN0LmUgIT0gbnVsbCkgeworICAgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihFX0ZJRUxEX0RFU0MpOworICAgICAgICAgIHN0cnVjdC5lLndyaXRlKG9wcm90KTsKKyAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cnVjdC5hemUgIT0gbnVsbCkgeworICAgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihBWkVfRklFTERfREVTQyk7CisgICAgICAgICAgc3RydWN0LmF6ZS53cml0ZShvcHJvdCk7CisgICAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgICAgICB9CisgICAgICAgIG9wcm90LndyaXRlRmllbGRTdG9wKCk7CisgICAgICAgIG9wcm90LndyaXRlU3RydWN0RW5kKCk7CisgICAgICB9CisKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBnZXRDb21wb25lbnRQYWdlSW5mb19yZXN1bHRUdXBsZVNjaGVtZUZhY3RvcnkgaW1wbGVtZW50cyBTY2hlbWVGYWN0b3J5IHsKKyAgICAgIHB1YmxpYyBnZXRDb21wb25lbnRQYWdlSW5mb19yZXN1bHRUdXBsZVNjaGVtZSBnZXRTY2hlbWUoKSB7CisgICAgICAgIHJldHVybiBuZXcgZ2V0Q29tcG9uZW50UGFnZUluZm9fcmVzdWx0VHVwbGVTY2hlbWUoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBnZXRDb21wb25lbnRQYWdlSW5mb19yZXN1bHRUdXBsZVNjaGVtZSBleHRlbmRzIFR1cGxlU2NoZW1lPGdldENvbXBvbmVudFBhZ2VJbmZvX3Jlc3VsdD4geworCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBwcm90LCBnZXRDb21wb25lbnRQYWdlSW5mb19yZXN1bHQgc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICAgIFRUdXBsZVByb3RvY29sIG9wcm90ID0gKFRUdXBsZVByb3RvY29sKSBwcm90OworICAgICAgICBCaXRTZXQgb3B0aW9uYWxzID0gbmV3IEJpdFNldCgpOworICAgICAgICBpZiAoc3RydWN0LmlzX3NldF9zdWNjZXNzKCkpIHsKKyAgICAgICAgICBvcHRpb25hbHMuc2V0KDApOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X2UoKSkgeworICAgICAgICAgIG9wdGlvbmFscy5zZXQoMSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cnVjdC5pc19zZXRfYXplKCkpIHsKKyAgICAgICAgICBvcHRpb25hbHMuc2V0KDIpOworICAgICAgICB9CisgICAgICAgIG9wcm90LndyaXRlQml0U2V0KG9wdGlvbmFscywgMyk7CisgICAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X3N1Y2Nlc3MoKSkgeworICAgICAgICAgIHN0cnVjdC5zdWNjZXNzLndyaXRlKG9wcm90KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RydWN0LmlzX3NldF9lKCkpIHsKKyAgICAgICAgICBzdHJ1Y3QuZS53cml0ZShvcHJvdCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cnVjdC5pc19zZXRfYXplKCkpIHsKKyAgICAgICAgICBzdHJ1Y3QuYXplLndyaXRlKG9wcm90KTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIHJlYWQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIHByb3QsIGdldENvbXBvbmVudFBhZ2VJbmZvX3Jlc3VsdCBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgICAgVFR1cGxlUHJvdG9jb2wgaXByb3QgPSAoVFR1cGxlUHJvdG9jb2wpIHByb3Q7CisgICAgICAgIEJpdFNldCBpbmNvbWluZyA9IGlwcm90LnJlYWRCaXRTZXQoMyk7CisgICAgICAgIGlmIChpbmNvbWluZy5nZXQoMCkpIHsKKyAgICAgICAgICBzdHJ1Y3Quc3VjY2VzcyA9IG5ldyBDb21wb25lbnRQYWdlSW5mbygpOworICAgICAgICAgIHN0cnVjdC5zdWNjZXNzLnJlYWQoaXByb3QpOworICAgICAgICAgIHN0cnVjdC5zZXRfc3VjY2Vzc19pc1NldCh0cnVlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5jb21pbmcuZ2V0KDEpKSB7CisgICAgICAgICAgc3RydWN0LmUgPSBuZXcgTm90QWxpdmVFeGNlcHRpb24oKTsKKyAgICAgICAgICBzdHJ1Y3QuZS5yZWFkKGlwcm90KTsKKyAgICAgICAgICBzdHJ1Y3Quc2V0X2VfaXNTZXQodHJ1ZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGluY29taW5nLmdldCgyKSkgeworICAgICAgICAgIHN0cnVjdC5hemUgPSBuZXcgQXV0aG9yaXphdGlvbkV4Y2VwdGlvbigpOworICAgICAgICAgIHN0cnVjdC5hemUucmVhZChpcHJvdCk7CisgICAgICAgICAgc3RydWN0LnNldF9hemVfaXNTZXQodHJ1ZSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgfQorCiAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgZ2V0VG9wb2xvZ3lDb25mX2FyZ3MgaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZTxnZXRUb3BvbG9neUNvbmZfYXJncywgZ2V0VG9wb2xvZ3lDb25mX2FyZ3MuX0ZpZWxkcz4sIGphdmEuaW8uU2VyaWFsaXphYmxlLCBDbG9uZWFibGUsIENvbXBhcmFibGU8Z2V0VG9wb2xvZ3lDb25mX2FyZ3M+ICAgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QgU1RSVUNUX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdCgiZ2V0VG9wb2xvZ3lDb25mX2FyZ3MiKTsKIApAQCAtMjI3MDUsNCArMjkyMzUsODMxIEBACiAKICAgfQogCisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgZ2V0VG9wb2xvZ3lIaXN0b3J5X2FyZ3MgaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZTxnZXRUb3BvbG9neUhpc3RvcnlfYXJncywgZ2V0VG9wb2xvZ3lIaXN0b3J5X2FyZ3MuX0ZpZWxkcz4sIGphdmEuaW8uU2VyaWFsaXphYmxlLCBDbG9uZWFibGUsIENvbXBhcmFibGU8Z2V0VG9wb2xvZ3lIaXN0b3J5X2FyZ3M+ICAgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QgU1RSVUNUX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdCgiZ2V0VG9wb2xvZ3lIaXN0b3J5X2FyZ3MiKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBVU0VSX0ZJRUxEX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkKCJ1c2VyIiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCAoc2hvcnQpMSk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8Q2xhc3M8PyBleHRlbmRzIElTY2hlbWU+LCBTY2hlbWVGYWN0b3J5PiBzY2hlbWVzID0gbmV3IEhhc2hNYXA8Q2xhc3M8PyBleHRlbmRzIElTY2hlbWU+LCBTY2hlbWVGYWN0b3J5PigpOworICAgIHN0YXRpYyB7CisgICAgICBzY2hlbWVzLnB1dChTdGFuZGFyZFNjaGVtZS5jbGFzcywgbmV3IGdldFRvcG9sb2d5SGlzdG9yeV9hcmdzU3RhbmRhcmRTY2hlbWVGYWN0b3J5KCkpOworICAgICAgc2NoZW1lcy5wdXQoVHVwbGVTY2hlbWUuY2xhc3MsIG5ldyBnZXRUb3BvbG9neUhpc3RvcnlfYXJnc1R1cGxlU2NoZW1lRmFjdG9yeSgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyB1c2VyOyAvLyByZXF1aXJlZAorCisgICAgLyoqIFRoZSBzZXQgb2YgZmllbGRzIHRoaXMgc3RydWN0IGNvbnRhaW5zLCBhbG9uZyB3aXRoIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9yIGZpbmRpbmcgYW5kIG1hbmlwdWxhdGluZyB0aGVtLiAqLworICAgIHB1YmxpYyBlbnVtIF9GaWVsZHMgaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRJZEVudW0geworICAgICAgVVNFUigoc2hvcnQpMSwgInVzZXIiKTsKKworICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgX0ZpZWxkcz4gYnlOYW1lID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBfRmllbGRzPigpOworCisgICAgICBzdGF0aWMgeworICAgICAgICBmb3IgKF9GaWVsZHMgZmllbGQgOiBFbnVtU2V0LmFsbE9mKF9GaWVsZHMuY2xhc3MpKSB7CisgICAgICAgICAgYnlOYW1lLnB1dChmaWVsZC5nZXRGaWVsZE5hbWUoKSwgZmllbGQpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogRmluZCB0aGUgX0ZpZWxkcyBjb25zdGFudCB0aGF0IG1hdGNoZXMgZmllbGRJZCwgb3IgbnVsbCBpZiBpdHMgbm90IGZvdW5kLgorICAgICAgICovCisgICAgICBwdWJsaWMgc3RhdGljIF9GaWVsZHMgZmluZEJ5VGhyaWZ0SWQoaW50IGZpZWxkSWQpIHsKKyAgICAgICAgc3dpdGNoKGZpZWxkSWQpIHsKKyAgICAgICAgICBjYXNlIDE6IC8vIFVTRVIKKyAgICAgICAgICAgIHJldHVybiBVU0VSOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvKioKKyAgICAgICAqIEZpbmQgdGhlIF9GaWVsZHMgY29uc3RhbnQgdGhhdCBtYXRjaGVzIGZpZWxkSWQsIHRocm93aW5nIGFuIGV4Y2VwdGlvbgorICAgICAgICogaWYgaXQgaXMgbm90IGZvdW5kLgorICAgICAgICovCisgICAgICBwdWJsaWMgc3RhdGljIF9GaWVsZHMgZmluZEJ5VGhyaWZ0SWRPclRocm93KGludCBmaWVsZElkKSB7CisgICAgICAgIF9GaWVsZHMgZmllbGRzID0gZmluZEJ5VGhyaWZ0SWQoZmllbGRJZCk7CisgICAgICAgIGlmIChmaWVsZHMgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRmllbGQgIiArIGZpZWxkSWQgKyAiIGRvZXNuJ3QgZXhpc3QhIik7CisgICAgICAgIHJldHVybiBmaWVsZHM7CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogRmluZCB0aGUgX0ZpZWxkcyBjb25zdGFudCB0aGF0IG1hdGNoZXMgbmFtZSwgb3IgbnVsbCBpZiBpdHMgbm90IGZvdW5kLgorICAgICAgICovCisgICAgICBwdWJsaWMgc3RhdGljIF9GaWVsZHMgZmluZEJ5TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gYnlOYW1lLmdldChuYW1lKTsKKyAgICAgIH0KKworICAgICAgcHJpdmF0ZSBmaW5hbCBzaG9ydCBfdGhyaWZ0SWQ7CisgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBfZmllbGROYW1lOworCisgICAgICBfRmllbGRzKHNob3J0IHRocmlmdElkLCBTdHJpbmcgZmllbGROYW1lKSB7CisgICAgICAgIF90aHJpZnRJZCA9IHRocmlmdElkOworICAgICAgICBfZmllbGROYW1lID0gZmllbGROYW1lOworICAgICAgfQorCisgICAgICBwdWJsaWMgc2hvcnQgZ2V0VGhyaWZ0RmllbGRJZCgpIHsKKyAgICAgICAgcmV0dXJuIF90aHJpZnRJZDsKKyAgICAgIH0KKworICAgICAgcHVibGljIFN0cmluZyBnZXRGaWVsZE5hbWUoKSB7CisgICAgICAgIHJldHVybiBfZmllbGROYW1lOworICAgICAgfQorICAgIH0KKworICAgIC8vIGlzc2V0IGlkIGFzc2lnbm1lbnRzCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBNYXA8X0ZpZWxkcywgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGE+IG1ldGFEYXRhTWFwOworICAgIHN0YXRpYyB7CisgICAgICBNYXA8X0ZpZWxkcywgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGE+IHRtcE1hcCA9IG5ldyBFbnVtTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPihfRmllbGRzLmNsYXNzKTsKKyAgICAgIHRtcE1hcC5wdXQoX0ZpZWxkcy5VU0VSLCBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEoInVzZXIiLCBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRSZXF1aXJlbWVudFR5cGUuREVGQVVMVCwgCisgICAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZFZhbHVlTWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HKSkpOworICAgICAgbWV0YURhdGFNYXAgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAodG1wTWFwKTsKKyAgICAgIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhLmFkZFN0cnVjdE1ldGFEYXRhTWFwKGdldFRvcG9sb2d5SGlzdG9yeV9hcmdzLmNsYXNzLCBtZXRhRGF0YU1hcCk7CisgICAgfQorCisgICAgcHVibGljIGdldFRvcG9sb2d5SGlzdG9yeV9hcmdzKCkgeworICAgIH0KKworICAgIHB1YmxpYyBnZXRUb3BvbG9neUhpc3RvcnlfYXJncygKKyAgICAgIFN0cmluZyB1c2VyKQorICAgIHsKKyAgICAgIHRoaXMoKTsKKyAgICAgIHRoaXMudXNlciA9IHVzZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGVyZm9ybXMgYSBkZWVwIGNvcHkgb24gPGk+b3RoZXI8L2k+LgorICAgICAqLworICAgIHB1YmxpYyBnZXRUb3BvbG9neUhpc3RvcnlfYXJncyhnZXRUb3BvbG9neUhpc3RvcnlfYXJncyBvdGhlcikgeworICAgICAgaWYgKG90aGVyLmlzX3NldF91c2VyKCkpIHsKKyAgICAgICAgdGhpcy51c2VyID0gb3RoZXIudXNlcjsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgZ2V0VG9wb2xvZ3lIaXN0b3J5X2FyZ3MgZGVlcENvcHkoKSB7CisgICAgICByZXR1cm4gbmV3IGdldFRvcG9sb2d5SGlzdG9yeV9hcmdzKHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgdGhpcy51c2VyID0gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldF91c2VyKCkgeworICAgICAgcmV0dXJuIHRoaXMudXNlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRfdXNlcihTdHJpbmcgdXNlcikgeworICAgICAgdGhpcy51c2VyID0gdXNlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB1bnNldF91c2VyKCkgeworICAgICAgdGhpcy51c2VyID0gbnVsbDsKKyAgICB9CisKKyAgICAvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkIHVzZXIgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgICAgcHVibGljIGJvb2xlYW4gaXNfc2V0X3VzZXIoKSB7CisgICAgICByZXR1cm4gdGhpcy51c2VyICE9IG51bGw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0X3VzZXJfaXNTZXQoYm9vbGVhbiB2YWx1ZSkgeworICAgICAgaWYgKCF2YWx1ZSkgeworICAgICAgICB0aGlzLnVzZXIgPSBudWxsOworICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEZpZWxkVmFsdWUoX0ZpZWxkcyBmaWVsZCwgT2JqZWN0IHZhbHVlKSB7CisgICAgICBzd2l0Y2ggKGZpZWxkKSB7CisgICAgICBjYXNlIFVTRVI6CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgdW5zZXRfdXNlcigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHNldF91c2VyKChTdHJpbmcpdmFsdWUpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICB9CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRGaWVsZFZhbHVlKF9GaWVsZHMgZmllbGQpIHsKKyAgICAgIHN3aXRjaCAoZmllbGQpIHsKKyAgICAgIGNhc2UgVVNFUjoKKyAgICAgICAgcmV0dXJuIGdldF91c2VyKCk7CisKKyAgICAgIH0KKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICAvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkIGNvcnJlc3BvbmRpbmcgdG8gZmllbGRJRCBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NldChfRmllbGRzIGZpZWxkKSB7CisgICAgICBpZiAoZmllbGQgPT0gbnVsbCkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICB9CisKKyAgICAgIHN3aXRjaCAoZmllbGQpIHsKKyAgICAgIGNhc2UgVVNFUjoKKyAgICAgICAgcmV0dXJuIGlzX3NldF91c2VyKCk7CisgICAgICB9CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCB0aGF0KSB7CisgICAgICBpZiAodGhhdCA9PSBudWxsKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBpZiAodGhhdCBpbnN0YW5jZW9mIGdldFRvcG9sb2d5SGlzdG9yeV9hcmdzKQorICAgICAgICByZXR1cm4gdGhpcy5lcXVhbHMoKGdldFRvcG9sb2d5SGlzdG9yeV9hcmdzKXRoYXQpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhnZXRUb3BvbG9neUhpc3RvcnlfYXJncyB0aGF0KSB7CisgICAgICBpZiAodGhhdCA9PSBudWxsKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgIGJvb2xlYW4gdGhpc19wcmVzZW50X3VzZXIgPSB0cnVlICYmIHRoaXMuaXNfc2V0X3VzZXIoKTsKKyAgICAgIGJvb2xlYW4gdGhhdF9wcmVzZW50X3VzZXIgPSB0cnVlICYmIHRoYXQuaXNfc2V0X3VzZXIoKTsKKyAgICAgIGlmICh0aGlzX3ByZXNlbnRfdXNlciB8fCB0aGF0X3ByZXNlbnRfdXNlcikgeworICAgICAgICBpZiAoISh0aGlzX3ByZXNlbnRfdXNlciAmJiB0aGF0X3ByZXNlbnRfdXNlcikpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIXRoaXMudXNlci5lcXVhbHModGhhdC51c2VyKSkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICBMaXN0PE9iamVjdD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOworCisgICAgICBib29sZWFuIHByZXNlbnRfdXNlciA9IHRydWUgJiYgKGlzX3NldF91c2VyKCkpOworICAgICAgbGlzdC5hZGQocHJlc2VudF91c2VyKTsKKyAgICAgIGlmIChwcmVzZW50X3VzZXIpCisgICAgICAgIGxpc3QuYWRkKHVzZXIpOworCisgICAgICByZXR1cm4gbGlzdC5oYXNoQ29kZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKGdldFRvcG9sb2d5SGlzdG9yeV9hcmdzIG90aGVyKSB7CisgICAgICBpZiAoIWdldENsYXNzKCkuZXF1YWxzKG90aGVyLmdldENsYXNzKCkpKSB7CisgICAgICAgIHJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKS5jb21wYXJlVG8ob3RoZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgfQorCisgICAgICBpbnQgbGFzdENvbXBhcmlzb24gPSAwOworCisgICAgICBsYXN0Q29tcGFyaXNvbiA9IEJvb2xlYW4udmFsdWVPZihpc19zZXRfdXNlcigpKS5jb21wYXJlVG8ob3RoZXIuaXNfc2V0X3VzZXIoKSk7CisgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICB9CisgICAgICBpZiAoaXNfc2V0X3VzZXIoKSkgeworICAgICAgICBsYXN0Q29tcGFyaXNvbiA9IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvbXBhcmVUbyh0aGlzLnVzZXIsIG90aGVyLnVzZXIpOworICAgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHVibGljIF9GaWVsZHMgZmllbGRGb3JJZChpbnQgZmllbGRJZCkgeworICAgICAgcmV0dXJuIF9GaWVsZHMuZmluZEJ5VGhyaWZ0SWQoZmllbGRJZCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVhZChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgaXByb3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgIHNjaGVtZXMuZ2V0KGlwcm90LmdldFNjaGVtZSgpKS5nZXRTY2hlbWUoKS5yZWFkKGlwcm90LCB0aGlzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgb3Byb3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgIHNjaGVtZXMuZ2V0KG9wcm90LmdldFNjaGVtZSgpKS5nZXRTY2hlbWUoKS53cml0ZShvcHJvdCwgdGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigiZ2V0VG9wb2xvZ3lIaXN0b3J5X2FyZ3MoIik7CisgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKKworICAgICAgc2IuYXBwZW5kKCJ1c2VyOiIpOworICAgICAgaWYgKHRoaXMudXNlciA9PSBudWxsKSB7CisgICAgICAgIHNiLmFwcGVuZCgibnVsbCIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2IuYXBwZW5kKHRoaXMudXNlcik7CisgICAgICB9CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgc2IuYXBwZW5kKCIpIik7CisgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgIC8vIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMKKyAgICAgIC8vIGNoZWNrIGZvciBzdWItc3RydWN0IHZhbGlkaXR5CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgdHJ5IHsKKyAgICAgICAgd3JpdGUobmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRDb21wYWN0UHJvdG9jb2wobmV3IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5USU9TdHJlYW1UcmFuc3BvcnQob3V0KSkpOworICAgICAgfSBjYXRjaCAob3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB0ZSkgeworICAgICAgICB0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbih0ZSk7CisgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBpbikgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgdHJ5IHsKKyAgICAgICAgcmVhZChuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbChuZXcgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRJT1N0cmVhbVRyYW5zcG9ydChpbikpKTsKKyAgICAgIH0gY2F0Y2ggKG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24gdGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IGphdmEuaW8uSU9FeGNlcHRpb24odGUpOworICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIGdldFRvcG9sb2d5SGlzdG9yeV9hcmdzU3RhbmRhcmRTY2hlbWVGYWN0b3J5IGltcGxlbWVudHMgU2NoZW1lRmFjdG9yeSB7CisgICAgICBwdWJsaWMgZ2V0VG9wb2xvZ3lIaXN0b3J5X2FyZ3NTdGFuZGFyZFNjaGVtZSBnZXRTY2hlbWUoKSB7CisgICAgICAgIHJldHVybiBuZXcgZ2V0VG9wb2xvZ3lIaXN0b3J5X2FyZ3NTdGFuZGFyZFNjaGVtZSgpOworICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIGdldFRvcG9sb2d5SGlzdG9yeV9hcmdzU3RhbmRhcmRTY2hlbWUgZXh0ZW5kcyBTdGFuZGFyZFNjaGVtZTxnZXRUb3BvbG9neUhpc3RvcnlfYXJncz4geworCisgICAgICBwdWJsaWMgdm9pZCByZWFkKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBpcHJvdCwgZ2V0VG9wb2xvZ3lIaXN0b3J5X2FyZ3Mgc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBzY2hlbWVGaWVsZDsKKyAgICAgICAgaXByb3QucmVhZFN0cnVjdEJlZ2luKCk7CisgICAgICAgIHdoaWxlICh0cnVlKQorICAgICAgICB7CisgICAgICAgICAgc2NoZW1lRmllbGQgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpOworICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUT1ApIHsgCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgc3dpdGNoIChzY2hlbWVGaWVsZC5pZCkgeworICAgICAgICAgICAgY2FzZSAxOiAvLyBVU0VSCisgICAgICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORykgeworICAgICAgICAgICAgICAgIHN0cnVjdC51c2VyID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICAgICAgICAgIHN0cnVjdC5zZXRfdXNlcl9pc1NldCh0cnVlKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsgCisgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgc2NoZW1lRmllbGQudHlwZSk7CisgICAgICAgICAgfQorICAgICAgICAgIGlwcm90LnJlYWRGaWVsZEVuZCgpOworICAgICAgICB9CisgICAgICAgIGlwcm90LnJlYWRTdHJ1Y3RFbmQoKTsKKyAgICAgICAgc3RydWN0LnZhbGlkYXRlKCk7CisgICAgICB9CisKKyAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBvcHJvdCwgZ2V0VG9wb2xvZ3lIaXN0b3J5X2FyZ3Mgc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICAgIHN0cnVjdC52YWxpZGF0ZSgpOworCisgICAgICAgIG9wcm90LndyaXRlU3RydWN0QmVnaW4oU1RSVUNUX0RFU0MpOworICAgICAgICBpZiAoc3RydWN0LnVzZXIgIT0gbnVsbCkgeworICAgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihVU0VSX0ZJRUxEX0RFU0MpOworICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKHN0cnVjdC51c2VyKTsKKyAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgICAgIH0KKyAgICAgICAgb3Byb3Qud3JpdGVGaWVsZFN0b3AoKTsKKyAgICAgICAgb3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsKKyAgICAgIH0KKworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIGdldFRvcG9sb2d5SGlzdG9yeV9hcmdzVHVwbGVTY2hlbWVGYWN0b3J5IGltcGxlbWVudHMgU2NoZW1lRmFjdG9yeSB7CisgICAgICBwdWJsaWMgZ2V0VG9wb2xvZ3lIaXN0b3J5X2FyZ3NUdXBsZVNjaGVtZSBnZXRTY2hlbWUoKSB7CisgICAgICAgIHJldHVybiBuZXcgZ2V0VG9wb2xvZ3lIaXN0b3J5X2FyZ3NUdXBsZVNjaGVtZSgpOworICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIGdldFRvcG9sb2d5SGlzdG9yeV9hcmdzVHVwbGVTY2hlbWUgZXh0ZW5kcyBUdXBsZVNjaGVtZTxnZXRUb3BvbG9neUhpc3RvcnlfYXJncz4geworCisgICAgICBAT3ZlcnJpZGUKKyAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBwcm90LCBnZXRUb3BvbG9neUhpc3RvcnlfYXJncyBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgICAgVFR1cGxlUHJvdG9jb2wgb3Byb3QgPSAoVFR1cGxlUHJvdG9jb2wpIHByb3Q7CisgICAgICAgIEJpdFNldCBvcHRpb25hbHMgPSBuZXcgQml0U2V0KCk7CisgICAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X3VzZXIoKSkgeworICAgICAgICAgIG9wdGlvbmFscy5zZXQoMCk7CisgICAgICAgIH0KKyAgICAgICAgb3Byb3Qud3JpdGVCaXRTZXQob3B0aW9uYWxzLCAxKTsKKyAgICAgICAgaWYgKHN0cnVjdC5pc19zZXRfdXNlcigpKSB7CisgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoc3RydWN0LnVzZXIpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgcmVhZChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgcHJvdCwgZ2V0VG9wb2xvZ3lIaXN0b3J5X2FyZ3Mgc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICAgIFRUdXBsZVByb3RvY29sIGlwcm90ID0gKFRUdXBsZVByb3RvY29sKSBwcm90OworICAgICAgICBCaXRTZXQgaW5jb21pbmcgPSBpcHJvdC5yZWFkQml0U2V0KDEpOworICAgICAgICBpZiAoaW5jb21pbmcuZ2V0KDApKSB7CisgICAgICAgICAgc3RydWN0LnVzZXIgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgc3RydWN0LnNldF91c2VyX2lzU2V0KHRydWUpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgIH0KKworICBwdWJsaWMgc3RhdGljIGNsYXNzIGdldFRvcG9sb2d5SGlzdG9yeV9yZXN1bHQgaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZTxnZXRUb3BvbG9neUhpc3RvcnlfcmVzdWx0LCBnZXRUb3BvbG9neUhpc3RvcnlfcmVzdWx0Ll9GaWVsZHM+LCBqYXZhLmlvLlNlcmlhbGl6YWJsZSwgQ2xvbmVhYmxlLCBDb21wYXJhYmxlPGdldFRvcG9sb2d5SGlzdG9yeV9yZXN1bHQ+ICAgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QgU1RSVUNUX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdCgiZ2V0VG9wb2xvZ3lIaXN0b3J5X3Jlc3VsdCIpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIFNVQ0NFU1NfRklFTERfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQoInN1Y2Nlc3MiLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIChzaG9ydCkwKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgQVpFX0ZJRUxEX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkKCJhemUiLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIChzaG9ydCkxKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxDbGFzczw/IGV4dGVuZHMgSVNjaGVtZT4sIFNjaGVtZUZhY3Rvcnk+IHNjaGVtZXMgPSBuZXcgSGFzaE1hcDxDbGFzczw/IGV4dGVuZHMgSVNjaGVtZT4sIFNjaGVtZUZhY3Rvcnk+KCk7CisgICAgc3RhdGljIHsKKyAgICAgIHNjaGVtZXMucHV0KFN0YW5kYXJkU2NoZW1lLmNsYXNzLCBuZXcgZ2V0VG9wb2xvZ3lIaXN0b3J5X3Jlc3VsdFN0YW5kYXJkU2NoZW1lRmFjdG9yeSgpKTsKKyAgICAgIHNjaGVtZXMucHV0KFR1cGxlU2NoZW1lLmNsYXNzLCBuZXcgZ2V0VG9wb2xvZ3lIaXN0b3J5X3Jlc3VsdFR1cGxlU2NoZW1lRmFjdG9yeSgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFRvcG9sb2d5SGlzdG9yeUluZm8gc3VjY2VzczsgLy8gcmVxdWlyZWQKKyAgICBwcml2YXRlIEF1dGhvcml6YXRpb25FeGNlcHRpb24gYXplOyAvLyByZXF1aXJlZAorCisgICAgLyoqIFRoZSBzZXQgb2YgZmllbGRzIHRoaXMgc3RydWN0IGNvbnRhaW5zLCBhbG9uZyB3aXRoIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9yIGZpbmRpbmcgYW5kIG1hbmlwdWxhdGluZyB0aGVtLiAqLworICAgIHB1YmxpYyBlbnVtIF9GaWVsZHMgaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRJZEVudW0geworICAgICAgU1VDQ0VTUygoc2hvcnQpMCwgInN1Y2Nlc3MiKSwKKyAgICAgIEFaRSgoc2hvcnQpMSwgImF6ZSIpOworCisgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBfRmllbGRzPiBieU5hbWUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIF9GaWVsZHM+KCk7CisKKyAgICAgIHN0YXRpYyB7CisgICAgICAgIGZvciAoX0ZpZWxkcyBmaWVsZCA6IEVudW1TZXQuYWxsT2YoX0ZpZWxkcy5jbGFzcykpIHsKKyAgICAgICAgICBieU5hbWUucHV0KGZpZWxkLmdldEZpZWxkTmFtZSgpLCBmaWVsZCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBGaW5kIHRoZSBfRmllbGRzIGNvbnN0YW50IHRoYXQgbWF0Y2hlcyBmaWVsZElkLCBvciBudWxsIGlmIGl0cyBub3QgZm91bmQuCisgICAgICAgKi8KKyAgICAgIHB1YmxpYyBzdGF0aWMgX0ZpZWxkcyBmaW5kQnlUaHJpZnRJZChpbnQgZmllbGRJZCkgeworICAgICAgICBzd2l0Y2goZmllbGRJZCkgeworICAgICAgICAgIGNhc2UgMDogLy8gU1VDQ0VTUworICAgICAgICAgICAgcmV0dXJuIFNVQ0NFU1M7CisgICAgICAgICAgY2FzZSAxOiAvLyBBWkUKKyAgICAgICAgICAgIHJldHVybiBBWkU7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIC8qKgorICAgICAgICogRmluZCB0aGUgX0ZpZWxkcyBjb25zdGFudCB0aGF0IG1hdGNoZXMgZmllbGRJZCwgdGhyb3dpbmcgYW4gZXhjZXB0aW9uCisgICAgICAgKiBpZiBpdCBpcyBub3QgZm91bmQuCisgICAgICAgKi8KKyAgICAgIHB1YmxpYyBzdGF0aWMgX0ZpZWxkcyBmaW5kQnlUaHJpZnRJZE9yVGhyb3coaW50IGZpZWxkSWQpIHsKKyAgICAgICAgX0ZpZWxkcyBmaWVsZHMgPSBmaW5kQnlUaHJpZnRJZChmaWVsZElkKTsKKyAgICAgICAgaWYgKGZpZWxkcyA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJGaWVsZCAiICsgZmllbGRJZCArICIgZG9lc24ndCBleGlzdCEiKTsKKyAgICAgICAgcmV0dXJuIGZpZWxkczsKKyAgICAgIH0KKworICAgICAgLyoqCisgICAgICAgKiBGaW5kIHRoZSBfRmllbGRzIGNvbnN0YW50IHRoYXQgbWF0Y2hlcyBuYW1lLCBvciBudWxsIGlmIGl0cyBub3QgZm91bmQuCisgICAgICAgKi8KKyAgICAgIHB1YmxpYyBzdGF0aWMgX0ZpZWxkcyBmaW5kQnlOYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiBieU5hbWUuZ2V0KG5hbWUpOworICAgICAgfQorCisgICAgICBwcml2YXRlIGZpbmFsIHNob3J0IF90aHJpZnRJZDsKKyAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIF9maWVsZE5hbWU7CisKKyAgICAgIF9GaWVsZHMoc2hvcnQgdGhyaWZ0SWQsIFN0cmluZyBmaWVsZE5hbWUpIHsKKyAgICAgICAgX3RocmlmdElkID0gdGhyaWZ0SWQ7CisgICAgICAgIF9maWVsZE5hbWUgPSBmaWVsZE5hbWU7CisgICAgICB9CisKKyAgICAgIHB1YmxpYyBzaG9ydCBnZXRUaHJpZnRGaWVsZElkKCkgeworICAgICAgICByZXR1cm4gX3RocmlmdElkOworICAgICAgfQorCisgICAgICBwdWJsaWMgU3RyaW5nIGdldEZpZWxkTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIF9maWVsZE5hbWU7CisgICAgICB9CisgICAgfQorCisgICAgLy8gaXNzZXQgaWQgYXNzaWdubWVudHMKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE1hcDxfRmllbGRzLCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YT4gbWV0YURhdGFNYXA7CisgICAgc3RhdGljIHsKKyAgICAgIE1hcDxfRmllbGRzLCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YT4gdG1wTWFwID0gbmV3IEVudW1NYXA8X0ZpZWxkcywgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGE+KF9GaWVsZHMuY2xhc3MpOworICAgICAgdG1wTWFwLnB1dChfRmllbGRzLlNVQ0NFU1MsIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YSgic3VjY2VzcyIsIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZFJlcXVpcmVtZW50VHlwZS5ERUZBVUxULCAKKyAgICAgICAgICBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLlN0cnVjdE1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCwgVG9wb2xvZ3lIaXN0b3J5SW5mby5jbGFzcykpKTsKKyAgICAgIHRtcE1hcC5wdXQoX0ZpZWxkcy5BWkUsIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YSgiYXplIiwgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLkRFRkFVTFQsIAorICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRWYWx1ZU1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCkpKTsKKyAgICAgIG1ldGFEYXRhTWFwID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKHRtcE1hcCk7CisgICAgICBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YS5hZGRTdHJ1Y3RNZXRhRGF0YU1hcChnZXRUb3BvbG9neUhpc3RvcnlfcmVzdWx0LmNsYXNzLCBtZXRhRGF0YU1hcCk7CisgICAgfQorCisgICAgcHVibGljIGdldFRvcG9sb2d5SGlzdG9yeV9yZXN1bHQoKSB7CisgICAgfQorCisgICAgcHVibGljIGdldFRvcG9sb2d5SGlzdG9yeV9yZXN1bHQoCisgICAgICBUb3BvbG9neUhpc3RvcnlJbmZvIHN1Y2Nlc3MsCisgICAgICBBdXRob3JpemF0aW9uRXhjZXB0aW9uIGF6ZSkKKyAgICB7CisgICAgICB0aGlzKCk7CisgICAgICB0aGlzLnN1Y2Nlc3MgPSBzdWNjZXNzOworICAgICAgdGhpcy5hemUgPSBhemU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGVyZm9ybXMgYSBkZWVwIGNvcHkgb24gPGk+b3RoZXI8L2k+LgorICAgICAqLworICAgIHB1YmxpYyBnZXRUb3BvbG9neUhpc3RvcnlfcmVzdWx0KGdldFRvcG9sb2d5SGlzdG9yeV9yZXN1bHQgb3RoZXIpIHsKKyAgICAgIGlmIChvdGhlci5pc19zZXRfc3VjY2VzcygpKSB7CisgICAgICAgIHRoaXMuc3VjY2VzcyA9IG5ldyBUb3BvbG9neUhpc3RvcnlJbmZvKG90aGVyLnN1Y2Nlc3MpOworICAgICAgfQorICAgICAgaWYgKG90aGVyLmlzX3NldF9hemUoKSkgeworICAgICAgICB0aGlzLmF6ZSA9IG5ldyBBdXRob3JpemF0aW9uRXhjZXB0aW9uKG90aGVyLmF6ZSk7CisgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGdldFRvcG9sb2d5SGlzdG9yeV9yZXN1bHQgZGVlcENvcHkoKSB7CisgICAgICByZXR1cm4gbmV3IGdldFRvcG9sb2d5SGlzdG9yeV9yZXN1bHQodGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgICB0aGlzLnN1Y2Nlc3MgPSBudWxsOworICAgICAgdGhpcy5hemUgPSBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBUb3BvbG9neUhpc3RvcnlJbmZvIGdldF9zdWNjZXNzKCkgeworICAgICAgcmV0dXJuIHRoaXMuc3VjY2VzczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRfc3VjY2VzcyhUb3BvbG9neUhpc3RvcnlJbmZvIHN1Y2Nlc3MpIHsKKyAgICAgIHRoaXMuc3VjY2VzcyA9IHN1Y2Nlc3M7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdW5zZXRfc3VjY2VzcygpIHsKKyAgICAgIHRoaXMuc3VjY2VzcyA9IG51bGw7CisgICAgfQorCisgICAgLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBzdWNjZXNzIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLworICAgIHB1YmxpYyBib29sZWFuIGlzX3NldF9zdWNjZXNzKCkgeworICAgICAgcmV0dXJuIHRoaXMuc3VjY2VzcyAhPSBudWxsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldF9zdWNjZXNzX2lzU2V0KGJvb2xlYW4gdmFsdWUpIHsKKyAgICAgIGlmICghdmFsdWUpIHsKKyAgICAgICAgdGhpcy5zdWNjZXNzID0gbnVsbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgQXV0aG9yaXphdGlvbkV4Y2VwdGlvbiBnZXRfYXplKCkgeworICAgICAgcmV0dXJuIHRoaXMuYXplOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldF9hemUoQXV0aG9yaXphdGlvbkV4Y2VwdGlvbiBhemUpIHsKKyAgICAgIHRoaXMuYXplID0gYXplOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHVuc2V0X2F6ZSgpIHsKKyAgICAgIHRoaXMuYXplID0gbnVsbDsKKyAgICB9CisKKyAgICAvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkIGF6ZSBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc19zZXRfYXplKCkgeworICAgICAgcmV0dXJuIHRoaXMuYXplICE9IG51bGw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0X2F6ZV9pc1NldChib29sZWFuIHZhbHVlKSB7CisgICAgICBpZiAoIXZhbHVlKSB7CisgICAgICAgIHRoaXMuYXplID0gbnVsbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGaWVsZFZhbHVlKF9GaWVsZHMgZmllbGQsIE9iamVjdCB2YWx1ZSkgeworICAgICAgc3dpdGNoIChmaWVsZCkgeworICAgICAgY2FzZSBTVUNDRVNTOgorICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgIHVuc2V0X3N1Y2Nlc3MoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBzZXRfc3VjY2VzcygoVG9wb2xvZ3lIaXN0b3J5SW5mbyl2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgQVpFOgorICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgIHVuc2V0X2F6ZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHNldF9hemUoKEF1dGhvcml6YXRpb25FeGNlcHRpb24pdmFsdWUpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICB9CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRGaWVsZFZhbHVlKF9GaWVsZHMgZmllbGQpIHsKKyAgICAgIHN3aXRjaCAoZmllbGQpIHsKKyAgICAgIGNhc2UgU1VDQ0VTUzoKKyAgICAgICAgcmV0dXJuIGdldF9zdWNjZXNzKCk7CisKKyAgICAgIGNhc2UgQVpFOgorICAgICAgICByZXR1cm4gZ2V0X2F6ZSgpOworCisgICAgICB9CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBjb3JyZXNwb25kaW5nIHRvIGZpZWxkSUQgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTZXQoX0ZpZWxkcyBmaWVsZCkgeworICAgICAgaWYgKGZpZWxkID09IG51bGwpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgfQorCisgICAgICBzd2l0Y2ggKGZpZWxkKSB7CisgICAgICBjYXNlIFNVQ0NFU1M6CisgICAgICAgIHJldHVybiBpc19zZXRfc3VjY2VzcygpOworICAgICAgY2FzZSBBWkU6CisgICAgICAgIHJldHVybiBpc19zZXRfYXplKCk7CisgICAgICB9CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCB0aGF0KSB7CisgICAgICBpZiAodGhhdCA9PSBudWxsKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBpZiAodGhhdCBpbnN0YW5jZW9mIGdldFRvcG9sb2d5SGlzdG9yeV9yZXN1bHQpCisgICAgICAgIHJldHVybiB0aGlzLmVxdWFscygoZ2V0VG9wb2xvZ3lIaXN0b3J5X3Jlc3VsdCl0aGF0KTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZ2V0VG9wb2xvZ3lIaXN0b3J5X3Jlc3VsdCB0aGF0KSB7CisgICAgICBpZiAodGhhdCA9PSBudWxsKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgIGJvb2xlYW4gdGhpc19wcmVzZW50X3N1Y2Nlc3MgPSB0cnVlICYmIHRoaXMuaXNfc2V0X3N1Y2Nlc3MoKTsKKyAgICAgIGJvb2xlYW4gdGhhdF9wcmVzZW50X3N1Y2Nlc3MgPSB0cnVlICYmIHRoYXQuaXNfc2V0X3N1Y2Nlc3MoKTsKKyAgICAgIGlmICh0aGlzX3ByZXNlbnRfc3VjY2VzcyB8fCB0aGF0X3ByZXNlbnRfc3VjY2VzcykgeworICAgICAgICBpZiAoISh0aGlzX3ByZXNlbnRfc3VjY2VzcyAmJiB0aGF0X3ByZXNlbnRfc3VjY2VzcykpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIXRoaXMuc3VjY2Vzcy5lcXVhbHModGhhdC5zdWNjZXNzKSkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIGJvb2xlYW4gdGhpc19wcmVzZW50X2F6ZSA9IHRydWUgJiYgdGhpcy5pc19zZXRfYXplKCk7CisgICAgICBib29sZWFuIHRoYXRfcHJlc2VudF9hemUgPSB0cnVlICYmIHRoYXQuaXNfc2V0X2F6ZSgpOworICAgICAgaWYgKHRoaXNfcHJlc2VudF9hemUgfHwgdGhhdF9wcmVzZW50X2F6ZSkgeworICAgICAgICBpZiAoISh0aGlzX3ByZXNlbnRfYXplICYmIHRoYXRfcHJlc2VudF9hemUpKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCF0aGlzLmF6ZS5lcXVhbHModGhhdC5hemUpKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgIExpc3Q8T2JqZWN0PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7CisKKyAgICAgIGJvb2xlYW4gcHJlc2VudF9zdWNjZXNzID0gdHJ1ZSAmJiAoaXNfc2V0X3N1Y2Nlc3MoKSk7CisgICAgICBsaXN0LmFkZChwcmVzZW50X3N1Y2Nlc3MpOworICAgICAgaWYgKHByZXNlbnRfc3VjY2VzcykKKyAgICAgICAgbGlzdC5hZGQoc3VjY2Vzcyk7CisKKyAgICAgIGJvb2xlYW4gcHJlc2VudF9hemUgPSB0cnVlICYmIChpc19zZXRfYXplKCkpOworICAgICAgbGlzdC5hZGQocHJlc2VudF9hemUpOworICAgICAgaWYgKHByZXNlbnRfYXplKQorICAgICAgICBsaXN0LmFkZChhemUpOworCisgICAgICByZXR1cm4gbGlzdC5oYXNoQ29kZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKGdldFRvcG9sb2d5SGlzdG9yeV9yZXN1bHQgb3RoZXIpIHsKKyAgICAgIGlmICghZ2V0Q2xhc3MoKS5lcXVhbHMob3RoZXIuZ2V0Q2xhc3MoKSkpIHsKKyAgICAgICAgcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpLmNvbXBhcmVUbyhvdGhlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICB9CisKKyAgICAgIGludCBsYXN0Q29tcGFyaXNvbiA9IDA7CisKKyAgICAgIGxhc3RDb21wYXJpc29uID0gQm9vbGVhbi52YWx1ZU9mKGlzX3NldF9zdWNjZXNzKCkpLmNvbXBhcmVUbyhvdGhlci5pc19zZXRfc3VjY2VzcygpKTsKKyAgICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICAgIH0KKyAgICAgIGlmIChpc19zZXRfc3VjY2VzcygpKSB7CisgICAgICAgIGxhc3RDb21wYXJpc29uID0gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29tcGFyZVRvKHRoaXMuc3VjY2Vzcywgb3RoZXIuc3VjY2Vzcyk7CisgICAgICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgICAgICB9CisgICAgICB9CisgICAgICBsYXN0Q29tcGFyaXNvbiA9IEJvb2xlYW4udmFsdWVPZihpc19zZXRfYXplKCkpLmNvbXBhcmVUbyhvdGhlci5pc19zZXRfYXplKCkpOworICAgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgICAgfQorICAgICAgaWYgKGlzX3NldF9hemUoKSkgeworICAgICAgICBsYXN0Q29tcGFyaXNvbiA9IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvbXBhcmVUbyh0aGlzLmF6ZSwgb3RoZXIuYXplKTsKKyAgICAgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHB1YmxpYyBfRmllbGRzIGZpZWxkRm9ySWQoaW50IGZpZWxkSWQpIHsKKyAgICAgIHJldHVybiBfRmllbGRzLmZpbmRCeVRocmlmdElkKGZpZWxkSWQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlYWQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIGlwcm90KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICBzY2hlbWVzLmdldChpcHJvdC5nZXRTY2hlbWUoKSkuZ2V0U2NoZW1lKCkucmVhZChpcHJvdCwgdGhpcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIG9wcm90KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICBzY2hlbWVzLmdldChvcHJvdC5nZXRTY2hlbWUoKSkuZ2V0U2NoZW1lKCkud3JpdGUob3Byb3QsIHRoaXMpOworICAgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigiZ2V0VG9wb2xvZ3lIaXN0b3J5X3Jlc3VsdCgiKTsKKyAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOworCisgICAgICBzYi5hcHBlbmQoInN1Y2Nlc3M6Iik7CisgICAgICBpZiAodGhpcy5zdWNjZXNzID09IG51bGwpIHsKKyAgICAgICAgc2IuYXBwZW5kKCJudWxsIik7CisgICAgICB9IGVsc2UgeworICAgICAgICBzYi5hcHBlbmQodGhpcy5zdWNjZXNzKTsKKyAgICAgIH0KKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICBpZiAoIWZpcnN0KSBzYi5hcHBlbmQoIiwgIik7CisgICAgICBzYi5hcHBlbmQoImF6ZToiKTsKKyAgICAgIGlmICh0aGlzLmF6ZSA9PSBudWxsKSB7CisgICAgICAgIHNiLmFwcGVuZCgibnVsbCIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2IuYXBwZW5kKHRoaXMuYXplKTsKKyAgICAgIH0KKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICBzYi5hcHBlbmQoIikiKTsKKyAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgLy8gY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcworICAgICAgLy8gY2hlY2sgZm9yIHN1Yi1zdHJ1Y3QgdmFsaWRpdHkKKyAgICAgIGlmIChzdWNjZXNzICE9IG51bGwpIHsKKyAgICAgICAgc3VjY2Vzcy52YWxpZGF0ZSgpOworICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICAgIHRyeSB7CisgICAgICAgIHdyaXRlKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQ29tcGFjdFByb3RvY29sKG5ldyBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVElPU3RyZWFtVHJhbnNwb3J0KG91dCkpKTsKKyAgICAgIH0gY2F0Y2ggKG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24gdGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IGphdmEuaW8uSU9FeGNlcHRpb24odGUpOworICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0KGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0gaW4pIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgIHRyeSB7CisgICAgICAgIHJlYWQobmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRDb21wYWN0UHJvdG9jb2wobmV3IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5USU9TdHJlYW1UcmFuc3BvcnQoaW4pKSk7CisgICAgICB9IGNhdGNoIChvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHRlKSB7CisgICAgICAgIHRocm93IG5ldyBqYXZhLmlvLklPRXhjZXB0aW9uKHRlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBnZXRUb3BvbG9neUhpc3RvcnlfcmVzdWx0U3RhbmRhcmRTY2hlbWVGYWN0b3J5IGltcGxlbWVudHMgU2NoZW1lRmFjdG9yeSB7CisgICAgICBwdWJsaWMgZ2V0VG9wb2xvZ3lIaXN0b3J5X3Jlc3VsdFN0YW5kYXJkU2NoZW1lIGdldFNjaGVtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBnZXRUb3BvbG9neUhpc3RvcnlfcmVzdWx0U3RhbmRhcmRTY2hlbWUoKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBnZXRUb3BvbG9neUhpc3RvcnlfcmVzdWx0U3RhbmRhcmRTY2hlbWUgZXh0ZW5kcyBTdGFuZGFyZFNjaGVtZTxnZXRUb3BvbG9neUhpc3RvcnlfcmVzdWx0PiB7CisKKyAgICAgIHB1YmxpYyB2b2lkIHJlYWQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIGlwcm90LCBnZXRUb3BvbG9neUhpc3RvcnlfcmVzdWx0IHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgc2NoZW1lRmllbGQ7CisgICAgICAgIGlwcm90LnJlYWRTdHJ1Y3RCZWdpbigpOworICAgICAgICB3aGlsZSAodHJ1ZSkKKyAgICAgICAgeworICAgICAgICAgIHNjaGVtZUZpZWxkID0gaXByb3QucmVhZEZpZWxkQmVnaW4oKTsKKyAgICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVE9QKSB7IAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICAgIHN3aXRjaCAoc2NoZW1lRmllbGQuaWQpIHsKKyAgICAgICAgICAgIGNhc2UgMDogLy8gU1VDQ0VTUworICAgICAgICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QpIHsKKyAgICAgICAgICAgICAgICBzdHJ1Y3Quc3VjY2VzcyA9IG5ldyBUb3BvbG9neUhpc3RvcnlJbmZvKCk7CisgICAgICAgICAgICAgICAgc3RydWN0LnN1Y2Nlc3MucmVhZChpcHJvdCk7CisgICAgICAgICAgICAgICAgc3RydWN0LnNldF9zdWNjZXNzX2lzU2V0KHRydWUpOworICAgICAgICAgICAgICB9IGVsc2UgeyAKKyAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOiAvLyBBWkUKKyAgICAgICAgICAgICAgaWYgKHNjaGVtZUZpZWxkLnR5cGUgPT0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNUKSB7CisgICAgICAgICAgICAgICAgc3RydWN0LmF6ZSA9IG5ldyBBdXRob3JpemF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgc3RydWN0LmF6ZS5yZWFkKGlwcm90KTsKKyAgICAgICAgICAgICAgICBzdHJ1Y3Quc2V0X2F6ZV9pc1NldCh0cnVlKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsgCisgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgc2NoZW1lRmllbGQudHlwZSk7CisgICAgICAgICAgfQorICAgICAgICAgIGlwcm90LnJlYWRGaWVsZEVuZCgpOworICAgICAgICB9CisgICAgICAgIGlwcm90LnJlYWRTdHJ1Y3RFbmQoKTsKKyAgICAgICAgc3RydWN0LnZhbGlkYXRlKCk7CisgICAgICB9CisKKyAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBvcHJvdCwgZ2V0VG9wb2xvZ3lIaXN0b3J5X3Jlc3VsdCBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgICAgc3RydWN0LnZhbGlkYXRlKCk7CisKKyAgICAgICAgb3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihTVFJVQ1RfREVTQyk7CisgICAgICAgIGlmIChzdHJ1Y3Quc3VjY2VzcyAhPSBudWxsKSB7CisgICAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKFNVQ0NFU1NfRklFTERfREVTQyk7CisgICAgICAgICAgc3RydWN0LnN1Y2Nlc3Mud3JpdGUob3Byb3QpOworICAgICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RydWN0LmF6ZSAhPSBudWxsKSB7CisgICAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKEFaRV9GSUVMRF9ERVNDKTsKKyAgICAgICAgICBzdHJ1Y3QuYXplLndyaXRlKG9wcm90KTsKKyAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgICAgIH0KKyAgICAgICAgb3Byb3Qud3JpdGVGaWVsZFN0b3AoKTsKKyAgICAgICAgb3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsKKyAgICAgIH0KKworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIGdldFRvcG9sb2d5SGlzdG9yeV9yZXN1bHRUdXBsZVNjaGVtZUZhY3RvcnkgaW1wbGVtZW50cyBTY2hlbWVGYWN0b3J5IHsKKyAgICAgIHB1YmxpYyBnZXRUb3BvbG9neUhpc3RvcnlfcmVzdWx0VHVwbGVTY2hlbWUgZ2V0U2NoZW1lKCkgeworICAgICAgICByZXR1cm4gbmV3IGdldFRvcG9sb2d5SGlzdG9yeV9yZXN1bHRUdXBsZVNjaGVtZSgpOworICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIGdldFRvcG9sb2d5SGlzdG9yeV9yZXN1bHRUdXBsZVNjaGVtZSBleHRlbmRzIFR1cGxlU2NoZW1lPGdldFRvcG9sb2d5SGlzdG9yeV9yZXN1bHQ+IHsKKworICAgICAgQE92ZXJyaWRlCisgICAgICBwdWJsaWMgdm9pZCB3cml0ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgcHJvdCwgZ2V0VG9wb2xvZ3lIaXN0b3J5X3Jlc3VsdCBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgICAgVFR1cGxlUHJvdG9jb2wgb3Byb3QgPSAoVFR1cGxlUHJvdG9jb2wpIHByb3Q7CisgICAgICAgIEJpdFNldCBvcHRpb25hbHMgPSBuZXcgQml0U2V0KCk7CisgICAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X3N1Y2Nlc3MoKSkgeworICAgICAgICAgIG9wdGlvbmFscy5zZXQoMCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0cnVjdC5pc19zZXRfYXplKCkpIHsKKyAgICAgICAgICBvcHRpb25hbHMuc2V0KDEpOworICAgICAgICB9CisgICAgICAgIG9wcm90LndyaXRlQml0U2V0KG9wdGlvbmFscywgMik7CisgICAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X3N1Y2Nlc3MoKSkgeworICAgICAgICAgIHN0cnVjdC5zdWNjZXNzLndyaXRlKG9wcm90KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RydWN0LmlzX3NldF9hemUoKSkgeworICAgICAgICAgIHN0cnVjdC5hemUud3JpdGUob3Byb3QpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIEBPdmVycmlkZQorICAgICAgcHVibGljIHZvaWQgcmVhZChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgcHJvdCwgZ2V0VG9wb2xvZ3lIaXN0b3J5X3Jlc3VsdCBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgICAgVFR1cGxlUHJvdG9jb2wgaXByb3QgPSAoVFR1cGxlUHJvdG9jb2wpIHByb3Q7CisgICAgICAgIEJpdFNldCBpbmNvbWluZyA9IGlwcm90LnJlYWRCaXRTZXQoMik7CisgICAgICAgIGlmIChpbmNvbWluZy5nZXQoMCkpIHsKKyAgICAgICAgICBzdHJ1Y3Quc3VjY2VzcyA9IG5ldyBUb3BvbG9neUhpc3RvcnlJbmZvKCk7CisgICAgICAgICAgc3RydWN0LnN1Y2Nlc3MucmVhZChpcHJvdCk7CisgICAgICAgICAgc3RydWN0LnNldF9zdWNjZXNzX2lzU2V0KHRydWUpOworICAgICAgICB9CisgICAgICAgIGlmIChpbmNvbWluZy5nZXQoMSkpIHsKKyAgICAgICAgICBzdHJ1Y3QuYXplID0gbmV3IEF1dGhvcml6YXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgICBzdHJ1Y3QuYXplLnJlYWQoaXByb3QpOworICAgICAgICAgIHN0cnVjdC5zZXRfYXplX2lzU2V0KHRydWUpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorCisgIH0KKwogfQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9OaW1idXNTdW1tYXJ5LmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL05pbWJ1c1N1bW1hcnkuamF2YQppbmRleCAxZDBmM2ZiLi42Mjc4YmU4IDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL05pbWJ1c1N1bW1hcnkuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL05pbWJ1c1N1bW1hcnkuamF2YQpAQCAtMTYsNyArMTYsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIC8qKgotICogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4yKQorICogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4zKQogICoKICAqIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkcKICAqICBAZ2VuZXJhdGVkCkBAIC01MSw3ICs1MSw3IEBACiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKIEBTdXBwcmVzc1dhcm5pbmdzKHsiY2FzdCIsICJyYXd0eXBlcyIsICJzZXJpYWwiLCAidW5jaGVja2VkIn0pCi1AR2VuZXJhdGVkKHZhbHVlID0gIkF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMikiLCBkYXRlID0gIjIwMTUtMy0yIikKK0BHZW5lcmF0ZWQodmFsdWUgPSAiQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4zKSIpCiBwdWJsaWMgY2xhc3MgTmltYnVzU3VtbWFyeSBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlPE5pbWJ1c1N1bW1hcnksIE5pbWJ1c1N1bW1hcnkuX0ZpZWxkcz4sIGphdmEuaW8uU2VyaWFsaXphYmxlLCBDbG9uZWFibGUsIENvbXBhcmFibGU8TmltYnVzU3VtbWFyeT4gewogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0IFNUUlVDVF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QoIk5pbWJ1c1N1bW1hcnkiKTsKIApAQCAtMzgxLDEzICszODEsMTMgQEAKICAgICAgIHJldHVybiBnZXRfaG9zdCgpOwogCiAgICAgY2FzZSBQT1JUOgotICAgICAgcmV0dXJuIEludGVnZXIudmFsdWVPZihnZXRfcG9ydCgpKTsKKyAgICAgIHJldHVybiBnZXRfcG9ydCgpOwogCiAgICAgY2FzZSBVUFRJTUVfU0VDUzoKLSAgICAgIHJldHVybiBJbnRlZ2VyLnZhbHVlT2YoZ2V0X3VwdGltZV9zZWNzKCkpOworICAgICAgcmV0dXJuIGdldF91cHRpbWVfc2VjcygpOwogCiAgICAgY2FzZSBJU19MRUFERVI6Ci0gICAgICByZXR1cm4gQm9vbGVhbi52YWx1ZU9mKGlzX2lzTGVhZGVyKCkpOworICAgICAgcmV0dXJuIGlzX2lzTGVhZGVyKCk7CiAKICAgICBjYXNlIFZFUlNJT046CiAgICAgICByZXR1cm4gZ2V0X3ZlcnNpb24oKTsKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvTm9kZUluZm8uamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvTm9kZUluZm8uamF2YQppbmRleCBmMjcyY2Q4Li41ZWY0YjViIDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL05vZGVJbmZvLmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9Ob2RlSW5mby5qYXZhCkBAIC0xNiw3ICsxNiw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogLyoqCi0gKiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjIpCisgKiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjMpCiAgKgogICogRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lORwogICogIEBnZW5lcmF0ZWQKQEAgLTUxLDcgKzUxLDcgQEAKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAogQFN1cHByZXNzV2FybmluZ3MoeyJjYXN0IiwgInJhd3R5cGVzIiwgInNlcmlhbCIsICJ1bmNoZWNrZWQifSkKLUBHZW5lcmF0ZWQodmFsdWUgPSAiQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4yKSIsIGRhdGUgPSAiMjAxNS05LTMiKQorQEdlbmVyYXRlZCh2YWx1ZSA9ICJBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjMpIikKIHB1YmxpYyBjbGFzcyBOb2RlSW5mbyBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlPE5vZGVJbmZvLCBOb2RlSW5mby5fRmllbGRzPiwgamF2YS5pby5TZXJpYWxpemFibGUsIENsb25lYWJsZSwgQ29tcGFyYWJsZTxOb2RlSW5mbz4gewogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0IFNUUlVDVF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QoIk5vZGVJbmZvIik7CiAKQEAgLTQ2MSwxMyArNDYxLDEzIEBACiAgICAgICAgICAgY2FzZSAyOiAvLyBQT1JUCiAgICAgICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TRVQpIHsKICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTZXQgX3NldDM4MCA9IGlwcm90LnJlYWRTZXRCZWdpbigpOwotICAgICAgICAgICAgICAgIHN0cnVjdC5wb3J0ID0gbmV3IEhhc2hTZXQ8TG9uZz4oMipfc2V0MzgwLnNpemUpOwotICAgICAgICAgICAgICAgIGxvbmcgX2VsZW0zODE7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgX2kzODIgPSAwOyBfaTM4MiA8IF9zZXQzODAuc2l6ZTsgKytfaTM4MikKKyAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU2V0IF9zZXQ1MjQgPSBpcHJvdC5yZWFkU2V0QmVnaW4oKTsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QucG9ydCA9IG5ldyBIYXNoU2V0PExvbmc+KDIqX3NldDUyNC5zaXplKTsKKyAgICAgICAgICAgICAgICBsb25nIF9lbGVtNTI1OworICAgICAgICAgICAgICAgIGZvciAoaW50IF9pNTI2ID0gMDsgX2k1MjYgPCBfc2V0NTI0LnNpemU7ICsrX2k1MjYpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgX2VsZW0zODEgPSBpcHJvdC5yZWFkSTY0KCk7Ci0gICAgICAgICAgICAgICAgICBzdHJ1Y3QucG9ydC5hZGQoX2VsZW0zODEpOworICAgICAgICAgICAgICAgICAgX2VsZW01MjUgPSBpcHJvdC5yZWFkSTY0KCk7CisgICAgICAgICAgICAgICAgICBzdHJ1Y3QucG9ydC5hZGQoX2VsZW01MjUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpcHJvdC5yZWFkU2V0RW5kKCk7CiAgICAgICAgICAgICAgIH0KQEAgLTQ5OCw5ICs0OTgsOSBAQAogICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oUE9SVF9GSUVMRF9ERVNDKTsKICAgICAgICAgewogICAgICAgICAgIG9wcm90LndyaXRlU2V0QmVnaW4obmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTZXQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTY0LCBzdHJ1Y3QucG9ydC5zaXplKCkpKTsKLSAgICAgICAgICBmb3IgKGxvbmcgX2l0ZXIzODMgOiBzdHJ1Y3QucG9ydCkKKyAgICAgICAgICBmb3IgKGxvbmcgX2l0ZXI1MjcgOiBzdHJ1Y3QucG9ydCkKICAgICAgICAgICB7Ci0gICAgICAgICAgICBvcHJvdC53cml0ZUk2NChfaXRlcjM4Myk7CisgICAgICAgICAgICBvcHJvdC53cml0ZUk2NChfaXRlcjUyNyk7CiAgICAgICAgICAgfQogICAgICAgICAgIG9wcm90LndyaXRlU2V0RW5kKCk7CiAgICAgICAgIH0KQEAgLTUyNiw5ICs1MjYsOSBAQAogICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoc3RydWN0Lm5vZGUpOwogICAgICAgewogICAgICAgICBvcHJvdC53cml0ZUkzMihzdHJ1Y3QucG9ydC5zaXplKCkpOwotICAgICAgICBmb3IgKGxvbmcgX2l0ZXIzODQgOiBzdHJ1Y3QucG9ydCkKKyAgICAgICAgZm9yIChsb25nIF9pdGVyNTI4IDogc3RydWN0LnBvcnQpCiAgICAgICAgIHsKLSAgICAgICAgICBvcHJvdC53cml0ZUk2NChfaXRlcjM4NCk7CisgICAgICAgICAgb3Byb3Qud3JpdGVJNjQoX2l0ZXI1MjgpOwogICAgICAgICB9CiAgICAgICB9CiAgICAgfQpAQCAtNTM5LDEzICs1MzksMTMgQEAKICAgICAgIHN0cnVjdC5ub2RlID0gaXByb3QucmVhZFN0cmluZygpOwogICAgICAgc3RydWN0LnNldF9ub2RlX2lzU2V0KHRydWUpOwogICAgICAgewotICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU2V0IF9zZXQzODUgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFNldChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JNjQsIGlwcm90LnJlYWRJMzIoKSk7Ci0gICAgICAgIHN0cnVjdC5wb3J0ID0gbmV3IEhhc2hTZXQ8TG9uZz4oMipfc2V0Mzg1LnNpemUpOwotICAgICAgICBsb25nIF9lbGVtMzg2OwotICAgICAgICBmb3IgKGludCBfaTM4NyA9IDA7IF9pMzg3IDwgX3NldDM4NS5zaXplOyArK19pMzg3KQorICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU2V0IF9zZXQ1MjkgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFNldChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JNjQsIGlwcm90LnJlYWRJMzIoKSk7CisgICAgICAgIHN0cnVjdC5wb3J0ID0gbmV3IEhhc2hTZXQ8TG9uZz4oMipfc2V0NTI5LnNpemUpOworICAgICAgICBsb25nIF9lbGVtNTMwOworICAgICAgICBmb3IgKGludCBfaTUzMSA9IDA7IF9pNTMxIDwgX3NldDUyOS5zaXplOyArK19pNTMxKQogICAgICAgICB7Ci0gICAgICAgICAgX2VsZW0zODYgPSBpcHJvdC5yZWFkSTY0KCk7Ci0gICAgICAgICAgc3RydWN0LnBvcnQuYWRkKF9lbGVtMzg2KTsKKyAgICAgICAgICBfZWxlbTUzMCA9IGlwcm90LnJlYWRJNjQoKTsKKyAgICAgICAgICBzdHJ1Y3QucG9ydC5hZGQoX2VsZW01MzApOwogICAgICAgICB9CiAgICAgICB9CiAgICAgICBzdHJ1Y3Quc2V0X3BvcnRfaXNTZXQodHJ1ZSk7CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL05vdEFsaXZlRXhjZXB0aW9uLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL05vdEFsaXZlRXhjZXB0aW9uLmphdmEKaW5kZXggMTAwZGE4NC4uMjc1ZThlYyAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9Ob3RBbGl2ZUV4Y2VwdGlvbi5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvTm90QWxpdmVFeGNlcHRpb24uamF2YQpAQCAtMTYsNyArMTYsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIC8qKgotICogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4yKQorICogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4zKQogICoKICAqIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkcKICAqICBAZ2VuZXJhdGVkCkBAIC01MSw3ICs1MSw3IEBACiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKIEBTdXBwcmVzc1dhcm5pbmdzKHsiY2FzdCIsICJyYXd0eXBlcyIsICJzZXJpYWwiLCAidW5jaGVja2VkIn0pCi1AR2VuZXJhdGVkKHZhbHVlID0gIkF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMikiLCBkYXRlID0gIjIwMTUtMi02IikKK0BHZW5lcmF0ZWQodmFsdWUgPSAiQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4zKSIpCiBwdWJsaWMgY2xhc3MgTm90QWxpdmVFeGNlcHRpb24gZXh0ZW5kcyBURXhjZXB0aW9uIGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2U8Tm90QWxpdmVFeGNlcHRpb24sIE5vdEFsaXZlRXhjZXB0aW9uLl9GaWVsZHM+LCBqYXZhLmlvLlNlcmlhbGl6YWJsZSwgQ2xvbmVhYmxlLCBDb21wYXJhYmxlPE5vdEFsaXZlRXhjZXB0aW9uPiB7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QgU1RSVUNUX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdCgiTm90QWxpdmVFeGNlcHRpb24iKTsKIApkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9OdWxsU3RydWN0LmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL051bGxTdHJ1Y3QuamF2YQppbmRleCBmNDRiY2NkLi45OTQ5YzJmIDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL051bGxTdHJ1Y3QuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL051bGxTdHJ1Y3QuamF2YQpAQCAtMTYsNyArMTYsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIC8qKgotICogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4yKQorICogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4zKQogICoKICAqIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkcKICAqICBAZ2VuZXJhdGVkCkBAIC01MSw3ICs1MSw3IEBACiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKIEBTdXBwcmVzc1dhcm5pbmdzKHsiY2FzdCIsICJyYXd0eXBlcyIsICJzZXJpYWwiLCAidW5jaGVja2VkIn0pCi1AR2VuZXJhdGVkKHZhbHVlID0gIkF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMikiLCBkYXRlID0gIjIwMTUtMi02IikKK0BHZW5lcmF0ZWQodmFsdWUgPSAiQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4zKSIpCiBwdWJsaWMgY2xhc3MgTnVsbFN0cnVjdCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlPE51bGxTdHJ1Y3QsIE51bGxTdHJ1Y3QuX0ZpZWxkcz4sIGphdmEuaW8uU2VyaWFsaXphYmxlLCBDbG9uZWFibGUsIENvbXBhcmFibGU8TnVsbFN0cnVjdD4gewogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0IFNUUlVDVF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QoIk51bGxTdHJ1Y3QiKTsKIApkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9OdW1FcnJvcnNDaG9pY2UuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvTnVtRXJyb3JzQ2hvaWNlLmphdmEKaW5kZXggOGRhNjY3MS4uMTc5NzBiYyAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9OdW1FcnJvcnNDaG9pY2UuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL051bUVycm9yc0Nob2ljZS5qYXZhCkBAIC0xNiw3ICsxNiw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogLyoqCi0gKiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjIpCisgKiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjMpCiAgKgogICogRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lORwogICogIEBnZW5lcmF0ZWQKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvUHJvZmlsZUFjdGlvbi5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9Qcm9maWxlQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM1YTI1ZAotLS0gL2Rldi9udWxsCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvUHJvZmlsZUFjdGlvbi5qYXZhCkBAIC0wLDAgKzEsNzQgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisvKioKKyAqIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMykKKyAqCisgKiBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HCisgKiAgQGdlbmVyYXRlZAorICovCitwYWNrYWdlIGJhY2t0eXBlLnN0b3JtLmdlbmVyYXRlZDsKKworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URW51bTsKKworcHVibGljIGVudW0gUHJvZmlsZUFjdGlvbiBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRFbnVtIHsKKyAgSlBST0ZJTEVfU1RPUCgwKSwKKyAgSlBST0ZJTEVfU1RBUlQoMSksCisgIEpQUk9GSUxFX0RVTVAoMiksCisgIEpNQVBfRFVNUCgzKSwKKyAgSlNUQUNLX0RVTVAoNCksCisgIEpWTV9SRVNUQVJUKDUpOworCisgIHByaXZhdGUgZmluYWwgaW50IHZhbHVlOworCisgIHByaXZhdGUgUHJvZmlsZUFjdGlvbihpbnQgdmFsdWUpIHsKKyAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgIH0KKworICAvKioKKyAgICogR2V0IHRoZSBpbnRlZ2VyIHZhbHVlIG9mIHRoaXMgZW51bSB2YWx1ZSwgYXMgZGVmaW5lZCBpbiB0aGUgVGhyaWZ0IElETC4KKyAgICovCisgIHB1YmxpYyBpbnQgZ2V0VmFsdWUoKSB7CisgICAgcmV0dXJuIHZhbHVlOworICB9CisKKyAgLyoqCisgICAqIEZpbmQgYSB0aGUgZW51bSB0eXBlIGJ5IGl0cyBpbnRlZ2VyIHZhbHVlLCBhcyBkZWZpbmVkIGluIHRoZSBUaHJpZnQgSURMLgorICAgKiBAcmV0dXJuIG51bGwgaWYgdGhlIHZhbHVlIGlzIG5vdCBmb3VuZC4KKyAgICovCisgIHB1YmxpYyBzdGF0aWMgUHJvZmlsZUFjdGlvbiBmaW5kQnlWYWx1ZShpbnQgdmFsdWUpIHsgCisgICAgc3dpdGNoICh2YWx1ZSkgeworICAgICAgY2FzZSAwOgorICAgICAgICByZXR1cm4gSlBST0ZJTEVfU1RPUDsKKyAgICAgIGNhc2UgMToKKyAgICAgICAgcmV0dXJuIEpQUk9GSUxFX1NUQVJUOworICAgICAgY2FzZSAyOgorICAgICAgICByZXR1cm4gSlBST0ZJTEVfRFVNUDsKKyAgICAgIGNhc2UgMzoKKyAgICAgICAgcmV0dXJuIEpNQVBfRFVNUDsKKyAgICAgIGNhc2UgNDoKKyAgICAgICAgcmV0dXJuIEpTVEFDS19EVU1QOworICAgICAgY2FzZSA1OgorICAgICAgICByZXR1cm4gSlZNX1JFU1RBUlQ7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvUHJvZmlsZVJlcXVlc3QuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvUHJvZmlsZVJlcXVlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjU2MGI1Ci0tLSAvZGV2L251bGwKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9Qcm9maWxlUmVxdWVzdC5qYXZhCkBAIC0wLDAgKzEsNjMxIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLyoqCisgKiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjMpCisgKgorICogRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lORworICogIEBnZW5lcmF0ZWQKKyAqLworcGFja2FnZSBiYWNrdHlwZS5zdG9ybS5nZW5lcmF0ZWQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuSVNjaGVtZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuU2NoZW1lRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuU3RhbmRhcmRTY2hlbWU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuVHVwbGVTY2hlbWU7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR1cGxlUHJvdG9jb2w7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LkVuY29kaW5nVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5Bc3luY01ldGhvZENhbGxiYWNrOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci5BYnN0cmFjdE5vbmJsb2NraW5nU2VydmVyLio7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5FbnVtTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5CaXRTZXQ7CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiY2FzdCIsICJyYXd0eXBlcyIsICJzZXJpYWwiLCAidW5jaGVja2VkIn0pCitAR2VuZXJhdGVkKHZhbHVlID0gIkF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMykiKQorcHVibGljIGNsYXNzIFByb2ZpbGVSZXF1ZXN0IGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2U8UHJvZmlsZVJlcXVlc3QsIFByb2ZpbGVSZXF1ZXN0Ll9GaWVsZHM+LCBqYXZhLmlvLlNlcmlhbGl6YWJsZSwgQ2xvbmVhYmxlLCBDb21wYXJhYmxlPFByb2ZpbGVSZXF1ZXN0PiB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QgU1RSVUNUX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdCgiUHJvZmlsZVJlcXVlc3QiKTsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgTk9ERV9JTkZPX0ZJRUxEX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkKCJub2RlSW5mbyIsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCwgKHNob3J0KTEpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgQUNUSU9OX0ZJRUxEX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkKCJhY3Rpb24iLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JMzIsIChzaG9ydCkyKTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIFRJTUVfU1RBTVBfRklFTERfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQoInRpbWVfc3RhbXAiLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JNjQsIChzaG9ydCkzKTsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8Q2xhc3M8PyBleHRlbmRzIElTY2hlbWU+LCBTY2hlbWVGYWN0b3J5PiBzY2hlbWVzID0gbmV3IEhhc2hNYXA8Q2xhc3M8PyBleHRlbmRzIElTY2hlbWU+LCBTY2hlbWVGYWN0b3J5PigpOworICBzdGF0aWMgeworICAgIHNjaGVtZXMucHV0KFN0YW5kYXJkU2NoZW1lLmNsYXNzLCBuZXcgUHJvZmlsZVJlcXVlc3RTdGFuZGFyZFNjaGVtZUZhY3RvcnkoKSk7CisgICAgc2NoZW1lcy5wdXQoVHVwbGVTY2hlbWUuY2xhc3MsIG5ldyBQcm9maWxlUmVxdWVzdFR1cGxlU2NoZW1lRmFjdG9yeSgpKTsKKyAgfQorCisgIHByaXZhdGUgTm9kZUluZm8gbm9kZUluZm87IC8vIHJlcXVpcmVkCisgIHByaXZhdGUgUHJvZmlsZUFjdGlvbiBhY3Rpb247IC8vIHJlcXVpcmVkCisgIHByaXZhdGUgbG9uZyB0aW1lX3N0YW1wOyAvLyBvcHRpb25hbAorCisgIC8qKiBUaGUgc2V0IG9mIGZpZWxkcyB0aGlzIHN0cnVjdCBjb250YWlucywgYWxvbmcgd2l0aCBjb252ZW5pZW5jZSBtZXRob2RzIGZvciBmaW5kaW5nIGFuZCBtYW5pcHVsYXRpbmcgdGhlbS4gKi8KKyAgcHVibGljIGVudW0gX0ZpZWxkcyBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZElkRW51bSB7CisgICAgTk9ERV9JTkZPKChzaG9ydCkxLCAibm9kZUluZm8iKSwKKyAgICAvKioKKyAgICAgKiAKKyAgICAgKiBAc2VlIFByb2ZpbGVBY3Rpb24KKyAgICAgKi8KKyAgICBBQ1RJT04oKHNob3J0KTIsICJhY3Rpb24iKSwKKyAgICBUSU1FX1NUQU1QKChzaG9ydCkzLCAidGltZV9zdGFtcCIpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgX0ZpZWxkcz4gYnlOYW1lID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBfRmllbGRzPigpOworCisgICAgc3RhdGljIHsKKyAgICAgIGZvciAoX0ZpZWxkcyBmaWVsZCA6IEVudW1TZXQuYWxsT2YoX0ZpZWxkcy5jbGFzcykpIHsKKyAgICAgICAgYnlOYW1lLnB1dChmaWVsZC5nZXRGaWVsZE5hbWUoKSwgZmllbGQpOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgdGhlIF9GaWVsZHMgY29uc3RhbnQgdGhhdCBtYXRjaGVzIGZpZWxkSWQsIG9yIG51bGwgaWYgaXRzIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIF9GaWVsZHMgZmluZEJ5VGhyaWZ0SWQoaW50IGZpZWxkSWQpIHsKKyAgICAgIHN3aXRjaChmaWVsZElkKSB7CisgICAgICAgIGNhc2UgMTogLy8gTk9ERV9JTkZPCisgICAgICAgICAgcmV0dXJuIE5PREVfSU5GTzsKKyAgICAgICAgY2FzZSAyOiAvLyBBQ1RJT04KKyAgICAgICAgICByZXR1cm4gQUNUSU9OOworICAgICAgICBjYXNlIDM6IC8vIFRJTUVfU1RBTVAKKyAgICAgICAgICByZXR1cm4gVElNRV9TVEFNUDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kIHRoZSBfRmllbGRzIGNvbnN0YW50IHRoYXQgbWF0Y2hlcyBmaWVsZElkLCB0aHJvd2luZyBhbiBleGNlcHRpb24KKyAgICAgKiBpZiBpdCBpcyBub3QgZm91bmQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBfRmllbGRzIGZpbmRCeVRocmlmdElkT3JUaHJvdyhpbnQgZmllbGRJZCkgeworICAgICAgX0ZpZWxkcyBmaWVsZHMgPSBmaW5kQnlUaHJpZnRJZChmaWVsZElkKTsKKyAgICAgIGlmIChmaWVsZHMgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRmllbGQgIiArIGZpZWxkSWQgKyAiIGRvZXNuJ3QgZXhpc3QhIik7CisgICAgICByZXR1cm4gZmllbGRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgdGhlIF9GaWVsZHMgY29uc3RhbnQgdGhhdCBtYXRjaGVzIG5hbWUsIG9yIG51bGwgaWYgaXRzIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIF9GaWVsZHMgZmluZEJ5TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgcmV0dXJuIGJ5TmFtZS5nZXQobmFtZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBzaG9ydCBfdGhyaWZ0SWQ7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX2ZpZWxkTmFtZTsKKworICAgIF9GaWVsZHMoc2hvcnQgdGhyaWZ0SWQsIFN0cmluZyBmaWVsZE5hbWUpIHsKKyAgICAgIF90aHJpZnRJZCA9IHRocmlmdElkOworICAgICAgX2ZpZWxkTmFtZSA9IGZpZWxkTmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc2hvcnQgZ2V0VGhyaWZ0RmllbGRJZCgpIHsKKyAgICAgIHJldHVybiBfdGhyaWZ0SWQ7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRGaWVsZE5hbWUoKSB7CisgICAgICByZXR1cm4gX2ZpZWxkTmFtZTsKKyAgICB9CisgIH0KKworICAvLyBpc3NldCBpZCBhc3NpZ25tZW50cworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgX19USU1FX1NUQU1QX0lTU0VUX0lEID0gMDsKKyAgcHJpdmF0ZSBieXRlIF9faXNzZXRfYml0ZmllbGQgPSAwOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBfRmllbGRzIG9wdGlvbmFsc1tdID0ge19GaWVsZHMuVElNRV9TVEFNUH07CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPiBtZXRhRGF0YU1hcDsKKyAgc3RhdGljIHsKKyAgICBNYXA8X0ZpZWxkcywgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGE+IHRtcE1hcCA9IG5ldyBFbnVtTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPihfRmllbGRzLmNsYXNzKTsKKyAgICB0bXBNYXAucHV0KF9GaWVsZHMuTk9ERV9JTkZPLCBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEoIm5vZGVJbmZvIiwgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLlJFUVVJUkVELCAKKyAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5TdHJ1Y3RNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIE5vZGVJbmZvLmNsYXNzKSkpOworICAgIHRtcE1hcC5wdXQoX0ZpZWxkcy5BQ1RJT04sIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YSgiYWN0aW9uIiwgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLlJFUVVJUkVELCAKKyAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5FbnVtTWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuRU5VTSwgUHJvZmlsZUFjdGlvbi5jbGFzcykpKTsKKyAgICB0bXBNYXAucHV0KF9GaWVsZHMuVElNRV9TVEFNUCwgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhKCJ0aW1lX3N0YW1wIiwgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLk9QVElPTkFMLCAKKyAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZFZhbHVlTWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTY0KSkpOworICAgIG1ldGFEYXRhTWFwID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKHRtcE1hcCk7CisgICAgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEuYWRkU3RydWN0TWV0YURhdGFNYXAoUHJvZmlsZVJlcXVlc3QuY2xhc3MsIG1ldGFEYXRhTWFwKTsKKyAgfQorCisgIHB1YmxpYyBQcm9maWxlUmVxdWVzdCgpIHsKKyAgfQorCisgIHB1YmxpYyBQcm9maWxlUmVxdWVzdCgKKyAgICBOb2RlSW5mbyBub2RlSW5mbywKKyAgICBQcm9maWxlQWN0aW9uIGFjdGlvbikKKyAgeworICAgIHRoaXMoKTsKKyAgICB0aGlzLm5vZGVJbmZvID0gbm9kZUluZm87CisgICAgdGhpcy5hY3Rpb24gPSBhY3Rpb247CisgIH0KKworICAvKioKKyAgICogUGVyZm9ybXMgYSBkZWVwIGNvcHkgb24gPGk+b3RoZXI8L2k+LgorICAgKi8KKyAgcHVibGljIFByb2ZpbGVSZXF1ZXN0KFByb2ZpbGVSZXF1ZXN0IG90aGVyKSB7CisgICAgX19pc3NldF9iaXRmaWVsZCA9IG90aGVyLl9faXNzZXRfYml0ZmllbGQ7CisgICAgaWYgKG90aGVyLmlzX3NldF9ub2RlSW5mbygpKSB7CisgICAgICB0aGlzLm5vZGVJbmZvID0gbmV3IE5vZGVJbmZvKG90aGVyLm5vZGVJbmZvKTsKKyAgICB9CisgICAgaWYgKG90aGVyLmlzX3NldF9hY3Rpb24oKSkgeworICAgICAgdGhpcy5hY3Rpb24gPSBvdGhlci5hY3Rpb247CisgICAgfQorICAgIHRoaXMudGltZV9zdGFtcCA9IG90aGVyLnRpbWVfc3RhbXA7CisgIH0KKworICBwdWJsaWMgUHJvZmlsZVJlcXVlc3QgZGVlcENvcHkoKSB7CisgICAgcmV0dXJuIG5ldyBQcm9maWxlUmVxdWVzdCh0aGlzKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICB0aGlzLm5vZGVJbmZvID0gbnVsbDsKKyAgICB0aGlzLmFjdGlvbiA9IG51bGw7CisgICAgc2V0X3RpbWVfc3RhbXBfaXNTZXQoZmFsc2UpOworICAgIHRoaXMudGltZV9zdGFtcCA9IDA7CisgIH0KKworICBwdWJsaWMgTm9kZUluZm8gZ2V0X25vZGVJbmZvKCkgeworICAgIHJldHVybiB0aGlzLm5vZGVJbmZvOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X25vZGVJbmZvKE5vZGVJbmZvIG5vZGVJbmZvKSB7CisgICAgdGhpcy5ub2RlSW5mbyA9IG5vZGVJbmZvOworICB9CisKKyAgcHVibGljIHZvaWQgdW5zZXRfbm9kZUluZm8oKSB7CisgICAgdGhpcy5ub2RlSW5mbyA9IG51bGw7CisgIH0KKworICAvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkIG5vZGVJbmZvIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLworICBwdWJsaWMgYm9vbGVhbiBpc19zZXRfbm9kZUluZm8oKSB7CisgICAgcmV0dXJuIHRoaXMubm9kZUluZm8gIT0gbnVsbDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF9ub2RlSW5mb19pc1NldChib29sZWFuIHZhbHVlKSB7CisgICAgaWYgKCF2YWx1ZSkgeworICAgICAgdGhpcy5ub2RlSW5mbyA9IG51bGw7CisgICAgfQorICB9CisKKyAgLyoqCisgICAqIAorICAgKiBAc2VlIFByb2ZpbGVBY3Rpb24KKyAgICovCisgIHB1YmxpYyBQcm9maWxlQWN0aW9uIGdldF9hY3Rpb24oKSB7CisgICAgcmV0dXJuIHRoaXMuYWN0aW9uOworICB9CisKKyAgLyoqCisgICAqIAorICAgKiBAc2VlIFByb2ZpbGVBY3Rpb24KKyAgICovCisgIHB1YmxpYyB2b2lkIHNldF9hY3Rpb24oUHJvZmlsZUFjdGlvbiBhY3Rpb24pIHsKKyAgICB0aGlzLmFjdGlvbiA9IGFjdGlvbjsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHVuc2V0X2FjdGlvbigpIHsKKyAgICB0aGlzLmFjdGlvbiA9IG51bGw7CisgIH0KKworICAvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkIGFjdGlvbiBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNfc2V0X2FjdGlvbigpIHsKKyAgICByZXR1cm4gdGhpcy5hY3Rpb24gIT0gbnVsbDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF9hY3Rpb25faXNTZXQoYm9vbGVhbiB2YWx1ZSkgeworICAgIGlmICghdmFsdWUpIHsKKyAgICAgIHRoaXMuYWN0aW9uID0gbnVsbDsKKyAgICB9CisgIH0KKworICBwdWJsaWMgbG9uZyBnZXRfdGltZV9zdGFtcCgpIHsKKyAgICByZXR1cm4gdGhpcy50aW1lX3N0YW1wOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X3RpbWVfc3RhbXAobG9uZyB0aW1lX3N0YW1wKSB7CisgICAgdGhpcy50aW1lX3N0YW1wID0gdGltZV9zdGFtcDsKKyAgICBzZXRfdGltZV9zdGFtcF9pc1NldCh0cnVlKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHVuc2V0X3RpbWVfc3RhbXAoKSB7CisgICAgX19pc3NldF9iaXRmaWVsZCA9IEVuY29kaW5nVXRpbHMuY2xlYXJCaXQoX19pc3NldF9iaXRmaWVsZCwgX19USU1FX1NUQU1QX0lTU0VUX0lEKTsKKyAgfQorCisgIC8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgdGltZV9zdGFtcCBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNfc2V0X3RpbWVfc3RhbXAoKSB7CisgICAgcmV0dXJuIEVuY29kaW5nVXRpbHMudGVzdEJpdChfX2lzc2V0X2JpdGZpZWxkLCBfX1RJTUVfU1RBTVBfSVNTRVRfSUQpOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X3RpbWVfc3RhbXBfaXNTZXQoYm9vbGVhbiB2YWx1ZSkgeworICAgIF9faXNzZXRfYml0ZmllbGQgPSBFbmNvZGluZ1V0aWxzLnNldEJpdChfX2lzc2V0X2JpdGZpZWxkLCBfX1RJTUVfU1RBTVBfSVNTRVRfSUQsIHZhbHVlKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldEZpZWxkVmFsdWUoX0ZpZWxkcyBmaWVsZCwgT2JqZWN0IHZhbHVlKSB7CisgICAgc3dpdGNoIChmaWVsZCkgeworICAgIGNhc2UgTk9ERV9JTkZPOgorICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgdW5zZXRfbm9kZUluZm8oKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNldF9ub2RlSW5mbygoTm9kZUluZm8pdmFsdWUpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEFDVElPTjoKKyAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgIHVuc2V0X2FjdGlvbigpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2V0X2FjdGlvbigoUHJvZmlsZUFjdGlvbil2YWx1ZSk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgVElNRV9TVEFNUDoKKyAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgIHVuc2V0X3RpbWVfc3RhbXAoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNldF90aW1lX3N0YW1wKChMb25nKXZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgfQorICB9CisKKyAgcHVibGljIE9iamVjdCBnZXRGaWVsZFZhbHVlKF9GaWVsZHMgZmllbGQpIHsKKyAgICBzd2l0Y2ggKGZpZWxkKSB7CisgICAgY2FzZSBOT0RFX0lORk86CisgICAgICByZXR1cm4gZ2V0X25vZGVJbmZvKCk7CisKKyAgICBjYXNlIEFDVElPTjoKKyAgICAgIHJldHVybiBnZXRfYWN0aW9uKCk7CisKKyAgICBjYXNlIFRJTUVfU1RBTVA6CisgICAgICByZXR1cm4gZ2V0X3RpbWVfc3RhbXAoKTsKKworICAgIH0KKyAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgIH0KKworICAvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkIGNvcnJlc3BvbmRpbmcgdG8gZmllbGRJRCBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNTZXQoX0ZpZWxkcyBmaWVsZCkgeworICAgIGlmIChmaWVsZCA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgc3dpdGNoIChmaWVsZCkgeworICAgIGNhc2UgTk9ERV9JTkZPOgorICAgICAgcmV0dXJuIGlzX3NldF9ub2RlSW5mbygpOworICAgIGNhc2UgQUNUSU9OOgorICAgICAgcmV0dXJuIGlzX3NldF9hY3Rpb24oKTsKKyAgICBjYXNlIFRJTUVfU1RBTVA6CisgICAgICByZXR1cm4gaXNfc2V0X3RpbWVfc3RhbXAoKTsKKyAgICB9CisgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgdGhhdCkgeworICAgIGlmICh0aGF0ID09IG51bGwpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKHRoYXQgaW5zdGFuY2VvZiBQcm9maWxlUmVxdWVzdCkKKyAgICAgIHJldHVybiB0aGlzLmVxdWFscygoUHJvZmlsZVJlcXVlc3QpdGhhdCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gZXF1YWxzKFByb2ZpbGVSZXF1ZXN0IHRoYXQpIHsKKyAgICBpZiAodGhhdCA9PSBudWxsKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgYm9vbGVhbiB0aGlzX3ByZXNlbnRfbm9kZUluZm8gPSB0cnVlICYmIHRoaXMuaXNfc2V0X25vZGVJbmZvKCk7CisgICAgYm9vbGVhbiB0aGF0X3ByZXNlbnRfbm9kZUluZm8gPSB0cnVlICYmIHRoYXQuaXNfc2V0X25vZGVJbmZvKCk7CisgICAgaWYgKHRoaXNfcHJlc2VudF9ub2RlSW5mbyB8fCB0aGF0X3ByZXNlbnRfbm9kZUluZm8pIHsKKyAgICAgIGlmICghKHRoaXNfcHJlc2VudF9ub2RlSW5mbyAmJiB0aGF0X3ByZXNlbnRfbm9kZUluZm8pKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBpZiAoIXRoaXMubm9kZUluZm8uZXF1YWxzKHRoYXQubm9kZUluZm8pKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbGVhbiB0aGlzX3ByZXNlbnRfYWN0aW9uID0gdHJ1ZSAmJiB0aGlzLmlzX3NldF9hY3Rpb24oKTsKKyAgICBib29sZWFuIHRoYXRfcHJlc2VudF9hY3Rpb24gPSB0cnVlICYmIHRoYXQuaXNfc2V0X2FjdGlvbigpOworICAgIGlmICh0aGlzX3ByZXNlbnRfYWN0aW9uIHx8IHRoYXRfcHJlc2VudF9hY3Rpb24pIHsKKyAgICAgIGlmICghKHRoaXNfcHJlc2VudF9hY3Rpb24gJiYgdGhhdF9wcmVzZW50X2FjdGlvbikpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGlmICghdGhpcy5hY3Rpb24uZXF1YWxzKHRoYXQuYWN0aW9uKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2xlYW4gdGhpc19wcmVzZW50X3RpbWVfc3RhbXAgPSB0cnVlICYmIHRoaXMuaXNfc2V0X3RpbWVfc3RhbXAoKTsKKyAgICBib29sZWFuIHRoYXRfcHJlc2VudF90aW1lX3N0YW1wID0gdHJ1ZSAmJiB0aGF0LmlzX3NldF90aW1lX3N0YW1wKCk7CisgICAgaWYgKHRoaXNfcHJlc2VudF90aW1lX3N0YW1wIHx8IHRoYXRfcHJlc2VudF90aW1lX3N0YW1wKSB7CisgICAgICBpZiAoISh0aGlzX3ByZXNlbnRfdGltZV9zdGFtcCAmJiB0aGF0X3ByZXNlbnRfdGltZV9zdGFtcCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGlmICh0aGlzLnRpbWVfc3RhbXAgIT0gdGhhdC50aW1lX3N0YW1wKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICBMaXN0PE9iamVjdD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOworCisgICAgYm9vbGVhbiBwcmVzZW50X25vZGVJbmZvID0gdHJ1ZSAmJiAoaXNfc2V0X25vZGVJbmZvKCkpOworICAgIGxpc3QuYWRkKHByZXNlbnRfbm9kZUluZm8pOworICAgIGlmIChwcmVzZW50X25vZGVJbmZvKQorICAgICAgbGlzdC5hZGQobm9kZUluZm8pOworCisgICAgYm9vbGVhbiBwcmVzZW50X2FjdGlvbiA9IHRydWUgJiYgKGlzX3NldF9hY3Rpb24oKSk7CisgICAgbGlzdC5hZGQocHJlc2VudF9hY3Rpb24pOworICAgIGlmIChwcmVzZW50X2FjdGlvbikKKyAgICAgIGxpc3QuYWRkKGFjdGlvbi5nZXRWYWx1ZSgpKTsKKworICAgIGJvb2xlYW4gcHJlc2VudF90aW1lX3N0YW1wID0gdHJ1ZSAmJiAoaXNfc2V0X3RpbWVfc3RhbXAoKSk7CisgICAgbGlzdC5hZGQocHJlc2VudF90aW1lX3N0YW1wKTsKKyAgICBpZiAocHJlc2VudF90aW1lX3N0YW1wKQorICAgICAgbGlzdC5hZGQodGltZV9zdGFtcCk7CisKKyAgICByZXR1cm4gbGlzdC5oYXNoQ29kZSgpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgY29tcGFyZVRvKFByb2ZpbGVSZXF1ZXN0IG90aGVyKSB7CisgICAgaWYgKCFnZXRDbGFzcygpLmVxdWFscyhvdGhlci5nZXRDbGFzcygpKSkgeworICAgICAgcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpLmNvbXBhcmVUbyhvdGhlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgfQorCisgICAgaW50IGxhc3RDb21wYXJpc29uID0gMDsKKworICAgIGxhc3RDb21wYXJpc29uID0gQm9vbGVhbi52YWx1ZU9mKGlzX3NldF9ub2RlSW5mbygpKS5jb21wYXJlVG8ob3RoZXIuaXNfc2V0X25vZGVJbmZvKCkpOworICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgfQorICAgIGlmIChpc19zZXRfbm9kZUluZm8oKSkgeworICAgICAgbGFzdENvbXBhcmlzb24gPSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy5ub2RlSW5mbywgb3RoZXIubm9kZUluZm8pOworICAgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgICAgfQorICAgIH0KKyAgICBsYXN0Q29tcGFyaXNvbiA9IEJvb2xlYW4udmFsdWVPZihpc19zZXRfYWN0aW9uKCkpLmNvbXBhcmVUbyhvdGhlci5pc19zZXRfYWN0aW9uKCkpOworICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgfQorICAgIGlmIChpc19zZXRfYWN0aW9uKCkpIHsKKyAgICAgIGxhc3RDb21wYXJpc29uID0gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29tcGFyZVRvKHRoaXMuYWN0aW9uLCBvdGhlci5hY3Rpb24pOworICAgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgICAgfQorICAgIH0KKyAgICBsYXN0Q29tcGFyaXNvbiA9IEJvb2xlYW4udmFsdWVPZihpc19zZXRfdGltZV9zdGFtcCgpKS5jb21wYXJlVG8ob3RoZXIuaXNfc2V0X3RpbWVfc3RhbXAoKSk7CisgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICB9CisgICAgaWYgKGlzX3NldF90aW1lX3N0YW1wKCkpIHsKKyAgICAgIGxhc3RDb21wYXJpc29uID0gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29tcGFyZVRvKHRoaXMudGltZV9zdGFtcCwgb3RoZXIudGltZV9zdGFtcCk7CisgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworICB9CisKKyAgcHVibGljIF9GaWVsZHMgZmllbGRGb3JJZChpbnQgZmllbGRJZCkgeworICAgIHJldHVybiBfRmllbGRzLmZpbmRCeVRocmlmdElkKGZpZWxkSWQpOworICB9CisKKyAgcHVibGljIHZvaWQgcmVhZChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgaXByb3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICBzY2hlbWVzLmdldChpcHJvdC5nZXRTY2hlbWUoKSkuZ2V0U2NoZW1lKCkucmVhZChpcHJvdCwgdGhpcyk7CisgIH0KKworICBwdWJsaWMgdm9pZCB3cml0ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgb3Byb3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICBzY2hlbWVzLmdldChvcHJvdC5nZXRTY2hlbWUoKSkuZ2V0U2NoZW1lKCkud3JpdGUob3Byb3QsIHRoaXMpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCJQcm9maWxlUmVxdWVzdCgiKTsKKyAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKKworICAgIHNiLmFwcGVuZCgibm9kZUluZm86Iik7CisgICAgaWYgKHRoaXMubm9kZUluZm8gPT0gbnVsbCkgeworICAgICAgc2IuYXBwZW5kKCJudWxsIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHNiLmFwcGVuZCh0aGlzLm5vZGVJbmZvKTsKKyAgICB9CisgICAgZmlyc3QgPSBmYWxzZTsKKyAgICBpZiAoIWZpcnN0KSBzYi5hcHBlbmQoIiwgIik7CisgICAgc2IuYXBwZW5kKCJhY3Rpb246Iik7CisgICAgaWYgKHRoaXMuYWN0aW9uID09IG51bGwpIHsKKyAgICAgIHNiLmFwcGVuZCgibnVsbCIpOworICAgIH0gZWxzZSB7CisgICAgICBzYi5hcHBlbmQodGhpcy5hY3Rpb24pOworICAgIH0KKyAgICBmaXJzdCA9IGZhbHNlOworICAgIGlmIChpc19zZXRfdGltZV9zdGFtcCgpKSB7CisgICAgICBpZiAoIWZpcnN0KSBzYi5hcHBlbmQoIiwgIik7CisgICAgICBzYi5hcHBlbmQoInRpbWVfc3RhbXA6Iik7CisgICAgICBzYi5hcHBlbmQodGhpcy50aW1lX3N0YW1wKTsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfQorICAgIHNiLmFwcGVuZCgiKSIpOworICAgIHJldHVybiBzYi50b1N0cmluZygpOworICB9CisKKyAgcHVibGljIHZvaWQgdmFsaWRhdGUoKSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgLy8gY2hlY2sgZm9yIHJlcXVpcmVkIGZpZWxkcworICAgIGlmICghaXNfc2V0X25vZGVJbmZvKCkpIHsKKyAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xFeGNlcHRpb24oIlJlcXVpcmVkIGZpZWxkICdub2RlSW5mbycgaXMgdW5zZXQhIFN0cnVjdDoiICsgdG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgaWYgKCFpc19zZXRfYWN0aW9uKCkpIHsKKyAgICAgIHRocm93IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xFeGNlcHRpb24oIlJlcXVpcmVkIGZpZWxkICdhY3Rpb24nIGlzIHVuc2V0ISBTdHJ1Y3Q6IiArIHRvU3RyaW5nKCkpOworICAgIH0KKworICAgIC8vIGNoZWNrIGZvciBzdWItc3RydWN0IHZhbGlkaXR5CisgICAgaWYgKG5vZGVJbmZvICE9IG51bGwpIHsKKyAgICAgIG5vZGVJbmZvLnZhbGlkYXRlKCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICB3cml0ZShuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbChuZXcgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRJT1N0cmVhbVRyYW5zcG9ydChvdXQpKSk7CisgICAgfSBjYXRjaCAob3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB0ZSkgeworICAgICAgdGhyb3cgbmV3IGphdmEuaW8uSU9FeGNlcHRpb24odGUpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0KGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0gaW4pIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgLy8gaXQgZG9lc24ndCBzZWVtIGxpa2UgeW91IHNob3VsZCBoYXZlIHRvIGRvIHRoaXMsIGJ1dCBqYXZhIHNlcmlhbGl6YXRpb24gaXMgd2Fja3ksIGFuZCBkb2Vzbid0IGNhbGwgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IuCisgICAgICBfX2lzc2V0X2JpdGZpZWxkID0gMDsKKyAgICAgIHJlYWQobmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRDb21wYWN0UHJvdG9jb2wobmV3IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5USU9TdHJlYW1UcmFuc3BvcnQoaW4pKSk7CisgICAgfSBjYXRjaCAob3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB0ZSkgeworICAgICAgdGhyb3cgbmV3IGphdmEuaW8uSU9FeGNlcHRpb24odGUpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIFByb2ZpbGVSZXF1ZXN0U3RhbmRhcmRTY2hlbWVGYWN0b3J5IGltcGxlbWVudHMgU2NoZW1lRmFjdG9yeSB7CisgICAgcHVibGljIFByb2ZpbGVSZXF1ZXN0U3RhbmRhcmRTY2hlbWUgZ2V0U2NoZW1lKCkgeworICAgICAgcmV0dXJuIG5ldyBQcm9maWxlUmVxdWVzdFN0YW5kYXJkU2NoZW1lKCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHJvZmlsZVJlcXVlc3RTdGFuZGFyZFNjaGVtZSBleHRlbmRzIFN0YW5kYXJkU2NoZW1lPFByb2ZpbGVSZXF1ZXN0PiB7CisKKyAgICBwdWJsaWMgdm9pZCByZWFkKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBpcHJvdCwgUHJvZmlsZVJlcXVlc3Qgc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgc2NoZW1lRmllbGQ7CisgICAgICBpcHJvdC5yZWFkU3RydWN0QmVnaW4oKTsKKyAgICAgIHdoaWxlICh0cnVlKQorICAgICAgeworICAgICAgICBzY2hlbWVGaWVsZCA9IGlwcm90LnJlYWRGaWVsZEJlZ2luKCk7CisgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUT1ApIHsgCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChzY2hlbWVGaWVsZC5pZCkgeworICAgICAgICAgIGNhc2UgMTogLy8gTk9ERV9JTkZPCisgICAgICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QpIHsKKyAgICAgICAgICAgICAgc3RydWN0Lm5vZGVJbmZvID0gbmV3IE5vZGVJbmZvKCk7CisgICAgICAgICAgICAgIHN0cnVjdC5ub2RlSW5mby5yZWFkKGlwcm90KTsKKyAgICAgICAgICAgICAgc3RydWN0LnNldF9ub2RlSW5mb19pc1NldCh0cnVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7IAorICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAyOiAvLyBBQ1RJT04KKyAgICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkkzMikgeworICAgICAgICAgICAgICBzdHJ1Y3QuYWN0aW9uID0gYmFja3R5cGUuc3Rvcm0uZ2VuZXJhdGVkLlByb2ZpbGVBY3Rpb24uZmluZEJ5VmFsdWUoaXByb3QucmVhZEkzMigpKTsKKyAgICAgICAgICAgICAgc3RydWN0LnNldF9hY3Rpb25faXNTZXQodHJ1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeyAKKyAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMzogLy8gVElNRV9TVEFNUAorICAgICAgICAgICAgaWYgKHNjaGVtZUZpZWxkLnR5cGUgPT0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTY0KSB7CisgICAgICAgICAgICAgIHN0cnVjdC50aW1lX3N0YW1wID0gaXByb3QucmVhZEk2NCgpOworICAgICAgICAgICAgICBzdHJ1Y3Quc2V0X3RpbWVfc3RhbXBfaXNTZXQodHJ1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeyAKKyAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOworICAgICAgICB9CisgICAgICAgIGlwcm90LnJlYWRGaWVsZEVuZCgpOworICAgICAgfQorICAgICAgaXByb3QucmVhZFN0cnVjdEVuZCgpOworICAgICAgc3RydWN0LnZhbGlkYXRlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIG9wcm90LCBQcm9maWxlUmVxdWVzdCBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgIHN0cnVjdC52YWxpZGF0ZSgpOworCisgICAgICBvcHJvdC53cml0ZVN0cnVjdEJlZ2luKFNUUlVDVF9ERVNDKTsKKyAgICAgIGlmIChzdHJ1Y3Qubm9kZUluZm8gIT0gbnVsbCkgeworICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oTk9ERV9JTkZPX0ZJRUxEX0RFU0MpOworICAgICAgICBzdHJ1Y3Qubm9kZUluZm8ud3JpdGUob3Byb3QpOworICAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmFjdGlvbiAhPSBudWxsKSB7CisgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihBQ1RJT05fRklFTERfREVTQyk7CisgICAgICAgIG9wcm90LndyaXRlSTMyKHN0cnVjdC5hY3Rpb24uZ2V0VmFsdWUoKSk7CisgICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X3RpbWVfc3RhbXAoKSkgeworICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oVElNRV9TVEFNUF9GSUVMRF9ERVNDKTsKKyAgICAgICAgb3Byb3Qud3JpdGVJNjQoc3RydWN0LnRpbWVfc3RhbXApOworICAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgICB9CisgICAgICBvcHJvdC53cml0ZUZpZWxkU3RvcCgpOworICAgICAgb3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsKKyAgICB9CisKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIFByb2ZpbGVSZXF1ZXN0VHVwbGVTY2hlbWVGYWN0b3J5IGltcGxlbWVudHMgU2NoZW1lRmFjdG9yeSB7CisgICAgcHVibGljIFByb2ZpbGVSZXF1ZXN0VHVwbGVTY2hlbWUgZ2V0U2NoZW1lKCkgeworICAgICAgcmV0dXJuIG5ldyBQcm9maWxlUmVxdWVzdFR1cGxlU2NoZW1lKCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHJvZmlsZVJlcXVlc3RUdXBsZVNjaGVtZSBleHRlbmRzIFR1cGxlU2NoZW1lPFByb2ZpbGVSZXF1ZXN0PiB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgcHJvdCwgUHJvZmlsZVJlcXVlc3Qgc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICBUVHVwbGVQcm90b2NvbCBvcHJvdCA9IChUVHVwbGVQcm90b2NvbCkgcHJvdDsKKyAgICAgIHN0cnVjdC5ub2RlSW5mby53cml0ZShvcHJvdCk7CisgICAgICBvcHJvdC53cml0ZUkzMihzdHJ1Y3QuYWN0aW9uLmdldFZhbHVlKCkpOworICAgICAgQml0U2V0IG9wdGlvbmFscyA9IG5ldyBCaXRTZXQoKTsKKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X3RpbWVfc3RhbXAoKSkgeworICAgICAgICBvcHRpb25hbHMuc2V0KDApOworICAgICAgfQorICAgICAgb3Byb3Qud3JpdGVCaXRTZXQob3B0aW9uYWxzLCAxKTsKKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X3RpbWVfc3RhbXAoKSkgeworICAgICAgICBvcHJvdC53cml0ZUk2NChzdHJ1Y3QudGltZV9zdGFtcCk7CisgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVhZChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgcHJvdCwgUHJvZmlsZVJlcXVlc3Qgc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICBUVHVwbGVQcm90b2NvbCBpcHJvdCA9IChUVHVwbGVQcm90b2NvbCkgcHJvdDsKKyAgICAgIHN0cnVjdC5ub2RlSW5mbyA9IG5ldyBOb2RlSW5mbygpOworICAgICAgc3RydWN0Lm5vZGVJbmZvLnJlYWQoaXByb3QpOworICAgICAgc3RydWN0LnNldF9ub2RlSW5mb19pc1NldCh0cnVlKTsKKyAgICAgIHN0cnVjdC5hY3Rpb24gPSBiYWNrdHlwZS5zdG9ybS5nZW5lcmF0ZWQuUHJvZmlsZUFjdGlvbi5maW5kQnlWYWx1ZShpcHJvdC5yZWFkSTMyKCkpOworICAgICAgc3RydWN0LnNldF9hY3Rpb25faXNTZXQodHJ1ZSk7CisgICAgICBCaXRTZXQgaW5jb21pbmcgPSBpcHJvdC5yZWFkQml0U2V0KDEpOworICAgICAgaWYgKGluY29taW5nLmdldCgwKSkgeworICAgICAgICBzdHJ1Y3QudGltZV9zdGFtcCA9IGlwcm90LnJlYWRJNjQoKTsKKyAgICAgICAgc3RydWN0LnNldF90aW1lX3N0YW1wX2lzU2V0KHRydWUpOworICAgICAgfQorICAgIH0KKyAgfQorCit9CisKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvUmViYWxhbmNlT3B0aW9ucy5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9SZWJhbGFuY2VPcHRpb25zLmphdmEKaW5kZXggMmNjNzc2Mi4uNDlhNTYzMSAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9SZWJhbGFuY2VPcHRpb25zLmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9SZWJhbGFuY2VPcHRpb25zLmphdmEKQEAgLTE2LDcgKzE2LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAvKioKLSAqIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMikKKyAqIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMykKICAqCiAgKiBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HCiAgKiAgQGdlbmVyYXRlZApAQCAtNTEsNyArNTEsNyBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCiBAU3VwcHJlc3NXYXJuaW5ncyh7ImNhc3QiLCAicmF3dHlwZXMiLCAic2VyaWFsIiwgInVuY2hlY2tlZCJ9KQotQEdlbmVyYXRlZCh2YWx1ZSA9ICJBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjIpIiwgZGF0ZSA9ICIyMDE1LTktMyIpCitAR2VuZXJhdGVkKHZhbHVlID0gIkF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMykiKQogcHVibGljIGNsYXNzIFJlYmFsYW5jZU9wdGlvbnMgaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZTxSZWJhbGFuY2VPcHRpb25zLCBSZWJhbGFuY2VPcHRpb25zLl9GaWVsZHM+LCBqYXZhLmlvLlNlcmlhbGl6YWJsZSwgQ2xvbmVhYmxlLCBDb21wYXJhYmxlPFJlYmFsYW5jZU9wdGlvbnM+IHsKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdCBTVFJVQ1RfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0KCJSZWJhbGFuY2VPcHRpb25zIik7CiAKQEAgLTI5MiwxMCArMjkyLDEwIEBACiAgIHB1YmxpYyBPYmplY3QgZ2V0RmllbGRWYWx1ZShfRmllbGRzIGZpZWxkKSB7CiAgICAgc3dpdGNoIChmaWVsZCkgewogICAgIGNhc2UgV0FJVF9TRUNTOgotICAgICAgcmV0dXJuIEludGVnZXIudmFsdWVPZihnZXRfd2FpdF9zZWNzKCkpOworICAgICAgcmV0dXJuIGdldF93YWl0X3NlY3MoKTsKIAogICAgIGNhc2UgTlVNX1dPUktFUlM6Ci0gICAgICByZXR1cm4gSW50ZWdlci52YWx1ZU9mKGdldF9udW1fd29ya2VycygpKTsKKyAgICAgIHJldHVybiBnZXRfbnVtX3dvcmtlcnMoKTsKIAogICAgIGNhc2UgTlVNX0VYRUNVVE9SUzoKICAgICAgIHJldHVybiBnZXRfbnVtX2V4ZWN1dG9ycygpOwpAQCAtNTI5LDE1ICs1MjksMTUgQEAKICAgICAgICAgICBjYXNlIDM6IC8vIE5VTV9FWEVDVVRPUlMKICAgICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLk1BUCkgewogICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwMzM0ID0gaXByb3QucmVhZE1hcEJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgc3RydWN0Lm51bV9leGVjdXRvcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsSW50ZWdlcj4oMipfbWFwMzM0LnNpemUpOwotICAgICAgICAgICAgICAgIFN0cmluZyBfa2V5MzM1OwotICAgICAgICAgICAgICAgIGludCBfdmFsMzM2OwotICAgICAgICAgICAgICAgIGZvciAoaW50IF9pMzM3ID0gMDsgX2kzMzcgPCBfbWFwMzM0LnNpemU7ICsrX2kzMzcpCisgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwNDY4ID0gaXByb3QucmVhZE1hcEJlZ2luKCk7CisgICAgICAgICAgICAgICAgc3RydWN0Lm51bV9leGVjdXRvcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsSW50ZWdlcj4oMipfbWFwNDY4LnNpemUpOworICAgICAgICAgICAgICAgIFN0cmluZyBfa2V5NDY5OworICAgICAgICAgICAgICAgIGludCBfdmFsNDcwOworICAgICAgICAgICAgICAgIGZvciAoaW50IF9pNDcxID0gMDsgX2k0NzEgPCBfbWFwNDY4LnNpemU7ICsrX2k0NzEpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgX2tleTMzNSA9IGlwcm90LnJlYWRTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgIF92YWwzMzYgPSBpcHJvdC5yZWFkSTMyKCk7Ci0gICAgICAgICAgICAgICAgICBzdHJ1Y3QubnVtX2V4ZWN1dG9ycy5wdXQoX2tleTMzNSwgX3ZhbDMzNik7CisgICAgICAgICAgICAgICAgICBfa2V5NDY5ID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICAgICAgICAgICAgX3ZhbDQ3MCA9IGlwcm90LnJlYWRJMzIoKTsKKyAgICAgICAgICAgICAgICAgIHN0cnVjdC5udW1fZXhlY3V0b3JzLnB1dChfa2V5NDY5LCBfdmFsNDcwKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaXByb3QucmVhZE1hcEVuZCgpOwogICAgICAgICAgICAgICB9CkBAIC01NzQsMTAgKzU3NCwxMCBAQAogICAgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihOVU1fRVhFQ1VUT1JTX0ZJRUxEX0RFU0MpOwogICAgICAgICAgIHsKICAgICAgICAgICAgIG9wcm90LndyaXRlTWFwQmVnaW4obmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JMzIsIHN0cnVjdC5udW1fZXhlY3V0b3JzLnNpemUoKSkpOwotICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBJbnRlZ2VyPiBfaXRlcjMzOCA6IHN0cnVjdC5udW1fZXhlY3V0b3JzLmVudHJ5U2V0KCkpCisgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIEludGVnZXI+IF9pdGVyNDcyIDogc3RydWN0Lm51bV9leGVjdXRvcnMuZW50cnlTZXQoKSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoX2l0ZXIzMzguZ2V0S2V5KCkpOwotICAgICAgICAgICAgICBvcHJvdC53cml0ZUkzMihfaXRlcjMzOC5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoX2l0ZXI0NzIuZ2V0S2V5KCkpOworICAgICAgICAgICAgICBvcHJvdC53cml0ZUkzMihfaXRlcjQ3Mi5nZXRWYWx1ZSgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG9wcm90LndyaXRlTWFwRW5kKCk7CiAgICAgICAgICAgfQpAQCAtNjIxLDEwICs2MjEsMTAgQEAKICAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X251bV9leGVjdXRvcnMoKSkgewogICAgICAgICB7CiAgICAgICAgICAgb3Byb3Qud3JpdGVJMzIoc3RydWN0Lm51bV9leGVjdXRvcnMuc2l6ZSgpKTsKLSAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIEludGVnZXI+IF9pdGVyMzM5IDogc3RydWN0Lm51bV9leGVjdXRvcnMuZW50cnlTZXQoKSkKKyAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIEludGVnZXI+IF9pdGVyNDczIDogc3RydWN0Lm51bV9leGVjdXRvcnMuZW50cnlTZXQoKSkKICAgICAgICAgICB7Ci0gICAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhfaXRlcjMzOS5nZXRLZXkoKSk7Ci0gICAgICAgICAgICBvcHJvdC53cml0ZUkzMihfaXRlcjMzOS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKF9pdGVyNDczLmdldEtleSgpKTsKKyAgICAgICAgICAgIG9wcm90LndyaXRlSTMyKF9pdGVyNDczLmdldFZhbHVlKCkpOwogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgfQpAQCAtNjQ0LDE1ICs2NDQsMTUgQEAKICAgICAgIH0KICAgICAgIGlmIChpbmNvbWluZy5nZXQoMikpIHsKICAgICAgICAgewotICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgX21hcDM0MCA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORywgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTMyLCBpcHJvdC5yZWFkSTMyKCkpOwotICAgICAgICAgIHN0cnVjdC5udW1fZXhlY3V0b3JzID0gbmV3IEhhc2hNYXA8U3RyaW5nLEludGVnZXI+KDIqX21hcDM0MC5zaXplKTsKLSAgICAgICAgICBTdHJpbmcgX2tleTM0MTsKLSAgICAgICAgICBpbnQgX3ZhbDM0MjsKLSAgICAgICAgICBmb3IgKGludCBfaTM0MyA9IDA7IF9pMzQzIDwgX21hcDM0MC5zaXplOyArK19pMzQzKQorICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgX21hcDQ3NCA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORywgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTMyLCBpcHJvdC5yZWFkSTMyKCkpOworICAgICAgICAgIHN0cnVjdC5udW1fZXhlY3V0b3JzID0gbmV3IEhhc2hNYXA8U3RyaW5nLEludGVnZXI+KDIqX21hcDQ3NC5zaXplKTsKKyAgICAgICAgICBTdHJpbmcgX2tleTQ3NTsKKyAgICAgICAgICBpbnQgX3ZhbDQ3NjsKKyAgICAgICAgICBmb3IgKGludCBfaTQ3NyA9IDA7IF9pNDc3IDwgX21hcDQ3NC5zaXplOyArK19pNDc3KQogICAgICAgICAgIHsKLSAgICAgICAgICAgIF9rZXkzNDEgPSBpcHJvdC5yZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgICBfdmFsMzQyID0gaXByb3QucmVhZEkzMigpOwotICAgICAgICAgICAgc3RydWN0Lm51bV9leGVjdXRvcnMucHV0KF9rZXkzNDEsIF92YWwzNDIpOworICAgICAgICAgICAgX2tleTQ3NSA9IGlwcm90LnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgIF92YWw0NzYgPSBpcHJvdC5yZWFkSTMyKCk7CisgICAgICAgICAgICBzdHJ1Y3QubnVtX2V4ZWN1dG9ycy5wdXQoX2tleTQ3NSwgX3ZhbDQ3Nik7CiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHN0cnVjdC5zZXRfbnVtX2V4ZWN1dG9yc19pc1NldCh0cnVlKTsKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvU2hlbGxDb21wb25lbnQuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvU2hlbGxDb21wb25lbnQuamF2YQppbmRleCAyNzMwM2YxLi43MmMwOWFiIDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL1NoZWxsQ29tcG9uZW50LmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9TaGVsbENvbXBvbmVudC5qYXZhCkBAIC0xNiw3ICsxNiw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogLyoqCi0gKiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjIpCisgKiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjMpCiAgKgogICogRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lORwogICogIEBnZW5lcmF0ZWQKQEAgLTUxLDcgKzUxLDcgQEAKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAogQFN1cHByZXNzV2FybmluZ3MoeyJjYXN0IiwgInJhd3R5cGVzIiwgInNlcmlhbCIsICJ1bmNoZWNrZWQifSkKLUBHZW5lcmF0ZWQodmFsdWUgPSAiQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4yKSIsIGRhdGUgPSAiMjAxNS0yLTYiKQorQEdlbmVyYXRlZCh2YWx1ZSA9ICJBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjMpIikKIHB1YmxpYyBjbGFzcyBTaGVsbENvbXBvbmVudCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlPFNoZWxsQ29tcG9uZW50LCBTaGVsbENvbXBvbmVudC5fRmllbGRzPiwgamF2YS5pby5TZXJpYWxpemFibGUsIENsb25lYWJsZSwgQ29tcGFyYWJsZTxTaGVsbENvbXBvbmVudD4gewogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0IFNUUlVDVF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QoIlNoZWxsQ29tcG9uZW50Iik7CiAKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvU3BlY2lmaWNBZ2dyZWdhdGVTdGF0cy5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9TcGVjaWZpY0FnZ3JlZ2F0ZVN0YXRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NkYjkxOQotLS0gL2Rldi9udWxsCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvU3BlY2lmaWNBZ2dyZWdhdGVTdGF0cy5qYXZhCkBAIC0wLDAgKzEsMzg3IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLyoqCisgKiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjMpCisgKgorICogRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lORworICogIEBnZW5lcmF0ZWQKKyAqLworcGFja2FnZSBiYWNrdHlwZS5zdG9ybS5nZW5lcmF0ZWQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuSVNjaGVtZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuU2NoZW1lRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuU3RhbmRhcmRTY2hlbWU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuVHVwbGVTY2hlbWU7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR1cGxlUHJvdG9jb2w7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LkVuY29kaW5nVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5Bc3luY01ldGhvZENhbGxiYWNrOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci5BYnN0cmFjdE5vbmJsb2NraW5nU2VydmVyLio7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5FbnVtTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5CaXRTZXQ7CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiY2FzdCIsICJyYXd0eXBlcyIsICJzZXJpYWwiLCAidW5jaGVja2VkIn0pCitwdWJsaWMgY2xhc3MgU3BlY2lmaWNBZ2dyZWdhdGVTdGF0cyBleHRlbmRzIG9yZy5hcGFjaGUudGhyaWZ0LlRVbmlvbjxTcGVjaWZpY0FnZ3JlZ2F0ZVN0YXRzLCBTcGVjaWZpY0FnZ3JlZ2F0ZVN0YXRzLl9GaWVsZHM+IHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdCBTVFJVQ1RfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0KCJTcGVjaWZpY0FnZ3JlZ2F0ZVN0YXRzIik7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBCT0xUX0ZJRUxEX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkKCJib2x0Iiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNULCAoc2hvcnQpMSk7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBTUE9VVF9GSUVMRF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCgic3BvdXQiLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIChzaG9ydCkyKTsKKworICAvKiogVGhlIHNldCBvZiBmaWVsZHMgdGhpcyBzdHJ1Y3QgY29udGFpbnMsIGFsb25nIHdpdGggY29udmVuaWVuY2UgbWV0aG9kcyBmb3IgZmluZGluZyBhbmQgbWFuaXB1bGF0aW5nIHRoZW0uICovCisgIHB1YmxpYyBlbnVtIF9GaWVsZHMgaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRJZEVudW0geworICAgIEJPTFQoKHNob3J0KTEsICJib2x0IiksCisgICAgU1BPVVQoKHNob3J0KTIsICJzcG91dCIpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgX0ZpZWxkcz4gYnlOYW1lID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBfRmllbGRzPigpOworCisgICAgc3RhdGljIHsKKyAgICAgIGZvciAoX0ZpZWxkcyBmaWVsZCA6IEVudW1TZXQuYWxsT2YoX0ZpZWxkcy5jbGFzcykpIHsKKyAgICAgICAgYnlOYW1lLnB1dChmaWVsZC5nZXRGaWVsZE5hbWUoKSwgZmllbGQpOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgdGhlIF9GaWVsZHMgY29uc3RhbnQgdGhhdCBtYXRjaGVzIGZpZWxkSWQsIG9yIG51bGwgaWYgaXRzIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIF9GaWVsZHMgZmluZEJ5VGhyaWZ0SWQoaW50IGZpZWxkSWQpIHsKKyAgICAgIHN3aXRjaChmaWVsZElkKSB7CisgICAgICAgIGNhc2UgMTogLy8gQk9MVAorICAgICAgICAgIHJldHVybiBCT0xUOworICAgICAgICBjYXNlIDI6IC8vIFNQT1VUCisgICAgICAgICAgcmV0dXJuIFNQT1VUOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgdGhlIF9GaWVsZHMgY29uc3RhbnQgdGhhdCBtYXRjaGVzIGZpZWxkSWQsIHRocm93aW5nIGFuIGV4Y2VwdGlvbgorICAgICAqIGlmIGl0IGlzIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIF9GaWVsZHMgZmluZEJ5VGhyaWZ0SWRPclRocm93KGludCBmaWVsZElkKSB7CisgICAgICBfRmllbGRzIGZpZWxkcyA9IGZpbmRCeVRocmlmdElkKGZpZWxkSWQpOworICAgICAgaWYgKGZpZWxkcyA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJGaWVsZCAiICsgZmllbGRJZCArICIgZG9lc24ndCBleGlzdCEiKTsKKyAgICAgIHJldHVybiBmaWVsZHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCB0aGUgX0ZpZWxkcyBjb25zdGFudCB0aGF0IG1hdGNoZXMgbmFtZSwgb3IgbnVsbCBpZiBpdHMgbm90IGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgX0ZpZWxkcyBmaW5kQnlOYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICByZXR1cm4gYnlOYW1lLmdldChuYW1lKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIHNob3J0IF90aHJpZnRJZDsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBfZmllbGROYW1lOworCisgICAgX0ZpZWxkcyhzaG9ydCB0aHJpZnRJZCwgU3RyaW5nIGZpZWxkTmFtZSkgeworICAgICAgX3RocmlmdElkID0gdGhyaWZ0SWQ7CisgICAgICBfZmllbGROYW1lID0gZmllbGROYW1lOworICAgIH0KKworICAgIHB1YmxpYyBzaG9ydCBnZXRUaHJpZnRGaWVsZElkKCkgeworICAgICAgcmV0dXJuIF90aHJpZnRJZDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEZpZWxkTmFtZSgpIHsKKyAgICAgIHJldHVybiBfZmllbGROYW1lOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPiBtZXRhRGF0YU1hcDsKKyAgc3RhdGljIHsKKyAgICBNYXA8X0ZpZWxkcywgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGE+IHRtcE1hcCA9IG5ldyBFbnVtTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPihfRmllbGRzLmNsYXNzKTsKKyAgICB0bXBNYXAucHV0KF9GaWVsZHMuQk9MVCwgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhKCJib2x0Iiwgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLkRFRkFVTFQsIAorICAgICAgICBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLlN0cnVjdE1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCwgQm9sdEFnZ3JlZ2F0ZVN0YXRzLmNsYXNzKSkpOworICAgIHRtcE1hcC5wdXQoX0ZpZWxkcy5TUE9VVCwgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhKCJzcG91dCIsIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZFJlcXVpcmVtZW50VHlwZS5ERUZBVUxULCAKKyAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5TdHJ1Y3RNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIFNwb3V0QWdncmVnYXRlU3RhdHMuY2xhc3MpKSk7CisgICAgbWV0YURhdGFNYXAgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAodG1wTWFwKTsKKyAgICBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YS5hZGRTdHJ1Y3RNZXRhRGF0YU1hcChTcGVjaWZpY0FnZ3JlZ2F0ZVN0YXRzLmNsYXNzLCBtZXRhRGF0YU1hcCk7CisgIH0KKworICBwdWJsaWMgU3BlY2lmaWNBZ2dyZWdhdGVTdGF0cygpIHsKKyAgICBzdXBlcigpOworICB9CisKKyAgcHVibGljIFNwZWNpZmljQWdncmVnYXRlU3RhdHMoX0ZpZWxkcyBzZXRGaWVsZCwgT2JqZWN0IHZhbHVlKSB7CisgICAgc3VwZXIoc2V0RmllbGQsIHZhbHVlKTsKKyAgfQorCisgIHB1YmxpYyBTcGVjaWZpY0FnZ3JlZ2F0ZVN0YXRzKFNwZWNpZmljQWdncmVnYXRlU3RhdHMgb3RoZXIpIHsKKyAgICBzdXBlcihvdGhlcik7CisgIH0KKyAgcHVibGljIFNwZWNpZmljQWdncmVnYXRlU3RhdHMgZGVlcENvcHkoKSB7CisgICAgcmV0dXJuIG5ldyBTcGVjaWZpY0FnZ3JlZ2F0ZVN0YXRzKHRoaXMpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBTcGVjaWZpY0FnZ3JlZ2F0ZVN0YXRzIGJvbHQoQm9sdEFnZ3JlZ2F0ZVN0YXRzIHZhbHVlKSB7CisgICAgU3BlY2lmaWNBZ2dyZWdhdGVTdGF0cyB4ID0gbmV3IFNwZWNpZmljQWdncmVnYXRlU3RhdHMoKTsKKyAgICB4LnNldF9ib2x0KHZhbHVlKTsKKyAgICByZXR1cm4geDsKKyAgfQorCisgIHB1YmxpYyBzdGF0aWMgU3BlY2lmaWNBZ2dyZWdhdGVTdGF0cyBzcG91dChTcG91dEFnZ3JlZ2F0ZVN0YXRzIHZhbHVlKSB7CisgICAgU3BlY2lmaWNBZ2dyZWdhdGVTdGF0cyB4ID0gbmV3IFNwZWNpZmljQWdncmVnYXRlU3RhdHMoKTsKKyAgICB4LnNldF9zcG91dCh2YWx1ZSk7CisgICAgcmV0dXJuIHg7CisgIH0KKworCisgIEBPdmVycmlkZQorICBwcm90ZWN0ZWQgdm9pZCBjaGVja1R5cGUoX0ZpZWxkcyBzZXRGaWVsZCwgT2JqZWN0IHZhbHVlKSB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uIHsKKyAgICBzd2l0Y2ggKHNldEZpZWxkKSB7CisgICAgICBjYXNlIEJPTFQ6CisgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEJvbHRBZ2dyZWdhdGVTdGF0cykgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBDbGFzc0Nhc3RFeGNlcHRpb24oIldhcyBleHBlY3RpbmcgdmFsdWUgb2YgdHlwZSBCb2x0QWdncmVnYXRlU3RhdHMgZm9yIGZpZWxkICdib2x0JywgYnV0IGdvdCAiICsgdmFsdWUuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOworICAgICAgY2FzZSBTUE9VVDoKKyAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3BvdXRBZ2dyZWdhdGVTdGF0cykgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBDbGFzc0Nhc3RFeGNlcHRpb24oIldhcyBleHBlY3RpbmcgdmFsdWUgb2YgdHlwZSBTcG91dEFnZ3JlZ2F0ZVN0YXRzIGZvciBmaWVsZCAnc3BvdXQnLCBidXQgZ290ICIgKyB2YWx1ZS5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSk7CisgICAgICBkZWZhdWx0OgorICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIGZpZWxkIGlkICIgKyBzZXRGaWVsZCk7CisgICAgfQorICB9CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCBPYmplY3Qgc3RhbmRhcmRTY2hlbWVSZWFkVmFsdWUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIGlwcm90LCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgZmllbGQpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICBfRmllbGRzIHNldEZpZWxkID0gX0ZpZWxkcy5maW5kQnlUaHJpZnRJZChmaWVsZC5pZCk7CisgICAgaWYgKHNldEZpZWxkICE9IG51bGwpIHsKKyAgICAgIHN3aXRjaCAoc2V0RmllbGQpIHsKKyAgICAgICAgY2FzZSBCT0xUOgorICAgICAgICAgIGlmIChmaWVsZC50eXBlID09IEJPTFRfRklFTERfREVTQy50eXBlKSB7CisgICAgICAgICAgICBCb2x0QWdncmVnYXRlU3RhdHMgYm9sdDsKKyAgICAgICAgICAgIGJvbHQgPSBuZXcgQm9sdEFnZ3JlZ2F0ZVN0YXRzKCk7CisgICAgICAgICAgICBib2x0LnJlYWQoaXByb3QpOworICAgICAgICAgICAgcmV0dXJuIGJvbHQ7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICB9CisgICAgICAgIGNhc2UgU1BPVVQ6CisgICAgICAgICAgaWYgKGZpZWxkLnR5cGUgPT0gU1BPVVRfRklFTERfREVTQy50eXBlKSB7CisgICAgICAgICAgICBTcG91dEFnZ3JlZ2F0ZVN0YXRzIHNwb3V0OworICAgICAgICAgICAgc3BvdXQgPSBuZXcgU3BvdXRBZ2dyZWdhdGVTdGF0cygpOworICAgICAgICAgICAgc3BvdXQucmVhZChpcHJvdCk7CisgICAgICAgICAgICByZXR1cm4gc3BvdXQ7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigic2V0RmllbGQgd2Fzbid0IG51bGwsIGJ1dCBkaWRuJ3QgbWF0Y2ggYW55IG9mIHRoZSBjYXNlIHN0YXRlbWVudHMhIik7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgZmllbGQudHlwZSk7CisgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgc3RhbmRhcmRTY2hlbWVXcml0ZVZhbHVlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgIHN3aXRjaCAoc2V0RmllbGRfKSB7CisgICAgICBjYXNlIEJPTFQ6CisgICAgICAgIEJvbHRBZ2dyZWdhdGVTdGF0cyBib2x0ID0gKEJvbHRBZ2dyZWdhdGVTdGF0cyl2YWx1ZV87CisgICAgICAgIGJvbHQud3JpdGUob3Byb3QpOworICAgICAgICByZXR1cm47CisgICAgICBjYXNlIFNQT1VUOgorICAgICAgICBTcG91dEFnZ3JlZ2F0ZVN0YXRzIHNwb3V0ID0gKFNwb3V0QWdncmVnYXRlU3RhdHMpdmFsdWVfOworICAgICAgICBzcG91dC53cml0ZShvcHJvdCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNhbm5vdCB3cml0ZSB1bmlvbiB3aXRoIHVua25vd24gZmllbGQgIiArIHNldEZpZWxkXyk7CisgICAgfQorICB9CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCBPYmplY3QgdHVwbGVTY2hlbWVSZWFkVmFsdWUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIGlwcm90LCBzaG9ydCBmaWVsZElEKSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgX0ZpZWxkcyBzZXRGaWVsZCA9IF9GaWVsZHMuZmluZEJ5VGhyaWZ0SWQoZmllbGRJRCk7CisgICAgaWYgKHNldEZpZWxkICE9IG51bGwpIHsKKyAgICAgIHN3aXRjaCAoc2V0RmllbGQpIHsKKyAgICAgICAgY2FzZSBCT0xUOgorICAgICAgICAgIEJvbHRBZ2dyZWdhdGVTdGF0cyBib2x0OworICAgICAgICAgIGJvbHQgPSBuZXcgQm9sdEFnZ3JlZ2F0ZVN0YXRzKCk7CisgICAgICAgICAgYm9sdC5yZWFkKGlwcm90KTsKKyAgICAgICAgICByZXR1cm4gYm9sdDsKKyAgICAgICAgY2FzZSBTUE9VVDoKKyAgICAgICAgICBTcG91dEFnZ3JlZ2F0ZVN0YXRzIHNwb3V0OworICAgICAgICAgIHNwb3V0ID0gbmV3IFNwb3V0QWdncmVnYXRlU3RhdHMoKTsKKyAgICAgICAgICBzcG91dC5yZWFkKGlwcm90KTsKKyAgICAgICAgICByZXR1cm4gc3BvdXQ7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigic2V0RmllbGQgd2Fzbid0IG51bGwsIGJ1dCBkaWRuJ3QgbWF0Y2ggYW55IG9mIHRoZSBjYXNlIHN0YXRlbWVudHMhIik7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHRocm93IG5ldyBUUHJvdG9jb2xFeGNlcHRpb24oIkNvdWxkbid0IGZpbmQgYSBmaWVsZCB3aXRoIGZpZWxkIGlkICIgKyBmaWVsZElEKTsKKyAgICB9CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIHZvaWQgdHVwbGVTY2hlbWVXcml0ZVZhbHVlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgIHN3aXRjaCAoc2V0RmllbGRfKSB7CisgICAgICBjYXNlIEJPTFQ6CisgICAgICAgIEJvbHRBZ2dyZWdhdGVTdGF0cyBib2x0ID0gKEJvbHRBZ2dyZWdhdGVTdGF0cyl2YWx1ZV87CisgICAgICAgIGJvbHQud3JpdGUob3Byb3QpOworICAgICAgICByZXR1cm47CisgICAgICBjYXNlIFNQT1VUOgorICAgICAgICBTcG91dEFnZ3JlZ2F0ZVN0YXRzIHNwb3V0ID0gKFNwb3V0QWdncmVnYXRlU3RhdHMpdmFsdWVfOworICAgICAgICBzcG91dC53cml0ZShvcHJvdCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNhbm5vdCB3cml0ZSB1bmlvbiB3aXRoIHVua25vd24gZmllbGQgIiArIHNldEZpZWxkXyk7CisgICAgfQorICB9CisKKyAgQE92ZXJyaWRlCisgIHByb3RlY3RlZCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgZ2V0RmllbGREZXNjKF9GaWVsZHMgc2V0RmllbGQpIHsKKyAgICBzd2l0Y2ggKHNldEZpZWxkKSB7CisgICAgICBjYXNlIEJPTFQ6CisgICAgICAgIHJldHVybiBCT0xUX0ZJRUxEX0RFU0M7CisgICAgICBjYXNlIFNQT1VUOgorICAgICAgICByZXR1cm4gU1BPVVRfRklFTERfREVTQzsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gZmllbGQgaWQgIiArIHNldEZpZWxkKTsKKyAgICB9CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QgZ2V0U3RydWN0RGVzYygpIHsKKyAgICByZXR1cm4gU1RSVUNUX0RFU0M7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHJvdGVjdGVkIF9GaWVsZHMgZW51bUZvcklkKHNob3J0IGlkKSB7CisgICAgcmV0dXJuIF9GaWVsZHMuZmluZEJ5VGhyaWZ0SWRPclRocm93KGlkKTsKKyAgfQorCisgIHB1YmxpYyBfRmllbGRzIGZpZWxkRm9ySWQoaW50IGZpZWxkSWQpIHsKKyAgICByZXR1cm4gX0ZpZWxkcy5maW5kQnlUaHJpZnRJZChmaWVsZElkKTsKKyAgfQorCisKKyAgcHVibGljIEJvbHRBZ2dyZWdhdGVTdGF0cyBnZXRfYm9sdCgpIHsKKyAgICBpZiAoZ2V0U2V0RmllbGQoKSA9PSBfRmllbGRzLkJPTFQpIHsKKyAgICAgIHJldHVybiAoQm9sdEFnZ3JlZ2F0ZVN0YXRzKWdldEZpZWxkVmFsdWUoKTsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNhbm5vdCBnZXQgZmllbGQgJ2JvbHQnIGJlY2F1c2UgdW5pb24gaXMgY3VycmVudGx5IHNldCB0byAiICsgZ2V0RmllbGREZXNjKGdldFNldEZpZWxkKCkpLm5hbWUpOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF9ib2x0KEJvbHRBZ2dyZWdhdGVTdGF0cyB2YWx1ZSkgeworICAgIGlmICh2YWx1ZSA9PSBudWxsKSB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKyAgICBzZXRGaWVsZF8gPSBfRmllbGRzLkJPTFQ7CisgICAgdmFsdWVfID0gdmFsdWU7CisgIH0KKworICBwdWJsaWMgU3BvdXRBZ2dyZWdhdGVTdGF0cyBnZXRfc3BvdXQoKSB7CisgICAgaWYgKGdldFNldEZpZWxkKCkgPT0gX0ZpZWxkcy5TUE9VVCkgeworICAgICAgcmV0dXJuIChTcG91dEFnZ3JlZ2F0ZVN0YXRzKWdldEZpZWxkVmFsdWUoKTsKKyAgICB9IGVsc2UgeworICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNhbm5vdCBnZXQgZmllbGQgJ3Nwb3V0JyBiZWNhdXNlIHVuaW9uIGlzIGN1cnJlbnRseSBzZXQgdG8gIiArIGdldEZpZWxkRGVzYyhnZXRTZXRGaWVsZCgpKS5uYW1lKTsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfc3BvdXQoU3BvdXRBZ2dyZWdhdGVTdGF0cyB2YWx1ZSkgeworICAgIGlmICh2YWx1ZSA9PSBudWxsKSB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKyAgICBzZXRGaWVsZF8gPSBfRmllbGRzLlNQT1VUOworICAgIHZhbHVlXyA9IHZhbHVlOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gaXNfc2V0X2JvbHQoKSB7CisgICAgcmV0dXJuIHNldEZpZWxkXyA9PSBfRmllbGRzLkJPTFQ7CisgIH0KKworCisgIHB1YmxpYyBib29sZWFuIGlzX3NldF9zcG91dCgpIHsKKyAgICByZXR1cm4gc2V0RmllbGRfID09IF9GaWVsZHMuU1BPVVQ7CisgIH0KKworCisgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKKyAgICBpZiAob3RoZXIgaW5zdGFuY2VvZiBTcGVjaWZpY0FnZ3JlZ2F0ZVN0YXRzKSB7CisgICAgICByZXR1cm4gZXF1YWxzKChTcGVjaWZpY0FnZ3JlZ2F0ZVN0YXRzKW90aGVyKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGVxdWFscyhTcGVjaWZpY0FnZ3JlZ2F0ZVN0YXRzIG90aGVyKSB7CisgICAgcmV0dXJuIG90aGVyICE9IG51bGwgJiYgZ2V0U2V0RmllbGQoKSA9PSBvdGhlci5nZXRTZXRGaWVsZCgpICYmIGdldEZpZWxkVmFsdWUoKS5lcXVhbHMob3RoZXIuZ2V0RmllbGRWYWx1ZSgpKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGNvbXBhcmVUbyhTcGVjaWZpY0FnZ3JlZ2F0ZVN0YXRzIG90aGVyKSB7CisgICAgaW50IGxhc3RDb21wYXJpc29uID0gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29tcGFyZVRvKGdldFNldEZpZWxkKCksIG90aGVyLmdldFNldEZpZWxkKCkpOworICAgIGlmIChsYXN0Q29tcGFyaXNvbiA9PSAwKSB7CisgICAgICByZXR1cm4gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29tcGFyZVRvKGdldEZpZWxkVmFsdWUoKSwgb3RoZXIuZ2V0RmllbGRWYWx1ZSgpKTsKKyAgICB9CisgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICB9CisKKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICBMaXN0PE9iamVjdD4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOworICAgIGxpc3QuYWRkKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZElkRW51bSBzZXRGaWVsZCA9IGdldFNldEZpZWxkKCk7CisgICAgaWYgKHNldEZpZWxkICE9IG51bGwpIHsKKyAgICAgIGxpc3QuYWRkKHNldEZpZWxkLmdldFRocmlmdEZpZWxkSWQoKSk7CisgICAgICBPYmplY3QgdmFsdWUgPSBnZXRGaWVsZFZhbHVlKCk7CisgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBvcmcuYXBhY2hlLnRocmlmdC5URW51bSkgeworICAgICAgICBsaXN0LmFkZCgoKG9yZy5hcGFjaGUudGhyaWZ0LlRFbnVtKWdldEZpZWxkVmFsdWUoKSkuZ2V0VmFsdWUoKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBsaXN0LmFkZCh2YWx1ZSk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBsaXN0Lmhhc2hDb2RlKCk7CisgIH0KKyAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICB3cml0ZShuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbChuZXcgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRJT1N0cmVhbVRyYW5zcG9ydChvdXQpKSk7CisgICAgfSBjYXRjaCAob3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB0ZSkgeworICAgICAgdGhyb3cgbmV3IGphdmEuaW8uSU9FeGNlcHRpb24odGUpOworICAgIH0KKyAgfQorCisKKyAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBpbikgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICByZWFkKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQ29tcGFjdFByb3RvY29sKG5ldyBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVElPU3RyZWFtVHJhbnNwb3J0KGluKSkpOworICAgIH0gY2F0Y2ggKG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24gdGUpIHsKKyAgICAgIHRocm93IG5ldyBqYXZhLmlvLklPRXhjZXB0aW9uKHRlKTsKKyAgICB9CisgIH0KKworCit9CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL1Nwb3V0QWdncmVnYXRlU3RhdHMuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvU3BvdXRBZ2dyZWdhdGVTdGF0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1M2RiMGEKLS0tIC9kZXYvbnVsbAorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL1Nwb3V0QWdncmVnYXRlU3RhdHMuamF2YQpAQCAtMCwwICsxLDQwNyBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8qKgorICogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4zKQorICoKKyAqIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkcKKyAqICBAZ2VuZXJhdGVkCisgKi8KK3BhY2thZ2UgYmFja3R5cGUuc3Rvcm0uZ2VuZXJhdGVkOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLklTY2hlbWU7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLlNjaGVtZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLlN0YW5kYXJkU2NoZW1lOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLlR1cGxlU2NoZW1lOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUdXBsZVByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5FbmNvZGluZ1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuQXN5bmNNZXRob2RDYWxsYmFjazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlci4qOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bU1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuQml0U2V0OworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLkdlbmVyYXRlZDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitAU3VwcHJlc3NXYXJuaW5ncyh7ImNhc3QiLCAicmF3dHlwZXMiLCAic2VyaWFsIiwgInVuY2hlY2tlZCJ9KQorQEdlbmVyYXRlZCh2YWx1ZSA9ICJBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjMpIikKK3B1YmxpYyBjbGFzcyBTcG91dEFnZ3JlZ2F0ZVN0YXRzIGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2U8U3BvdXRBZ2dyZWdhdGVTdGF0cywgU3BvdXRBZ2dyZWdhdGVTdGF0cy5fRmllbGRzPiwgamF2YS5pby5TZXJpYWxpemFibGUsIENsb25lYWJsZSwgQ29tcGFyYWJsZTxTcG91dEFnZ3JlZ2F0ZVN0YXRzPiB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QgU1RSVUNUX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdCgiU3BvdXRBZ2dyZWdhdGVTdGF0cyIpOworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBDT01QTEVURV9MQVRFTkNZX01TX0ZJRUxEX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkKCJjb21wbGV0ZV9sYXRlbmN5X21zIiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuRE9VQkxFLCAoc2hvcnQpMSk7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPENsYXNzPD8gZXh0ZW5kcyBJU2NoZW1lPiwgU2NoZW1lRmFjdG9yeT4gc2NoZW1lcyA9IG5ldyBIYXNoTWFwPENsYXNzPD8gZXh0ZW5kcyBJU2NoZW1lPiwgU2NoZW1lRmFjdG9yeT4oKTsKKyAgc3RhdGljIHsKKyAgICBzY2hlbWVzLnB1dChTdGFuZGFyZFNjaGVtZS5jbGFzcywgbmV3IFNwb3V0QWdncmVnYXRlU3RhdHNTdGFuZGFyZFNjaGVtZUZhY3RvcnkoKSk7CisgICAgc2NoZW1lcy5wdXQoVHVwbGVTY2hlbWUuY2xhc3MsIG5ldyBTcG91dEFnZ3JlZ2F0ZVN0YXRzVHVwbGVTY2hlbWVGYWN0b3J5KCkpOworICB9CisKKyAgcHJpdmF0ZSBkb3VibGUgY29tcGxldGVfbGF0ZW5jeV9tczsgLy8gb3B0aW9uYWwKKworICAvKiogVGhlIHNldCBvZiBmaWVsZHMgdGhpcyBzdHJ1Y3QgY29udGFpbnMsIGFsb25nIHdpdGggY29udmVuaWVuY2UgbWV0aG9kcyBmb3IgZmluZGluZyBhbmQgbWFuaXB1bGF0aW5nIHRoZW0uICovCisgIHB1YmxpYyBlbnVtIF9GaWVsZHMgaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRJZEVudW0geworICAgIENPTVBMRVRFX0xBVEVOQ1lfTVMoKHNob3J0KTEsICJjb21wbGV0ZV9sYXRlbmN5X21zIik7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBfRmllbGRzPiBieU5hbWUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIF9GaWVsZHM+KCk7CisKKyAgICBzdGF0aWMgeworICAgICAgZm9yIChfRmllbGRzIGZpZWxkIDogRW51bVNldC5hbGxPZihfRmllbGRzLmNsYXNzKSkgeworICAgICAgICBieU5hbWUucHV0KGZpZWxkLmdldEZpZWxkTmFtZSgpLCBmaWVsZCk7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCB0aGUgX0ZpZWxkcyBjb25zdGFudCB0aGF0IG1hdGNoZXMgZmllbGRJZCwgb3IgbnVsbCBpZiBpdHMgbm90IGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgX0ZpZWxkcyBmaW5kQnlUaHJpZnRJZChpbnQgZmllbGRJZCkgeworICAgICAgc3dpdGNoKGZpZWxkSWQpIHsKKyAgICAgICAgY2FzZSAxOiAvLyBDT01QTEVURV9MQVRFTkNZX01TCisgICAgICAgICAgcmV0dXJuIENPTVBMRVRFX0xBVEVOQ1lfTVM7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCB0aGUgX0ZpZWxkcyBjb25zdGFudCB0aGF0IG1hdGNoZXMgZmllbGRJZCwgdGhyb3dpbmcgYW4gZXhjZXB0aW9uCisgICAgICogaWYgaXQgaXMgbm90IGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgX0ZpZWxkcyBmaW5kQnlUaHJpZnRJZE9yVGhyb3coaW50IGZpZWxkSWQpIHsKKyAgICAgIF9GaWVsZHMgZmllbGRzID0gZmluZEJ5VGhyaWZ0SWQoZmllbGRJZCk7CisgICAgICBpZiAoZmllbGRzID09IG51bGwpIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkZpZWxkICIgKyBmaWVsZElkICsgIiBkb2Vzbid0IGV4aXN0ISIpOworICAgICAgcmV0dXJuIGZpZWxkczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kIHRoZSBfRmllbGRzIGNvbnN0YW50IHRoYXQgbWF0Y2hlcyBuYW1lLCBvciBudWxsIGlmIGl0cyBub3QgZm91bmQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBfRmllbGRzIGZpbmRCeU5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgIHJldHVybiBieU5hbWUuZ2V0KG5hbWUpOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgc2hvcnQgX3RocmlmdElkOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIF9maWVsZE5hbWU7CisKKyAgICBfRmllbGRzKHNob3J0IHRocmlmdElkLCBTdHJpbmcgZmllbGROYW1lKSB7CisgICAgICBfdGhyaWZ0SWQgPSB0aHJpZnRJZDsKKyAgICAgIF9maWVsZE5hbWUgPSBmaWVsZE5hbWU7CisgICAgfQorCisgICAgcHVibGljIHNob3J0IGdldFRocmlmdEZpZWxkSWQoKSB7CisgICAgICByZXR1cm4gX3RocmlmdElkOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmllbGROYW1lKCkgeworICAgICAgcmV0dXJuIF9maWVsZE5hbWU7CisgICAgfQorICB9CisKKyAgLy8gaXNzZXQgaWQgYXNzaWdubWVudHMKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IF9fQ09NUExFVEVfTEFURU5DWV9NU19JU1NFVF9JRCA9IDA7CisgIHByaXZhdGUgYnl0ZSBfX2lzc2V0X2JpdGZpZWxkID0gMDsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgX0ZpZWxkcyBvcHRpb25hbHNbXSA9IHtfRmllbGRzLkNPTVBMRVRFX0xBVEVOQ1lfTVN9OworICBwdWJsaWMgc3RhdGljIGZpbmFsIE1hcDxfRmllbGRzLCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YT4gbWV0YURhdGFNYXA7CisgIHN0YXRpYyB7CisgICAgTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPiB0bXBNYXAgPSBuZXcgRW51bU1hcDxfRmllbGRzLCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YT4oX0ZpZWxkcy5jbGFzcyk7CisgICAgdG1wTWFwLnB1dChfRmllbGRzLkNPTVBMRVRFX0xBVEVOQ1lfTVMsIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YSgiY29tcGxldGVfbGF0ZW5jeV9tcyIsIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZFJlcXVpcmVtZW50VHlwZS5PUFRJT05BTCwgCisgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRWYWx1ZU1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkRPVUJMRSkpKTsKKyAgICBtZXRhRGF0YU1hcCA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcCh0bXBNYXApOworICAgIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhLmFkZFN0cnVjdE1ldGFEYXRhTWFwKFNwb3V0QWdncmVnYXRlU3RhdHMuY2xhc3MsIG1ldGFEYXRhTWFwKTsKKyAgfQorCisgIHB1YmxpYyBTcG91dEFnZ3JlZ2F0ZVN0YXRzKCkgeworICB9CisKKyAgLyoqCisgICAqIFBlcmZvcm1zIGEgZGVlcCBjb3B5IG9uIDxpPm90aGVyPC9pPi4KKyAgICovCisgIHB1YmxpYyBTcG91dEFnZ3JlZ2F0ZVN0YXRzKFNwb3V0QWdncmVnYXRlU3RhdHMgb3RoZXIpIHsKKyAgICBfX2lzc2V0X2JpdGZpZWxkID0gb3RoZXIuX19pc3NldF9iaXRmaWVsZDsKKyAgICB0aGlzLmNvbXBsZXRlX2xhdGVuY3lfbXMgPSBvdGhlci5jb21wbGV0ZV9sYXRlbmN5X21zOworICB9CisKKyAgcHVibGljIFNwb3V0QWdncmVnYXRlU3RhdHMgZGVlcENvcHkoKSB7CisgICAgcmV0dXJuIG5ldyBTcG91dEFnZ3JlZ2F0ZVN0YXRzKHRoaXMpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgIHNldF9jb21wbGV0ZV9sYXRlbmN5X21zX2lzU2V0KGZhbHNlKTsKKyAgICB0aGlzLmNvbXBsZXRlX2xhdGVuY3lfbXMgPSAwLjA7CisgIH0KKworICBwdWJsaWMgZG91YmxlIGdldF9jb21wbGV0ZV9sYXRlbmN5X21zKCkgeworICAgIHJldHVybiB0aGlzLmNvbXBsZXRlX2xhdGVuY3lfbXM7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfY29tcGxldGVfbGF0ZW5jeV9tcyhkb3VibGUgY29tcGxldGVfbGF0ZW5jeV9tcykgeworICAgIHRoaXMuY29tcGxldGVfbGF0ZW5jeV9tcyA9IGNvbXBsZXRlX2xhdGVuY3lfbXM7CisgICAgc2V0X2NvbXBsZXRlX2xhdGVuY3lfbXNfaXNTZXQodHJ1ZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB1bnNldF9jb21wbGV0ZV9sYXRlbmN5X21zKCkgeworICAgIF9faXNzZXRfYml0ZmllbGQgPSBFbmNvZGluZ1V0aWxzLmNsZWFyQml0KF9faXNzZXRfYml0ZmllbGQsIF9fQ09NUExFVEVfTEFURU5DWV9NU19JU1NFVF9JRCk7CisgIH0KKworICAvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkIGNvbXBsZXRlX2xhdGVuY3lfbXMgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgIHB1YmxpYyBib29sZWFuIGlzX3NldF9jb21wbGV0ZV9sYXRlbmN5X21zKCkgeworICAgIHJldHVybiBFbmNvZGluZ1V0aWxzLnRlc3RCaXQoX19pc3NldF9iaXRmaWVsZCwgX19DT01QTEVURV9MQVRFTkNZX01TX0lTU0VUX0lEKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF9jb21wbGV0ZV9sYXRlbmN5X21zX2lzU2V0KGJvb2xlYW4gdmFsdWUpIHsKKyAgICBfX2lzc2V0X2JpdGZpZWxkID0gRW5jb2RpbmdVdGlscy5zZXRCaXQoX19pc3NldF9iaXRmaWVsZCwgX19DT01QTEVURV9MQVRFTkNZX01TX0lTU0VUX0lELCB2YWx1ZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRGaWVsZFZhbHVlKF9GaWVsZHMgZmllbGQsIE9iamVjdCB2YWx1ZSkgeworICAgIHN3aXRjaCAoZmllbGQpIHsKKyAgICBjYXNlIENPTVBMRVRFX0xBVEVOQ1lfTVM6CisgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICB1bnNldF9jb21wbGV0ZV9sYXRlbmN5X21zKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzZXRfY29tcGxldGVfbGF0ZW5jeV9tcygoRG91YmxlKXZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgfQorICB9CisKKyAgcHVibGljIE9iamVjdCBnZXRGaWVsZFZhbHVlKF9GaWVsZHMgZmllbGQpIHsKKyAgICBzd2l0Y2ggKGZpZWxkKSB7CisgICAgY2FzZSBDT01QTEVURV9MQVRFTkNZX01TOgorICAgICAgcmV0dXJuIGdldF9jb21wbGV0ZV9sYXRlbmN5X21zKCk7CisKKyAgICB9CisgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICB9CisKKyAgLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBjb3JyZXNwb25kaW5nIHRvIGZpZWxkSUQgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgIHB1YmxpYyBib29sZWFuIGlzU2V0KF9GaWVsZHMgZmllbGQpIHsKKyAgICBpZiAoZmllbGQgPT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHN3aXRjaCAoZmllbGQpIHsKKyAgICBjYXNlIENPTVBMRVRFX0xBVEVOQ1lfTVM6CisgICAgICByZXR1cm4gaXNfc2V0X2NvbXBsZXRlX2xhdGVuY3lfbXMoKTsKKyAgICB9CisgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgdGhhdCkgeworICAgIGlmICh0aGF0ID09IG51bGwpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKHRoYXQgaW5zdGFuY2VvZiBTcG91dEFnZ3JlZ2F0ZVN0YXRzKQorICAgICAgcmV0dXJuIHRoaXMuZXF1YWxzKChTcG91dEFnZ3JlZ2F0ZVN0YXRzKXRoYXQpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGVxdWFscyhTcG91dEFnZ3JlZ2F0ZVN0YXRzIHRoYXQpIHsKKyAgICBpZiAodGhhdCA9PSBudWxsKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgYm9vbGVhbiB0aGlzX3ByZXNlbnRfY29tcGxldGVfbGF0ZW5jeV9tcyA9IHRydWUgJiYgdGhpcy5pc19zZXRfY29tcGxldGVfbGF0ZW5jeV9tcygpOworICAgIGJvb2xlYW4gdGhhdF9wcmVzZW50X2NvbXBsZXRlX2xhdGVuY3lfbXMgPSB0cnVlICYmIHRoYXQuaXNfc2V0X2NvbXBsZXRlX2xhdGVuY3lfbXMoKTsKKyAgICBpZiAodGhpc19wcmVzZW50X2NvbXBsZXRlX2xhdGVuY3lfbXMgfHwgdGhhdF9wcmVzZW50X2NvbXBsZXRlX2xhdGVuY3lfbXMpIHsKKyAgICAgIGlmICghKHRoaXNfcHJlc2VudF9jb21wbGV0ZV9sYXRlbmN5X21zICYmIHRoYXRfcHJlc2VudF9jb21wbGV0ZV9sYXRlbmN5X21zKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKHRoaXMuY29tcGxldGVfbGF0ZW5jeV9tcyAhPSB0aGF0LmNvbXBsZXRlX2xhdGVuY3lfbXMpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgIExpc3Q8T2JqZWN0PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7CisKKyAgICBib29sZWFuIHByZXNlbnRfY29tcGxldGVfbGF0ZW5jeV9tcyA9IHRydWUgJiYgKGlzX3NldF9jb21wbGV0ZV9sYXRlbmN5X21zKCkpOworICAgIGxpc3QuYWRkKHByZXNlbnRfY29tcGxldGVfbGF0ZW5jeV9tcyk7CisgICAgaWYgKHByZXNlbnRfY29tcGxldGVfbGF0ZW5jeV9tcykKKyAgICAgIGxpc3QuYWRkKGNvbXBsZXRlX2xhdGVuY3lfbXMpOworCisgICAgcmV0dXJuIGxpc3QuaGFzaENvZGUoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGNvbXBhcmVUbyhTcG91dEFnZ3JlZ2F0ZVN0YXRzIG90aGVyKSB7CisgICAgaWYgKCFnZXRDbGFzcygpLmVxdWFscyhvdGhlci5nZXRDbGFzcygpKSkgeworICAgICAgcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpLmNvbXBhcmVUbyhvdGhlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgfQorCisgICAgaW50IGxhc3RDb21wYXJpc29uID0gMDsKKworICAgIGxhc3RDb21wYXJpc29uID0gQm9vbGVhbi52YWx1ZU9mKGlzX3NldF9jb21wbGV0ZV9sYXRlbmN5X21zKCkpLmNvbXBhcmVUbyhvdGhlci5pc19zZXRfY29tcGxldGVfbGF0ZW5jeV9tcygpKTsKKyAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgIH0KKyAgICBpZiAoaXNfc2V0X2NvbXBsZXRlX2xhdGVuY3lfbXMoKSkgeworICAgICAgbGFzdENvbXBhcmlzb24gPSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy5jb21wbGV0ZV9sYXRlbmN5X21zLCBvdGhlci5jb21wbGV0ZV9sYXRlbmN5X21zKTsKKyAgICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7CisgIH0KKworICBwdWJsaWMgX0ZpZWxkcyBmaWVsZEZvcklkKGludCBmaWVsZElkKSB7CisgICAgcmV0dXJuIF9GaWVsZHMuZmluZEJ5VGhyaWZ0SWQoZmllbGRJZCk7CisgIH0KKworICBwdWJsaWMgdm9pZCByZWFkKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBpcHJvdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgIHNjaGVtZXMuZ2V0KGlwcm90LmdldFNjaGVtZSgpKS5nZXRTY2hlbWUoKS5yZWFkKGlwcm90LCB0aGlzKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgIHNjaGVtZXMuZ2V0KG9wcm90LmdldFNjaGVtZSgpKS5nZXRTY2hlbWUoKS53cml0ZShvcHJvdCwgdGhpcyk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoIlNwb3V0QWdncmVnYXRlU3RhdHMoIik7CisgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7CisKKyAgICBpZiAoaXNfc2V0X2NvbXBsZXRlX2xhdGVuY3lfbXMoKSkgeworICAgICAgc2IuYXBwZW5kKCJjb21wbGV0ZV9sYXRlbmN5X21zOiIpOworICAgICAgc2IuYXBwZW5kKHRoaXMuY29tcGxldGVfbGF0ZW5jeV9tcyk7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0KKyAgICBzYi5hcHBlbmQoIikiKTsKKyAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgIC8vIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMKKyAgICAvLyBjaGVjayBmb3Igc3ViLXN0cnVjdCB2YWxpZGl0eQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICB3cml0ZShuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbChuZXcgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRJT1N0cmVhbVRyYW5zcG9ydChvdXQpKSk7CisgICAgfSBjYXRjaCAob3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB0ZSkgeworICAgICAgdGhyb3cgbmV3IGphdmEuaW8uSU9FeGNlcHRpb24odGUpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0KGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0gaW4pIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgLy8gaXQgZG9lc24ndCBzZWVtIGxpa2UgeW91IHNob3VsZCBoYXZlIHRvIGRvIHRoaXMsIGJ1dCBqYXZhIHNlcmlhbGl6YXRpb24gaXMgd2Fja3ksIGFuZCBkb2Vzbid0IGNhbGwgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IuCisgICAgICBfX2lzc2V0X2JpdGZpZWxkID0gMDsKKyAgICAgIHJlYWQobmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRDb21wYWN0UHJvdG9jb2wobmV3IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5USU9TdHJlYW1UcmFuc3BvcnQoaW4pKSk7CisgICAgfSBjYXRjaCAob3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB0ZSkgeworICAgICAgdGhyb3cgbmV3IGphdmEuaW8uSU9FeGNlcHRpb24odGUpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNwb3V0QWdncmVnYXRlU3RhdHNTdGFuZGFyZFNjaGVtZUZhY3RvcnkgaW1wbGVtZW50cyBTY2hlbWVGYWN0b3J5IHsKKyAgICBwdWJsaWMgU3BvdXRBZ2dyZWdhdGVTdGF0c1N0YW5kYXJkU2NoZW1lIGdldFNjaGVtZSgpIHsKKyAgICAgIHJldHVybiBuZXcgU3BvdXRBZ2dyZWdhdGVTdGF0c1N0YW5kYXJkU2NoZW1lKCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3BvdXRBZ2dyZWdhdGVTdGF0c1N0YW5kYXJkU2NoZW1lIGV4dGVuZHMgU3RhbmRhcmRTY2hlbWU8U3BvdXRBZ2dyZWdhdGVTdGF0cz4geworCisgICAgcHVibGljIHZvaWQgcmVhZChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgaXByb3QsIFNwb3V0QWdncmVnYXRlU3RhdHMgc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgc2NoZW1lRmllbGQ7CisgICAgICBpcHJvdC5yZWFkU3RydWN0QmVnaW4oKTsKKyAgICAgIHdoaWxlICh0cnVlKQorICAgICAgeworICAgICAgICBzY2hlbWVGaWVsZCA9IGlwcm90LnJlYWRGaWVsZEJlZ2luKCk7CisgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUT1ApIHsgCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChzY2hlbWVGaWVsZC5pZCkgeworICAgICAgICAgIGNhc2UgMTogLy8gQ09NUExFVEVfTEFURU5DWV9NUworICAgICAgICAgICAgaWYgKHNjaGVtZUZpZWxkLnR5cGUgPT0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuRE9VQkxFKSB7CisgICAgICAgICAgICAgIHN0cnVjdC5jb21wbGV0ZV9sYXRlbmN5X21zID0gaXByb3QucmVhZERvdWJsZSgpOworICAgICAgICAgICAgICBzdHJ1Y3Quc2V0X2NvbXBsZXRlX2xhdGVuY3lfbXNfaXNTZXQodHJ1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeyAKKyAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOworICAgICAgICB9CisgICAgICAgIGlwcm90LnJlYWRGaWVsZEVuZCgpOworICAgICAgfQorICAgICAgaXByb3QucmVhZFN0cnVjdEVuZCgpOworICAgICAgc3RydWN0LnZhbGlkYXRlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIG9wcm90LCBTcG91dEFnZ3JlZ2F0ZVN0YXRzIHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgc3RydWN0LnZhbGlkYXRlKCk7CisKKyAgICAgIG9wcm90LndyaXRlU3RydWN0QmVnaW4oU1RSVUNUX0RFU0MpOworICAgICAgaWYgKHN0cnVjdC5pc19zZXRfY29tcGxldGVfbGF0ZW5jeV9tcygpKSB7CisgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihDT01QTEVURV9MQVRFTkNZX01TX0ZJRUxEX0RFU0MpOworICAgICAgICBvcHJvdC53cml0ZURvdWJsZShzdHJ1Y3QuY29tcGxldGVfbGF0ZW5jeV9tcyk7CisgICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICAgIH0KKyAgICAgIG9wcm90LndyaXRlRmllbGRTdG9wKCk7CisgICAgICBvcHJvdC53cml0ZVN0cnVjdEVuZCgpOworICAgIH0KKworICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3BvdXRBZ2dyZWdhdGVTdGF0c1R1cGxlU2NoZW1lRmFjdG9yeSBpbXBsZW1lbnRzIFNjaGVtZUZhY3RvcnkgeworICAgIHB1YmxpYyBTcG91dEFnZ3JlZ2F0ZVN0YXRzVHVwbGVTY2hlbWUgZ2V0U2NoZW1lKCkgeworICAgICAgcmV0dXJuIG5ldyBTcG91dEFnZ3JlZ2F0ZVN0YXRzVHVwbGVTY2hlbWUoKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTcG91dEFnZ3JlZ2F0ZVN0YXRzVHVwbGVTY2hlbWUgZXh0ZW5kcyBUdXBsZVNjaGVtZTxTcG91dEFnZ3JlZ2F0ZVN0YXRzPiB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgcHJvdCwgU3BvdXRBZ2dyZWdhdGVTdGF0cyBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgIFRUdXBsZVByb3RvY29sIG9wcm90ID0gKFRUdXBsZVByb3RvY29sKSBwcm90OworICAgICAgQml0U2V0IG9wdGlvbmFscyA9IG5ldyBCaXRTZXQoKTsKKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X2NvbXBsZXRlX2xhdGVuY3lfbXMoKSkgeworICAgICAgICBvcHRpb25hbHMuc2V0KDApOworICAgICAgfQorICAgICAgb3Byb3Qud3JpdGVCaXRTZXQob3B0aW9uYWxzLCAxKTsKKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X2NvbXBsZXRlX2xhdGVuY3lfbXMoKSkgeworICAgICAgICBvcHJvdC53cml0ZURvdWJsZShzdHJ1Y3QuY29tcGxldGVfbGF0ZW5jeV9tcyk7CisgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVhZChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgcHJvdCwgU3BvdXRBZ2dyZWdhdGVTdGF0cyBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgIFRUdXBsZVByb3RvY29sIGlwcm90ID0gKFRUdXBsZVByb3RvY29sKSBwcm90OworICAgICAgQml0U2V0IGluY29taW5nID0gaXByb3QucmVhZEJpdFNldCgxKTsKKyAgICAgIGlmIChpbmNvbWluZy5nZXQoMCkpIHsKKyAgICAgICAgc3RydWN0LmNvbXBsZXRlX2xhdGVuY3lfbXMgPSBpcHJvdC5yZWFkRG91YmxlKCk7CisgICAgICAgIHN0cnVjdC5zZXRfY29tcGxldGVfbGF0ZW5jeV9tc19pc1NldCh0cnVlKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworfQorCmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL1Nwb3V0U3BlYy5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9TcG91dFNwZWMuamF2YQppbmRleCA0MmZkMzdiLi40OTJjYzM2IDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL1Nwb3V0U3BlYy5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvU3BvdXRTcGVjLmphdmEKQEAgLTE2LDcgKzE2LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAvKioKLSAqIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMikKKyAqIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMykKICAqCiAgKiBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HCiAgKiAgQGdlbmVyYXRlZApAQCAtNTEsNyArNTEsNyBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCiBAU3VwcHJlc3NXYXJuaW5ncyh7ImNhc3QiLCAicmF3dHlwZXMiLCAic2VyaWFsIiwgInVuY2hlY2tlZCJ9KQotQEdlbmVyYXRlZCh2YWx1ZSA9ICJBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjIpIiwgZGF0ZSA9ICIyMDE1LTItNiIpCitAR2VuZXJhdGVkKHZhbHVlID0gIkF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMykiKQogcHVibGljIGNsYXNzIFNwb3V0U3BlYyBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlPFNwb3V0U3BlYywgU3BvdXRTcGVjLl9GaWVsZHM+LCBqYXZhLmlvLlNlcmlhbGl6YWJsZSwgQ2xvbmVhYmxlLCBDb21wYXJhYmxlPFNwb3V0U3BlYz4gewogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0IFNUUlVDVF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QoIlNwb3V0U3BlYyIpOwogCmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL1Nwb3V0U3RhdHMuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvU3BvdXRTdGF0cy5qYXZhCmluZGV4IGMxOGE3ZDAuLjAzZmI3ZmUgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvU3BvdXRTdGF0cy5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvU3BvdXRTdGF0cy5qYXZhCkBAIC0xNiw3ICsxNiw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogLyoqCi0gKiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjIpCisgKiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjMpCiAgKgogICogRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lORwogICogIEBnZW5lcmF0ZWQKQEAgLTUxLDcgKzUxLDcgQEAKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAogQFN1cHByZXNzV2FybmluZ3MoeyJjYXN0IiwgInJhd3R5cGVzIiwgInNlcmlhbCIsICJ1bmNoZWNrZWQifSkKLUBHZW5lcmF0ZWQodmFsdWUgPSAiQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4yKSIsIGRhdGUgPSAiMjAxNS05LTMiKQorQEdlbmVyYXRlZCh2YWx1ZSA9ICJBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjMpIikKIHB1YmxpYyBjbGFzcyBTcG91dFN0YXRzIGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2U8U3BvdXRTdGF0cywgU3BvdXRTdGF0cy5fRmllbGRzPiwgamF2YS5pby5TZXJpYWxpemFibGUsIENsb25lYWJsZSwgQ29tcGFyYWJsZTxTcG91dFN0YXRzPiB7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QgU1RSVUNUX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdCgiU3BvdXRTdGF0cyIpOwogCkBAIC02MDIsMjcgKzYwMiwyNyBAQAogICAgICAgICAgIGNhc2UgMTogLy8gQUNLRUQKICAgICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLk1BUCkgewogICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwMTk4ID0gaXByb3QucmVhZE1hcEJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgc3RydWN0LmFja2VkID0gbmV3IEhhc2hNYXA8U3RyaW5nLE1hcDxTdHJpbmcsTG9uZz4+KDIqX21hcDE5OC5zaXplKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgX2tleTE5OTsKLSAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLExvbmc+IF92YWwyMDA7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgX2kyMDEgPSAwOyBfaTIwMSA8IF9tYXAxOTguc2l6ZTsgKytfaTIwMSkKKyAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwIF9tYXAyMTYgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKTsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QuYWNrZWQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsTWFwPFN0cmluZyxMb25nPj4oMipfbWFwMjE2LnNpemUpOworICAgICAgICAgICAgICAgIFN0cmluZyBfa2V5MjE3OworICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsTG9uZz4gX3ZhbDIxODsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBfaTIxOSA9IDA7IF9pMjE5IDwgX21hcDIxNi5zaXplOyArK19pMjE5KQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIF9rZXkxOTkgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICBfa2V5MjE3ID0gaXByb3QucmVhZFN0cmluZygpOwogICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwIF9tYXAyMDIgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKTsKLSAgICAgICAgICAgICAgICAgICAgX3ZhbDIwMCA9IG5ldyBIYXNoTWFwPFN0cmluZyxMb25nPigyKl9tYXAyMDIuc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBfa2V5MjAzOwotICAgICAgICAgICAgICAgICAgICBsb25nIF92YWwyMDQ7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IF9pMjA1ID0gMDsgX2kyMDUgPCBfbWFwMjAyLnNpemU7ICsrX2kyMDUpCisgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgX21hcDIyMCA9IGlwcm90LnJlYWRNYXBCZWdpbigpOworICAgICAgICAgICAgICAgICAgICBfdmFsMjE4ID0gbmV3IEhhc2hNYXA8U3RyaW5nLExvbmc+KDIqX21hcDIyMC5zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIF9rZXkyMjE7CisgICAgICAgICAgICAgICAgICAgIGxvbmcgX3ZhbDIyMjsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgX2kyMjMgPSAwOyBfaTIyMyA8IF9tYXAyMjAuc2l6ZTsgKytfaTIyMykKICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgIF9rZXkyMDMgPSBpcHJvdC5yZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgX3ZhbDIwNCA9IGlwcm90LnJlYWRJNjQoKTsKLSAgICAgICAgICAgICAgICAgICAgICBfdmFsMjAwLnB1dChfa2V5MjAzLCBfdmFsMjA0KTsKKyAgICAgICAgICAgICAgICAgICAgICBfa2V5MjIxID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICAgICAgICAgICAgICAgIF92YWwyMjIgPSBpcHJvdC5yZWFkSTY0KCk7CisgICAgICAgICAgICAgICAgICAgICAgX3ZhbDIxOC5wdXQoX2tleTIyMSwgX3ZhbDIyMik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaXByb3QucmVhZE1hcEVuZCgpOwogICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgc3RydWN0LmFja2VkLnB1dChfa2V5MTk5LCBfdmFsMjAwKTsKKyAgICAgICAgICAgICAgICAgIHN0cnVjdC5hY2tlZC5wdXQoX2tleTIxNywgX3ZhbDIxOCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlwcm90LnJlYWRNYXBFbmQoKTsKICAgICAgICAgICAgICAgfQpAQCAtNjM0LDI3ICs2MzQsMjcgQEAKICAgICAgICAgICBjYXNlIDI6IC8vIEZBSUxFRAogICAgICAgICAgICAgaWYgKHNjaGVtZUZpZWxkLnR5cGUgPT0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTUFQKSB7CiAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwIF9tYXAyMDYgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKTsKLSAgICAgICAgICAgICAgICBzdHJ1Y3QuZmFpbGVkID0gbmV3IEhhc2hNYXA8U3RyaW5nLE1hcDxTdHJpbmcsTG9uZz4+KDIqX21hcDIwNi5zaXplKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgX2tleTIwNzsKLSAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLExvbmc+IF92YWwyMDg7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgX2kyMDkgPSAwOyBfaTIwOSA8IF9tYXAyMDYuc2l6ZTsgKytfaTIwOSkKKyAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwIF9tYXAyMjQgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKTsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QuZmFpbGVkID0gbmV3IEhhc2hNYXA8U3RyaW5nLE1hcDxTdHJpbmcsTG9uZz4+KDIqX21hcDIyNC5zaXplKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgX2tleTIyNTsKKyAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLExvbmc+IF92YWwyMjY7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgX2kyMjcgPSAwOyBfaTIyNyA8IF9tYXAyMjQuc2l6ZTsgKytfaTIyNykKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBfa2V5MjA3ID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICAgICAgICAgICAgX2tleTIyNSA9IGlwcm90LnJlYWRTdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwMjEwID0gaXByb3QucmVhZE1hcEJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgICAgIF92YWwyMDggPSBuZXcgSGFzaE1hcDxTdHJpbmcsTG9uZz4oMipfbWFwMjEwLnNpemUpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgX2tleTIxMTsKLSAgICAgICAgICAgICAgICAgICAgbG9uZyBfdmFsMjEyOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBfaTIxMyA9IDA7IF9pMjEzIDwgX21hcDIxMC5zaXplOyArK19pMjEzKQorICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwIF9tYXAyMjggPSBpcHJvdC5yZWFkTWFwQmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgX3ZhbDIyNiA9IG5ldyBIYXNoTWFwPFN0cmluZyxMb25nPigyKl9tYXAyMjguc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBfa2V5MjI5OworICAgICAgICAgICAgICAgICAgICBsb25nIF92YWwyMzA7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IF9pMjMxID0gMDsgX2kyMzEgPCBfbWFwMjI4LnNpemU7ICsrX2kyMzEpCiAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICBfa2V5MjExID0gaXByb3QucmVhZFN0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgIF92YWwyMTIgPSBpcHJvdC5yZWFkSTY0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgX3ZhbDIwOC5wdXQoX2tleTIxMSwgX3ZhbDIxMik7CisgICAgICAgICAgICAgICAgICAgICAgX2tleTIyOSA9IGlwcm90LnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICBfdmFsMjMwID0gaXByb3QucmVhZEk2NCgpOworICAgICAgICAgICAgICAgICAgICAgIF92YWwyMjYucHV0KF9rZXkyMjksIF92YWwyMzApOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGlwcm90LnJlYWRNYXBFbmQoKTsKICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIHN0cnVjdC5mYWlsZWQucHV0KF9rZXkyMDcsIF92YWwyMDgpOworICAgICAgICAgICAgICAgICAgc3RydWN0LmZhaWxlZC5wdXQoX2tleTIyNSwgX3ZhbDIyNik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlwcm90LnJlYWRNYXBFbmQoKTsKICAgICAgICAgICAgICAgfQpAQCAtNjY2LDI3ICs2NjYsMjcgQEAKICAgICAgICAgICBjYXNlIDM6IC8vIENPTVBMRVRFX01TX0FWRwogICAgICAgICAgICAgaWYgKHNjaGVtZUZpZWxkLnR5cGUgPT0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTUFQKSB7CiAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwIF9tYXAyMTQgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKTsKLSAgICAgICAgICAgICAgICBzdHJ1Y3QuY29tcGxldGVfbXNfYXZnID0gbmV3IEhhc2hNYXA8U3RyaW5nLE1hcDxTdHJpbmcsRG91YmxlPj4oMipfbWFwMjE0LnNpemUpOwotICAgICAgICAgICAgICAgIFN0cmluZyBfa2V5MjE1OwotICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsRG91YmxlPiBfdmFsMjE2OwotICAgICAgICAgICAgICAgIGZvciAoaW50IF9pMjE3ID0gMDsgX2kyMTcgPCBfbWFwMjE0LnNpemU7ICsrX2kyMTcpCisgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwMjMyID0gaXByb3QucmVhZE1hcEJlZ2luKCk7CisgICAgICAgICAgICAgICAgc3RydWN0LmNvbXBsZXRlX21zX2F2ZyA9IG5ldyBIYXNoTWFwPFN0cmluZyxNYXA8U3RyaW5nLERvdWJsZT4+KDIqX21hcDIzMi5zaXplKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgX2tleTIzMzsKKyAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLERvdWJsZT4gX3ZhbDIzNDsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBfaTIzNSA9IDA7IF9pMjM1IDwgX21hcDIzMi5zaXplOyArK19pMjM1KQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIF9rZXkyMTUgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICBfa2V5MjMzID0gaXByb3QucmVhZFN0cmluZygpOwogICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwIF9tYXAyMTggPSBpcHJvdC5yZWFkTWFwQmVnaW4oKTsKLSAgICAgICAgICAgICAgICAgICAgX3ZhbDIxNiA9IG5ldyBIYXNoTWFwPFN0cmluZyxEb3VibGU+KDIqX21hcDIxOC5zaXplKTsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIF9rZXkyMTk7Ci0gICAgICAgICAgICAgICAgICAgIGRvdWJsZSBfdmFsMjIwOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBfaTIyMSA9IDA7IF9pMjIxIDwgX21hcDIxOC5zaXplOyArK19pMjIxKQorICAgICAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwIF9tYXAyMzYgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgX3ZhbDIzNCA9IG5ldyBIYXNoTWFwPFN0cmluZyxEb3VibGU+KDIqX21hcDIzNi5zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIF9rZXkyMzc7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBfdmFsMjM4OworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBfaTIzOSA9IDA7IF9pMjM5IDwgX21hcDIzNi5zaXplOyArK19pMjM5KQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgX2tleTIxOSA9IGlwcm90LnJlYWRTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICBfdmFsMjIwID0gaXByb3QucmVhZERvdWJsZSgpOwotICAgICAgICAgICAgICAgICAgICAgIF92YWwyMTYucHV0KF9rZXkyMTksIF92YWwyMjApOworICAgICAgICAgICAgICAgICAgICAgIF9rZXkyMzcgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgX3ZhbDIzOCA9IGlwcm90LnJlYWREb3VibGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICBfdmFsMjM0LnB1dChfa2V5MjM3LCBfdmFsMjM4KTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpcHJvdC5yZWFkTWFwRW5kKCk7CiAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBzdHJ1Y3QuY29tcGxldGVfbXNfYXZnLnB1dChfa2V5MjE1LCBfdmFsMjE2KTsKKyAgICAgICAgICAgICAgICAgIHN0cnVjdC5jb21wbGV0ZV9tc19hdmcucHV0KF9rZXkyMzMsIF92YWwyMzQpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpcHJvdC5yZWFkTWFwRW5kKCk7CiAgICAgICAgICAgICAgIH0KQEAgLTcxMiwxNSArNzEyLDE1IEBACiAgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihBQ0tFRF9GSUVMRF9ERVNDKTsKICAgICAgICAgewogICAgICAgICAgIG9wcm90LndyaXRlTWFwQmVnaW4obmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5NQVAsIHN0cnVjdC5hY2tlZC5zaXplKCkpKTsKLSAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIE1hcDxTdHJpbmcsTG9uZz4+IF9pdGVyMjIyIDogc3RydWN0LmFja2VkLmVudHJ5U2V0KCkpCisgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBNYXA8U3RyaW5nLExvbmc+PiBfaXRlcjI0MCA6IHN0cnVjdC5hY2tlZC5lbnRyeVNldCgpKQogICAgICAgICAgIHsKLSAgICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKF9pdGVyMjIyLmdldEtleSgpKTsKKyAgICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKF9pdGVyMjQwLmdldEtleSgpKTsKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgb3Byb3Qud3JpdGVNYXBCZWdpbihuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkk2NCwgX2l0ZXIyMjIuZ2V0VmFsdWUoKS5zaXplKCkpKTsKLSAgICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBMb25nPiBfaXRlcjIyMyA6IF9pdGVyMjIyLmdldFZhbHVlKCkuZW50cnlTZXQoKSkKKyAgICAgICAgICAgICAgb3Byb3Qud3JpdGVNYXBCZWdpbihuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkk2NCwgX2l0ZXIyNDAuZ2V0VmFsdWUoKS5zaXplKCkpKTsKKyAgICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBMb25nPiBfaXRlcjI0MSA6IF9pdGVyMjQwLmdldFZhbHVlKCkuZW50cnlTZXQoKSkKICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKF9pdGVyMjIzLmdldEtleSgpKTsKLSAgICAgICAgICAgICAgICBvcHJvdC53cml0ZUk2NChfaXRlcjIyMy5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhfaXRlcjI0MS5nZXRLZXkoKSk7CisgICAgICAgICAgICAgICAgb3Byb3Qud3JpdGVJNjQoX2l0ZXIyNDEuZ2V0VmFsdWUoKSk7CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgb3Byb3Qud3JpdGVNYXBFbmQoKTsKICAgICAgICAgICAgIH0KQEAgLTczMywxNSArNzMzLDE1IEBACiAgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihGQUlMRURfRklFTERfREVTQyk7CiAgICAgICAgIHsKICAgICAgICAgICBvcHJvdC53cml0ZU1hcEJlZ2luKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORywgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTUFQLCBzdHJ1Y3QuZmFpbGVkLnNpemUoKSkpOwotICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgTWFwPFN0cmluZyxMb25nPj4gX2l0ZXIyMjQgOiBzdHJ1Y3QuZmFpbGVkLmVudHJ5U2V0KCkpCisgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBNYXA8U3RyaW5nLExvbmc+PiBfaXRlcjI0MiA6IHN0cnVjdC5mYWlsZWQuZW50cnlTZXQoKSkKICAgICAgICAgICB7Ci0gICAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhfaXRlcjIyNC5nZXRLZXkoKSk7CisgICAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhfaXRlcjI0Mi5nZXRLZXkoKSk7CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG9wcm90LndyaXRlTWFwQmVnaW4obmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JNjQsIF9pdGVyMjI0LmdldFZhbHVlKCkuc2l6ZSgpKSk7Ci0gICAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgTG9uZz4gX2l0ZXIyMjUgOiBfaXRlcjIyNC5nZXRWYWx1ZSgpLmVudHJ5U2V0KCkpCisgICAgICAgICAgICAgIG9wcm90LndyaXRlTWFwQmVnaW4obmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JNjQsIF9pdGVyMjQyLmdldFZhbHVlKCkuc2l6ZSgpKSk7CisgICAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgTG9uZz4gX2l0ZXIyNDMgOiBfaXRlcjI0Mi5nZXRWYWx1ZSgpLmVudHJ5U2V0KCkpCiAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhfaXRlcjIyNS5nZXRLZXkoKSk7Ci0gICAgICAgICAgICAgICAgb3Byb3Qud3JpdGVJNjQoX2l0ZXIyMjUuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoX2l0ZXIyNDMuZ2V0S2V5KCkpOworICAgICAgICAgICAgICAgIG9wcm90LndyaXRlSTY0KF9pdGVyMjQzLmdldFZhbHVlKCkpOwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIG9wcm90LndyaXRlTWFwRW5kKCk7CiAgICAgICAgICAgICB9CkBAIC03NTQsMTUgKzc1NCwxNSBAQAogICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oQ09NUExFVEVfTVNfQVZHX0ZJRUxEX0RFU0MpOwogICAgICAgICB7CiAgICAgICAgICAgb3Byb3Qud3JpdGVNYXBCZWdpbihuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLk1BUCwgc3RydWN0LmNvbXBsZXRlX21zX2F2Zy5zaXplKCkpKTsKLSAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIE1hcDxTdHJpbmcsRG91YmxlPj4gX2l0ZXIyMjYgOiBzdHJ1Y3QuY29tcGxldGVfbXNfYXZnLmVudHJ5U2V0KCkpCisgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBNYXA8U3RyaW5nLERvdWJsZT4+IF9pdGVyMjQ0IDogc3RydWN0LmNvbXBsZXRlX21zX2F2Zy5lbnRyeVNldCgpKQogICAgICAgICAgIHsKLSAgICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKF9pdGVyMjI2LmdldEtleSgpKTsKKyAgICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKF9pdGVyMjQ0LmdldEtleSgpKTsKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgb3Byb3Qud3JpdGVNYXBCZWdpbihuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkRPVUJMRSwgX2l0ZXIyMjYuZ2V0VmFsdWUoKS5zaXplKCkpKTsKLSAgICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBEb3VibGU+IF9pdGVyMjI3IDogX2l0ZXIyMjYuZ2V0VmFsdWUoKS5lbnRyeVNldCgpKQorICAgICAgICAgICAgICBvcHJvdC53cml0ZU1hcEJlZ2luKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORywgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuRE9VQkxFLCBfaXRlcjI0NC5nZXRWYWx1ZSgpLnNpemUoKSkpOworICAgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIERvdWJsZT4gX2l0ZXIyNDUgOiBfaXRlcjI0NC5nZXRWYWx1ZSgpLmVudHJ5U2V0KCkpCiAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhfaXRlcjIyNy5nZXRLZXkoKSk7Ci0gICAgICAgICAgICAgICAgb3Byb3Qud3JpdGVEb3VibGUoX2l0ZXIyMjcuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoX2l0ZXIyNDUuZ2V0S2V5KCkpOworICAgICAgICAgICAgICAgIG9wcm90LndyaXRlRG91YmxlKF9pdGVyMjQ1LmdldFZhbHVlKCkpOwogICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgIG9wcm90LndyaXRlTWFwRW5kKCk7CiAgICAgICAgICAgICB9CkBAIC03OTAsNDUgKzc5MCw0NSBAQAogICAgICAgVFR1cGxlUHJvdG9jb2wgb3Byb3QgPSAoVFR1cGxlUHJvdG9jb2wpIHByb3Q7CiAgICAgICB7CiAgICAgICAgIG9wcm90LndyaXRlSTMyKHN0cnVjdC5hY2tlZC5zaXplKCkpOwotICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIE1hcDxTdHJpbmcsTG9uZz4+IF9pdGVyMjI4IDogc3RydWN0LmFja2VkLmVudHJ5U2V0KCkpCisgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgTWFwPFN0cmluZyxMb25nPj4gX2l0ZXIyNDYgOiBzdHJ1Y3QuYWNrZWQuZW50cnlTZXQoKSkKICAgICAgICAgewotICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKF9pdGVyMjI4LmdldEtleSgpKTsKKyAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhfaXRlcjI0Ni5nZXRLZXkoKSk7CiAgICAgICAgICAgewotICAgICAgICAgICAgb3Byb3Qud3JpdGVJMzIoX2l0ZXIyMjguZ2V0VmFsdWUoKS5zaXplKCkpOwotICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBMb25nPiBfaXRlcjIyOSA6IF9pdGVyMjI4LmdldFZhbHVlKCkuZW50cnlTZXQoKSkKKyAgICAgICAgICAgIG9wcm90LndyaXRlSTMyKF9pdGVyMjQ2LmdldFZhbHVlKCkuc2l6ZSgpKTsKKyAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgTG9uZz4gX2l0ZXIyNDcgOiBfaXRlcjI0Ni5nZXRWYWx1ZSgpLmVudHJ5U2V0KCkpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKF9pdGVyMjI5LmdldEtleSgpKTsKLSAgICAgICAgICAgICAgb3Byb3Qud3JpdGVJNjQoX2l0ZXIyMjkuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKF9pdGVyMjQ3LmdldEtleSgpKTsKKyAgICAgICAgICAgICAgb3Byb3Qud3JpdGVJNjQoX2l0ZXIyNDcuZ2V0VmFsdWUoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICB9CiAgICAgICB7CiAgICAgICAgIG9wcm90LndyaXRlSTMyKHN0cnVjdC5mYWlsZWQuc2l6ZSgpKTsKLSAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBNYXA8U3RyaW5nLExvbmc+PiBfaXRlcjIzMCA6IHN0cnVjdC5mYWlsZWQuZW50cnlTZXQoKSkKKyAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBNYXA8U3RyaW5nLExvbmc+PiBfaXRlcjI0OCA6IHN0cnVjdC5mYWlsZWQuZW50cnlTZXQoKSkKICAgICAgICAgewotICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKF9pdGVyMjMwLmdldEtleSgpKTsKKyAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhfaXRlcjI0OC5nZXRLZXkoKSk7CiAgICAgICAgICAgewotICAgICAgICAgICAgb3Byb3Qud3JpdGVJMzIoX2l0ZXIyMzAuZ2V0VmFsdWUoKS5zaXplKCkpOwotICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBMb25nPiBfaXRlcjIzMSA6IF9pdGVyMjMwLmdldFZhbHVlKCkuZW50cnlTZXQoKSkKKyAgICAgICAgICAgIG9wcm90LndyaXRlSTMyKF9pdGVyMjQ4LmdldFZhbHVlKCkuc2l6ZSgpKTsKKyAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgTG9uZz4gX2l0ZXIyNDkgOiBfaXRlcjI0OC5nZXRWYWx1ZSgpLmVudHJ5U2V0KCkpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKF9pdGVyMjMxLmdldEtleSgpKTsKLSAgICAgICAgICAgICAgb3Byb3Qud3JpdGVJNjQoX2l0ZXIyMzEuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKF9pdGVyMjQ5LmdldEtleSgpKTsKKyAgICAgICAgICAgICAgb3Byb3Qud3JpdGVJNjQoX2l0ZXIyNDkuZ2V0VmFsdWUoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICB9CiAgICAgICB7CiAgICAgICAgIG9wcm90LndyaXRlSTMyKHN0cnVjdC5jb21wbGV0ZV9tc19hdmcuc2l6ZSgpKTsKLSAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBNYXA8U3RyaW5nLERvdWJsZT4+IF9pdGVyMjMyIDogc3RydWN0LmNvbXBsZXRlX21zX2F2Zy5lbnRyeVNldCgpKQorICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIE1hcDxTdHJpbmcsRG91YmxlPj4gX2l0ZXIyNTAgOiBzdHJ1Y3QuY29tcGxldGVfbXNfYXZnLmVudHJ5U2V0KCkpCiAgICAgICAgIHsKLSAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhfaXRlcjIzMi5nZXRLZXkoKSk7CisgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoX2l0ZXIyNTAuZ2V0S2V5KCkpOwogICAgICAgICAgIHsKLSAgICAgICAgICAgIG9wcm90LndyaXRlSTMyKF9pdGVyMjMyLmdldFZhbHVlKCkuc2l6ZSgpKTsKLSAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgRG91YmxlPiBfaXRlcjIzMyA6IF9pdGVyMjMyLmdldFZhbHVlKCkuZW50cnlTZXQoKSkKKyAgICAgICAgICAgIG9wcm90LndyaXRlSTMyKF9pdGVyMjUwLmdldFZhbHVlKCkuc2l6ZSgpKTsKKyAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgRG91YmxlPiBfaXRlcjI1MSA6IF9pdGVyMjUwLmdldFZhbHVlKCkuZW50cnlTZXQoKSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoX2l0ZXIyMzMuZ2V0S2V5KCkpOwotICAgICAgICAgICAgICBvcHJvdC53cml0ZURvdWJsZShfaXRlcjIzMy5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoX2l0ZXIyNTEuZ2V0S2V5KCkpOworICAgICAgICAgICAgICBvcHJvdC53cml0ZURvdWJsZShfaXRlcjI1MS5nZXRWYWx1ZSgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTgzOSw3NCArODM5LDc0IEBACiAgICAgcHVibGljIHZvaWQgcmVhZChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgcHJvdCwgU3BvdXRTdGF0cyBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKICAgICAgIFRUdXBsZVByb3RvY29sIGlwcm90ID0gKFRUdXBsZVByb3RvY29sKSBwcm90OwogICAgICAgewotICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwIF9tYXAyMzQgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLk1BUCwgaXByb3QucmVhZEkzMigpKTsKLSAgICAgICAgc3RydWN0LmFja2VkID0gbmV3IEhhc2hNYXA8U3RyaW5nLE1hcDxTdHJpbmcsTG9uZz4+KDIqX21hcDIzNC5zaXplKTsKLSAgICAgICAgU3RyaW5nIF9rZXkyMzU7Ci0gICAgICAgIE1hcDxTdHJpbmcsTG9uZz4gX3ZhbDIzNjsKLSAgICAgICAgZm9yIChpbnQgX2kyMzcgPSAwOyBfaTIzNyA8IF9tYXAyMzQuc2l6ZTsgKytfaTIzNykKKyAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwMjUyID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5NQVAsIGlwcm90LnJlYWRJMzIoKSk7CisgICAgICAgIHN0cnVjdC5hY2tlZCA9IG5ldyBIYXNoTWFwPFN0cmluZyxNYXA8U3RyaW5nLExvbmc+PigyKl9tYXAyNTIuc2l6ZSk7CisgICAgICAgIFN0cmluZyBfa2V5MjUzOworICAgICAgICBNYXA8U3RyaW5nLExvbmc+IF92YWwyNTQ7CisgICAgICAgIGZvciAoaW50IF9pMjU1ID0gMDsgX2kyNTUgPCBfbWFwMjUyLnNpemU7ICsrX2kyNTUpCiAgICAgICAgIHsKLSAgICAgICAgICBfa2V5MjM1ID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICAgIF9rZXkyNTMgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CiAgICAgICAgICAgewotICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwMjM4ID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JNjQsIGlwcm90LnJlYWRJMzIoKSk7Ci0gICAgICAgICAgICBfdmFsMjM2ID0gbmV3IEhhc2hNYXA8U3RyaW5nLExvbmc+KDIqX21hcDIzOC5zaXplKTsKLSAgICAgICAgICAgIFN0cmluZyBfa2V5MjM5OwotICAgICAgICAgICAgbG9uZyBfdmFsMjQwOwotICAgICAgICAgICAgZm9yIChpbnQgX2kyNDEgPSAwOyBfaTI0MSA8IF9tYXAyMzguc2l6ZTsgKytfaTI0MSkKKyAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgX21hcDI1NiA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORywgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTY0LCBpcHJvdC5yZWFkSTMyKCkpOworICAgICAgICAgICAgX3ZhbDI1NCA9IG5ldyBIYXNoTWFwPFN0cmluZyxMb25nPigyKl9tYXAyNTYuc2l6ZSk7CisgICAgICAgICAgICBTdHJpbmcgX2tleTI1NzsKKyAgICAgICAgICAgIGxvbmcgX3ZhbDI1ODsKKyAgICAgICAgICAgIGZvciAoaW50IF9pMjU5ID0gMDsgX2kyNTkgPCBfbWFwMjU2LnNpemU7ICsrX2kyNTkpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIF9rZXkyMzkgPSBpcHJvdC5yZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgICAgIF92YWwyNDAgPSBpcHJvdC5yZWFkSTY0KCk7Ci0gICAgICAgICAgICAgIF92YWwyMzYucHV0KF9rZXkyMzksIF92YWwyNDApOworICAgICAgICAgICAgICBfa2V5MjU3ID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICAgICAgICBfdmFsMjU4ID0gaXByb3QucmVhZEk2NCgpOworICAgICAgICAgICAgICBfdmFsMjU0LnB1dChfa2V5MjU3LCBfdmFsMjU4KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICB9Ci0gICAgICAgICAgc3RydWN0LmFja2VkLnB1dChfa2V5MjM1LCBfdmFsMjM2KTsKKyAgICAgICAgICBzdHJ1Y3QuYWNrZWQucHV0KF9rZXkyNTMsIF92YWwyNTQpOwogICAgICAgICB9CiAgICAgICB9CiAgICAgICBzdHJ1Y3Quc2V0X2Fja2VkX2lzU2V0KHRydWUpOwogICAgICAgewotICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwIF9tYXAyNDIgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLk1BUCwgaXByb3QucmVhZEkzMigpKTsKLSAgICAgICAgc3RydWN0LmZhaWxlZCA9IG5ldyBIYXNoTWFwPFN0cmluZyxNYXA8U3RyaW5nLExvbmc+PigyKl9tYXAyNDIuc2l6ZSk7Ci0gICAgICAgIFN0cmluZyBfa2V5MjQzOwotICAgICAgICBNYXA8U3RyaW5nLExvbmc+IF92YWwyNDQ7Ci0gICAgICAgIGZvciAoaW50IF9pMjQ1ID0gMDsgX2kyNDUgPCBfbWFwMjQyLnNpemU7ICsrX2kyNDUpCisgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgX21hcDI2MCA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORywgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTUFQLCBpcHJvdC5yZWFkSTMyKCkpOworICAgICAgICBzdHJ1Y3QuZmFpbGVkID0gbmV3IEhhc2hNYXA8U3RyaW5nLE1hcDxTdHJpbmcsTG9uZz4+KDIqX21hcDI2MC5zaXplKTsKKyAgICAgICAgU3RyaW5nIF9rZXkyNjE7CisgICAgICAgIE1hcDxTdHJpbmcsTG9uZz4gX3ZhbDI2MjsKKyAgICAgICAgZm9yIChpbnQgX2kyNjMgPSAwOyBfaTI2MyA8IF9tYXAyNjAuc2l6ZTsgKytfaTI2MykKICAgICAgICAgewotICAgICAgICAgIF9rZXkyNDMgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgX2tleTI2MSA9IGlwcm90LnJlYWRTdHJpbmcoKTsKICAgICAgICAgICB7Ci0gICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwIF9tYXAyNDYgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkk2NCwgaXByb3QucmVhZEkzMigpKTsKLSAgICAgICAgICAgIF92YWwyNDQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsTG9uZz4oMipfbWFwMjQ2LnNpemUpOwotICAgICAgICAgICAgU3RyaW5nIF9rZXkyNDc7Ci0gICAgICAgICAgICBsb25nIF92YWwyNDg7Ci0gICAgICAgICAgICBmb3IgKGludCBfaTI0OSA9IDA7IF9pMjQ5IDwgX21hcDI0Ni5zaXplOyArK19pMjQ5KQorICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwMjY0ID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JNjQsIGlwcm90LnJlYWRJMzIoKSk7CisgICAgICAgICAgICBfdmFsMjYyID0gbmV3IEhhc2hNYXA8U3RyaW5nLExvbmc+KDIqX21hcDI2NC5zaXplKTsKKyAgICAgICAgICAgIFN0cmluZyBfa2V5MjY1OworICAgICAgICAgICAgbG9uZyBfdmFsMjY2OworICAgICAgICAgICAgZm9yIChpbnQgX2kyNjcgPSAwOyBfaTI2NyA8IF9tYXAyNjQuc2l6ZTsgKytfaTI2NykKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgX2tleTI0NyA9IGlwcm90LnJlYWRTdHJpbmcoKTsKLSAgICAgICAgICAgICAgX3ZhbDI0OCA9IGlwcm90LnJlYWRJNjQoKTsKLSAgICAgICAgICAgICAgX3ZhbDI0NC5wdXQoX2tleTI0NywgX3ZhbDI0OCk7CisgICAgICAgICAgICAgIF9rZXkyNjUgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICAgIF92YWwyNjYgPSBpcHJvdC5yZWFkSTY0KCk7CisgICAgICAgICAgICAgIF92YWwyNjIucHV0KF9rZXkyNjUsIF92YWwyNjYpOwogICAgICAgICAgICAgfQogICAgICAgICAgIH0KLSAgICAgICAgICBzdHJ1Y3QuZmFpbGVkLnB1dChfa2V5MjQzLCBfdmFsMjQ0KTsKKyAgICAgICAgICBzdHJ1Y3QuZmFpbGVkLnB1dChfa2V5MjYxLCBfdmFsMjYyKTsKICAgICAgICAgfQogICAgICAgfQogICAgICAgc3RydWN0LnNldF9mYWlsZWRfaXNTZXQodHJ1ZSk7CiAgICAgICB7Ci0gICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgX21hcDI1MCA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORywgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTUFQLCBpcHJvdC5yZWFkSTMyKCkpOwotICAgICAgICBzdHJ1Y3QuY29tcGxldGVfbXNfYXZnID0gbmV3IEhhc2hNYXA8U3RyaW5nLE1hcDxTdHJpbmcsRG91YmxlPj4oMipfbWFwMjUwLnNpemUpOwotICAgICAgICBTdHJpbmcgX2tleTI1MTsKLSAgICAgICAgTWFwPFN0cmluZyxEb3VibGU+IF92YWwyNTI7Ci0gICAgICAgIGZvciAoaW50IF9pMjUzID0gMDsgX2kyNTMgPCBfbWFwMjUwLnNpemU7ICsrX2kyNTMpCisgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgX21hcDI2OCA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORywgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTUFQLCBpcHJvdC5yZWFkSTMyKCkpOworICAgICAgICBzdHJ1Y3QuY29tcGxldGVfbXNfYXZnID0gbmV3IEhhc2hNYXA8U3RyaW5nLE1hcDxTdHJpbmcsRG91YmxlPj4oMipfbWFwMjY4LnNpemUpOworICAgICAgICBTdHJpbmcgX2tleTI2OTsKKyAgICAgICAgTWFwPFN0cmluZyxEb3VibGU+IF92YWwyNzA7CisgICAgICAgIGZvciAoaW50IF9pMjcxID0gMDsgX2kyNzEgPCBfbWFwMjY4LnNpemU7ICsrX2kyNzEpCiAgICAgICAgIHsKLSAgICAgICAgICBfa2V5MjUxID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICAgIF9rZXkyNjkgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CiAgICAgICAgICAgewotICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwMjU0ID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5ET1VCTEUsIGlwcm90LnJlYWRJMzIoKSk7Ci0gICAgICAgICAgICBfdmFsMjUyID0gbmV3IEhhc2hNYXA8U3RyaW5nLERvdWJsZT4oMipfbWFwMjU0LnNpemUpOwotICAgICAgICAgICAgU3RyaW5nIF9rZXkyNTU7Ci0gICAgICAgICAgICBkb3VibGUgX3ZhbDI1NjsKLSAgICAgICAgICAgIGZvciAoaW50IF9pMjU3ID0gMDsgX2kyNTcgPCBfbWFwMjU0LnNpemU7ICsrX2kyNTcpCisgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwIF9tYXAyNzIgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkRPVUJMRSwgaXByb3QucmVhZEkzMigpKTsKKyAgICAgICAgICAgIF92YWwyNzAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsRG91YmxlPigyKl9tYXAyNzIuc2l6ZSk7CisgICAgICAgICAgICBTdHJpbmcgX2tleTI3MzsKKyAgICAgICAgICAgIGRvdWJsZSBfdmFsMjc0OworICAgICAgICAgICAgZm9yIChpbnQgX2kyNzUgPSAwOyBfaTI3NSA8IF9tYXAyNzIuc2l6ZTsgKytfaTI3NSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgX2tleTI1NSA9IGlwcm90LnJlYWRTdHJpbmcoKTsKLSAgICAgICAgICAgICAgX3ZhbDI1NiA9IGlwcm90LnJlYWREb3VibGUoKTsKLSAgICAgICAgICAgICAgX3ZhbDI1Mi5wdXQoX2tleTI1NSwgX3ZhbDI1Nik7CisgICAgICAgICAgICAgIF9rZXkyNzMgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICAgIF92YWwyNzQgPSBpcHJvdC5yZWFkRG91YmxlKCk7CisgICAgICAgICAgICAgIF92YWwyNzAucHV0KF9rZXkyNzMsIF92YWwyNzQpOwogICAgICAgICAgICAgfQogICAgICAgICAgIH0KLSAgICAgICAgICBzdHJ1Y3QuY29tcGxldGVfbXNfYXZnLnB1dChfa2V5MjUxLCBfdmFsMjUyKTsKKyAgICAgICAgICBzdHJ1Y3QuY29tcGxldGVfbXNfYXZnLnB1dChfa2V5MjY5LCBfdmFsMjcwKTsKICAgICAgICAgfQogICAgICAgfQogICAgICAgc3RydWN0LnNldF9jb21wbGV0ZV9tc19hdmdfaXNTZXQodHJ1ZSk7CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL1N0YXRlU3BvdXRTcGVjLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL1N0YXRlU3BvdXRTcGVjLmphdmEKaW5kZXggMTVkMzRhZS4uMjRiM2U1YyAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9TdGF0ZVNwb3V0U3BlYy5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvU3RhdGVTcG91dFNwZWMuamF2YQpAQCAtMTYsNyArMTYsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIC8qKgotICogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4yKQorICogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4zKQogICoKICAqIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkcKICAqICBAZ2VuZXJhdGVkCkBAIC01MSw3ICs1MSw3IEBACiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKIEBTdXBwcmVzc1dhcm5pbmdzKHsiY2FzdCIsICJyYXd0eXBlcyIsICJzZXJpYWwiLCAidW5jaGVja2VkIn0pCi1AR2VuZXJhdGVkKHZhbHVlID0gIkF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMikiLCBkYXRlID0gIjIwMTUtMi02IikKK0BHZW5lcmF0ZWQodmFsdWUgPSAiQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4zKSIpCiBwdWJsaWMgY2xhc3MgU3RhdGVTcG91dFNwZWMgaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZTxTdGF0ZVNwb3V0U3BlYywgU3RhdGVTcG91dFNwZWMuX0ZpZWxkcz4sIGphdmEuaW8uU2VyaWFsaXphYmxlLCBDbG9uZWFibGUsIENvbXBhcmFibGU8U3RhdGVTcG91dFNwZWM+IHsKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdCBTVFJVQ1RfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0KCJTdGF0ZVNwb3V0U3BlYyIpOwogCmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL1N0b3JtQmFzZS5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9TdG9ybUJhc2UuamF2YQppbmRleCAyNTBjYzljLi41ZjgwYzU5IDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL1N0b3JtQmFzZS5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvU3Rvcm1CYXNlLmphdmEKQEAgLTE2LDcgKzE2LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAvKioKLSAqIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMikKKyAqIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMykKICAqCiAgKiBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HCiAgKiAgQGdlbmVyYXRlZApAQCAtNTEsNyArNTEsNyBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCiBAU3VwcHJlc3NXYXJuaW5ncyh7ImNhc3QiLCAicmF3dHlwZXMiLCAic2VyaWFsIiwgInVuY2hlY2tlZCJ9KQotQEdlbmVyYXRlZCh2YWx1ZSA9ICJBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjIpIiwgZGF0ZSA9ICIyMDE1LTktMyIpCitAR2VuZXJhdGVkKHZhbHVlID0gIkF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMykiKQogcHVibGljIGNsYXNzIFN0b3JtQmFzZSBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlPFN0b3JtQmFzZSwgU3Rvcm1CYXNlLl9GaWVsZHM+LCBqYXZhLmlvLlNlcmlhbGl6YWJsZSwgQ2xvbmVhYmxlLCBDb21wYXJhYmxlPFN0b3JtQmFzZT4gewogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0IFNUUlVDVF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QoIlN0b3JtQmFzZSIpOwogCkBAIC02MTEsMTMgKzYxMSwxMyBAQAogICAgICAgcmV0dXJuIGdldF9zdGF0dXMoKTsKIAogICAgIGNhc2UgTlVNX1dPUktFUlM6Ci0gICAgICByZXR1cm4gSW50ZWdlci52YWx1ZU9mKGdldF9udW1fd29ya2VycygpKTsKKyAgICAgIHJldHVybiBnZXRfbnVtX3dvcmtlcnMoKTsKIAogICAgIGNhc2UgQ09NUE9ORU5UX0VYRUNVVE9SUzoKICAgICAgIHJldHVybiBnZXRfY29tcG9uZW50X2V4ZWN1dG9ycygpOwogCiAgICAgY2FzZSBMQVVOQ0hfVElNRV9TRUNTOgotICAgICAgcmV0dXJuIEludGVnZXIudmFsdWVPZihnZXRfbGF1bmNoX3RpbWVfc2VjcygpKTsKKyAgICAgIHJldHVybiBnZXRfbGF1bmNoX3RpbWVfc2VjcygpOwogCiAgICAgY2FzZSBPV05FUjoKICAgICAgIHJldHVybiBnZXRfb3duZXIoKTsKQEAgLTEwOTAsMTUgKzEwOTAsMTUgQEAKICAgICAgICAgICBjYXNlIDQ6IC8vIENPTVBPTkVOVF9FWEVDVVRPUlMKICAgICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLk1BUCkgewogICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwNDM0ID0gaXByb3QucmVhZE1hcEJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgc3RydWN0LmNvbXBvbmVudF9leGVjdXRvcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsSW50ZWdlcj4oMipfbWFwNDM0LnNpemUpOwotICAgICAgICAgICAgICAgIFN0cmluZyBfa2V5NDM1OwotICAgICAgICAgICAgICAgIGludCBfdmFsNDM2OwotICAgICAgICAgICAgICAgIGZvciAoaW50IF9pNDM3ID0gMDsgX2k0MzcgPCBfbWFwNDM0LnNpemU7ICsrX2k0MzcpCisgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwNTg4ID0gaXByb3QucmVhZE1hcEJlZ2luKCk7CisgICAgICAgICAgICAgICAgc3RydWN0LmNvbXBvbmVudF9leGVjdXRvcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsSW50ZWdlcj4oMipfbWFwNTg4LnNpemUpOworICAgICAgICAgICAgICAgIFN0cmluZyBfa2V5NTg5OworICAgICAgICAgICAgICAgIGludCBfdmFsNTkwOworICAgICAgICAgICAgICAgIGZvciAoaW50IF9pNTkxID0gMDsgX2k1OTEgPCBfbWFwNTg4LnNpemU7ICsrX2k1OTEpCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgX2tleTQzNSA9IGlwcm90LnJlYWRTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgIF92YWw0MzYgPSBpcHJvdC5yZWFkSTMyKCk7Ci0gICAgICAgICAgICAgICAgICBzdHJ1Y3QuY29tcG9uZW50X2V4ZWN1dG9ycy5wdXQoX2tleTQzNSwgX3ZhbDQzNik7CisgICAgICAgICAgICAgICAgICBfa2V5NTg5ID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICAgICAgICAgICAgX3ZhbDU5MCA9IGlwcm90LnJlYWRJMzIoKTsKKyAgICAgICAgICAgICAgICAgIHN0cnVjdC5jb21wb25lbnRfZXhlY3V0b3JzLnB1dChfa2V5NTg5LCBfdmFsNTkwKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaXByb3QucmVhZE1hcEVuZCgpOwogICAgICAgICAgICAgICB9CkBAIC0xMTQzLDE2ICsxMTQzLDE2IEBACiAgICAgICAgICAgY2FzZSA5OiAvLyBDT01QT05FTlRfREVCVUcKICAgICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLk1BUCkgewogICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwNDM4ID0gaXByb3QucmVhZE1hcEJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgc3RydWN0LmNvbXBvbmVudF9kZWJ1ZyA9IG5ldyBIYXNoTWFwPFN0cmluZyxEZWJ1Z09wdGlvbnM+KDIqX21hcDQzOC5zaXplKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgX2tleTQzOTsKLSAgICAgICAgICAgICAgICBEZWJ1Z09wdGlvbnMgX3ZhbDQ0MDsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBfaTQ0MSA9IDA7IF9pNDQxIDwgX21hcDQzOC5zaXplOyArK19pNDQxKQorICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgX21hcDU5MiA9IGlwcm90LnJlYWRNYXBCZWdpbigpOworICAgICAgICAgICAgICAgIHN0cnVjdC5jb21wb25lbnRfZGVidWcgPSBuZXcgSGFzaE1hcDxTdHJpbmcsRGVidWdPcHRpb25zPigyKl9tYXA1OTIuc2l6ZSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIF9rZXk1OTM7CisgICAgICAgICAgICAgICAgRGVidWdPcHRpb25zIF92YWw1OTQ7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgX2k1OTUgPSAwOyBfaTU5NSA8IF9tYXA1OTIuc2l6ZTsgKytfaTU5NSkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBfa2V5NDM5ID0gaXByb3QucmVhZFN0cmluZygpOwotICAgICAgICAgICAgICAgICAgX3ZhbDQ0MCA9IG5ldyBEZWJ1Z09wdGlvbnMoKTsKLSAgICAgICAgICAgICAgICAgIF92YWw0NDAucmVhZChpcHJvdCk7Ci0gICAgICAgICAgICAgICAgICBzdHJ1Y3QuY29tcG9uZW50X2RlYnVnLnB1dChfa2V5NDM5LCBfdmFsNDQwKTsKKyAgICAgICAgICAgICAgICAgIF9rZXk1OTMgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICBfdmFsNTk0ID0gbmV3IERlYnVnT3B0aW9ucygpOworICAgICAgICAgICAgICAgICAgX3ZhbDU5NC5yZWFkKGlwcm90KTsKKyAgICAgICAgICAgICAgICAgIHN0cnVjdC5jb21wb25lbnRfZGVidWcucHV0KF9rZXk1OTMsIF92YWw1OTQpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpcHJvdC5yZWFkTWFwRW5kKCk7CiAgICAgICAgICAgICAgIH0KQEAgLTExOTIsMTAgKzExOTIsMTAgQEAKICAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oQ09NUE9ORU5UX0VYRUNVVE9SU19GSUVMRF9ERVNDKTsKICAgICAgICAgICB7CiAgICAgICAgICAgICBvcHJvdC53cml0ZU1hcEJlZ2luKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORywgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTMyLCBzdHJ1Y3QuY29tcG9uZW50X2V4ZWN1dG9ycy5zaXplKCkpKTsKLSAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgSW50ZWdlcj4gX2l0ZXI0NDIgOiBzdHJ1Y3QuY29tcG9uZW50X2V4ZWN1dG9ycy5lbnRyeVNldCgpKQorICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBJbnRlZ2VyPiBfaXRlcjU5NiA6IHN0cnVjdC5jb21wb25lbnRfZXhlY3V0b3JzLmVudHJ5U2V0KCkpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKF9pdGVyNDQyLmdldEtleSgpKTsKLSAgICAgICAgICAgICAgb3Byb3Qud3JpdGVJMzIoX2l0ZXI0NDIuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKF9pdGVyNTk2LmdldEtleSgpKTsKKyAgICAgICAgICAgICAgb3Byb3Qud3JpdGVJMzIoX2l0ZXI1OTYuZ2V0VmFsdWUoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBvcHJvdC53cml0ZU1hcEVuZCgpOwogICAgICAgICAgIH0KQEAgLTEyMzMsMTAgKzEyMzMsMTAgQEAKICAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oQ09NUE9ORU5UX0RFQlVHX0ZJRUxEX0RFU0MpOwogICAgICAgICAgIHsKICAgICAgICAgICAgIG9wcm90LndyaXRlTWFwQmVnaW4obmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIHN0cnVjdC5jb21wb25lbnRfZGVidWcuc2l6ZSgpKSk7Ci0gICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIERlYnVnT3B0aW9ucz4gX2l0ZXI0NDMgOiBzdHJ1Y3QuY29tcG9uZW50X2RlYnVnLmVudHJ5U2V0KCkpCisgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIERlYnVnT3B0aW9ucz4gX2l0ZXI1OTcgOiBzdHJ1Y3QuY29tcG9uZW50X2RlYnVnLmVudHJ5U2V0KCkpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKF9pdGVyNDQzLmdldEtleSgpKTsKLSAgICAgICAgICAgICAgX2l0ZXI0NDMuZ2V0VmFsdWUoKS53cml0ZShvcHJvdCk7CisgICAgICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKF9pdGVyNTk3LmdldEtleSgpKTsKKyAgICAgICAgICAgICAgX2l0ZXI1OTcuZ2V0VmFsdWUoKS53cml0ZShvcHJvdCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBvcHJvdC53cml0ZU1hcEVuZCgpOwogICAgICAgICAgIH0KQEAgLTEyODYsMTAgKzEyODYsMTAgQEAKICAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X2NvbXBvbmVudF9leGVjdXRvcnMoKSkgewogICAgICAgICB7CiAgICAgICAgICAgb3Byb3Qud3JpdGVJMzIoc3RydWN0LmNvbXBvbmVudF9leGVjdXRvcnMuc2l6ZSgpKTsKLSAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIEludGVnZXI+IF9pdGVyNDQ0IDogc3RydWN0LmNvbXBvbmVudF9leGVjdXRvcnMuZW50cnlTZXQoKSkKKyAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIEludGVnZXI+IF9pdGVyNTk4IDogc3RydWN0LmNvbXBvbmVudF9leGVjdXRvcnMuZW50cnlTZXQoKSkKICAgICAgICAgICB7Ci0gICAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhfaXRlcjQ0NC5nZXRLZXkoKSk7Ci0gICAgICAgICAgICBvcHJvdC53cml0ZUkzMihfaXRlcjQ0NC5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKF9pdGVyNTk4LmdldEtleSgpKTsKKyAgICAgICAgICAgIG9wcm90LndyaXRlSTMyKF9pdGVyNTk4LmdldFZhbHVlKCkpOwogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgfQpAQCAtMTMwOCwxMCArMTMwOCwxMCBAQAogICAgICAgaWYgKHN0cnVjdC5pc19zZXRfY29tcG9uZW50X2RlYnVnKCkpIHsKICAgICAgICAgewogICAgICAgICAgIG9wcm90LndyaXRlSTMyKHN0cnVjdC5jb21wb25lbnRfZGVidWcuc2l6ZSgpKTsKLSAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIERlYnVnT3B0aW9ucz4gX2l0ZXI0NDUgOiBzdHJ1Y3QuY29tcG9uZW50X2RlYnVnLmVudHJ5U2V0KCkpCisgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBEZWJ1Z09wdGlvbnM+IF9pdGVyNTk5IDogc3RydWN0LmNvbXBvbmVudF9kZWJ1Zy5lbnRyeVNldCgpKQogICAgICAgICAgIHsKLSAgICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKF9pdGVyNDQ1LmdldEtleSgpKTsKLSAgICAgICAgICAgIF9pdGVyNDQ1LmdldFZhbHVlKCkud3JpdGUob3Byb3QpOworICAgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoX2l0ZXI1OTkuZ2V0S2V5KCkpOworICAgICAgICAgICAgX2l0ZXI1OTkuZ2V0VmFsdWUoKS53cml0ZShvcHJvdCk7CiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICB9CkBAIC0xMzI5LDE1ICsxMzI5LDE1IEBACiAgICAgICBCaXRTZXQgaW5jb21pbmcgPSBpcHJvdC5yZWFkQml0U2V0KDYpOwogICAgICAgaWYgKGluY29taW5nLmdldCgwKSkgewogICAgICAgICB7Ci0gICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwNDQ2ID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JMzIsIGlwcm90LnJlYWRJMzIoKSk7Ci0gICAgICAgICAgc3RydWN0LmNvbXBvbmVudF9leGVjdXRvcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsSW50ZWdlcj4oMipfbWFwNDQ2LnNpemUpOwotICAgICAgICAgIFN0cmluZyBfa2V5NDQ3OwotICAgICAgICAgIGludCBfdmFsNDQ4OwotICAgICAgICAgIGZvciAoaW50IF9pNDQ5ID0gMDsgX2k0NDkgPCBfbWFwNDQ2LnNpemU7ICsrX2k0NDkpCisgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwNjAwID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JMzIsIGlwcm90LnJlYWRJMzIoKSk7CisgICAgICAgICAgc3RydWN0LmNvbXBvbmVudF9leGVjdXRvcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsSW50ZWdlcj4oMipfbWFwNjAwLnNpemUpOworICAgICAgICAgIFN0cmluZyBfa2V5NjAxOworICAgICAgICAgIGludCBfdmFsNjAyOworICAgICAgICAgIGZvciAoaW50IF9pNjAzID0gMDsgX2k2MDMgPCBfbWFwNjAwLnNpemU7ICsrX2k2MDMpCiAgICAgICAgICAgewotICAgICAgICAgICAgX2tleTQ0NyA9IGlwcm90LnJlYWRTdHJpbmcoKTsKLSAgICAgICAgICAgIF92YWw0NDggPSBpcHJvdC5yZWFkSTMyKCk7Ci0gICAgICAgICAgICBzdHJ1Y3QuY29tcG9uZW50X2V4ZWN1dG9ycy5wdXQoX2tleTQ0NywgX3ZhbDQ0OCk7CisgICAgICAgICAgICBfa2V5NjAxID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICAgICAgX3ZhbDYwMiA9IGlwcm90LnJlYWRJMzIoKTsKKyAgICAgICAgICAgIHN0cnVjdC5jb21wb25lbnRfZXhlY3V0b3JzLnB1dChfa2V5NjAxLCBfdmFsNjAyKTsKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgc3RydWN0LnNldF9jb21wb25lbnRfZXhlY3V0b3JzX2lzU2V0KHRydWUpOwpAQCAtMTM2MSwxNiArMTM2MSwxNiBAQAogICAgICAgfQogICAgICAgaWYgKGluY29taW5nLmdldCg1KSkgewogICAgICAgICB7Ci0gICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwNDUwID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIGlwcm90LnJlYWRJMzIoKSk7Ci0gICAgICAgICAgc3RydWN0LmNvbXBvbmVudF9kZWJ1ZyA9IG5ldyBIYXNoTWFwPFN0cmluZyxEZWJ1Z09wdGlvbnM+KDIqX21hcDQ1MC5zaXplKTsKLSAgICAgICAgICBTdHJpbmcgX2tleTQ1MTsKLSAgICAgICAgICBEZWJ1Z09wdGlvbnMgX3ZhbDQ1MjsKLSAgICAgICAgICBmb3IgKGludCBfaTQ1MyA9IDA7IF9pNDUzIDwgX21hcDQ1MC5zaXplOyArK19pNDUzKQorICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgX21hcDYwNCA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORywgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNULCBpcHJvdC5yZWFkSTMyKCkpOworICAgICAgICAgIHN0cnVjdC5jb21wb25lbnRfZGVidWcgPSBuZXcgSGFzaE1hcDxTdHJpbmcsRGVidWdPcHRpb25zPigyKl9tYXA2MDQuc2l6ZSk7CisgICAgICAgICAgU3RyaW5nIF9rZXk2MDU7CisgICAgICAgICAgRGVidWdPcHRpb25zIF92YWw2MDY7CisgICAgICAgICAgZm9yIChpbnQgX2k2MDcgPSAwOyBfaTYwNyA8IF9tYXA2MDQuc2l6ZTsgKytfaTYwNykKICAgICAgICAgICB7Ci0gICAgICAgICAgICBfa2V5NDUxID0gaXByb3QucmVhZFN0cmluZygpOwotICAgICAgICAgICAgX3ZhbDQ1MiA9IG5ldyBEZWJ1Z09wdGlvbnMoKTsKLSAgICAgICAgICAgIF92YWw0NTIucmVhZChpcHJvdCk7Ci0gICAgICAgICAgICBzdHJ1Y3QuY29tcG9uZW50X2RlYnVnLnB1dChfa2V5NDUxLCBfdmFsNDUyKTsKKyAgICAgICAgICAgIF9rZXk2MDUgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICBfdmFsNjA2ID0gbmV3IERlYnVnT3B0aW9ucygpOworICAgICAgICAgICAgX3ZhbDYwNi5yZWFkKGlwcm90KTsKKyAgICAgICAgICAgIHN0cnVjdC5jb21wb25lbnRfZGVidWcucHV0KF9rZXk2MDUsIF92YWw2MDYpOwogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBzdHJ1Y3Quc2V0X2NvbXBvbmVudF9kZWJ1Z19pc1NldCh0cnVlKTsKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvU3Rvcm1Ub3BvbG9neS5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9TdG9ybVRvcG9sb2d5LmphdmEKaW5kZXggZDAyMmU5NS4uMzUyZDEyZCAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9TdG9ybVRvcG9sb2d5LmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9TdG9ybVRvcG9sb2d5LmphdmEKQEAgLTE2LDcgKzE2LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAvKioKLSAqIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMikKKyAqIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMykKICAqCiAgKiBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HCiAgKiAgQGdlbmVyYXRlZApAQCAtNTEsMTMgKzUxLDE0IEBACiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKIEBTdXBwcmVzc1dhcm5pbmdzKHsiY2FzdCIsICJyYXd0eXBlcyIsICJzZXJpYWwiLCAidW5jaGVja2VkIn0pCi1AR2VuZXJhdGVkKHZhbHVlID0gIkF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMikiLCBkYXRlID0gIjIwMTUtMi02IikKK0BHZW5lcmF0ZWQodmFsdWUgPSAiQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4zKSIpCiBwdWJsaWMgY2xhc3MgU3Rvcm1Ub3BvbG9neSBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlPFN0b3JtVG9wb2xvZ3ksIFN0b3JtVG9wb2xvZ3kuX0ZpZWxkcz4sIGphdmEuaW8uU2VyaWFsaXphYmxlLCBDbG9uZWFibGUsIENvbXBhcmFibGU8U3Rvcm1Ub3BvbG9neT4gewogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0IFNUUlVDVF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QoIlN0b3JtVG9wb2xvZ3kiKTsKIAogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgU1BPVVRTX0ZJRUxEX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkKCJzcG91dHMiLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5NQVAsIChzaG9ydCkxKTsKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIEJPTFRTX0ZJRUxEX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkKCJib2x0cyIsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLk1BUCwgKHNob3J0KTIpOwogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgU1RBVEVfU1BPVVRTX0ZJRUxEX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkKCJzdGF0ZV9zcG91dHMiLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5NQVAsIChzaG9ydCkzKTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIFdPUktFUl9IT09LU19GSUVMRF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCgid29ya2VyX2hvb2tzIiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTElTVCwgKHNob3J0KTQpOwogCiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxDbGFzczw/IGV4dGVuZHMgSVNjaGVtZT4sIFNjaGVtZUZhY3Rvcnk+IHNjaGVtZXMgPSBuZXcgSGFzaE1hcDxDbGFzczw/IGV4dGVuZHMgSVNjaGVtZT4sIFNjaGVtZUZhY3Rvcnk+KCk7CiAgIHN0YXRpYyB7CkBAIC02OCwxMiArNjksMTQgQEAKICAgcHJpdmF0ZSBNYXA8U3RyaW5nLFNwb3V0U3BlYz4gc3BvdXRzOyAvLyByZXF1aXJlZAogICBwcml2YXRlIE1hcDxTdHJpbmcsQm9sdD4gYm9sdHM7IC8vIHJlcXVpcmVkCiAgIHByaXZhdGUgTWFwPFN0cmluZyxTdGF0ZVNwb3V0U3BlYz4gc3RhdGVfc3BvdXRzOyAvLyByZXF1aXJlZAorICBwcml2YXRlIExpc3Q8Qnl0ZUJ1ZmZlcj4gd29ya2VyX2hvb2tzOyAvLyBvcHRpb25hbAogCiAgIC8qKiBUaGUgc2V0IG9mIGZpZWxkcyB0aGlzIHN0cnVjdCBjb250YWlucywgYWxvbmcgd2l0aCBjb252ZW5pZW5jZSBtZXRob2RzIGZvciBmaW5kaW5nIGFuZCBtYW5pcHVsYXRpbmcgdGhlbS4gKi8KICAgcHVibGljIGVudW0gX0ZpZWxkcyBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZElkRW51bSB7CiAgICAgU1BPVVRTKChzaG9ydCkxLCAic3BvdXRzIiksCiAgICAgQk9MVFMoKHNob3J0KTIsICJib2x0cyIpLAotICAgIFNUQVRFX1NQT1VUUygoc2hvcnQpMywgInN0YXRlX3Nwb3V0cyIpOworICAgIFNUQVRFX1NQT1VUUygoc2hvcnQpMywgInN0YXRlX3Nwb3V0cyIpLAorICAgIFdPUktFUl9IT09LUygoc2hvcnQpNCwgIndvcmtlcl9ob29rcyIpOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgX0ZpZWxkcz4gYnlOYW1lID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBfRmllbGRzPigpOwogCkBAIC05NCw2ICs5Nyw4IEBACiAgICAgICAgICAgcmV0dXJuIEJPTFRTOwogICAgICAgICBjYXNlIDM6IC8vIFNUQVRFX1NQT1VUUwogICAgICAgICAgIHJldHVybiBTVEFURV9TUE9VVFM7CisgICAgICAgIGNhc2UgNDogLy8gV09SS0VSX0hPT0tTCisgICAgICAgICAgcmV0dXJuIFdPUktFUl9IT09LUzsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgIH0KQEAgLTEzNCw2ICsxMzksNyBAQAogICB9CiAKICAgLy8gaXNzZXQgaWQgYXNzaWdubWVudHMKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgX0ZpZWxkcyBvcHRpb25hbHNbXSA9IHtfRmllbGRzLldPUktFUl9IT09LU307CiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPiBtZXRhRGF0YU1hcDsKICAgc3RhdGljIHsKICAgICBNYXA8X0ZpZWxkcywgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGE+IHRtcE1hcCA9IG5ldyBFbnVtTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPihfRmllbGRzLmNsYXNzKTsKQEAgLTE0OSw2ICsxNTUsOSBAQAogICAgICAgICBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLk1hcE1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLk1BUCwgCiAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkVmFsdWVNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcpLCAKICAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuU3RydWN0TWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNULCBTdGF0ZVNwb3V0U3BlYy5jbGFzcykpKSk7CisgICAgdG1wTWFwLnB1dChfRmllbGRzLldPUktFUl9IT09LUywgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhKCJ3b3JrZXJfaG9va3MiLCBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRSZXF1aXJlbWVudFR5cGUuT1BUSU9OQUwsIAorICAgICAgICBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkxpc3RNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5MSVNULCAKKyAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRWYWx1ZU1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORyAgICAgICAgICAgICwgdHJ1ZSkpKSk7CiAgICAgbWV0YURhdGFNYXAgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAodG1wTWFwKTsKICAgICBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YS5hZGRTdHJ1Y3RNZXRhRGF0YU1hcChTdG9ybVRvcG9sb2d5LmNsYXNzLCBtZXRhRGF0YU1hcCk7CiAgIH0KQEAgLTIxNiw2ICsyMjUsMTAgQEAKICAgICAgIH0KICAgICAgIHRoaXMuc3RhdGVfc3BvdXRzID0gX190aGlzX19zdGF0ZV9zcG91dHM7CiAgICAgfQorICAgIGlmIChvdGhlci5pc19zZXRfd29ya2VyX2hvb2tzKCkpIHsKKyAgICAgIExpc3Q8Qnl0ZUJ1ZmZlcj4gX190aGlzX193b3JrZXJfaG9va3MgPSBuZXcgQXJyYXlMaXN0PEJ5dGVCdWZmZXI+KG90aGVyLndvcmtlcl9ob29rcyk7CisgICAgICB0aGlzLndvcmtlcl9ob29rcyA9IF9fdGhpc19fd29ya2VyX2hvb2tzOworICAgIH0KICAgfQogCiAgIHB1YmxpYyBTdG9ybVRvcG9sb2d5IGRlZXBDb3B5KCkgewpAQCAtMjI3LDYgKzI0MCw3IEBACiAgICAgdGhpcy5zcG91dHMgPSBudWxsOwogICAgIHRoaXMuYm9sdHMgPSBudWxsOwogICAgIHRoaXMuc3RhdGVfc3BvdXRzID0gbnVsbDsKKyAgICB0aGlzLndvcmtlcl9ob29rcyA9IG51bGw7CiAgIH0KIAogICBwdWJsaWMgaW50IGdldF9zcG91dHNfc2l6ZSgpIHsKQEAgLTMzMSw2ICszNDUsNDQgQEAKICAgICB9CiAgIH0KIAorICBwdWJsaWMgaW50IGdldF93b3JrZXJfaG9va3Nfc2l6ZSgpIHsKKyAgICByZXR1cm4gKHRoaXMud29ya2VyX2hvb2tzID09IG51bGwpID8gMCA6IHRoaXMud29ya2VyX2hvb2tzLnNpemUoKTsKKyAgfQorCisgIHB1YmxpYyBqYXZhLnV0aWwuSXRlcmF0b3I8Qnl0ZUJ1ZmZlcj4gZ2V0X3dvcmtlcl9ob29rc19pdGVyYXRvcigpIHsKKyAgICByZXR1cm4gKHRoaXMud29ya2VyX2hvb2tzID09IG51bGwpID8gbnVsbCA6IHRoaXMud29ya2VyX2hvb2tzLml0ZXJhdG9yKCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBhZGRfdG9fd29ya2VyX2hvb2tzKEJ5dGVCdWZmZXIgZWxlbSkgeworICAgIGlmICh0aGlzLndvcmtlcl9ob29rcyA9PSBudWxsKSB7CisgICAgICB0aGlzLndvcmtlcl9ob29rcyA9IG5ldyBBcnJheUxpc3Q8Qnl0ZUJ1ZmZlcj4oKTsKKyAgICB9CisgICAgdGhpcy53b3JrZXJfaG9va3MuYWRkKGVsZW0pOworICB9CisKKyAgcHVibGljIExpc3Q8Qnl0ZUJ1ZmZlcj4gZ2V0X3dvcmtlcl9ob29rcygpIHsKKyAgICByZXR1cm4gdGhpcy53b3JrZXJfaG9va3M7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfd29ya2VyX2hvb2tzKExpc3Q8Qnl0ZUJ1ZmZlcj4gd29ya2VyX2hvb2tzKSB7CisgICAgdGhpcy53b3JrZXJfaG9va3MgPSB3b3JrZXJfaG9va3M7CisgIH0KKworICBwdWJsaWMgdm9pZCB1bnNldF93b3JrZXJfaG9va3MoKSB7CisgICAgdGhpcy53b3JrZXJfaG9va3MgPSBudWxsOworICB9CisKKyAgLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCB3b3JrZXJfaG9va3MgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgIHB1YmxpYyBib29sZWFuIGlzX3NldF93b3JrZXJfaG9va3MoKSB7CisgICAgcmV0dXJuIHRoaXMud29ya2VyX2hvb2tzICE9IG51bGw7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfd29ya2VyX2hvb2tzX2lzU2V0KGJvb2xlYW4gdmFsdWUpIHsKKyAgICBpZiAoIXZhbHVlKSB7CisgICAgICB0aGlzLndvcmtlcl9ob29rcyA9IG51bGw7CisgICAgfQorICB9CisKICAgcHVibGljIHZvaWQgc2V0RmllbGRWYWx1ZShfRmllbGRzIGZpZWxkLCBPYmplY3QgdmFsdWUpIHsKICAgICBzd2l0Y2ggKGZpZWxkKSB7CiAgICAgY2FzZSBTUE9VVFM6CkBAIC0zNTcsNiArNDA5LDE0IEBACiAgICAgICB9CiAgICAgICBicmVhazsKIAorICAgIGNhc2UgV09SS0VSX0hPT0tTOgorICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgdW5zZXRfd29ya2VyX2hvb2tzKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzZXRfd29ya2VyX2hvb2tzKChMaXN0PEJ5dGVCdWZmZXI+KXZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCiAgICAgfQogICB9CiAKQEAgLTM3MSw2ICs0MzEsOSBAQAogICAgIGNhc2UgU1RBVEVfU1BPVVRTOgogICAgICAgcmV0dXJuIGdldF9zdGF0ZV9zcG91dHMoKTsKIAorICAgIGNhc2UgV09SS0VSX0hPT0tTOgorICAgICAgcmV0dXJuIGdldF93b3JrZXJfaG9va3MoKTsKKwogICAgIH0KICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CiAgIH0KQEAgLTM4OCw2ICs0NTEsOCBAQAogICAgICAgcmV0dXJuIGlzX3NldF9ib2x0cygpOwogICAgIGNhc2UgU1RBVEVfU1BPVVRTOgogICAgICAgcmV0dXJuIGlzX3NldF9zdGF0ZV9zcG91dHMoKTsKKyAgICBjYXNlIFdPUktFUl9IT09LUzoKKyAgICAgIHJldHVybiBpc19zZXRfd29ya2VyX2hvb2tzKCk7CiAgICAgfQogICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKICAgfQpAQCAtNDMyLDYgKzQ5NywxNSBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCisgICAgYm9vbGVhbiB0aGlzX3ByZXNlbnRfd29ya2VyX2hvb2tzID0gdHJ1ZSAmJiB0aGlzLmlzX3NldF93b3JrZXJfaG9va3MoKTsKKyAgICBib29sZWFuIHRoYXRfcHJlc2VudF93b3JrZXJfaG9va3MgPSB0cnVlICYmIHRoYXQuaXNfc2V0X3dvcmtlcl9ob29rcygpOworICAgIGlmICh0aGlzX3ByZXNlbnRfd29ya2VyX2hvb2tzIHx8IHRoYXRfcHJlc2VudF93b3JrZXJfaG9va3MpIHsKKyAgICAgIGlmICghKHRoaXNfcHJlc2VudF93b3JrZXJfaG9va3MgJiYgdGhhdF9wcmVzZW50X3dvcmtlcl9ob29rcykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGlmICghdGhpcy53b3JrZXJfaG9va3MuZXF1YWxzKHRoYXQud29ya2VyX2hvb2tzKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKwogICAgIHJldHVybiB0cnVlOwogICB9CiAKQEAgLTQ1NCw2ICs1MjgsMTEgQEAKICAgICBpZiAocHJlc2VudF9zdGF0ZV9zcG91dHMpCiAgICAgICBsaXN0LmFkZChzdGF0ZV9zcG91dHMpOwogCisgICAgYm9vbGVhbiBwcmVzZW50X3dvcmtlcl9ob29rcyA9IHRydWUgJiYgKGlzX3NldF93b3JrZXJfaG9va3MoKSk7CisgICAgbGlzdC5hZGQocHJlc2VudF93b3JrZXJfaG9va3MpOworICAgIGlmIChwcmVzZW50X3dvcmtlcl9ob29rcykKKyAgICAgIGxpc3QuYWRkKHdvcmtlcl9ob29rcyk7CisKICAgICByZXR1cm4gbGlzdC5oYXNoQ29kZSgpOwogICB9CiAKQEAgLTQ5NSw2ICs1NzQsMTYgQEAKICAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOwogICAgICAgfQogICAgIH0KKyAgICBsYXN0Q29tcGFyaXNvbiA9IEJvb2xlYW4udmFsdWVPZihpc19zZXRfd29ya2VyX2hvb2tzKCkpLmNvbXBhcmVUbyhvdGhlci5pc19zZXRfd29ya2VyX2hvb2tzKCkpOworICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgfQorICAgIGlmIChpc19zZXRfd29ya2VyX2hvb2tzKCkpIHsKKyAgICAgIGxhc3RDb21wYXJpc29uID0gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29tcGFyZVRvKHRoaXMud29ya2VyX2hvb2tzLCBvdGhlci53b3JrZXJfaG9va3MpOworICAgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgICAgfQorICAgIH0KICAgICByZXR1cm4gMDsKICAgfQogCkBAIC01MzgsNiArNjI3LDE2IEBACiAgICAgICBzYi5hcHBlbmQodGhpcy5zdGF0ZV9zcG91dHMpOwogICAgIH0KICAgICBmaXJzdCA9IGZhbHNlOworICAgIGlmIChpc19zZXRfd29ya2VyX2hvb2tzKCkpIHsKKyAgICAgIGlmICghZmlyc3QpIHNiLmFwcGVuZCgiLCAiKTsKKyAgICAgIHNiLmFwcGVuZCgid29ya2VyX2hvb2tzOiIpOworICAgICAgaWYgKHRoaXMud29ya2VyX2hvb2tzID09IG51bGwpIHsKKyAgICAgICAgc2IuYXBwZW5kKCJudWxsIik7CisgICAgICB9IGVsc2UgeworICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci50b1N0cmluZyh0aGlzLndvcmtlcl9ob29rcywgc2IpOworICAgICAgfQorICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9CiAgICAgc2IuYXBwZW5kKCIpIik7CiAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgIH0KQEAgLTY1Niw2ICs3NTUsMjQgQEAKICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgNDogLy8gV09SS0VSX0hPT0tTCisgICAgICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5MSVNUKSB7CisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTGlzdCBfbGlzdDU2ID0gaXByb3QucmVhZExpc3RCZWdpbigpOworICAgICAgICAgICAgICAgIHN0cnVjdC53b3JrZXJfaG9va3MgPSBuZXcgQXJyYXlMaXN0PEJ5dGVCdWZmZXI+KF9saXN0NTYuc2l6ZSk7CisgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciBfZWxlbTU3OworICAgICAgICAgICAgICAgIGZvciAoaW50IF9pNTggPSAwOyBfaTU4IDwgX2xpc3Q1Ni5zaXplOyArK19pNTgpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgX2VsZW01NyA9IGlwcm90LnJlYWRCaW5hcnkoKTsKKyAgICAgICAgICAgICAgICAgIHN0cnVjdC53b3JrZXJfaG9va3MuYWRkKF9lbGVtNTcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpcHJvdC5yZWFkTGlzdEVuZCgpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIHN0cnVjdC5zZXRfd29ya2VyX2hvb2tzX2lzU2V0KHRydWUpOworICAgICAgICAgICAgfSBlbHNlIHsgCisgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgc2NoZW1lRmllbGQudHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKICAgICAgICAgfQpAQCAtNjczLDEwICs3OTAsMTAgQEAKICAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKFNQT1VUU19GSUVMRF9ERVNDKTsKICAgICAgICAgewogICAgICAgICAgIG9wcm90LndyaXRlTWFwQmVnaW4obmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIHN0cnVjdC5zcG91dHMuc2l6ZSgpKSk7Ci0gICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTcG91dFNwZWM+IF9pdGVyNTYgOiBzdHJ1Y3Quc3BvdXRzLmVudHJ5U2V0KCkpCisgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTcG91dFNwZWM+IF9pdGVyNTkgOiBzdHJ1Y3Quc3BvdXRzLmVudHJ5U2V0KCkpCiAgICAgICAgICAgewotICAgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoX2l0ZXI1Ni5nZXRLZXkoKSk7Ci0gICAgICAgICAgICBfaXRlcjU2LmdldFZhbHVlKCkud3JpdGUob3Byb3QpOworICAgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoX2l0ZXI1OS5nZXRLZXkoKSk7CisgICAgICAgICAgICBfaXRlcjU5LmdldFZhbHVlKCkud3JpdGUob3Byb3QpOwogICAgICAgICAgIH0KICAgICAgICAgICBvcHJvdC53cml0ZU1hcEVuZCgpOwogICAgICAgICB9CkBAIC02ODYsMTAgKzgwMywxMCBAQAogICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oQk9MVFNfRklFTERfREVTQyk7CiAgICAgICAgIHsKICAgICAgICAgICBvcHJvdC53cml0ZU1hcEJlZ2luKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORywgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNULCBzdHJ1Y3QuYm9sdHMuc2l6ZSgpKSk7Ci0gICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBCb2x0PiBfaXRlcjU3IDogc3RydWN0LmJvbHRzLmVudHJ5U2V0KCkpCisgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBCb2x0PiBfaXRlcjYwIDogc3RydWN0LmJvbHRzLmVudHJ5U2V0KCkpCiAgICAgICAgICAgewotICAgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoX2l0ZXI1Ny5nZXRLZXkoKSk7Ci0gICAgICAgICAgICBfaXRlcjU3LmdldFZhbHVlKCkud3JpdGUob3Byb3QpOworICAgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoX2l0ZXI2MC5nZXRLZXkoKSk7CisgICAgICAgICAgICBfaXRlcjYwLmdldFZhbHVlKCkud3JpdGUob3Byb3QpOwogICAgICAgICAgIH0KICAgICAgICAgICBvcHJvdC53cml0ZU1hcEVuZCgpOwogICAgICAgICB9CkBAIC02OTksMTUgKzgxNiwyOSBAQAogICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oU1RBVEVfU1BPVVRTX0ZJRUxEX0RFU0MpOwogICAgICAgICB7CiAgICAgICAgICAgb3Byb3Qud3JpdGVNYXBCZWdpbihuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCwgc3RydWN0LnN0YXRlX3Nwb3V0cy5zaXplKCkpKTsKLSAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFN0YXRlU3BvdXRTcGVjPiBfaXRlcjU4IDogc3RydWN0LnN0YXRlX3Nwb3V0cy5lbnRyeVNldCgpKQorICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgU3RhdGVTcG91dFNwZWM+IF9pdGVyNjEgOiBzdHJ1Y3Quc3RhdGVfc3BvdXRzLmVudHJ5U2V0KCkpCiAgICAgICAgICAgewotICAgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoX2l0ZXI1OC5nZXRLZXkoKSk7Ci0gICAgICAgICAgICBfaXRlcjU4LmdldFZhbHVlKCkud3JpdGUob3Byb3QpOworICAgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoX2l0ZXI2MS5nZXRLZXkoKSk7CisgICAgICAgICAgICBfaXRlcjYxLmdldFZhbHVlKCkud3JpdGUob3Byb3QpOwogICAgICAgICAgIH0KICAgICAgICAgICBvcHJvdC53cml0ZU1hcEVuZCgpOwogICAgICAgICB9CiAgICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKICAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3Qud29ya2VyX2hvb2tzICE9IG51bGwpIHsKKyAgICAgICAgaWYgKHN0cnVjdC5pc19zZXRfd29ya2VyX2hvb2tzKCkpIHsKKyAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oV09SS0VSX0hPT0tTX0ZJRUxEX0RFU0MpOworICAgICAgICAgIHsKKyAgICAgICAgICAgIG9wcm90LndyaXRlTGlzdEJlZ2luKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTGlzdChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcsIHN0cnVjdC53b3JrZXJfaG9va3Muc2l6ZSgpKSk7CisgICAgICAgICAgICBmb3IgKEJ5dGVCdWZmZXIgX2l0ZXI2MiA6IHN0cnVjdC53b3JrZXJfaG9va3MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIG9wcm90LndyaXRlQmluYXJ5KF9pdGVyNjIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3Byb3Qud3JpdGVMaXN0RW5kKCk7CisgICAgICAgICAgfQorICAgICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICAgICAgfQorICAgICAgfQogICAgICAgb3Byb3Qud3JpdGVGaWVsZFN0b3AoKTsKICAgICAgIG9wcm90LndyaXRlU3RydWN0RW5kKCk7CiAgICAgfQpAQCAtNzI3LDI2ICs4NTgsNDAgQEAKICAgICAgIFRUdXBsZVByb3RvY29sIG9wcm90ID0gKFRUdXBsZVByb3RvY29sKSBwcm90OwogICAgICAgewogICAgICAgICBvcHJvdC53cml0ZUkzMihzdHJ1Y3Quc3BvdXRzLnNpemUoKSk7Ci0gICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgU3BvdXRTcGVjPiBfaXRlcjU5IDogc3RydWN0LnNwb3V0cy5lbnRyeVNldCgpKQorICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFNwb3V0U3BlYz4gX2l0ZXI2MyA6IHN0cnVjdC5zcG91dHMuZW50cnlTZXQoKSkKICAgICAgICAgewotICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKF9pdGVyNTkuZ2V0S2V5KCkpOwotICAgICAgICAgIF9pdGVyNTkuZ2V0VmFsdWUoKS53cml0ZShvcHJvdCk7CisgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoX2l0ZXI2My5nZXRLZXkoKSk7CisgICAgICAgICAgX2l0ZXI2My5nZXRWYWx1ZSgpLndyaXRlKG9wcm90KTsKICAgICAgICAgfQogICAgICAgfQogICAgICAgewogICAgICAgICBvcHJvdC53cml0ZUkzMihzdHJ1Y3QuYm9sdHMuc2l6ZSgpKTsKLSAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBCb2x0PiBfaXRlcjYwIDogc3RydWN0LmJvbHRzLmVudHJ5U2V0KCkpCisgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgQm9sdD4gX2l0ZXI2NCA6IHN0cnVjdC5ib2x0cy5lbnRyeVNldCgpKQogICAgICAgICB7Ci0gICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoX2l0ZXI2MC5nZXRLZXkoKSk7Ci0gICAgICAgICAgX2l0ZXI2MC5nZXRWYWx1ZSgpLndyaXRlKG9wcm90KTsKKyAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhfaXRlcjY0LmdldEtleSgpKTsKKyAgICAgICAgICBfaXRlcjY0LmdldFZhbHVlKCkud3JpdGUob3Byb3QpOwogICAgICAgICB9CiAgICAgICB9CiAgICAgICB7CiAgICAgICAgIG9wcm90LndyaXRlSTMyKHN0cnVjdC5zdGF0ZV9zcG91dHMuc2l6ZSgpKTsKLSAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTdGF0ZVNwb3V0U3BlYz4gX2l0ZXI2MSA6IHN0cnVjdC5zdGF0ZV9zcG91dHMuZW50cnlTZXQoKSkKKyAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTdGF0ZVNwb3V0U3BlYz4gX2l0ZXI2NSA6IHN0cnVjdC5zdGF0ZV9zcG91dHMuZW50cnlTZXQoKSkKICAgICAgICAgewotICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKF9pdGVyNjEuZ2V0S2V5KCkpOwotICAgICAgICAgIF9pdGVyNjEuZ2V0VmFsdWUoKS53cml0ZShvcHJvdCk7CisgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoX2l0ZXI2NS5nZXRLZXkoKSk7CisgICAgICAgICAgX2l0ZXI2NS5nZXRWYWx1ZSgpLndyaXRlKG9wcm90KTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgQml0U2V0IG9wdGlvbmFscyA9IG5ldyBCaXRTZXQoKTsKKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X3dvcmtlcl9ob29rcygpKSB7CisgICAgICAgIG9wdGlvbmFscy5zZXQoMCk7CisgICAgICB9CisgICAgICBvcHJvdC53cml0ZUJpdFNldChvcHRpb25hbHMsIDEpOworICAgICAgaWYgKHN0cnVjdC5pc19zZXRfd29ya2VyX2hvb2tzKCkpIHsKKyAgICAgICAgeworICAgICAgICAgIG9wcm90LndyaXRlSTMyKHN0cnVjdC53b3JrZXJfaG9va3Muc2l6ZSgpKTsKKyAgICAgICAgICBmb3IgKEJ5dGVCdWZmZXIgX2l0ZXI2NiA6IHN0cnVjdC53b3JrZXJfaG9va3MpCisgICAgICAgICAgeworICAgICAgICAgICAgb3Byb3Qud3JpdGVCaW5hcnkoX2l0ZXI2Nik7CisgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICB9CiAgICAgfQpAQCAtNzU1LDQ3ICs5MDAsNjEgQEAKICAgICBwdWJsaWMgdm9pZCByZWFkKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBwcm90LCBTdG9ybVRvcG9sb2d5IHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24gewogICAgICAgVFR1cGxlUHJvdG9jb2wgaXByb3QgPSAoVFR1cGxlUHJvdG9jb2wpIHByb3Q7CiAgICAgICB7Ci0gICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgX21hcDYyID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIGlwcm90LnJlYWRJMzIoKSk7Ci0gICAgICAgIHN0cnVjdC5zcG91dHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsU3BvdXRTcGVjPigyKl9tYXA2Mi5zaXplKTsKLSAgICAgICAgU3RyaW5nIF9rZXk2MzsKLSAgICAgICAgU3BvdXRTcGVjIF92YWw2NDsKLSAgICAgICAgZm9yIChpbnQgX2k2NSA9IDA7IF9pNjUgPCBfbWFwNjIuc2l6ZTsgKytfaTY1KQorICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwIF9tYXA2NyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORywgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNULCBpcHJvdC5yZWFkSTMyKCkpOworICAgICAgICBzdHJ1Y3Quc3BvdXRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLFNwb3V0U3BlYz4oMipfbWFwNjcuc2l6ZSk7CisgICAgICAgIFN0cmluZyBfa2V5Njg7CisgICAgICAgIFNwb3V0U3BlYyBfdmFsNjk7CisgICAgICAgIGZvciAoaW50IF9pNzAgPSAwOyBfaTcwIDwgX21hcDY3LnNpemU7ICsrX2k3MCkKICAgICAgICAgewotICAgICAgICAgIF9rZXk2MyA9IGlwcm90LnJlYWRTdHJpbmcoKTsKLSAgICAgICAgICBfdmFsNjQgPSBuZXcgU3BvdXRTcGVjKCk7Ci0gICAgICAgICAgX3ZhbDY0LnJlYWQoaXByb3QpOwotICAgICAgICAgIHN0cnVjdC5zcG91dHMucHV0KF9rZXk2MywgX3ZhbDY0KTsKKyAgICAgICAgICBfa2V5NjggPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgX3ZhbDY5ID0gbmV3IFNwb3V0U3BlYygpOworICAgICAgICAgIF92YWw2OS5yZWFkKGlwcm90KTsKKyAgICAgICAgICBzdHJ1Y3Quc3BvdXRzLnB1dChfa2V5NjgsIF92YWw2OSk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICAgIHN0cnVjdC5zZXRfc3BvdXRzX2lzU2V0KHRydWUpOwogICAgICAgewotICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwIF9tYXA2NiA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORywgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNULCBpcHJvdC5yZWFkSTMyKCkpOwotICAgICAgICBzdHJ1Y3QuYm9sdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsQm9sdD4oMipfbWFwNjYuc2l6ZSk7Ci0gICAgICAgIFN0cmluZyBfa2V5Njc7Ci0gICAgICAgIEJvbHQgX3ZhbDY4OwotICAgICAgICBmb3IgKGludCBfaTY5ID0gMDsgX2k2OSA8IF9tYXA2Ni5zaXplOyArK19pNjkpCisgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgX21hcDcxID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIGlwcm90LnJlYWRJMzIoKSk7CisgICAgICAgIHN0cnVjdC5ib2x0cyA9IG5ldyBIYXNoTWFwPFN0cmluZyxCb2x0PigyKl9tYXA3MS5zaXplKTsKKyAgICAgICAgU3RyaW5nIF9rZXk3MjsKKyAgICAgICAgQm9sdCBfdmFsNzM7CisgICAgICAgIGZvciAoaW50IF9pNzQgPSAwOyBfaTc0IDwgX21hcDcxLnNpemU7ICsrX2k3NCkKICAgICAgICAgewotICAgICAgICAgIF9rZXk2NyA9IGlwcm90LnJlYWRTdHJpbmcoKTsKLSAgICAgICAgICBfdmFsNjggPSBuZXcgQm9sdCgpOwotICAgICAgICAgIF92YWw2OC5yZWFkKGlwcm90KTsKLSAgICAgICAgICBzdHJ1Y3QuYm9sdHMucHV0KF9rZXk2NywgX3ZhbDY4KTsKKyAgICAgICAgICBfa2V5NzIgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgX3ZhbDczID0gbmV3IEJvbHQoKTsKKyAgICAgICAgICBfdmFsNzMucmVhZChpcHJvdCk7CisgICAgICAgICAgc3RydWN0LmJvbHRzLnB1dChfa2V5NzIsIF92YWw3Myk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICAgIHN0cnVjdC5zZXRfYm9sdHNfaXNTZXQodHJ1ZSk7CiAgICAgICB7Ci0gICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgX21hcDcwID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIGlwcm90LnJlYWRJMzIoKSk7Ci0gICAgICAgIHN0cnVjdC5zdGF0ZV9zcG91dHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsU3RhdGVTcG91dFNwZWM+KDIqX21hcDcwLnNpemUpOwotICAgICAgICBTdHJpbmcgX2tleTcxOwotICAgICAgICBTdGF0ZVNwb3V0U3BlYyBfdmFsNzI7Ci0gICAgICAgIGZvciAoaW50IF9pNzMgPSAwOyBfaTczIDwgX21hcDcwLnNpemU7ICsrX2k3MykKKyAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwNzUgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCwgaXByb3QucmVhZEkzMigpKTsKKyAgICAgICAgc3RydWN0LnN0YXRlX3Nwb3V0cyA9IG5ldyBIYXNoTWFwPFN0cmluZyxTdGF0ZVNwb3V0U3BlYz4oMipfbWFwNzUuc2l6ZSk7CisgICAgICAgIFN0cmluZyBfa2V5NzY7CisgICAgICAgIFN0YXRlU3BvdXRTcGVjIF92YWw3NzsKKyAgICAgICAgZm9yIChpbnQgX2k3OCA9IDA7IF9pNzggPCBfbWFwNzUuc2l6ZTsgKytfaTc4KQogICAgICAgICB7Ci0gICAgICAgICAgX2tleTcxID0gaXByb3QucmVhZFN0cmluZygpOwotICAgICAgICAgIF92YWw3MiA9IG5ldyBTdGF0ZVNwb3V0U3BlYygpOwotICAgICAgICAgIF92YWw3Mi5yZWFkKGlwcm90KTsKLSAgICAgICAgICBzdHJ1Y3Quc3RhdGVfc3BvdXRzLnB1dChfa2V5NzEsIF92YWw3Mik7CisgICAgICAgICAgX2tleTc2ID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICAgIF92YWw3NyA9IG5ldyBTdGF0ZVNwb3V0U3BlYygpOworICAgICAgICAgIF92YWw3Ny5yZWFkKGlwcm90KTsKKyAgICAgICAgICBzdHJ1Y3Quc3RhdGVfc3BvdXRzLnB1dChfa2V5NzYsIF92YWw3Nyk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICAgIHN0cnVjdC5zZXRfc3RhdGVfc3BvdXRzX2lzU2V0KHRydWUpOworICAgICAgQml0U2V0IGluY29taW5nID0gaXByb3QucmVhZEJpdFNldCgxKTsKKyAgICAgIGlmIChpbmNvbWluZy5nZXQoMCkpIHsKKyAgICAgICAgeworICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRMaXN0IF9saXN0NzkgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVExpc3Qob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCBpcHJvdC5yZWFkSTMyKCkpOworICAgICAgICAgIHN0cnVjdC53b3JrZXJfaG9va3MgPSBuZXcgQXJyYXlMaXN0PEJ5dGVCdWZmZXI+KF9saXN0Nzkuc2l6ZSk7CisgICAgICAgICAgQnl0ZUJ1ZmZlciBfZWxlbTgwOworICAgICAgICAgIGZvciAoaW50IF9pODEgPSAwOyBfaTgxIDwgX2xpc3Q3OS5zaXplOyArK19pODEpCisgICAgICAgICAgeworICAgICAgICAgICAgX2VsZW04MCA9IGlwcm90LnJlYWRCaW5hcnkoKTsKKyAgICAgICAgICAgIHN0cnVjdC53b3JrZXJfaG9va3MuYWRkKF9lbGVtODApOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdHJ1Y3Quc2V0X3dvcmtlcl9ob29rc19pc1NldCh0cnVlKTsKKyAgICAgIH0KICAgICB9CiAgIH0KIApkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9TdHJlYW1JbmZvLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL1N0cmVhbUluZm8uamF2YQppbmRleCBiOWJjNzVkLi5jYWExODg3IDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL1N0cmVhbUluZm8uamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL1N0cmVhbUluZm8uamF2YQpAQCAtMTYsNyArMTYsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIC8qKgotICogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4yKQorICogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4zKQogICoKICAqIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkcKICAqICBAZ2VuZXJhdGVkCkBAIC01MSw3ICs1MSw3IEBACiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKIEBTdXBwcmVzc1dhcm5pbmdzKHsiY2FzdCIsICJyYXd0eXBlcyIsICJzZXJpYWwiLCAidW5jaGVja2VkIn0pCi1AR2VuZXJhdGVkKHZhbHVlID0gIkF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMikiLCBkYXRlID0gIjIwMTUtMi02IikKK0BHZW5lcmF0ZWQodmFsdWUgPSAiQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4zKSIpCiBwdWJsaWMgY2xhc3MgU3RyZWFtSW5mbyBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlPFN0cmVhbUluZm8sIFN0cmVhbUluZm8uX0ZpZWxkcz4sIGphdmEuaW8uU2VyaWFsaXphYmxlLCBDbG9uZWFibGUsIENvbXBhcmFibGU8U3RyZWFtSW5mbz4gewogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0IFNUUlVDVF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QoIlN0cmVhbUluZm8iKTsKIApAQCAtMjY2LDcgKzI2Niw3IEBACiAgICAgICByZXR1cm4gZ2V0X291dHB1dF9maWVsZHMoKTsKIAogICAgIGNhc2UgRElSRUNUOgotICAgICAgcmV0dXJuIEJvb2xlYW4udmFsdWVPZihpc19kaXJlY3QoKSk7CisgICAgICByZXR1cm4gaXNfZGlyZWN0KCk7CiAKICAgICB9CiAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9TdWJtaXRPcHRpb25zLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL1N1Ym1pdE9wdGlvbnMuamF2YQppbmRleCAyYTY4YzNiLi4yMTRkZWQwIDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL1N1Ym1pdE9wdGlvbnMuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL1N1Ym1pdE9wdGlvbnMuamF2YQpAQCAtMTYsNyArMTYsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIC8qKgotICogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4yKQorICogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4zKQogICoKICAqIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkcKICAqICBAZ2VuZXJhdGVkCkBAIC01MSw3ICs1MSw3IEBACiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKIEBTdXBwcmVzc1dhcm5pbmdzKHsiY2FzdCIsICJyYXd0eXBlcyIsICJzZXJpYWwiLCAidW5jaGVja2VkIn0pCi1AR2VuZXJhdGVkKHZhbHVlID0gIkF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMikiLCBkYXRlID0gIjIwMTUtMi02IikKK0BHZW5lcmF0ZWQodmFsdWUgPSAiQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4zKSIpCiBwdWJsaWMgY2xhc3MgU3VibWl0T3B0aW9ucyBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlPFN1Ym1pdE9wdGlvbnMsIFN1Ym1pdE9wdGlvbnMuX0ZpZWxkcz4sIGphdmEuaW8uU2VyaWFsaXphYmxlLCBDbG9uZWFibGUsIENvbXBhcmFibGU8U3VibWl0T3B0aW9ucz4gewogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0IFNUUlVDVF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QoIlN1Ym1pdE9wdGlvbnMiKTsKIApkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9TdXBlcnZpc29ySW5mby5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9TdXBlcnZpc29ySW5mby5qYXZhCmluZGV4IGJiNDY5OGMuLjJjZTVlYjkgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvU3VwZXJ2aXNvckluZm8uamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL1N1cGVydmlzb3JJbmZvLmphdmEKQEAgLTE2LDcgKzE2LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAvKioKLSAqIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMikKKyAqIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMykKICAqCiAgKiBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HCiAgKiAgQGdlbmVyYXRlZApAQCAtNTEsNyArNTEsNyBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCiBAU3VwcHJlc3NXYXJuaW5ncyh7ImNhc3QiLCAicmF3dHlwZXMiLCAic2VyaWFsIiwgInVuY2hlY2tlZCJ9KQotQEdlbmVyYXRlZCh2YWx1ZSA9ICJBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjIpIiwgZGF0ZSA9ICIyMDE1LTktMyIpCitAR2VuZXJhdGVkKHZhbHVlID0gIkF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMykiKQogcHVibGljIGNsYXNzIFN1cGVydmlzb3JJbmZvIGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2U8U3VwZXJ2aXNvckluZm8sIFN1cGVydmlzb3JJbmZvLl9GaWVsZHM+LCBqYXZhLmlvLlNlcmlhbGl6YWJsZSwgQ2xvbmVhYmxlLCBDb21wYXJhYmxlPFN1cGVydmlzb3JJbmZvPiB7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QgU1RSVUNUX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdCgiU3VwZXJ2aXNvckluZm8iKTsKIApAQCAtNjMsNiArNjMsNyBAQAogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgU0NIRURVTEVSX01FVEFfRklFTERfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQoInNjaGVkdWxlcl9tZXRhIiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTUFQLCAoc2hvcnQpNik7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBVUFRJTUVfU0VDU19GSUVMRF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCgidXB0aW1lX3NlY3MiLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JNjQsIChzaG9ydCk3KTsKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIFZFUlNJT05fRklFTERfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQoInZlcnNpb24iLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcsIChzaG9ydCk4KTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIFJFU09VUkNFU19NQVBfRklFTERfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQoInJlc291cmNlc19tYXAiLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5NQVAsIChzaG9ydCk5KTsKIAogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8Q2xhc3M8PyBleHRlbmRzIElTY2hlbWU+LCBTY2hlbWVGYWN0b3J5PiBzY2hlbWVzID0gbmV3IEhhc2hNYXA8Q2xhc3M8PyBleHRlbmRzIElTY2hlbWU+LCBTY2hlbWVGYWN0b3J5PigpOwogICBzdGF0aWMgewpAQCAtNzgsNiArNzksNyBAQAogICBwcml2YXRlIE1hcDxTdHJpbmcsU3RyaW5nPiBzY2hlZHVsZXJfbWV0YTsgLy8gb3B0aW9uYWwKICAgcHJpdmF0ZSBsb25nIHVwdGltZV9zZWNzOyAvLyBvcHRpb25hbAogICBwcml2YXRlIFN0cmluZyB2ZXJzaW9uOyAvLyBvcHRpb25hbAorICBwcml2YXRlIE1hcDxTdHJpbmcsRG91YmxlPiByZXNvdXJjZXNfbWFwOyAvLyBvcHRpb25hbAogCiAgIC8qKiBUaGUgc2V0IG9mIGZpZWxkcyB0aGlzIHN0cnVjdCBjb250YWlucywgYWxvbmcgd2l0aCBjb252ZW5pZW5jZSBtZXRob2RzIGZvciBmaW5kaW5nIGFuZCBtYW5pcHVsYXRpbmcgdGhlbS4gKi8KICAgcHVibGljIGVudW0gX0ZpZWxkcyBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZElkRW51bSB7CkBAIC04OCw3ICs5MCw4IEBACiAgICAgTUVUQSgoc2hvcnQpNSwgIm1ldGEiKSwKICAgICBTQ0hFRFVMRVJfTUVUQSgoc2hvcnQpNiwgInNjaGVkdWxlcl9tZXRhIiksCiAgICAgVVBUSU1FX1NFQ1MoKHNob3J0KTcsICJ1cHRpbWVfc2VjcyIpLAotICAgIFZFUlNJT04oKHNob3J0KTgsICJ2ZXJzaW9uIik7CisgICAgVkVSU0lPTigoc2hvcnQpOCwgInZlcnNpb24iKSwKKyAgICBSRVNPVVJDRVNfTUFQKChzaG9ydCk5LCAicmVzb3VyY2VzX21hcCIpOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgX0ZpZWxkcz4gYnlOYW1lID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBfRmllbGRzPigpOwogCkBAIC0xMTksNiArMTIyLDggQEAKICAgICAgICAgICByZXR1cm4gVVBUSU1FX1NFQ1M7CiAgICAgICAgIGNhc2UgODogLy8gVkVSU0lPTgogICAgICAgICAgIHJldHVybiBWRVJTSU9OOworICAgICAgICBjYXNlIDk6IC8vIFJFU09VUkNFU19NQVAKKyAgICAgICAgICByZXR1cm4gUkVTT1VSQ0VTX01BUDsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgIH0KQEAgLTE2Miw3ICsxNjcsNyBAQAogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgX19USU1FX1NFQ1NfSVNTRVRfSUQgPSAwOwogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgX19VUFRJTUVfU0VDU19JU1NFVF9JRCA9IDE7CiAgIHByaXZhdGUgYnl0ZSBfX2lzc2V0X2JpdGZpZWxkID0gMDsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgX0ZpZWxkcyBvcHRpb25hbHNbXSA9IHtfRmllbGRzLkFTU0lHTk1FTlRfSUQsX0ZpZWxkcy5VU0VEX1BPUlRTLF9GaWVsZHMuTUVUQSxfRmllbGRzLlNDSEVEVUxFUl9NRVRBLF9GaWVsZHMuVVBUSU1FX1NFQ1MsX0ZpZWxkcy5WRVJTSU9OfTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgX0ZpZWxkcyBvcHRpb25hbHNbXSA9IHtfRmllbGRzLkFTU0lHTk1FTlRfSUQsX0ZpZWxkcy5VU0VEX1BPUlRTLF9GaWVsZHMuTUVUQSxfRmllbGRzLlNDSEVEVUxFUl9NRVRBLF9GaWVsZHMuVVBUSU1FX1NFQ1MsX0ZpZWxkcy5WRVJTSU9OLF9GaWVsZHMuUkVTT1VSQ0VTX01BUH07CiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPiBtZXRhRGF0YU1hcDsKICAgc3RhdGljIHsKICAgICBNYXA8X0ZpZWxkcywgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGE+IHRtcE1hcCA9IG5ldyBFbnVtTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPihfRmllbGRzLmNsYXNzKTsKQEAgLTE4Niw2ICsxOTEsMTAgQEAKICAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZFZhbHVlTWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTY0KSkpOwogICAgIHRtcE1hcC5wdXQoX0ZpZWxkcy5WRVJTSU9OLCBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEoInZlcnNpb24iLCBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRSZXF1aXJlbWVudFR5cGUuT1BUSU9OQUwsIAogICAgICAgICBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkVmFsdWVNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcpKSk7CisgICAgdG1wTWFwLnB1dChfRmllbGRzLlJFU09VUkNFU19NQVAsIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YSgicmVzb3VyY2VzX21hcCIsIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZFJlcXVpcmVtZW50VHlwZS5PUFRJT05BTCwgCisgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuTWFwTWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTUFQLCAKKyAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRWYWx1ZU1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORyksIAorICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZFZhbHVlTWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuRE9VQkxFKSkpKTsKICAgICBtZXRhRGF0YU1hcCA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcCh0bXBNYXApOwogICAgIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhLmFkZFN0cnVjdE1ldGFEYXRhTWFwKFN1cGVydmlzb3JJbmZvLmNsYXNzLCBtZXRhRGF0YU1hcCk7CiAgIH0KQEAgLTIzMSw2ICsyNDAsMTAgQEAKICAgICBpZiAob3RoZXIuaXNfc2V0X3ZlcnNpb24oKSkgewogICAgICAgdGhpcy52ZXJzaW9uID0gb3RoZXIudmVyc2lvbjsKICAgICB9CisgICAgaWYgKG90aGVyLmlzX3NldF9yZXNvdXJjZXNfbWFwKCkpIHsKKyAgICAgIE1hcDxTdHJpbmcsRG91YmxlPiBfX3RoaXNfX3Jlc291cmNlc19tYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsRG91YmxlPihvdGhlci5yZXNvdXJjZXNfbWFwKTsKKyAgICAgIHRoaXMucmVzb3VyY2VzX21hcCA9IF9fdGhpc19fcmVzb3VyY2VzX21hcDsKKyAgICB9CiAgIH0KIAogICBwdWJsaWMgU3VwZXJ2aXNvckluZm8gZGVlcENvcHkoKSB7CkBAIC0yNDksNiArMjYyLDcgQEAKICAgICBzZXRfdXB0aW1lX3NlY3NfaXNTZXQoZmFsc2UpOwogICAgIHRoaXMudXB0aW1lX3NlY3MgPSAwOwogICAgIHRoaXMudmVyc2lvbiA9IG51bGw7CisgICAgdGhpcy5yZXNvdXJjZXNfbWFwID0gbnVsbDsKICAgfQogCiAgIHB1YmxpYyBsb25nIGdldF90aW1lX3NlY3MoKSB7CkBAIC00NzQsNiArNDg4LDQwIEBACiAgICAgfQogICB9CiAKKyAgcHVibGljIGludCBnZXRfcmVzb3VyY2VzX21hcF9zaXplKCkgeworICAgIHJldHVybiAodGhpcy5yZXNvdXJjZXNfbWFwID09IG51bGwpID8gMCA6IHRoaXMucmVzb3VyY2VzX21hcC5zaXplKCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBwdXRfdG9fcmVzb3VyY2VzX21hcChTdHJpbmcga2V5LCBkb3VibGUgdmFsKSB7CisgICAgaWYgKHRoaXMucmVzb3VyY2VzX21hcCA9PSBudWxsKSB7CisgICAgICB0aGlzLnJlc291cmNlc19tYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsRG91YmxlPigpOworICAgIH0KKyAgICB0aGlzLnJlc291cmNlc19tYXAucHV0KGtleSwgdmFsKTsKKyAgfQorCisgIHB1YmxpYyBNYXA8U3RyaW5nLERvdWJsZT4gZ2V0X3Jlc291cmNlc19tYXAoKSB7CisgICAgcmV0dXJuIHRoaXMucmVzb3VyY2VzX21hcDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF9yZXNvdXJjZXNfbWFwKE1hcDxTdHJpbmcsRG91YmxlPiByZXNvdXJjZXNfbWFwKSB7CisgICAgdGhpcy5yZXNvdXJjZXNfbWFwID0gcmVzb3VyY2VzX21hcDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHVuc2V0X3Jlc291cmNlc19tYXAoKSB7CisgICAgdGhpcy5yZXNvdXJjZXNfbWFwID0gbnVsbDsKKyAgfQorCisgIC8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgcmVzb3VyY2VzX21hcCBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNfc2V0X3Jlc291cmNlc19tYXAoKSB7CisgICAgcmV0dXJuIHRoaXMucmVzb3VyY2VzX21hcCAhPSBudWxsOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X3Jlc291cmNlc19tYXBfaXNTZXQoYm9vbGVhbiB2YWx1ZSkgeworICAgIGlmICghdmFsdWUpIHsKKyAgICAgIHRoaXMucmVzb3VyY2VzX21hcCA9IG51bGw7CisgICAgfQorICB9CisKICAgcHVibGljIHZvaWQgc2V0RmllbGRWYWx1ZShfRmllbGRzIGZpZWxkLCBPYmplY3QgdmFsdWUpIHsKICAgICBzd2l0Y2ggKGZpZWxkKSB7CiAgICAgY2FzZSBUSU1FX1NFQ1M6CkBAIC01NDAsMTMgKzU4OCwyMSBAQAogICAgICAgfQogICAgICAgYnJlYWs7CiAKKyAgICBjYXNlIFJFU09VUkNFU19NQVA6CisgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICB1bnNldF9yZXNvdXJjZXNfbWFwKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzZXRfcmVzb3VyY2VzX21hcCgoTWFwPFN0cmluZyxEb3VibGU+KXZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCiAgICAgfQogICB9CiAKICAgcHVibGljIE9iamVjdCBnZXRGaWVsZFZhbHVlKF9GaWVsZHMgZmllbGQpIHsKICAgICBzd2l0Y2ggKGZpZWxkKSB7CiAgICAgY2FzZSBUSU1FX1NFQ1M6Ci0gICAgICByZXR1cm4gTG9uZy52YWx1ZU9mKGdldF90aW1lX3NlY3MoKSk7CisgICAgICByZXR1cm4gZ2V0X3RpbWVfc2VjcygpOwogCiAgICAgY2FzZSBIT1NUTkFNRToKICAgICAgIHJldHVybiBnZXRfaG9zdG5hbWUoKTsKQEAgLTU2NCwxMSArNjIwLDE0IEBACiAgICAgICByZXR1cm4gZ2V0X3NjaGVkdWxlcl9tZXRhKCk7CiAKICAgICBjYXNlIFVQVElNRV9TRUNTOgotICAgICAgcmV0dXJuIExvbmcudmFsdWVPZihnZXRfdXB0aW1lX3NlY3MoKSk7CisgICAgICByZXR1cm4gZ2V0X3VwdGltZV9zZWNzKCk7CiAKICAgICBjYXNlIFZFUlNJT046CiAgICAgICByZXR1cm4gZ2V0X3ZlcnNpb24oKTsKIAorICAgIGNhc2UgUkVTT1VSQ0VTX01BUDoKKyAgICAgIHJldHVybiBnZXRfcmVzb3VyY2VzX21hcCgpOworCiAgICAgfQogICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKICAgfQpAQCAtNTk2LDYgKzY1NSw4IEBACiAgICAgICByZXR1cm4gaXNfc2V0X3VwdGltZV9zZWNzKCk7CiAgICAgY2FzZSBWRVJTSU9OOgogICAgICAgcmV0dXJuIGlzX3NldF92ZXJzaW9uKCk7CisgICAgY2FzZSBSRVNPVVJDRVNfTUFQOgorICAgICAgcmV0dXJuIGlzX3NldF9yZXNvdXJjZXNfbWFwKCk7CiAgICAgfQogICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKICAgfQpAQCAtNjg1LDYgKzc0NiwxNSBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCisgICAgYm9vbGVhbiB0aGlzX3ByZXNlbnRfcmVzb3VyY2VzX21hcCA9IHRydWUgJiYgdGhpcy5pc19zZXRfcmVzb3VyY2VzX21hcCgpOworICAgIGJvb2xlYW4gdGhhdF9wcmVzZW50X3Jlc291cmNlc19tYXAgPSB0cnVlICYmIHRoYXQuaXNfc2V0X3Jlc291cmNlc19tYXAoKTsKKyAgICBpZiAodGhpc19wcmVzZW50X3Jlc291cmNlc19tYXAgfHwgdGhhdF9wcmVzZW50X3Jlc291cmNlc19tYXApIHsKKyAgICAgIGlmICghKHRoaXNfcHJlc2VudF9yZXNvdXJjZXNfbWFwICYmIHRoYXRfcHJlc2VudF9yZXNvdXJjZXNfbWFwKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKCF0aGlzLnJlc291cmNlc19tYXAuZXF1YWxzKHRoYXQucmVzb3VyY2VzX21hcCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKICAgICByZXR1cm4gdHJ1ZTsKICAgfQogCkBAIC03MzIsNiArODAyLDExIEBACiAgICAgaWYgKHByZXNlbnRfdmVyc2lvbikKICAgICAgIGxpc3QuYWRkKHZlcnNpb24pOwogCisgICAgYm9vbGVhbiBwcmVzZW50X3Jlc291cmNlc19tYXAgPSB0cnVlICYmIChpc19zZXRfcmVzb3VyY2VzX21hcCgpKTsKKyAgICBsaXN0LmFkZChwcmVzZW50X3Jlc291cmNlc19tYXApOworICAgIGlmIChwcmVzZW50X3Jlc291cmNlc19tYXApCisgICAgICBsaXN0LmFkZChyZXNvdXJjZXNfbWFwKTsKKwogICAgIHJldHVybiBsaXN0Lmhhc2hDb2RlKCk7CiAgIH0KIApAQCAtODIzLDYgKzg5OCwxNiBAQAogICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CiAgICAgICB9CiAgICAgfQorICAgIGxhc3RDb21wYXJpc29uID0gQm9vbGVhbi52YWx1ZU9mKGlzX3NldF9yZXNvdXJjZXNfbWFwKCkpLmNvbXBhcmVUbyhvdGhlci5pc19zZXRfcmVzb3VyY2VzX21hcCgpKTsKKyAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgIH0KKyAgICBpZiAoaXNfc2V0X3Jlc291cmNlc19tYXAoKSkgeworICAgICAgbGFzdENvbXBhcmlzb24gPSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy5yZXNvdXJjZXNfbWFwLCBvdGhlci5yZXNvdXJjZXNfbWFwKTsKKyAgICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICAgIH0KKyAgICB9CiAgICAgcmV0dXJuIDA7CiAgIH0KIApAQCAtOTEwLDYgKzk5NSwxNiBAQAogICAgICAgfQogICAgICAgZmlyc3QgPSBmYWxzZTsKICAgICB9CisgICAgaWYgKGlzX3NldF9yZXNvdXJjZXNfbWFwKCkpIHsKKyAgICAgIGlmICghZmlyc3QpIHNiLmFwcGVuZCgiLCAiKTsKKyAgICAgIHNiLmFwcGVuZCgicmVzb3VyY2VzX21hcDoiKTsKKyAgICAgIGlmICh0aGlzLnJlc291cmNlc19tYXAgPT0gbnVsbCkgeworICAgICAgICBzYi5hcHBlbmQoIm51bGwiKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNiLmFwcGVuZCh0aGlzLnJlc291cmNlc19tYXApOworICAgICAgfQorICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9CiAgICAgc2IuYXBwZW5kKCIpIik7CiAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CiAgIH0KQEAgLTk5MCwxMyArMTA4NSwxMyBAQAogICAgICAgICAgIGNhc2UgNDogLy8gVVNFRF9QT1JUUwogICAgICAgICAgICAgaWYgKHNjaGVtZUZpZWxkLnR5cGUgPT0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTElTVCkgewogICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVExpc3QgX2xpc3QzNTQgPSBpcHJvdC5yZWFkTGlzdEJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgc3RydWN0LnVzZWRfcG9ydHMgPSBuZXcgQXJyYXlMaXN0PExvbmc+KF9saXN0MzU0LnNpemUpOwotICAgICAgICAgICAgICAgIGxvbmcgX2VsZW0zNTU7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgX2kzNTYgPSAwOyBfaTM1NiA8IF9saXN0MzU0LnNpemU7ICsrX2kzNTYpCisgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVExpc3QgX2xpc3Q0ODggPSBpcHJvdC5yZWFkTGlzdEJlZ2luKCk7CisgICAgICAgICAgICAgICAgc3RydWN0LnVzZWRfcG9ydHMgPSBuZXcgQXJyYXlMaXN0PExvbmc+KF9saXN0NDg4LnNpemUpOworICAgICAgICAgICAgICAgIGxvbmcgX2VsZW00ODk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgX2k0OTAgPSAwOyBfaTQ5MCA8IF9saXN0NDg4LnNpemU7ICsrX2k0OTApCiAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgX2VsZW0zNTUgPSBpcHJvdC5yZWFkSTY0KCk7Ci0gICAgICAgICAgICAgICAgICBzdHJ1Y3QudXNlZF9wb3J0cy5hZGQoX2VsZW0zNTUpOworICAgICAgICAgICAgICAgICAgX2VsZW00ODkgPSBpcHJvdC5yZWFkSTY0KCk7CisgICAgICAgICAgICAgICAgICBzdHJ1Y3QudXNlZF9wb3J0cy5hZGQoX2VsZW00ODkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpcHJvdC5yZWFkTGlzdEVuZCgpOwogICAgICAgICAgICAgICB9CkBAIC0xMDA4LDEzICsxMTAzLDEzIEBACiAgICAgICAgICAgY2FzZSA1OiAvLyBNRVRBCiAgICAgICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5MSVNUKSB7CiAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTGlzdCBfbGlzdDM1NyA9IGlwcm90LnJlYWRMaXN0QmVnaW4oKTsKLSAgICAgICAgICAgICAgICBzdHJ1Y3QubWV0YSA9IG5ldyBBcnJheUxpc3Q8TG9uZz4oX2xpc3QzNTcuc2l6ZSk7Ci0gICAgICAgICAgICAgICAgbG9uZyBfZWxlbTM1ODsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBfaTM1OSA9IDA7IF9pMzU5IDwgX2xpc3QzNTcuc2l6ZTsgKytfaTM1OSkKKyAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTGlzdCBfbGlzdDQ5MSA9IGlwcm90LnJlYWRMaXN0QmVnaW4oKTsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QubWV0YSA9IG5ldyBBcnJheUxpc3Q8TG9uZz4oX2xpc3Q0OTEuc2l6ZSk7CisgICAgICAgICAgICAgICAgbG9uZyBfZWxlbTQ5MjsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBfaTQ5MyA9IDA7IF9pNDkzIDwgX2xpc3Q0OTEuc2l6ZTsgKytfaTQ5MykKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBfZWxlbTM1OCA9IGlwcm90LnJlYWRJNjQoKTsKLSAgICAgICAgICAgICAgICAgIHN0cnVjdC5tZXRhLmFkZChfZWxlbTM1OCk7CisgICAgICAgICAgICAgICAgICBfZWxlbTQ5MiA9IGlwcm90LnJlYWRJNjQoKTsKKyAgICAgICAgICAgICAgICAgIHN0cnVjdC5tZXRhLmFkZChfZWxlbTQ5Mik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlwcm90LnJlYWRMaXN0RW5kKCk7CiAgICAgICAgICAgICAgIH0KQEAgLTEwMjYsMTUgKzExMjEsMTUgQEAKICAgICAgICAgICBjYXNlIDY6IC8vIFNDSEVEVUxFUl9NRVRBCiAgICAgICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5NQVApIHsKICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgX21hcDM2MCA9IGlwcm90LnJlYWRNYXBCZWdpbigpOwotICAgICAgICAgICAgICAgIHN0cnVjdC5zY2hlZHVsZXJfbWV0YSA9IG5ldyBIYXNoTWFwPFN0cmluZyxTdHJpbmc+KDIqX21hcDM2MC5zaXplKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgX2tleTM2MTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgX3ZhbDM2MjsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBfaTM2MyA9IDA7IF9pMzYzIDwgX21hcDM2MC5zaXplOyArK19pMzYzKQorICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgX21hcDQ5NCA9IGlwcm90LnJlYWRNYXBCZWdpbigpOworICAgICAgICAgICAgICAgIHN0cnVjdC5zY2hlZHVsZXJfbWV0YSA9IG5ldyBIYXNoTWFwPFN0cmluZyxTdHJpbmc+KDIqX21hcDQ5NC5zaXplKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgX2tleTQ5NTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgX3ZhbDQ5NjsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBfaTQ5NyA9IDA7IF9pNDk3IDwgX21hcDQ5NC5zaXplOyArK19pNDk3KQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIF9rZXkzNjEgPSBpcHJvdC5yZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICBfdmFsMzYyID0gaXByb3QucmVhZFN0cmluZygpOwotICAgICAgICAgICAgICAgICAgc3RydWN0LnNjaGVkdWxlcl9tZXRhLnB1dChfa2V5MzYxLCBfdmFsMzYyKTsKKyAgICAgICAgICAgICAgICAgIF9rZXk0OTUgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICBfdmFsNDk2ID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICAgICAgICAgICAgc3RydWN0LnNjaGVkdWxlcl9tZXRhLnB1dChfa2V5NDk1LCBfdmFsNDk2KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaXByb3QucmVhZE1hcEVuZCgpOwogICAgICAgICAgICAgICB9CkBAIC0xMDU5LDYgKzExNTQsMjYgQEAKICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgOTogLy8gUkVTT1VSQ0VTX01BUAorICAgICAgICAgICAgaWYgKHNjaGVtZUZpZWxkLnR5cGUgPT0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTUFQKSB7CisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwIF9tYXA0OTggPSBpcHJvdC5yZWFkTWFwQmVnaW4oKTsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QucmVzb3VyY2VzX21hcCA9IG5ldyBIYXNoTWFwPFN0cmluZyxEb3VibGU+KDIqX21hcDQ5OC5zaXplKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgX2tleTQ5OTsKKyAgICAgICAgICAgICAgICBkb3VibGUgX3ZhbDUwMDsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBfaTUwMSA9IDA7IF9pNTAxIDwgX21hcDQ5OC5zaXplOyArK19pNTAxKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIF9rZXk0OTkgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICBfdmFsNTAwID0gaXByb3QucmVhZERvdWJsZSgpOworICAgICAgICAgICAgICAgICAgc3RydWN0LnJlc291cmNlc19tYXAucHV0KF9rZXk0OTksIF92YWw1MDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpcHJvdC5yZWFkTWFwRW5kKCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgc3RydWN0LnNldF9yZXNvdXJjZXNfbWFwX2lzU2V0KHRydWUpOworICAgICAgICAgICAgfSBlbHNlIHsgCisgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgc2NoZW1lRmllbGQudHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKICAgICAgICAgfQpAQCAtMTA5Miw5ICsxMjA3LDkgQEAKICAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oVVNFRF9QT1JUU19GSUVMRF9ERVNDKTsKICAgICAgICAgICB7CiAgICAgICAgICAgICBvcHJvdC53cml0ZUxpc3RCZWdpbihuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVExpc3Qob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTY0LCBzdHJ1Y3QudXNlZF9wb3J0cy5zaXplKCkpKTsKLSAgICAgICAgICAgIGZvciAobG9uZyBfaXRlcjM2NCA6IHN0cnVjdC51c2VkX3BvcnRzKQorICAgICAgICAgICAgZm9yIChsb25nIF9pdGVyNTAyIDogc3RydWN0LnVzZWRfcG9ydHMpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG9wcm90LndyaXRlSTY0KF9pdGVyMzY0KTsKKyAgICAgICAgICAgICAgb3Byb3Qud3JpdGVJNjQoX2l0ZXI1MDIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgb3Byb3Qud3JpdGVMaXN0RW5kKCk7CiAgICAgICAgICAgfQpAQCAtMTEwNiw5ICsxMjIxLDkgQEAKICAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oTUVUQV9GSUVMRF9ERVNDKTsKICAgICAgICAgICB7CiAgICAgICAgICAgICBvcHJvdC53cml0ZUxpc3RCZWdpbihuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVExpc3Qob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTY0LCBzdHJ1Y3QubWV0YS5zaXplKCkpKTsKLSAgICAgICAgICAgIGZvciAobG9uZyBfaXRlcjM2NSA6IHN0cnVjdC5tZXRhKQorICAgICAgICAgICAgZm9yIChsb25nIF9pdGVyNTAzIDogc3RydWN0Lm1ldGEpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG9wcm90LndyaXRlSTY0KF9pdGVyMzY1KTsKKyAgICAgICAgICAgICAgb3Byb3Qud3JpdGVJNjQoX2l0ZXI1MDMpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgb3Byb3Qud3JpdGVMaXN0RW5kKCk7CiAgICAgICAgICAgfQpAQCAtMTEyMCwxMCArMTIzNSwxMCBAQAogICAgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihTQ0hFRFVMRVJfTUVUQV9GSUVMRF9ERVNDKTsKICAgICAgICAgICB7CiAgICAgICAgICAgICBvcHJvdC53cml0ZU1hcEJlZ2luKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORywgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCBzdHJ1Y3Quc2NoZWR1bGVyX21ldGEuc2l6ZSgpKSk7Ci0gICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gX2l0ZXIzNjYgOiBzdHJ1Y3Quc2NoZWR1bGVyX21ldGEuZW50cnlTZXQoKSkKKyAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBfaXRlcjUwNCA6IHN0cnVjdC5zY2hlZHVsZXJfbWV0YS5lbnRyeVNldCgpKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhfaXRlcjM2Ni5nZXRLZXkoKSk7Ci0gICAgICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKF9pdGVyMzY2LmdldFZhbHVlKCkpOworICAgICAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhfaXRlcjUwNC5nZXRLZXkoKSk7CisgICAgICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKF9pdGVyNTA0LmdldFZhbHVlKCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgb3Byb3Qud3JpdGVNYXBFbmQoKTsKICAgICAgICAgICB9CkBAIC0xMTQyLDYgKzEyNTcsMjEgQEAKICAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CiAgICAgICAgIH0KICAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QucmVzb3VyY2VzX21hcCAhPSBudWxsKSB7CisgICAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X3Jlc291cmNlc19tYXAoKSkgeworICAgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihSRVNPVVJDRVNfTUFQX0ZJRUxEX0RFU0MpOworICAgICAgICAgIHsKKyAgICAgICAgICAgIG9wcm90LndyaXRlTWFwQmVnaW4obmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5ET1VCTEUsIHN0cnVjdC5yZXNvdXJjZXNfbWFwLnNpemUoKSkpOworICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBEb3VibGU+IF9pdGVyNTA1IDogc3RydWN0LnJlc291cmNlc19tYXAuZW50cnlTZXQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoX2l0ZXI1MDUuZ2V0S2V5KCkpOworICAgICAgICAgICAgICBvcHJvdC53cml0ZURvdWJsZShfaXRlcjUwNS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9wcm90LndyaXRlTWFwRW5kKCk7CisgICAgICAgICAgfQorICAgICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICAgICAgfQorICAgICAgfQogICAgICAgb3Byb3Qud3JpdGVGaWVsZFN0b3AoKTsKICAgICAgIG9wcm90LndyaXRlU3RydWN0RW5kKCk7CiAgICAgfQpAQCAtMTE4MCwzNSArMTMxMCwzOCBAQAogICAgICAgaWYgKHN0cnVjdC5pc19zZXRfdmVyc2lvbigpKSB7CiAgICAgICAgIG9wdGlvbmFscy5zZXQoNSk7CiAgICAgICB9Ci0gICAgICBvcHJvdC53cml0ZUJpdFNldChvcHRpb25hbHMsIDYpOworICAgICAgaWYgKHN0cnVjdC5pc19zZXRfcmVzb3VyY2VzX21hcCgpKSB7CisgICAgICAgIG9wdGlvbmFscy5zZXQoNik7CisgICAgICB9CisgICAgICBvcHJvdC53cml0ZUJpdFNldChvcHRpb25hbHMsIDcpOwogICAgICAgaWYgKHN0cnVjdC5pc19zZXRfYXNzaWdubWVudF9pZCgpKSB7CiAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKHN0cnVjdC5hc3NpZ25tZW50X2lkKTsKICAgICAgIH0KICAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X3VzZWRfcG9ydHMoKSkgewogICAgICAgICB7CiAgICAgICAgICAgb3Byb3Qud3JpdGVJMzIoc3RydWN0LnVzZWRfcG9ydHMuc2l6ZSgpKTsKLSAgICAgICAgICBmb3IgKGxvbmcgX2l0ZXIzNjcgOiBzdHJ1Y3QudXNlZF9wb3J0cykKKyAgICAgICAgICBmb3IgKGxvbmcgX2l0ZXI1MDYgOiBzdHJ1Y3QudXNlZF9wb3J0cykKICAgICAgICAgICB7Ci0gICAgICAgICAgICBvcHJvdC53cml0ZUk2NChfaXRlcjM2Nyk7CisgICAgICAgICAgICBvcHJvdC53cml0ZUk2NChfaXRlcjUwNik7CiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICB9CiAgICAgICBpZiAoc3RydWN0LmlzX3NldF9tZXRhKCkpIHsKICAgICAgICAgewogICAgICAgICAgIG9wcm90LndyaXRlSTMyKHN0cnVjdC5tZXRhLnNpemUoKSk7Ci0gICAgICAgICAgZm9yIChsb25nIF9pdGVyMzY4IDogc3RydWN0Lm1ldGEpCisgICAgICAgICAgZm9yIChsb25nIF9pdGVyNTA3IDogc3RydWN0Lm1ldGEpCiAgICAgICAgICAgewotICAgICAgICAgICAgb3Byb3Qud3JpdGVJNjQoX2l0ZXIzNjgpOworICAgICAgICAgICAgb3Byb3Qud3JpdGVJNjQoX2l0ZXI1MDcpOwogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgfQogICAgICAgaWYgKHN0cnVjdC5pc19zZXRfc2NoZWR1bGVyX21ldGEoKSkgewogICAgICAgICB7CiAgICAgICAgICAgb3Byb3Qud3JpdGVJMzIoc3RydWN0LnNjaGVkdWxlcl9tZXRhLnNpemUoKSk7Ci0gICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IF9pdGVyMzY5IDogc3RydWN0LnNjaGVkdWxlcl9tZXRhLmVudHJ5U2V0KCkpCisgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IF9pdGVyNTA4IDogc3RydWN0LnNjaGVkdWxlcl9tZXRhLmVudHJ5U2V0KCkpCiAgICAgICAgICAgewotICAgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoX2l0ZXIzNjkuZ2V0S2V5KCkpOwotICAgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoX2l0ZXIzNjkuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhfaXRlcjUwOC5nZXRLZXkoKSk7CisgICAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhfaXRlcjUwOC5nZXRWYWx1ZSgpKTsKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgIH0KQEAgLTEyMTgsNiArMTM1MSwxNiBAQAogICAgICAgaWYgKHN0cnVjdC5pc19zZXRfdmVyc2lvbigpKSB7CiAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKHN0cnVjdC52ZXJzaW9uKTsKICAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X3Jlc291cmNlc19tYXAoKSkgeworICAgICAgICB7CisgICAgICAgICAgb3Byb3Qud3JpdGVJMzIoc3RydWN0LnJlc291cmNlc19tYXAuc2l6ZSgpKTsKKyAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIERvdWJsZT4gX2l0ZXI1MDkgOiBzdHJ1Y3QucmVzb3VyY2VzX21hcC5lbnRyeVNldCgpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKF9pdGVyNTA5LmdldEtleSgpKTsKKyAgICAgICAgICAgIG9wcm90LndyaXRlRG91YmxlKF9pdGVyNTA5LmdldFZhbHVlKCkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMTIyNyw0OCArMTM3MCw0OCBAQAogICAgICAgc3RydWN0LnNldF90aW1lX3NlY3NfaXNTZXQodHJ1ZSk7CiAgICAgICBzdHJ1Y3QuaG9zdG5hbWUgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CiAgICAgICBzdHJ1Y3Quc2V0X2hvc3RuYW1lX2lzU2V0KHRydWUpOwotICAgICAgQml0U2V0IGluY29taW5nID0gaXByb3QucmVhZEJpdFNldCg2KTsKKyAgICAgIEJpdFNldCBpbmNvbWluZyA9IGlwcm90LnJlYWRCaXRTZXQoNyk7CiAgICAgICBpZiAoaW5jb21pbmcuZ2V0KDApKSB7CiAgICAgICAgIHN0cnVjdC5hc3NpZ25tZW50X2lkID0gaXByb3QucmVhZFN0cmluZygpOwogICAgICAgICBzdHJ1Y3Quc2V0X2Fzc2lnbm1lbnRfaWRfaXNTZXQodHJ1ZSk7CiAgICAgICB9CiAgICAgICBpZiAoaW5jb21pbmcuZ2V0KDEpKSB7CiAgICAgICAgIHsKLSAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTGlzdCBfbGlzdDM3MCA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTGlzdChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JNjQsIGlwcm90LnJlYWRJMzIoKSk7Ci0gICAgICAgICAgc3RydWN0LnVzZWRfcG9ydHMgPSBuZXcgQXJyYXlMaXN0PExvbmc+KF9saXN0MzcwLnNpemUpOwotICAgICAgICAgIGxvbmcgX2VsZW0zNzE7Ci0gICAgICAgICAgZm9yIChpbnQgX2kzNzIgPSAwOyBfaTM3MiA8IF9saXN0MzcwLnNpemU7ICsrX2kzNzIpCisgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVExpc3QgX2xpc3Q1MTAgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVExpc3Qob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTY0LCBpcHJvdC5yZWFkSTMyKCkpOworICAgICAgICAgIHN0cnVjdC51c2VkX3BvcnRzID0gbmV3IEFycmF5TGlzdDxMb25nPihfbGlzdDUxMC5zaXplKTsKKyAgICAgICAgICBsb25nIF9lbGVtNTExOworICAgICAgICAgIGZvciAoaW50IF9pNTEyID0gMDsgX2k1MTIgPCBfbGlzdDUxMC5zaXplOyArK19pNTEyKQogICAgICAgICAgIHsKLSAgICAgICAgICAgIF9lbGVtMzcxID0gaXByb3QucmVhZEk2NCgpOwotICAgICAgICAgICAgc3RydWN0LnVzZWRfcG9ydHMuYWRkKF9lbGVtMzcxKTsKKyAgICAgICAgICAgIF9lbGVtNTExID0gaXByb3QucmVhZEk2NCgpOworICAgICAgICAgICAgc3RydWN0LnVzZWRfcG9ydHMuYWRkKF9lbGVtNTExKTsKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgc3RydWN0LnNldF91c2VkX3BvcnRzX2lzU2V0KHRydWUpOwogICAgICAgfQogICAgICAgaWYgKGluY29taW5nLmdldCgyKSkgewogICAgICAgICB7Ci0gICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVExpc3QgX2xpc3QzNzMgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVExpc3Qob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTY0LCBpcHJvdC5yZWFkSTMyKCkpOwotICAgICAgICAgIHN0cnVjdC5tZXRhID0gbmV3IEFycmF5TGlzdDxMb25nPihfbGlzdDM3My5zaXplKTsKLSAgICAgICAgICBsb25nIF9lbGVtMzc0OwotICAgICAgICAgIGZvciAoaW50IF9pMzc1ID0gMDsgX2kzNzUgPCBfbGlzdDM3My5zaXplOyArK19pMzc1KQorICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRMaXN0IF9saXN0NTEzID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRMaXN0KG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkk2NCwgaXByb3QucmVhZEkzMigpKTsKKyAgICAgICAgICBzdHJ1Y3QubWV0YSA9IG5ldyBBcnJheUxpc3Q8TG9uZz4oX2xpc3Q1MTMuc2l6ZSk7CisgICAgICAgICAgbG9uZyBfZWxlbTUxNDsKKyAgICAgICAgICBmb3IgKGludCBfaTUxNSA9IDA7IF9pNTE1IDwgX2xpc3Q1MTMuc2l6ZTsgKytfaTUxNSkKICAgICAgICAgICB7Ci0gICAgICAgICAgICBfZWxlbTM3NCA9IGlwcm90LnJlYWRJNjQoKTsKLSAgICAgICAgICAgIHN0cnVjdC5tZXRhLmFkZChfZWxlbTM3NCk7CisgICAgICAgICAgICBfZWxlbTUxNCA9IGlwcm90LnJlYWRJNjQoKTsKKyAgICAgICAgICAgIHN0cnVjdC5tZXRhLmFkZChfZWxlbTUxNCk7CiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHN0cnVjdC5zZXRfbWV0YV9pc1NldCh0cnVlKTsKICAgICAgIH0KICAgICAgIGlmIChpbmNvbWluZy5nZXQoMykpIHsKICAgICAgICAgewotICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgX21hcDM3NiA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORywgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCBpcHJvdC5yZWFkSTMyKCkpOwotICAgICAgICAgIHN0cnVjdC5zY2hlZHVsZXJfbWV0YSA9IG5ldyBIYXNoTWFwPFN0cmluZyxTdHJpbmc+KDIqX21hcDM3Ni5zaXplKTsKLSAgICAgICAgICBTdHJpbmcgX2tleTM3NzsKLSAgICAgICAgICBTdHJpbmcgX3ZhbDM3ODsKLSAgICAgICAgICBmb3IgKGludCBfaTM3OSA9IDA7IF9pMzc5IDwgX21hcDM3Ni5zaXplOyArK19pMzc5KQorICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgX21hcDUxNiA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORywgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCBpcHJvdC5yZWFkSTMyKCkpOworICAgICAgICAgIHN0cnVjdC5zY2hlZHVsZXJfbWV0YSA9IG5ldyBIYXNoTWFwPFN0cmluZyxTdHJpbmc+KDIqX21hcDUxNi5zaXplKTsKKyAgICAgICAgICBTdHJpbmcgX2tleTUxNzsKKyAgICAgICAgICBTdHJpbmcgX3ZhbDUxODsKKyAgICAgICAgICBmb3IgKGludCBfaTUxOSA9IDA7IF9pNTE5IDwgX21hcDUxNi5zaXplOyArK19pNTE5KQogICAgICAgICAgIHsKLSAgICAgICAgICAgIF9rZXkzNzcgPSBpcHJvdC5yZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgICBfdmFsMzc4ID0gaXByb3QucmVhZFN0cmluZygpOwotICAgICAgICAgICAgc3RydWN0LnNjaGVkdWxlcl9tZXRhLnB1dChfa2V5Mzc3LCBfdmFsMzc4KTsKKyAgICAgICAgICAgIF9rZXk1MTcgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICBfdmFsNTE4ID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICAgICAgc3RydWN0LnNjaGVkdWxlcl9tZXRhLnB1dChfa2V5NTE3LCBfdmFsNTE4KTsKICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgc3RydWN0LnNldF9zY2hlZHVsZXJfbWV0YV9pc1NldCh0cnVlKTsKQEAgLTEyODEsNiArMTQyNCwyMSBAQAogICAgICAgICBzdHJ1Y3QudmVyc2lvbiA9IGlwcm90LnJlYWRTdHJpbmcoKTsKICAgICAgICAgc3RydWN0LnNldF92ZXJzaW9uX2lzU2V0KHRydWUpOwogICAgICAgfQorICAgICAgaWYgKGluY29taW5nLmdldCg2KSkgeworICAgICAgICB7CisgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwNTIwID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5ET1VCTEUsIGlwcm90LnJlYWRJMzIoKSk7CisgICAgICAgICAgc3RydWN0LnJlc291cmNlc19tYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsRG91YmxlPigyKl9tYXA1MjAuc2l6ZSk7CisgICAgICAgICAgU3RyaW5nIF9rZXk1MjE7CisgICAgICAgICAgZG91YmxlIF92YWw1MjI7CisgICAgICAgICAgZm9yIChpbnQgX2k1MjMgPSAwOyBfaTUyMyA8IF9tYXA1MjAuc2l6ZTsgKytfaTUyMykKKyAgICAgICAgICB7CisgICAgICAgICAgICBfa2V5NTIxID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICAgICAgX3ZhbDUyMiA9IGlwcm90LnJlYWREb3VibGUoKTsKKyAgICAgICAgICAgIHN0cnVjdC5yZXNvdXJjZXNfbWFwLnB1dChfa2V5NTIxLCBfdmFsNTIyKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RydWN0LnNldF9yZXNvdXJjZXNfbWFwX2lzU2V0KHRydWUpOworICAgICAgfQogICAgIH0KICAgfQogCmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL1N1cGVydmlzb3JTdW1tYXJ5LmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL1N1cGVydmlzb3JTdW1tYXJ5LmphdmEKaW5kZXggOWJkZjlmNy4uOGJkZjI4OSAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9TdXBlcnZpc29yU3VtbWFyeS5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvU3VwZXJ2aXNvclN1bW1hcnkuamF2YQpAQCAtMTYsNyArMTYsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIC8qKgotICogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4yKQorICogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4zKQogICoKICAqIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkcKICAqICBAZ2VuZXJhdGVkCkBAIC01MSw3ICs1MSw3IEBACiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKIEBTdXBwcmVzc1dhcm5pbmdzKHsiY2FzdCIsICJyYXd0eXBlcyIsICJzZXJpYWwiLCAidW5jaGVja2VkIn0pCi1AR2VuZXJhdGVkKHZhbHVlID0gIkF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMikiLCBkYXRlID0gIjIwMTUtNC0yMCIpCitAR2VuZXJhdGVkKHZhbHVlID0gIkF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMykiKQogcHVibGljIGNsYXNzIFN1cGVydmlzb3JTdW1tYXJ5IGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2U8U3VwZXJ2aXNvclN1bW1hcnksIFN1cGVydmlzb3JTdW1tYXJ5Ll9GaWVsZHM+LCBqYXZhLmlvLlNlcmlhbGl6YWJsZSwgQ2xvbmVhYmxlLCBDb21wYXJhYmxlPFN1cGVydmlzb3JTdW1tYXJ5PiB7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QgU1RSVUNUX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdCgiU3VwZXJ2aXNvclN1bW1hcnkiKTsKIApAQCAtNjEsNiArNjEsOSBAQAogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgTlVNX1VTRURfV09SS0VSU19GSUVMRF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCgibnVtX3VzZWRfd29ya2VycyIsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkkzMiwgKHNob3J0KTQpOwogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgU1VQRVJWSVNPUl9JRF9GSUVMRF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCgic3VwZXJ2aXNvcl9pZCIsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORywgKHNob3J0KTUpOwogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgVkVSU0lPTl9GSUVMRF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCgidmVyc2lvbiIsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORywgKHNob3J0KTYpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgVE9UQUxfUkVTT1VSQ0VTX0ZJRUxEX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkKCJ0b3RhbF9yZXNvdXJjZXMiLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5NQVAsIChzaG9ydCk3KTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIFVTRURfTUVNX0ZJRUxEX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkKCJ1c2VkX21lbSIsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkRPVUJMRSwgKHNob3J0KTgpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgVVNFRF9DUFVfRklFTERfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQoInVzZWRfY3B1Iiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuRE9VQkxFLCAoc2hvcnQpOSk7CiAKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPENsYXNzPD8gZXh0ZW5kcyBJU2NoZW1lPiwgU2NoZW1lRmFjdG9yeT4gc2NoZW1lcyA9IG5ldyBIYXNoTWFwPENsYXNzPD8gZXh0ZW5kcyBJU2NoZW1lPiwgU2NoZW1lRmFjdG9yeT4oKTsKICAgc3RhdGljIHsKQEAgLTc0LDYgKzc3LDkgQEAKICAgcHJpdmF0ZSBpbnQgbnVtX3VzZWRfd29ya2VyczsgLy8gcmVxdWlyZWQKICAgcHJpdmF0ZSBTdHJpbmcgc3VwZXJ2aXNvcl9pZDsgLy8gcmVxdWlyZWQKICAgcHJpdmF0ZSBTdHJpbmcgdmVyc2lvbjsgLy8gb3B0aW9uYWwKKyAgcHJpdmF0ZSBNYXA8U3RyaW5nLERvdWJsZT4gdG90YWxfcmVzb3VyY2VzOyAvLyBvcHRpb25hbAorICBwcml2YXRlIGRvdWJsZSB1c2VkX21lbTsgLy8gb3B0aW9uYWwKKyAgcHJpdmF0ZSBkb3VibGUgdXNlZF9jcHU7IC8vIG9wdGlvbmFsCiAKICAgLyoqIFRoZSBzZXQgb2YgZmllbGRzIHRoaXMgc3RydWN0IGNvbnRhaW5zLCBhbG9uZyB3aXRoIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9yIGZpbmRpbmcgYW5kIG1hbmlwdWxhdGluZyB0aGVtLiAqLwogICBwdWJsaWMgZW51bSBfRmllbGRzIGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkSWRFbnVtIHsKQEAgLTgyLDcgKzg4LDEwIEBACiAgICAgTlVNX1dPUktFUlMoKHNob3J0KTMsICJudW1fd29ya2VycyIpLAogICAgIE5VTV9VU0VEX1dPUktFUlMoKHNob3J0KTQsICJudW1fdXNlZF93b3JrZXJzIiksCiAgICAgU1VQRVJWSVNPUl9JRCgoc2hvcnQpNSwgInN1cGVydmlzb3JfaWQiKSwKLSAgICBWRVJTSU9OKChzaG9ydCk2LCAidmVyc2lvbiIpOworICAgIFZFUlNJT04oKHNob3J0KTYsICJ2ZXJzaW9uIiksCisgICAgVE9UQUxfUkVTT1VSQ0VTKChzaG9ydCk3LCAidG90YWxfcmVzb3VyY2VzIiksCisgICAgVVNFRF9NRU0oKHNob3J0KTgsICJ1c2VkX21lbSIpLAorICAgIFVTRURfQ1BVKChzaG9ydCk5LCAidXNlZF9jcHUiKTsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsIF9GaWVsZHM+IGJ5TmFtZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgX0ZpZWxkcz4oKTsKIApAQCAtMTA5LDYgKzExOCwxMiBAQAogICAgICAgICAgIHJldHVybiBTVVBFUlZJU09SX0lEOwogICAgICAgICBjYXNlIDY6IC8vIFZFUlNJT04KICAgICAgICAgICByZXR1cm4gVkVSU0lPTjsKKyAgICAgICAgY2FzZSA3OiAvLyBUT1RBTF9SRVNPVVJDRVMKKyAgICAgICAgICByZXR1cm4gVE9UQUxfUkVTT1VSQ0VTOworICAgICAgICBjYXNlIDg6IC8vIFVTRURfTUVNCisgICAgICAgICAgcmV0dXJuIFVTRURfTUVNOworICAgICAgICBjYXNlIDk6IC8vIFVTRURfQ1BVCisgICAgICAgICAgcmV0dXJuIFVTRURfQ1BVOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgfQpAQCAtMTUyLDggKzE2NywxMCBAQAogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgX19VUFRJTUVfU0VDU19JU1NFVF9JRCA9IDA7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBfX05VTV9XT1JLRVJTX0lTU0VUX0lEID0gMTsKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IF9fTlVNX1VTRURfV09SS0VSU19JU1NFVF9JRCA9IDI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBfX1VTRURfTUVNX0lTU0VUX0lEID0gMzsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IF9fVVNFRF9DUFVfSVNTRVRfSUQgPSA0OwogICBwcml2YXRlIGJ5dGUgX19pc3NldF9iaXRmaWVsZCA9IDA7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIF9GaWVsZHMgb3B0aW9uYWxzW10gPSB7X0ZpZWxkcy5WRVJTSU9OfTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgX0ZpZWxkcyBvcHRpb25hbHNbXSA9IHtfRmllbGRzLlZFUlNJT04sX0ZpZWxkcy5UT1RBTF9SRVNPVVJDRVMsX0ZpZWxkcy5VU0VEX01FTSxfRmllbGRzLlVTRURfQ1BVfTsKICAgcHVibGljIHN0YXRpYyBmaW5hbCBNYXA8X0ZpZWxkcywgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGE+IG1ldGFEYXRhTWFwOwogICBzdGF0aWMgewogICAgIE1hcDxfRmllbGRzLCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YT4gdG1wTWFwID0gbmV3IEVudW1NYXA8X0ZpZWxkcywgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGE+KF9GaWVsZHMuY2xhc3MpOwpAQCAtMTY5LDYgKzE4NiwxNCBAQAogICAgICAgICBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkVmFsdWVNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcpKSk7CiAgICAgdG1wTWFwLnB1dChfRmllbGRzLlZFUlNJT04sIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YSgidmVyc2lvbiIsIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZFJlcXVpcmVtZW50VHlwZS5PUFRJT05BTCwgCiAgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRWYWx1ZU1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORykpKTsKKyAgICB0bXBNYXAucHV0KF9GaWVsZHMuVE9UQUxfUkVTT1VSQ0VTLCBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEoInRvdGFsX3Jlc291cmNlcyIsIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZFJlcXVpcmVtZW50VHlwZS5PUFRJT05BTCwgCisgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuTWFwTWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTUFQLCAKKyAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRWYWx1ZU1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORyksIAorICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZFZhbHVlTWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuRE9VQkxFKSkpKTsKKyAgICB0bXBNYXAucHV0KF9GaWVsZHMuVVNFRF9NRU0sIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YSgidXNlZF9tZW0iLCBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRSZXF1aXJlbWVudFR5cGUuT1BUSU9OQUwsIAorICAgICAgICBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkVmFsdWVNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5ET1VCTEUpKSk7CisgICAgdG1wTWFwLnB1dChfRmllbGRzLlVTRURfQ1BVLCBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEoInVzZWRfY3B1Iiwgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLk9QVElPTkFMLCAKKyAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZFZhbHVlTWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuRE9VQkxFKSkpOwogICAgIG1ldGFEYXRhTWFwID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKHRtcE1hcCk7CiAgICAgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEuYWRkU3RydWN0TWV0YURhdGFNYXAoU3VwZXJ2aXNvclN1bW1hcnkuY2xhc3MsIG1ldGFEYXRhTWFwKTsKICAgfQpAQCAtMjEzLDYgKzIzOCwxMiBAQAogICAgIGlmIChvdGhlci5pc19zZXRfdmVyc2lvbigpKSB7CiAgICAgICB0aGlzLnZlcnNpb24gPSBvdGhlci52ZXJzaW9uOwogICAgIH0KKyAgICBpZiAob3RoZXIuaXNfc2V0X3RvdGFsX3Jlc291cmNlcygpKSB7CisgICAgICBNYXA8U3RyaW5nLERvdWJsZT4gX190aGlzX190b3RhbF9yZXNvdXJjZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsRG91YmxlPihvdGhlci50b3RhbF9yZXNvdXJjZXMpOworICAgICAgdGhpcy50b3RhbF9yZXNvdXJjZXMgPSBfX3RoaXNfX3RvdGFsX3Jlc291cmNlczsKKyAgICB9CisgICAgdGhpcy51c2VkX21lbSA9IG90aGVyLnVzZWRfbWVtOworICAgIHRoaXMudXNlZF9jcHUgPSBvdGhlci51c2VkX2NwdTsKICAgfQogCiAgIHB1YmxpYyBTdXBlcnZpc29yU3VtbWFyeSBkZWVwQ29weSgpIHsKQEAgLTIzMSw2ICsyNjIsMTEgQEAKICAgICB0aGlzLnN1cGVydmlzb3JfaWQgPSBudWxsOwogICAgIHRoaXMudmVyc2lvbiA9ICJWRVJTSU9OX05PVF9QUk9WSURFRCI7CiAKKyAgICB0aGlzLnRvdGFsX3Jlc291cmNlcyA9IG51bGw7CisgICAgc2V0X3VzZWRfbWVtX2lzU2V0KGZhbHNlKTsKKyAgICB0aGlzLnVzZWRfbWVtID0gMC4wOworICAgIHNldF91c2VkX2NwdV9pc1NldChmYWxzZSk7CisgICAgdGhpcy51c2VkX2NwdSA9IDAuMDsKICAgfQogCiAgIHB1YmxpYyBTdHJpbmcgZ2V0X2hvc3QoKSB7CkBAIC0zNjgsNiArNDA0LDg0IEBACiAgICAgfQogICB9CiAKKyAgcHVibGljIGludCBnZXRfdG90YWxfcmVzb3VyY2VzX3NpemUoKSB7CisgICAgcmV0dXJuICh0aGlzLnRvdGFsX3Jlc291cmNlcyA9PSBudWxsKSA/IDAgOiB0aGlzLnRvdGFsX3Jlc291cmNlcy5zaXplKCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBwdXRfdG9fdG90YWxfcmVzb3VyY2VzKFN0cmluZyBrZXksIGRvdWJsZSB2YWwpIHsKKyAgICBpZiAodGhpcy50b3RhbF9yZXNvdXJjZXMgPT0gbnVsbCkgeworICAgICAgdGhpcy50b3RhbF9yZXNvdXJjZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsRG91YmxlPigpOworICAgIH0KKyAgICB0aGlzLnRvdGFsX3Jlc291cmNlcy5wdXQoa2V5LCB2YWwpOworICB9CisKKyAgcHVibGljIE1hcDxTdHJpbmcsRG91YmxlPiBnZXRfdG90YWxfcmVzb3VyY2VzKCkgeworICAgIHJldHVybiB0aGlzLnRvdGFsX3Jlc291cmNlczsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF90b3RhbF9yZXNvdXJjZXMoTWFwPFN0cmluZyxEb3VibGU+IHRvdGFsX3Jlc291cmNlcykgeworICAgIHRoaXMudG90YWxfcmVzb3VyY2VzID0gdG90YWxfcmVzb3VyY2VzOworICB9CisKKyAgcHVibGljIHZvaWQgdW5zZXRfdG90YWxfcmVzb3VyY2VzKCkgeworICAgIHRoaXMudG90YWxfcmVzb3VyY2VzID0gbnVsbDsKKyAgfQorCisgIC8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgdG90YWxfcmVzb3VyY2VzIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLworICBwdWJsaWMgYm9vbGVhbiBpc19zZXRfdG90YWxfcmVzb3VyY2VzKCkgeworICAgIHJldHVybiB0aGlzLnRvdGFsX3Jlc291cmNlcyAhPSBudWxsOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X3RvdGFsX3Jlc291cmNlc19pc1NldChib29sZWFuIHZhbHVlKSB7CisgICAgaWYgKCF2YWx1ZSkgeworICAgICAgdGhpcy50b3RhbF9yZXNvdXJjZXMgPSBudWxsOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBkb3VibGUgZ2V0X3VzZWRfbWVtKCkgeworICAgIHJldHVybiB0aGlzLnVzZWRfbWVtOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X3VzZWRfbWVtKGRvdWJsZSB1c2VkX21lbSkgeworICAgIHRoaXMudXNlZF9tZW0gPSB1c2VkX21lbTsKKyAgICBzZXRfdXNlZF9tZW1faXNTZXQodHJ1ZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB1bnNldF91c2VkX21lbSgpIHsKKyAgICBfX2lzc2V0X2JpdGZpZWxkID0gRW5jb2RpbmdVdGlscy5jbGVhckJpdChfX2lzc2V0X2JpdGZpZWxkLCBfX1VTRURfTUVNX0lTU0VUX0lEKTsKKyAgfQorCisgIC8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgdXNlZF9tZW0gaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgIHB1YmxpYyBib29sZWFuIGlzX3NldF91c2VkX21lbSgpIHsKKyAgICByZXR1cm4gRW5jb2RpbmdVdGlscy50ZXN0Qml0KF9faXNzZXRfYml0ZmllbGQsIF9fVVNFRF9NRU1fSVNTRVRfSUQpOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X3VzZWRfbWVtX2lzU2V0KGJvb2xlYW4gdmFsdWUpIHsKKyAgICBfX2lzc2V0X2JpdGZpZWxkID0gRW5jb2RpbmdVdGlscy5zZXRCaXQoX19pc3NldF9iaXRmaWVsZCwgX19VU0VEX01FTV9JU1NFVF9JRCwgdmFsdWUpOworICB9CisKKyAgcHVibGljIGRvdWJsZSBnZXRfdXNlZF9jcHUoKSB7CisgICAgcmV0dXJuIHRoaXMudXNlZF9jcHU7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfdXNlZF9jcHUoZG91YmxlIHVzZWRfY3B1KSB7CisgICAgdGhpcy51c2VkX2NwdSA9IHVzZWRfY3B1OworICAgIHNldF91c2VkX2NwdV9pc1NldCh0cnVlKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHVuc2V0X3VzZWRfY3B1KCkgeworICAgIF9faXNzZXRfYml0ZmllbGQgPSBFbmNvZGluZ1V0aWxzLmNsZWFyQml0KF9faXNzZXRfYml0ZmllbGQsIF9fVVNFRF9DUFVfSVNTRVRfSUQpOworICB9CisKKyAgLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCB1c2VkX2NwdSBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNfc2V0X3VzZWRfY3B1KCkgeworICAgIHJldHVybiBFbmNvZGluZ1V0aWxzLnRlc3RCaXQoX19pc3NldF9iaXRmaWVsZCwgX19VU0VEX0NQVV9JU1NFVF9JRCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfdXNlZF9jcHVfaXNTZXQoYm9vbGVhbiB2YWx1ZSkgeworICAgIF9faXNzZXRfYml0ZmllbGQgPSBFbmNvZGluZ1V0aWxzLnNldEJpdChfX2lzc2V0X2JpdGZpZWxkLCBfX1VTRURfQ1BVX0lTU0VUX0lELCB2YWx1ZSk7CisgIH0KKwogICBwdWJsaWMgdm9pZCBzZXRGaWVsZFZhbHVlKF9GaWVsZHMgZmllbGQsIE9iamVjdCB2YWx1ZSkgewogICAgIHN3aXRjaCAoZmllbGQpIHsKICAgICBjYXNlIEhPU1Q6CkBAIC00MTgsNiArNTMyLDMwIEBACiAgICAgICB9CiAgICAgICBicmVhazsKIAorICAgIGNhc2UgVE9UQUxfUkVTT1VSQ0VTOgorICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgdW5zZXRfdG90YWxfcmVzb3VyY2VzKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzZXRfdG90YWxfcmVzb3VyY2VzKChNYXA8U3RyaW5nLERvdWJsZT4pdmFsdWUpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFVTRURfTUVNOgorICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgdW5zZXRfdXNlZF9tZW0oKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNldF91c2VkX21lbSgoRG91YmxlKXZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBVU0VEX0NQVToKKyAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgIHVuc2V0X3VzZWRfY3B1KCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzZXRfdXNlZF9jcHUoKERvdWJsZSl2YWx1ZSk7CisgICAgICB9CisgICAgICBicmVhazsKKwogICAgIH0KICAgfQogCkBAIC00MjcsMTMgKzU2NSwxMyBAQAogICAgICAgcmV0dXJuIGdldF9ob3N0KCk7CiAKICAgICBjYXNlIFVQVElNRV9TRUNTOgotICAgICAgcmV0dXJuIEludGVnZXIudmFsdWVPZihnZXRfdXB0aW1lX3NlY3MoKSk7CisgICAgICByZXR1cm4gZ2V0X3VwdGltZV9zZWNzKCk7CiAKICAgICBjYXNlIE5VTV9XT1JLRVJTOgotICAgICAgcmV0dXJuIEludGVnZXIudmFsdWVPZihnZXRfbnVtX3dvcmtlcnMoKSk7CisgICAgICByZXR1cm4gZ2V0X251bV93b3JrZXJzKCk7CiAKICAgICBjYXNlIE5VTV9VU0VEX1dPUktFUlM6Ci0gICAgICByZXR1cm4gSW50ZWdlci52YWx1ZU9mKGdldF9udW1fdXNlZF93b3JrZXJzKCkpOworICAgICAgcmV0dXJuIGdldF9udW1fdXNlZF93b3JrZXJzKCk7CiAKICAgICBjYXNlIFNVUEVSVklTT1JfSUQ6CiAgICAgICByZXR1cm4gZ2V0X3N1cGVydmlzb3JfaWQoKTsKQEAgLTQ0MSw2ICs1NzksMTUgQEAKICAgICBjYXNlIFZFUlNJT046CiAgICAgICByZXR1cm4gZ2V0X3ZlcnNpb24oKTsKIAorICAgIGNhc2UgVE9UQUxfUkVTT1VSQ0VTOgorICAgICAgcmV0dXJuIGdldF90b3RhbF9yZXNvdXJjZXMoKTsKKworICAgIGNhc2UgVVNFRF9NRU06CisgICAgICByZXR1cm4gZ2V0X3VzZWRfbWVtKCk7CisKKyAgICBjYXNlIFVTRURfQ1BVOgorICAgICAgcmV0dXJuIGdldF91c2VkX2NwdSgpOworCiAgICAgfQogICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKICAgfQpAQCAtNDY0LDYgKzYxMSwxMiBAQAogICAgICAgcmV0dXJuIGlzX3NldF9zdXBlcnZpc29yX2lkKCk7CiAgICAgY2FzZSBWRVJTSU9OOgogICAgICAgcmV0dXJuIGlzX3NldF92ZXJzaW9uKCk7CisgICAgY2FzZSBUT1RBTF9SRVNPVVJDRVM6CisgICAgICByZXR1cm4gaXNfc2V0X3RvdGFsX3Jlc291cmNlcygpOworICAgIGNhc2UgVVNFRF9NRU06CisgICAgICByZXR1cm4gaXNfc2V0X3VzZWRfbWVtKCk7CisgICAgY2FzZSBVU0VEX0NQVToKKyAgICAgIHJldHVybiBpc19zZXRfdXNlZF9jcHUoKTsKICAgICB9CiAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwogICB9CkBAIC01MzUsNiArNjg4LDMzIEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKKyAgICBib29sZWFuIHRoaXNfcHJlc2VudF90b3RhbF9yZXNvdXJjZXMgPSB0cnVlICYmIHRoaXMuaXNfc2V0X3RvdGFsX3Jlc291cmNlcygpOworICAgIGJvb2xlYW4gdGhhdF9wcmVzZW50X3RvdGFsX3Jlc291cmNlcyA9IHRydWUgJiYgdGhhdC5pc19zZXRfdG90YWxfcmVzb3VyY2VzKCk7CisgICAgaWYgKHRoaXNfcHJlc2VudF90b3RhbF9yZXNvdXJjZXMgfHwgdGhhdF9wcmVzZW50X3RvdGFsX3Jlc291cmNlcykgeworICAgICAgaWYgKCEodGhpc19wcmVzZW50X3RvdGFsX3Jlc291cmNlcyAmJiB0aGF0X3ByZXNlbnRfdG90YWxfcmVzb3VyY2VzKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKCF0aGlzLnRvdGFsX3Jlc291cmNlcy5lcXVhbHModGhhdC50b3RhbF9yZXNvdXJjZXMpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbGVhbiB0aGlzX3ByZXNlbnRfdXNlZF9tZW0gPSB0cnVlICYmIHRoaXMuaXNfc2V0X3VzZWRfbWVtKCk7CisgICAgYm9vbGVhbiB0aGF0X3ByZXNlbnRfdXNlZF9tZW0gPSB0cnVlICYmIHRoYXQuaXNfc2V0X3VzZWRfbWVtKCk7CisgICAgaWYgKHRoaXNfcHJlc2VudF91c2VkX21lbSB8fCB0aGF0X3ByZXNlbnRfdXNlZF9tZW0pIHsKKyAgICAgIGlmICghKHRoaXNfcHJlc2VudF91c2VkX21lbSAmJiB0aGF0X3ByZXNlbnRfdXNlZF9tZW0pKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBpZiAodGhpcy51c2VkX21lbSAhPSB0aGF0LnVzZWRfbWVtKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbGVhbiB0aGlzX3ByZXNlbnRfdXNlZF9jcHUgPSB0cnVlICYmIHRoaXMuaXNfc2V0X3VzZWRfY3B1KCk7CisgICAgYm9vbGVhbiB0aGF0X3ByZXNlbnRfdXNlZF9jcHUgPSB0cnVlICYmIHRoYXQuaXNfc2V0X3VzZWRfY3B1KCk7CisgICAgaWYgKHRoaXNfcHJlc2VudF91c2VkX2NwdSB8fCB0aGF0X3ByZXNlbnRfdXNlZF9jcHUpIHsKKyAgICAgIGlmICghKHRoaXNfcHJlc2VudF91c2VkX2NwdSAmJiB0aGF0X3ByZXNlbnRfdXNlZF9jcHUpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBpZiAodGhpcy51c2VkX2NwdSAhPSB0aGF0LnVzZWRfY3B1KQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCiAgICAgcmV0dXJuIHRydWU7CiAgIH0KIApAQCAtNTcyLDYgKzc1MiwyMSBAQAogICAgIGlmIChwcmVzZW50X3ZlcnNpb24pCiAgICAgICBsaXN0LmFkZCh2ZXJzaW9uKTsKIAorICAgIGJvb2xlYW4gcHJlc2VudF90b3RhbF9yZXNvdXJjZXMgPSB0cnVlICYmIChpc19zZXRfdG90YWxfcmVzb3VyY2VzKCkpOworICAgIGxpc3QuYWRkKHByZXNlbnRfdG90YWxfcmVzb3VyY2VzKTsKKyAgICBpZiAocHJlc2VudF90b3RhbF9yZXNvdXJjZXMpCisgICAgICBsaXN0LmFkZCh0b3RhbF9yZXNvdXJjZXMpOworCisgICAgYm9vbGVhbiBwcmVzZW50X3VzZWRfbWVtID0gdHJ1ZSAmJiAoaXNfc2V0X3VzZWRfbWVtKCkpOworICAgIGxpc3QuYWRkKHByZXNlbnRfdXNlZF9tZW0pOworICAgIGlmIChwcmVzZW50X3VzZWRfbWVtKQorICAgICAgbGlzdC5hZGQodXNlZF9tZW0pOworCisgICAgYm9vbGVhbiBwcmVzZW50X3VzZWRfY3B1ID0gdHJ1ZSAmJiAoaXNfc2V0X3VzZWRfY3B1KCkpOworICAgIGxpc3QuYWRkKHByZXNlbnRfdXNlZF9jcHUpOworICAgIGlmIChwcmVzZW50X3VzZWRfY3B1KQorICAgICAgbGlzdC5hZGQodXNlZF9jcHUpOworCiAgICAgcmV0dXJuIGxpc3QuaGFzaENvZGUoKTsKICAgfQogCkBAIC02NDMsNiArODM4LDM2IEBACiAgICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKICAgICAgIH0KICAgICB9CisgICAgbGFzdENvbXBhcmlzb24gPSBCb29sZWFuLnZhbHVlT2YoaXNfc2V0X3RvdGFsX3Jlc291cmNlcygpKS5jb21wYXJlVG8ob3RoZXIuaXNfc2V0X3RvdGFsX3Jlc291cmNlcygpKTsKKyAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgIH0KKyAgICBpZiAoaXNfc2V0X3RvdGFsX3Jlc291cmNlcygpKSB7CisgICAgICBsYXN0Q29tcGFyaXNvbiA9IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvbXBhcmVUbyh0aGlzLnRvdGFsX3Jlc291cmNlcywgb3RoZXIudG90YWxfcmVzb3VyY2VzKTsKKyAgICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICAgIH0KKyAgICB9CisgICAgbGFzdENvbXBhcmlzb24gPSBCb29sZWFuLnZhbHVlT2YoaXNfc2V0X3VzZWRfbWVtKCkpLmNvbXBhcmVUbyhvdGhlci5pc19zZXRfdXNlZF9tZW0oKSk7CisgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICB9CisgICAgaWYgKGlzX3NldF91c2VkX21lbSgpKSB7CisgICAgICBsYXN0Q29tcGFyaXNvbiA9IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvbXBhcmVUbyh0aGlzLnVzZWRfbWVtLCBvdGhlci51c2VkX21lbSk7CisgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICB9CisgICAgfQorICAgIGxhc3RDb21wYXJpc29uID0gQm9vbGVhbi52YWx1ZU9mKGlzX3NldF91c2VkX2NwdSgpKS5jb21wYXJlVG8ob3RoZXIuaXNfc2V0X3VzZWRfY3B1KCkpOworICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgfQorICAgIGlmIChpc19zZXRfdXNlZF9jcHUoKSkgeworICAgICAgbGFzdENvbXBhcmlzb24gPSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy51c2VkX2NwdSwgb3RoZXIudXNlZF9jcHUpOworICAgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgICAgfQorICAgIH0KICAgICByZXR1cm4gMDsKICAgfQogCkBAIC03MDAsNiArOTI1LDI4IEBACiAgICAgICB9CiAgICAgICBmaXJzdCA9IGZhbHNlOwogICAgIH0KKyAgICBpZiAoaXNfc2V0X3RvdGFsX3Jlc291cmNlcygpKSB7CisgICAgICBpZiAoIWZpcnN0KSBzYi5hcHBlbmQoIiwgIik7CisgICAgICBzYi5hcHBlbmQoInRvdGFsX3Jlc291cmNlczoiKTsKKyAgICAgIGlmICh0aGlzLnRvdGFsX3Jlc291cmNlcyA9PSBudWxsKSB7CisgICAgICAgIHNiLmFwcGVuZCgibnVsbCIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2IuYXBwZW5kKHRoaXMudG90YWxfcmVzb3VyY2VzKTsKKyAgICAgIH0KKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfQorICAgIGlmIChpc19zZXRfdXNlZF9tZW0oKSkgeworICAgICAgaWYgKCFmaXJzdCkgc2IuYXBwZW5kKCIsICIpOworICAgICAgc2IuYXBwZW5kKCJ1c2VkX21lbToiKTsKKyAgICAgIHNiLmFwcGVuZCh0aGlzLnVzZWRfbWVtKTsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfQorICAgIGlmIChpc19zZXRfdXNlZF9jcHUoKSkgeworICAgICAgaWYgKCFmaXJzdCkgc2IuYXBwZW5kKCIsICIpOworICAgICAgc2IuYXBwZW5kKCJ1c2VkX2NwdToiKTsKKyAgICAgIHNiLmFwcGVuZCh0aGlzLnVzZWRfY3B1KTsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfQogICAgIHNiLmFwcGVuZCgiKSIpOwogICAgIHJldHVybiBzYi50b1N0cmluZygpOwogICB9CkBAIC04MTMsNiArMTA2MCw0MiBAQAogICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSA3OiAvLyBUT1RBTF9SRVNPVVJDRVMKKyAgICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLk1BUCkgeworICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwODIgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKTsKKyAgICAgICAgICAgICAgICBzdHJ1Y3QudG90YWxfcmVzb3VyY2VzID0gbmV3IEhhc2hNYXA8U3RyaW5nLERvdWJsZT4oMipfbWFwODIuc2l6ZSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIF9rZXk4MzsKKyAgICAgICAgICAgICAgICBkb3VibGUgX3ZhbDg0OworICAgICAgICAgICAgICAgIGZvciAoaW50IF9pODUgPSAwOyBfaTg1IDwgX21hcDgyLnNpemU7ICsrX2k4NSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBfa2V5ODMgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICBfdmFsODQgPSBpcHJvdC5yZWFkRG91YmxlKCk7CisgICAgICAgICAgICAgICAgICBzdHJ1Y3QudG90YWxfcmVzb3VyY2VzLnB1dChfa2V5ODMsIF92YWw4NCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlwcm90LnJlYWRNYXBFbmQoKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBzdHJ1Y3Quc2V0X3RvdGFsX3Jlc291cmNlc19pc1NldCh0cnVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7IAorICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSA4OiAvLyBVU0VEX01FTQorICAgICAgICAgICAgaWYgKHNjaGVtZUZpZWxkLnR5cGUgPT0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuRE9VQkxFKSB7CisgICAgICAgICAgICAgIHN0cnVjdC51c2VkX21lbSA9IGlwcm90LnJlYWREb3VibGUoKTsKKyAgICAgICAgICAgICAgc3RydWN0LnNldF91c2VkX21lbV9pc1NldCh0cnVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7IAorICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSA5OiAvLyBVU0VEX0NQVQorICAgICAgICAgICAgaWYgKHNjaGVtZUZpZWxkLnR5cGUgPT0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuRE9VQkxFKSB7CisgICAgICAgICAgICAgIHN0cnVjdC51c2VkX2NwdSA9IGlwcm90LnJlYWREb3VibGUoKTsKKyAgICAgICAgICAgICAgc3RydWN0LnNldF91c2VkX2NwdV9pc1NldCh0cnVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7IAorICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgc2NoZW1lRmllbGQudHlwZSk7CiAgICAgICAgIH0KQEAgLTg1Miw2ICsxMTM1LDMxIEBACiAgICAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOwogICAgICAgICB9CiAgICAgICB9CisgICAgICBpZiAoc3RydWN0LnRvdGFsX3Jlc291cmNlcyAhPSBudWxsKSB7CisgICAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X3RvdGFsX3Jlc291cmNlcygpKSB7CisgICAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKFRPVEFMX1JFU09VUkNFU19GSUVMRF9ERVNDKTsKKyAgICAgICAgICB7CisgICAgICAgICAgICBvcHJvdC53cml0ZU1hcEJlZ2luKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORywgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuRE9VQkxFLCBzdHJ1Y3QudG90YWxfcmVzb3VyY2VzLnNpemUoKSkpOworICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBEb3VibGU+IF9pdGVyODYgOiBzdHJ1Y3QudG90YWxfcmVzb3VyY2VzLmVudHJ5U2V0KCkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKF9pdGVyODYuZ2V0S2V5KCkpOworICAgICAgICAgICAgICBvcHJvdC53cml0ZURvdWJsZShfaXRlcjg2LmdldFZhbHVlKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3Byb3Qud3JpdGVNYXBFbmQoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF91c2VkX21lbSgpKSB7CisgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihVU0VEX01FTV9GSUVMRF9ERVNDKTsKKyAgICAgICAgb3Byb3Qud3JpdGVEb3VibGUoc3RydWN0LnVzZWRfbWVtKTsKKyAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5pc19zZXRfdXNlZF9jcHUoKSkgeworICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oVVNFRF9DUFVfRklFTERfREVTQyk7CisgICAgICAgIG9wcm90LndyaXRlRG91YmxlKHN0cnVjdC51c2VkX2NwdSk7CisgICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICAgIH0KICAgICAgIG9wcm90LndyaXRlRmllbGRTdG9wKCk7CiAgICAgICBvcHJvdC53cml0ZVN0cnVjdEVuZCgpOwogICAgIH0KQEAgLTg3OCwxMCArMTE4NiwzNSBAQAogICAgICAgaWYgKHN0cnVjdC5pc19zZXRfdmVyc2lvbigpKSB7CiAgICAgICAgIG9wdGlvbmFscy5zZXQoMCk7CiAgICAgICB9Ci0gICAgICBvcHJvdC53cml0ZUJpdFNldChvcHRpb25hbHMsIDEpOworICAgICAgaWYgKHN0cnVjdC5pc19zZXRfdG90YWxfcmVzb3VyY2VzKCkpIHsKKyAgICAgICAgb3B0aW9uYWxzLnNldCgxKTsKKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X3VzZWRfbWVtKCkpIHsKKyAgICAgICAgb3B0aW9uYWxzLnNldCgyKTsKKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X3VzZWRfY3B1KCkpIHsKKyAgICAgICAgb3B0aW9uYWxzLnNldCgzKTsKKyAgICAgIH0KKyAgICAgIG9wcm90LndyaXRlQml0U2V0KG9wdGlvbmFscywgNCk7CiAgICAgICBpZiAoc3RydWN0LmlzX3NldF92ZXJzaW9uKCkpIHsKICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoc3RydWN0LnZlcnNpb24pOwogICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5pc19zZXRfdG90YWxfcmVzb3VyY2VzKCkpIHsKKyAgICAgICAgeworICAgICAgICAgIG9wcm90LndyaXRlSTMyKHN0cnVjdC50b3RhbF9yZXNvdXJjZXMuc2l6ZSgpKTsKKyAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIERvdWJsZT4gX2l0ZXI4NyA6IHN0cnVjdC50b3RhbF9yZXNvdXJjZXMuZW50cnlTZXQoKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhfaXRlcjg3LmdldEtleSgpKTsKKyAgICAgICAgICAgIG9wcm90LndyaXRlRG91YmxlKF9pdGVyODcuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF91c2VkX21lbSgpKSB7CisgICAgICAgIG9wcm90LndyaXRlRG91YmxlKHN0cnVjdC51c2VkX21lbSk7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF91c2VkX2NwdSgpKSB7CisgICAgICAgIG9wcm90LndyaXRlRG91YmxlKHN0cnVjdC51c2VkX2NwdSk7CisgICAgICB9CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC04OTcsMTEgKzEyMzAsMzQgQEAKICAgICAgIHN0cnVjdC5zZXRfbnVtX3VzZWRfd29ya2Vyc19pc1NldCh0cnVlKTsKICAgICAgIHN0cnVjdC5zdXBlcnZpc29yX2lkID0gaXByb3QucmVhZFN0cmluZygpOwogICAgICAgc3RydWN0LnNldF9zdXBlcnZpc29yX2lkX2lzU2V0KHRydWUpOwotICAgICAgQml0U2V0IGluY29taW5nID0gaXByb3QucmVhZEJpdFNldCgxKTsKKyAgICAgIEJpdFNldCBpbmNvbWluZyA9IGlwcm90LnJlYWRCaXRTZXQoNCk7CiAgICAgICBpZiAoaW5jb21pbmcuZ2V0KDApKSB7CiAgICAgICAgIHN0cnVjdC52ZXJzaW9uID0gaXByb3QucmVhZFN0cmluZygpOwogICAgICAgICBzdHJ1Y3Quc2V0X3ZlcnNpb25faXNTZXQodHJ1ZSk7CiAgICAgICB9CisgICAgICBpZiAoaW5jb21pbmcuZ2V0KDEpKSB7CisgICAgICAgIHsKKyAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwIF9tYXA4OCA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORywgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuRE9VQkxFLCBpcHJvdC5yZWFkSTMyKCkpOworICAgICAgICAgIHN0cnVjdC50b3RhbF9yZXNvdXJjZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsRG91YmxlPigyKl9tYXA4OC5zaXplKTsKKyAgICAgICAgICBTdHJpbmcgX2tleTg5OworICAgICAgICAgIGRvdWJsZSBfdmFsOTA7CisgICAgICAgICAgZm9yIChpbnQgX2k5MSA9IDA7IF9pOTEgPCBfbWFwODguc2l6ZTsgKytfaTkxKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIF9rZXk4OSA9IGlwcm90LnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgIF92YWw5MCA9IGlwcm90LnJlYWREb3VibGUoKTsKKyAgICAgICAgICAgIHN0cnVjdC50b3RhbF9yZXNvdXJjZXMucHV0KF9rZXk4OSwgX3ZhbDkwKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RydWN0LnNldF90b3RhbF9yZXNvdXJjZXNfaXNTZXQodHJ1ZSk7CisgICAgICB9CisgICAgICBpZiAoaW5jb21pbmcuZ2V0KDIpKSB7CisgICAgICAgIHN0cnVjdC51c2VkX21lbSA9IGlwcm90LnJlYWREb3VibGUoKTsKKyAgICAgICAgc3RydWN0LnNldF91c2VkX21lbV9pc1NldCh0cnVlKTsKKyAgICAgIH0KKyAgICAgIGlmIChpbmNvbWluZy5nZXQoMykpIHsKKyAgICAgICAgc3RydWN0LnVzZWRfY3B1ID0gaXByb3QucmVhZERvdWJsZSgpOworICAgICAgICBzdHJ1Y3Quc2V0X3VzZWRfY3B1X2lzU2V0KHRydWUpOworICAgICAgfQogICAgIH0KICAgfQogCmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL1RocmlmdFNlcmlhbGl6ZWRPYmplY3QuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvVGhyaWZ0U2VyaWFsaXplZE9iamVjdC5qYXZhCmluZGV4IDY4MTA2NjkuLjgxMGJlYTggMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvVGhyaWZ0U2VyaWFsaXplZE9iamVjdC5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvVGhyaWZ0U2VyaWFsaXplZE9iamVjdC5qYXZhCkBAIC0xNiw3ICsxNiw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogLyoqCi0gKiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjIpCisgKiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjMpCiAgKgogICogRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lORwogICogIEBnZW5lcmF0ZWQKQEAgLTUxLDcgKzUxLDcgQEAKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAogQFN1cHByZXNzV2FybmluZ3MoeyJjYXN0IiwgInJhd3R5cGVzIiwgInNlcmlhbCIsICJ1bmNoZWNrZWQifSkKLUBHZW5lcmF0ZWQodmFsdWUgPSAiQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4yKSIsIGRhdGUgPSAiMjAxNS00LTEwIikKK0BHZW5lcmF0ZWQodmFsdWUgPSAiQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4zKSIpCiBwdWJsaWMgY2xhc3MgVGhyaWZ0U2VyaWFsaXplZE9iamVjdCBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlPFRocmlmdFNlcmlhbGl6ZWRPYmplY3QsIFRocmlmdFNlcmlhbGl6ZWRPYmplY3QuX0ZpZWxkcz4sIGphdmEuaW8uU2VyaWFsaXphYmxlLCBDbG9uZWFibGUsIENvbXBhcmFibGU8VGhyaWZ0U2VyaWFsaXplZE9iamVjdD4gewogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0IFNUUlVDVF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QoIlRocmlmdFNlcmlhbGl6ZWRPYmplY3QiKTsKIApkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9Ub3BvbG9neUFjdGlvbk9wdGlvbnMuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvVG9wb2xvZ3lBY3Rpb25PcHRpb25zLmphdmEKaW5kZXggYzZmZWEwNS4uNmU2ZDcwNCAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9Ub3BvbG9neUFjdGlvbk9wdGlvbnMuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL1RvcG9sb2d5QWN0aW9uT3B0aW9ucy5qYXZhCkBAIC0xNiw3ICsxNiw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogLyoqCi0gKiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjIpCisgKiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjMpCiAgKgogICogRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lORwogICogIEBnZW5lcmF0ZWQKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvVG9wb2xvZ3lIaXN0b3J5SW5mby5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9Ub3BvbG9neUhpc3RvcnlJbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NlZDQ1NgotLS0gL2Rldi9udWxsCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvVG9wb2xvZ3lIaXN0b3J5SW5mby5qYXZhCkBAIC0wLDAgKzEsNDYxIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLyoqCisgKiBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjMpCisgKgorICogRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lORworICogIEBnZW5lcmF0ZWQKKyAqLworcGFja2FnZSBiYWNrdHlwZS5zdG9ybS5nZW5lcmF0ZWQ7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuSVNjaGVtZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuU2NoZW1lRmFjdG9yeTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuU3RhbmRhcmRTY2hlbWU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zY2hlbWUuVHVwbGVTY2hlbWU7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR1cGxlUHJvdG9jb2w7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LkVuY29kaW5nVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5hc3luYy5Bc3luY01ldGhvZENhbGxiYWNrOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNlcnZlci5BYnN0cmFjdE5vbmJsb2NraW5nU2VydmVyLio7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5FbnVtTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5CaXRTZXQ7CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uR2VuZXJhdGVkOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiY2FzdCIsICJyYXd0eXBlcyIsICJzZXJpYWwiLCAidW5jaGVja2VkIn0pCitAR2VuZXJhdGVkKHZhbHVlID0gIkF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMykiKQorcHVibGljIGNsYXNzIFRvcG9sb2d5SGlzdG9yeUluZm8gaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZTxUb3BvbG9neUhpc3RvcnlJbmZvLCBUb3BvbG9neUhpc3RvcnlJbmZvLl9GaWVsZHM+LCBqYXZhLmlvLlNlcmlhbGl6YWJsZSwgQ2xvbmVhYmxlLCBDb21wYXJhYmxlPFRvcG9sb2d5SGlzdG9yeUluZm8+IHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdCBTVFJVQ1RfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0KCJUb3BvbG9neUhpc3RvcnlJbmZvIik7CisKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIFRPUE9fSURTX0ZJRUxEX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkKCJ0b3BvX2lkcyIsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkxJU1QsIChzaG9ydCkxKTsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8Q2xhc3M8PyBleHRlbmRzIElTY2hlbWU+LCBTY2hlbWVGYWN0b3J5PiBzY2hlbWVzID0gbmV3IEhhc2hNYXA8Q2xhc3M8PyBleHRlbmRzIElTY2hlbWU+LCBTY2hlbWVGYWN0b3J5PigpOworICBzdGF0aWMgeworICAgIHNjaGVtZXMucHV0KFN0YW5kYXJkU2NoZW1lLmNsYXNzLCBuZXcgVG9wb2xvZ3lIaXN0b3J5SW5mb1N0YW5kYXJkU2NoZW1lRmFjdG9yeSgpKTsKKyAgICBzY2hlbWVzLnB1dChUdXBsZVNjaGVtZS5jbGFzcywgbmV3IFRvcG9sb2d5SGlzdG9yeUluZm9UdXBsZVNjaGVtZUZhY3RvcnkoKSk7CisgIH0KKworICBwcml2YXRlIExpc3Q8U3RyaW5nPiB0b3BvX2lkczsgLy8gcmVxdWlyZWQKKworICAvKiogVGhlIHNldCBvZiBmaWVsZHMgdGhpcyBzdHJ1Y3QgY29udGFpbnMsIGFsb25nIHdpdGggY29udmVuaWVuY2UgbWV0aG9kcyBmb3IgZmluZGluZyBhbmQgbWFuaXB1bGF0aW5nIHRoZW0uICovCisgIHB1YmxpYyBlbnVtIF9GaWVsZHMgaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRJZEVudW0geworICAgIFRPUE9fSURTKChzaG9ydCkxLCAidG9wb19pZHMiKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsIF9GaWVsZHM+IGJ5TmFtZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgX0ZpZWxkcz4oKTsKKworICAgIHN0YXRpYyB7CisgICAgICBmb3IgKF9GaWVsZHMgZmllbGQgOiBFbnVtU2V0LmFsbE9mKF9GaWVsZHMuY2xhc3MpKSB7CisgICAgICAgIGJ5TmFtZS5wdXQoZmllbGQuZ2V0RmllbGROYW1lKCksIGZpZWxkKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kIHRoZSBfRmllbGRzIGNvbnN0YW50IHRoYXQgbWF0Y2hlcyBmaWVsZElkLCBvciBudWxsIGlmIGl0cyBub3QgZm91bmQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBfRmllbGRzIGZpbmRCeVRocmlmdElkKGludCBmaWVsZElkKSB7CisgICAgICBzd2l0Y2goZmllbGRJZCkgeworICAgICAgICBjYXNlIDE6IC8vIFRPUE9fSURTCisgICAgICAgICAgcmV0dXJuIFRPUE9fSURTOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgdGhlIF9GaWVsZHMgY29uc3RhbnQgdGhhdCBtYXRjaGVzIGZpZWxkSWQsIHRocm93aW5nIGFuIGV4Y2VwdGlvbgorICAgICAqIGlmIGl0IGlzIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIF9GaWVsZHMgZmluZEJ5VGhyaWZ0SWRPclRocm93KGludCBmaWVsZElkKSB7CisgICAgICBfRmllbGRzIGZpZWxkcyA9IGZpbmRCeVRocmlmdElkKGZpZWxkSWQpOworICAgICAgaWYgKGZpZWxkcyA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJGaWVsZCAiICsgZmllbGRJZCArICIgZG9lc24ndCBleGlzdCEiKTsKKyAgICAgIHJldHVybiBmaWVsZHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCB0aGUgX0ZpZWxkcyBjb25zdGFudCB0aGF0IG1hdGNoZXMgbmFtZSwgb3IgbnVsbCBpZiBpdHMgbm90IGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgX0ZpZWxkcyBmaW5kQnlOYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICByZXR1cm4gYnlOYW1lLmdldChuYW1lKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIHNob3J0IF90aHJpZnRJZDsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBfZmllbGROYW1lOworCisgICAgX0ZpZWxkcyhzaG9ydCB0aHJpZnRJZCwgU3RyaW5nIGZpZWxkTmFtZSkgeworICAgICAgX3RocmlmdElkID0gdGhyaWZ0SWQ7CisgICAgICBfZmllbGROYW1lID0gZmllbGROYW1lOworICAgIH0KKworICAgIHB1YmxpYyBzaG9ydCBnZXRUaHJpZnRGaWVsZElkKCkgeworICAgICAgcmV0dXJuIF90aHJpZnRJZDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEZpZWxkTmFtZSgpIHsKKyAgICAgIHJldHVybiBfZmllbGROYW1lOworICAgIH0KKyAgfQorCisgIC8vIGlzc2V0IGlkIGFzc2lnbm1lbnRzCisgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPiBtZXRhRGF0YU1hcDsKKyAgc3RhdGljIHsKKyAgICBNYXA8X0ZpZWxkcywgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGE+IHRtcE1hcCA9IG5ldyBFbnVtTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPihfRmllbGRzLmNsYXNzKTsKKyAgICB0bXBNYXAucHV0KF9GaWVsZHMuVE9QT19JRFMsIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YSgidG9wb19pZHMiLCBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRSZXF1aXJlbWVudFR5cGUuREVGQVVMVCwgCisgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuTGlzdE1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkxJU1QsIAorICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZFZhbHVlTWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HKSkpKTsKKyAgICBtZXRhRGF0YU1hcCA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcCh0bXBNYXApOworICAgIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhLmFkZFN0cnVjdE1ldGFEYXRhTWFwKFRvcG9sb2d5SGlzdG9yeUluZm8uY2xhc3MsIG1ldGFEYXRhTWFwKTsKKyAgfQorCisgIHB1YmxpYyBUb3BvbG9neUhpc3RvcnlJbmZvKCkgeworICB9CisKKyAgcHVibGljIFRvcG9sb2d5SGlzdG9yeUluZm8oCisgICAgTGlzdDxTdHJpbmc+IHRvcG9faWRzKQorICB7CisgICAgdGhpcygpOworICAgIHRoaXMudG9wb19pZHMgPSB0b3BvX2lkczsKKyAgfQorCisgIC8qKgorICAgKiBQZXJmb3JtcyBhIGRlZXAgY29weSBvbiA8aT5vdGhlcjwvaT4uCisgICAqLworICBwdWJsaWMgVG9wb2xvZ3lIaXN0b3J5SW5mbyhUb3BvbG9neUhpc3RvcnlJbmZvIG90aGVyKSB7CisgICAgaWYgKG90aGVyLmlzX3NldF90b3BvX2lkcygpKSB7CisgICAgICBMaXN0PFN0cmluZz4gX190aGlzX190b3BvX2lkcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihvdGhlci50b3BvX2lkcyk7CisgICAgICB0aGlzLnRvcG9faWRzID0gX190aGlzX190b3BvX2lkczsKKyAgICB9CisgIH0KKworICBwdWJsaWMgVG9wb2xvZ3lIaXN0b3J5SW5mbyBkZWVwQ29weSgpIHsKKyAgICByZXR1cm4gbmV3IFRvcG9sb2d5SGlzdG9yeUluZm8odGhpcyk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgdGhpcy50b3BvX2lkcyA9IG51bGw7CisgIH0KKworICBwdWJsaWMgaW50IGdldF90b3BvX2lkc19zaXplKCkgeworICAgIHJldHVybiAodGhpcy50b3BvX2lkcyA9PSBudWxsKSA/IDAgOiB0aGlzLnRvcG9faWRzLnNpemUoKTsKKyAgfQorCisgIHB1YmxpYyBqYXZhLnV0aWwuSXRlcmF0b3I8U3RyaW5nPiBnZXRfdG9wb19pZHNfaXRlcmF0b3IoKSB7CisgICAgcmV0dXJuICh0aGlzLnRvcG9faWRzID09IG51bGwpID8gbnVsbCA6IHRoaXMudG9wb19pZHMuaXRlcmF0b3IoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIGFkZF90b190b3BvX2lkcyhTdHJpbmcgZWxlbSkgeworICAgIGlmICh0aGlzLnRvcG9faWRzID09IG51bGwpIHsKKyAgICAgIHRoaXMudG9wb19pZHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICB9CisgICAgdGhpcy50b3BvX2lkcy5hZGQoZWxlbSk7CisgIH0KKworICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldF90b3BvX2lkcygpIHsKKyAgICByZXR1cm4gdGhpcy50b3BvX2lkczsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF90b3BvX2lkcyhMaXN0PFN0cmluZz4gdG9wb19pZHMpIHsKKyAgICB0aGlzLnRvcG9faWRzID0gdG9wb19pZHM7CisgIH0KKworICBwdWJsaWMgdm9pZCB1bnNldF90b3BvX2lkcygpIHsKKyAgICB0aGlzLnRvcG9faWRzID0gbnVsbDsKKyAgfQorCisgIC8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgdG9wb19pZHMgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgIHB1YmxpYyBib29sZWFuIGlzX3NldF90b3BvX2lkcygpIHsKKyAgICByZXR1cm4gdGhpcy50b3BvX2lkcyAhPSBudWxsOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X3RvcG9faWRzX2lzU2V0KGJvb2xlYW4gdmFsdWUpIHsKKyAgICBpZiAoIXZhbHVlKSB7CisgICAgICB0aGlzLnRvcG9faWRzID0gbnVsbDsKKyAgICB9CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRGaWVsZFZhbHVlKF9GaWVsZHMgZmllbGQsIE9iamVjdCB2YWx1ZSkgeworICAgIHN3aXRjaCAoZmllbGQpIHsKKyAgICBjYXNlIFRPUE9fSURTOgorICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgdW5zZXRfdG9wb19pZHMoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNldF90b3BvX2lkcygoTGlzdDxTdHJpbmc+KXZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgfQorICB9CisKKyAgcHVibGljIE9iamVjdCBnZXRGaWVsZFZhbHVlKF9GaWVsZHMgZmllbGQpIHsKKyAgICBzd2l0Y2ggKGZpZWxkKSB7CisgICAgY2FzZSBUT1BPX0lEUzoKKyAgICAgIHJldHVybiBnZXRfdG9wb19pZHMoKTsKKworICAgIH0KKyAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgIH0KKworICAvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkIGNvcnJlc3BvbmRpbmcgdG8gZmllbGRJRCBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNTZXQoX0ZpZWxkcyBmaWVsZCkgeworICAgIGlmIChmaWVsZCA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgc3dpdGNoIChmaWVsZCkgeworICAgIGNhc2UgVE9QT19JRFM6CisgICAgICByZXR1cm4gaXNfc2V0X3RvcG9faWRzKCk7CisgICAgfQorICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IHRoYXQpIHsKKyAgICBpZiAodGhhdCA9PSBudWxsKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmICh0aGF0IGluc3RhbmNlb2YgVG9wb2xvZ3lIaXN0b3J5SW5mbykKKyAgICAgIHJldHVybiB0aGlzLmVxdWFscygoVG9wb2xvZ3lIaXN0b3J5SW5mbyl0aGF0KTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoVG9wb2xvZ3lIaXN0b3J5SW5mbyB0aGF0KSB7CisgICAgaWYgKHRoYXQgPT0gbnVsbCkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGJvb2xlYW4gdGhpc19wcmVzZW50X3RvcG9faWRzID0gdHJ1ZSAmJiB0aGlzLmlzX3NldF90b3BvX2lkcygpOworICAgIGJvb2xlYW4gdGhhdF9wcmVzZW50X3RvcG9faWRzID0gdHJ1ZSAmJiB0aGF0LmlzX3NldF90b3BvX2lkcygpOworICAgIGlmICh0aGlzX3ByZXNlbnRfdG9wb19pZHMgfHwgdGhhdF9wcmVzZW50X3RvcG9faWRzKSB7CisgICAgICBpZiAoISh0aGlzX3ByZXNlbnRfdG9wb19pZHMgJiYgdGhhdF9wcmVzZW50X3RvcG9faWRzKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKCF0aGlzLnRvcG9faWRzLmVxdWFscyh0aGF0LnRvcG9faWRzKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgTGlzdDxPYmplY3Q+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKKworICAgIGJvb2xlYW4gcHJlc2VudF90b3BvX2lkcyA9IHRydWUgJiYgKGlzX3NldF90b3BvX2lkcygpKTsKKyAgICBsaXN0LmFkZChwcmVzZW50X3RvcG9faWRzKTsKKyAgICBpZiAocHJlc2VudF90b3BvX2lkcykKKyAgICAgIGxpc3QuYWRkKHRvcG9faWRzKTsKKworICAgIHJldHVybiBsaXN0Lmhhc2hDb2RlKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGludCBjb21wYXJlVG8oVG9wb2xvZ3lIaXN0b3J5SW5mbyBvdGhlcikgeworICAgIGlmICghZ2V0Q2xhc3MoKS5lcXVhbHMob3RoZXIuZ2V0Q2xhc3MoKSkpIHsKKyAgICAgIHJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKS5jb21wYXJlVG8ob3RoZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgIH0KKworICAgIGludCBsYXN0Q29tcGFyaXNvbiA9IDA7CisKKyAgICBsYXN0Q29tcGFyaXNvbiA9IEJvb2xlYW4udmFsdWVPZihpc19zZXRfdG9wb19pZHMoKSkuY29tcGFyZVRvKG90aGVyLmlzX3NldF90b3BvX2lkcygpKTsKKyAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgIH0KKyAgICBpZiAoaXNfc2V0X3RvcG9faWRzKCkpIHsKKyAgICAgIGxhc3RDb21wYXJpc29uID0gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29tcGFyZVRvKHRoaXMudG9wb19pZHMsIG90aGVyLnRvcG9faWRzKTsKKyAgICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7CisgIH0KKworICBwdWJsaWMgX0ZpZWxkcyBmaWVsZEZvcklkKGludCBmaWVsZElkKSB7CisgICAgcmV0dXJuIF9GaWVsZHMuZmluZEJ5VGhyaWZ0SWQoZmllbGRJZCk7CisgIH0KKworICBwdWJsaWMgdm9pZCByZWFkKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBpcHJvdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgIHNjaGVtZXMuZ2V0KGlwcm90LmdldFNjaGVtZSgpKS5nZXRTY2hlbWUoKS5yZWFkKGlwcm90LCB0aGlzKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHdyaXRlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBvcHJvdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgIHNjaGVtZXMuZ2V0KG9wcm90LmdldFNjaGVtZSgpKS5nZXRTY2hlbWUoKS53cml0ZShvcHJvdCwgdGhpcyk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoIlRvcG9sb2d5SGlzdG9yeUluZm8oIik7CisgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7CisKKyAgICBzYi5hcHBlbmQoInRvcG9faWRzOiIpOworICAgIGlmICh0aGlzLnRvcG9faWRzID09IG51bGwpIHsKKyAgICAgIHNiLmFwcGVuZCgibnVsbCIpOworICAgIH0gZWxzZSB7CisgICAgICBzYi5hcHBlbmQodGhpcy50b3BvX2lkcyk7CisgICAgfQorICAgIGZpcnN0ID0gZmFsc2U7CisgICAgc2IuYXBwZW5kKCIpIik7CisgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAvLyBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzCisgICAgLy8gY2hlY2sgZm9yIHN1Yi1zdHJ1Y3QgdmFsaWRpdHkKKyAgfQorCisgIHByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgd3JpdGUobmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRDb21wYWN0UHJvdG9jb2wobmV3IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5USU9TdHJlYW1UcmFuc3BvcnQob3V0KSkpOworICAgIH0gY2F0Y2ggKG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24gdGUpIHsKKyAgICAgIHRocm93IG5ldyBqYXZhLmlvLklPRXhjZXB0aW9uKHRlKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgcmVhZE9iamVjdChqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtIGluKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIHJlYWQobmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRDb21wYWN0UHJvdG9jb2wobmV3IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5USU9TdHJlYW1UcmFuc3BvcnQoaW4pKSk7CisgICAgfSBjYXRjaCAob3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB0ZSkgeworICAgICAgdGhyb3cgbmV3IGphdmEuaW8uSU9FeGNlcHRpb24odGUpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRvcG9sb2d5SGlzdG9yeUluZm9TdGFuZGFyZFNjaGVtZUZhY3RvcnkgaW1wbGVtZW50cyBTY2hlbWVGYWN0b3J5IHsKKyAgICBwdWJsaWMgVG9wb2xvZ3lIaXN0b3J5SW5mb1N0YW5kYXJkU2NoZW1lIGdldFNjaGVtZSgpIHsKKyAgICAgIHJldHVybiBuZXcgVG9wb2xvZ3lIaXN0b3J5SW5mb1N0YW5kYXJkU2NoZW1lKCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVG9wb2xvZ3lIaXN0b3J5SW5mb1N0YW5kYXJkU2NoZW1lIGV4dGVuZHMgU3RhbmRhcmRTY2hlbWU8VG9wb2xvZ3lIaXN0b3J5SW5mbz4geworCisgICAgcHVibGljIHZvaWQgcmVhZChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgaXByb3QsIFRvcG9sb2d5SGlzdG9yeUluZm8gc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgc2NoZW1lRmllbGQ7CisgICAgICBpcHJvdC5yZWFkU3RydWN0QmVnaW4oKTsKKyAgICAgIHdoaWxlICh0cnVlKQorICAgICAgeworICAgICAgICBzY2hlbWVGaWVsZCA9IGlwcm90LnJlYWRGaWVsZEJlZ2luKCk7CisgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUT1ApIHsgCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChzY2hlbWVGaWVsZC5pZCkgeworICAgICAgICAgIGNhc2UgMTogLy8gVE9QT19JRFMKKyAgICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkxJU1QpIHsKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRMaXN0IF9saXN0Njk4ID0gaXByb3QucmVhZExpc3RCZWdpbigpOworICAgICAgICAgICAgICAgIHN0cnVjdC50b3BvX2lkcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihfbGlzdDY5OC5zaXplKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgX2VsZW02OTk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgX2k3MDAgPSAwOyBfaTcwMCA8IF9saXN0Njk4LnNpemU7ICsrX2k3MDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgX2VsZW02OTkgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICBzdHJ1Y3QudG9wb19pZHMuYWRkKF9lbGVtNjk5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaXByb3QucmVhZExpc3RFbmQoKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBzdHJ1Y3Quc2V0X3RvcG9faWRzX2lzU2V0KHRydWUpOworICAgICAgICAgICAgfSBlbHNlIHsgCisgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgc2NoZW1lRmllbGQudHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKKyAgICAgICAgfQorICAgICAgICBpcHJvdC5yZWFkRmllbGRFbmQoKTsKKyAgICAgIH0KKyAgICAgIGlwcm90LnJlYWRTdHJ1Y3RFbmQoKTsKKyAgICAgIHN0cnVjdC52YWxpZGF0ZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBvcHJvdCwgVG9wb2xvZ3lIaXN0b3J5SW5mbyBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgIHN0cnVjdC52YWxpZGF0ZSgpOworCisgICAgICBvcHJvdC53cml0ZVN0cnVjdEJlZ2luKFNUUlVDVF9ERVNDKTsKKyAgICAgIGlmIChzdHJ1Y3QudG9wb19pZHMgIT0gbnVsbCkgeworICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oVE9QT19JRFNfRklFTERfREVTQyk7CisgICAgICAgIHsKKyAgICAgICAgICBvcHJvdC53cml0ZUxpc3RCZWdpbihuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVExpc3Qob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCBzdHJ1Y3QudG9wb19pZHMuc2l6ZSgpKSk7CisgICAgICAgICAgZm9yIChTdHJpbmcgX2l0ZXI3MDEgOiBzdHJ1Y3QudG9wb19pZHMpCisgICAgICAgICAgeworICAgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoX2l0ZXI3MDEpOworICAgICAgICAgIH0KKyAgICAgICAgICBvcHJvdC53cml0ZUxpc3RFbmQoKTsKKyAgICAgICAgfQorICAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgICB9CisgICAgICBvcHJvdC53cml0ZUZpZWxkU3RvcCgpOworICAgICAgb3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsKKyAgICB9CisKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRvcG9sb2d5SGlzdG9yeUluZm9UdXBsZVNjaGVtZUZhY3RvcnkgaW1wbGVtZW50cyBTY2hlbWVGYWN0b3J5IHsKKyAgICBwdWJsaWMgVG9wb2xvZ3lIaXN0b3J5SW5mb1R1cGxlU2NoZW1lIGdldFNjaGVtZSgpIHsKKyAgICAgIHJldHVybiBuZXcgVG9wb2xvZ3lIaXN0b3J5SW5mb1R1cGxlU2NoZW1lKCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVG9wb2xvZ3lIaXN0b3J5SW5mb1R1cGxlU2NoZW1lIGV4dGVuZHMgVHVwbGVTY2hlbWU8VG9wb2xvZ3lIaXN0b3J5SW5mbz4geworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIHByb3QsIFRvcG9sb2d5SGlzdG9yeUluZm8gc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICBUVHVwbGVQcm90b2NvbCBvcHJvdCA9IChUVHVwbGVQcm90b2NvbCkgcHJvdDsKKyAgICAgIEJpdFNldCBvcHRpb25hbHMgPSBuZXcgQml0U2V0KCk7CisgICAgICBpZiAoc3RydWN0LmlzX3NldF90b3BvX2lkcygpKSB7CisgICAgICAgIG9wdGlvbmFscy5zZXQoMCk7CisgICAgICB9CisgICAgICBvcHJvdC53cml0ZUJpdFNldChvcHRpb25hbHMsIDEpOworICAgICAgaWYgKHN0cnVjdC5pc19zZXRfdG9wb19pZHMoKSkgeworICAgICAgICB7CisgICAgICAgICAgb3Byb3Qud3JpdGVJMzIoc3RydWN0LnRvcG9faWRzLnNpemUoKSk7CisgICAgICAgICAgZm9yIChTdHJpbmcgX2l0ZXI3MDIgOiBzdHJ1Y3QudG9wb19pZHMpCisgICAgICAgICAgeworICAgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoX2l0ZXI3MDIpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlYWQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIHByb3QsIFRvcG9sb2d5SGlzdG9yeUluZm8gc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICBUVHVwbGVQcm90b2NvbCBpcHJvdCA9IChUVHVwbGVQcm90b2NvbCkgcHJvdDsKKyAgICAgIEJpdFNldCBpbmNvbWluZyA9IGlwcm90LnJlYWRCaXRTZXQoMSk7CisgICAgICBpZiAoaW5jb21pbmcuZ2V0KDApKSB7CisgICAgICAgIHsKKyAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTGlzdCBfbGlzdDcwMyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTGlzdChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcsIGlwcm90LnJlYWRJMzIoKSk7CisgICAgICAgICAgc3RydWN0LnRvcG9faWRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KF9saXN0NzAzLnNpemUpOworICAgICAgICAgIFN0cmluZyBfZWxlbTcwNDsKKyAgICAgICAgICBmb3IgKGludCBfaTcwNSA9IDA7IF9pNzA1IDwgX2xpc3Q3MDMuc2l6ZTsgKytfaTcwNSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBfZWxlbTcwNCA9IGlwcm90LnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgIHN0cnVjdC50b3BvX2lkcy5hZGQoX2VsZW03MDQpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdHJ1Y3Quc2V0X3RvcG9faWRzX2lzU2V0KHRydWUpOworICAgICAgfQorICAgIH0KKyAgfQorCit9CisKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvVG9wb2xvZ3lJbmZvLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL1RvcG9sb2d5SW5mby5qYXZhCmluZGV4IDZjMmNjNjkuLmJlMWQ3MDYgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvVG9wb2xvZ3lJbmZvLmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9Ub3BvbG9neUluZm8uamF2YQpAQCAtMTYsNyArMTYsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIC8qKgotICogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4yKQorICogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4zKQogICoKICAqIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkcKICAqICBAZ2VuZXJhdGVkCkBAIC01MSw3ICs1MSw3IEBACiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKIEBTdXBwcmVzc1dhcm5pbmdzKHsiY2FzdCIsICJyYXd0eXBlcyIsICJzZXJpYWwiLCAidW5jaGVja2VkIn0pCi1AR2VuZXJhdGVkKHZhbHVlID0gIkF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMikiLCBkYXRlID0gIjIwMTUtOS0zIikKK0BHZW5lcmF0ZWQodmFsdWUgPSAiQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4zKSIpCiBwdWJsaWMgY2xhc3MgVG9wb2xvZ3lJbmZvIGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2U8VG9wb2xvZ3lJbmZvLCBUb3BvbG9neUluZm8uX0ZpZWxkcz4sIGphdmEuaW8uU2VyaWFsaXphYmxlLCBDbG9uZWFibGUsIENvbXBhcmFibGU8VG9wb2xvZ3lJbmZvPiB7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QgU1RSVUNUX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdCgiVG9wb2xvZ3lJbmZvIik7CiAKQEAgLTY1LDYgKzY1LDEyIEBACiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBTQ0hFRF9TVEFUVVNfRklFTERfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQoInNjaGVkX3N0YXR1cyIsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORywgKHNob3J0KTUxMyk7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBPV05FUl9GSUVMRF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCgib3duZXIiLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcsIChzaG9ydCk1MTQpOwogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgUkVQTElDQVRJT05fQ09VTlRfRklFTERfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQoInJlcGxpY2F0aW9uX2NvdW50Iiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTMyLCAoc2hvcnQpNTE1KTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIFJFUVVFU1RFRF9NRU1PTkhFQVBfRklFTERfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQoInJlcXVlc3RlZF9tZW1vbmhlYXAiLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5ET1VCTEUsIChzaG9ydCk1MjEpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgUkVRVUVTVEVEX01FTU9GRkhFQVBfRklFTERfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQoInJlcXVlc3RlZF9tZW1vZmZoZWFwIiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuRE9VQkxFLCAoc2hvcnQpNTIyKTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIFJFUVVFU1RFRF9DUFVfRklFTERfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQoInJlcXVlc3RlZF9jcHUiLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5ET1VCTEUsIChzaG9ydCk1MjMpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgQVNTSUdORURfTUVNT05IRUFQX0ZJRUxEX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkKCJhc3NpZ25lZF9tZW1vbmhlYXAiLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5ET1VCTEUsIChzaG9ydCk1MjQpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgQVNTSUdORURfTUVNT0ZGSEVBUF9GSUVMRF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCgiYXNzaWduZWRfbWVtb2ZmaGVhcCIsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkRPVUJMRSwgKHNob3J0KTUyNSk7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBBU1NJR05FRF9DUFVfRklFTERfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQoImFzc2lnbmVkX2NwdSIsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkRPVUJMRSwgKHNob3J0KTUyNik7CiAKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPENsYXNzPD8gZXh0ZW5kcyBJU2NoZW1lPiwgU2NoZW1lRmFjdG9yeT4gc2NoZW1lcyA9IG5ldyBIYXNoTWFwPENsYXNzPD8gZXh0ZW5kcyBJU2NoZW1lPiwgU2NoZW1lRmFjdG9yeT4oKTsKICAgc3RhdGljIHsKQEAgLTgyLDYgKzg4LDEyIEBACiAgIHByaXZhdGUgU3RyaW5nIHNjaGVkX3N0YXR1czsgLy8gb3B0aW9uYWwKICAgcHJpdmF0ZSBTdHJpbmcgb3duZXI7IC8vIG9wdGlvbmFsCiAgIHByaXZhdGUgaW50IHJlcGxpY2F0aW9uX2NvdW50OyAvLyBvcHRpb25hbAorICBwcml2YXRlIGRvdWJsZSByZXF1ZXN0ZWRfbWVtb25oZWFwOyAvLyBvcHRpb25hbAorICBwcml2YXRlIGRvdWJsZSByZXF1ZXN0ZWRfbWVtb2ZmaGVhcDsgLy8gb3B0aW9uYWwKKyAgcHJpdmF0ZSBkb3VibGUgcmVxdWVzdGVkX2NwdTsgLy8gb3B0aW9uYWwKKyAgcHJpdmF0ZSBkb3VibGUgYXNzaWduZWRfbWVtb25oZWFwOyAvLyBvcHRpb25hbAorICBwcml2YXRlIGRvdWJsZSBhc3NpZ25lZF9tZW1vZmZoZWFwOyAvLyBvcHRpb25hbAorICBwcml2YXRlIGRvdWJsZSBhc3NpZ25lZF9jcHU7IC8vIG9wdGlvbmFsCiAKICAgLyoqIFRoZSBzZXQgb2YgZmllbGRzIHRoaXMgc3RydWN0IGNvbnRhaW5zLCBhbG9uZyB3aXRoIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9yIGZpbmRpbmcgYW5kIG1hbmlwdWxhdGluZyB0aGVtLiAqLwogICBwdWJsaWMgZW51bSBfRmllbGRzIGltcGxlbWVudHMgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkSWRFbnVtIHsKQEAgLTk0LDcgKzEwNiwxMyBAQAogICAgIENPTVBPTkVOVF9ERUJVRygoc2hvcnQpNywgImNvbXBvbmVudF9kZWJ1ZyIpLAogICAgIFNDSEVEX1NUQVRVUygoc2hvcnQpNTEzLCAic2NoZWRfc3RhdHVzIiksCiAgICAgT1dORVIoKHNob3J0KTUxNCwgIm93bmVyIiksCi0gICAgUkVQTElDQVRJT05fQ09VTlQoKHNob3J0KTUxNSwgInJlcGxpY2F0aW9uX2NvdW50Iik7CisgICAgUkVQTElDQVRJT05fQ09VTlQoKHNob3J0KTUxNSwgInJlcGxpY2F0aW9uX2NvdW50IiksCisgICAgUkVRVUVTVEVEX01FTU9OSEVBUCgoc2hvcnQpNTIxLCAicmVxdWVzdGVkX21lbW9uaGVhcCIpLAorICAgIFJFUVVFU1RFRF9NRU1PRkZIRUFQKChzaG9ydCk1MjIsICJyZXF1ZXN0ZWRfbWVtb2ZmaGVhcCIpLAorICAgIFJFUVVFU1RFRF9DUFUoKHNob3J0KTUyMywgInJlcXVlc3RlZF9jcHUiKSwKKyAgICBBU1NJR05FRF9NRU1PTkhFQVAoKHNob3J0KTUyNCwgImFzc2lnbmVkX21lbW9uaGVhcCIpLAorICAgIEFTU0lHTkVEX01FTU9GRkhFQVAoKHNob3J0KTUyNSwgImFzc2lnbmVkX21lbW9mZmhlYXAiKSwKKyAgICBBU1NJR05FRF9DUFUoKHNob3J0KTUyNiwgImFzc2lnbmVkX2NwdSIpOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgX0ZpZWxkcz4gYnlOYW1lID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBfRmllbGRzPigpOwogCkBAIC0xMjksNiArMTQ3LDE4IEBACiAgICAgICAgICAgcmV0dXJuIE9XTkVSOwogICAgICAgICBjYXNlIDUxNTogLy8gUkVQTElDQVRJT05fQ09VTlQKICAgICAgICAgICByZXR1cm4gUkVQTElDQVRJT05fQ09VTlQ7CisgICAgICAgIGNhc2UgNTIxOiAvLyBSRVFVRVNURURfTUVNT05IRUFQCisgICAgICAgICAgcmV0dXJuIFJFUVVFU1RFRF9NRU1PTkhFQVA7CisgICAgICAgIGNhc2UgNTIyOiAvLyBSRVFVRVNURURfTUVNT0ZGSEVBUAorICAgICAgICAgIHJldHVybiBSRVFVRVNURURfTUVNT0ZGSEVBUDsKKyAgICAgICAgY2FzZSA1MjM6IC8vIFJFUVVFU1RFRF9DUFUKKyAgICAgICAgICByZXR1cm4gUkVRVUVTVEVEX0NQVTsKKyAgICAgICAgY2FzZSA1MjQ6IC8vIEFTU0lHTkVEX01FTU9OSEVBUAorICAgICAgICAgIHJldHVybiBBU1NJR05FRF9NRU1PTkhFQVA7CisgICAgICAgIGNhc2UgNTI1OiAvLyBBU1NJR05FRF9NRU1PRkZIRUFQCisgICAgICAgICAgcmV0dXJuIEFTU0lHTkVEX01FTU9GRkhFQVA7CisgICAgICAgIGNhc2UgNTI2OiAvLyBBU1NJR05FRF9DUFUKKyAgICAgICAgICByZXR1cm4gQVNTSUdORURfQ1BVOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgfQpAQCAtMTcxLDggKzIwMSwxNCBAQAogICAvLyBpc3NldCBpZCBhc3NpZ25tZW50cwogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgX19VUFRJTUVfU0VDU19JU1NFVF9JRCA9IDA7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBfX1JFUExJQ0FUSU9OX0NPVU5UX0lTU0VUX0lEID0gMTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IF9fUkVRVUVTVEVEX01FTU9OSEVBUF9JU1NFVF9JRCA9IDI7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBfX1JFUVVFU1RFRF9NRU1PRkZIRUFQX0lTU0VUX0lEID0gMzsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IF9fUkVRVUVTVEVEX0NQVV9JU1NFVF9JRCA9IDQ7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBfX0FTU0lHTkVEX01FTU9OSEVBUF9JU1NFVF9JRCA9IDU7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBfX0FTU0lHTkVEX01FTU9GRkhFQVBfSVNTRVRfSUQgPSA2OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgX19BU1NJR05FRF9DUFVfSVNTRVRfSUQgPSA3OwogICBwcml2YXRlIGJ5dGUgX19pc3NldF9iaXRmaWVsZCA9IDA7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIF9GaWVsZHMgb3B0aW9uYWxzW10gPSB7X0ZpZWxkcy5DT01QT05FTlRfREVCVUcsX0ZpZWxkcy5TQ0hFRF9TVEFUVVMsX0ZpZWxkcy5PV05FUixfRmllbGRzLlJFUExJQ0FUSU9OX0NPVU5UfTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgX0ZpZWxkcyBvcHRpb25hbHNbXSA9IHtfRmllbGRzLkNPTVBPTkVOVF9ERUJVRyxfRmllbGRzLlNDSEVEX1NUQVRVUyxfRmllbGRzLk9XTkVSLF9GaWVsZHMuUkVQTElDQVRJT05fQ09VTlQsX0ZpZWxkcy5SRVFVRVNURURfTUVNT05IRUFQLF9GaWVsZHMuUkVRVUVTVEVEX01FTU9GRkhFQVAsX0ZpZWxkcy5SRVFVRVNURURfQ1BVLF9GaWVsZHMuQVNTSUdORURfTUVNT05IRUFQLF9GaWVsZHMuQVNTSUdORURfTUVNT0ZGSEVBUCxfRmllbGRzLkFTU0lHTkVEX0NQVX07CiAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPiBtZXRhRGF0YU1hcDsKICAgc3RhdGljIHsKICAgICBNYXA8X0ZpZWxkcywgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGE+IHRtcE1hcCA9IG5ldyBFbnVtTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPihfRmllbGRzLmNsYXNzKTsKQEAgLTE5NSwxMyArMjMxLDI1IEBACiAgICAgdG1wTWFwLnB1dChfRmllbGRzLkNPTVBPTkVOVF9ERUJVRywgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhKCJjb21wb25lbnRfZGVidWciLCBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRSZXF1aXJlbWVudFR5cGUuT1BUSU9OQUwsIAogICAgICAgICBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLk1hcE1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLk1BUCwgCiAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkVmFsdWVNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcpLCAKLSAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRWYWx1ZU1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCAgICAgICAgICAgICwgIkRlYnVnT3B0aW9ucyIpKSkpOworICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5TdHJ1Y3RNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIERlYnVnT3B0aW9ucy5jbGFzcykpKSk7CiAgICAgdG1wTWFwLnB1dChfRmllbGRzLlNDSEVEX1NUQVRVUywgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhKCJzY2hlZF9zdGF0dXMiLCBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRSZXF1aXJlbWVudFR5cGUuT1BUSU9OQUwsIAogICAgICAgICBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkVmFsdWVNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcpKSk7CiAgICAgdG1wTWFwLnB1dChfRmllbGRzLk9XTkVSLCBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEoIm93bmVyIiwgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLk9QVElPTkFMLCAKICAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZFZhbHVlTWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HKSkpOwogICAgIHRtcE1hcC5wdXQoX0ZpZWxkcy5SRVBMSUNBVElPTl9DT1VOVCwgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhKCJyZXBsaWNhdGlvbl9jb3VudCIsIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZFJlcXVpcmVtZW50VHlwZS5PUFRJT05BTCwgCiAgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRWYWx1ZU1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkkzMikpKTsKKyAgICB0bXBNYXAucHV0KF9GaWVsZHMuUkVRVUVTVEVEX01FTU9OSEVBUCwgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhKCJyZXF1ZXN0ZWRfbWVtb25oZWFwIiwgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLk9QVElPTkFMLCAKKyAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZFZhbHVlTWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuRE9VQkxFKSkpOworICAgIHRtcE1hcC5wdXQoX0ZpZWxkcy5SRVFVRVNURURfTUVNT0ZGSEVBUCwgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhKCJyZXF1ZXN0ZWRfbWVtb2ZmaGVhcCIsIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZFJlcXVpcmVtZW50VHlwZS5PUFRJT05BTCwgCisgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRWYWx1ZU1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkRPVUJMRSkpKTsKKyAgICB0bXBNYXAucHV0KF9GaWVsZHMuUkVRVUVTVEVEX0NQVSwgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhKCJyZXF1ZXN0ZWRfY3B1Iiwgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLk9QVElPTkFMLCAKKyAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZFZhbHVlTWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuRE9VQkxFKSkpOworICAgIHRtcE1hcC5wdXQoX0ZpZWxkcy5BU1NJR05FRF9NRU1PTkhFQVAsIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YSgiYXNzaWduZWRfbWVtb25oZWFwIiwgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLk9QVElPTkFMLCAKKyAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZFZhbHVlTWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuRE9VQkxFKSkpOworICAgIHRtcE1hcC5wdXQoX0ZpZWxkcy5BU1NJR05FRF9NRU1PRkZIRUFQLCBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEoImFzc2lnbmVkX21lbW9mZmhlYXAiLCBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRSZXF1aXJlbWVudFR5cGUuT1BUSU9OQUwsIAorICAgICAgICBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkVmFsdWVNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5ET1VCTEUpKSk7CisgICAgdG1wTWFwLnB1dChfRmllbGRzLkFTU0lHTkVEX0NQVSwgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhKCJhc3NpZ25lZF9jcHUiLCBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRSZXF1aXJlbWVudFR5cGUuT1BUSU9OQUwsIAorICAgICAgICBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkVmFsdWVNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5ET1VCTEUpKSk7CiAgICAgbWV0YURhdGFNYXAgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAodG1wTWFwKTsKICAgICBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YS5hZGRTdHJ1Y3RNZXRhRGF0YU1hcChUb3BvbG9neUluZm8uY2xhc3MsIG1ldGFEYXRhTWFwKTsKICAgfQpAQCAtMjc2LDcgKzMyNCw3IEBACiAKICAgICAgICAgU3RyaW5nIF9fdGhpc19fY29tcG9uZW50X2RlYnVnX2NvcHlfa2V5ID0gb3RoZXJfZWxlbWVudF9rZXk7CiAKLSAgICAgICAgRGVidWdPcHRpb25zIF9fdGhpc19fY29tcG9uZW50X2RlYnVnX2NvcHlfdmFsdWUgPSBvdGhlcl9lbGVtZW50X3ZhbHVlOworICAgICAgICBEZWJ1Z09wdGlvbnMgX190aGlzX19jb21wb25lbnRfZGVidWdfY29weV92YWx1ZSA9IG5ldyBEZWJ1Z09wdGlvbnMob3RoZXJfZWxlbWVudF92YWx1ZSk7CiAKICAgICAgICAgX190aGlzX19jb21wb25lbnRfZGVidWcucHV0KF9fdGhpc19fY29tcG9uZW50X2RlYnVnX2NvcHlfa2V5LCBfX3RoaXNfX2NvbXBvbmVudF9kZWJ1Z19jb3B5X3ZhbHVlKTsKICAgICAgIH0KQEAgLTI4OSw2ICszMzcsMTIgQEAKICAgICAgIHRoaXMub3duZXIgPSBvdGhlci5vd25lcjsKICAgICB9CiAgICAgdGhpcy5yZXBsaWNhdGlvbl9jb3VudCA9IG90aGVyLnJlcGxpY2F0aW9uX2NvdW50OworICAgIHRoaXMucmVxdWVzdGVkX21lbW9uaGVhcCA9IG90aGVyLnJlcXVlc3RlZF9tZW1vbmhlYXA7CisgICAgdGhpcy5yZXF1ZXN0ZWRfbWVtb2ZmaGVhcCA9IG90aGVyLnJlcXVlc3RlZF9tZW1vZmZoZWFwOworICAgIHRoaXMucmVxdWVzdGVkX2NwdSA9IG90aGVyLnJlcXVlc3RlZF9jcHU7CisgICAgdGhpcy5hc3NpZ25lZF9tZW1vbmhlYXAgPSBvdGhlci5hc3NpZ25lZF9tZW1vbmhlYXA7CisgICAgdGhpcy5hc3NpZ25lZF9tZW1vZmZoZWFwID0gb3RoZXIuYXNzaWduZWRfbWVtb2ZmaGVhcDsKKyAgICB0aGlzLmFzc2lnbmVkX2NwdSA9IG90aGVyLmFzc2lnbmVkX2NwdTsKICAgfQogCiAgIHB1YmxpYyBUb3BvbG9neUluZm8gZGVlcENvcHkoKSB7CkBAIC0zMDksNiArMzYzLDE4IEBACiAgICAgdGhpcy5vd25lciA9IG51bGw7CiAgICAgc2V0X3JlcGxpY2F0aW9uX2NvdW50X2lzU2V0KGZhbHNlKTsKICAgICB0aGlzLnJlcGxpY2F0aW9uX2NvdW50ID0gMDsKKyAgICBzZXRfcmVxdWVzdGVkX21lbW9uaGVhcF9pc1NldChmYWxzZSk7CisgICAgdGhpcy5yZXF1ZXN0ZWRfbWVtb25oZWFwID0gMC4wOworICAgIHNldF9yZXF1ZXN0ZWRfbWVtb2ZmaGVhcF9pc1NldChmYWxzZSk7CisgICAgdGhpcy5yZXF1ZXN0ZWRfbWVtb2ZmaGVhcCA9IDAuMDsKKyAgICBzZXRfcmVxdWVzdGVkX2NwdV9pc1NldChmYWxzZSk7CisgICAgdGhpcy5yZXF1ZXN0ZWRfY3B1ID0gMC4wOworICAgIHNldF9hc3NpZ25lZF9tZW1vbmhlYXBfaXNTZXQoZmFsc2UpOworICAgIHRoaXMuYXNzaWduZWRfbWVtb25oZWFwID0gMC4wOworICAgIHNldF9hc3NpZ25lZF9tZW1vZmZoZWFwX2lzU2V0KGZhbHNlKTsKKyAgICB0aGlzLmFzc2lnbmVkX21lbW9mZmhlYXAgPSAwLjA7CisgICAgc2V0X2Fzc2lnbmVkX2NwdV9pc1NldChmYWxzZSk7CisgICAgdGhpcy5hc3NpZ25lZF9jcHUgPSAwLjA7CiAgIH0KIAogICBwdWJsaWMgU3RyaW5nIGdldF9pZCgpIHsKQEAgLTU3Niw2ICs2NDIsMTM4IEBACiAgICAgX19pc3NldF9iaXRmaWVsZCA9IEVuY29kaW5nVXRpbHMuc2V0Qml0KF9faXNzZXRfYml0ZmllbGQsIF9fUkVQTElDQVRJT05fQ09VTlRfSVNTRVRfSUQsIHZhbHVlKTsKICAgfQogCisgIHB1YmxpYyBkb3VibGUgZ2V0X3JlcXVlc3RlZF9tZW1vbmhlYXAoKSB7CisgICAgcmV0dXJuIHRoaXMucmVxdWVzdGVkX21lbW9uaGVhcDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF9yZXF1ZXN0ZWRfbWVtb25oZWFwKGRvdWJsZSByZXF1ZXN0ZWRfbWVtb25oZWFwKSB7CisgICAgdGhpcy5yZXF1ZXN0ZWRfbWVtb25oZWFwID0gcmVxdWVzdGVkX21lbW9uaGVhcDsKKyAgICBzZXRfcmVxdWVzdGVkX21lbW9uaGVhcF9pc1NldCh0cnVlKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHVuc2V0X3JlcXVlc3RlZF9tZW1vbmhlYXAoKSB7CisgICAgX19pc3NldF9iaXRmaWVsZCA9IEVuY29kaW5nVXRpbHMuY2xlYXJCaXQoX19pc3NldF9iaXRmaWVsZCwgX19SRVFVRVNURURfTUVNT05IRUFQX0lTU0VUX0lEKTsKKyAgfQorCisgIC8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgcmVxdWVzdGVkX21lbW9uaGVhcCBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNfc2V0X3JlcXVlc3RlZF9tZW1vbmhlYXAoKSB7CisgICAgcmV0dXJuIEVuY29kaW5nVXRpbHMudGVzdEJpdChfX2lzc2V0X2JpdGZpZWxkLCBfX1JFUVVFU1RFRF9NRU1PTkhFQVBfSVNTRVRfSUQpOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X3JlcXVlc3RlZF9tZW1vbmhlYXBfaXNTZXQoYm9vbGVhbiB2YWx1ZSkgeworICAgIF9faXNzZXRfYml0ZmllbGQgPSBFbmNvZGluZ1V0aWxzLnNldEJpdChfX2lzc2V0X2JpdGZpZWxkLCBfX1JFUVVFU1RFRF9NRU1PTkhFQVBfSVNTRVRfSUQsIHZhbHVlKTsKKyAgfQorCisgIHB1YmxpYyBkb3VibGUgZ2V0X3JlcXVlc3RlZF9tZW1vZmZoZWFwKCkgeworICAgIHJldHVybiB0aGlzLnJlcXVlc3RlZF9tZW1vZmZoZWFwOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X3JlcXVlc3RlZF9tZW1vZmZoZWFwKGRvdWJsZSByZXF1ZXN0ZWRfbWVtb2ZmaGVhcCkgeworICAgIHRoaXMucmVxdWVzdGVkX21lbW9mZmhlYXAgPSByZXF1ZXN0ZWRfbWVtb2ZmaGVhcDsKKyAgICBzZXRfcmVxdWVzdGVkX21lbW9mZmhlYXBfaXNTZXQodHJ1ZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB1bnNldF9yZXF1ZXN0ZWRfbWVtb2ZmaGVhcCgpIHsKKyAgICBfX2lzc2V0X2JpdGZpZWxkID0gRW5jb2RpbmdVdGlscy5jbGVhckJpdChfX2lzc2V0X2JpdGZpZWxkLCBfX1JFUVVFU1RFRF9NRU1PRkZIRUFQX0lTU0VUX0lEKTsKKyAgfQorCisgIC8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgcmVxdWVzdGVkX21lbW9mZmhlYXAgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgIHB1YmxpYyBib29sZWFuIGlzX3NldF9yZXF1ZXN0ZWRfbWVtb2ZmaGVhcCgpIHsKKyAgICByZXR1cm4gRW5jb2RpbmdVdGlscy50ZXN0Qml0KF9faXNzZXRfYml0ZmllbGQsIF9fUkVRVUVTVEVEX01FTU9GRkhFQVBfSVNTRVRfSUQpOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X3JlcXVlc3RlZF9tZW1vZmZoZWFwX2lzU2V0KGJvb2xlYW4gdmFsdWUpIHsKKyAgICBfX2lzc2V0X2JpdGZpZWxkID0gRW5jb2RpbmdVdGlscy5zZXRCaXQoX19pc3NldF9iaXRmaWVsZCwgX19SRVFVRVNURURfTUVNT0ZGSEVBUF9JU1NFVF9JRCwgdmFsdWUpOworICB9CisKKyAgcHVibGljIGRvdWJsZSBnZXRfcmVxdWVzdGVkX2NwdSgpIHsKKyAgICByZXR1cm4gdGhpcy5yZXF1ZXN0ZWRfY3B1OworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X3JlcXVlc3RlZF9jcHUoZG91YmxlIHJlcXVlc3RlZF9jcHUpIHsKKyAgICB0aGlzLnJlcXVlc3RlZF9jcHUgPSByZXF1ZXN0ZWRfY3B1OworICAgIHNldF9yZXF1ZXN0ZWRfY3B1X2lzU2V0KHRydWUpOworICB9CisKKyAgcHVibGljIHZvaWQgdW5zZXRfcmVxdWVzdGVkX2NwdSgpIHsKKyAgICBfX2lzc2V0X2JpdGZpZWxkID0gRW5jb2RpbmdVdGlscy5jbGVhckJpdChfX2lzc2V0X2JpdGZpZWxkLCBfX1JFUVVFU1RFRF9DUFVfSVNTRVRfSUQpOworICB9CisKKyAgLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCByZXF1ZXN0ZWRfY3B1IGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLworICBwdWJsaWMgYm9vbGVhbiBpc19zZXRfcmVxdWVzdGVkX2NwdSgpIHsKKyAgICByZXR1cm4gRW5jb2RpbmdVdGlscy50ZXN0Qml0KF9faXNzZXRfYml0ZmllbGQsIF9fUkVRVUVTVEVEX0NQVV9JU1NFVF9JRCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfcmVxdWVzdGVkX2NwdV9pc1NldChib29sZWFuIHZhbHVlKSB7CisgICAgX19pc3NldF9iaXRmaWVsZCA9IEVuY29kaW5nVXRpbHMuc2V0Qml0KF9faXNzZXRfYml0ZmllbGQsIF9fUkVRVUVTVEVEX0NQVV9JU1NFVF9JRCwgdmFsdWUpOworICB9CisKKyAgcHVibGljIGRvdWJsZSBnZXRfYXNzaWduZWRfbWVtb25oZWFwKCkgeworICAgIHJldHVybiB0aGlzLmFzc2lnbmVkX21lbW9uaGVhcDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF9hc3NpZ25lZF9tZW1vbmhlYXAoZG91YmxlIGFzc2lnbmVkX21lbW9uaGVhcCkgeworICAgIHRoaXMuYXNzaWduZWRfbWVtb25oZWFwID0gYXNzaWduZWRfbWVtb25oZWFwOworICAgIHNldF9hc3NpZ25lZF9tZW1vbmhlYXBfaXNTZXQodHJ1ZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB1bnNldF9hc3NpZ25lZF9tZW1vbmhlYXAoKSB7CisgICAgX19pc3NldF9iaXRmaWVsZCA9IEVuY29kaW5nVXRpbHMuY2xlYXJCaXQoX19pc3NldF9iaXRmaWVsZCwgX19BU1NJR05FRF9NRU1PTkhFQVBfSVNTRVRfSUQpOworICB9CisKKyAgLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBhc3NpZ25lZF9tZW1vbmhlYXAgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgIHB1YmxpYyBib29sZWFuIGlzX3NldF9hc3NpZ25lZF9tZW1vbmhlYXAoKSB7CisgICAgcmV0dXJuIEVuY29kaW5nVXRpbHMudGVzdEJpdChfX2lzc2V0X2JpdGZpZWxkLCBfX0FTU0lHTkVEX01FTU9OSEVBUF9JU1NFVF9JRCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfYXNzaWduZWRfbWVtb25oZWFwX2lzU2V0KGJvb2xlYW4gdmFsdWUpIHsKKyAgICBfX2lzc2V0X2JpdGZpZWxkID0gRW5jb2RpbmdVdGlscy5zZXRCaXQoX19pc3NldF9iaXRmaWVsZCwgX19BU1NJR05FRF9NRU1PTkhFQVBfSVNTRVRfSUQsIHZhbHVlKTsKKyAgfQorCisgIHB1YmxpYyBkb3VibGUgZ2V0X2Fzc2lnbmVkX21lbW9mZmhlYXAoKSB7CisgICAgcmV0dXJuIHRoaXMuYXNzaWduZWRfbWVtb2ZmaGVhcDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF9hc3NpZ25lZF9tZW1vZmZoZWFwKGRvdWJsZSBhc3NpZ25lZF9tZW1vZmZoZWFwKSB7CisgICAgdGhpcy5hc3NpZ25lZF9tZW1vZmZoZWFwID0gYXNzaWduZWRfbWVtb2ZmaGVhcDsKKyAgICBzZXRfYXNzaWduZWRfbWVtb2ZmaGVhcF9pc1NldCh0cnVlKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHVuc2V0X2Fzc2lnbmVkX21lbW9mZmhlYXAoKSB7CisgICAgX19pc3NldF9iaXRmaWVsZCA9IEVuY29kaW5nVXRpbHMuY2xlYXJCaXQoX19pc3NldF9iaXRmaWVsZCwgX19BU1NJR05FRF9NRU1PRkZIRUFQX0lTU0VUX0lEKTsKKyAgfQorCisgIC8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgYXNzaWduZWRfbWVtb2ZmaGVhcCBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNfc2V0X2Fzc2lnbmVkX21lbW9mZmhlYXAoKSB7CisgICAgcmV0dXJuIEVuY29kaW5nVXRpbHMudGVzdEJpdChfX2lzc2V0X2JpdGZpZWxkLCBfX0FTU0lHTkVEX01FTU9GRkhFQVBfSVNTRVRfSUQpOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X2Fzc2lnbmVkX21lbW9mZmhlYXBfaXNTZXQoYm9vbGVhbiB2YWx1ZSkgeworICAgIF9faXNzZXRfYml0ZmllbGQgPSBFbmNvZGluZ1V0aWxzLnNldEJpdChfX2lzc2V0X2JpdGZpZWxkLCBfX0FTU0lHTkVEX01FTU9GRkhFQVBfSVNTRVRfSUQsIHZhbHVlKTsKKyAgfQorCisgIHB1YmxpYyBkb3VibGUgZ2V0X2Fzc2lnbmVkX2NwdSgpIHsKKyAgICByZXR1cm4gdGhpcy5hc3NpZ25lZF9jcHU7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfYXNzaWduZWRfY3B1KGRvdWJsZSBhc3NpZ25lZF9jcHUpIHsKKyAgICB0aGlzLmFzc2lnbmVkX2NwdSA9IGFzc2lnbmVkX2NwdTsKKyAgICBzZXRfYXNzaWduZWRfY3B1X2lzU2V0KHRydWUpOworICB9CisKKyAgcHVibGljIHZvaWQgdW5zZXRfYXNzaWduZWRfY3B1KCkgeworICAgIF9faXNzZXRfYml0ZmllbGQgPSBFbmNvZGluZ1V0aWxzLmNsZWFyQml0KF9faXNzZXRfYml0ZmllbGQsIF9fQVNTSUdORURfQ1BVX0lTU0VUX0lEKTsKKyAgfQorCisgIC8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgYXNzaWduZWRfY3B1IGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLworICBwdWJsaWMgYm9vbGVhbiBpc19zZXRfYXNzaWduZWRfY3B1KCkgeworICAgIHJldHVybiBFbmNvZGluZ1V0aWxzLnRlc3RCaXQoX19pc3NldF9iaXRmaWVsZCwgX19BU1NJR05FRF9DUFVfSVNTRVRfSUQpOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X2Fzc2lnbmVkX2NwdV9pc1NldChib29sZWFuIHZhbHVlKSB7CisgICAgX19pc3NldF9iaXRmaWVsZCA9IEVuY29kaW5nVXRpbHMuc2V0Qml0KF9faXNzZXRfYml0ZmllbGQsIF9fQVNTSUdORURfQ1BVX0lTU0VUX0lELCB2YWx1ZSk7CisgIH0KKwogICBwdWJsaWMgdm9pZCBzZXRGaWVsZFZhbHVlKF9GaWVsZHMgZmllbGQsIE9iamVjdCB2YWx1ZSkgewogICAgIHN3aXRjaCAoZmllbGQpIHsKICAgICBjYXNlIElEOgpAQCAtNjU4LDYgKzg1Niw1NCBAQAogICAgICAgfQogICAgICAgYnJlYWs7CiAKKyAgICBjYXNlIFJFUVVFU1RFRF9NRU1PTkhFQVA6CisgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICB1bnNldF9yZXF1ZXN0ZWRfbWVtb25oZWFwKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzZXRfcmVxdWVzdGVkX21lbW9uaGVhcCgoRG91YmxlKXZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBSRVFVRVNURURfTUVNT0ZGSEVBUDoKKyAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgIHVuc2V0X3JlcXVlc3RlZF9tZW1vZmZoZWFwKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzZXRfcmVxdWVzdGVkX21lbW9mZmhlYXAoKERvdWJsZSl2YWx1ZSk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgUkVRVUVTVEVEX0NQVToKKyAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgIHVuc2V0X3JlcXVlc3RlZF9jcHUoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNldF9yZXF1ZXN0ZWRfY3B1KChEb3VibGUpdmFsdWUpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEFTU0lHTkVEX01FTU9OSEVBUDoKKyAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgIHVuc2V0X2Fzc2lnbmVkX21lbW9uaGVhcCgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2V0X2Fzc2lnbmVkX21lbW9uaGVhcCgoRG91YmxlKXZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBBU1NJR05FRF9NRU1PRkZIRUFQOgorICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgdW5zZXRfYXNzaWduZWRfbWVtb2ZmaGVhcCgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2V0X2Fzc2lnbmVkX21lbW9mZmhlYXAoKERvdWJsZSl2YWx1ZSk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgQVNTSUdORURfQ1BVOgorICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgdW5zZXRfYXNzaWduZWRfY3B1KCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzZXRfYXNzaWduZWRfY3B1KChEb3VibGUpdmFsdWUpOworICAgICAgfQorICAgICAgYnJlYWs7CisKICAgICB9CiAgIH0KIApAQCAtNjcwLDcgKzkxNiw3IEBACiAgICAgICByZXR1cm4gZ2V0X25hbWUoKTsKIAogICAgIGNhc2UgVVBUSU1FX1NFQ1M6Ci0gICAgICByZXR1cm4gSW50ZWdlci52YWx1ZU9mKGdldF91cHRpbWVfc2VjcygpKTsKKyAgICAgIHJldHVybiBnZXRfdXB0aW1lX3NlY3MoKTsKIAogICAgIGNhc2UgRVhFQ1VUT1JTOgogICAgICAgcmV0dXJuIGdldF9leGVjdXRvcnMoKTsKQEAgLTY5MSw3ICs5MzcsMjUgQEAKICAgICAgIHJldHVybiBnZXRfb3duZXIoKTsKIAogICAgIGNhc2UgUkVQTElDQVRJT05fQ09VTlQ6Ci0gICAgICByZXR1cm4gSW50ZWdlci52YWx1ZU9mKGdldF9yZXBsaWNhdGlvbl9jb3VudCgpKTsKKyAgICAgIHJldHVybiBnZXRfcmVwbGljYXRpb25fY291bnQoKTsKKworICAgIGNhc2UgUkVRVUVTVEVEX01FTU9OSEVBUDoKKyAgICAgIHJldHVybiBnZXRfcmVxdWVzdGVkX21lbW9uaGVhcCgpOworCisgICAgY2FzZSBSRVFVRVNURURfTUVNT0ZGSEVBUDoKKyAgICAgIHJldHVybiBnZXRfcmVxdWVzdGVkX21lbW9mZmhlYXAoKTsKKworICAgIGNhc2UgUkVRVUVTVEVEX0NQVToKKyAgICAgIHJldHVybiBnZXRfcmVxdWVzdGVkX2NwdSgpOworCisgICAgY2FzZSBBU1NJR05FRF9NRU1PTkhFQVA6CisgICAgICByZXR1cm4gZ2V0X2Fzc2lnbmVkX21lbW9uaGVhcCgpOworCisgICAgY2FzZSBBU1NJR05FRF9NRU1PRkZIRUFQOgorICAgICAgcmV0dXJuIGdldF9hc3NpZ25lZF9tZW1vZmZoZWFwKCk7CisKKyAgICBjYXNlIEFTU0lHTkVEX0NQVToKKyAgICAgIHJldHVybiBnZXRfYXNzaWduZWRfY3B1KCk7CiAKICAgICB9CiAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwpAQCAtNzI0LDYgKzk4OCwxOCBAQAogICAgICAgcmV0dXJuIGlzX3NldF9vd25lcigpOwogICAgIGNhc2UgUkVQTElDQVRJT05fQ09VTlQ6CiAgICAgICByZXR1cm4gaXNfc2V0X3JlcGxpY2F0aW9uX2NvdW50KCk7CisgICAgY2FzZSBSRVFVRVNURURfTUVNT05IRUFQOgorICAgICAgcmV0dXJuIGlzX3NldF9yZXF1ZXN0ZWRfbWVtb25oZWFwKCk7CisgICAgY2FzZSBSRVFVRVNURURfTUVNT0ZGSEVBUDoKKyAgICAgIHJldHVybiBpc19zZXRfcmVxdWVzdGVkX21lbW9mZmhlYXAoKTsKKyAgICBjYXNlIFJFUVVFU1RFRF9DUFU6CisgICAgICByZXR1cm4gaXNfc2V0X3JlcXVlc3RlZF9jcHUoKTsKKyAgICBjYXNlIEFTU0lHTkVEX01FTU9OSEVBUDoKKyAgICAgIHJldHVybiBpc19zZXRfYXNzaWduZWRfbWVtb25oZWFwKCk7CisgICAgY2FzZSBBU1NJR05FRF9NRU1PRkZIRUFQOgorICAgICAgcmV0dXJuIGlzX3NldF9hc3NpZ25lZF9tZW1vZmZoZWFwKCk7CisgICAgY2FzZSBBU1NJR05FRF9DUFU6CisgICAgICByZXR1cm4gaXNfc2V0X2Fzc2lnbmVkX2NwdSgpOwogICAgIH0KICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CiAgIH0KQEAgLTgzMSw2ICsxMTA3LDYwIEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKKyAgICBib29sZWFuIHRoaXNfcHJlc2VudF9yZXF1ZXN0ZWRfbWVtb25oZWFwID0gdHJ1ZSAmJiB0aGlzLmlzX3NldF9yZXF1ZXN0ZWRfbWVtb25oZWFwKCk7CisgICAgYm9vbGVhbiB0aGF0X3ByZXNlbnRfcmVxdWVzdGVkX21lbW9uaGVhcCA9IHRydWUgJiYgdGhhdC5pc19zZXRfcmVxdWVzdGVkX21lbW9uaGVhcCgpOworICAgIGlmICh0aGlzX3ByZXNlbnRfcmVxdWVzdGVkX21lbW9uaGVhcCB8fCB0aGF0X3ByZXNlbnRfcmVxdWVzdGVkX21lbW9uaGVhcCkgeworICAgICAgaWYgKCEodGhpc19wcmVzZW50X3JlcXVlc3RlZF9tZW1vbmhlYXAgJiYgdGhhdF9wcmVzZW50X3JlcXVlc3RlZF9tZW1vbmhlYXApKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBpZiAodGhpcy5yZXF1ZXN0ZWRfbWVtb25oZWFwICE9IHRoYXQucmVxdWVzdGVkX21lbW9uaGVhcCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2xlYW4gdGhpc19wcmVzZW50X3JlcXVlc3RlZF9tZW1vZmZoZWFwID0gdHJ1ZSAmJiB0aGlzLmlzX3NldF9yZXF1ZXN0ZWRfbWVtb2ZmaGVhcCgpOworICAgIGJvb2xlYW4gdGhhdF9wcmVzZW50X3JlcXVlc3RlZF9tZW1vZmZoZWFwID0gdHJ1ZSAmJiB0aGF0LmlzX3NldF9yZXF1ZXN0ZWRfbWVtb2ZmaGVhcCgpOworICAgIGlmICh0aGlzX3ByZXNlbnRfcmVxdWVzdGVkX21lbW9mZmhlYXAgfHwgdGhhdF9wcmVzZW50X3JlcXVlc3RlZF9tZW1vZmZoZWFwKSB7CisgICAgICBpZiAoISh0aGlzX3ByZXNlbnRfcmVxdWVzdGVkX21lbW9mZmhlYXAgJiYgdGhhdF9wcmVzZW50X3JlcXVlc3RlZF9tZW1vZmZoZWFwKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKHRoaXMucmVxdWVzdGVkX21lbW9mZmhlYXAgIT0gdGhhdC5yZXF1ZXN0ZWRfbWVtb2ZmaGVhcCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2xlYW4gdGhpc19wcmVzZW50X3JlcXVlc3RlZF9jcHUgPSB0cnVlICYmIHRoaXMuaXNfc2V0X3JlcXVlc3RlZF9jcHUoKTsKKyAgICBib29sZWFuIHRoYXRfcHJlc2VudF9yZXF1ZXN0ZWRfY3B1ID0gdHJ1ZSAmJiB0aGF0LmlzX3NldF9yZXF1ZXN0ZWRfY3B1KCk7CisgICAgaWYgKHRoaXNfcHJlc2VudF9yZXF1ZXN0ZWRfY3B1IHx8IHRoYXRfcHJlc2VudF9yZXF1ZXN0ZWRfY3B1KSB7CisgICAgICBpZiAoISh0aGlzX3ByZXNlbnRfcmVxdWVzdGVkX2NwdSAmJiB0aGF0X3ByZXNlbnRfcmVxdWVzdGVkX2NwdSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGlmICh0aGlzLnJlcXVlc3RlZF9jcHUgIT0gdGhhdC5yZXF1ZXN0ZWRfY3B1KQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbGVhbiB0aGlzX3ByZXNlbnRfYXNzaWduZWRfbWVtb25oZWFwID0gdHJ1ZSAmJiB0aGlzLmlzX3NldF9hc3NpZ25lZF9tZW1vbmhlYXAoKTsKKyAgICBib29sZWFuIHRoYXRfcHJlc2VudF9hc3NpZ25lZF9tZW1vbmhlYXAgPSB0cnVlICYmIHRoYXQuaXNfc2V0X2Fzc2lnbmVkX21lbW9uaGVhcCgpOworICAgIGlmICh0aGlzX3ByZXNlbnRfYXNzaWduZWRfbWVtb25oZWFwIHx8IHRoYXRfcHJlc2VudF9hc3NpZ25lZF9tZW1vbmhlYXApIHsKKyAgICAgIGlmICghKHRoaXNfcHJlc2VudF9hc3NpZ25lZF9tZW1vbmhlYXAgJiYgdGhhdF9wcmVzZW50X2Fzc2lnbmVkX21lbW9uaGVhcCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGlmICh0aGlzLmFzc2lnbmVkX21lbW9uaGVhcCAhPSB0aGF0LmFzc2lnbmVkX21lbW9uaGVhcCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2xlYW4gdGhpc19wcmVzZW50X2Fzc2lnbmVkX21lbW9mZmhlYXAgPSB0cnVlICYmIHRoaXMuaXNfc2V0X2Fzc2lnbmVkX21lbW9mZmhlYXAoKTsKKyAgICBib29sZWFuIHRoYXRfcHJlc2VudF9hc3NpZ25lZF9tZW1vZmZoZWFwID0gdHJ1ZSAmJiB0aGF0LmlzX3NldF9hc3NpZ25lZF9tZW1vZmZoZWFwKCk7CisgICAgaWYgKHRoaXNfcHJlc2VudF9hc3NpZ25lZF9tZW1vZmZoZWFwIHx8IHRoYXRfcHJlc2VudF9hc3NpZ25lZF9tZW1vZmZoZWFwKSB7CisgICAgICBpZiAoISh0aGlzX3ByZXNlbnRfYXNzaWduZWRfbWVtb2ZmaGVhcCAmJiB0aGF0X3ByZXNlbnRfYXNzaWduZWRfbWVtb2ZmaGVhcCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGlmICh0aGlzLmFzc2lnbmVkX21lbW9mZmhlYXAgIT0gdGhhdC5hc3NpZ25lZF9tZW1vZmZoZWFwKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbGVhbiB0aGlzX3ByZXNlbnRfYXNzaWduZWRfY3B1ID0gdHJ1ZSAmJiB0aGlzLmlzX3NldF9hc3NpZ25lZF9jcHUoKTsKKyAgICBib29sZWFuIHRoYXRfcHJlc2VudF9hc3NpZ25lZF9jcHUgPSB0cnVlICYmIHRoYXQuaXNfc2V0X2Fzc2lnbmVkX2NwdSgpOworICAgIGlmICh0aGlzX3ByZXNlbnRfYXNzaWduZWRfY3B1IHx8IHRoYXRfcHJlc2VudF9hc3NpZ25lZF9jcHUpIHsKKyAgICAgIGlmICghKHRoaXNfcHJlc2VudF9hc3NpZ25lZF9jcHUgJiYgdGhhdF9wcmVzZW50X2Fzc2lnbmVkX2NwdSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGlmICh0aGlzLmFzc2lnbmVkX2NwdSAhPSB0aGF0LmFzc2lnbmVkX2NwdSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKwogICAgIHJldHVybiB0cnVlOwogICB9CiAKQEAgLTg4OCw2ICsxMjE4LDM2IEBACiAgICAgaWYgKHByZXNlbnRfcmVwbGljYXRpb25fY291bnQpCiAgICAgICBsaXN0LmFkZChyZXBsaWNhdGlvbl9jb3VudCk7CiAKKyAgICBib29sZWFuIHByZXNlbnRfcmVxdWVzdGVkX21lbW9uaGVhcCA9IHRydWUgJiYgKGlzX3NldF9yZXF1ZXN0ZWRfbWVtb25oZWFwKCkpOworICAgIGxpc3QuYWRkKHByZXNlbnRfcmVxdWVzdGVkX21lbW9uaGVhcCk7CisgICAgaWYgKHByZXNlbnRfcmVxdWVzdGVkX21lbW9uaGVhcCkKKyAgICAgIGxpc3QuYWRkKHJlcXVlc3RlZF9tZW1vbmhlYXApOworCisgICAgYm9vbGVhbiBwcmVzZW50X3JlcXVlc3RlZF9tZW1vZmZoZWFwID0gdHJ1ZSAmJiAoaXNfc2V0X3JlcXVlc3RlZF9tZW1vZmZoZWFwKCkpOworICAgIGxpc3QuYWRkKHByZXNlbnRfcmVxdWVzdGVkX21lbW9mZmhlYXApOworICAgIGlmIChwcmVzZW50X3JlcXVlc3RlZF9tZW1vZmZoZWFwKQorICAgICAgbGlzdC5hZGQocmVxdWVzdGVkX21lbW9mZmhlYXApOworCisgICAgYm9vbGVhbiBwcmVzZW50X3JlcXVlc3RlZF9jcHUgPSB0cnVlICYmIChpc19zZXRfcmVxdWVzdGVkX2NwdSgpKTsKKyAgICBsaXN0LmFkZChwcmVzZW50X3JlcXVlc3RlZF9jcHUpOworICAgIGlmIChwcmVzZW50X3JlcXVlc3RlZF9jcHUpCisgICAgICBsaXN0LmFkZChyZXF1ZXN0ZWRfY3B1KTsKKworICAgIGJvb2xlYW4gcHJlc2VudF9hc3NpZ25lZF9tZW1vbmhlYXAgPSB0cnVlICYmIChpc19zZXRfYXNzaWduZWRfbWVtb25oZWFwKCkpOworICAgIGxpc3QuYWRkKHByZXNlbnRfYXNzaWduZWRfbWVtb25oZWFwKTsKKyAgICBpZiAocHJlc2VudF9hc3NpZ25lZF9tZW1vbmhlYXApCisgICAgICBsaXN0LmFkZChhc3NpZ25lZF9tZW1vbmhlYXApOworCisgICAgYm9vbGVhbiBwcmVzZW50X2Fzc2lnbmVkX21lbW9mZmhlYXAgPSB0cnVlICYmIChpc19zZXRfYXNzaWduZWRfbWVtb2ZmaGVhcCgpKTsKKyAgICBsaXN0LmFkZChwcmVzZW50X2Fzc2lnbmVkX21lbW9mZmhlYXApOworICAgIGlmIChwcmVzZW50X2Fzc2lnbmVkX21lbW9mZmhlYXApCisgICAgICBsaXN0LmFkZChhc3NpZ25lZF9tZW1vZmZoZWFwKTsKKworICAgIGJvb2xlYW4gcHJlc2VudF9hc3NpZ25lZF9jcHUgPSB0cnVlICYmIChpc19zZXRfYXNzaWduZWRfY3B1KCkpOworICAgIGxpc3QuYWRkKHByZXNlbnRfYXNzaWduZWRfY3B1KTsKKyAgICBpZiAocHJlc2VudF9hc3NpZ25lZF9jcHUpCisgICAgICBsaXN0LmFkZChhc3NpZ25lZF9jcHUpOworCiAgICAgcmV0dXJuIGxpc3QuaGFzaENvZGUoKTsKICAgfQogCkBAIC05OTksNiArMTM1OSw2NiBAQAogICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CiAgICAgICB9CiAgICAgfQorICAgIGxhc3RDb21wYXJpc29uID0gQm9vbGVhbi52YWx1ZU9mKGlzX3NldF9yZXF1ZXN0ZWRfbWVtb25oZWFwKCkpLmNvbXBhcmVUbyhvdGhlci5pc19zZXRfcmVxdWVzdGVkX21lbW9uaGVhcCgpKTsKKyAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgIH0KKyAgICBpZiAoaXNfc2V0X3JlcXVlc3RlZF9tZW1vbmhlYXAoKSkgeworICAgICAgbGFzdENvbXBhcmlzb24gPSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy5yZXF1ZXN0ZWRfbWVtb25oZWFwLCBvdGhlci5yZXF1ZXN0ZWRfbWVtb25oZWFwKTsKKyAgICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICAgIH0KKyAgICB9CisgICAgbGFzdENvbXBhcmlzb24gPSBCb29sZWFuLnZhbHVlT2YoaXNfc2V0X3JlcXVlc3RlZF9tZW1vZmZoZWFwKCkpLmNvbXBhcmVUbyhvdGhlci5pc19zZXRfcmVxdWVzdGVkX21lbW9mZmhlYXAoKSk7CisgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICB9CisgICAgaWYgKGlzX3NldF9yZXF1ZXN0ZWRfbWVtb2ZmaGVhcCgpKSB7CisgICAgICBsYXN0Q29tcGFyaXNvbiA9IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvbXBhcmVUbyh0aGlzLnJlcXVlc3RlZF9tZW1vZmZoZWFwLCBvdGhlci5yZXF1ZXN0ZWRfbWVtb2ZmaGVhcCk7CisgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICB9CisgICAgfQorICAgIGxhc3RDb21wYXJpc29uID0gQm9vbGVhbi52YWx1ZU9mKGlzX3NldF9yZXF1ZXN0ZWRfY3B1KCkpLmNvbXBhcmVUbyhvdGhlci5pc19zZXRfcmVxdWVzdGVkX2NwdSgpKTsKKyAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgIH0KKyAgICBpZiAoaXNfc2V0X3JlcXVlc3RlZF9jcHUoKSkgeworICAgICAgbGFzdENvbXBhcmlzb24gPSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy5yZXF1ZXN0ZWRfY3B1LCBvdGhlci5yZXF1ZXN0ZWRfY3B1KTsKKyAgICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICAgIH0KKyAgICB9CisgICAgbGFzdENvbXBhcmlzb24gPSBCb29sZWFuLnZhbHVlT2YoaXNfc2V0X2Fzc2lnbmVkX21lbW9uaGVhcCgpKS5jb21wYXJlVG8ob3RoZXIuaXNfc2V0X2Fzc2lnbmVkX21lbW9uaGVhcCgpKTsKKyAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgIH0KKyAgICBpZiAoaXNfc2V0X2Fzc2lnbmVkX21lbW9uaGVhcCgpKSB7CisgICAgICBsYXN0Q29tcGFyaXNvbiA9IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvbXBhcmVUbyh0aGlzLmFzc2lnbmVkX21lbW9uaGVhcCwgb3RoZXIuYXNzaWduZWRfbWVtb25oZWFwKTsKKyAgICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICAgIH0KKyAgICB9CisgICAgbGFzdENvbXBhcmlzb24gPSBCb29sZWFuLnZhbHVlT2YoaXNfc2V0X2Fzc2lnbmVkX21lbW9mZmhlYXAoKSkuY29tcGFyZVRvKG90aGVyLmlzX3NldF9hc3NpZ25lZF9tZW1vZmZoZWFwKCkpOworICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgfQorICAgIGlmIChpc19zZXRfYXNzaWduZWRfbWVtb2ZmaGVhcCgpKSB7CisgICAgICBsYXN0Q29tcGFyaXNvbiA9IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvbXBhcmVUbyh0aGlzLmFzc2lnbmVkX21lbW9mZmhlYXAsIG90aGVyLmFzc2lnbmVkX21lbW9mZmhlYXApOworICAgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgICAgfQorICAgIH0KKyAgICBsYXN0Q29tcGFyaXNvbiA9IEJvb2xlYW4udmFsdWVPZihpc19zZXRfYXNzaWduZWRfY3B1KCkpLmNvbXBhcmVUbyhvdGhlci5pc19zZXRfYXNzaWduZWRfY3B1KCkpOworICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgfQorICAgIGlmIChpc19zZXRfYXNzaWduZWRfY3B1KCkpIHsKKyAgICAgIGxhc3RDb21wYXJpc29uID0gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29tcGFyZVRvKHRoaXMuYXNzaWduZWRfY3B1LCBvdGhlci5hc3NpZ25lZF9jcHUpOworICAgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgICAgfQorICAgIH0KICAgICByZXR1cm4gMDsKICAgfQogCkBAIC0xMDk4LDYgKzE1MTgsNDIgQEAKICAgICAgIHNiLmFwcGVuZCh0aGlzLnJlcGxpY2F0aW9uX2NvdW50KTsKICAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICAgfQorICAgIGlmIChpc19zZXRfcmVxdWVzdGVkX21lbW9uaGVhcCgpKSB7CisgICAgICBpZiAoIWZpcnN0KSBzYi5hcHBlbmQoIiwgIik7CisgICAgICBzYi5hcHBlbmQoInJlcXVlc3RlZF9tZW1vbmhlYXA6Iik7CisgICAgICBzYi5hcHBlbmQodGhpcy5yZXF1ZXN0ZWRfbWVtb25oZWFwKTsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfQorICAgIGlmIChpc19zZXRfcmVxdWVzdGVkX21lbW9mZmhlYXAoKSkgeworICAgICAgaWYgKCFmaXJzdCkgc2IuYXBwZW5kKCIsICIpOworICAgICAgc2IuYXBwZW5kKCJyZXF1ZXN0ZWRfbWVtb2ZmaGVhcDoiKTsKKyAgICAgIHNiLmFwcGVuZCh0aGlzLnJlcXVlc3RlZF9tZW1vZmZoZWFwKTsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfQorICAgIGlmIChpc19zZXRfcmVxdWVzdGVkX2NwdSgpKSB7CisgICAgICBpZiAoIWZpcnN0KSBzYi5hcHBlbmQoIiwgIik7CisgICAgICBzYi5hcHBlbmQoInJlcXVlc3RlZF9jcHU6Iik7CisgICAgICBzYi5hcHBlbmQodGhpcy5yZXF1ZXN0ZWRfY3B1KTsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfQorICAgIGlmIChpc19zZXRfYXNzaWduZWRfbWVtb25oZWFwKCkpIHsKKyAgICAgIGlmICghZmlyc3QpIHNiLmFwcGVuZCgiLCAiKTsKKyAgICAgIHNiLmFwcGVuZCgiYXNzaWduZWRfbWVtb25oZWFwOiIpOworICAgICAgc2IuYXBwZW5kKHRoaXMuYXNzaWduZWRfbWVtb25oZWFwKTsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfQorICAgIGlmIChpc19zZXRfYXNzaWduZWRfbWVtb2ZmaGVhcCgpKSB7CisgICAgICBpZiAoIWZpcnN0KSBzYi5hcHBlbmQoIiwgIik7CisgICAgICBzYi5hcHBlbmQoImFzc2lnbmVkX21lbW9mZmhlYXA6Iik7CisgICAgICBzYi5hcHBlbmQodGhpcy5hc3NpZ25lZF9tZW1vZmZoZWFwKTsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfQorICAgIGlmIChpc19zZXRfYXNzaWduZWRfY3B1KCkpIHsKKyAgICAgIGlmICghZmlyc3QpIHNiLmFwcGVuZCgiLCAiKTsKKyAgICAgIHNiLmFwcGVuZCgiYXNzaWduZWRfY3B1OiIpOworICAgICAgc2IuYXBwZW5kKHRoaXMuYXNzaWduZWRfY3B1KTsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfQogICAgIHNiLmFwcGVuZCgiKSIpOwogICAgIHJldHVybiBzYi50b1N0cmluZygpOwogICB9CkBAIC0xMTk0LDE0ICsxNjUwLDE0IEBACiAgICAgICAgICAgY2FzZSA0OiAvLyBFWEVDVVRPUlMKICAgICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkxJU1QpIHsKICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRMaXN0IF9saXN0Mjk4ID0gaXByb3QucmVhZExpc3RCZWdpbigpOwotICAgICAgICAgICAgICAgIHN0cnVjdC5leGVjdXRvcnMgPSBuZXcgQXJyYXlMaXN0PEV4ZWN1dG9yU3VtbWFyeT4oX2xpc3QyOTguc2l6ZSk7Ci0gICAgICAgICAgICAgICAgRXhlY3V0b3JTdW1tYXJ5IF9lbGVtMjk5OwotICAgICAgICAgICAgICAgIGZvciAoaW50IF9pMzAwID0gMDsgX2kzMDAgPCBfbGlzdDI5OC5zaXplOyArK19pMzAwKQorICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRMaXN0IF9saXN0MzE2ID0gaXByb3QucmVhZExpc3RCZWdpbigpOworICAgICAgICAgICAgICAgIHN0cnVjdC5leGVjdXRvcnMgPSBuZXcgQXJyYXlMaXN0PEV4ZWN1dG9yU3VtbWFyeT4oX2xpc3QzMTYuc2l6ZSk7CisgICAgICAgICAgICAgICAgRXhlY3V0b3JTdW1tYXJ5IF9lbGVtMzE3OworICAgICAgICAgICAgICAgIGZvciAoaW50IF9pMzE4ID0gMDsgX2kzMTggPCBfbGlzdDMxNi5zaXplOyArK19pMzE4KQogICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIF9lbGVtMjk5ID0gbmV3IEV4ZWN1dG9yU3VtbWFyeSgpOwotICAgICAgICAgICAgICAgICAgX2VsZW0yOTkucmVhZChpcHJvdCk7Ci0gICAgICAgICAgICAgICAgICBzdHJ1Y3QuZXhlY3V0b3JzLmFkZChfZWxlbTI5OSk7CisgICAgICAgICAgICAgICAgICBfZWxlbTMxNyA9IG5ldyBFeGVjdXRvclN1bW1hcnkoKTsKKyAgICAgICAgICAgICAgICAgIF9lbGVtMzE3LnJlYWQoaXByb3QpOworICAgICAgICAgICAgICAgICAgc3RydWN0LmV4ZWN1dG9ycy5hZGQoX2VsZW0zMTcpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpcHJvdC5yZWFkTGlzdEVuZCgpOwogICAgICAgICAgICAgICB9CkBAIC0xMjIxLDI2ICsxNjc3LDI2IEBACiAgICAgICAgICAgY2FzZSA2OiAvLyBFUlJPUlMKICAgICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLk1BUCkgewogICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwMzAxID0gaXByb3QucmVhZE1hcEJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgc3RydWN0LmVycm9ycyA9IG5ldyBIYXNoTWFwPFN0cmluZyxMaXN0PEVycm9ySW5mbz4+KDIqX21hcDMwMS5zaXplKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgX2tleTMwMjsKLSAgICAgICAgICAgICAgICBMaXN0PEVycm9ySW5mbz4gX3ZhbDMwMzsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBfaTMwNCA9IDA7IF9pMzA0IDwgX21hcDMwMS5zaXplOyArK19pMzA0KQorICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgX21hcDMxOSA9IGlwcm90LnJlYWRNYXBCZWdpbigpOworICAgICAgICAgICAgICAgIHN0cnVjdC5lcnJvcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsTGlzdDxFcnJvckluZm8+PigyKl9tYXAzMTkuc2l6ZSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIF9rZXkzMjA7CisgICAgICAgICAgICAgICAgTGlzdDxFcnJvckluZm8+IF92YWwzMjE7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgX2kzMjIgPSAwOyBfaTMyMiA8IF9tYXAzMTkuc2l6ZTsgKytfaTMyMikKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBfa2V5MzAyID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICAgICAgICAgICAgX2tleTMyMCA9IGlwcm90LnJlYWRTdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVExpc3QgX2xpc3QzMDUgPSBpcHJvdC5yZWFkTGlzdEJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgICAgIF92YWwzMDMgPSBuZXcgQXJyYXlMaXN0PEVycm9ySW5mbz4oX2xpc3QzMDUuc2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIEVycm9ySW5mbyBfZWxlbTMwNjsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgX2kzMDcgPSAwOyBfaTMwNyA8IF9saXN0MzA1LnNpemU7ICsrX2kzMDcpCisgICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRMaXN0IF9saXN0MzIzID0gaXByb3QucmVhZExpc3RCZWdpbigpOworICAgICAgICAgICAgICAgICAgICBfdmFsMzIxID0gbmV3IEFycmF5TGlzdDxFcnJvckluZm8+KF9saXN0MzIzLnNpemUpOworICAgICAgICAgICAgICAgICAgICBFcnJvckluZm8gX2VsZW0zMjQ7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IF9pMzI1ID0gMDsgX2kzMjUgPCBfbGlzdDMyMy5zaXplOyArK19pMzI1KQogICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgX2VsZW0zMDYgPSBuZXcgRXJyb3JJbmZvKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgX2VsZW0zMDYucmVhZChpcHJvdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgX3ZhbDMwMy5hZGQoX2VsZW0zMDYpOworICAgICAgICAgICAgICAgICAgICAgIF9lbGVtMzI0ID0gbmV3IEVycm9ySW5mbygpOworICAgICAgICAgICAgICAgICAgICAgIF9lbGVtMzI0LnJlYWQoaXByb3QpOworICAgICAgICAgICAgICAgICAgICAgIF92YWwzMjEuYWRkKF9lbGVtMzI0KTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBpcHJvdC5yZWFkTGlzdEVuZCgpOwogICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgc3RydWN0LmVycm9ycy5wdXQoX2tleTMwMiwgX3ZhbDMwMyk7CisgICAgICAgICAgICAgICAgICBzdHJ1Y3QuZXJyb3JzLnB1dChfa2V5MzIwLCBfdmFsMzIxKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaXByb3QucmVhZE1hcEVuZCgpOwogICAgICAgICAgICAgICB9CkBAIC0xMjUyLDE2ICsxNzA4LDE2IEBACiAgICAgICAgICAgY2FzZSA3OiAvLyBDT01QT05FTlRfREVCVUcKICAgICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLk1BUCkgewogICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwMzA4ID0gaXByb3QucmVhZE1hcEJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgc3RydWN0LmNvbXBvbmVudF9kZWJ1ZyA9IG5ldyBIYXNoTWFwPFN0cmluZyxEZWJ1Z09wdGlvbnM+KDIqX21hcDMwOC5zaXplKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgX2tleTMwOTsKLSAgICAgICAgICAgICAgICBEZWJ1Z09wdGlvbnMgX3ZhbDMxMDsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBfaTMxMSA9IDA7IF9pMzExIDwgX21hcDMwOC5zaXplOyArK19pMzExKQorICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgX21hcDMyNiA9IGlwcm90LnJlYWRNYXBCZWdpbigpOworICAgICAgICAgICAgICAgIHN0cnVjdC5jb21wb25lbnRfZGVidWcgPSBuZXcgSGFzaE1hcDxTdHJpbmcsRGVidWdPcHRpb25zPigyKl9tYXAzMjYuc2l6ZSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIF9rZXkzMjc7CisgICAgICAgICAgICAgICAgRGVidWdPcHRpb25zIF92YWwzMjg7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgX2kzMjkgPSAwOyBfaTMyOSA8IF9tYXAzMjYuc2l6ZTsgKytfaTMyOSkKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICBfa2V5MzA5ID0gaXByb3QucmVhZFN0cmluZygpOwotICAgICAgICAgICAgICAgICAgX3ZhbDMxMCA9IG5ldyBEZWJ1Z09wdGlvbnMoKTsKLSAgICAgICAgICAgICAgICAgIF92YWwzMTAucmVhZChpcHJvdCk7Ci0gICAgICAgICAgICAgICAgICBzdHJ1Y3QuY29tcG9uZW50X2RlYnVnLnB1dChfa2V5MzA5LCBfdmFsMzEwKTsKKyAgICAgICAgICAgICAgICAgIF9rZXkzMjcgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICBfdmFsMzI4ID0gbmV3IERlYnVnT3B0aW9ucygpOworICAgICAgICAgICAgICAgICAgX3ZhbDMyOC5yZWFkKGlwcm90KTsKKyAgICAgICAgICAgICAgICAgIHN0cnVjdC5jb21wb25lbnRfZGVidWcucHV0KF9rZXkzMjcsIF92YWwzMjgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpcHJvdC5yZWFkTWFwRW5kKCk7CiAgICAgICAgICAgICAgIH0KQEAgLTEyOTQsNiArMTc1MCw1NCBAQAogICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSA1MjE6IC8vIFJFUVVFU1RFRF9NRU1PTkhFQVAKKyAgICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkRPVUJMRSkgeworICAgICAgICAgICAgICBzdHJ1Y3QucmVxdWVzdGVkX21lbW9uaGVhcCA9IGlwcm90LnJlYWREb3VibGUoKTsKKyAgICAgICAgICAgICAgc3RydWN0LnNldF9yZXF1ZXN0ZWRfbWVtb25oZWFwX2lzU2V0KHRydWUpOworICAgICAgICAgICAgfSBlbHNlIHsgCisgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgc2NoZW1lRmllbGQudHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDUyMjogLy8gUkVRVUVTVEVEX01FTU9GRkhFQVAKKyAgICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkRPVUJMRSkgeworICAgICAgICAgICAgICBzdHJ1Y3QucmVxdWVzdGVkX21lbW9mZmhlYXAgPSBpcHJvdC5yZWFkRG91YmxlKCk7CisgICAgICAgICAgICAgIHN0cnVjdC5zZXRfcmVxdWVzdGVkX21lbW9mZmhlYXBfaXNTZXQodHJ1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeyAKKyAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgNTIzOiAvLyBSRVFVRVNURURfQ1BVCisgICAgICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5ET1VCTEUpIHsKKyAgICAgICAgICAgICAgc3RydWN0LnJlcXVlc3RlZF9jcHUgPSBpcHJvdC5yZWFkRG91YmxlKCk7CisgICAgICAgICAgICAgIHN0cnVjdC5zZXRfcmVxdWVzdGVkX2NwdV9pc1NldCh0cnVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7IAorICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSA1MjQ6IC8vIEFTU0lHTkVEX01FTU9OSEVBUAorICAgICAgICAgICAgaWYgKHNjaGVtZUZpZWxkLnR5cGUgPT0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuRE9VQkxFKSB7CisgICAgICAgICAgICAgIHN0cnVjdC5hc3NpZ25lZF9tZW1vbmhlYXAgPSBpcHJvdC5yZWFkRG91YmxlKCk7CisgICAgICAgICAgICAgIHN0cnVjdC5zZXRfYXNzaWduZWRfbWVtb25oZWFwX2lzU2V0KHRydWUpOworICAgICAgICAgICAgfSBlbHNlIHsgCisgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgc2NoZW1lRmllbGQudHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDUyNTogLy8gQVNTSUdORURfTUVNT0ZGSEVBUAorICAgICAgICAgICAgaWYgKHNjaGVtZUZpZWxkLnR5cGUgPT0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuRE9VQkxFKSB7CisgICAgICAgICAgICAgIHN0cnVjdC5hc3NpZ25lZF9tZW1vZmZoZWFwID0gaXByb3QucmVhZERvdWJsZSgpOworICAgICAgICAgICAgICBzdHJ1Y3Quc2V0X2Fzc2lnbmVkX21lbW9mZmhlYXBfaXNTZXQodHJ1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeyAKKyAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgNTI2OiAvLyBBU1NJR05FRF9DUFUKKyAgICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkRPVUJMRSkgeworICAgICAgICAgICAgICBzdHJ1Y3QuYXNzaWduZWRfY3B1ID0gaXByb3QucmVhZERvdWJsZSgpOworICAgICAgICAgICAgICBzdHJ1Y3Quc2V0X2Fzc2lnbmVkX2NwdV9pc1NldCh0cnVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7IAorICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgc2NoZW1lRmllbGQudHlwZSk7CiAgICAgICAgIH0KQEAgLTEzMjQsOSArMTgyOCw5IEBACiAgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihFWEVDVVRPUlNfRklFTERfREVTQyk7CiAgICAgICAgIHsKICAgICAgICAgICBvcHJvdC53cml0ZUxpc3RCZWdpbihuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVExpc3Qob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNULCBzdHJ1Y3QuZXhlY3V0b3JzLnNpemUoKSkpOwotICAgICAgICAgIGZvciAoRXhlY3V0b3JTdW1tYXJ5IF9pdGVyMzEyIDogc3RydWN0LmV4ZWN1dG9ycykKKyAgICAgICAgICBmb3IgKEV4ZWN1dG9yU3VtbWFyeSBfaXRlcjMzMCA6IHN0cnVjdC5leGVjdXRvcnMpCiAgICAgICAgICAgewotICAgICAgICAgICAgX2l0ZXIzMTIud3JpdGUob3Byb3QpOworICAgICAgICAgICAgX2l0ZXIzMzAud3JpdGUob3Byb3QpOwogICAgICAgICAgIH0KICAgICAgICAgICBvcHJvdC53cml0ZUxpc3RFbmQoKTsKICAgICAgICAgfQpAQCAtMTM0MSwxNCArMTg0NSwxNCBAQAogICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oRVJST1JTX0ZJRUxEX0RFU0MpOwogICAgICAgICB7CiAgICAgICAgICAgb3Byb3Qud3JpdGVNYXBCZWdpbihuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkxJU1QsIHN0cnVjdC5lcnJvcnMuc2l6ZSgpKSk7Ci0gICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBMaXN0PEVycm9ySW5mbz4+IF9pdGVyMzEzIDogc3RydWN0LmVycm9ycy5lbnRyeVNldCgpKQorICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgTGlzdDxFcnJvckluZm8+PiBfaXRlcjMzMSA6IHN0cnVjdC5lcnJvcnMuZW50cnlTZXQoKSkKICAgICAgICAgICB7Ci0gICAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhfaXRlcjMxMy5nZXRLZXkoKSk7CisgICAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhfaXRlcjMzMS5nZXRLZXkoKSk7CiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG9wcm90LndyaXRlTGlzdEJlZ2luKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTGlzdChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIF9pdGVyMzEzLmdldFZhbHVlKCkuc2l6ZSgpKSk7Ci0gICAgICAgICAgICAgIGZvciAoRXJyb3JJbmZvIF9pdGVyMzE0IDogX2l0ZXIzMTMuZ2V0VmFsdWUoKSkKKyAgICAgICAgICAgICAgb3Byb3Qud3JpdGVMaXN0QmVnaW4obmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRMaXN0KG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCwgX2l0ZXIzMzEuZ2V0VmFsdWUoKS5zaXplKCkpKTsKKyAgICAgICAgICAgICAgZm9yIChFcnJvckluZm8gX2l0ZXIzMzIgOiBfaXRlcjMzMS5nZXRWYWx1ZSgpKQogICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgX2l0ZXIzMTQud3JpdGUob3Byb3QpOworICAgICAgICAgICAgICAgIF9pdGVyMzMyLndyaXRlKG9wcm90KTsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBvcHJvdC53cml0ZUxpc3RFbmQoKTsKICAgICAgICAgICAgIH0KQEAgLTEzNjIsMTAgKzE4NjYsMTAgQEAKICAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oQ09NUE9ORU5UX0RFQlVHX0ZJRUxEX0RFU0MpOwogICAgICAgICAgIHsKICAgICAgICAgICAgIG9wcm90LndyaXRlTWFwQmVnaW4obmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIHN0cnVjdC5jb21wb25lbnRfZGVidWcuc2l6ZSgpKSk7Ci0gICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIERlYnVnT3B0aW9ucz4gX2l0ZXIzMTUgOiBzdHJ1Y3QuY29tcG9uZW50X2RlYnVnLmVudHJ5U2V0KCkpCisgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIERlYnVnT3B0aW9ucz4gX2l0ZXIzMzMgOiBzdHJ1Y3QuY29tcG9uZW50X2RlYnVnLmVudHJ5U2V0KCkpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKF9pdGVyMzE1LmdldEtleSgpKTsKLSAgICAgICAgICAgICAgX2l0ZXIzMTUuZ2V0VmFsdWUoKS53cml0ZShvcHJvdCk7CisgICAgICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKF9pdGVyMzMzLmdldEtleSgpKTsKKyAgICAgICAgICAgICAgX2l0ZXIzMzMuZ2V0VmFsdWUoKS53cml0ZShvcHJvdCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBvcHJvdC53cml0ZU1hcEVuZCgpOwogICAgICAgICAgIH0KQEAgLTEzOTEsNiArMTg5NSwzNiBAQAogICAgICAgICBvcHJvdC53cml0ZUkzMihzdHJ1Y3QucmVwbGljYXRpb25fY291bnQpOwogICAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CiAgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9yZXF1ZXN0ZWRfbWVtb25oZWFwKCkpIHsKKyAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKFJFUVVFU1RFRF9NRU1PTkhFQVBfRklFTERfREVTQyk7CisgICAgICAgIG9wcm90LndyaXRlRG91YmxlKHN0cnVjdC5yZXF1ZXN0ZWRfbWVtb25oZWFwKTsKKyAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5pc19zZXRfcmVxdWVzdGVkX21lbW9mZmhlYXAoKSkgeworICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oUkVRVUVTVEVEX01FTU9GRkhFQVBfRklFTERfREVTQyk7CisgICAgICAgIG9wcm90LndyaXRlRG91YmxlKHN0cnVjdC5yZXF1ZXN0ZWRfbWVtb2ZmaGVhcCk7CisgICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X3JlcXVlc3RlZF9jcHUoKSkgeworICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oUkVRVUVTVEVEX0NQVV9GSUVMRF9ERVNDKTsKKyAgICAgICAgb3Byb3Qud3JpdGVEb3VibGUoc3RydWN0LnJlcXVlc3RlZF9jcHUpOworICAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9hc3NpZ25lZF9tZW1vbmhlYXAoKSkgeworICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oQVNTSUdORURfTUVNT05IRUFQX0ZJRUxEX0RFU0MpOworICAgICAgICBvcHJvdC53cml0ZURvdWJsZShzdHJ1Y3QuYXNzaWduZWRfbWVtb25oZWFwKTsKKyAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5pc19zZXRfYXNzaWduZWRfbWVtb2ZmaGVhcCgpKSB7CisgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihBU1NJR05FRF9NRU1PRkZIRUFQX0ZJRUxEX0RFU0MpOworICAgICAgICBvcHJvdC53cml0ZURvdWJsZShzdHJ1Y3QuYXNzaWduZWRfbWVtb2ZmaGVhcCk7CisgICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X2Fzc2lnbmVkX2NwdSgpKSB7CisgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihBU1NJR05FRF9DUFVfRklFTERfREVTQyk7CisgICAgICAgIG9wcm90LndyaXRlRG91YmxlKHN0cnVjdC5hc3NpZ25lZF9jcHUpOworICAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgICB9CiAgICAgICBvcHJvdC53cml0ZUZpZWxkU3RvcCgpOwogICAgICAgb3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsKICAgICB9CkBAIC0xNDEzLDIyICsxOTQ3LDIyIEBACiAgICAgICBvcHJvdC53cml0ZUkzMihzdHJ1Y3QudXB0aW1lX3NlY3MpOwogICAgICAgewogICAgICAgICBvcHJvdC53cml0ZUkzMihzdHJ1Y3QuZXhlY3V0b3JzLnNpemUoKSk7Ci0gICAgICAgIGZvciAoRXhlY3V0b3JTdW1tYXJ5IF9pdGVyMzE2IDogc3RydWN0LmV4ZWN1dG9ycykKKyAgICAgICAgZm9yIChFeGVjdXRvclN1bW1hcnkgX2l0ZXIzMzQgOiBzdHJ1Y3QuZXhlY3V0b3JzKQogICAgICAgICB7Ci0gICAgICAgICAgX2l0ZXIzMTYud3JpdGUob3Byb3QpOworICAgICAgICAgIF9pdGVyMzM0LndyaXRlKG9wcm90KTsKICAgICAgICAgfQogICAgICAgfQogICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoc3RydWN0LnN0YXR1cyk7CiAgICAgICB7CiAgICAgICAgIG9wcm90LndyaXRlSTMyKHN0cnVjdC5lcnJvcnMuc2l6ZSgpKTsKLSAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBMaXN0PEVycm9ySW5mbz4+IF9pdGVyMzE3IDogc3RydWN0LmVycm9ycy5lbnRyeVNldCgpKQorICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIExpc3Q8RXJyb3JJbmZvPj4gX2l0ZXIzMzUgOiBzdHJ1Y3QuZXJyb3JzLmVudHJ5U2V0KCkpCiAgICAgICAgIHsKLSAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhfaXRlcjMxNy5nZXRLZXkoKSk7CisgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoX2l0ZXIzMzUuZ2V0S2V5KCkpOwogICAgICAgICAgIHsKLSAgICAgICAgICAgIG9wcm90LndyaXRlSTMyKF9pdGVyMzE3LmdldFZhbHVlKCkuc2l6ZSgpKTsKLSAgICAgICAgICAgIGZvciAoRXJyb3JJbmZvIF9pdGVyMzE4IDogX2l0ZXIzMTcuZ2V0VmFsdWUoKSkKKyAgICAgICAgICAgIG9wcm90LndyaXRlSTMyKF9pdGVyMzM1LmdldFZhbHVlKCkuc2l6ZSgpKTsKKyAgICAgICAgICAgIGZvciAoRXJyb3JJbmZvIF9pdGVyMzM2IDogX2l0ZXIzMzUuZ2V0VmFsdWUoKSkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgX2l0ZXIzMTgud3JpdGUob3Byb3QpOworICAgICAgICAgICAgICBfaXRlcjMzNi53cml0ZShvcHJvdCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xNDQ2LDE0ICsxOTgwLDMyIEBACiAgICAgICBpZiAoc3RydWN0LmlzX3NldF9yZXBsaWNhdGlvbl9jb3VudCgpKSB7CiAgICAgICAgIG9wdGlvbmFscy5zZXQoMyk7CiAgICAgICB9Ci0gICAgICBvcHJvdC53cml0ZUJpdFNldChvcHRpb25hbHMsIDQpOworICAgICAgaWYgKHN0cnVjdC5pc19zZXRfcmVxdWVzdGVkX21lbW9uaGVhcCgpKSB7CisgICAgICAgIG9wdGlvbmFscy5zZXQoNCk7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9yZXF1ZXN0ZWRfbWVtb2ZmaGVhcCgpKSB7CisgICAgICAgIG9wdGlvbmFscy5zZXQoNSk7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9yZXF1ZXN0ZWRfY3B1KCkpIHsKKyAgICAgICAgb3B0aW9uYWxzLnNldCg2KTsKKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X2Fzc2lnbmVkX21lbW9uaGVhcCgpKSB7CisgICAgICAgIG9wdGlvbmFscy5zZXQoNyk7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9hc3NpZ25lZF9tZW1vZmZoZWFwKCkpIHsKKyAgICAgICAgb3B0aW9uYWxzLnNldCg4KTsKKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X2Fzc2lnbmVkX2NwdSgpKSB7CisgICAgICAgIG9wdGlvbmFscy5zZXQoOSk7CisgICAgICB9CisgICAgICBvcHJvdC53cml0ZUJpdFNldChvcHRpb25hbHMsIDEwKTsKICAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X2NvbXBvbmVudF9kZWJ1ZygpKSB7CiAgICAgICAgIHsKICAgICAgICAgICBvcHJvdC53cml0ZUkzMihzdHJ1Y3QuY29tcG9uZW50X2RlYnVnLnNpemUoKSk7Ci0gICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBEZWJ1Z09wdGlvbnM+IF9pdGVyMzE5IDogc3RydWN0LmNvbXBvbmVudF9kZWJ1Zy5lbnRyeVNldCgpKQorICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgRGVidWdPcHRpb25zPiBfaXRlcjMzNyA6IHN0cnVjdC5jb21wb25lbnRfZGVidWcuZW50cnlTZXQoKSkKICAgICAgICAgICB7Ci0gICAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhfaXRlcjMxOS5nZXRLZXkoKSk7Ci0gICAgICAgICAgICBfaXRlcjMxOS5nZXRWYWx1ZSgpLndyaXRlKG9wcm90KTsKKyAgICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKF9pdGVyMzM3LmdldEtleSgpKTsKKyAgICAgICAgICAgIF9pdGVyMzM3LmdldFZhbHVlKCkud3JpdGUob3Byb3QpOwogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgfQpAQCAtMTQ2Niw2ICsyMDE4LDI0IEBACiAgICAgICBpZiAoc3RydWN0LmlzX3NldF9yZXBsaWNhdGlvbl9jb3VudCgpKSB7CiAgICAgICAgIG9wcm90LndyaXRlSTMyKHN0cnVjdC5yZXBsaWNhdGlvbl9jb3VudCk7CiAgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9yZXF1ZXN0ZWRfbWVtb25oZWFwKCkpIHsKKyAgICAgICAgb3Byb3Qud3JpdGVEb3VibGUoc3RydWN0LnJlcXVlc3RlZF9tZW1vbmhlYXApOworICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5pc19zZXRfcmVxdWVzdGVkX21lbW9mZmhlYXAoKSkgeworICAgICAgICBvcHJvdC53cml0ZURvdWJsZShzdHJ1Y3QucmVxdWVzdGVkX21lbW9mZmhlYXApOworICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5pc19zZXRfcmVxdWVzdGVkX2NwdSgpKSB7CisgICAgICAgIG9wcm90LndyaXRlRG91YmxlKHN0cnVjdC5yZXF1ZXN0ZWRfY3B1KTsKKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X2Fzc2lnbmVkX21lbW9uaGVhcCgpKSB7CisgICAgICAgIG9wcm90LndyaXRlRG91YmxlKHN0cnVjdC5hc3NpZ25lZF9tZW1vbmhlYXApOworICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5pc19zZXRfYXNzaWduZWRfbWVtb2ZmaGVhcCgpKSB7CisgICAgICAgIG9wcm90LndyaXRlRG91YmxlKHN0cnVjdC5hc3NpZ25lZF9tZW1vZmZoZWFwKTsKKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X2Fzc2lnbmVkX2NwdSgpKSB7CisgICAgICAgIG9wcm90LndyaXRlRG91YmxlKHN0cnVjdC5hc3NpZ25lZF9jcHUpOworICAgICAgfQogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtMTQ3OCw1NSArMjA0OCw1NSBAQAogICAgICAgc3RydWN0LnVwdGltZV9zZWNzID0gaXByb3QucmVhZEkzMigpOwogICAgICAgc3RydWN0LnNldF91cHRpbWVfc2Vjc19pc1NldCh0cnVlKTsKICAgICAgIHsKLSAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVExpc3QgX2xpc3QzMjAgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVExpc3Qob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNULCBpcHJvdC5yZWFkSTMyKCkpOwotICAgICAgICBzdHJ1Y3QuZXhlY3V0b3JzID0gbmV3IEFycmF5TGlzdDxFeGVjdXRvclN1bW1hcnk+KF9saXN0MzIwLnNpemUpOwotICAgICAgICBFeGVjdXRvclN1bW1hcnkgX2VsZW0zMjE7Ci0gICAgICAgIGZvciAoaW50IF9pMzIyID0gMDsgX2kzMjIgPCBfbGlzdDMyMC5zaXplOyArK19pMzIyKQorICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTGlzdCBfbGlzdDMzOCA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTGlzdChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIGlwcm90LnJlYWRJMzIoKSk7CisgICAgICAgIHN0cnVjdC5leGVjdXRvcnMgPSBuZXcgQXJyYXlMaXN0PEV4ZWN1dG9yU3VtbWFyeT4oX2xpc3QzMzguc2l6ZSk7CisgICAgICAgIEV4ZWN1dG9yU3VtbWFyeSBfZWxlbTMzOTsKKyAgICAgICAgZm9yIChpbnQgX2kzNDAgPSAwOyBfaTM0MCA8IF9saXN0MzM4LnNpemU7ICsrX2kzNDApCiAgICAgICAgIHsKLSAgICAgICAgICBfZWxlbTMyMSA9IG5ldyBFeGVjdXRvclN1bW1hcnkoKTsKLSAgICAgICAgICBfZWxlbTMyMS5yZWFkKGlwcm90KTsKLSAgICAgICAgICBzdHJ1Y3QuZXhlY3V0b3JzLmFkZChfZWxlbTMyMSk7CisgICAgICAgICAgX2VsZW0zMzkgPSBuZXcgRXhlY3V0b3JTdW1tYXJ5KCk7CisgICAgICAgICAgX2VsZW0zMzkucmVhZChpcHJvdCk7CisgICAgICAgICAgc3RydWN0LmV4ZWN1dG9ycy5hZGQoX2VsZW0zMzkpOwogICAgICAgICB9CiAgICAgICB9CiAgICAgICBzdHJ1Y3Quc2V0X2V4ZWN1dG9yc19pc1NldCh0cnVlKTsKICAgICAgIHN0cnVjdC5zdGF0dXMgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CiAgICAgICBzdHJ1Y3Quc2V0X3N0YXR1c19pc1NldCh0cnVlKTsKICAgICAgIHsKLSAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwMzIzID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5MSVNULCBpcHJvdC5yZWFkSTMyKCkpOwotICAgICAgICBzdHJ1Y3QuZXJyb3JzID0gbmV3IEhhc2hNYXA8U3RyaW5nLExpc3Q8RXJyb3JJbmZvPj4oMipfbWFwMzIzLnNpemUpOwotICAgICAgICBTdHJpbmcgX2tleTMyNDsKLSAgICAgICAgTGlzdDxFcnJvckluZm8+IF92YWwzMjU7Ci0gICAgICAgIGZvciAoaW50IF9pMzI2ID0gMDsgX2kzMjYgPCBfbWFwMzIzLnNpemU7ICsrX2kzMjYpCisgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgX21hcDM0MSA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORywgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTElTVCwgaXByb3QucmVhZEkzMigpKTsKKyAgICAgICAgc3RydWN0LmVycm9ycyA9IG5ldyBIYXNoTWFwPFN0cmluZyxMaXN0PEVycm9ySW5mbz4+KDIqX21hcDM0MS5zaXplKTsKKyAgICAgICAgU3RyaW5nIF9rZXkzNDI7CisgICAgICAgIExpc3Q8RXJyb3JJbmZvPiBfdmFsMzQzOworICAgICAgICBmb3IgKGludCBfaTM0NCA9IDA7IF9pMzQ0IDwgX21hcDM0MS5zaXplOyArK19pMzQ0KQogICAgICAgICB7Ci0gICAgICAgICAgX2tleTMyNCA9IGlwcm90LnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICBfa2V5MzQyID0gaXByb3QucmVhZFN0cmluZygpOwogICAgICAgICAgIHsKLSAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRMaXN0IF9saXN0MzI3ID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRMaXN0KG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCwgaXByb3QucmVhZEkzMigpKTsKLSAgICAgICAgICAgIF92YWwzMjUgPSBuZXcgQXJyYXlMaXN0PEVycm9ySW5mbz4oX2xpc3QzMjcuc2l6ZSk7Ci0gICAgICAgICAgICBFcnJvckluZm8gX2VsZW0zMjg7Ci0gICAgICAgICAgICBmb3IgKGludCBfaTMyOSA9IDA7IF9pMzI5IDwgX2xpc3QzMjcuc2l6ZTsgKytfaTMyOSkKKyAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRMaXN0IF9saXN0MzQ1ID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRMaXN0KG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCwgaXByb3QucmVhZEkzMigpKTsKKyAgICAgICAgICAgIF92YWwzNDMgPSBuZXcgQXJyYXlMaXN0PEVycm9ySW5mbz4oX2xpc3QzNDUuc2l6ZSk7CisgICAgICAgICAgICBFcnJvckluZm8gX2VsZW0zNDY7CisgICAgICAgICAgICBmb3IgKGludCBfaTM0NyA9IDA7IF9pMzQ3IDwgX2xpc3QzNDUuc2l6ZTsgKytfaTM0NykKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgX2VsZW0zMjggPSBuZXcgRXJyb3JJbmZvKCk7Ci0gICAgICAgICAgICAgIF9lbGVtMzI4LnJlYWQoaXByb3QpOwotICAgICAgICAgICAgICBfdmFsMzI1LmFkZChfZWxlbTMyOCk7CisgICAgICAgICAgICAgIF9lbGVtMzQ2ID0gbmV3IEVycm9ySW5mbygpOworICAgICAgICAgICAgICBfZWxlbTM0Ni5yZWFkKGlwcm90KTsKKyAgICAgICAgICAgICAgX3ZhbDM0My5hZGQoX2VsZW0zNDYpOwogICAgICAgICAgICAgfQogICAgICAgICAgIH0KLSAgICAgICAgICBzdHJ1Y3QuZXJyb3JzLnB1dChfa2V5MzI0LCBfdmFsMzI1KTsKKyAgICAgICAgICBzdHJ1Y3QuZXJyb3JzLnB1dChfa2V5MzQyLCBfdmFsMzQzKTsKICAgICAgICAgfQogICAgICAgfQogICAgICAgc3RydWN0LnNldF9lcnJvcnNfaXNTZXQodHJ1ZSk7Ci0gICAgICBCaXRTZXQgaW5jb21pbmcgPSBpcHJvdC5yZWFkQml0U2V0KDQpOworICAgICAgQml0U2V0IGluY29taW5nID0gaXByb3QucmVhZEJpdFNldCgxMCk7CiAgICAgICBpZiAoaW5jb21pbmcuZ2V0KDApKSB7CiAgICAgICAgIHsKLSAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwIF9tYXAzMzAgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCwgaXByb3QucmVhZEkzMigpKTsKLSAgICAgICAgICBzdHJ1Y3QuY29tcG9uZW50X2RlYnVnID0gbmV3IEhhc2hNYXA8U3RyaW5nLERlYnVnT3B0aW9ucz4oMipfbWFwMzMwLnNpemUpOwotICAgICAgICAgIFN0cmluZyBfa2V5MzMxOwotICAgICAgICAgIERlYnVnT3B0aW9ucyBfdmFsMzMyOwotICAgICAgICAgIGZvciAoaW50IF9pMzMzID0gMDsgX2kzMzMgPCBfbWFwMzMwLnNpemU7ICsrX2kzMzMpCisgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwMzQ4ID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIGlwcm90LnJlYWRJMzIoKSk7CisgICAgICAgICAgc3RydWN0LmNvbXBvbmVudF9kZWJ1ZyA9IG5ldyBIYXNoTWFwPFN0cmluZyxEZWJ1Z09wdGlvbnM+KDIqX21hcDM0OC5zaXplKTsKKyAgICAgICAgICBTdHJpbmcgX2tleTM0OTsKKyAgICAgICAgICBEZWJ1Z09wdGlvbnMgX3ZhbDM1MDsKKyAgICAgICAgICBmb3IgKGludCBfaTM1MSA9IDA7IF9pMzUxIDwgX21hcDM0OC5zaXplOyArK19pMzUxKQogICAgICAgICAgIHsKLSAgICAgICAgICAgIF9rZXkzMzEgPSBpcHJvdC5yZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgICBfdmFsMzMyID0gbmV3IERlYnVnT3B0aW9ucygpOwotICAgICAgICAgICAgX3ZhbDMzMi5yZWFkKGlwcm90KTsKLSAgICAgICAgICAgIHN0cnVjdC5jb21wb25lbnRfZGVidWcucHV0KF9rZXkzMzEsIF92YWwzMzIpOworICAgICAgICAgICAgX2tleTM0OSA9IGlwcm90LnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgIF92YWwzNTAgPSBuZXcgRGVidWdPcHRpb25zKCk7CisgICAgICAgICAgICBfdmFsMzUwLnJlYWQoaXByb3QpOworICAgICAgICAgICAgc3RydWN0LmNvbXBvbmVudF9kZWJ1Zy5wdXQoX2tleTM0OSwgX3ZhbDM1MCk7CiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHN0cnVjdC5zZXRfY29tcG9uZW50X2RlYnVnX2lzU2V0KHRydWUpOwpAQCAtMTU0Myw2ICsyMTEzLDMwIEBACiAgICAgICAgIHN0cnVjdC5yZXBsaWNhdGlvbl9jb3VudCA9IGlwcm90LnJlYWRJMzIoKTsKICAgICAgICAgc3RydWN0LnNldF9yZXBsaWNhdGlvbl9jb3VudF9pc1NldCh0cnVlKTsKICAgICAgIH0KKyAgICAgIGlmIChpbmNvbWluZy5nZXQoNCkpIHsKKyAgICAgICAgc3RydWN0LnJlcXVlc3RlZF9tZW1vbmhlYXAgPSBpcHJvdC5yZWFkRG91YmxlKCk7CisgICAgICAgIHN0cnVjdC5zZXRfcmVxdWVzdGVkX21lbW9uaGVhcF9pc1NldCh0cnVlKTsKKyAgICAgIH0KKyAgICAgIGlmIChpbmNvbWluZy5nZXQoNSkpIHsKKyAgICAgICAgc3RydWN0LnJlcXVlc3RlZF9tZW1vZmZoZWFwID0gaXByb3QucmVhZERvdWJsZSgpOworICAgICAgICBzdHJ1Y3Quc2V0X3JlcXVlc3RlZF9tZW1vZmZoZWFwX2lzU2V0KHRydWUpOworICAgICAgfQorICAgICAgaWYgKGluY29taW5nLmdldCg2KSkgeworICAgICAgICBzdHJ1Y3QucmVxdWVzdGVkX2NwdSA9IGlwcm90LnJlYWREb3VibGUoKTsKKyAgICAgICAgc3RydWN0LnNldF9yZXF1ZXN0ZWRfY3B1X2lzU2V0KHRydWUpOworICAgICAgfQorICAgICAgaWYgKGluY29taW5nLmdldCg3KSkgeworICAgICAgICBzdHJ1Y3QuYXNzaWduZWRfbWVtb25oZWFwID0gaXByb3QucmVhZERvdWJsZSgpOworICAgICAgICBzdHJ1Y3Quc2V0X2Fzc2lnbmVkX21lbW9uaGVhcF9pc1NldCh0cnVlKTsKKyAgICAgIH0KKyAgICAgIGlmIChpbmNvbWluZy5nZXQoOCkpIHsKKyAgICAgICAgc3RydWN0LmFzc2lnbmVkX21lbW9mZmhlYXAgPSBpcHJvdC5yZWFkRG91YmxlKCk7CisgICAgICAgIHN0cnVjdC5zZXRfYXNzaWduZWRfbWVtb2ZmaGVhcF9pc1NldCh0cnVlKTsKKyAgICAgIH0KKyAgICAgIGlmIChpbmNvbWluZy5nZXQoOSkpIHsKKyAgICAgICAgc3RydWN0LmFzc2lnbmVkX2NwdSA9IGlwcm90LnJlYWREb3VibGUoKTsKKyAgICAgICAgc3RydWN0LnNldF9hc3NpZ25lZF9jcHVfaXNTZXQodHJ1ZSk7CisgICAgICB9CiAgICAgfQogICB9CiAKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvVG9wb2xvZ3lJbml0aWFsU3RhdHVzLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL1RvcG9sb2d5SW5pdGlhbFN0YXR1cy5qYXZhCmluZGV4IGE4ZDZjOWUuLjcxMTdiZDQgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvVG9wb2xvZ3lJbml0aWFsU3RhdHVzLmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9Ub3BvbG9neUluaXRpYWxTdGF0dXMuamF2YQpAQCAtMTYsNyArMTYsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIC8qKgotICogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4yKQorICogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4zKQogICoKICAqIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkcKICAqICBAZ2VuZXJhdGVkCmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL1RvcG9sb2d5UGFnZUluZm8uamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvVG9wb2xvZ3lQYWdlSW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NDNjYWMKLS0tIC9kZXYvbnVsbAorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL1RvcG9sb2d5UGFnZUluZm8uamF2YQpAQCAtMCwwICsxLDI1OTcgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisvKioKKyAqIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMykKKyAqCisgKiBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HCisgKiAgQGdlbmVyYXRlZAorICovCitwYWNrYWdlIGJhY2t0eXBlLnN0b3JtLmdlbmVyYXRlZDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5JU2NoZW1lOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5TY2hlbWVGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5TdGFuZGFyZFNjaGVtZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5UdXBsZVNjaGVtZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHVwbGVQcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuRW5jb2RpbmdVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLkFzeW5jTWV0aG9kQ2FsbGJhY2s7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLkFic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXIuKjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkVudW1NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bVNldDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkJpdFNldDsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQ7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworQFN1cHByZXNzV2FybmluZ3MoeyJjYXN0IiwgInJhd3R5cGVzIiwgInNlcmlhbCIsICJ1bmNoZWNrZWQifSkKK0BHZW5lcmF0ZWQodmFsdWUgPSAiQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4zKSIpCitwdWJsaWMgY2xhc3MgVG9wb2xvZ3lQYWdlSW5mbyBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlPFRvcG9sb2d5UGFnZUluZm8sIFRvcG9sb2d5UGFnZUluZm8uX0ZpZWxkcz4sIGphdmEuaW8uU2VyaWFsaXphYmxlLCBDbG9uZWFibGUsIENvbXBhcmFibGU8VG9wb2xvZ3lQYWdlSW5mbz4geworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0IFNUUlVDVF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QoIlRvcG9sb2d5UGFnZUluZm8iKTsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgSURfRklFTERfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQoImlkIiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCAoc2hvcnQpMSk7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBOQU1FX0ZJRUxEX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkKCJuYW1lIiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCAoc2hvcnQpMik7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBVUFRJTUVfU0VDU19GSUVMRF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCgidXB0aW1lX3NlY3MiLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JMzIsIChzaG9ydCkzKTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIFNUQVRVU19GSUVMRF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCgic3RhdHVzIiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCAoc2hvcnQpNCk7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBOVU1fVEFTS1NfRklFTERfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQoIm51bV90YXNrcyIsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkkzMiwgKHNob3J0KTUpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgTlVNX1dPUktFUlNfRklFTERfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQoIm51bV93b3JrZXJzIiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTMyLCAoc2hvcnQpNik7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBOVU1fRVhFQ1VUT1JTX0ZJRUxEX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkKCJudW1fZXhlY3V0b3JzIiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTMyLCAoc2hvcnQpNyk7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBUT1BPTE9HWV9DT05GX0ZJRUxEX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkKCJ0b3BvbG9neV9jb25mIiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCAoc2hvcnQpOCk7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBJRF9UT19TUE9VVF9BR0dfU1RBVFNfRklFTERfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQoImlkX3RvX3Nwb3V0X2FnZ19zdGF0cyIsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLk1BUCwgKHNob3J0KTkpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgSURfVE9fQk9MVF9BR0dfU1RBVFNfRklFTERfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQoImlkX3RvX2JvbHRfYWdnX3N0YXRzIiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTUFQLCAoc2hvcnQpMTApOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgU0NIRURfU1RBVFVTX0ZJRUxEX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkKCJzY2hlZF9zdGF0dXMiLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcsIChzaG9ydCkxMSk7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBUT1BPTE9HWV9TVEFUU19GSUVMRF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCgidG9wb2xvZ3lfc3RhdHMiLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIChzaG9ydCkxMik7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBPV05FUl9GSUVMRF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCgib3duZXIiLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcsIChzaG9ydCkxMyk7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBERUJVR19PUFRJT05TX0ZJRUxEX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkKCJkZWJ1Z19vcHRpb25zIiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNULCAoc2hvcnQpMTQpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgUkVQTElDQVRJT05fQ09VTlRfRklFTERfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQoInJlcGxpY2F0aW9uX2NvdW50Iiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTMyLCAoc2hvcnQpMTUpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgUkVRVUVTVEVEX01FTU9OSEVBUF9GSUVMRF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCgicmVxdWVzdGVkX21lbW9uaGVhcCIsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkRPVUJMRSwgKHNob3J0KTUyMSk7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBSRVFVRVNURURfTUVNT0ZGSEVBUF9GSUVMRF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCgicmVxdWVzdGVkX21lbW9mZmhlYXAiLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5ET1VCTEUsIChzaG9ydCk1MjIpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgUkVRVUVTVEVEX0NQVV9GSUVMRF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCgicmVxdWVzdGVkX2NwdSIsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkRPVUJMRSwgKHNob3J0KTUyMyk7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBBU1NJR05FRF9NRU1PTkhFQVBfRklFTERfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQoImFzc2lnbmVkX21lbW9uaGVhcCIsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkRPVUJMRSwgKHNob3J0KTUyNCk7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBBU1NJR05FRF9NRU1PRkZIRUFQX0ZJRUxEX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkKCJhc3NpZ25lZF9tZW1vZmZoZWFwIiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuRE9VQkxFLCAoc2hvcnQpNTI1KTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIEFTU0lHTkVEX0NQVV9GSUVMRF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCgiYXNzaWduZWRfY3B1Iiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuRE9VQkxFLCAoc2hvcnQpNTI2KTsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8Q2xhc3M8PyBleHRlbmRzIElTY2hlbWU+LCBTY2hlbWVGYWN0b3J5PiBzY2hlbWVzID0gbmV3IEhhc2hNYXA8Q2xhc3M8PyBleHRlbmRzIElTY2hlbWU+LCBTY2hlbWVGYWN0b3J5PigpOworICBzdGF0aWMgeworICAgIHNjaGVtZXMucHV0KFN0YW5kYXJkU2NoZW1lLmNsYXNzLCBuZXcgVG9wb2xvZ3lQYWdlSW5mb1N0YW5kYXJkU2NoZW1lRmFjdG9yeSgpKTsKKyAgICBzY2hlbWVzLnB1dChUdXBsZVNjaGVtZS5jbGFzcywgbmV3IFRvcG9sb2d5UGFnZUluZm9UdXBsZVNjaGVtZUZhY3RvcnkoKSk7CisgIH0KKworICBwcml2YXRlIFN0cmluZyBpZDsgLy8gcmVxdWlyZWQKKyAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsgLy8gb3B0aW9uYWwKKyAgcHJpdmF0ZSBpbnQgdXB0aW1lX3NlY3M7IC8vIG9wdGlvbmFsCisgIHByaXZhdGUgU3RyaW5nIHN0YXR1czsgLy8gb3B0aW9uYWwKKyAgcHJpdmF0ZSBpbnQgbnVtX3Rhc2tzOyAvLyBvcHRpb25hbAorICBwcml2YXRlIGludCBudW1fd29ya2VyczsgLy8gb3B0aW9uYWwKKyAgcHJpdmF0ZSBpbnQgbnVtX2V4ZWN1dG9yczsgLy8gb3B0aW9uYWwKKyAgcHJpdmF0ZSBTdHJpbmcgdG9wb2xvZ3lfY29uZjsgLy8gb3B0aW9uYWwKKyAgcHJpdmF0ZSBNYXA8U3RyaW5nLENvbXBvbmVudEFnZ3JlZ2F0ZVN0YXRzPiBpZF90b19zcG91dF9hZ2dfc3RhdHM7IC8vIG9wdGlvbmFsCisgIHByaXZhdGUgTWFwPFN0cmluZyxDb21wb25lbnRBZ2dyZWdhdGVTdGF0cz4gaWRfdG9fYm9sdF9hZ2dfc3RhdHM7IC8vIG9wdGlvbmFsCisgIHByaXZhdGUgU3RyaW5nIHNjaGVkX3N0YXR1czsgLy8gb3B0aW9uYWwKKyAgcHJpdmF0ZSBUb3BvbG9neVN0YXRzIHRvcG9sb2d5X3N0YXRzOyAvLyBvcHRpb25hbAorICBwcml2YXRlIFN0cmluZyBvd25lcjsgLy8gb3B0aW9uYWwKKyAgcHJpdmF0ZSBEZWJ1Z09wdGlvbnMgZGVidWdfb3B0aW9uczsgLy8gb3B0aW9uYWwKKyAgcHJpdmF0ZSBpbnQgcmVwbGljYXRpb25fY291bnQ7IC8vIG9wdGlvbmFsCisgIHByaXZhdGUgZG91YmxlIHJlcXVlc3RlZF9tZW1vbmhlYXA7IC8vIG9wdGlvbmFsCisgIHByaXZhdGUgZG91YmxlIHJlcXVlc3RlZF9tZW1vZmZoZWFwOyAvLyBvcHRpb25hbAorICBwcml2YXRlIGRvdWJsZSByZXF1ZXN0ZWRfY3B1OyAvLyBvcHRpb25hbAorICBwcml2YXRlIGRvdWJsZSBhc3NpZ25lZF9tZW1vbmhlYXA7IC8vIG9wdGlvbmFsCisgIHByaXZhdGUgZG91YmxlIGFzc2lnbmVkX21lbW9mZmhlYXA7IC8vIG9wdGlvbmFsCisgIHByaXZhdGUgZG91YmxlIGFzc2lnbmVkX2NwdTsgLy8gb3B0aW9uYWwKKworICAvKiogVGhlIHNldCBvZiBmaWVsZHMgdGhpcyBzdHJ1Y3QgY29udGFpbnMsIGFsb25nIHdpdGggY29udmVuaWVuY2UgbWV0aG9kcyBmb3IgZmluZGluZyBhbmQgbWFuaXB1bGF0aW5nIHRoZW0uICovCisgIHB1YmxpYyBlbnVtIF9GaWVsZHMgaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRJZEVudW0geworICAgIElEKChzaG9ydCkxLCAiaWQiKSwKKyAgICBOQU1FKChzaG9ydCkyLCAibmFtZSIpLAorICAgIFVQVElNRV9TRUNTKChzaG9ydCkzLCAidXB0aW1lX3NlY3MiKSwKKyAgICBTVEFUVVMoKHNob3J0KTQsICJzdGF0dXMiKSwKKyAgICBOVU1fVEFTS1MoKHNob3J0KTUsICJudW1fdGFza3MiKSwKKyAgICBOVU1fV09SS0VSUygoc2hvcnQpNiwgIm51bV93b3JrZXJzIiksCisgICAgTlVNX0VYRUNVVE9SUygoc2hvcnQpNywgIm51bV9leGVjdXRvcnMiKSwKKyAgICBUT1BPTE9HWV9DT05GKChzaG9ydCk4LCAidG9wb2xvZ3lfY29uZiIpLAorICAgIElEX1RPX1NQT1VUX0FHR19TVEFUUygoc2hvcnQpOSwgImlkX3RvX3Nwb3V0X2FnZ19zdGF0cyIpLAorICAgIElEX1RPX0JPTFRfQUdHX1NUQVRTKChzaG9ydCkxMCwgImlkX3RvX2JvbHRfYWdnX3N0YXRzIiksCisgICAgU0NIRURfU1RBVFVTKChzaG9ydCkxMSwgInNjaGVkX3N0YXR1cyIpLAorICAgIFRPUE9MT0dZX1NUQVRTKChzaG9ydCkxMiwgInRvcG9sb2d5X3N0YXRzIiksCisgICAgT1dORVIoKHNob3J0KTEzLCAib3duZXIiKSwKKyAgICBERUJVR19PUFRJT05TKChzaG9ydCkxNCwgImRlYnVnX29wdGlvbnMiKSwKKyAgICBSRVBMSUNBVElPTl9DT1VOVCgoc2hvcnQpMTUsICJyZXBsaWNhdGlvbl9jb3VudCIpLAorICAgIFJFUVVFU1RFRF9NRU1PTkhFQVAoKHNob3J0KTUyMSwgInJlcXVlc3RlZF9tZW1vbmhlYXAiKSwKKyAgICBSRVFVRVNURURfTUVNT0ZGSEVBUCgoc2hvcnQpNTIyLCAicmVxdWVzdGVkX21lbW9mZmhlYXAiKSwKKyAgICBSRVFVRVNURURfQ1BVKChzaG9ydCk1MjMsICJyZXF1ZXN0ZWRfY3B1IiksCisgICAgQVNTSUdORURfTUVNT05IRUFQKChzaG9ydCk1MjQsICJhc3NpZ25lZF9tZW1vbmhlYXAiKSwKKyAgICBBU1NJR05FRF9NRU1PRkZIRUFQKChzaG9ydCk1MjUsICJhc3NpZ25lZF9tZW1vZmZoZWFwIiksCisgICAgQVNTSUdORURfQ1BVKChzaG9ydCk1MjYsICJhc3NpZ25lZF9jcHUiKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsIF9GaWVsZHM+IGJ5TmFtZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgX0ZpZWxkcz4oKTsKKworICAgIHN0YXRpYyB7CisgICAgICBmb3IgKF9GaWVsZHMgZmllbGQgOiBFbnVtU2V0LmFsbE9mKF9GaWVsZHMuY2xhc3MpKSB7CisgICAgICAgIGJ5TmFtZS5wdXQoZmllbGQuZ2V0RmllbGROYW1lKCksIGZpZWxkKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kIHRoZSBfRmllbGRzIGNvbnN0YW50IHRoYXQgbWF0Y2hlcyBmaWVsZElkLCBvciBudWxsIGlmIGl0cyBub3QgZm91bmQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBfRmllbGRzIGZpbmRCeVRocmlmdElkKGludCBmaWVsZElkKSB7CisgICAgICBzd2l0Y2goZmllbGRJZCkgeworICAgICAgICBjYXNlIDE6IC8vIElECisgICAgICAgICAgcmV0dXJuIElEOworICAgICAgICBjYXNlIDI6IC8vIE5BTUUKKyAgICAgICAgICByZXR1cm4gTkFNRTsKKyAgICAgICAgY2FzZSAzOiAvLyBVUFRJTUVfU0VDUworICAgICAgICAgIHJldHVybiBVUFRJTUVfU0VDUzsKKyAgICAgICAgY2FzZSA0OiAvLyBTVEFUVVMKKyAgICAgICAgICByZXR1cm4gU1RBVFVTOworICAgICAgICBjYXNlIDU6IC8vIE5VTV9UQVNLUworICAgICAgICAgIHJldHVybiBOVU1fVEFTS1M7CisgICAgICAgIGNhc2UgNjogLy8gTlVNX1dPUktFUlMKKyAgICAgICAgICByZXR1cm4gTlVNX1dPUktFUlM7CisgICAgICAgIGNhc2UgNzogLy8gTlVNX0VYRUNVVE9SUworICAgICAgICAgIHJldHVybiBOVU1fRVhFQ1VUT1JTOworICAgICAgICBjYXNlIDg6IC8vIFRPUE9MT0dZX0NPTkYKKyAgICAgICAgICByZXR1cm4gVE9QT0xPR1lfQ09ORjsKKyAgICAgICAgY2FzZSA5OiAvLyBJRF9UT19TUE9VVF9BR0dfU1RBVFMKKyAgICAgICAgICByZXR1cm4gSURfVE9fU1BPVVRfQUdHX1NUQVRTOworICAgICAgICBjYXNlIDEwOiAvLyBJRF9UT19CT0xUX0FHR19TVEFUUworICAgICAgICAgIHJldHVybiBJRF9UT19CT0xUX0FHR19TVEFUUzsKKyAgICAgICAgY2FzZSAxMTogLy8gU0NIRURfU1RBVFVTCisgICAgICAgICAgcmV0dXJuIFNDSEVEX1NUQVRVUzsKKyAgICAgICAgY2FzZSAxMjogLy8gVE9QT0xPR1lfU1RBVFMKKyAgICAgICAgICByZXR1cm4gVE9QT0xPR1lfU1RBVFM7CisgICAgICAgIGNhc2UgMTM6IC8vIE9XTkVSCisgICAgICAgICAgcmV0dXJuIE9XTkVSOworICAgICAgICBjYXNlIDE0OiAvLyBERUJVR19PUFRJT05TCisgICAgICAgICAgcmV0dXJuIERFQlVHX09QVElPTlM7CisgICAgICAgIGNhc2UgMTU6IC8vIFJFUExJQ0FUSU9OX0NPVU5UCisgICAgICAgICAgcmV0dXJuIFJFUExJQ0FUSU9OX0NPVU5UOworICAgICAgICBjYXNlIDUyMTogLy8gUkVRVUVTVEVEX01FTU9OSEVBUAorICAgICAgICAgIHJldHVybiBSRVFVRVNURURfTUVNT05IRUFQOworICAgICAgICBjYXNlIDUyMjogLy8gUkVRVUVTVEVEX01FTU9GRkhFQVAKKyAgICAgICAgICByZXR1cm4gUkVRVUVTVEVEX01FTU9GRkhFQVA7CisgICAgICAgIGNhc2UgNTIzOiAvLyBSRVFVRVNURURfQ1BVCisgICAgICAgICAgcmV0dXJuIFJFUVVFU1RFRF9DUFU7CisgICAgICAgIGNhc2UgNTI0OiAvLyBBU1NJR05FRF9NRU1PTkhFQVAKKyAgICAgICAgICByZXR1cm4gQVNTSUdORURfTUVNT05IRUFQOworICAgICAgICBjYXNlIDUyNTogLy8gQVNTSUdORURfTUVNT0ZGSEVBUAorICAgICAgICAgIHJldHVybiBBU1NJR05FRF9NRU1PRkZIRUFQOworICAgICAgICBjYXNlIDUyNjogLy8gQVNTSUdORURfQ1BVCisgICAgICAgICAgcmV0dXJuIEFTU0lHTkVEX0NQVTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kIHRoZSBfRmllbGRzIGNvbnN0YW50IHRoYXQgbWF0Y2hlcyBmaWVsZElkLCB0aHJvd2luZyBhbiBleGNlcHRpb24KKyAgICAgKiBpZiBpdCBpcyBub3QgZm91bmQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBfRmllbGRzIGZpbmRCeVRocmlmdElkT3JUaHJvdyhpbnQgZmllbGRJZCkgeworICAgICAgX0ZpZWxkcyBmaWVsZHMgPSBmaW5kQnlUaHJpZnRJZChmaWVsZElkKTsKKyAgICAgIGlmIChmaWVsZHMgPT0gbnVsbCkgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRmllbGQgIiArIGZpZWxkSWQgKyAiIGRvZXNuJ3QgZXhpc3QhIik7CisgICAgICByZXR1cm4gZmllbGRzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgdGhlIF9GaWVsZHMgY29uc3RhbnQgdGhhdCBtYXRjaGVzIG5hbWUsIG9yIG51bGwgaWYgaXRzIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIF9GaWVsZHMgZmluZEJ5TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgcmV0dXJuIGJ5TmFtZS5nZXQobmFtZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBzaG9ydCBfdGhyaWZ0SWQ7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX2ZpZWxkTmFtZTsKKworICAgIF9GaWVsZHMoc2hvcnQgdGhyaWZ0SWQsIFN0cmluZyBmaWVsZE5hbWUpIHsKKyAgICAgIF90aHJpZnRJZCA9IHRocmlmdElkOworICAgICAgX2ZpZWxkTmFtZSA9IGZpZWxkTmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc2hvcnQgZ2V0VGhyaWZ0RmllbGRJZCgpIHsKKyAgICAgIHJldHVybiBfdGhyaWZ0SWQ7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRGaWVsZE5hbWUoKSB7CisgICAgICByZXR1cm4gX2ZpZWxkTmFtZTsKKyAgICB9CisgIH0KKworICAvLyBpc3NldCBpZCBhc3NpZ25tZW50cworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgX19VUFRJTUVfU0VDU19JU1NFVF9JRCA9IDA7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBfX05VTV9UQVNLU19JU1NFVF9JRCA9IDE7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBfX05VTV9XT1JLRVJTX0lTU0VUX0lEID0gMjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IF9fTlVNX0VYRUNVVE9SU19JU1NFVF9JRCA9IDM7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBfX1JFUExJQ0FUSU9OX0NPVU5UX0lTU0VUX0lEID0gNDsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IF9fUkVRVUVTVEVEX01FTU9OSEVBUF9JU1NFVF9JRCA9IDU7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBfX1JFUVVFU1RFRF9NRU1PRkZIRUFQX0lTU0VUX0lEID0gNjsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IF9fUkVRVUVTVEVEX0NQVV9JU1NFVF9JRCA9IDc7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBfX0FTU0lHTkVEX01FTU9OSEVBUF9JU1NFVF9JRCA9IDg7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBfX0FTU0lHTkVEX01FTU9GRkhFQVBfSVNTRVRfSUQgPSA5OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgX19BU1NJR05FRF9DUFVfSVNTRVRfSUQgPSAxMDsKKyAgcHJpdmF0ZSBzaG9ydCBfX2lzc2V0X2JpdGZpZWxkID0gMDsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgX0ZpZWxkcyBvcHRpb25hbHNbXSA9IHtfRmllbGRzLk5BTUUsX0ZpZWxkcy5VUFRJTUVfU0VDUyxfRmllbGRzLlNUQVRVUyxfRmllbGRzLk5VTV9UQVNLUyxfRmllbGRzLk5VTV9XT1JLRVJTLF9GaWVsZHMuTlVNX0VYRUNVVE9SUyxfRmllbGRzLlRPUE9MT0dZX0NPTkYsX0ZpZWxkcy5JRF9UT19TUE9VVF9BR0dfU1RBVFMsX0ZpZWxkcy5JRF9UT19CT0xUX0FHR19TVEFUUyxfRmllbGRzLlNDSEVEX1NUQVRVUyxfRmllbGRzLlRPUE9MT0dZX1NUQVRTLF9GaWVsZHMuT1dORVIsX0ZpZWxkcy5ERUJVR19PUFRJT05TLF9GaWVsZHMuUkVQTElDQVRJT05fQ09VTlQsX0ZpZWxkcy5SRVFVRVNURURfTUVNT05IRUFQLF9GaWVsZHMuUkVRVUVTVEVEX01FTU9GRkhFQVAsX0ZpZWxkcy5SRVFVRVNURURfQ1BVLF9GaWVsZHMuQVNTSUdORURfTUVNT05IRUFQLF9GaWVsZHMuQVNTSUdORURfTUVNT0ZGSEVBUCxfRmllbGRzLkFTU0lHTkVEX0NQVX07CisgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPiBtZXRhRGF0YU1hcDsKKyAgc3RhdGljIHsKKyAgICBNYXA8X0ZpZWxkcywgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGE+IHRtcE1hcCA9IG5ldyBFbnVtTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPihfRmllbGRzLmNsYXNzKTsKKyAgICB0bXBNYXAucHV0KF9GaWVsZHMuSUQsIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YSgiaWQiLCBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRSZXF1aXJlbWVudFR5cGUuUkVRVUlSRUQsIAorICAgICAgICBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkVmFsdWVNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcpKSk7CisgICAgdG1wTWFwLnB1dChfRmllbGRzLk5BTUUsIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YSgibmFtZSIsIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZFJlcXVpcmVtZW50VHlwZS5PUFRJT05BTCwgCisgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRWYWx1ZU1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORykpKTsKKyAgICB0bXBNYXAucHV0KF9GaWVsZHMuVVBUSU1FX1NFQ1MsIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YSgidXB0aW1lX3NlY3MiLCBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRSZXF1aXJlbWVudFR5cGUuT1BUSU9OQUwsIAorICAgICAgICBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkVmFsdWVNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JMzIpKSk7CisgICAgdG1wTWFwLnB1dChfRmllbGRzLlNUQVRVUywgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhKCJzdGF0dXMiLCBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRSZXF1aXJlbWVudFR5cGUuT1BUSU9OQUwsIAorICAgICAgICBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkVmFsdWVNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcpKSk7CisgICAgdG1wTWFwLnB1dChfRmllbGRzLk5VTV9UQVNLUywgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhKCJudW1fdGFza3MiLCBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRSZXF1aXJlbWVudFR5cGUuT1BUSU9OQUwsIAorICAgICAgICBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkVmFsdWVNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JMzIpKSk7CisgICAgdG1wTWFwLnB1dChfRmllbGRzLk5VTV9XT1JLRVJTLCBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEoIm51bV93b3JrZXJzIiwgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLk9QVElPTkFMLCAKKyAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZFZhbHVlTWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTMyKSkpOworICAgIHRtcE1hcC5wdXQoX0ZpZWxkcy5OVU1fRVhFQ1VUT1JTLCBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEoIm51bV9leGVjdXRvcnMiLCBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRSZXF1aXJlbWVudFR5cGUuT1BUSU9OQUwsIAorICAgICAgICBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkVmFsdWVNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JMzIpKSk7CisgICAgdG1wTWFwLnB1dChfRmllbGRzLlRPUE9MT0dZX0NPTkYsIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YSgidG9wb2xvZ3lfY29uZiIsIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZFJlcXVpcmVtZW50VHlwZS5PUFRJT05BTCwgCisgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRWYWx1ZU1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORykpKTsKKyAgICB0bXBNYXAucHV0KF9GaWVsZHMuSURfVE9fU1BPVVRfQUdHX1NUQVRTLCBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEoImlkX3RvX3Nwb3V0X2FnZ19zdGF0cyIsIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZFJlcXVpcmVtZW50VHlwZS5PUFRJT05BTCwgCisgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuTWFwTWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTUFQLCAKKyAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRWYWx1ZU1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORyksIAorICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5TdHJ1Y3RNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIENvbXBvbmVudEFnZ3JlZ2F0ZVN0YXRzLmNsYXNzKSkpKTsKKyAgICB0bXBNYXAucHV0KF9GaWVsZHMuSURfVE9fQk9MVF9BR0dfU1RBVFMsIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YSgiaWRfdG9fYm9sdF9hZ2dfc3RhdHMiLCBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRSZXF1aXJlbWVudFR5cGUuT1BUSU9OQUwsIAorICAgICAgICBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLk1hcE1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLk1BUCwgCisgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkVmFsdWVNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcpLCAKKyAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuU3RydWN0TWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNULCBDb21wb25lbnRBZ2dyZWdhdGVTdGF0cy5jbGFzcykpKSk7CisgICAgdG1wTWFwLnB1dChfRmllbGRzLlNDSEVEX1NUQVRVUywgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhKCJzY2hlZF9zdGF0dXMiLCBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRSZXF1aXJlbWVudFR5cGUuT1BUSU9OQUwsIAorICAgICAgICBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkVmFsdWVNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcpKSk7CisgICAgdG1wTWFwLnB1dChfRmllbGRzLlRPUE9MT0dZX1NUQVRTLCBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEoInRvcG9sb2d5X3N0YXRzIiwgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLk9QVElPTkFMLCAKKyAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5TdHJ1Y3RNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIFRvcG9sb2d5U3RhdHMuY2xhc3MpKSk7CisgICAgdG1wTWFwLnB1dChfRmllbGRzLk9XTkVSLCBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEoIm93bmVyIiwgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLk9QVElPTkFMLCAKKyAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZFZhbHVlTWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HKSkpOworICAgIHRtcE1hcC5wdXQoX0ZpZWxkcy5ERUJVR19PUFRJT05TLCBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEoImRlYnVnX29wdGlvbnMiLCBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRSZXF1aXJlbWVudFR5cGUuT1BUSU9OQUwsIAorICAgICAgICBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLlN0cnVjdE1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCwgRGVidWdPcHRpb25zLmNsYXNzKSkpOworICAgIHRtcE1hcC5wdXQoX0ZpZWxkcy5SRVBMSUNBVElPTl9DT1VOVCwgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhKCJyZXBsaWNhdGlvbl9jb3VudCIsIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZFJlcXVpcmVtZW50VHlwZS5PUFRJT05BTCwgCisgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRWYWx1ZU1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkkzMikpKTsKKyAgICB0bXBNYXAucHV0KF9GaWVsZHMuUkVRVUVTVEVEX01FTU9OSEVBUCwgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhKCJyZXF1ZXN0ZWRfbWVtb25oZWFwIiwgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLk9QVElPTkFMLCAKKyAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZFZhbHVlTWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuRE9VQkxFKSkpOworICAgIHRtcE1hcC5wdXQoX0ZpZWxkcy5SRVFVRVNURURfTUVNT0ZGSEVBUCwgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhKCJyZXF1ZXN0ZWRfbWVtb2ZmaGVhcCIsIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZFJlcXVpcmVtZW50VHlwZS5PUFRJT05BTCwgCisgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRWYWx1ZU1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkRPVUJMRSkpKTsKKyAgICB0bXBNYXAucHV0KF9GaWVsZHMuUkVRVUVTVEVEX0NQVSwgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhKCJyZXF1ZXN0ZWRfY3B1Iiwgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLk9QVElPTkFMLCAKKyAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZFZhbHVlTWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuRE9VQkxFKSkpOworICAgIHRtcE1hcC5wdXQoX0ZpZWxkcy5BU1NJR05FRF9NRU1PTkhFQVAsIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YSgiYXNzaWduZWRfbWVtb25oZWFwIiwgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLk9QVElPTkFMLCAKKyAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZFZhbHVlTWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuRE9VQkxFKSkpOworICAgIHRtcE1hcC5wdXQoX0ZpZWxkcy5BU1NJR05FRF9NRU1PRkZIRUFQLCBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEoImFzc2lnbmVkX21lbW9mZmhlYXAiLCBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRSZXF1aXJlbWVudFR5cGUuT1BUSU9OQUwsIAorICAgICAgICBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkVmFsdWVNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5ET1VCTEUpKSk7CisgICAgdG1wTWFwLnB1dChfRmllbGRzLkFTU0lHTkVEX0NQVSwgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhKCJhc3NpZ25lZF9jcHUiLCBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRSZXF1aXJlbWVudFR5cGUuT1BUSU9OQUwsIAorICAgICAgICBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkVmFsdWVNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5ET1VCTEUpKSk7CisgICAgbWV0YURhdGFNYXAgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAodG1wTWFwKTsKKyAgICBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YS5hZGRTdHJ1Y3RNZXRhRGF0YU1hcChUb3BvbG9neVBhZ2VJbmZvLmNsYXNzLCBtZXRhRGF0YU1hcCk7CisgIH0KKworICBwdWJsaWMgVG9wb2xvZ3lQYWdlSW5mbygpIHsKKyAgfQorCisgIHB1YmxpYyBUb3BvbG9neVBhZ2VJbmZvKAorICAgIFN0cmluZyBpZCkKKyAgeworICAgIHRoaXMoKTsKKyAgICB0aGlzLmlkID0gaWQ7CisgIH0KKworICAvKioKKyAgICogUGVyZm9ybXMgYSBkZWVwIGNvcHkgb24gPGk+b3RoZXI8L2k+LgorICAgKi8KKyAgcHVibGljIFRvcG9sb2d5UGFnZUluZm8oVG9wb2xvZ3lQYWdlSW5mbyBvdGhlcikgeworICAgIF9faXNzZXRfYml0ZmllbGQgPSBvdGhlci5fX2lzc2V0X2JpdGZpZWxkOworICAgIGlmIChvdGhlci5pc19zZXRfaWQoKSkgeworICAgICAgdGhpcy5pZCA9IG90aGVyLmlkOworICAgIH0KKyAgICBpZiAob3RoZXIuaXNfc2V0X25hbWUoKSkgeworICAgICAgdGhpcy5uYW1lID0gb3RoZXIubmFtZTsKKyAgICB9CisgICAgdGhpcy51cHRpbWVfc2VjcyA9IG90aGVyLnVwdGltZV9zZWNzOworICAgIGlmIChvdGhlci5pc19zZXRfc3RhdHVzKCkpIHsKKyAgICAgIHRoaXMuc3RhdHVzID0gb3RoZXIuc3RhdHVzOworICAgIH0KKyAgICB0aGlzLm51bV90YXNrcyA9IG90aGVyLm51bV90YXNrczsKKyAgICB0aGlzLm51bV93b3JrZXJzID0gb3RoZXIubnVtX3dvcmtlcnM7CisgICAgdGhpcy5udW1fZXhlY3V0b3JzID0gb3RoZXIubnVtX2V4ZWN1dG9yczsKKyAgICBpZiAob3RoZXIuaXNfc2V0X3RvcG9sb2d5X2NvbmYoKSkgeworICAgICAgdGhpcy50b3BvbG9neV9jb25mID0gb3RoZXIudG9wb2xvZ3lfY29uZjsKKyAgICB9CisgICAgaWYgKG90aGVyLmlzX3NldF9pZF90b19zcG91dF9hZ2dfc3RhdHMoKSkgeworICAgICAgTWFwPFN0cmluZyxDb21wb25lbnRBZ2dyZWdhdGVTdGF0cz4gX190aGlzX19pZF90b19zcG91dF9hZ2dfc3RhdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsQ29tcG9uZW50QWdncmVnYXRlU3RhdHM+KG90aGVyLmlkX3RvX3Nwb3V0X2FnZ19zdGF0cy5zaXplKCkpOworICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBDb21wb25lbnRBZ2dyZWdhdGVTdGF0cz4gb3RoZXJfZWxlbWVudCA6IG90aGVyLmlkX3RvX3Nwb3V0X2FnZ19zdGF0cy5lbnRyeVNldCgpKSB7CisKKyAgICAgICAgU3RyaW5nIG90aGVyX2VsZW1lbnRfa2V5ID0gb3RoZXJfZWxlbWVudC5nZXRLZXkoKTsKKyAgICAgICAgQ29tcG9uZW50QWdncmVnYXRlU3RhdHMgb3RoZXJfZWxlbWVudF92YWx1ZSA9IG90aGVyX2VsZW1lbnQuZ2V0VmFsdWUoKTsKKworICAgICAgICBTdHJpbmcgX190aGlzX19pZF90b19zcG91dF9hZ2dfc3RhdHNfY29weV9rZXkgPSBvdGhlcl9lbGVtZW50X2tleTsKKworICAgICAgICBDb21wb25lbnRBZ2dyZWdhdGVTdGF0cyBfX3RoaXNfX2lkX3RvX3Nwb3V0X2FnZ19zdGF0c19jb3B5X3ZhbHVlID0gbmV3IENvbXBvbmVudEFnZ3JlZ2F0ZVN0YXRzKG90aGVyX2VsZW1lbnRfdmFsdWUpOworCisgICAgICAgIF9fdGhpc19faWRfdG9fc3BvdXRfYWdnX3N0YXRzLnB1dChfX3RoaXNfX2lkX3RvX3Nwb3V0X2FnZ19zdGF0c19jb3B5X2tleSwgX190aGlzX19pZF90b19zcG91dF9hZ2dfc3RhdHNfY29weV92YWx1ZSk7CisgICAgICB9CisgICAgICB0aGlzLmlkX3RvX3Nwb3V0X2FnZ19zdGF0cyA9IF9fdGhpc19faWRfdG9fc3BvdXRfYWdnX3N0YXRzOworICAgIH0KKyAgICBpZiAob3RoZXIuaXNfc2V0X2lkX3RvX2JvbHRfYWdnX3N0YXRzKCkpIHsKKyAgICAgIE1hcDxTdHJpbmcsQ29tcG9uZW50QWdncmVnYXRlU3RhdHM+IF9fdGhpc19faWRfdG9fYm9sdF9hZ2dfc3RhdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsQ29tcG9uZW50QWdncmVnYXRlU3RhdHM+KG90aGVyLmlkX3RvX2JvbHRfYWdnX3N0YXRzLnNpemUoKSk7CisgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIENvbXBvbmVudEFnZ3JlZ2F0ZVN0YXRzPiBvdGhlcl9lbGVtZW50IDogb3RoZXIuaWRfdG9fYm9sdF9hZ2dfc3RhdHMuZW50cnlTZXQoKSkgeworCisgICAgICAgIFN0cmluZyBvdGhlcl9lbGVtZW50X2tleSA9IG90aGVyX2VsZW1lbnQuZ2V0S2V5KCk7CisgICAgICAgIENvbXBvbmVudEFnZ3JlZ2F0ZVN0YXRzIG90aGVyX2VsZW1lbnRfdmFsdWUgPSBvdGhlcl9lbGVtZW50LmdldFZhbHVlKCk7CisKKyAgICAgICAgU3RyaW5nIF9fdGhpc19faWRfdG9fYm9sdF9hZ2dfc3RhdHNfY29weV9rZXkgPSBvdGhlcl9lbGVtZW50X2tleTsKKworICAgICAgICBDb21wb25lbnRBZ2dyZWdhdGVTdGF0cyBfX3RoaXNfX2lkX3RvX2JvbHRfYWdnX3N0YXRzX2NvcHlfdmFsdWUgPSBuZXcgQ29tcG9uZW50QWdncmVnYXRlU3RhdHMob3RoZXJfZWxlbWVudF92YWx1ZSk7CisKKyAgICAgICAgX190aGlzX19pZF90b19ib2x0X2FnZ19zdGF0cy5wdXQoX190aGlzX19pZF90b19ib2x0X2FnZ19zdGF0c19jb3B5X2tleSwgX190aGlzX19pZF90b19ib2x0X2FnZ19zdGF0c19jb3B5X3ZhbHVlKTsKKyAgICAgIH0KKyAgICAgIHRoaXMuaWRfdG9fYm9sdF9hZ2dfc3RhdHMgPSBfX3RoaXNfX2lkX3RvX2JvbHRfYWdnX3N0YXRzOworICAgIH0KKyAgICBpZiAob3RoZXIuaXNfc2V0X3NjaGVkX3N0YXR1cygpKSB7CisgICAgICB0aGlzLnNjaGVkX3N0YXR1cyA9IG90aGVyLnNjaGVkX3N0YXR1czsKKyAgICB9CisgICAgaWYgKG90aGVyLmlzX3NldF90b3BvbG9neV9zdGF0cygpKSB7CisgICAgICB0aGlzLnRvcG9sb2d5X3N0YXRzID0gbmV3IFRvcG9sb2d5U3RhdHMob3RoZXIudG9wb2xvZ3lfc3RhdHMpOworICAgIH0KKyAgICBpZiAob3RoZXIuaXNfc2V0X293bmVyKCkpIHsKKyAgICAgIHRoaXMub3duZXIgPSBvdGhlci5vd25lcjsKKyAgICB9CisgICAgaWYgKG90aGVyLmlzX3NldF9kZWJ1Z19vcHRpb25zKCkpIHsKKyAgICAgIHRoaXMuZGVidWdfb3B0aW9ucyA9IG5ldyBEZWJ1Z09wdGlvbnMob3RoZXIuZGVidWdfb3B0aW9ucyk7CisgICAgfQorICAgIHRoaXMucmVwbGljYXRpb25fY291bnQgPSBvdGhlci5yZXBsaWNhdGlvbl9jb3VudDsKKyAgICB0aGlzLnJlcXVlc3RlZF9tZW1vbmhlYXAgPSBvdGhlci5yZXF1ZXN0ZWRfbWVtb25oZWFwOworICAgIHRoaXMucmVxdWVzdGVkX21lbW9mZmhlYXAgPSBvdGhlci5yZXF1ZXN0ZWRfbWVtb2ZmaGVhcDsKKyAgICB0aGlzLnJlcXVlc3RlZF9jcHUgPSBvdGhlci5yZXF1ZXN0ZWRfY3B1OworICAgIHRoaXMuYXNzaWduZWRfbWVtb25oZWFwID0gb3RoZXIuYXNzaWduZWRfbWVtb25oZWFwOworICAgIHRoaXMuYXNzaWduZWRfbWVtb2ZmaGVhcCA9IG90aGVyLmFzc2lnbmVkX21lbW9mZmhlYXA7CisgICAgdGhpcy5hc3NpZ25lZF9jcHUgPSBvdGhlci5hc3NpZ25lZF9jcHU7CisgIH0KKworICBwdWJsaWMgVG9wb2xvZ3lQYWdlSW5mbyBkZWVwQ29weSgpIHsKKyAgICByZXR1cm4gbmV3IFRvcG9sb2d5UGFnZUluZm8odGhpcyk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgdGhpcy5pZCA9IG51bGw7CisgICAgdGhpcy5uYW1lID0gbnVsbDsKKyAgICBzZXRfdXB0aW1lX3NlY3NfaXNTZXQoZmFsc2UpOworICAgIHRoaXMudXB0aW1lX3NlY3MgPSAwOworICAgIHRoaXMuc3RhdHVzID0gbnVsbDsKKyAgICBzZXRfbnVtX3Rhc2tzX2lzU2V0KGZhbHNlKTsKKyAgICB0aGlzLm51bV90YXNrcyA9IDA7CisgICAgc2V0X251bV93b3JrZXJzX2lzU2V0KGZhbHNlKTsKKyAgICB0aGlzLm51bV93b3JrZXJzID0gMDsKKyAgICBzZXRfbnVtX2V4ZWN1dG9yc19pc1NldChmYWxzZSk7CisgICAgdGhpcy5udW1fZXhlY3V0b3JzID0gMDsKKyAgICB0aGlzLnRvcG9sb2d5X2NvbmYgPSBudWxsOworICAgIHRoaXMuaWRfdG9fc3BvdXRfYWdnX3N0YXRzID0gbnVsbDsKKyAgICB0aGlzLmlkX3RvX2JvbHRfYWdnX3N0YXRzID0gbnVsbDsKKyAgICB0aGlzLnNjaGVkX3N0YXR1cyA9IG51bGw7CisgICAgdGhpcy50b3BvbG9neV9zdGF0cyA9IG51bGw7CisgICAgdGhpcy5vd25lciA9IG51bGw7CisgICAgdGhpcy5kZWJ1Z19vcHRpb25zID0gbnVsbDsKKyAgICBzZXRfcmVwbGljYXRpb25fY291bnRfaXNTZXQoZmFsc2UpOworICAgIHRoaXMucmVwbGljYXRpb25fY291bnQgPSAwOworICAgIHNldF9yZXF1ZXN0ZWRfbWVtb25oZWFwX2lzU2V0KGZhbHNlKTsKKyAgICB0aGlzLnJlcXVlc3RlZF9tZW1vbmhlYXAgPSAwLjA7CisgICAgc2V0X3JlcXVlc3RlZF9tZW1vZmZoZWFwX2lzU2V0KGZhbHNlKTsKKyAgICB0aGlzLnJlcXVlc3RlZF9tZW1vZmZoZWFwID0gMC4wOworICAgIHNldF9yZXF1ZXN0ZWRfY3B1X2lzU2V0KGZhbHNlKTsKKyAgICB0aGlzLnJlcXVlc3RlZF9jcHUgPSAwLjA7CisgICAgc2V0X2Fzc2lnbmVkX21lbW9uaGVhcF9pc1NldChmYWxzZSk7CisgICAgdGhpcy5hc3NpZ25lZF9tZW1vbmhlYXAgPSAwLjA7CisgICAgc2V0X2Fzc2lnbmVkX21lbW9mZmhlYXBfaXNTZXQoZmFsc2UpOworICAgIHRoaXMuYXNzaWduZWRfbWVtb2ZmaGVhcCA9IDAuMDsKKyAgICBzZXRfYXNzaWduZWRfY3B1X2lzU2V0KGZhbHNlKTsKKyAgICB0aGlzLmFzc2lnbmVkX2NwdSA9IDAuMDsKKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgZ2V0X2lkKCkgeworICAgIHJldHVybiB0aGlzLmlkOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X2lkKFN0cmluZyBpZCkgeworICAgIHRoaXMuaWQgPSBpZDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHVuc2V0X2lkKCkgeworICAgIHRoaXMuaWQgPSBudWxsOworICB9CisKKyAgLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBpZCBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNfc2V0X2lkKCkgeworICAgIHJldHVybiB0aGlzLmlkICE9IG51bGw7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfaWRfaXNTZXQoYm9vbGVhbiB2YWx1ZSkgeworICAgIGlmICghdmFsdWUpIHsKKyAgICAgIHRoaXMuaWQgPSBudWxsOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBTdHJpbmcgZ2V0X25hbWUoKSB7CisgICAgcmV0dXJuIHRoaXMubmFtZTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF9uYW1lKFN0cmluZyBuYW1lKSB7CisgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHVuc2V0X25hbWUoKSB7CisgICAgdGhpcy5uYW1lID0gbnVsbDsKKyAgfQorCisgIC8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgbmFtZSBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNfc2V0X25hbWUoKSB7CisgICAgcmV0dXJuIHRoaXMubmFtZSAhPSBudWxsOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X25hbWVfaXNTZXQoYm9vbGVhbiB2YWx1ZSkgeworICAgIGlmICghdmFsdWUpIHsKKyAgICAgIHRoaXMubmFtZSA9IG51bGw7CisgICAgfQorICB9CisKKyAgcHVibGljIGludCBnZXRfdXB0aW1lX3NlY3MoKSB7CisgICAgcmV0dXJuIHRoaXMudXB0aW1lX3NlY3M7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfdXB0aW1lX3NlY3MoaW50IHVwdGltZV9zZWNzKSB7CisgICAgdGhpcy51cHRpbWVfc2VjcyA9IHVwdGltZV9zZWNzOworICAgIHNldF91cHRpbWVfc2Vjc19pc1NldCh0cnVlKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHVuc2V0X3VwdGltZV9zZWNzKCkgeworICAgIF9faXNzZXRfYml0ZmllbGQgPSBFbmNvZGluZ1V0aWxzLmNsZWFyQml0KF9faXNzZXRfYml0ZmllbGQsIF9fVVBUSU1FX1NFQ1NfSVNTRVRfSUQpOworICB9CisKKyAgLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCB1cHRpbWVfc2VjcyBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNfc2V0X3VwdGltZV9zZWNzKCkgeworICAgIHJldHVybiBFbmNvZGluZ1V0aWxzLnRlc3RCaXQoX19pc3NldF9iaXRmaWVsZCwgX19VUFRJTUVfU0VDU19JU1NFVF9JRCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfdXB0aW1lX3NlY3NfaXNTZXQoYm9vbGVhbiB2YWx1ZSkgeworICAgIF9faXNzZXRfYml0ZmllbGQgPSBFbmNvZGluZ1V0aWxzLnNldEJpdChfX2lzc2V0X2JpdGZpZWxkLCBfX1VQVElNRV9TRUNTX0lTU0VUX0lELCB2YWx1ZSk7CisgIH0KKworICBwdWJsaWMgU3RyaW5nIGdldF9zdGF0dXMoKSB7CisgICAgcmV0dXJuIHRoaXMuc3RhdHVzOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X3N0YXR1cyhTdHJpbmcgc3RhdHVzKSB7CisgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7CisgIH0KKworICBwdWJsaWMgdm9pZCB1bnNldF9zdGF0dXMoKSB7CisgICAgdGhpcy5zdGF0dXMgPSBudWxsOworICB9CisKKyAgLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBzdGF0dXMgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgIHB1YmxpYyBib29sZWFuIGlzX3NldF9zdGF0dXMoKSB7CisgICAgcmV0dXJuIHRoaXMuc3RhdHVzICE9IG51bGw7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfc3RhdHVzX2lzU2V0KGJvb2xlYW4gdmFsdWUpIHsKKyAgICBpZiAoIXZhbHVlKSB7CisgICAgICB0aGlzLnN0YXR1cyA9IG51bGw7CisgICAgfQorICB9CisKKyAgcHVibGljIGludCBnZXRfbnVtX3Rhc2tzKCkgeworICAgIHJldHVybiB0aGlzLm51bV90YXNrczsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF9udW1fdGFza3MoaW50IG51bV90YXNrcykgeworICAgIHRoaXMubnVtX3Rhc2tzID0gbnVtX3Rhc2tzOworICAgIHNldF9udW1fdGFza3NfaXNTZXQodHJ1ZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB1bnNldF9udW1fdGFza3MoKSB7CisgICAgX19pc3NldF9iaXRmaWVsZCA9IEVuY29kaW5nVXRpbHMuY2xlYXJCaXQoX19pc3NldF9iaXRmaWVsZCwgX19OVU1fVEFTS1NfSVNTRVRfSUQpOworICB9CisKKyAgLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBudW1fdGFza3MgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgIHB1YmxpYyBib29sZWFuIGlzX3NldF9udW1fdGFza3MoKSB7CisgICAgcmV0dXJuIEVuY29kaW5nVXRpbHMudGVzdEJpdChfX2lzc2V0X2JpdGZpZWxkLCBfX05VTV9UQVNLU19JU1NFVF9JRCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfbnVtX3Rhc2tzX2lzU2V0KGJvb2xlYW4gdmFsdWUpIHsKKyAgICBfX2lzc2V0X2JpdGZpZWxkID0gRW5jb2RpbmdVdGlscy5zZXRCaXQoX19pc3NldF9iaXRmaWVsZCwgX19OVU1fVEFTS1NfSVNTRVRfSUQsIHZhbHVlKTsKKyAgfQorCisgIHB1YmxpYyBpbnQgZ2V0X251bV93b3JrZXJzKCkgeworICAgIHJldHVybiB0aGlzLm51bV93b3JrZXJzOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X251bV93b3JrZXJzKGludCBudW1fd29ya2VycykgeworICAgIHRoaXMubnVtX3dvcmtlcnMgPSBudW1fd29ya2VyczsKKyAgICBzZXRfbnVtX3dvcmtlcnNfaXNTZXQodHJ1ZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB1bnNldF9udW1fd29ya2VycygpIHsKKyAgICBfX2lzc2V0X2JpdGZpZWxkID0gRW5jb2RpbmdVdGlscy5jbGVhckJpdChfX2lzc2V0X2JpdGZpZWxkLCBfX05VTV9XT1JLRVJTX0lTU0VUX0lEKTsKKyAgfQorCisgIC8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgbnVtX3dvcmtlcnMgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgIHB1YmxpYyBib29sZWFuIGlzX3NldF9udW1fd29ya2VycygpIHsKKyAgICByZXR1cm4gRW5jb2RpbmdVdGlscy50ZXN0Qml0KF9faXNzZXRfYml0ZmllbGQsIF9fTlVNX1dPUktFUlNfSVNTRVRfSUQpOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X251bV93b3JrZXJzX2lzU2V0KGJvb2xlYW4gdmFsdWUpIHsKKyAgICBfX2lzc2V0X2JpdGZpZWxkID0gRW5jb2RpbmdVdGlscy5zZXRCaXQoX19pc3NldF9iaXRmaWVsZCwgX19OVU1fV09SS0VSU19JU1NFVF9JRCwgdmFsdWUpOworICB9CisKKyAgcHVibGljIGludCBnZXRfbnVtX2V4ZWN1dG9ycygpIHsKKyAgICByZXR1cm4gdGhpcy5udW1fZXhlY3V0b3JzOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X251bV9leGVjdXRvcnMoaW50IG51bV9leGVjdXRvcnMpIHsKKyAgICB0aGlzLm51bV9leGVjdXRvcnMgPSBudW1fZXhlY3V0b3JzOworICAgIHNldF9udW1fZXhlY3V0b3JzX2lzU2V0KHRydWUpOworICB9CisKKyAgcHVibGljIHZvaWQgdW5zZXRfbnVtX2V4ZWN1dG9ycygpIHsKKyAgICBfX2lzc2V0X2JpdGZpZWxkID0gRW5jb2RpbmdVdGlscy5jbGVhckJpdChfX2lzc2V0X2JpdGZpZWxkLCBfX05VTV9FWEVDVVRPUlNfSVNTRVRfSUQpOworICB9CisKKyAgLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBudW1fZXhlY3V0b3JzIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLworICBwdWJsaWMgYm9vbGVhbiBpc19zZXRfbnVtX2V4ZWN1dG9ycygpIHsKKyAgICByZXR1cm4gRW5jb2RpbmdVdGlscy50ZXN0Qml0KF9faXNzZXRfYml0ZmllbGQsIF9fTlVNX0VYRUNVVE9SU19JU1NFVF9JRCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfbnVtX2V4ZWN1dG9yc19pc1NldChib29sZWFuIHZhbHVlKSB7CisgICAgX19pc3NldF9iaXRmaWVsZCA9IEVuY29kaW5nVXRpbHMuc2V0Qml0KF9faXNzZXRfYml0ZmllbGQsIF9fTlVNX0VYRUNVVE9SU19JU1NFVF9JRCwgdmFsdWUpOworICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRfdG9wb2xvZ3lfY29uZigpIHsKKyAgICByZXR1cm4gdGhpcy50b3BvbG9neV9jb25mOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X3RvcG9sb2d5X2NvbmYoU3RyaW5nIHRvcG9sb2d5X2NvbmYpIHsKKyAgICB0aGlzLnRvcG9sb2d5X2NvbmYgPSB0b3BvbG9neV9jb25mOworICB9CisKKyAgcHVibGljIHZvaWQgdW5zZXRfdG9wb2xvZ3lfY29uZigpIHsKKyAgICB0aGlzLnRvcG9sb2d5X2NvbmYgPSBudWxsOworICB9CisKKyAgLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCB0b3BvbG9neV9jb25mIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLworICBwdWJsaWMgYm9vbGVhbiBpc19zZXRfdG9wb2xvZ3lfY29uZigpIHsKKyAgICByZXR1cm4gdGhpcy50b3BvbG9neV9jb25mICE9IG51bGw7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfdG9wb2xvZ3lfY29uZl9pc1NldChib29sZWFuIHZhbHVlKSB7CisgICAgaWYgKCF2YWx1ZSkgeworICAgICAgdGhpcy50b3BvbG9neV9jb25mID0gbnVsbDsKKyAgICB9CisgIH0KKworICBwdWJsaWMgaW50IGdldF9pZF90b19zcG91dF9hZ2dfc3RhdHNfc2l6ZSgpIHsKKyAgICByZXR1cm4gKHRoaXMuaWRfdG9fc3BvdXRfYWdnX3N0YXRzID09IG51bGwpID8gMCA6IHRoaXMuaWRfdG9fc3BvdXRfYWdnX3N0YXRzLnNpemUoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHB1dF90b19pZF90b19zcG91dF9hZ2dfc3RhdHMoU3RyaW5nIGtleSwgQ29tcG9uZW50QWdncmVnYXRlU3RhdHMgdmFsKSB7CisgICAgaWYgKHRoaXMuaWRfdG9fc3BvdXRfYWdnX3N0YXRzID09IG51bGwpIHsKKyAgICAgIHRoaXMuaWRfdG9fc3BvdXRfYWdnX3N0YXRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLENvbXBvbmVudEFnZ3JlZ2F0ZVN0YXRzPigpOworICAgIH0KKyAgICB0aGlzLmlkX3RvX3Nwb3V0X2FnZ19zdGF0cy5wdXQoa2V5LCB2YWwpOworICB9CisKKyAgcHVibGljIE1hcDxTdHJpbmcsQ29tcG9uZW50QWdncmVnYXRlU3RhdHM+IGdldF9pZF90b19zcG91dF9hZ2dfc3RhdHMoKSB7CisgICAgcmV0dXJuIHRoaXMuaWRfdG9fc3BvdXRfYWdnX3N0YXRzOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X2lkX3RvX3Nwb3V0X2FnZ19zdGF0cyhNYXA8U3RyaW5nLENvbXBvbmVudEFnZ3JlZ2F0ZVN0YXRzPiBpZF90b19zcG91dF9hZ2dfc3RhdHMpIHsKKyAgICB0aGlzLmlkX3RvX3Nwb3V0X2FnZ19zdGF0cyA9IGlkX3RvX3Nwb3V0X2FnZ19zdGF0czsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHVuc2V0X2lkX3RvX3Nwb3V0X2FnZ19zdGF0cygpIHsKKyAgICB0aGlzLmlkX3RvX3Nwb3V0X2FnZ19zdGF0cyA9IG51bGw7CisgIH0KKworICAvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkIGlkX3RvX3Nwb3V0X2FnZ19zdGF0cyBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNfc2V0X2lkX3RvX3Nwb3V0X2FnZ19zdGF0cygpIHsKKyAgICByZXR1cm4gdGhpcy5pZF90b19zcG91dF9hZ2dfc3RhdHMgIT0gbnVsbDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF9pZF90b19zcG91dF9hZ2dfc3RhdHNfaXNTZXQoYm9vbGVhbiB2YWx1ZSkgeworICAgIGlmICghdmFsdWUpIHsKKyAgICAgIHRoaXMuaWRfdG9fc3BvdXRfYWdnX3N0YXRzID0gbnVsbDsKKyAgICB9CisgIH0KKworICBwdWJsaWMgaW50IGdldF9pZF90b19ib2x0X2FnZ19zdGF0c19zaXplKCkgeworICAgIHJldHVybiAodGhpcy5pZF90b19ib2x0X2FnZ19zdGF0cyA9PSBudWxsKSA/IDAgOiB0aGlzLmlkX3RvX2JvbHRfYWdnX3N0YXRzLnNpemUoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHB1dF90b19pZF90b19ib2x0X2FnZ19zdGF0cyhTdHJpbmcga2V5LCBDb21wb25lbnRBZ2dyZWdhdGVTdGF0cyB2YWwpIHsKKyAgICBpZiAodGhpcy5pZF90b19ib2x0X2FnZ19zdGF0cyA9PSBudWxsKSB7CisgICAgICB0aGlzLmlkX3RvX2JvbHRfYWdnX3N0YXRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLENvbXBvbmVudEFnZ3JlZ2F0ZVN0YXRzPigpOworICAgIH0KKyAgICB0aGlzLmlkX3RvX2JvbHRfYWdnX3N0YXRzLnB1dChrZXksIHZhbCk7CisgIH0KKworICBwdWJsaWMgTWFwPFN0cmluZyxDb21wb25lbnRBZ2dyZWdhdGVTdGF0cz4gZ2V0X2lkX3RvX2JvbHRfYWdnX3N0YXRzKCkgeworICAgIHJldHVybiB0aGlzLmlkX3RvX2JvbHRfYWdnX3N0YXRzOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X2lkX3RvX2JvbHRfYWdnX3N0YXRzKE1hcDxTdHJpbmcsQ29tcG9uZW50QWdncmVnYXRlU3RhdHM+IGlkX3RvX2JvbHRfYWdnX3N0YXRzKSB7CisgICAgdGhpcy5pZF90b19ib2x0X2FnZ19zdGF0cyA9IGlkX3RvX2JvbHRfYWdnX3N0YXRzOworICB9CisKKyAgcHVibGljIHZvaWQgdW5zZXRfaWRfdG9fYm9sdF9hZ2dfc3RhdHMoKSB7CisgICAgdGhpcy5pZF90b19ib2x0X2FnZ19zdGF0cyA9IG51bGw7CisgIH0KKworICAvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkIGlkX3RvX2JvbHRfYWdnX3N0YXRzIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLworICBwdWJsaWMgYm9vbGVhbiBpc19zZXRfaWRfdG9fYm9sdF9hZ2dfc3RhdHMoKSB7CisgICAgcmV0dXJuIHRoaXMuaWRfdG9fYm9sdF9hZ2dfc3RhdHMgIT0gbnVsbDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF9pZF90b19ib2x0X2FnZ19zdGF0c19pc1NldChib29sZWFuIHZhbHVlKSB7CisgICAgaWYgKCF2YWx1ZSkgeworICAgICAgdGhpcy5pZF90b19ib2x0X2FnZ19zdGF0cyA9IG51bGw7CisgICAgfQorICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRfc2NoZWRfc3RhdHVzKCkgeworICAgIHJldHVybiB0aGlzLnNjaGVkX3N0YXR1czsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF9zY2hlZF9zdGF0dXMoU3RyaW5nIHNjaGVkX3N0YXR1cykgeworICAgIHRoaXMuc2NoZWRfc3RhdHVzID0gc2NoZWRfc3RhdHVzOworICB9CisKKyAgcHVibGljIHZvaWQgdW5zZXRfc2NoZWRfc3RhdHVzKCkgeworICAgIHRoaXMuc2NoZWRfc3RhdHVzID0gbnVsbDsKKyAgfQorCisgIC8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgc2NoZWRfc3RhdHVzIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLworICBwdWJsaWMgYm9vbGVhbiBpc19zZXRfc2NoZWRfc3RhdHVzKCkgeworICAgIHJldHVybiB0aGlzLnNjaGVkX3N0YXR1cyAhPSBudWxsOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X3NjaGVkX3N0YXR1c19pc1NldChib29sZWFuIHZhbHVlKSB7CisgICAgaWYgKCF2YWx1ZSkgeworICAgICAgdGhpcy5zY2hlZF9zdGF0dXMgPSBudWxsOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBUb3BvbG9neVN0YXRzIGdldF90b3BvbG9neV9zdGF0cygpIHsKKyAgICByZXR1cm4gdGhpcy50b3BvbG9neV9zdGF0czsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF90b3BvbG9neV9zdGF0cyhUb3BvbG9neVN0YXRzIHRvcG9sb2d5X3N0YXRzKSB7CisgICAgdGhpcy50b3BvbG9neV9zdGF0cyA9IHRvcG9sb2d5X3N0YXRzOworICB9CisKKyAgcHVibGljIHZvaWQgdW5zZXRfdG9wb2xvZ3lfc3RhdHMoKSB7CisgICAgdGhpcy50b3BvbG9neV9zdGF0cyA9IG51bGw7CisgIH0KKworICAvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkIHRvcG9sb2d5X3N0YXRzIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLworICBwdWJsaWMgYm9vbGVhbiBpc19zZXRfdG9wb2xvZ3lfc3RhdHMoKSB7CisgICAgcmV0dXJuIHRoaXMudG9wb2xvZ3lfc3RhdHMgIT0gbnVsbDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF90b3BvbG9neV9zdGF0c19pc1NldChib29sZWFuIHZhbHVlKSB7CisgICAgaWYgKCF2YWx1ZSkgeworICAgICAgdGhpcy50b3BvbG9neV9zdGF0cyA9IG51bGw7CisgICAgfQorICB9CisKKyAgcHVibGljIFN0cmluZyBnZXRfb3duZXIoKSB7CisgICAgcmV0dXJuIHRoaXMub3duZXI7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfb3duZXIoU3RyaW5nIG93bmVyKSB7CisgICAgdGhpcy5vd25lciA9IG93bmVyOworICB9CisKKyAgcHVibGljIHZvaWQgdW5zZXRfb3duZXIoKSB7CisgICAgdGhpcy5vd25lciA9IG51bGw7CisgIH0KKworICAvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkIG93bmVyIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLworICBwdWJsaWMgYm9vbGVhbiBpc19zZXRfb3duZXIoKSB7CisgICAgcmV0dXJuIHRoaXMub3duZXIgIT0gbnVsbDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF9vd25lcl9pc1NldChib29sZWFuIHZhbHVlKSB7CisgICAgaWYgKCF2YWx1ZSkgeworICAgICAgdGhpcy5vd25lciA9IG51bGw7CisgICAgfQorICB9CisKKyAgcHVibGljIERlYnVnT3B0aW9ucyBnZXRfZGVidWdfb3B0aW9ucygpIHsKKyAgICByZXR1cm4gdGhpcy5kZWJ1Z19vcHRpb25zOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X2RlYnVnX29wdGlvbnMoRGVidWdPcHRpb25zIGRlYnVnX29wdGlvbnMpIHsKKyAgICB0aGlzLmRlYnVnX29wdGlvbnMgPSBkZWJ1Z19vcHRpb25zOworICB9CisKKyAgcHVibGljIHZvaWQgdW5zZXRfZGVidWdfb3B0aW9ucygpIHsKKyAgICB0aGlzLmRlYnVnX29wdGlvbnMgPSBudWxsOworICB9CisKKyAgLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBkZWJ1Z19vcHRpb25zIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLworICBwdWJsaWMgYm9vbGVhbiBpc19zZXRfZGVidWdfb3B0aW9ucygpIHsKKyAgICByZXR1cm4gdGhpcy5kZWJ1Z19vcHRpb25zICE9IG51bGw7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfZGVidWdfb3B0aW9uc19pc1NldChib29sZWFuIHZhbHVlKSB7CisgICAgaWYgKCF2YWx1ZSkgeworICAgICAgdGhpcy5kZWJ1Z19vcHRpb25zID0gbnVsbDsKKyAgICB9CisgIH0KKworICBwdWJsaWMgaW50IGdldF9yZXBsaWNhdGlvbl9jb3VudCgpIHsKKyAgICByZXR1cm4gdGhpcy5yZXBsaWNhdGlvbl9jb3VudDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF9yZXBsaWNhdGlvbl9jb3VudChpbnQgcmVwbGljYXRpb25fY291bnQpIHsKKyAgICB0aGlzLnJlcGxpY2F0aW9uX2NvdW50ID0gcmVwbGljYXRpb25fY291bnQ7CisgICAgc2V0X3JlcGxpY2F0aW9uX2NvdW50X2lzU2V0KHRydWUpOworICB9CisKKyAgcHVibGljIHZvaWQgdW5zZXRfcmVwbGljYXRpb25fY291bnQoKSB7CisgICAgX19pc3NldF9iaXRmaWVsZCA9IEVuY29kaW5nVXRpbHMuY2xlYXJCaXQoX19pc3NldF9iaXRmaWVsZCwgX19SRVBMSUNBVElPTl9DT1VOVF9JU1NFVF9JRCk7CisgIH0KKworICAvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkIHJlcGxpY2F0aW9uX2NvdW50IGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLworICBwdWJsaWMgYm9vbGVhbiBpc19zZXRfcmVwbGljYXRpb25fY291bnQoKSB7CisgICAgcmV0dXJuIEVuY29kaW5nVXRpbHMudGVzdEJpdChfX2lzc2V0X2JpdGZpZWxkLCBfX1JFUExJQ0FUSU9OX0NPVU5UX0lTU0VUX0lEKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF9yZXBsaWNhdGlvbl9jb3VudF9pc1NldChib29sZWFuIHZhbHVlKSB7CisgICAgX19pc3NldF9iaXRmaWVsZCA9IEVuY29kaW5nVXRpbHMuc2V0Qml0KF9faXNzZXRfYml0ZmllbGQsIF9fUkVQTElDQVRJT05fQ09VTlRfSVNTRVRfSUQsIHZhbHVlKTsKKyAgfQorCisgIHB1YmxpYyBkb3VibGUgZ2V0X3JlcXVlc3RlZF9tZW1vbmhlYXAoKSB7CisgICAgcmV0dXJuIHRoaXMucmVxdWVzdGVkX21lbW9uaGVhcDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF9yZXF1ZXN0ZWRfbWVtb25oZWFwKGRvdWJsZSByZXF1ZXN0ZWRfbWVtb25oZWFwKSB7CisgICAgdGhpcy5yZXF1ZXN0ZWRfbWVtb25oZWFwID0gcmVxdWVzdGVkX21lbW9uaGVhcDsKKyAgICBzZXRfcmVxdWVzdGVkX21lbW9uaGVhcF9pc1NldCh0cnVlKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHVuc2V0X3JlcXVlc3RlZF9tZW1vbmhlYXAoKSB7CisgICAgX19pc3NldF9iaXRmaWVsZCA9IEVuY29kaW5nVXRpbHMuY2xlYXJCaXQoX19pc3NldF9iaXRmaWVsZCwgX19SRVFVRVNURURfTUVNT05IRUFQX0lTU0VUX0lEKTsKKyAgfQorCisgIC8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgcmVxdWVzdGVkX21lbW9uaGVhcCBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNfc2V0X3JlcXVlc3RlZF9tZW1vbmhlYXAoKSB7CisgICAgcmV0dXJuIEVuY29kaW5nVXRpbHMudGVzdEJpdChfX2lzc2V0X2JpdGZpZWxkLCBfX1JFUVVFU1RFRF9NRU1PTkhFQVBfSVNTRVRfSUQpOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X3JlcXVlc3RlZF9tZW1vbmhlYXBfaXNTZXQoYm9vbGVhbiB2YWx1ZSkgeworICAgIF9faXNzZXRfYml0ZmllbGQgPSBFbmNvZGluZ1V0aWxzLnNldEJpdChfX2lzc2V0X2JpdGZpZWxkLCBfX1JFUVVFU1RFRF9NRU1PTkhFQVBfSVNTRVRfSUQsIHZhbHVlKTsKKyAgfQorCisgIHB1YmxpYyBkb3VibGUgZ2V0X3JlcXVlc3RlZF9tZW1vZmZoZWFwKCkgeworICAgIHJldHVybiB0aGlzLnJlcXVlc3RlZF9tZW1vZmZoZWFwOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X3JlcXVlc3RlZF9tZW1vZmZoZWFwKGRvdWJsZSByZXF1ZXN0ZWRfbWVtb2ZmaGVhcCkgeworICAgIHRoaXMucmVxdWVzdGVkX21lbW9mZmhlYXAgPSByZXF1ZXN0ZWRfbWVtb2ZmaGVhcDsKKyAgICBzZXRfcmVxdWVzdGVkX21lbW9mZmhlYXBfaXNTZXQodHJ1ZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB1bnNldF9yZXF1ZXN0ZWRfbWVtb2ZmaGVhcCgpIHsKKyAgICBfX2lzc2V0X2JpdGZpZWxkID0gRW5jb2RpbmdVdGlscy5jbGVhckJpdChfX2lzc2V0X2JpdGZpZWxkLCBfX1JFUVVFU1RFRF9NRU1PRkZIRUFQX0lTU0VUX0lEKTsKKyAgfQorCisgIC8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgcmVxdWVzdGVkX21lbW9mZmhlYXAgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgIHB1YmxpYyBib29sZWFuIGlzX3NldF9yZXF1ZXN0ZWRfbWVtb2ZmaGVhcCgpIHsKKyAgICByZXR1cm4gRW5jb2RpbmdVdGlscy50ZXN0Qml0KF9faXNzZXRfYml0ZmllbGQsIF9fUkVRVUVTVEVEX01FTU9GRkhFQVBfSVNTRVRfSUQpOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X3JlcXVlc3RlZF9tZW1vZmZoZWFwX2lzU2V0KGJvb2xlYW4gdmFsdWUpIHsKKyAgICBfX2lzc2V0X2JpdGZpZWxkID0gRW5jb2RpbmdVdGlscy5zZXRCaXQoX19pc3NldF9iaXRmaWVsZCwgX19SRVFVRVNURURfTUVNT0ZGSEVBUF9JU1NFVF9JRCwgdmFsdWUpOworICB9CisKKyAgcHVibGljIGRvdWJsZSBnZXRfcmVxdWVzdGVkX2NwdSgpIHsKKyAgICByZXR1cm4gdGhpcy5yZXF1ZXN0ZWRfY3B1OworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X3JlcXVlc3RlZF9jcHUoZG91YmxlIHJlcXVlc3RlZF9jcHUpIHsKKyAgICB0aGlzLnJlcXVlc3RlZF9jcHUgPSByZXF1ZXN0ZWRfY3B1OworICAgIHNldF9yZXF1ZXN0ZWRfY3B1X2lzU2V0KHRydWUpOworICB9CisKKyAgcHVibGljIHZvaWQgdW5zZXRfcmVxdWVzdGVkX2NwdSgpIHsKKyAgICBfX2lzc2V0X2JpdGZpZWxkID0gRW5jb2RpbmdVdGlscy5jbGVhckJpdChfX2lzc2V0X2JpdGZpZWxkLCBfX1JFUVVFU1RFRF9DUFVfSVNTRVRfSUQpOworICB9CisKKyAgLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCByZXF1ZXN0ZWRfY3B1IGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLworICBwdWJsaWMgYm9vbGVhbiBpc19zZXRfcmVxdWVzdGVkX2NwdSgpIHsKKyAgICByZXR1cm4gRW5jb2RpbmdVdGlscy50ZXN0Qml0KF9faXNzZXRfYml0ZmllbGQsIF9fUkVRVUVTVEVEX0NQVV9JU1NFVF9JRCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfcmVxdWVzdGVkX2NwdV9pc1NldChib29sZWFuIHZhbHVlKSB7CisgICAgX19pc3NldF9iaXRmaWVsZCA9IEVuY29kaW5nVXRpbHMuc2V0Qml0KF9faXNzZXRfYml0ZmllbGQsIF9fUkVRVUVTVEVEX0NQVV9JU1NFVF9JRCwgdmFsdWUpOworICB9CisKKyAgcHVibGljIGRvdWJsZSBnZXRfYXNzaWduZWRfbWVtb25oZWFwKCkgeworICAgIHJldHVybiB0aGlzLmFzc2lnbmVkX21lbW9uaGVhcDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF9hc3NpZ25lZF9tZW1vbmhlYXAoZG91YmxlIGFzc2lnbmVkX21lbW9uaGVhcCkgeworICAgIHRoaXMuYXNzaWduZWRfbWVtb25oZWFwID0gYXNzaWduZWRfbWVtb25oZWFwOworICAgIHNldF9hc3NpZ25lZF9tZW1vbmhlYXBfaXNTZXQodHJ1ZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB1bnNldF9hc3NpZ25lZF9tZW1vbmhlYXAoKSB7CisgICAgX19pc3NldF9iaXRmaWVsZCA9IEVuY29kaW5nVXRpbHMuY2xlYXJCaXQoX19pc3NldF9iaXRmaWVsZCwgX19BU1NJR05FRF9NRU1PTkhFQVBfSVNTRVRfSUQpOworICB9CisKKyAgLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCBhc3NpZ25lZF9tZW1vbmhlYXAgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgIHB1YmxpYyBib29sZWFuIGlzX3NldF9hc3NpZ25lZF9tZW1vbmhlYXAoKSB7CisgICAgcmV0dXJuIEVuY29kaW5nVXRpbHMudGVzdEJpdChfX2lzc2V0X2JpdGZpZWxkLCBfX0FTU0lHTkVEX01FTU9OSEVBUF9JU1NFVF9JRCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfYXNzaWduZWRfbWVtb25oZWFwX2lzU2V0KGJvb2xlYW4gdmFsdWUpIHsKKyAgICBfX2lzc2V0X2JpdGZpZWxkID0gRW5jb2RpbmdVdGlscy5zZXRCaXQoX19pc3NldF9iaXRmaWVsZCwgX19BU1NJR05FRF9NRU1PTkhFQVBfSVNTRVRfSUQsIHZhbHVlKTsKKyAgfQorCisgIHB1YmxpYyBkb3VibGUgZ2V0X2Fzc2lnbmVkX21lbW9mZmhlYXAoKSB7CisgICAgcmV0dXJuIHRoaXMuYXNzaWduZWRfbWVtb2ZmaGVhcDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF9hc3NpZ25lZF9tZW1vZmZoZWFwKGRvdWJsZSBhc3NpZ25lZF9tZW1vZmZoZWFwKSB7CisgICAgdGhpcy5hc3NpZ25lZF9tZW1vZmZoZWFwID0gYXNzaWduZWRfbWVtb2ZmaGVhcDsKKyAgICBzZXRfYXNzaWduZWRfbWVtb2ZmaGVhcF9pc1NldCh0cnVlKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHVuc2V0X2Fzc2lnbmVkX21lbW9mZmhlYXAoKSB7CisgICAgX19pc3NldF9iaXRmaWVsZCA9IEVuY29kaW5nVXRpbHMuY2xlYXJCaXQoX19pc3NldF9iaXRmaWVsZCwgX19BU1NJR05FRF9NRU1PRkZIRUFQX0lTU0VUX0lEKTsKKyAgfQorCisgIC8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgYXNzaWduZWRfbWVtb2ZmaGVhcCBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNfc2V0X2Fzc2lnbmVkX21lbW9mZmhlYXAoKSB7CisgICAgcmV0dXJuIEVuY29kaW5nVXRpbHMudGVzdEJpdChfX2lzc2V0X2JpdGZpZWxkLCBfX0FTU0lHTkVEX01FTU9GRkhFQVBfSVNTRVRfSUQpOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X2Fzc2lnbmVkX21lbW9mZmhlYXBfaXNTZXQoYm9vbGVhbiB2YWx1ZSkgeworICAgIF9faXNzZXRfYml0ZmllbGQgPSBFbmNvZGluZ1V0aWxzLnNldEJpdChfX2lzc2V0X2JpdGZpZWxkLCBfX0FTU0lHTkVEX01FTU9GRkhFQVBfSVNTRVRfSUQsIHZhbHVlKTsKKyAgfQorCisgIHB1YmxpYyBkb3VibGUgZ2V0X2Fzc2lnbmVkX2NwdSgpIHsKKyAgICByZXR1cm4gdGhpcy5hc3NpZ25lZF9jcHU7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfYXNzaWduZWRfY3B1KGRvdWJsZSBhc3NpZ25lZF9jcHUpIHsKKyAgICB0aGlzLmFzc2lnbmVkX2NwdSA9IGFzc2lnbmVkX2NwdTsKKyAgICBzZXRfYXNzaWduZWRfY3B1X2lzU2V0KHRydWUpOworICB9CisKKyAgcHVibGljIHZvaWQgdW5zZXRfYXNzaWduZWRfY3B1KCkgeworICAgIF9faXNzZXRfYml0ZmllbGQgPSBFbmNvZGluZ1V0aWxzLmNsZWFyQml0KF9faXNzZXRfYml0ZmllbGQsIF9fQVNTSUdORURfQ1BVX0lTU0VUX0lEKTsKKyAgfQorCisgIC8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgYXNzaWduZWRfY3B1IGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLworICBwdWJsaWMgYm9vbGVhbiBpc19zZXRfYXNzaWduZWRfY3B1KCkgeworICAgIHJldHVybiBFbmNvZGluZ1V0aWxzLnRlc3RCaXQoX19pc3NldF9iaXRmaWVsZCwgX19BU1NJR05FRF9DUFVfSVNTRVRfSUQpOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X2Fzc2lnbmVkX2NwdV9pc1NldChib29sZWFuIHZhbHVlKSB7CisgICAgX19pc3NldF9iaXRmaWVsZCA9IEVuY29kaW5nVXRpbHMuc2V0Qml0KF9faXNzZXRfYml0ZmllbGQsIF9fQVNTSUdORURfQ1BVX0lTU0VUX0lELCB2YWx1ZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRGaWVsZFZhbHVlKF9GaWVsZHMgZmllbGQsIE9iamVjdCB2YWx1ZSkgeworICAgIHN3aXRjaCAoZmllbGQpIHsKKyAgICBjYXNlIElEOgorICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgdW5zZXRfaWQoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNldF9pZCgoU3RyaW5nKXZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBOQU1FOgorICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgdW5zZXRfbmFtZSgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2V0X25hbWUoKFN0cmluZyl2YWx1ZSk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgVVBUSU1FX1NFQ1M6CisgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICB1bnNldF91cHRpbWVfc2VjcygpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2V0X3VwdGltZV9zZWNzKChJbnRlZ2VyKXZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBTVEFUVVM6CisgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICB1bnNldF9zdGF0dXMoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNldF9zdGF0dXMoKFN0cmluZyl2YWx1ZSk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgTlVNX1RBU0tTOgorICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgdW5zZXRfbnVtX3Rhc2tzKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzZXRfbnVtX3Rhc2tzKChJbnRlZ2VyKXZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBOVU1fV09SS0VSUzoKKyAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgIHVuc2V0X251bV93b3JrZXJzKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzZXRfbnVtX3dvcmtlcnMoKEludGVnZXIpdmFsdWUpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE5VTV9FWEVDVVRPUlM6CisgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICB1bnNldF9udW1fZXhlY3V0b3JzKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzZXRfbnVtX2V4ZWN1dG9ycygoSW50ZWdlcil2YWx1ZSk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgVE9QT0xPR1lfQ09ORjoKKyAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgIHVuc2V0X3RvcG9sb2d5X2NvbmYoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNldF90b3BvbG9neV9jb25mKChTdHJpbmcpdmFsdWUpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIElEX1RPX1NQT1VUX0FHR19TVEFUUzoKKyAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgIHVuc2V0X2lkX3RvX3Nwb3V0X2FnZ19zdGF0cygpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2V0X2lkX3RvX3Nwb3V0X2FnZ19zdGF0cygoTWFwPFN0cmluZyxDb21wb25lbnRBZ2dyZWdhdGVTdGF0cz4pdmFsdWUpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIElEX1RPX0JPTFRfQUdHX1NUQVRTOgorICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgdW5zZXRfaWRfdG9fYm9sdF9hZ2dfc3RhdHMoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNldF9pZF90b19ib2x0X2FnZ19zdGF0cygoTWFwPFN0cmluZyxDb21wb25lbnRBZ2dyZWdhdGVTdGF0cz4pdmFsdWUpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNDSEVEX1NUQVRVUzoKKyAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgIHVuc2V0X3NjaGVkX3N0YXR1cygpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2V0X3NjaGVkX3N0YXR1cygoU3RyaW5nKXZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBUT1BPTE9HWV9TVEFUUzoKKyAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgIHVuc2V0X3RvcG9sb2d5X3N0YXRzKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzZXRfdG9wb2xvZ3lfc3RhdHMoKFRvcG9sb2d5U3RhdHMpdmFsdWUpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9XTkVSOgorICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgdW5zZXRfb3duZXIoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNldF9vd25lcigoU3RyaW5nKXZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBERUJVR19PUFRJT05TOgorICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgdW5zZXRfZGVidWdfb3B0aW9ucygpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2V0X2RlYnVnX29wdGlvbnMoKERlYnVnT3B0aW9ucyl2YWx1ZSk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgUkVQTElDQVRJT05fQ09VTlQ6CisgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICB1bnNldF9yZXBsaWNhdGlvbl9jb3VudCgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2V0X3JlcGxpY2F0aW9uX2NvdW50KChJbnRlZ2VyKXZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBSRVFVRVNURURfTUVNT05IRUFQOgorICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgdW5zZXRfcmVxdWVzdGVkX21lbW9uaGVhcCgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2V0X3JlcXVlc3RlZF9tZW1vbmhlYXAoKERvdWJsZSl2YWx1ZSk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgUkVRVUVTVEVEX01FTU9GRkhFQVA6CisgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICB1bnNldF9yZXF1ZXN0ZWRfbWVtb2ZmaGVhcCgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2V0X3JlcXVlc3RlZF9tZW1vZmZoZWFwKChEb3VibGUpdmFsdWUpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFJFUVVFU1RFRF9DUFU6CisgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICB1bnNldF9yZXF1ZXN0ZWRfY3B1KCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzZXRfcmVxdWVzdGVkX2NwdSgoRG91YmxlKXZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBBU1NJR05FRF9NRU1PTkhFQVA6CisgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICB1bnNldF9hc3NpZ25lZF9tZW1vbmhlYXAoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNldF9hc3NpZ25lZF9tZW1vbmhlYXAoKERvdWJsZSl2YWx1ZSk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgQVNTSUdORURfTUVNT0ZGSEVBUDoKKyAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgIHVuc2V0X2Fzc2lnbmVkX21lbW9mZmhlYXAoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNldF9hc3NpZ25lZF9tZW1vZmZoZWFwKChEb3VibGUpdmFsdWUpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEFTU0lHTkVEX0NQVToKKyAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgIHVuc2V0X2Fzc2lnbmVkX2NwdSgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2V0X2Fzc2lnbmVkX2NwdSgoRG91YmxlKXZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgfQorICB9CisKKyAgcHVibGljIE9iamVjdCBnZXRGaWVsZFZhbHVlKF9GaWVsZHMgZmllbGQpIHsKKyAgICBzd2l0Y2ggKGZpZWxkKSB7CisgICAgY2FzZSBJRDoKKyAgICAgIHJldHVybiBnZXRfaWQoKTsKKworICAgIGNhc2UgTkFNRToKKyAgICAgIHJldHVybiBnZXRfbmFtZSgpOworCisgICAgY2FzZSBVUFRJTUVfU0VDUzoKKyAgICAgIHJldHVybiBnZXRfdXB0aW1lX3NlY3MoKTsKKworICAgIGNhc2UgU1RBVFVTOgorICAgICAgcmV0dXJuIGdldF9zdGF0dXMoKTsKKworICAgIGNhc2UgTlVNX1RBU0tTOgorICAgICAgcmV0dXJuIGdldF9udW1fdGFza3MoKTsKKworICAgIGNhc2UgTlVNX1dPUktFUlM6CisgICAgICByZXR1cm4gZ2V0X251bV93b3JrZXJzKCk7CisKKyAgICBjYXNlIE5VTV9FWEVDVVRPUlM6CisgICAgICByZXR1cm4gZ2V0X251bV9leGVjdXRvcnMoKTsKKworICAgIGNhc2UgVE9QT0xPR1lfQ09ORjoKKyAgICAgIHJldHVybiBnZXRfdG9wb2xvZ3lfY29uZigpOworCisgICAgY2FzZSBJRF9UT19TUE9VVF9BR0dfU1RBVFM6CisgICAgICByZXR1cm4gZ2V0X2lkX3RvX3Nwb3V0X2FnZ19zdGF0cygpOworCisgICAgY2FzZSBJRF9UT19CT0xUX0FHR19TVEFUUzoKKyAgICAgIHJldHVybiBnZXRfaWRfdG9fYm9sdF9hZ2dfc3RhdHMoKTsKKworICAgIGNhc2UgU0NIRURfU1RBVFVTOgorICAgICAgcmV0dXJuIGdldF9zY2hlZF9zdGF0dXMoKTsKKworICAgIGNhc2UgVE9QT0xPR1lfU1RBVFM6CisgICAgICByZXR1cm4gZ2V0X3RvcG9sb2d5X3N0YXRzKCk7CisKKyAgICBjYXNlIE9XTkVSOgorICAgICAgcmV0dXJuIGdldF9vd25lcigpOworCisgICAgY2FzZSBERUJVR19PUFRJT05TOgorICAgICAgcmV0dXJuIGdldF9kZWJ1Z19vcHRpb25zKCk7CisKKyAgICBjYXNlIFJFUExJQ0FUSU9OX0NPVU5UOgorICAgICAgcmV0dXJuIGdldF9yZXBsaWNhdGlvbl9jb3VudCgpOworCisgICAgY2FzZSBSRVFVRVNURURfTUVNT05IRUFQOgorICAgICAgcmV0dXJuIGdldF9yZXF1ZXN0ZWRfbWVtb25oZWFwKCk7CisKKyAgICBjYXNlIFJFUVVFU1RFRF9NRU1PRkZIRUFQOgorICAgICAgcmV0dXJuIGdldF9yZXF1ZXN0ZWRfbWVtb2ZmaGVhcCgpOworCisgICAgY2FzZSBSRVFVRVNURURfQ1BVOgorICAgICAgcmV0dXJuIGdldF9yZXF1ZXN0ZWRfY3B1KCk7CisKKyAgICBjYXNlIEFTU0lHTkVEX01FTU9OSEVBUDoKKyAgICAgIHJldHVybiBnZXRfYXNzaWduZWRfbWVtb25oZWFwKCk7CisKKyAgICBjYXNlIEFTU0lHTkVEX01FTU9GRkhFQVA6CisgICAgICByZXR1cm4gZ2V0X2Fzc2lnbmVkX21lbW9mZmhlYXAoKTsKKworICAgIGNhc2UgQVNTSUdORURfQ1BVOgorICAgICAgcmV0dXJuIGdldF9hc3NpZ25lZF9jcHUoKTsKKworICAgIH0KKyAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgIH0KKworICAvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkIGNvcnJlc3BvbmRpbmcgdG8gZmllbGRJRCBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNTZXQoX0ZpZWxkcyBmaWVsZCkgeworICAgIGlmIChmaWVsZCA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgc3dpdGNoIChmaWVsZCkgeworICAgIGNhc2UgSUQ6CisgICAgICByZXR1cm4gaXNfc2V0X2lkKCk7CisgICAgY2FzZSBOQU1FOgorICAgICAgcmV0dXJuIGlzX3NldF9uYW1lKCk7CisgICAgY2FzZSBVUFRJTUVfU0VDUzoKKyAgICAgIHJldHVybiBpc19zZXRfdXB0aW1lX3NlY3MoKTsKKyAgICBjYXNlIFNUQVRVUzoKKyAgICAgIHJldHVybiBpc19zZXRfc3RhdHVzKCk7CisgICAgY2FzZSBOVU1fVEFTS1M6CisgICAgICByZXR1cm4gaXNfc2V0X251bV90YXNrcygpOworICAgIGNhc2UgTlVNX1dPUktFUlM6CisgICAgICByZXR1cm4gaXNfc2V0X251bV93b3JrZXJzKCk7CisgICAgY2FzZSBOVU1fRVhFQ1VUT1JTOgorICAgICAgcmV0dXJuIGlzX3NldF9udW1fZXhlY3V0b3JzKCk7CisgICAgY2FzZSBUT1BPTE9HWV9DT05GOgorICAgICAgcmV0dXJuIGlzX3NldF90b3BvbG9neV9jb25mKCk7CisgICAgY2FzZSBJRF9UT19TUE9VVF9BR0dfU1RBVFM6CisgICAgICByZXR1cm4gaXNfc2V0X2lkX3RvX3Nwb3V0X2FnZ19zdGF0cygpOworICAgIGNhc2UgSURfVE9fQk9MVF9BR0dfU1RBVFM6CisgICAgICByZXR1cm4gaXNfc2V0X2lkX3RvX2JvbHRfYWdnX3N0YXRzKCk7CisgICAgY2FzZSBTQ0hFRF9TVEFUVVM6CisgICAgICByZXR1cm4gaXNfc2V0X3NjaGVkX3N0YXR1cygpOworICAgIGNhc2UgVE9QT0xPR1lfU1RBVFM6CisgICAgICByZXR1cm4gaXNfc2V0X3RvcG9sb2d5X3N0YXRzKCk7CisgICAgY2FzZSBPV05FUjoKKyAgICAgIHJldHVybiBpc19zZXRfb3duZXIoKTsKKyAgICBjYXNlIERFQlVHX09QVElPTlM6CisgICAgICByZXR1cm4gaXNfc2V0X2RlYnVnX29wdGlvbnMoKTsKKyAgICBjYXNlIFJFUExJQ0FUSU9OX0NPVU5UOgorICAgICAgcmV0dXJuIGlzX3NldF9yZXBsaWNhdGlvbl9jb3VudCgpOworICAgIGNhc2UgUkVRVUVTVEVEX01FTU9OSEVBUDoKKyAgICAgIHJldHVybiBpc19zZXRfcmVxdWVzdGVkX21lbW9uaGVhcCgpOworICAgIGNhc2UgUkVRVUVTVEVEX01FTU9GRkhFQVA6CisgICAgICByZXR1cm4gaXNfc2V0X3JlcXVlc3RlZF9tZW1vZmZoZWFwKCk7CisgICAgY2FzZSBSRVFVRVNURURfQ1BVOgorICAgICAgcmV0dXJuIGlzX3NldF9yZXF1ZXN0ZWRfY3B1KCk7CisgICAgY2FzZSBBU1NJR05FRF9NRU1PTkhFQVA6CisgICAgICByZXR1cm4gaXNfc2V0X2Fzc2lnbmVkX21lbW9uaGVhcCgpOworICAgIGNhc2UgQVNTSUdORURfTUVNT0ZGSEVBUDoKKyAgICAgIHJldHVybiBpc19zZXRfYXNzaWduZWRfbWVtb2ZmaGVhcCgpOworICAgIGNhc2UgQVNTSUdORURfQ1BVOgorICAgICAgcmV0dXJuIGlzX3NldF9hc3NpZ25lZF9jcHUoKTsKKyAgICB9CisgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgdGhhdCkgeworICAgIGlmICh0aGF0ID09IG51bGwpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKHRoYXQgaW5zdGFuY2VvZiBUb3BvbG9neVBhZ2VJbmZvKQorICAgICAgcmV0dXJuIHRoaXMuZXF1YWxzKChUb3BvbG9neVBhZ2VJbmZvKXRoYXQpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHB1YmxpYyBib29sZWFuIGVxdWFscyhUb3BvbG9neVBhZ2VJbmZvIHRoYXQpIHsKKyAgICBpZiAodGhhdCA9PSBudWxsKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgYm9vbGVhbiB0aGlzX3ByZXNlbnRfaWQgPSB0cnVlICYmIHRoaXMuaXNfc2V0X2lkKCk7CisgICAgYm9vbGVhbiB0aGF0X3ByZXNlbnRfaWQgPSB0cnVlICYmIHRoYXQuaXNfc2V0X2lkKCk7CisgICAgaWYgKHRoaXNfcHJlc2VudF9pZCB8fCB0aGF0X3ByZXNlbnRfaWQpIHsKKyAgICAgIGlmICghKHRoaXNfcHJlc2VudF9pZCAmJiB0aGF0X3ByZXNlbnRfaWQpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBpZiAoIXRoaXMuaWQuZXF1YWxzKHRoYXQuaWQpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbGVhbiB0aGlzX3ByZXNlbnRfbmFtZSA9IHRydWUgJiYgdGhpcy5pc19zZXRfbmFtZSgpOworICAgIGJvb2xlYW4gdGhhdF9wcmVzZW50X25hbWUgPSB0cnVlICYmIHRoYXQuaXNfc2V0X25hbWUoKTsKKyAgICBpZiAodGhpc19wcmVzZW50X25hbWUgfHwgdGhhdF9wcmVzZW50X25hbWUpIHsKKyAgICAgIGlmICghKHRoaXNfcHJlc2VudF9uYW1lICYmIHRoYXRfcHJlc2VudF9uYW1lKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKCF0aGlzLm5hbWUuZXF1YWxzKHRoYXQubmFtZSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sZWFuIHRoaXNfcHJlc2VudF91cHRpbWVfc2VjcyA9IHRydWUgJiYgdGhpcy5pc19zZXRfdXB0aW1lX3NlY3MoKTsKKyAgICBib29sZWFuIHRoYXRfcHJlc2VudF91cHRpbWVfc2VjcyA9IHRydWUgJiYgdGhhdC5pc19zZXRfdXB0aW1lX3NlY3MoKTsKKyAgICBpZiAodGhpc19wcmVzZW50X3VwdGltZV9zZWNzIHx8IHRoYXRfcHJlc2VudF91cHRpbWVfc2VjcykgeworICAgICAgaWYgKCEodGhpc19wcmVzZW50X3VwdGltZV9zZWNzICYmIHRoYXRfcHJlc2VudF91cHRpbWVfc2VjcykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGlmICh0aGlzLnVwdGltZV9zZWNzICE9IHRoYXQudXB0aW1lX3NlY3MpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sZWFuIHRoaXNfcHJlc2VudF9zdGF0dXMgPSB0cnVlICYmIHRoaXMuaXNfc2V0X3N0YXR1cygpOworICAgIGJvb2xlYW4gdGhhdF9wcmVzZW50X3N0YXR1cyA9IHRydWUgJiYgdGhhdC5pc19zZXRfc3RhdHVzKCk7CisgICAgaWYgKHRoaXNfcHJlc2VudF9zdGF0dXMgfHwgdGhhdF9wcmVzZW50X3N0YXR1cykgeworICAgICAgaWYgKCEodGhpc19wcmVzZW50X3N0YXR1cyAmJiB0aGF0X3ByZXNlbnRfc3RhdHVzKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKCF0aGlzLnN0YXR1cy5lcXVhbHModGhhdC5zdGF0dXMpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbGVhbiB0aGlzX3ByZXNlbnRfbnVtX3Rhc2tzID0gdHJ1ZSAmJiB0aGlzLmlzX3NldF9udW1fdGFza3MoKTsKKyAgICBib29sZWFuIHRoYXRfcHJlc2VudF9udW1fdGFza3MgPSB0cnVlICYmIHRoYXQuaXNfc2V0X251bV90YXNrcygpOworICAgIGlmICh0aGlzX3ByZXNlbnRfbnVtX3Rhc2tzIHx8IHRoYXRfcHJlc2VudF9udW1fdGFza3MpIHsKKyAgICAgIGlmICghKHRoaXNfcHJlc2VudF9udW1fdGFza3MgJiYgdGhhdF9wcmVzZW50X251bV90YXNrcykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGlmICh0aGlzLm51bV90YXNrcyAhPSB0aGF0Lm51bV90YXNrcykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2xlYW4gdGhpc19wcmVzZW50X251bV93b3JrZXJzID0gdHJ1ZSAmJiB0aGlzLmlzX3NldF9udW1fd29ya2VycygpOworICAgIGJvb2xlYW4gdGhhdF9wcmVzZW50X251bV93b3JrZXJzID0gdHJ1ZSAmJiB0aGF0LmlzX3NldF9udW1fd29ya2VycygpOworICAgIGlmICh0aGlzX3ByZXNlbnRfbnVtX3dvcmtlcnMgfHwgdGhhdF9wcmVzZW50X251bV93b3JrZXJzKSB7CisgICAgICBpZiAoISh0aGlzX3ByZXNlbnRfbnVtX3dvcmtlcnMgJiYgdGhhdF9wcmVzZW50X251bV93b3JrZXJzKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKHRoaXMubnVtX3dvcmtlcnMgIT0gdGhhdC5udW1fd29ya2VycykKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2xlYW4gdGhpc19wcmVzZW50X251bV9leGVjdXRvcnMgPSB0cnVlICYmIHRoaXMuaXNfc2V0X251bV9leGVjdXRvcnMoKTsKKyAgICBib29sZWFuIHRoYXRfcHJlc2VudF9udW1fZXhlY3V0b3JzID0gdHJ1ZSAmJiB0aGF0LmlzX3NldF9udW1fZXhlY3V0b3JzKCk7CisgICAgaWYgKHRoaXNfcHJlc2VudF9udW1fZXhlY3V0b3JzIHx8IHRoYXRfcHJlc2VudF9udW1fZXhlY3V0b3JzKSB7CisgICAgICBpZiAoISh0aGlzX3ByZXNlbnRfbnVtX2V4ZWN1dG9ycyAmJiB0aGF0X3ByZXNlbnRfbnVtX2V4ZWN1dG9ycykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGlmICh0aGlzLm51bV9leGVjdXRvcnMgIT0gdGhhdC5udW1fZXhlY3V0b3JzKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbGVhbiB0aGlzX3ByZXNlbnRfdG9wb2xvZ3lfY29uZiA9IHRydWUgJiYgdGhpcy5pc19zZXRfdG9wb2xvZ3lfY29uZigpOworICAgIGJvb2xlYW4gdGhhdF9wcmVzZW50X3RvcG9sb2d5X2NvbmYgPSB0cnVlICYmIHRoYXQuaXNfc2V0X3RvcG9sb2d5X2NvbmYoKTsKKyAgICBpZiAodGhpc19wcmVzZW50X3RvcG9sb2d5X2NvbmYgfHwgdGhhdF9wcmVzZW50X3RvcG9sb2d5X2NvbmYpIHsKKyAgICAgIGlmICghKHRoaXNfcHJlc2VudF90b3BvbG9neV9jb25mICYmIHRoYXRfcHJlc2VudF90b3BvbG9neV9jb25mKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKCF0aGlzLnRvcG9sb2d5X2NvbmYuZXF1YWxzKHRoYXQudG9wb2xvZ3lfY29uZikpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sZWFuIHRoaXNfcHJlc2VudF9pZF90b19zcG91dF9hZ2dfc3RhdHMgPSB0cnVlICYmIHRoaXMuaXNfc2V0X2lkX3RvX3Nwb3V0X2FnZ19zdGF0cygpOworICAgIGJvb2xlYW4gdGhhdF9wcmVzZW50X2lkX3RvX3Nwb3V0X2FnZ19zdGF0cyA9IHRydWUgJiYgdGhhdC5pc19zZXRfaWRfdG9fc3BvdXRfYWdnX3N0YXRzKCk7CisgICAgaWYgKHRoaXNfcHJlc2VudF9pZF90b19zcG91dF9hZ2dfc3RhdHMgfHwgdGhhdF9wcmVzZW50X2lkX3RvX3Nwb3V0X2FnZ19zdGF0cykgeworICAgICAgaWYgKCEodGhpc19wcmVzZW50X2lkX3RvX3Nwb3V0X2FnZ19zdGF0cyAmJiB0aGF0X3ByZXNlbnRfaWRfdG9fc3BvdXRfYWdnX3N0YXRzKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKCF0aGlzLmlkX3RvX3Nwb3V0X2FnZ19zdGF0cy5lcXVhbHModGhhdC5pZF90b19zcG91dF9hZ2dfc3RhdHMpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbGVhbiB0aGlzX3ByZXNlbnRfaWRfdG9fYm9sdF9hZ2dfc3RhdHMgPSB0cnVlICYmIHRoaXMuaXNfc2V0X2lkX3RvX2JvbHRfYWdnX3N0YXRzKCk7CisgICAgYm9vbGVhbiB0aGF0X3ByZXNlbnRfaWRfdG9fYm9sdF9hZ2dfc3RhdHMgPSB0cnVlICYmIHRoYXQuaXNfc2V0X2lkX3RvX2JvbHRfYWdnX3N0YXRzKCk7CisgICAgaWYgKHRoaXNfcHJlc2VudF9pZF90b19ib2x0X2FnZ19zdGF0cyB8fCB0aGF0X3ByZXNlbnRfaWRfdG9fYm9sdF9hZ2dfc3RhdHMpIHsKKyAgICAgIGlmICghKHRoaXNfcHJlc2VudF9pZF90b19ib2x0X2FnZ19zdGF0cyAmJiB0aGF0X3ByZXNlbnRfaWRfdG9fYm9sdF9hZ2dfc3RhdHMpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBpZiAoIXRoaXMuaWRfdG9fYm9sdF9hZ2dfc3RhdHMuZXF1YWxzKHRoYXQuaWRfdG9fYm9sdF9hZ2dfc3RhdHMpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbGVhbiB0aGlzX3ByZXNlbnRfc2NoZWRfc3RhdHVzID0gdHJ1ZSAmJiB0aGlzLmlzX3NldF9zY2hlZF9zdGF0dXMoKTsKKyAgICBib29sZWFuIHRoYXRfcHJlc2VudF9zY2hlZF9zdGF0dXMgPSB0cnVlICYmIHRoYXQuaXNfc2V0X3NjaGVkX3N0YXR1cygpOworICAgIGlmICh0aGlzX3ByZXNlbnRfc2NoZWRfc3RhdHVzIHx8IHRoYXRfcHJlc2VudF9zY2hlZF9zdGF0dXMpIHsKKyAgICAgIGlmICghKHRoaXNfcHJlc2VudF9zY2hlZF9zdGF0dXMgJiYgdGhhdF9wcmVzZW50X3NjaGVkX3N0YXR1cykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGlmICghdGhpcy5zY2hlZF9zdGF0dXMuZXF1YWxzKHRoYXQuc2NoZWRfc3RhdHVzKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2xlYW4gdGhpc19wcmVzZW50X3RvcG9sb2d5X3N0YXRzID0gdHJ1ZSAmJiB0aGlzLmlzX3NldF90b3BvbG9neV9zdGF0cygpOworICAgIGJvb2xlYW4gdGhhdF9wcmVzZW50X3RvcG9sb2d5X3N0YXRzID0gdHJ1ZSAmJiB0aGF0LmlzX3NldF90b3BvbG9neV9zdGF0cygpOworICAgIGlmICh0aGlzX3ByZXNlbnRfdG9wb2xvZ3lfc3RhdHMgfHwgdGhhdF9wcmVzZW50X3RvcG9sb2d5X3N0YXRzKSB7CisgICAgICBpZiAoISh0aGlzX3ByZXNlbnRfdG9wb2xvZ3lfc3RhdHMgJiYgdGhhdF9wcmVzZW50X3RvcG9sb2d5X3N0YXRzKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKCF0aGlzLnRvcG9sb2d5X3N0YXRzLmVxdWFscyh0aGF0LnRvcG9sb2d5X3N0YXRzKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2xlYW4gdGhpc19wcmVzZW50X293bmVyID0gdHJ1ZSAmJiB0aGlzLmlzX3NldF9vd25lcigpOworICAgIGJvb2xlYW4gdGhhdF9wcmVzZW50X293bmVyID0gdHJ1ZSAmJiB0aGF0LmlzX3NldF9vd25lcigpOworICAgIGlmICh0aGlzX3ByZXNlbnRfb3duZXIgfHwgdGhhdF9wcmVzZW50X293bmVyKSB7CisgICAgICBpZiAoISh0aGlzX3ByZXNlbnRfb3duZXIgJiYgdGhhdF9wcmVzZW50X293bmVyKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKCF0aGlzLm93bmVyLmVxdWFscyh0aGF0Lm93bmVyKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2xlYW4gdGhpc19wcmVzZW50X2RlYnVnX29wdGlvbnMgPSB0cnVlICYmIHRoaXMuaXNfc2V0X2RlYnVnX29wdGlvbnMoKTsKKyAgICBib29sZWFuIHRoYXRfcHJlc2VudF9kZWJ1Z19vcHRpb25zID0gdHJ1ZSAmJiB0aGF0LmlzX3NldF9kZWJ1Z19vcHRpb25zKCk7CisgICAgaWYgKHRoaXNfcHJlc2VudF9kZWJ1Z19vcHRpb25zIHx8IHRoYXRfcHJlc2VudF9kZWJ1Z19vcHRpb25zKSB7CisgICAgICBpZiAoISh0aGlzX3ByZXNlbnRfZGVidWdfb3B0aW9ucyAmJiB0aGF0X3ByZXNlbnRfZGVidWdfb3B0aW9ucykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGlmICghdGhpcy5kZWJ1Z19vcHRpb25zLmVxdWFscyh0aGF0LmRlYnVnX29wdGlvbnMpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbGVhbiB0aGlzX3ByZXNlbnRfcmVwbGljYXRpb25fY291bnQgPSB0cnVlICYmIHRoaXMuaXNfc2V0X3JlcGxpY2F0aW9uX2NvdW50KCk7CisgICAgYm9vbGVhbiB0aGF0X3ByZXNlbnRfcmVwbGljYXRpb25fY291bnQgPSB0cnVlICYmIHRoYXQuaXNfc2V0X3JlcGxpY2F0aW9uX2NvdW50KCk7CisgICAgaWYgKHRoaXNfcHJlc2VudF9yZXBsaWNhdGlvbl9jb3VudCB8fCB0aGF0X3ByZXNlbnRfcmVwbGljYXRpb25fY291bnQpIHsKKyAgICAgIGlmICghKHRoaXNfcHJlc2VudF9yZXBsaWNhdGlvbl9jb3VudCAmJiB0aGF0X3ByZXNlbnRfcmVwbGljYXRpb25fY291bnQpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBpZiAodGhpcy5yZXBsaWNhdGlvbl9jb3VudCAhPSB0aGF0LnJlcGxpY2F0aW9uX2NvdW50KQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbGVhbiB0aGlzX3ByZXNlbnRfcmVxdWVzdGVkX21lbW9uaGVhcCA9IHRydWUgJiYgdGhpcy5pc19zZXRfcmVxdWVzdGVkX21lbW9uaGVhcCgpOworICAgIGJvb2xlYW4gdGhhdF9wcmVzZW50X3JlcXVlc3RlZF9tZW1vbmhlYXAgPSB0cnVlICYmIHRoYXQuaXNfc2V0X3JlcXVlc3RlZF9tZW1vbmhlYXAoKTsKKyAgICBpZiAodGhpc19wcmVzZW50X3JlcXVlc3RlZF9tZW1vbmhlYXAgfHwgdGhhdF9wcmVzZW50X3JlcXVlc3RlZF9tZW1vbmhlYXApIHsKKyAgICAgIGlmICghKHRoaXNfcHJlc2VudF9yZXF1ZXN0ZWRfbWVtb25oZWFwICYmIHRoYXRfcHJlc2VudF9yZXF1ZXN0ZWRfbWVtb25oZWFwKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKHRoaXMucmVxdWVzdGVkX21lbW9uaGVhcCAhPSB0aGF0LnJlcXVlc3RlZF9tZW1vbmhlYXApCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sZWFuIHRoaXNfcHJlc2VudF9yZXF1ZXN0ZWRfbWVtb2ZmaGVhcCA9IHRydWUgJiYgdGhpcy5pc19zZXRfcmVxdWVzdGVkX21lbW9mZmhlYXAoKTsKKyAgICBib29sZWFuIHRoYXRfcHJlc2VudF9yZXF1ZXN0ZWRfbWVtb2ZmaGVhcCA9IHRydWUgJiYgdGhhdC5pc19zZXRfcmVxdWVzdGVkX21lbW9mZmhlYXAoKTsKKyAgICBpZiAodGhpc19wcmVzZW50X3JlcXVlc3RlZF9tZW1vZmZoZWFwIHx8IHRoYXRfcHJlc2VudF9yZXF1ZXN0ZWRfbWVtb2ZmaGVhcCkgeworICAgICAgaWYgKCEodGhpc19wcmVzZW50X3JlcXVlc3RlZF9tZW1vZmZoZWFwICYmIHRoYXRfcHJlc2VudF9yZXF1ZXN0ZWRfbWVtb2ZmaGVhcCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGlmICh0aGlzLnJlcXVlc3RlZF9tZW1vZmZoZWFwICE9IHRoYXQucmVxdWVzdGVkX21lbW9mZmhlYXApCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sZWFuIHRoaXNfcHJlc2VudF9yZXF1ZXN0ZWRfY3B1ID0gdHJ1ZSAmJiB0aGlzLmlzX3NldF9yZXF1ZXN0ZWRfY3B1KCk7CisgICAgYm9vbGVhbiB0aGF0X3ByZXNlbnRfcmVxdWVzdGVkX2NwdSA9IHRydWUgJiYgdGhhdC5pc19zZXRfcmVxdWVzdGVkX2NwdSgpOworICAgIGlmICh0aGlzX3ByZXNlbnRfcmVxdWVzdGVkX2NwdSB8fCB0aGF0X3ByZXNlbnRfcmVxdWVzdGVkX2NwdSkgeworICAgICAgaWYgKCEodGhpc19wcmVzZW50X3JlcXVlc3RlZF9jcHUgJiYgdGhhdF9wcmVzZW50X3JlcXVlc3RlZF9jcHUpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBpZiAodGhpcy5yZXF1ZXN0ZWRfY3B1ICE9IHRoYXQucmVxdWVzdGVkX2NwdSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2xlYW4gdGhpc19wcmVzZW50X2Fzc2lnbmVkX21lbW9uaGVhcCA9IHRydWUgJiYgdGhpcy5pc19zZXRfYXNzaWduZWRfbWVtb25oZWFwKCk7CisgICAgYm9vbGVhbiB0aGF0X3ByZXNlbnRfYXNzaWduZWRfbWVtb25oZWFwID0gdHJ1ZSAmJiB0aGF0LmlzX3NldF9hc3NpZ25lZF9tZW1vbmhlYXAoKTsKKyAgICBpZiAodGhpc19wcmVzZW50X2Fzc2lnbmVkX21lbW9uaGVhcCB8fCB0aGF0X3ByZXNlbnRfYXNzaWduZWRfbWVtb25oZWFwKSB7CisgICAgICBpZiAoISh0aGlzX3ByZXNlbnRfYXNzaWduZWRfbWVtb25oZWFwICYmIHRoYXRfcHJlc2VudF9hc3NpZ25lZF9tZW1vbmhlYXApKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBpZiAodGhpcy5hc3NpZ25lZF9tZW1vbmhlYXAgIT0gdGhhdC5hc3NpZ25lZF9tZW1vbmhlYXApCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sZWFuIHRoaXNfcHJlc2VudF9hc3NpZ25lZF9tZW1vZmZoZWFwID0gdHJ1ZSAmJiB0aGlzLmlzX3NldF9hc3NpZ25lZF9tZW1vZmZoZWFwKCk7CisgICAgYm9vbGVhbiB0aGF0X3ByZXNlbnRfYXNzaWduZWRfbWVtb2ZmaGVhcCA9IHRydWUgJiYgdGhhdC5pc19zZXRfYXNzaWduZWRfbWVtb2ZmaGVhcCgpOworICAgIGlmICh0aGlzX3ByZXNlbnRfYXNzaWduZWRfbWVtb2ZmaGVhcCB8fCB0aGF0X3ByZXNlbnRfYXNzaWduZWRfbWVtb2ZmaGVhcCkgeworICAgICAgaWYgKCEodGhpc19wcmVzZW50X2Fzc2lnbmVkX21lbW9mZmhlYXAgJiYgdGhhdF9wcmVzZW50X2Fzc2lnbmVkX21lbW9mZmhlYXApKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBpZiAodGhpcy5hc3NpZ25lZF9tZW1vZmZoZWFwICE9IHRoYXQuYXNzaWduZWRfbWVtb2ZmaGVhcCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2xlYW4gdGhpc19wcmVzZW50X2Fzc2lnbmVkX2NwdSA9IHRydWUgJiYgdGhpcy5pc19zZXRfYXNzaWduZWRfY3B1KCk7CisgICAgYm9vbGVhbiB0aGF0X3ByZXNlbnRfYXNzaWduZWRfY3B1ID0gdHJ1ZSAmJiB0aGF0LmlzX3NldF9hc3NpZ25lZF9jcHUoKTsKKyAgICBpZiAodGhpc19wcmVzZW50X2Fzc2lnbmVkX2NwdSB8fCB0aGF0X3ByZXNlbnRfYXNzaWduZWRfY3B1KSB7CisgICAgICBpZiAoISh0aGlzX3ByZXNlbnRfYXNzaWduZWRfY3B1ICYmIHRoYXRfcHJlc2VudF9hc3NpZ25lZF9jcHUpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBpZiAodGhpcy5hc3NpZ25lZF9jcHUgIT0gdGhhdC5hc3NpZ25lZF9jcHUpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgIExpc3Q8T2JqZWN0PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7CisKKyAgICBib29sZWFuIHByZXNlbnRfaWQgPSB0cnVlICYmIChpc19zZXRfaWQoKSk7CisgICAgbGlzdC5hZGQocHJlc2VudF9pZCk7CisgICAgaWYgKHByZXNlbnRfaWQpCisgICAgICBsaXN0LmFkZChpZCk7CisKKyAgICBib29sZWFuIHByZXNlbnRfbmFtZSA9IHRydWUgJiYgKGlzX3NldF9uYW1lKCkpOworICAgIGxpc3QuYWRkKHByZXNlbnRfbmFtZSk7CisgICAgaWYgKHByZXNlbnRfbmFtZSkKKyAgICAgIGxpc3QuYWRkKG5hbWUpOworCisgICAgYm9vbGVhbiBwcmVzZW50X3VwdGltZV9zZWNzID0gdHJ1ZSAmJiAoaXNfc2V0X3VwdGltZV9zZWNzKCkpOworICAgIGxpc3QuYWRkKHByZXNlbnRfdXB0aW1lX3NlY3MpOworICAgIGlmIChwcmVzZW50X3VwdGltZV9zZWNzKQorICAgICAgbGlzdC5hZGQodXB0aW1lX3NlY3MpOworCisgICAgYm9vbGVhbiBwcmVzZW50X3N0YXR1cyA9IHRydWUgJiYgKGlzX3NldF9zdGF0dXMoKSk7CisgICAgbGlzdC5hZGQocHJlc2VudF9zdGF0dXMpOworICAgIGlmIChwcmVzZW50X3N0YXR1cykKKyAgICAgIGxpc3QuYWRkKHN0YXR1cyk7CisKKyAgICBib29sZWFuIHByZXNlbnRfbnVtX3Rhc2tzID0gdHJ1ZSAmJiAoaXNfc2V0X251bV90YXNrcygpKTsKKyAgICBsaXN0LmFkZChwcmVzZW50X251bV90YXNrcyk7CisgICAgaWYgKHByZXNlbnRfbnVtX3Rhc2tzKQorICAgICAgbGlzdC5hZGQobnVtX3Rhc2tzKTsKKworICAgIGJvb2xlYW4gcHJlc2VudF9udW1fd29ya2VycyA9IHRydWUgJiYgKGlzX3NldF9udW1fd29ya2VycygpKTsKKyAgICBsaXN0LmFkZChwcmVzZW50X251bV93b3JrZXJzKTsKKyAgICBpZiAocHJlc2VudF9udW1fd29ya2VycykKKyAgICAgIGxpc3QuYWRkKG51bV93b3JrZXJzKTsKKworICAgIGJvb2xlYW4gcHJlc2VudF9udW1fZXhlY3V0b3JzID0gdHJ1ZSAmJiAoaXNfc2V0X251bV9leGVjdXRvcnMoKSk7CisgICAgbGlzdC5hZGQocHJlc2VudF9udW1fZXhlY3V0b3JzKTsKKyAgICBpZiAocHJlc2VudF9udW1fZXhlY3V0b3JzKQorICAgICAgbGlzdC5hZGQobnVtX2V4ZWN1dG9ycyk7CisKKyAgICBib29sZWFuIHByZXNlbnRfdG9wb2xvZ3lfY29uZiA9IHRydWUgJiYgKGlzX3NldF90b3BvbG9neV9jb25mKCkpOworICAgIGxpc3QuYWRkKHByZXNlbnRfdG9wb2xvZ3lfY29uZik7CisgICAgaWYgKHByZXNlbnRfdG9wb2xvZ3lfY29uZikKKyAgICAgIGxpc3QuYWRkKHRvcG9sb2d5X2NvbmYpOworCisgICAgYm9vbGVhbiBwcmVzZW50X2lkX3RvX3Nwb3V0X2FnZ19zdGF0cyA9IHRydWUgJiYgKGlzX3NldF9pZF90b19zcG91dF9hZ2dfc3RhdHMoKSk7CisgICAgbGlzdC5hZGQocHJlc2VudF9pZF90b19zcG91dF9hZ2dfc3RhdHMpOworICAgIGlmIChwcmVzZW50X2lkX3RvX3Nwb3V0X2FnZ19zdGF0cykKKyAgICAgIGxpc3QuYWRkKGlkX3RvX3Nwb3V0X2FnZ19zdGF0cyk7CisKKyAgICBib29sZWFuIHByZXNlbnRfaWRfdG9fYm9sdF9hZ2dfc3RhdHMgPSB0cnVlICYmIChpc19zZXRfaWRfdG9fYm9sdF9hZ2dfc3RhdHMoKSk7CisgICAgbGlzdC5hZGQocHJlc2VudF9pZF90b19ib2x0X2FnZ19zdGF0cyk7CisgICAgaWYgKHByZXNlbnRfaWRfdG9fYm9sdF9hZ2dfc3RhdHMpCisgICAgICBsaXN0LmFkZChpZF90b19ib2x0X2FnZ19zdGF0cyk7CisKKyAgICBib29sZWFuIHByZXNlbnRfc2NoZWRfc3RhdHVzID0gdHJ1ZSAmJiAoaXNfc2V0X3NjaGVkX3N0YXR1cygpKTsKKyAgICBsaXN0LmFkZChwcmVzZW50X3NjaGVkX3N0YXR1cyk7CisgICAgaWYgKHByZXNlbnRfc2NoZWRfc3RhdHVzKQorICAgICAgbGlzdC5hZGQoc2NoZWRfc3RhdHVzKTsKKworICAgIGJvb2xlYW4gcHJlc2VudF90b3BvbG9neV9zdGF0cyA9IHRydWUgJiYgKGlzX3NldF90b3BvbG9neV9zdGF0cygpKTsKKyAgICBsaXN0LmFkZChwcmVzZW50X3RvcG9sb2d5X3N0YXRzKTsKKyAgICBpZiAocHJlc2VudF90b3BvbG9neV9zdGF0cykKKyAgICAgIGxpc3QuYWRkKHRvcG9sb2d5X3N0YXRzKTsKKworICAgIGJvb2xlYW4gcHJlc2VudF9vd25lciA9IHRydWUgJiYgKGlzX3NldF9vd25lcigpKTsKKyAgICBsaXN0LmFkZChwcmVzZW50X293bmVyKTsKKyAgICBpZiAocHJlc2VudF9vd25lcikKKyAgICAgIGxpc3QuYWRkKG93bmVyKTsKKworICAgIGJvb2xlYW4gcHJlc2VudF9kZWJ1Z19vcHRpb25zID0gdHJ1ZSAmJiAoaXNfc2V0X2RlYnVnX29wdGlvbnMoKSk7CisgICAgbGlzdC5hZGQocHJlc2VudF9kZWJ1Z19vcHRpb25zKTsKKyAgICBpZiAocHJlc2VudF9kZWJ1Z19vcHRpb25zKQorICAgICAgbGlzdC5hZGQoZGVidWdfb3B0aW9ucyk7CisKKyAgICBib29sZWFuIHByZXNlbnRfcmVwbGljYXRpb25fY291bnQgPSB0cnVlICYmIChpc19zZXRfcmVwbGljYXRpb25fY291bnQoKSk7CisgICAgbGlzdC5hZGQocHJlc2VudF9yZXBsaWNhdGlvbl9jb3VudCk7CisgICAgaWYgKHByZXNlbnRfcmVwbGljYXRpb25fY291bnQpCisgICAgICBsaXN0LmFkZChyZXBsaWNhdGlvbl9jb3VudCk7CisKKyAgICBib29sZWFuIHByZXNlbnRfcmVxdWVzdGVkX21lbW9uaGVhcCA9IHRydWUgJiYgKGlzX3NldF9yZXF1ZXN0ZWRfbWVtb25oZWFwKCkpOworICAgIGxpc3QuYWRkKHByZXNlbnRfcmVxdWVzdGVkX21lbW9uaGVhcCk7CisgICAgaWYgKHByZXNlbnRfcmVxdWVzdGVkX21lbW9uaGVhcCkKKyAgICAgIGxpc3QuYWRkKHJlcXVlc3RlZF9tZW1vbmhlYXApOworCisgICAgYm9vbGVhbiBwcmVzZW50X3JlcXVlc3RlZF9tZW1vZmZoZWFwID0gdHJ1ZSAmJiAoaXNfc2V0X3JlcXVlc3RlZF9tZW1vZmZoZWFwKCkpOworICAgIGxpc3QuYWRkKHByZXNlbnRfcmVxdWVzdGVkX21lbW9mZmhlYXApOworICAgIGlmIChwcmVzZW50X3JlcXVlc3RlZF9tZW1vZmZoZWFwKQorICAgICAgbGlzdC5hZGQocmVxdWVzdGVkX21lbW9mZmhlYXApOworCisgICAgYm9vbGVhbiBwcmVzZW50X3JlcXVlc3RlZF9jcHUgPSB0cnVlICYmIChpc19zZXRfcmVxdWVzdGVkX2NwdSgpKTsKKyAgICBsaXN0LmFkZChwcmVzZW50X3JlcXVlc3RlZF9jcHUpOworICAgIGlmIChwcmVzZW50X3JlcXVlc3RlZF9jcHUpCisgICAgICBsaXN0LmFkZChyZXF1ZXN0ZWRfY3B1KTsKKworICAgIGJvb2xlYW4gcHJlc2VudF9hc3NpZ25lZF9tZW1vbmhlYXAgPSB0cnVlICYmIChpc19zZXRfYXNzaWduZWRfbWVtb25oZWFwKCkpOworICAgIGxpc3QuYWRkKHByZXNlbnRfYXNzaWduZWRfbWVtb25oZWFwKTsKKyAgICBpZiAocHJlc2VudF9hc3NpZ25lZF9tZW1vbmhlYXApCisgICAgICBsaXN0LmFkZChhc3NpZ25lZF9tZW1vbmhlYXApOworCisgICAgYm9vbGVhbiBwcmVzZW50X2Fzc2lnbmVkX21lbW9mZmhlYXAgPSB0cnVlICYmIChpc19zZXRfYXNzaWduZWRfbWVtb2ZmaGVhcCgpKTsKKyAgICBsaXN0LmFkZChwcmVzZW50X2Fzc2lnbmVkX21lbW9mZmhlYXApOworICAgIGlmIChwcmVzZW50X2Fzc2lnbmVkX21lbW9mZmhlYXApCisgICAgICBsaXN0LmFkZChhc3NpZ25lZF9tZW1vZmZoZWFwKTsKKworICAgIGJvb2xlYW4gcHJlc2VudF9hc3NpZ25lZF9jcHUgPSB0cnVlICYmIChpc19zZXRfYXNzaWduZWRfY3B1KCkpOworICAgIGxpc3QuYWRkKHByZXNlbnRfYXNzaWduZWRfY3B1KTsKKyAgICBpZiAocHJlc2VudF9hc3NpZ25lZF9jcHUpCisgICAgICBsaXN0LmFkZChhc3NpZ25lZF9jcHUpOworCisgICAgcmV0dXJuIGxpc3QuaGFzaENvZGUoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGNvbXBhcmVUbyhUb3BvbG9neVBhZ2VJbmZvIG90aGVyKSB7CisgICAgaWYgKCFnZXRDbGFzcygpLmVxdWFscyhvdGhlci5nZXRDbGFzcygpKSkgeworICAgICAgcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpLmNvbXBhcmVUbyhvdGhlci5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgfQorCisgICAgaW50IGxhc3RDb21wYXJpc29uID0gMDsKKworICAgIGxhc3RDb21wYXJpc29uID0gQm9vbGVhbi52YWx1ZU9mKGlzX3NldF9pZCgpKS5jb21wYXJlVG8ob3RoZXIuaXNfc2V0X2lkKCkpOworICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgfQorICAgIGlmIChpc19zZXRfaWQoKSkgeworICAgICAgbGFzdENvbXBhcmlzb24gPSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy5pZCwgb3RoZXIuaWQpOworICAgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgICAgfQorICAgIH0KKyAgICBsYXN0Q29tcGFyaXNvbiA9IEJvb2xlYW4udmFsdWVPZihpc19zZXRfbmFtZSgpKS5jb21wYXJlVG8ob3RoZXIuaXNfc2V0X25hbWUoKSk7CisgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICB9CisgICAgaWYgKGlzX3NldF9uYW1lKCkpIHsKKyAgICAgIGxhc3RDb21wYXJpc29uID0gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29tcGFyZVRvKHRoaXMubmFtZSwgb3RoZXIubmFtZSk7CisgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICB9CisgICAgfQorICAgIGxhc3RDb21wYXJpc29uID0gQm9vbGVhbi52YWx1ZU9mKGlzX3NldF91cHRpbWVfc2VjcygpKS5jb21wYXJlVG8ob3RoZXIuaXNfc2V0X3VwdGltZV9zZWNzKCkpOworICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgfQorICAgIGlmIChpc19zZXRfdXB0aW1lX3NlY3MoKSkgeworICAgICAgbGFzdENvbXBhcmlzb24gPSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy51cHRpbWVfc2Vjcywgb3RoZXIudXB0aW1lX3NlY3MpOworICAgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgICAgfQorICAgIH0KKyAgICBsYXN0Q29tcGFyaXNvbiA9IEJvb2xlYW4udmFsdWVPZihpc19zZXRfc3RhdHVzKCkpLmNvbXBhcmVUbyhvdGhlci5pc19zZXRfc3RhdHVzKCkpOworICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgfQorICAgIGlmIChpc19zZXRfc3RhdHVzKCkpIHsKKyAgICAgIGxhc3RDb21wYXJpc29uID0gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29tcGFyZVRvKHRoaXMuc3RhdHVzLCBvdGhlci5zdGF0dXMpOworICAgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgICAgfQorICAgIH0KKyAgICBsYXN0Q29tcGFyaXNvbiA9IEJvb2xlYW4udmFsdWVPZihpc19zZXRfbnVtX3Rhc2tzKCkpLmNvbXBhcmVUbyhvdGhlci5pc19zZXRfbnVtX3Rhc2tzKCkpOworICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgfQorICAgIGlmIChpc19zZXRfbnVtX3Rhc2tzKCkpIHsKKyAgICAgIGxhc3RDb21wYXJpc29uID0gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29tcGFyZVRvKHRoaXMubnVtX3Rhc2tzLCBvdGhlci5udW1fdGFza3MpOworICAgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgICAgfQorICAgIH0KKyAgICBsYXN0Q29tcGFyaXNvbiA9IEJvb2xlYW4udmFsdWVPZihpc19zZXRfbnVtX3dvcmtlcnMoKSkuY29tcGFyZVRvKG90aGVyLmlzX3NldF9udW1fd29ya2VycygpKTsKKyAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgIH0KKyAgICBpZiAoaXNfc2V0X251bV93b3JrZXJzKCkpIHsKKyAgICAgIGxhc3RDb21wYXJpc29uID0gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29tcGFyZVRvKHRoaXMubnVtX3dvcmtlcnMsIG90aGVyLm51bV93b3JrZXJzKTsKKyAgICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICAgIH0KKyAgICB9CisgICAgbGFzdENvbXBhcmlzb24gPSBCb29sZWFuLnZhbHVlT2YoaXNfc2V0X251bV9leGVjdXRvcnMoKSkuY29tcGFyZVRvKG90aGVyLmlzX3NldF9udW1fZXhlY3V0b3JzKCkpOworICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgfQorICAgIGlmIChpc19zZXRfbnVtX2V4ZWN1dG9ycygpKSB7CisgICAgICBsYXN0Q29tcGFyaXNvbiA9IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvbXBhcmVUbyh0aGlzLm51bV9leGVjdXRvcnMsIG90aGVyLm51bV9leGVjdXRvcnMpOworICAgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgICAgfQorICAgIH0KKyAgICBsYXN0Q29tcGFyaXNvbiA9IEJvb2xlYW4udmFsdWVPZihpc19zZXRfdG9wb2xvZ3lfY29uZigpKS5jb21wYXJlVG8ob3RoZXIuaXNfc2V0X3RvcG9sb2d5X2NvbmYoKSk7CisgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICB9CisgICAgaWYgKGlzX3NldF90b3BvbG9neV9jb25mKCkpIHsKKyAgICAgIGxhc3RDb21wYXJpc29uID0gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29tcGFyZVRvKHRoaXMudG9wb2xvZ3lfY29uZiwgb3RoZXIudG9wb2xvZ3lfY29uZik7CisgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICB9CisgICAgfQorICAgIGxhc3RDb21wYXJpc29uID0gQm9vbGVhbi52YWx1ZU9mKGlzX3NldF9pZF90b19zcG91dF9hZ2dfc3RhdHMoKSkuY29tcGFyZVRvKG90aGVyLmlzX3NldF9pZF90b19zcG91dF9hZ2dfc3RhdHMoKSk7CisgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICB9CisgICAgaWYgKGlzX3NldF9pZF90b19zcG91dF9hZ2dfc3RhdHMoKSkgeworICAgICAgbGFzdENvbXBhcmlzb24gPSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy5pZF90b19zcG91dF9hZ2dfc3RhdHMsIG90aGVyLmlkX3RvX3Nwb3V0X2FnZ19zdGF0cyk7CisgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICB9CisgICAgfQorICAgIGxhc3RDb21wYXJpc29uID0gQm9vbGVhbi52YWx1ZU9mKGlzX3NldF9pZF90b19ib2x0X2FnZ19zdGF0cygpKS5jb21wYXJlVG8ob3RoZXIuaXNfc2V0X2lkX3RvX2JvbHRfYWdnX3N0YXRzKCkpOworICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgfQorICAgIGlmIChpc19zZXRfaWRfdG9fYm9sdF9hZ2dfc3RhdHMoKSkgeworICAgICAgbGFzdENvbXBhcmlzb24gPSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy5pZF90b19ib2x0X2FnZ19zdGF0cywgb3RoZXIuaWRfdG9fYm9sdF9hZ2dfc3RhdHMpOworICAgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgICAgfQorICAgIH0KKyAgICBsYXN0Q29tcGFyaXNvbiA9IEJvb2xlYW4udmFsdWVPZihpc19zZXRfc2NoZWRfc3RhdHVzKCkpLmNvbXBhcmVUbyhvdGhlci5pc19zZXRfc2NoZWRfc3RhdHVzKCkpOworICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgfQorICAgIGlmIChpc19zZXRfc2NoZWRfc3RhdHVzKCkpIHsKKyAgICAgIGxhc3RDb21wYXJpc29uID0gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29tcGFyZVRvKHRoaXMuc2NoZWRfc3RhdHVzLCBvdGhlci5zY2hlZF9zdGF0dXMpOworICAgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgICAgfQorICAgIH0KKyAgICBsYXN0Q29tcGFyaXNvbiA9IEJvb2xlYW4udmFsdWVPZihpc19zZXRfdG9wb2xvZ3lfc3RhdHMoKSkuY29tcGFyZVRvKG90aGVyLmlzX3NldF90b3BvbG9neV9zdGF0cygpKTsKKyAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgIH0KKyAgICBpZiAoaXNfc2V0X3RvcG9sb2d5X3N0YXRzKCkpIHsKKyAgICAgIGxhc3RDb21wYXJpc29uID0gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29tcGFyZVRvKHRoaXMudG9wb2xvZ3lfc3RhdHMsIG90aGVyLnRvcG9sb2d5X3N0YXRzKTsKKyAgICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICAgIH0KKyAgICB9CisgICAgbGFzdENvbXBhcmlzb24gPSBCb29sZWFuLnZhbHVlT2YoaXNfc2V0X293bmVyKCkpLmNvbXBhcmVUbyhvdGhlci5pc19zZXRfb3duZXIoKSk7CisgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICB9CisgICAgaWYgKGlzX3NldF9vd25lcigpKSB7CisgICAgICBsYXN0Q29tcGFyaXNvbiA9IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvbXBhcmVUbyh0aGlzLm93bmVyLCBvdGhlci5vd25lcik7CisgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICB9CisgICAgfQorICAgIGxhc3RDb21wYXJpc29uID0gQm9vbGVhbi52YWx1ZU9mKGlzX3NldF9kZWJ1Z19vcHRpb25zKCkpLmNvbXBhcmVUbyhvdGhlci5pc19zZXRfZGVidWdfb3B0aW9ucygpKTsKKyAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgIH0KKyAgICBpZiAoaXNfc2V0X2RlYnVnX29wdGlvbnMoKSkgeworICAgICAgbGFzdENvbXBhcmlzb24gPSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy5kZWJ1Z19vcHRpb25zLCBvdGhlci5kZWJ1Z19vcHRpb25zKTsKKyAgICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICAgIH0KKyAgICB9CisgICAgbGFzdENvbXBhcmlzb24gPSBCb29sZWFuLnZhbHVlT2YoaXNfc2V0X3JlcGxpY2F0aW9uX2NvdW50KCkpLmNvbXBhcmVUbyhvdGhlci5pc19zZXRfcmVwbGljYXRpb25fY291bnQoKSk7CisgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICB9CisgICAgaWYgKGlzX3NldF9yZXBsaWNhdGlvbl9jb3VudCgpKSB7CisgICAgICBsYXN0Q29tcGFyaXNvbiA9IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvbXBhcmVUbyh0aGlzLnJlcGxpY2F0aW9uX2NvdW50LCBvdGhlci5yZXBsaWNhdGlvbl9jb3VudCk7CisgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICB9CisgICAgfQorICAgIGxhc3RDb21wYXJpc29uID0gQm9vbGVhbi52YWx1ZU9mKGlzX3NldF9yZXF1ZXN0ZWRfbWVtb25oZWFwKCkpLmNvbXBhcmVUbyhvdGhlci5pc19zZXRfcmVxdWVzdGVkX21lbW9uaGVhcCgpKTsKKyAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgIH0KKyAgICBpZiAoaXNfc2V0X3JlcXVlc3RlZF9tZW1vbmhlYXAoKSkgeworICAgICAgbGFzdENvbXBhcmlzb24gPSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy5yZXF1ZXN0ZWRfbWVtb25oZWFwLCBvdGhlci5yZXF1ZXN0ZWRfbWVtb25oZWFwKTsKKyAgICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICAgIH0KKyAgICB9CisgICAgbGFzdENvbXBhcmlzb24gPSBCb29sZWFuLnZhbHVlT2YoaXNfc2V0X3JlcXVlc3RlZF9tZW1vZmZoZWFwKCkpLmNvbXBhcmVUbyhvdGhlci5pc19zZXRfcmVxdWVzdGVkX21lbW9mZmhlYXAoKSk7CisgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICB9CisgICAgaWYgKGlzX3NldF9yZXF1ZXN0ZWRfbWVtb2ZmaGVhcCgpKSB7CisgICAgICBsYXN0Q29tcGFyaXNvbiA9IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvbXBhcmVUbyh0aGlzLnJlcXVlc3RlZF9tZW1vZmZoZWFwLCBvdGhlci5yZXF1ZXN0ZWRfbWVtb2ZmaGVhcCk7CisgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICB9CisgICAgfQorICAgIGxhc3RDb21wYXJpc29uID0gQm9vbGVhbi52YWx1ZU9mKGlzX3NldF9yZXF1ZXN0ZWRfY3B1KCkpLmNvbXBhcmVUbyhvdGhlci5pc19zZXRfcmVxdWVzdGVkX2NwdSgpKTsKKyAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgIH0KKyAgICBpZiAoaXNfc2V0X3JlcXVlc3RlZF9jcHUoKSkgeworICAgICAgbGFzdENvbXBhcmlzb24gPSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy5yZXF1ZXN0ZWRfY3B1LCBvdGhlci5yZXF1ZXN0ZWRfY3B1KTsKKyAgICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICAgIH0KKyAgICB9CisgICAgbGFzdENvbXBhcmlzb24gPSBCb29sZWFuLnZhbHVlT2YoaXNfc2V0X2Fzc2lnbmVkX21lbW9uaGVhcCgpKS5jb21wYXJlVG8ob3RoZXIuaXNfc2V0X2Fzc2lnbmVkX21lbW9uaGVhcCgpKTsKKyAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgIH0KKyAgICBpZiAoaXNfc2V0X2Fzc2lnbmVkX21lbW9uaGVhcCgpKSB7CisgICAgICBsYXN0Q29tcGFyaXNvbiA9IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvbXBhcmVUbyh0aGlzLmFzc2lnbmVkX21lbW9uaGVhcCwgb3RoZXIuYXNzaWduZWRfbWVtb25oZWFwKTsKKyAgICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICAgIH0KKyAgICB9CisgICAgbGFzdENvbXBhcmlzb24gPSBCb29sZWFuLnZhbHVlT2YoaXNfc2V0X2Fzc2lnbmVkX21lbW9mZmhlYXAoKSkuY29tcGFyZVRvKG90aGVyLmlzX3NldF9hc3NpZ25lZF9tZW1vZmZoZWFwKCkpOworICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgfQorICAgIGlmIChpc19zZXRfYXNzaWduZWRfbWVtb2ZmaGVhcCgpKSB7CisgICAgICBsYXN0Q29tcGFyaXNvbiA9IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvbXBhcmVUbyh0aGlzLmFzc2lnbmVkX21lbW9mZmhlYXAsIG90aGVyLmFzc2lnbmVkX21lbW9mZmhlYXApOworICAgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgICAgfQorICAgIH0KKyAgICBsYXN0Q29tcGFyaXNvbiA9IEJvb2xlYW4udmFsdWVPZihpc19zZXRfYXNzaWduZWRfY3B1KCkpLmNvbXBhcmVUbyhvdGhlci5pc19zZXRfYXNzaWduZWRfY3B1KCkpOworICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgfQorICAgIGlmIChpc19zZXRfYXNzaWduZWRfY3B1KCkpIHsKKyAgICAgIGxhc3RDb21wYXJpc29uID0gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29tcGFyZVRvKHRoaXMuYXNzaWduZWRfY3B1LCBvdGhlci5hc3NpZ25lZF9jcHUpOworICAgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHB1YmxpYyBfRmllbGRzIGZpZWxkRm9ySWQoaW50IGZpZWxkSWQpIHsKKyAgICByZXR1cm4gX0ZpZWxkcy5maW5kQnlUaHJpZnRJZChmaWVsZElkKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHJlYWQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIGlwcm90KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgc2NoZW1lcy5nZXQoaXByb3QuZ2V0U2NoZW1lKCkpLmdldFNjaGVtZSgpLnJlYWQoaXByb3QsIHRoaXMpOworICB9CisKKyAgcHVibGljIHZvaWQgd3JpdGUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIG9wcm90KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgc2NoZW1lcy5nZXQob3Byb3QuZ2V0U2NoZW1lKCkpLmdldFNjaGVtZSgpLndyaXRlKG9wcm90LCB0aGlzKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigiVG9wb2xvZ3lQYWdlSW5mbygiKTsKKyAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKKworICAgIHNiLmFwcGVuZCgiaWQ6Iik7CisgICAgaWYgKHRoaXMuaWQgPT0gbnVsbCkgeworICAgICAgc2IuYXBwZW5kKCJudWxsIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHNiLmFwcGVuZCh0aGlzLmlkKTsKKyAgICB9CisgICAgZmlyc3QgPSBmYWxzZTsKKyAgICBpZiAoaXNfc2V0X25hbWUoKSkgeworICAgICAgaWYgKCFmaXJzdCkgc2IuYXBwZW5kKCIsICIpOworICAgICAgc2IuYXBwZW5kKCJuYW1lOiIpOworICAgICAgaWYgKHRoaXMubmFtZSA9PSBudWxsKSB7CisgICAgICAgIHNiLmFwcGVuZCgibnVsbCIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2IuYXBwZW5kKHRoaXMubmFtZSk7CisgICAgICB9CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0KKyAgICBpZiAoaXNfc2V0X3VwdGltZV9zZWNzKCkpIHsKKyAgICAgIGlmICghZmlyc3QpIHNiLmFwcGVuZCgiLCAiKTsKKyAgICAgIHNiLmFwcGVuZCgidXB0aW1lX3NlY3M6Iik7CisgICAgICBzYi5hcHBlbmQodGhpcy51cHRpbWVfc2Vjcyk7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0KKyAgICBpZiAoaXNfc2V0X3N0YXR1cygpKSB7CisgICAgICBpZiAoIWZpcnN0KSBzYi5hcHBlbmQoIiwgIik7CisgICAgICBzYi5hcHBlbmQoInN0YXR1czoiKTsKKyAgICAgIGlmICh0aGlzLnN0YXR1cyA9PSBudWxsKSB7CisgICAgICAgIHNiLmFwcGVuZCgibnVsbCIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2IuYXBwZW5kKHRoaXMuc3RhdHVzKTsKKyAgICAgIH0KKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfQorICAgIGlmIChpc19zZXRfbnVtX3Rhc2tzKCkpIHsKKyAgICAgIGlmICghZmlyc3QpIHNiLmFwcGVuZCgiLCAiKTsKKyAgICAgIHNiLmFwcGVuZCgibnVtX3Rhc2tzOiIpOworICAgICAgc2IuYXBwZW5kKHRoaXMubnVtX3Rhc2tzKTsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfQorICAgIGlmIChpc19zZXRfbnVtX3dvcmtlcnMoKSkgeworICAgICAgaWYgKCFmaXJzdCkgc2IuYXBwZW5kKCIsICIpOworICAgICAgc2IuYXBwZW5kKCJudW1fd29ya2VyczoiKTsKKyAgICAgIHNiLmFwcGVuZCh0aGlzLm51bV93b3JrZXJzKTsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfQorICAgIGlmIChpc19zZXRfbnVtX2V4ZWN1dG9ycygpKSB7CisgICAgICBpZiAoIWZpcnN0KSBzYi5hcHBlbmQoIiwgIik7CisgICAgICBzYi5hcHBlbmQoIm51bV9leGVjdXRvcnM6Iik7CisgICAgICBzYi5hcHBlbmQodGhpcy5udW1fZXhlY3V0b3JzKTsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfQorICAgIGlmIChpc19zZXRfdG9wb2xvZ3lfY29uZigpKSB7CisgICAgICBpZiAoIWZpcnN0KSBzYi5hcHBlbmQoIiwgIik7CisgICAgICBzYi5hcHBlbmQoInRvcG9sb2d5X2NvbmY6Iik7CisgICAgICBpZiAodGhpcy50b3BvbG9neV9jb25mID09IG51bGwpIHsKKyAgICAgICAgc2IuYXBwZW5kKCJudWxsIik7CisgICAgICB9IGVsc2UgeworICAgICAgICBzYi5hcHBlbmQodGhpcy50b3BvbG9neV9jb25mKTsKKyAgICAgIH0KKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfQorICAgIGlmIChpc19zZXRfaWRfdG9fc3BvdXRfYWdnX3N0YXRzKCkpIHsKKyAgICAgIGlmICghZmlyc3QpIHNiLmFwcGVuZCgiLCAiKTsKKyAgICAgIHNiLmFwcGVuZCgiaWRfdG9fc3BvdXRfYWdnX3N0YXRzOiIpOworICAgICAgaWYgKHRoaXMuaWRfdG9fc3BvdXRfYWdnX3N0YXRzID09IG51bGwpIHsKKyAgICAgICAgc2IuYXBwZW5kKCJudWxsIik7CisgICAgICB9IGVsc2UgeworICAgICAgICBzYi5hcHBlbmQodGhpcy5pZF90b19zcG91dF9hZ2dfc3RhdHMpOworICAgICAgfQorICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9CisgICAgaWYgKGlzX3NldF9pZF90b19ib2x0X2FnZ19zdGF0cygpKSB7CisgICAgICBpZiAoIWZpcnN0KSBzYi5hcHBlbmQoIiwgIik7CisgICAgICBzYi5hcHBlbmQoImlkX3RvX2JvbHRfYWdnX3N0YXRzOiIpOworICAgICAgaWYgKHRoaXMuaWRfdG9fYm9sdF9hZ2dfc3RhdHMgPT0gbnVsbCkgeworICAgICAgICBzYi5hcHBlbmQoIm51bGwiKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNiLmFwcGVuZCh0aGlzLmlkX3RvX2JvbHRfYWdnX3N0YXRzKTsKKyAgICAgIH0KKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfQorICAgIGlmIChpc19zZXRfc2NoZWRfc3RhdHVzKCkpIHsKKyAgICAgIGlmICghZmlyc3QpIHNiLmFwcGVuZCgiLCAiKTsKKyAgICAgIHNiLmFwcGVuZCgic2NoZWRfc3RhdHVzOiIpOworICAgICAgaWYgKHRoaXMuc2NoZWRfc3RhdHVzID09IG51bGwpIHsKKyAgICAgICAgc2IuYXBwZW5kKCJudWxsIik7CisgICAgICB9IGVsc2UgeworICAgICAgICBzYi5hcHBlbmQodGhpcy5zY2hlZF9zdGF0dXMpOworICAgICAgfQorICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9CisgICAgaWYgKGlzX3NldF90b3BvbG9neV9zdGF0cygpKSB7CisgICAgICBpZiAoIWZpcnN0KSBzYi5hcHBlbmQoIiwgIik7CisgICAgICBzYi5hcHBlbmQoInRvcG9sb2d5X3N0YXRzOiIpOworICAgICAgaWYgKHRoaXMudG9wb2xvZ3lfc3RhdHMgPT0gbnVsbCkgeworICAgICAgICBzYi5hcHBlbmQoIm51bGwiKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNiLmFwcGVuZCh0aGlzLnRvcG9sb2d5X3N0YXRzKTsKKyAgICAgIH0KKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfQorICAgIGlmIChpc19zZXRfb3duZXIoKSkgeworICAgICAgaWYgKCFmaXJzdCkgc2IuYXBwZW5kKCIsICIpOworICAgICAgc2IuYXBwZW5kKCJvd25lcjoiKTsKKyAgICAgIGlmICh0aGlzLm93bmVyID09IG51bGwpIHsKKyAgICAgICAgc2IuYXBwZW5kKCJudWxsIik7CisgICAgICB9IGVsc2UgeworICAgICAgICBzYi5hcHBlbmQodGhpcy5vd25lcik7CisgICAgICB9CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0KKyAgICBpZiAoaXNfc2V0X2RlYnVnX29wdGlvbnMoKSkgeworICAgICAgaWYgKCFmaXJzdCkgc2IuYXBwZW5kKCIsICIpOworICAgICAgc2IuYXBwZW5kKCJkZWJ1Z19vcHRpb25zOiIpOworICAgICAgaWYgKHRoaXMuZGVidWdfb3B0aW9ucyA9PSBudWxsKSB7CisgICAgICAgIHNiLmFwcGVuZCgibnVsbCIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2IuYXBwZW5kKHRoaXMuZGVidWdfb3B0aW9ucyk7CisgICAgICB9CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0KKyAgICBpZiAoaXNfc2V0X3JlcGxpY2F0aW9uX2NvdW50KCkpIHsKKyAgICAgIGlmICghZmlyc3QpIHNiLmFwcGVuZCgiLCAiKTsKKyAgICAgIHNiLmFwcGVuZCgicmVwbGljYXRpb25fY291bnQ6Iik7CisgICAgICBzYi5hcHBlbmQodGhpcy5yZXBsaWNhdGlvbl9jb3VudCk7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0KKyAgICBpZiAoaXNfc2V0X3JlcXVlc3RlZF9tZW1vbmhlYXAoKSkgeworICAgICAgaWYgKCFmaXJzdCkgc2IuYXBwZW5kKCIsICIpOworICAgICAgc2IuYXBwZW5kKCJyZXF1ZXN0ZWRfbWVtb25oZWFwOiIpOworICAgICAgc2IuYXBwZW5kKHRoaXMucmVxdWVzdGVkX21lbW9uaGVhcCk7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0KKyAgICBpZiAoaXNfc2V0X3JlcXVlc3RlZF9tZW1vZmZoZWFwKCkpIHsKKyAgICAgIGlmICghZmlyc3QpIHNiLmFwcGVuZCgiLCAiKTsKKyAgICAgIHNiLmFwcGVuZCgicmVxdWVzdGVkX21lbW9mZmhlYXA6Iik7CisgICAgICBzYi5hcHBlbmQodGhpcy5yZXF1ZXN0ZWRfbWVtb2ZmaGVhcCk7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0KKyAgICBpZiAoaXNfc2V0X3JlcXVlc3RlZF9jcHUoKSkgeworICAgICAgaWYgKCFmaXJzdCkgc2IuYXBwZW5kKCIsICIpOworICAgICAgc2IuYXBwZW5kKCJyZXF1ZXN0ZWRfY3B1OiIpOworICAgICAgc2IuYXBwZW5kKHRoaXMucmVxdWVzdGVkX2NwdSk7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0KKyAgICBpZiAoaXNfc2V0X2Fzc2lnbmVkX21lbW9uaGVhcCgpKSB7CisgICAgICBpZiAoIWZpcnN0KSBzYi5hcHBlbmQoIiwgIik7CisgICAgICBzYi5hcHBlbmQoImFzc2lnbmVkX21lbW9uaGVhcDoiKTsKKyAgICAgIHNiLmFwcGVuZCh0aGlzLmFzc2lnbmVkX21lbW9uaGVhcCk7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0KKyAgICBpZiAoaXNfc2V0X2Fzc2lnbmVkX21lbW9mZmhlYXAoKSkgeworICAgICAgaWYgKCFmaXJzdCkgc2IuYXBwZW5kKCIsICIpOworICAgICAgc2IuYXBwZW5kKCJhc3NpZ25lZF9tZW1vZmZoZWFwOiIpOworICAgICAgc2IuYXBwZW5kKHRoaXMuYXNzaWduZWRfbWVtb2ZmaGVhcCk7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0KKyAgICBpZiAoaXNfc2V0X2Fzc2lnbmVkX2NwdSgpKSB7CisgICAgICBpZiAoIWZpcnN0KSBzYi5hcHBlbmQoIiwgIik7CisgICAgICBzYi5hcHBlbmQoImFzc2lnbmVkX2NwdToiKTsKKyAgICAgIHNiLmFwcGVuZCh0aGlzLmFzc2lnbmVkX2NwdSk7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0KKyAgICBzYi5hcHBlbmQoIikiKTsKKyAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgIC8vIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMKKyAgICBpZiAoIWlzX3NldF9pZCgpKSB7CisgICAgICB0aHJvdyBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sRXhjZXB0aW9uKCJSZXF1aXJlZCBmaWVsZCAnaWQnIGlzIHVuc2V0ISBTdHJ1Y3Q6IiArIHRvU3RyaW5nKCkpOworICAgIH0KKworICAgIC8vIGNoZWNrIGZvciBzdWItc3RydWN0IHZhbGlkaXR5CisgICAgaWYgKHRvcG9sb2d5X3N0YXRzICE9IG51bGwpIHsKKyAgICAgIHRvcG9sb2d5X3N0YXRzLnZhbGlkYXRlKCk7CisgICAgfQorICAgIGlmIChkZWJ1Z19vcHRpb25zICE9IG51bGwpIHsKKyAgICAgIGRlYnVnX29wdGlvbnMudmFsaWRhdGUoKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIHdyaXRlKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UQ29tcGFjdFByb3RvY29sKG5ldyBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVElPU3RyZWFtVHJhbnNwb3J0KG91dCkpKTsKKyAgICB9IGNhdGNoIChvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHRlKSB7CisgICAgICB0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbih0ZSk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBpbikgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICAvLyBpdCBkb2Vzbid0IHNlZW0gbGlrZSB5b3Ugc2hvdWxkIGhhdmUgdG8gZG8gdGhpcywgYnV0IGphdmEgc2VyaWFsaXphdGlvbiBpcyB3YWNreSwgYW5kIGRvZXNuJ3QgY2FsbCB0aGUgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICAgIF9faXNzZXRfYml0ZmllbGQgPSAwOworICAgICAgcmVhZChuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbChuZXcgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRJT1N0cmVhbVRyYW5zcG9ydChpbikpKTsKKyAgICB9IGNhdGNoIChvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHRlKSB7CisgICAgICB0aHJvdyBuZXcgamF2YS5pby5JT0V4Y2VwdGlvbih0ZSk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVG9wb2xvZ3lQYWdlSW5mb1N0YW5kYXJkU2NoZW1lRmFjdG9yeSBpbXBsZW1lbnRzIFNjaGVtZUZhY3RvcnkgeworICAgIHB1YmxpYyBUb3BvbG9neVBhZ2VJbmZvU3RhbmRhcmRTY2hlbWUgZ2V0U2NoZW1lKCkgeworICAgICAgcmV0dXJuIG5ldyBUb3BvbG9neVBhZ2VJbmZvU3RhbmRhcmRTY2hlbWUoKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUb3BvbG9neVBhZ2VJbmZvU3RhbmRhcmRTY2hlbWUgZXh0ZW5kcyBTdGFuZGFyZFNjaGVtZTxUb3BvbG9neVBhZ2VJbmZvPiB7CisKKyAgICBwdWJsaWMgdm9pZCByZWFkKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBpcHJvdCwgVG9wb2xvZ3lQYWdlSW5mbyBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBzY2hlbWVGaWVsZDsKKyAgICAgIGlwcm90LnJlYWRTdHJ1Y3RCZWdpbigpOworICAgICAgd2hpbGUgKHRydWUpCisgICAgICB7CisgICAgICAgIHNjaGVtZUZpZWxkID0gaXByb3QucmVhZEZpZWxkQmVnaW4oKTsKKyAgICAgICAgaWYgKHNjaGVtZUZpZWxkLnR5cGUgPT0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RPUCkgeyAKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKHNjaGVtZUZpZWxkLmlkKSB7CisgICAgICAgICAgY2FzZSAxOiAvLyBJRAorICAgICAgICAgICAgaWYgKHNjaGVtZUZpZWxkLnR5cGUgPT0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HKSB7CisgICAgICAgICAgICAgIHN0cnVjdC5pZCA9IGlwcm90LnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgICAgc3RydWN0LnNldF9pZF9pc1NldCh0cnVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7IAorICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAyOiAvLyBOQU1FCisgICAgICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcpIHsKKyAgICAgICAgICAgICAgc3RydWN0Lm5hbWUgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICAgIHN0cnVjdC5zZXRfbmFtZV9pc1NldCh0cnVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7IAorICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAzOiAvLyBVUFRJTUVfU0VDUworICAgICAgICAgICAgaWYgKHNjaGVtZUZpZWxkLnR5cGUgPT0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTMyKSB7CisgICAgICAgICAgICAgIHN0cnVjdC51cHRpbWVfc2VjcyA9IGlwcm90LnJlYWRJMzIoKTsKKyAgICAgICAgICAgICAgc3RydWN0LnNldF91cHRpbWVfc2Vjc19pc1NldCh0cnVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7IAorICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSA0OiAvLyBTVEFUVVMKKyAgICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORykgeworICAgICAgICAgICAgICBzdHJ1Y3Quc3RhdHVzID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICAgICAgICBzdHJ1Y3Quc2V0X3N0YXR1c19pc1NldCh0cnVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7IAorICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSA1OiAvLyBOVU1fVEFTS1MKKyAgICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkkzMikgeworICAgICAgICAgICAgICBzdHJ1Y3QubnVtX3Rhc2tzID0gaXByb3QucmVhZEkzMigpOworICAgICAgICAgICAgICBzdHJ1Y3Quc2V0X251bV90YXNrc19pc1NldCh0cnVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7IAorICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSA2OiAvLyBOVU1fV09SS0VSUworICAgICAgICAgICAgaWYgKHNjaGVtZUZpZWxkLnR5cGUgPT0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTMyKSB7CisgICAgICAgICAgICAgIHN0cnVjdC5udW1fd29ya2VycyA9IGlwcm90LnJlYWRJMzIoKTsKKyAgICAgICAgICAgICAgc3RydWN0LnNldF9udW1fd29ya2Vyc19pc1NldCh0cnVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7IAorICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSA3OiAvLyBOVU1fRVhFQ1VUT1JTCisgICAgICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JMzIpIHsKKyAgICAgICAgICAgICAgc3RydWN0Lm51bV9leGVjdXRvcnMgPSBpcHJvdC5yZWFkSTMyKCk7CisgICAgICAgICAgICAgIHN0cnVjdC5zZXRfbnVtX2V4ZWN1dG9yc19pc1NldCh0cnVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7IAorICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSA4OiAvLyBUT1BPTE9HWV9DT05GCisgICAgICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcpIHsKKyAgICAgICAgICAgICAgc3RydWN0LnRvcG9sb2d5X2NvbmYgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICAgIHN0cnVjdC5zZXRfdG9wb2xvZ3lfY29uZl9pc1NldCh0cnVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7IAorICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSA5OiAvLyBJRF9UT19TUE9VVF9BR0dfU1RBVFMKKyAgICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLk1BUCkgeworICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwNDAyID0gaXByb3QucmVhZE1hcEJlZ2luKCk7CisgICAgICAgICAgICAgICAgc3RydWN0LmlkX3RvX3Nwb3V0X2FnZ19zdGF0cyA9IG5ldyBIYXNoTWFwPFN0cmluZyxDb21wb25lbnRBZ2dyZWdhdGVTdGF0cz4oMipfbWFwNDAyLnNpemUpOworICAgICAgICAgICAgICAgIFN0cmluZyBfa2V5NDAzOworICAgICAgICAgICAgICAgIENvbXBvbmVudEFnZ3JlZ2F0ZVN0YXRzIF92YWw0MDQ7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgX2k0MDUgPSAwOyBfaTQwNSA8IF9tYXA0MDIuc2l6ZTsgKytfaTQwNSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBfa2V5NDAzID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICAgICAgICAgICAgX3ZhbDQwNCA9IG5ldyBDb21wb25lbnRBZ2dyZWdhdGVTdGF0cygpOworICAgICAgICAgICAgICAgICAgX3ZhbDQwNC5yZWFkKGlwcm90KTsKKyAgICAgICAgICAgICAgICAgIHN0cnVjdC5pZF90b19zcG91dF9hZ2dfc3RhdHMucHV0KF9rZXk0MDMsIF92YWw0MDQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpcHJvdC5yZWFkTWFwRW5kKCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgc3RydWN0LnNldF9pZF90b19zcG91dF9hZ2dfc3RhdHNfaXNTZXQodHJ1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeyAKKyAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMTA6IC8vIElEX1RPX0JPTFRfQUdHX1NUQVRTCisgICAgICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5NQVApIHsKKyAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgX21hcDQwNiA9IGlwcm90LnJlYWRNYXBCZWdpbigpOworICAgICAgICAgICAgICAgIHN0cnVjdC5pZF90b19ib2x0X2FnZ19zdGF0cyA9IG5ldyBIYXNoTWFwPFN0cmluZyxDb21wb25lbnRBZ2dyZWdhdGVTdGF0cz4oMipfbWFwNDA2LnNpemUpOworICAgICAgICAgICAgICAgIFN0cmluZyBfa2V5NDA3OworICAgICAgICAgICAgICAgIENvbXBvbmVudEFnZ3JlZ2F0ZVN0YXRzIF92YWw0MDg7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgX2k0MDkgPSAwOyBfaTQwOSA8IF9tYXA0MDYuc2l6ZTsgKytfaTQwOSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBfa2V5NDA3ID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICAgICAgICAgICAgX3ZhbDQwOCA9IG5ldyBDb21wb25lbnRBZ2dyZWdhdGVTdGF0cygpOworICAgICAgICAgICAgICAgICAgX3ZhbDQwOC5yZWFkKGlwcm90KTsKKyAgICAgICAgICAgICAgICAgIHN0cnVjdC5pZF90b19ib2x0X2FnZ19zdGF0cy5wdXQoX2tleTQwNywgX3ZhbDQwOCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlwcm90LnJlYWRNYXBFbmQoKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBzdHJ1Y3Quc2V0X2lkX3RvX2JvbHRfYWdnX3N0YXRzX2lzU2V0KHRydWUpOworICAgICAgICAgICAgfSBlbHNlIHsgCisgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgc2NoZW1lRmllbGQudHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDExOiAvLyBTQ0hFRF9TVEFUVVMKKyAgICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORykgeworICAgICAgICAgICAgICBzdHJ1Y3Quc2NoZWRfc3RhdHVzID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICAgICAgICBzdHJ1Y3Quc2V0X3NjaGVkX3N0YXR1c19pc1NldCh0cnVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7IAorICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSAxMjogLy8gVE9QT0xPR1lfU1RBVFMKKyAgICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCkgeworICAgICAgICAgICAgICBzdHJ1Y3QudG9wb2xvZ3lfc3RhdHMgPSBuZXcgVG9wb2xvZ3lTdGF0cygpOworICAgICAgICAgICAgICBzdHJ1Y3QudG9wb2xvZ3lfc3RhdHMucmVhZChpcHJvdCk7CisgICAgICAgICAgICAgIHN0cnVjdC5zZXRfdG9wb2xvZ3lfc3RhdHNfaXNTZXQodHJ1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeyAKKyAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMTM6IC8vIE9XTkVSCisgICAgICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcpIHsKKyAgICAgICAgICAgICAgc3RydWN0Lm93bmVyID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICAgICAgICBzdHJ1Y3Quc2V0X293bmVyX2lzU2V0KHRydWUpOworICAgICAgICAgICAgfSBlbHNlIHsgCisgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgc2NoZW1lRmllbGQudHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDE0OiAvLyBERUJVR19PUFRJT05TCisgICAgICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QpIHsKKyAgICAgICAgICAgICAgc3RydWN0LmRlYnVnX29wdGlvbnMgPSBuZXcgRGVidWdPcHRpb25zKCk7CisgICAgICAgICAgICAgIHN0cnVjdC5kZWJ1Z19vcHRpb25zLnJlYWQoaXByb3QpOworICAgICAgICAgICAgICBzdHJ1Y3Quc2V0X2RlYnVnX29wdGlvbnNfaXNTZXQodHJ1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeyAKKyAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMTU6IC8vIFJFUExJQ0FUSU9OX0NPVU5UCisgICAgICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JMzIpIHsKKyAgICAgICAgICAgICAgc3RydWN0LnJlcGxpY2F0aW9uX2NvdW50ID0gaXByb3QucmVhZEkzMigpOworICAgICAgICAgICAgICBzdHJ1Y3Quc2V0X3JlcGxpY2F0aW9uX2NvdW50X2lzU2V0KHRydWUpOworICAgICAgICAgICAgfSBlbHNlIHsgCisgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgc2NoZW1lRmllbGQudHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDUyMTogLy8gUkVRVUVTVEVEX01FTU9OSEVBUAorICAgICAgICAgICAgaWYgKHNjaGVtZUZpZWxkLnR5cGUgPT0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuRE9VQkxFKSB7CisgICAgICAgICAgICAgIHN0cnVjdC5yZXF1ZXN0ZWRfbWVtb25oZWFwID0gaXByb3QucmVhZERvdWJsZSgpOworICAgICAgICAgICAgICBzdHJ1Y3Quc2V0X3JlcXVlc3RlZF9tZW1vbmhlYXBfaXNTZXQodHJ1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeyAKKyAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgNTIyOiAvLyBSRVFVRVNURURfTUVNT0ZGSEVBUAorICAgICAgICAgICAgaWYgKHNjaGVtZUZpZWxkLnR5cGUgPT0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuRE9VQkxFKSB7CisgICAgICAgICAgICAgIHN0cnVjdC5yZXF1ZXN0ZWRfbWVtb2ZmaGVhcCA9IGlwcm90LnJlYWREb3VibGUoKTsKKyAgICAgICAgICAgICAgc3RydWN0LnNldF9yZXF1ZXN0ZWRfbWVtb2ZmaGVhcF9pc1NldCh0cnVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7IAorICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSA1MjM6IC8vIFJFUVVFU1RFRF9DUFUKKyAgICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkRPVUJMRSkgeworICAgICAgICAgICAgICBzdHJ1Y3QucmVxdWVzdGVkX2NwdSA9IGlwcm90LnJlYWREb3VibGUoKTsKKyAgICAgICAgICAgICAgc3RydWN0LnNldF9yZXF1ZXN0ZWRfY3B1X2lzU2V0KHRydWUpOworICAgICAgICAgICAgfSBlbHNlIHsgCisgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgc2NoZW1lRmllbGQudHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDUyNDogLy8gQVNTSUdORURfTUVNT05IRUFQCisgICAgICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5ET1VCTEUpIHsKKyAgICAgICAgICAgICAgc3RydWN0LmFzc2lnbmVkX21lbW9uaGVhcCA9IGlwcm90LnJlYWREb3VibGUoKTsKKyAgICAgICAgICAgICAgc3RydWN0LnNldF9hc3NpZ25lZF9tZW1vbmhlYXBfaXNTZXQodHJ1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeyAKKyAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgNTI1OiAvLyBBU1NJR05FRF9NRU1PRkZIRUFQCisgICAgICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5ET1VCTEUpIHsKKyAgICAgICAgICAgICAgc3RydWN0LmFzc2lnbmVkX21lbW9mZmhlYXAgPSBpcHJvdC5yZWFkRG91YmxlKCk7CisgICAgICAgICAgICAgIHN0cnVjdC5zZXRfYXNzaWduZWRfbWVtb2ZmaGVhcF9pc1NldCh0cnVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7IAorICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSA1MjY6IC8vIEFTU0lHTkVEX0NQVQorICAgICAgICAgICAgaWYgKHNjaGVtZUZpZWxkLnR5cGUgPT0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuRE9VQkxFKSB7CisgICAgICAgICAgICAgIHN0cnVjdC5hc3NpZ25lZF9jcHUgPSBpcHJvdC5yZWFkRG91YmxlKCk7CisgICAgICAgICAgICAgIHN0cnVjdC5zZXRfYXNzaWduZWRfY3B1X2lzU2V0KHRydWUpOworICAgICAgICAgICAgfSBlbHNlIHsgCisgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgc2NoZW1lRmllbGQudHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKKyAgICAgICAgfQorICAgICAgICBpcHJvdC5yZWFkRmllbGRFbmQoKTsKKyAgICAgIH0KKyAgICAgIGlwcm90LnJlYWRTdHJ1Y3RFbmQoKTsKKyAgICAgIHN0cnVjdC52YWxpZGF0ZSgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdyaXRlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBvcHJvdCwgVG9wb2xvZ3lQYWdlSW5mbyBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgIHN0cnVjdC52YWxpZGF0ZSgpOworCisgICAgICBvcHJvdC53cml0ZVN0cnVjdEJlZ2luKFNUUlVDVF9ERVNDKTsKKyAgICAgIGlmIChzdHJ1Y3QuaWQgIT0gbnVsbCkgeworICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oSURfRklFTERfREVTQyk7CisgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKHN0cnVjdC5pZCk7CisgICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QubmFtZSAhPSBudWxsKSB7CisgICAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X25hbWUoKSkgeworICAgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihOQU1FX0ZJRUxEX0RFU0MpOworICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKHN0cnVjdC5uYW1lKTsKKyAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X3VwdGltZV9zZWNzKCkpIHsKKyAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKFVQVElNRV9TRUNTX0ZJRUxEX0RFU0MpOworICAgICAgICBvcHJvdC53cml0ZUkzMihzdHJ1Y3QudXB0aW1lX3NlY3MpOworICAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LnN0YXR1cyAhPSBudWxsKSB7CisgICAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X3N0YXR1cygpKSB7CisgICAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKFNUQVRVU19GSUVMRF9ERVNDKTsKKyAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhzdHJ1Y3Quc3RhdHVzKTsKKyAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X251bV90YXNrcygpKSB7CisgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihOVU1fVEFTS1NfRklFTERfREVTQyk7CisgICAgICAgIG9wcm90LndyaXRlSTMyKHN0cnVjdC5udW1fdGFza3MpOworICAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9udW1fd29ya2VycygpKSB7CisgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihOVU1fV09SS0VSU19GSUVMRF9ERVNDKTsKKyAgICAgICAgb3Byb3Qud3JpdGVJMzIoc3RydWN0Lm51bV93b3JrZXJzKTsKKyAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5pc19zZXRfbnVtX2V4ZWN1dG9ycygpKSB7CisgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihOVU1fRVhFQ1VUT1JTX0ZJRUxEX0RFU0MpOworICAgICAgICBvcHJvdC53cml0ZUkzMihzdHJ1Y3QubnVtX2V4ZWN1dG9ycyk7CisgICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QudG9wb2xvZ3lfY29uZiAhPSBudWxsKSB7CisgICAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X3RvcG9sb2d5X2NvbmYoKSkgeworICAgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihUT1BPTE9HWV9DT05GX0ZJRUxEX0RFU0MpOworICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKHN0cnVjdC50b3BvbG9neV9jb25mKTsKKyAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuaWRfdG9fc3BvdXRfYWdnX3N0YXRzICE9IG51bGwpIHsKKyAgICAgICAgaWYgKHN0cnVjdC5pc19zZXRfaWRfdG9fc3BvdXRfYWdnX3N0YXRzKCkpIHsKKyAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oSURfVE9fU1BPVVRfQUdHX1NUQVRTX0ZJRUxEX0RFU0MpOworICAgICAgICAgIHsKKyAgICAgICAgICAgIG9wcm90LndyaXRlTWFwQmVnaW4obmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJVQ1QsIHN0cnVjdC5pZF90b19zcG91dF9hZ2dfc3RhdHMuc2l6ZSgpKSk7CisgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIENvbXBvbmVudEFnZ3JlZ2F0ZVN0YXRzPiBfaXRlcjQxMCA6IHN0cnVjdC5pZF90b19zcG91dF9hZ2dfc3RhdHMuZW50cnlTZXQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoX2l0ZXI0MTAuZ2V0S2V5KCkpOworICAgICAgICAgICAgICBfaXRlcjQxMC5nZXRWYWx1ZSgpLndyaXRlKG9wcm90KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9wcm90LndyaXRlTWFwRW5kKCk7CisgICAgICAgICAgfQorICAgICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5pZF90b19ib2x0X2FnZ19zdGF0cyAhPSBudWxsKSB7CisgICAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X2lkX3RvX2JvbHRfYWdnX3N0YXRzKCkpIHsKKyAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oSURfVE9fQk9MVF9BR0dfU1RBVFNfRklFTERfREVTQyk7CisgICAgICAgICAgeworICAgICAgICAgICAgb3Byb3Qud3JpdGVNYXBCZWdpbihuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCwgc3RydWN0LmlkX3RvX2JvbHRfYWdnX3N0YXRzLnNpemUoKSkpOworICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBDb21wb25lbnRBZ2dyZWdhdGVTdGF0cz4gX2l0ZXI0MTEgOiBzdHJ1Y3QuaWRfdG9fYm9sdF9hZ2dfc3RhdHMuZW50cnlTZXQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoX2l0ZXI0MTEuZ2V0S2V5KCkpOworICAgICAgICAgICAgICBfaXRlcjQxMS5nZXRWYWx1ZSgpLndyaXRlKG9wcm90KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9wcm90LndyaXRlTWFwRW5kKCk7CisgICAgICAgICAgfQorICAgICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5zY2hlZF9zdGF0dXMgIT0gbnVsbCkgeworICAgICAgICBpZiAoc3RydWN0LmlzX3NldF9zY2hlZF9zdGF0dXMoKSkgeworICAgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihTQ0hFRF9TVEFUVVNfRklFTERfREVTQyk7CisgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoc3RydWN0LnNjaGVkX3N0YXR1cyk7CisgICAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LnRvcG9sb2d5X3N0YXRzICE9IG51bGwpIHsKKyAgICAgICAgaWYgKHN0cnVjdC5pc19zZXRfdG9wb2xvZ3lfc3RhdHMoKSkgeworICAgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihUT1BPTE9HWV9TVEFUU19GSUVMRF9ERVNDKTsKKyAgICAgICAgICBzdHJ1Y3QudG9wb2xvZ3lfc3RhdHMud3JpdGUob3Byb3QpOworICAgICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5vd25lciAhPSBudWxsKSB7CisgICAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X293bmVyKCkpIHsKKyAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oT1dORVJfRklFTERfREVTQyk7CisgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoc3RydWN0Lm93bmVyKTsKKyAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuZGVidWdfb3B0aW9ucyAhPSBudWxsKSB7CisgICAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X2RlYnVnX29wdGlvbnMoKSkgeworICAgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihERUJVR19PUFRJT05TX0ZJRUxEX0RFU0MpOworICAgICAgICAgIHN0cnVjdC5kZWJ1Z19vcHRpb25zLndyaXRlKG9wcm90KTsKKyAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X3JlcGxpY2F0aW9uX2NvdW50KCkpIHsKKyAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKFJFUExJQ0FUSU9OX0NPVU5UX0ZJRUxEX0RFU0MpOworICAgICAgICBvcHJvdC53cml0ZUkzMihzdHJ1Y3QucmVwbGljYXRpb25fY291bnQpOworICAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9yZXF1ZXN0ZWRfbWVtb25oZWFwKCkpIHsKKyAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKFJFUVVFU1RFRF9NRU1PTkhFQVBfRklFTERfREVTQyk7CisgICAgICAgIG9wcm90LndyaXRlRG91YmxlKHN0cnVjdC5yZXF1ZXN0ZWRfbWVtb25oZWFwKTsKKyAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5pc19zZXRfcmVxdWVzdGVkX21lbW9mZmhlYXAoKSkgeworICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oUkVRVUVTVEVEX01FTU9GRkhFQVBfRklFTERfREVTQyk7CisgICAgICAgIG9wcm90LndyaXRlRG91YmxlKHN0cnVjdC5yZXF1ZXN0ZWRfbWVtb2ZmaGVhcCk7CisgICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X3JlcXVlc3RlZF9jcHUoKSkgeworICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oUkVRVUVTVEVEX0NQVV9GSUVMRF9ERVNDKTsKKyAgICAgICAgb3Byb3Qud3JpdGVEb3VibGUoc3RydWN0LnJlcXVlc3RlZF9jcHUpOworICAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9hc3NpZ25lZF9tZW1vbmhlYXAoKSkgeworICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oQVNTSUdORURfTUVNT05IRUFQX0ZJRUxEX0RFU0MpOworICAgICAgICBvcHJvdC53cml0ZURvdWJsZShzdHJ1Y3QuYXNzaWduZWRfbWVtb25oZWFwKTsKKyAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5pc19zZXRfYXNzaWduZWRfbWVtb2ZmaGVhcCgpKSB7CisgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihBU1NJR05FRF9NRU1PRkZIRUFQX0ZJRUxEX0RFU0MpOworICAgICAgICBvcHJvdC53cml0ZURvdWJsZShzdHJ1Y3QuYXNzaWduZWRfbWVtb2ZmaGVhcCk7CisgICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X2Fzc2lnbmVkX2NwdSgpKSB7CisgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihBU1NJR05FRF9DUFVfRklFTERfREVTQyk7CisgICAgICAgIG9wcm90LndyaXRlRG91YmxlKHN0cnVjdC5hc3NpZ25lZF9jcHUpOworICAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgICB9CisgICAgICBvcHJvdC53cml0ZUZpZWxkU3RvcCgpOworICAgICAgb3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsKKyAgICB9CisKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRvcG9sb2d5UGFnZUluZm9UdXBsZVNjaGVtZUZhY3RvcnkgaW1wbGVtZW50cyBTY2hlbWVGYWN0b3J5IHsKKyAgICBwdWJsaWMgVG9wb2xvZ3lQYWdlSW5mb1R1cGxlU2NoZW1lIGdldFNjaGVtZSgpIHsKKyAgICAgIHJldHVybiBuZXcgVG9wb2xvZ3lQYWdlSW5mb1R1cGxlU2NoZW1lKCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVG9wb2xvZ3lQYWdlSW5mb1R1cGxlU2NoZW1lIGV4dGVuZHMgVHVwbGVTY2hlbWU8VG9wb2xvZ3lQYWdlSW5mbz4geworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIHByb3QsIFRvcG9sb2d5UGFnZUluZm8gc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICBUVHVwbGVQcm90b2NvbCBvcHJvdCA9IChUVHVwbGVQcm90b2NvbCkgcHJvdDsKKyAgICAgIG9wcm90LndyaXRlU3RyaW5nKHN0cnVjdC5pZCk7CisgICAgICBCaXRTZXQgb3B0aW9uYWxzID0gbmV3IEJpdFNldCgpOworICAgICAgaWYgKHN0cnVjdC5pc19zZXRfbmFtZSgpKSB7CisgICAgICAgIG9wdGlvbmFscy5zZXQoMCk7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF91cHRpbWVfc2VjcygpKSB7CisgICAgICAgIG9wdGlvbmFscy5zZXQoMSk7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9zdGF0dXMoKSkgeworICAgICAgICBvcHRpb25hbHMuc2V0KDIpOworICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5pc19zZXRfbnVtX3Rhc2tzKCkpIHsKKyAgICAgICAgb3B0aW9uYWxzLnNldCgzKTsKKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X251bV93b3JrZXJzKCkpIHsKKyAgICAgICAgb3B0aW9uYWxzLnNldCg0KTsKKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X251bV9leGVjdXRvcnMoKSkgeworICAgICAgICBvcHRpb25hbHMuc2V0KDUpOworICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5pc19zZXRfdG9wb2xvZ3lfY29uZigpKSB7CisgICAgICAgIG9wdGlvbmFscy5zZXQoNik7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9pZF90b19zcG91dF9hZ2dfc3RhdHMoKSkgeworICAgICAgICBvcHRpb25hbHMuc2V0KDcpOworICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5pc19zZXRfaWRfdG9fYm9sdF9hZ2dfc3RhdHMoKSkgeworICAgICAgICBvcHRpb25hbHMuc2V0KDgpOworICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5pc19zZXRfc2NoZWRfc3RhdHVzKCkpIHsKKyAgICAgICAgb3B0aW9uYWxzLnNldCg5KTsKKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X3RvcG9sb2d5X3N0YXRzKCkpIHsKKyAgICAgICAgb3B0aW9uYWxzLnNldCgxMCk7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9vd25lcigpKSB7CisgICAgICAgIG9wdGlvbmFscy5zZXQoMTEpOworICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5pc19zZXRfZGVidWdfb3B0aW9ucygpKSB7CisgICAgICAgIG9wdGlvbmFscy5zZXQoMTIpOworICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5pc19zZXRfcmVwbGljYXRpb25fY291bnQoKSkgeworICAgICAgICBvcHRpb25hbHMuc2V0KDEzKTsKKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X3JlcXVlc3RlZF9tZW1vbmhlYXAoKSkgeworICAgICAgICBvcHRpb25hbHMuc2V0KDE0KTsKKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X3JlcXVlc3RlZF9tZW1vZmZoZWFwKCkpIHsKKyAgICAgICAgb3B0aW9uYWxzLnNldCgxNSk7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9yZXF1ZXN0ZWRfY3B1KCkpIHsKKyAgICAgICAgb3B0aW9uYWxzLnNldCgxNik7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9hc3NpZ25lZF9tZW1vbmhlYXAoKSkgeworICAgICAgICBvcHRpb25hbHMuc2V0KDE3KTsKKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X2Fzc2lnbmVkX21lbW9mZmhlYXAoKSkgeworICAgICAgICBvcHRpb25hbHMuc2V0KDE4KTsKKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X2Fzc2lnbmVkX2NwdSgpKSB7CisgICAgICAgIG9wdGlvbmFscy5zZXQoMTkpOworICAgICAgfQorICAgICAgb3Byb3Qud3JpdGVCaXRTZXQob3B0aW9uYWxzLCAyMCk7CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9uYW1lKCkpIHsKKyAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoc3RydWN0Lm5hbWUpOworICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5pc19zZXRfdXB0aW1lX3NlY3MoKSkgeworICAgICAgICBvcHJvdC53cml0ZUkzMihzdHJ1Y3QudXB0aW1lX3NlY3MpOworICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5pc19zZXRfc3RhdHVzKCkpIHsKKyAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoc3RydWN0LnN0YXR1cyk7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9udW1fdGFza3MoKSkgeworICAgICAgICBvcHJvdC53cml0ZUkzMihzdHJ1Y3QubnVtX3Rhc2tzKTsKKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X251bV93b3JrZXJzKCkpIHsKKyAgICAgICAgb3Byb3Qud3JpdGVJMzIoc3RydWN0Lm51bV93b3JrZXJzKTsKKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X251bV9leGVjdXRvcnMoKSkgeworICAgICAgICBvcHJvdC53cml0ZUkzMihzdHJ1Y3QubnVtX2V4ZWN1dG9ycyk7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF90b3BvbG9neV9jb25mKCkpIHsKKyAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoc3RydWN0LnRvcG9sb2d5X2NvbmYpOworICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5pc19zZXRfaWRfdG9fc3BvdXRfYWdnX3N0YXRzKCkpIHsKKyAgICAgICAgeworICAgICAgICAgIG9wcm90LndyaXRlSTMyKHN0cnVjdC5pZF90b19zcG91dF9hZ2dfc3RhdHMuc2l6ZSgpKTsKKyAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIENvbXBvbmVudEFnZ3JlZ2F0ZVN0YXRzPiBfaXRlcjQxMiA6IHN0cnVjdC5pZF90b19zcG91dF9hZ2dfc3RhdHMuZW50cnlTZXQoKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhfaXRlcjQxMi5nZXRLZXkoKSk7CisgICAgICAgICAgICBfaXRlcjQxMi5nZXRWYWx1ZSgpLndyaXRlKG9wcm90KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X2lkX3RvX2JvbHRfYWdnX3N0YXRzKCkpIHsKKyAgICAgICAgeworICAgICAgICAgIG9wcm90LndyaXRlSTMyKHN0cnVjdC5pZF90b19ib2x0X2FnZ19zdGF0cy5zaXplKCkpOworICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgQ29tcG9uZW50QWdncmVnYXRlU3RhdHM+IF9pdGVyNDEzIDogc3RydWN0LmlkX3RvX2JvbHRfYWdnX3N0YXRzLmVudHJ5U2V0KCkpCisgICAgICAgICAgeworICAgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoX2l0ZXI0MTMuZ2V0S2V5KCkpOworICAgICAgICAgICAgX2l0ZXI0MTMuZ2V0VmFsdWUoKS53cml0ZShvcHJvdCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9zY2hlZF9zdGF0dXMoKSkgeworICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhzdHJ1Y3Quc2NoZWRfc3RhdHVzKTsKKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X3RvcG9sb2d5X3N0YXRzKCkpIHsKKyAgICAgICAgc3RydWN0LnRvcG9sb2d5X3N0YXRzLndyaXRlKG9wcm90KTsKKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X293bmVyKCkpIHsKKyAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoc3RydWN0Lm93bmVyKTsKKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X2RlYnVnX29wdGlvbnMoKSkgeworICAgICAgICBzdHJ1Y3QuZGVidWdfb3B0aW9ucy53cml0ZShvcHJvdCk7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9yZXBsaWNhdGlvbl9jb3VudCgpKSB7CisgICAgICAgIG9wcm90LndyaXRlSTMyKHN0cnVjdC5yZXBsaWNhdGlvbl9jb3VudCk7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9yZXF1ZXN0ZWRfbWVtb25oZWFwKCkpIHsKKyAgICAgICAgb3Byb3Qud3JpdGVEb3VibGUoc3RydWN0LnJlcXVlc3RlZF9tZW1vbmhlYXApOworICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5pc19zZXRfcmVxdWVzdGVkX21lbW9mZmhlYXAoKSkgeworICAgICAgICBvcHJvdC53cml0ZURvdWJsZShzdHJ1Y3QucmVxdWVzdGVkX21lbW9mZmhlYXApOworICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5pc19zZXRfcmVxdWVzdGVkX2NwdSgpKSB7CisgICAgICAgIG9wcm90LndyaXRlRG91YmxlKHN0cnVjdC5yZXF1ZXN0ZWRfY3B1KTsKKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X2Fzc2lnbmVkX21lbW9uaGVhcCgpKSB7CisgICAgICAgIG9wcm90LndyaXRlRG91YmxlKHN0cnVjdC5hc3NpZ25lZF9tZW1vbmhlYXApOworICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5pc19zZXRfYXNzaWduZWRfbWVtb2ZmaGVhcCgpKSB7CisgICAgICAgIG9wcm90LndyaXRlRG91YmxlKHN0cnVjdC5hc3NpZ25lZF9tZW1vZmZoZWFwKTsKKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X2Fzc2lnbmVkX2NwdSgpKSB7CisgICAgICAgIG9wcm90LndyaXRlRG91YmxlKHN0cnVjdC5hc3NpZ25lZF9jcHUpOworICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlYWQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIHByb3QsIFRvcG9sb2d5UGFnZUluZm8gc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICBUVHVwbGVQcm90b2NvbCBpcHJvdCA9IChUVHVwbGVQcm90b2NvbCkgcHJvdDsKKyAgICAgIHN0cnVjdC5pZCA9IGlwcm90LnJlYWRTdHJpbmcoKTsKKyAgICAgIHN0cnVjdC5zZXRfaWRfaXNTZXQodHJ1ZSk7CisgICAgICBCaXRTZXQgaW5jb21pbmcgPSBpcHJvdC5yZWFkQml0U2V0KDIwKTsKKyAgICAgIGlmIChpbmNvbWluZy5nZXQoMCkpIHsKKyAgICAgICAgc3RydWN0Lm5hbWUgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgIHN0cnVjdC5zZXRfbmFtZV9pc1NldCh0cnVlKTsKKyAgICAgIH0KKyAgICAgIGlmIChpbmNvbWluZy5nZXQoMSkpIHsKKyAgICAgICAgc3RydWN0LnVwdGltZV9zZWNzID0gaXByb3QucmVhZEkzMigpOworICAgICAgICBzdHJ1Y3Quc2V0X3VwdGltZV9zZWNzX2lzU2V0KHRydWUpOworICAgICAgfQorICAgICAgaWYgKGluY29taW5nLmdldCgyKSkgeworICAgICAgICBzdHJ1Y3Quc3RhdHVzID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICBzdHJ1Y3Quc2V0X3N0YXR1c19pc1NldCh0cnVlKTsKKyAgICAgIH0KKyAgICAgIGlmIChpbmNvbWluZy5nZXQoMykpIHsKKyAgICAgICAgc3RydWN0Lm51bV90YXNrcyA9IGlwcm90LnJlYWRJMzIoKTsKKyAgICAgICAgc3RydWN0LnNldF9udW1fdGFza3NfaXNTZXQodHJ1ZSk7CisgICAgICB9CisgICAgICBpZiAoaW5jb21pbmcuZ2V0KDQpKSB7CisgICAgICAgIHN0cnVjdC5udW1fd29ya2VycyA9IGlwcm90LnJlYWRJMzIoKTsKKyAgICAgICAgc3RydWN0LnNldF9udW1fd29ya2Vyc19pc1NldCh0cnVlKTsKKyAgICAgIH0KKyAgICAgIGlmIChpbmNvbWluZy5nZXQoNSkpIHsKKyAgICAgICAgc3RydWN0Lm51bV9leGVjdXRvcnMgPSBpcHJvdC5yZWFkSTMyKCk7CisgICAgICAgIHN0cnVjdC5zZXRfbnVtX2V4ZWN1dG9yc19pc1NldCh0cnVlKTsKKyAgICAgIH0KKyAgICAgIGlmIChpbmNvbWluZy5nZXQoNikpIHsKKyAgICAgICAgc3RydWN0LnRvcG9sb2d5X2NvbmYgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgIHN0cnVjdC5zZXRfdG9wb2xvZ3lfY29uZl9pc1NldCh0cnVlKTsKKyAgICAgIH0KKyAgICAgIGlmIChpbmNvbWluZy5nZXQoNykpIHsKKyAgICAgICAgeworICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgX21hcDQxNCA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORywgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSVUNULCBpcHJvdC5yZWFkSTMyKCkpOworICAgICAgICAgIHN0cnVjdC5pZF90b19zcG91dF9hZ2dfc3RhdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsQ29tcG9uZW50QWdncmVnYXRlU3RhdHM+KDIqX21hcDQxNC5zaXplKTsKKyAgICAgICAgICBTdHJpbmcgX2tleTQxNTsKKyAgICAgICAgICBDb21wb25lbnRBZ2dyZWdhdGVTdGF0cyBfdmFsNDE2OworICAgICAgICAgIGZvciAoaW50IF9pNDE3ID0gMDsgX2k0MTcgPCBfbWFwNDE0LnNpemU7ICsrX2k0MTcpCisgICAgICAgICAgeworICAgICAgICAgICAgX2tleTQxNSA9IGlwcm90LnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgIF92YWw0MTYgPSBuZXcgQ29tcG9uZW50QWdncmVnYXRlU3RhdHMoKTsKKyAgICAgICAgICAgIF92YWw0MTYucmVhZChpcHJvdCk7CisgICAgICAgICAgICBzdHJ1Y3QuaWRfdG9fc3BvdXRfYWdnX3N0YXRzLnB1dChfa2V5NDE1LCBfdmFsNDE2KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RydWN0LnNldF9pZF90b19zcG91dF9hZ2dfc3RhdHNfaXNTZXQodHJ1ZSk7CisgICAgICB9CisgICAgICBpZiAoaW5jb21pbmcuZ2V0KDgpKSB7CisgICAgICAgIHsKKyAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwIF9tYXA0MTggPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUlVDVCwgaXByb3QucmVhZEkzMigpKTsKKyAgICAgICAgICBzdHJ1Y3QuaWRfdG9fYm9sdF9hZ2dfc3RhdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsQ29tcG9uZW50QWdncmVnYXRlU3RhdHM+KDIqX21hcDQxOC5zaXplKTsKKyAgICAgICAgICBTdHJpbmcgX2tleTQxOTsKKyAgICAgICAgICBDb21wb25lbnRBZ2dyZWdhdGVTdGF0cyBfdmFsNDIwOworICAgICAgICAgIGZvciAoaW50IF9pNDIxID0gMDsgX2k0MjEgPCBfbWFwNDE4LnNpemU7ICsrX2k0MjEpCisgICAgICAgICAgeworICAgICAgICAgICAgX2tleTQxOSA9IGlwcm90LnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgIF92YWw0MjAgPSBuZXcgQ29tcG9uZW50QWdncmVnYXRlU3RhdHMoKTsKKyAgICAgICAgICAgIF92YWw0MjAucmVhZChpcHJvdCk7CisgICAgICAgICAgICBzdHJ1Y3QuaWRfdG9fYm9sdF9hZ2dfc3RhdHMucHV0KF9rZXk0MTksIF92YWw0MjApOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdHJ1Y3Quc2V0X2lkX3RvX2JvbHRfYWdnX3N0YXRzX2lzU2V0KHRydWUpOworICAgICAgfQorICAgICAgaWYgKGluY29taW5nLmdldCg5KSkgeworICAgICAgICBzdHJ1Y3Quc2NoZWRfc3RhdHVzID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICBzdHJ1Y3Quc2V0X3NjaGVkX3N0YXR1c19pc1NldCh0cnVlKTsKKyAgICAgIH0KKyAgICAgIGlmIChpbmNvbWluZy5nZXQoMTApKSB7CisgICAgICAgIHN0cnVjdC50b3BvbG9neV9zdGF0cyA9IG5ldyBUb3BvbG9neVN0YXRzKCk7CisgICAgICAgIHN0cnVjdC50b3BvbG9neV9zdGF0cy5yZWFkKGlwcm90KTsKKyAgICAgICAgc3RydWN0LnNldF90b3BvbG9neV9zdGF0c19pc1NldCh0cnVlKTsKKyAgICAgIH0KKyAgICAgIGlmIChpbmNvbWluZy5nZXQoMTEpKSB7CisgICAgICAgIHN0cnVjdC5vd25lciA9IGlwcm90LnJlYWRTdHJpbmcoKTsKKyAgICAgICAgc3RydWN0LnNldF9vd25lcl9pc1NldCh0cnVlKTsKKyAgICAgIH0KKyAgICAgIGlmIChpbmNvbWluZy5nZXQoMTIpKSB7CisgICAgICAgIHN0cnVjdC5kZWJ1Z19vcHRpb25zID0gbmV3IERlYnVnT3B0aW9ucygpOworICAgICAgICBzdHJ1Y3QuZGVidWdfb3B0aW9ucy5yZWFkKGlwcm90KTsKKyAgICAgICAgc3RydWN0LnNldF9kZWJ1Z19vcHRpb25zX2lzU2V0KHRydWUpOworICAgICAgfQorICAgICAgaWYgKGluY29taW5nLmdldCgxMykpIHsKKyAgICAgICAgc3RydWN0LnJlcGxpY2F0aW9uX2NvdW50ID0gaXByb3QucmVhZEkzMigpOworICAgICAgICBzdHJ1Y3Quc2V0X3JlcGxpY2F0aW9uX2NvdW50X2lzU2V0KHRydWUpOworICAgICAgfQorICAgICAgaWYgKGluY29taW5nLmdldCgxNCkpIHsKKyAgICAgICAgc3RydWN0LnJlcXVlc3RlZF9tZW1vbmhlYXAgPSBpcHJvdC5yZWFkRG91YmxlKCk7CisgICAgICAgIHN0cnVjdC5zZXRfcmVxdWVzdGVkX21lbW9uaGVhcF9pc1NldCh0cnVlKTsKKyAgICAgIH0KKyAgICAgIGlmIChpbmNvbWluZy5nZXQoMTUpKSB7CisgICAgICAgIHN0cnVjdC5yZXF1ZXN0ZWRfbWVtb2ZmaGVhcCA9IGlwcm90LnJlYWREb3VibGUoKTsKKyAgICAgICAgc3RydWN0LnNldF9yZXF1ZXN0ZWRfbWVtb2ZmaGVhcF9pc1NldCh0cnVlKTsKKyAgICAgIH0KKyAgICAgIGlmIChpbmNvbWluZy5nZXQoMTYpKSB7CisgICAgICAgIHN0cnVjdC5yZXF1ZXN0ZWRfY3B1ID0gaXByb3QucmVhZERvdWJsZSgpOworICAgICAgICBzdHJ1Y3Quc2V0X3JlcXVlc3RlZF9jcHVfaXNTZXQodHJ1ZSk7CisgICAgICB9CisgICAgICBpZiAoaW5jb21pbmcuZ2V0KDE3KSkgeworICAgICAgICBzdHJ1Y3QuYXNzaWduZWRfbWVtb25oZWFwID0gaXByb3QucmVhZERvdWJsZSgpOworICAgICAgICBzdHJ1Y3Quc2V0X2Fzc2lnbmVkX21lbW9uaGVhcF9pc1NldCh0cnVlKTsKKyAgICAgIH0KKyAgICAgIGlmIChpbmNvbWluZy5nZXQoMTgpKSB7CisgICAgICAgIHN0cnVjdC5hc3NpZ25lZF9tZW1vZmZoZWFwID0gaXByb3QucmVhZERvdWJsZSgpOworICAgICAgICBzdHJ1Y3Quc2V0X2Fzc2lnbmVkX21lbW9mZmhlYXBfaXNTZXQodHJ1ZSk7CisgICAgICB9CisgICAgICBpZiAoaW5jb21pbmcuZ2V0KDE5KSkgeworICAgICAgICBzdHJ1Y3QuYXNzaWduZWRfY3B1ID0gaXByb3QucmVhZERvdWJsZSgpOworICAgICAgICBzdHJ1Y3Quc2V0X2Fzc2lnbmVkX2NwdV9pc1NldCh0cnVlKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworfQorCmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL1RvcG9sb2d5U3RhdHMuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvVG9wb2xvZ3lTdGF0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNTk4ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL1RvcG9sb2d5U3RhdHMuamF2YQpAQCAtMCwwICsxLDEwOTQgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisvKioKKyAqIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMykKKyAqCisgKiBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HCisgKiAgQGdlbmVyYXRlZAorICovCitwYWNrYWdlIGJhY2t0eXBlLnN0b3JtLmdlbmVyYXRlZDsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5JU2NoZW1lOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5TY2hlbWVGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5TdGFuZGFyZFNjaGVtZTsKKworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnNjaGVtZS5UdXBsZVNjaGVtZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHVwbGVQcm90b2NvbDsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuRW5jb2RpbmdVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LmFzeW5jLkFzeW5jTWV0aG9kQ2FsbGJhY2s7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2VydmVyLkFic3RyYWN0Tm9uYmxvY2tpbmdTZXJ2ZXIuKjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkVudW1NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bVNldDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkJpdFNldDsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5HZW5lcmF0ZWQ7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworQFN1cHByZXNzV2FybmluZ3MoeyJjYXN0IiwgInJhd3R5cGVzIiwgInNlcmlhbCIsICJ1bmNoZWNrZWQifSkKK0BHZW5lcmF0ZWQodmFsdWUgPSAiQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4zKSIpCitwdWJsaWMgY2xhc3MgVG9wb2xvZ3lTdGF0cyBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlPFRvcG9sb2d5U3RhdHMsIFRvcG9sb2d5U3RhdHMuX0ZpZWxkcz4sIGphdmEuaW8uU2VyaWFsaXphYmxlLCBDbG9uZWFibGUsIENvbXBhcmFibGU8VG9wb2xvZ3lTdGF0cz4geworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0IFNUUlVDVF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRTdHJ1Y3QoIlRvcG9sb2d5U3RhdHMiKTsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgV0lORE9XX1RPX0VNSVRURURfRklFTERfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQoIndpbmRvd190b19lbWl0dGVkIiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTUFQLCAoc2hvcnQpMSk7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBXSU5ET1dfVE9fVFJBTlNGRVJSRURfRklFTERfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQoIndpbmRvd190b190cmFuc2ZlcnJlZCIsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLk1BUCwgKHNob3J0KTIpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgV0lORE9XX1RPX0NPTVBMRVRFX0xBVEVOQ0lFU19NU19GSUVMRF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCgid2luZG93X3RvX2NvbXBsZXRlX2xhdGVuY2llc19tcyIsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLk1BUCwgKHNob3J0KTMpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgV0lORE9XX1RPX0FDS0VEX0ZJRUxEX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkKCJ3aW5kb3dfdG9fYWNrZWQiLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5NQVAsIChzaG9ydCk0KTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIFdJTkRPV19UT19GQUlMRURfRklFTERfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQoIndpbmRvd190b19mYWlsZWQiLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5NQVAsIChzaG9ydCk1KTsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8Q2xhc3M8PyBleHRlbmRzIElTY2hlbWU+LCBTY2hlbWVGYWN0b3J5PiBzY2hlbWVzID0gbmV3IEhhc2hNYXA8Q2xhc3M8PyBleHRlbmRzIElTY2hlbWU+LCBTY2hlbWVGYWN0b3J5PigpOworICBzdGF0aWMgeworICAgIHNjaGVtZXMucHV0KFN0YW5kYXJkU2NoZW1lLmNsYXNzLCBuZXcgVG9wb2xvZ3lTdGF0c1N0YW5kYXJkU2NoZW1lRmFjdG9yeSgpKTsKKyAgICBzY2hlbWVzLnB1dChUdXBsZVNjaGVtZS5jbGFzcywgbmV3IFRvcG9sb2d5U3RhdHNUdXBsZVNjaGVtZUZhY3RvcnkoKSk7CisgIH0KKworICBwcml2YXRlIE1hcDxTdHJpbmcsTG9uZz4gd2luZG93X3RvX2VtaXR0ZWQ7IC8vIG9wdGlvbmFsCisgIHByaXZhdGUgTWFwPFN0cmluZyxMb25nPiB3aW5kb3dfdG9fdHJhbnNmZXJyZWQ7IC8vIG9wdGlvbmFsCisgIHByaXZhdGUgTWFwPFN0cmluZyxEb3VibGU+IHdpbmRvd190b19jb21wbGV0ZV9sYXRlbmNpZXNfbXM7IC8vIG9wdGlvbmFsCisgIHByaXZhdGUgTWFwPFN0cmluZyxMb25nPiB3aW5kb3dfdG9fYWNrZWQ7IC8vIG9wdGlvbmFsCisgIHByaXZhdGUgTWFwPFN0cmluZyxMb25nPiB3aW5kb3dfdG9fZmFpbGVkOyAvLyBvcHRpb25hbAorCisgIC8qKiBUaGUgc2V0IG9mIGZpZWxkcyB0aGlzIHN0cnVjdCBjb250YWlucywgYWxvbmcgd2l0aCBjb252ZW5pZW5jZSBtZXRob2RzIGZvciBmaW5kaW5nIGFuZCBtYW5pcHVsYXRpbmcgdGhlbS4gKi8KKyAgcHVibGljIGVudW0gX0ZpZWxkcyBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZElkRW51bSB7CisgICAgV0lORE9XX1RPX0VNSVRURUQoKHNob3J0KTEsICJ3aW5kb3dfdG9fZW1pdHRlZCIpLAorICAgIFdJTkRPV19UT19UUkFOU0ZFUlJFRCgoc2hvcnQpMiwgIndpbmRvd190b190cmFuc2ZlcnJlZCIpLAorICAgIFdJTkRPV19UT19DT01QTEVURV9MQVRFTkNJRVNfTVMoKHNob3J0KTMsICJ3aW5kb3dfdG9fY29tcGxldGVfbGF0ZW5jaWVzX21zIiksCisgICAgV0lORE9XX1RPX0FDS0VEKChzaG9ydCk0LCAid2luZG93X3RvX2Fja2VkIiksCisgICAgV0lORE9XX1RPX0ZBSUxFRCgoc2hvcnQpNSwgIndpbmRvd190b19mYWlsZWQiKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsIF9GaWVsZHM+IGJ5TmFtZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgX0ZpZWxkcz4oKTsKKworICAgIHN0YXRpYyB7CisgICAgICBmb3IgKF9GaWVsZHMgZmllbGQgOiBFbnVtU2V0LmFsbE9mKF9GaWVsZHMuY2xhc3MpKSB7CisgICAgICAgIGJ5TmFtZS5wdXQoZmllbGQuZ2V0RmllbGROYW1lKCksIGZpZWxkKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kIHRoZSBfRmllbGRzIGNvbnN0YW50IHRoYXQgbWF0Y2hlcyBmaWVsZElkLCBvciBudWxsIGlmIGl0cyBub3QgZm91bmQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBfRmllbGRzIGZpbmRCeVRocmlmdElkKGludCBmaWVsZElkKSB7CisgICAgICBzd2l0Y2goZmllbGRJZCkgeworICAgICAgICBjYXNlIDE6IC8vIFdJTkRPV19UT19FTUlUVEVECisgICAgICAgICAgcmV0dXJuIFdJTkRPV19UT19FTUlUVEVEOworICAgICAgICBjYXNlIDI6IC8vIFdJTkRPV19UT19UUkFOU0ZFUlJFRAorICAgICAgICAgIHJldHVybiBXSU5ET1dfVE9fVFJBTlNGRVJSRUQ7CisgICAgICAgIGNhc2UgMzogLy8gV0lORE9XX1RPX0NPTVBMRVRFX0xBVEVOQ0lFU19NUworICAgICAgICAgIHJldHVybiBXSU5ET1dfVE9fQ09NUExFVEVfTEFURU5DSUVTX01TOworICAgICAgICBjYXNlIDQ6IC8vIFdJTkRPV19UT19BQ0tFRAorICAgICAgICAgIHJldHVybiBXSU5ET1dfVE9fQUNLRUQ7CisgICAgICAgIGNhc2UgNTogLy8gV0lORE9XX1RPX0ZBSUxFRAorICAgICAgICAgIHJldHVybiBXSU5ET1dfVE9fRkFJTEVEOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgdGhlIF9GaWVsZHMgY29uc3RhbnQgdGhhdCBtYXRjaGVzIGZpZWxkSWQsIHRocm93aW5nIGFuIGV4Y2VwdGlvbgorICAgICAqIGlmIGl0IGlzIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIF9GaWVsZHMgZmluZEJ5VGhyaWZ0SWRPclRocm93KGludCBmaWVsZElkKSB7CisgICAgICBfRmllbGRzIGZpZWxkcyA9IGZpbmRCeVRocmlmdElkKGZpZWxkSWQpOworICAgICAgaWYgKGZpZWxkcyA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJGaWVsZCAiICsgZmllbGRJZCArICIgZG9lc24ndCBleGlzdCEiKTsKKyAgICAgIHJldHVybiBmaWVsZHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCB0aGUgX0ZpZWxkcyBjb25zdGFudCB0aGF0IG1hdGNoZXMgbmFtZSwgb3IgbnVsbCBpZiBpdHMgbm90IGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgX0ZpZWxkcyBmaW5kQnlOYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICByZXR1cm4gYnlOYW1lLmdldChuYW1lKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIHNob3J0IF90aHJpZnRJZDsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBfZmllbGROYW1lOworCisgICAgX0ZpZWxkcyhzaG9ydCB0aHJpZnRJZCwgU3RyaW5nIGZpZWxkTmFtZSkgeworICAgICAgX3RocmlmdElkID0gdGhyaWZ0SWQ7CisgICAgICBfZmllbGROYW1lID0gZmllbGROYW1lOworICAgIH0KKworICAgIHB1YmxpYyBzaG9ydCBnZXRUaHJpZnRGaWVsZElkKCkgeworICAgICAgcmV0dXJuIF90aHJpZnRJZDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEZpZWxkTmFtZSgpIHsKKyAgICAgIHJldHVybiBfZmllbGROYW1lOworICAgIH0KKyAgfQorCisgIC8vIGlzc2V0IGlkIGFzc2lnbm1lbnRzCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIF9GaWVsZHMgb3B0aW9uYWxzW10gPSB7X0ZpZWxkcy5XSU5ET1dfVE9fRU1JVFRFRCxfRmllbGRzLldJTkRPV19UT19UUkFOU0ZFUlJFRCxfRmllbGRzLldJTkRPV19UT19DT01QTEVURV9MQVRFTkNJRVNfTVMsX0ZpZWxkcy5XSU5ET1dfVE9fQUNLRUQsX0ZpZWxkcy5XSU5ET1dfVE9fRkFJTEVEfTsKKyAgcHVibGljIHN0YXRpYyBmaW5hbCBNYXA8X0ZpZWxkcywgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGE+IG1ldGFEYXRhTWFwOworICBzdGF0aWMgeworICAgIE1hcDxfRmllbGRzLCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YT4gdG1wTWFwID0gbmV3IEVudW1NYXA8X0ZpZWxkcywgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGE+KF9GaWVsZHMuY2xhc3MpOworICAgIHRtcE1hcC5wdXQoX0ZpZWxkcy5XSU5ET1dfVE9fRU1JVFRFRCwgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhKCJ3aW5kb3dfdG9fZW1pdHRlZCIsIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZFJlcXVpcmVtZW50VHlwZS5PUFRJT05BTCwgCisgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuTWFwTWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTUFQLCAKKyAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRWYWx1ZU1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORyksIAorICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZFZhbHVlTWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTY0KSkpKTsKKyAgICB0bXBNYXAucHV0KF9GaWVsZHMuV0lORE9XX1RPX1RSQU5TRkVSUkVELCBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEoIndpbmRvd190b190cmFuc2ZlcnJlZCIsIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZFJlcXVpcmVtZW50VHlwZS5PUFRJT05BTCwgCisgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuTWFwTWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTUFQLCAKKyAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRWYWx1ZU1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORyksIAorICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZFZhbHVlTWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTY0KSkpKTsKKyAgICB0bXBNYXAucHV0KF9GaWVsZHMuV0lORE9XX1RPX0NPTVBMRVRFX0xBVEVOQ0lFU19NUywgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhKCJ3aW5kb3dfdG9fY29tcGxldGVfbGF0ZW5jaWVzX21zIiwgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLk9QVElPTkFMLCAKKyAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5NYXBNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5NQVAsIAorICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZFZhbHVlTWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HKSwgCisgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkVmFsdWVNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5ET1VCTEUpKSkpOworICAgIHRtcE1hcC5wdXQoX0ZpZWxkcy5XSU5ET1dfVE9fQUNLRUQsIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YSgid2luZG93X3RvX2Fja2VkIiwgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLk9QVElPTkFMLCAKKyAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5NYXBNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5NQVAsIAorICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZFZhbHVlTWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HKSwgCisgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkVmFsdWVNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JNjQpKSkpOworICAgIHRtcE1hcC5wdXQoX0ZpZWxkcy5XSU5ET1dfVE9fRkFJTEVELCBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEoIndpbmRvd190b19mYWlsZWQiLCBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRSZXF1aXJlbWVudFR5cGUuT1BUSU9OQUwsIAorICAgICAgICBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLk1hcE1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLk1BUCwgCisgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkVmFsdWVNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcpLCAKKyAgICAgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRWYWx1ZU1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkk2NCkpKSk7CisgICAgbWV0YURhdGFNYXAgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAodG1wTWFwKTsKKyAgICBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YS5hZGRTdHJ1Y3RNZXRhRGF0YU1hcChUb3BvbG9neVN0YXRzLmNsYXNzLCBtZXRhRGF0YU1hcCk7CisgIH0KKworICBwdWJsaWMgVG9wb2xvZ3lTdGF0cygpIHsKKyAgfQorCisgIC8qKgorICAgKiBQZXJmb3JtcyBhIGRlZXAgY29weSBvbiA8aT5vdGhlcjwvaT4uCisgICAqLworICBwdWJsaWMgVG9wb2xvZ3lTdGF0cyhUb3BvbG9neVN0YXRzIG90aGVyKSB7CisgICAgaWYgKG90aGVyLmlzX3NldF93aW5kb3dfdG9fZW1pdHRlZCgpKSB7CisgICAgICBNYXA8U3RyaW5nLExvbmc+IF9fdGhpc19fd2luZG93X3RvX2VtaXR0ZWQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsTG9uZz4ob3RoZXIud2luZG93X3RvX2VtaXR0ZWQpOworICAgICAgdGhpcy53aW5kb3dfdG9fZW1pdHRlZCA9IF9fdGhpc19fd2luZG93X3RvX2VtaXR0ZWQ7CisgICAgfQorICAgIGlmIChvdGhlci5pc19zZXRfd2luZG93X3RvX3RyYW5zZmVycmVkKCkpIHsKKyAgICAgIE1hcDxTdHJpbmcsTG9uZz4gX190aGlzX193aW5kb3dfdG9fdHJhbnNmZXJyZWQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsTG9uZz4ob3RoZXIud2luZG93X3RvX3RyYW5zZmVycmVkKTsKKyAgICAgIHRoaXMud2luZG93X3RvX3RyYW5zZmVycmVkID0gX190aGlzX193aW5kb3dfdG9fdHJhbnNmZXJyZWQ7CisgICAgfQorICAgIGlmIChvdGhlci5pc19zZXRfd2luZG93X3RvX2NvbXBsZXRlX2xhdGVuY2llc19tcygpKSB7CisgICAgICBNYXA8U3RyaW5nLERvdWJsZT4gX190aGlzX193aW5kb3dfdG9fY29tcGxldGVfbGF0ZW5jaWVzX21zID0gbmV3IEhhc2hNYXA8U3RyaW5nLERvdWJsZT4ob3RoZXIud2luZG93X3RvX2NvbXBsZXRlX2xhdGVuY2llc19tcyk7CisgICAgICB0aGlzLndpbmRvd190b19jb21wbGV0ZV9sYXRlbmNpZXNfbXMgPSBfX3RoaXNfX3dpbmRvd190b19jb21wbGV0ZV9sYXRlbmNpZXNfbXM7CisgICAgfQorICAgIGlmIChvdGhlci5pc19zZXRfd2luZG93X3RvX2Fja2VkKCkpIHsKKyAgICAgIE1hcDxTdHJpbmcsTG9uZz4gX190aGlzX193aW5kb3dfdG9fYWNrZWQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsTG9uZz4ob3RoZXIud2luZG93X3RvX2Fja2VkKTsKKyAgICAgIHRoaXMud2luZG93X3RvX2Fja2VkID0gX190aGlzX193aW5kb3dfdG9fYWNrZWQ7CisgICAgfQorICAgIGlmIChvdGhlci5pc19zZXRfd2luZG93X3RvX2ZhaWxlZCgpKSB7CisgICAgICBNYXA8U3RyaW5nLExvbmc+IF9fdGhpc19fd2luZG93X3RvX2ZhaWxlZCA9IG5ldyBIYXNoTWFwPFN0cmluZyxMb25nPihvdGhlci53aW5kb3dfdG9fZmFpbGVkKTsKKyAgICAgIHRoaXMud2luZG93X3RvX2ZhaWxlZCA9IF9fdGhpc19fd2luZG93X3RvX2ZhaWxlZDsKKyAgICB9CisgIH0KKworICBwdWJsaWMgVG9wb2xvZ3lTdGF0cyBkZWVwQ29weSgpIHsKKyAgICByZXR1cm4gbmV3IFRvcG9sb2d5U3RhdHModGhpcyk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgdGhpcy53aW5kb3dfdG9fZW1pdHRlZCA9IG51bGw7CisgICAgdGhpcy53aW5kb3dfdG9fdHJhbnNmZXJyZWQgPSBudWxsOworICAgIHRoaXMud2luZG93X3RvX2NvbXBsZXRlX2xhdGVuY2llc19tcyA9IG51bGw7CisgICAgdGhpcy53aW5kb3dfdG9fYWNrZWQgPSBudWxsOworICAgIHRoaXMud2luZG93X3RvX2ZhaWxlZCA9IG51bGw7CisgIH0KKworICBwdWJsaWMgaW50IGdldF93aW5kb3dfdG9fZW1pdHRlZF9zaXplKCkgeworICAgIHJldHVybiAodGhpcy53aW5kb3dfdG9fZW1pdHRlZCA9PSBudWxsKSA/IDAgOiB0aGlzLndpbmRvd190b19lbWl0dGVkLnNpemUoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHB1dF90b193aW5kb3dfdG9fZW1pdHRlZChTdHJpbmcga2V5LCBsb25nIHZhbCkgeworICAgIGlmICh0aGlzLndpbmRvd190b19lbWl0dGVkID09IG51bGwpIHsKKyAgICAgIHRoaXMud2luZG93X3RvX2VtaXR0ZWQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsTG9uZz4oKTsKKyAgICB9CisgICAgdGhpcy53aW5kb3dfdG9fZW1pdHRlZC5wdXQoa2V5LCB2YWwpOworICB9CisKKyAgcHVibGljIE1hcDxTdHJpbmcsTG9uZz4gZ2V0X3dpbmRvd190b19lbWl0dGVkKCkgeworICAgIHJldHVybiB0aGlzLndpbmRvd190b19lbWl0dGVkOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X3dpbmRvd190b19lbWl0dGVkKE1hcDxTdHJpbmcsTG9uZz4gd2luZG93X3RvX2VtaXR0ZWQpIHsKKyAgICB0aGlzLndpbmRvd190b19lbWl0dGVkID0gd2luZG93X3RvX2VtaXR0ZWQ7CisgIH0KKworICBwdWJsaWMgdm9pZCB1bnNldF93aW5kb3dfdG9fZW1pdHRlZCgpIHsKKyAgICB0aGlzLndpbmRvd190b19lbWl0dGVkID0gbnVsbDsKKyAgfQorCisgIC8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgd2luZG93X3RvX2VtaXR0ZWQgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgIHB1YmxpYyBib29sZWFuIGlzX3NldF93aW5kb3dfdG9fZW1pdHRlZCgpIHsKKyAgICByZXR1cm4gdGhpcy53aW5kb3dfdG9fZW1pdHRlZCAhPSBudWxsOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X3dpbmRvd190b19lbWl0dGVkX2lzU2V0KGJvb2xlYW4gdmFsdWUpIHsKKyAgICBpZiAoIXZhbHVlKSB7CisgICAgICB0aGlzLndpbmRvd190b19lbWl0dGVkID0gbnVsbDsKKyAgICB9CisgIH0KKworICBwdWJsaWMgaW50IGdldF93aW5kb3dfdG9fdHJhbnNmZXJyZWRfc2l6ZSgpIHsKKyAgICByZXR1cm4gKHRoaXMud2luZG93X3RvX3RyYW5zZmVycmVkID09IG51bGwpID8gMCA6IHRoaXMud2luZG93X3RvX3RyYW5zZmVycmVkLnNpemUoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHB1dF90b193aW5kb3dfdG9fdHJhbnNmZXJyZWQoU3RyaW5nIGtleSwgbG9uZyB2YWwpIHsKKyAgICBpZiAodGhpcy53aW5kb3dfdG9fdHJhbnNmZXJyZWQgPT0gbnVsbCkgeworICAgICAgdGhpcy53aW5kb3dfdG9fdHJhbnNmZXJyZWQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsTG9uZz4oKTsKKyAgICB9CisgICAgdGhpcy53aW5kb3dfdG9fdHJhbnNmZXJyZWQucHV0KGtleSwgdmFsKTsKKyAgfQorCisgIHB1YmxpYyBNYXA8U3RyaW5nLExvbmc+IGdldF93aW5kb3dfdG9fdHJhbnNmZXJyZWQoKSB7CisgICAgcmV0dXJuIHRoaXMud2luZG93X3RvX3RyYW5zZmVycmVkOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X3dpbmRvd190b190cmFuc2ZlcnJlZChNYXA8U3RyaW5nLExvbmc+IHdpbmRvd190b190cmFuc2ZlcnJlZCkgeworICAgIHRoaXMud2luZG93X3RvX3RyYW5zZmVycmVkID0gd2luZG93X3RvX3RyYW5zZmVycmVkOworICB9CisKKyAgcHVibGljIHZvaWQgdW5zZXRfd2luZG93X3RvX3RyYW5zZmVycmVkKCkgeworICAgIHRoaXMud2luZG93X3RvX3RyYW5zZmVycmVkID0gbnVsbDsKKyAgfQorCisgIC8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgd2luZG93X3RvX3RyYW5zZmVycmVkIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLworICBwdWJsaWMgYm9vbGVhbiBpc19zZXRfd2luZG93X3RvX3RyYW5zZmVycmVkKCkgeworICAgIHJldHVybiB0aGlzLndpbmRvd190b190cmFuc2ZlcnJlZCAhPSBudWxsOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X3dpbmRvd190b190cmFuc2ZlcnJlZF9pc1NldChib29sZWFuIHZhbHVlKSB7CisgICAgaWYgKCF2YWx1ZSkgeworICAgICAgdGhpcy53aW5kb3dfdG9fdHJhbnNmZXJyZWQgPSBudWxsOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBpbnQgZ2V0X3dpbmRvd190b19jb21wbGV0ZV9sYXRlbmNpZXNfbXNfc2l6ZSgpIHsKKyAgICByZXR1cm4gKHRoaXMud2luZG93X3RvX2NvbXBsZXRlX2xhdGVuY2llc19tcyA9PSBudWxsKSA/IDAgOiB0aGlzLndpbmRvd190b19jb21wbGV0ZV9sYXRlbmNpZXNfbXMuc2l6ZSgpOworICB9CisKKyAgcHVibGljIHZvaWQgcHV0X3RvX3dpbmRvd190b19jb21wbGV0ZV9sYXRlbmNpZXNfbXMoU3RyaW5nIGtleSwgZG91YmxlIHZhbCkgeworICAgIGlmICh0aGlzLndpbmRvd190b19jb21wbGV0ZV9sYXRlbmNpZXNfbXMgPT0gbnVsbCkgeworICAgICAgdGhpcy53aW5kb3dfdG9fY29tcGxldGVfbGF0ZW5jaWVzX21zID0gbmV3IEhhc2hNYXA8U3RyaW5nLERvdWJsZT4oKTsKKyAgICB9CisgICAgdGhpcy53aW5kb3dfdG9fY29tcGxldGVfbGF0ZW5jaWVzX21zLnB1dChrZXksIHZhbCk7CisgIH0KKworICBwdWJsaWMgTWFwPFN0cmluZyxEb3VibGU+IGdldF93aW5kb3dfdG9fY29tcGxldGVfbGF0ZW5jaWVzX21zKCkgeworICAgIHJldHVybiB0aGlzLndpbmRvd190b19jb21wbGV0ZV9sYXRlbmNpZXNfbXM7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfd2luZG93X3RvX2NvbXBsZXRlX2xhdGVuY2llc19tcyhNYXA8U3RyaW5nLERvdWJsZT4gd2luZG93X3RvX2NvbXBsZXRlX2xhdGVuY2llc19tcykgeworICAgIHRoaXMud2luZG93X3RvX2NvbXBsZXRlX2xhdGVuY2llc19tcyA9IHdpbmRvd190b19jb21wbGV0ZV9sYXRlbmNpZXNfbXM7CisgIH0KKworICBwdWJsaWMgdm9pZCB1bnNldF93aW5kb3dfdG9fY29tcGxldGVfbGF0ZW5jaWVzX21zKCkgeworICAgIHRoaXMud2luZG93X3RvX2NvbXBsZXRlX2xhdGVuY2llc19tcyA9IG51bGw7CisgIH0KKworICAvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkIHdpbmRvd190b19jb21wbGV0ZV9sYXRlbmNpZXNfbXMgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgIHB1YmxpYyBib29sZWFuIGlzX3NldF93aW5kb3dfdG9fY29tcGxldGVfbGF0ZW5jaWVzX21zKCkgeworICAgIHJldHVybiB0aGlzLndpbmRvd190b19jb21wbGV0ZV9sYXRlbmNpZXNfbXMgIT0gbnVsbDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF93aW5kb3dfdG9fY29tcGxldGVfbGF0ZW5jaWVzX21zX2lzU2V0KGJvb2xlYW4gdmFsdWUpIHsKKyAgICBpZiAoIXZhbHVlKSB7CisgICAgICB0aGlzLndpbmRvd190b19jb21wbGV0ZV9sYXRlbmNpZXNfbXMgPSBudWxsOworICAgIH0KKyAgfQorCisgIHB1YmxpYyBpbnQgZ2V0X3dpbmRvd190b19hY2tlZF9zaXplKCkgeworICAgIHJldHVybiAodGhpcy53aW5kb3dfdG9fYWNrZWQgPT0gbnVsbCkgPyAwIDogdGhpcy53aW5kb3dfdG9fYWNrZWQuc2l6ZSgpOworICB9CisKKyAgcHVibGljIHZvaWQgcHV0X3RvX3dpbmRvd190b19hY2tlZChTdHJpbmcga2V5LCBsb25nIHZhbCkgeworICAgIGlmICh0aGlzLndpbmRvd190b19hY2tlZCA9PSBudWxsKSB7CisgICAgICB0aGlzLndpbmRvd190b19hY2tlZCA9IG5ldyBIYXNoTWFwPFN0cmluZyxMb25nPigpOworICAgIH0KKyAgICB0aGlzLndpbmRvd190b19hY2tlZC5wdXQoa2V5LCB2YWwpOworICB9CisKKyAgcHVibGljIE1hcDxTdHJpbmcsTG9uZz4gZ2V0X3dpbmRvd190b19hY2tlZCgpIHsKKyAgICByZXR1cm4gdGhpcy53aW5kb3dfdG9fYWNrZWQ7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfd2luZG93X3RvX2Fja2VkKE1hcDxTdHJpbmcsTG9uZz4gd2luZG93X3RvX2Fja2VkKSB7CisgICAgdGhpcy53aW5kb3dfdG9fYWNrZWQgPSB3aW5kb3dfdG9fYWNrZWQ7CisgIH0KKworICBwdWJsaWMgdm9pZCB1bnNldF93aW5kb3dfdG9fYWNrZWQoKSB7CisgICAgdGhpcy53aW5kb3dfdG9fYWNrZWQgPSBudWxsOworICB9CisKKyAgLyoqIFJldHVybnMgdHJ1ZSBpZiBmaWVsZCB3aW5kb3dfdG9fYWNrZWQgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgIHB1YmxpYyBib29sZWFuIGlzX3NldF93aW5kb3dfdG9fYWNrZWQoKSB7CisgICAgcmV0dXJuIHRoaXMud2luZG93X3RvX2Fja2VkICE9IG51bGw7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfd2luZG93X3RvX2Fja2VkX2lzU2V0KGJvb2xlYW4gdmFsdWUpIHsKKyAgICBpZiAoIXZhbHVlKSB7CisgICAgICB0aGlzLndpbmRvd190b19hY2tlZCA9IG51bGw7CisgICAgfQorICB9CisKKyAgcHVibGljIGludCBnZXRfd2luZG93X3RvX2ZhaWxlZF9zaXplKCkgeworICAgIHJldHVybiAodGhpcy53aW5kb3dfdG9fZmFpbGVkID09IG51bGwpID8gMCA6IHRoaXMud2luZG93X3RvX2ZhaWxlZC5zaXplKCk7CisgIH0KKworICBwdWJsaWMgdm9pZCBwdXRfdG9fd2luZG93X3RvX2ZhaWxlZChTdHJpbmcga2V5LCBsb25nIHZhbCkgeworICAgIGlmICh0aGlzLndpbmRvd190b19mYWlsZWQgPT0gbnVsbCkgeworICAgICAgdGhpcy53aW5kb3dfdG9fZmFpbGVkID0gbmV3IEhhc2hNYXA8U3RyaW5nLExvbmc+KCk7CisgICAgfQorICAgIHRoaXMud2luZG93X3RvX2ZhaWxlZC5wdXQoa2V5LCB2YWwpOworICB9CisKKyAgcHVibGljIE1hcDxTdHJpbmcsTG9uZz4gZ2V0X3dpbmRvd190b19mYWlsZWQoKSB7CisgICAgcmV0dXJuIHRoaXMud2luZG93X3RvX2ZhaWxlZDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF93aW5kb3dfdG9fZmFpbGVkKE1hcDxTdHJpbmcsTG9uZz4gd2luZG93X3RvX2ZhaWxlZCkgeworICAgIHRoaXMud2luZG93X3RvX2ZhaWxlZCA9IHdpbmRvd190b19mYWlsZWQ7CisgIH0KKworICBwdWJsaWMgdm9pZCB1bnNldF93aW5kb3dfdG9fZmFpbGVkKCkgeworICAgIHRoaXMud2luZG93X3RvX2ZhaWxlZCA9IG51bGw7CisgIH0KKworICAvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkIHdpbmRvd190b19mYWlsZWQgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgIHB1YmxpYyBib29sZWFuIGlzX3NldF93aW5kb3dfdG9fZmFpbGVkKCkgeworICAgIHJldHVybiB0aGlzLndpbmRvd190b19mYWlsZWQgIT0gbnVsbDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF93aW5kb3dfdG9fZmFpbGVkX2lzU2V0KGJvb2xlYW4gdmFsdWUpIHsKKyAgICBpZiAoIXZhbHVlKSB7CisgICAgICB0aGlzLndpbmRvd190b19mYWlsZWQgPSBudWxsOworICAgIH0KKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldEZpZWxkVmFsdWUoX0ZpZWxkcyBmaWVsZCwgT2JqZWN0IHZhbHVlKSB7CisgICAgc3dpdGNoIChmaWVsZCkgeworICAgIGNhc2UgV0lORE9XX1RPX0VNSVRURUQ6CisgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICB1bnNldF93aW5kb3dfdG9fZW1pdHRlZCgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2V0X3dpbmRvd190b19lbWl0dGVkKChNYXA8U3RyaW5nLExvbmc+KXZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBXSU5ET1dfVE9fVFJBTlNGRVJSRUQ6CisgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICB1bnNldF93aW5kb3dfdG9fdHJhbnNmZXJyZWQoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNldF93aW5kb3dfdG9fdHJhbnNmZXJyZWQoKE1hcDxTdHJpbmcsTG9uZz4pdmFsdWUpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFdJTkRPV19UT19DT01QTEVURV9MQVRFTkNJRVNfTVM6CisgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICB1bnNldF93aW5kb3dfdG9fY29tcGxldGVfbGF0ZW5jaWVzX21zKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzZXRfd2luZG93X3RvX2NvbXBsZXRlX2xhdGVuY2llc19tcygoTWFwPFN0cmluZyxEb3VibGU+KXZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBXSU5ET1dfVE9fQUNLRUQ6CisgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICB1bnNldF93aW5kb3dfdG9fYWNrZWQoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNldF93aW5kb3dfdG9fYWNrZWQoKE1hcDxTdHJpbmcsTG9uZz4pdmFsdWUpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFdJTkRPV19UT19GQUlMRUQ6CisgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICB1bnNldF93aW5kb3dfdG9fZmFpbGVkKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzZXRfd2luZG93X3RvX2ZhaWxlZCgoTWFwPFN0cmluZyxMb25nPil2YWx1ZSk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIH0KKyAgfQorCisgIHB1YmxpYyBPYmplY3QgZ2V0RmllbGRWYWx1ZShfRmllbGRzIGZpZWxkKSB7CisgICAgc3dpdGNoIChmaWVsZCkgeworICAgIGNhc2UgV0lORE9XX1RPX0VNSVRURUQ6CisgICAgICByZXR1cm4gZ2V0X3dpbmRvd190b19lbWl0dGVkKCk7CisKKyAgICBjYXNlIFdJTkRPV19UT19UUkFOU0ZFUlJFRDoKKyAgICAgIHJldHVybiBnZXRfd2luZG93X3RvX3RyYW5zZmVycmVkKCk7CisKKyAgICBjYXNlIFdJTkRPV19UT19DT01QTEVURV9MQVRFTkNJRVNfTVM6CisgICAgICByZXR1cm4gZ2V0X3dpbmRvd190b19jb21wbGV0ZV9sYXRlbmNpZXNfbXMoKTsKKworICAgIGNhc2UgV0lORE9XX1RPX0FDS0VEOgorICAgICAgcmV0dXJuIGdldF93aW5kb3dfdG9fYWNrZWQoKTsKKworICAgIGNhc2UgV0lORE9XX1RPX0ZBSUxFRDoKKyAgICAgIHJldHVybiBnZXRfd2luZG93X3RvX2ZhaWxlZCgpOworCisgICAgfQorICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgfQorCisgIC8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgY29ycmVzcG9uZGluZyB0byBmaWVsZElEIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLworICBwdWJsaWMgYm9vbGVhbiBpc1NldChfRmllbGRzIGZpZWxkKSB7CisgICAgaWYgKGZpZWxkID09IG51bGwpIHsKKyAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKGZpZWxkKSB7CisgICAgY2FzZSBXSU5ET1dfVE9fRU1JVFRFRDoKKyAgICAgIHJldHVybiBpc19zZXRfd2luZG93X3RvX2VtaXR0ZWQoKTsKKyAgICBjYXNlIFdJTkRPV19UT19UUkFOU0ZFUlJFRDoKKyAgICAgIHJldHVybiBpc19zZXRfd2luZG93X3RvX3RyYW5zZmVycmVkKCk7CisgICAgY2FzZSBXSU5ET1dfVE9fQ09NUExFVEVfTEFURU5DSUVTX01TOgorICAgICAgcmV0dXJuIGlzX3NldF93aW5kb3dfdG9fY29tcGxldGVfbGF0ZW5jaWVzX21zKCk7CisgICAgY2FzZSBXSU5ET1dfVE9fQUNLRUQ6CisgICAgICByZXR1cm4gaXNfc2V0X3dpbmRvd190b19hY2tlZCgpOworICAgIGNhc2UgV0lORE9XX1RPX0ZBSUxFRDoKKyAgICAgIHJldHVybiBpc19zZXRfd2luZG93X3RvX2ZhaWxlZCgpOworICAgIH0KKyAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgIH0KKworICBAT3ZlcnJpZGUKKyAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCB0aGF0KSB7CisgICAgaWYgKHRoYXQgPT0gbnVsbCkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAodGhhdCBpbnN0YW5jZW9mIFRvcG9sb2d5U3RhdHMpCisgICAgICByZXR1cm4gdGhpcy5lcXVhbHMoKFRvcG9sb2d5U3RhdHMpdGhhdCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcHVibGljIGJvb2xlYW4gZXF1YWxzKFRvcG9sb2d5U3RhdHMgdGhhdCkgeworICAgIGlmICh0aGF0ID09IG51bGwpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBib29sZWFuIHRoaXNfcHJlc2VudF93aW5kb3dfdG9fZW1pdHRlZCA9IHRydWUgJiYgdGhpcy5pc19zZXRfd2luZG93X3RvX2VtaXR0ZWQoKTsKKyAgICBib29sZWFuIHRoYXRfcHJlc2VudF93aW5kb3dfdG9fZW1pdHRlZCA9IHRydWUgJiYgdGhhdC5pc19zZXRfd2luZG93X3RvX2VtaXR0ZWQoKTsKKyAgICBpZiAodGhpc19wcmVzZW50X3dpbmRvd190b19lbWl0dGVkIHx8IHRoYXRfcHJlc2VudF93aW5kb3dfdG9fZW1pdHRlZCkgeworICAgICAgaWYgKCEodGhpc19wcmVzZW50X3dpbmRvd190b19lbWl0dGVkICYmIHRoYXRfcHJlc2VudF93aW5kb3dfdG9fZW1pdHRlZCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGlmICghdGhpcy53aW5kb3dfdG9fZW1pdHRlZC5lcXVhbHModGhhdC53aW5kb3dfdG9fZW1pdHRlZCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sZWFuIHRoaXNfcHJlc2VudF93aW5kb3dfdG9fdHJhbnNmZXJyZWQgPSB0cnVlICYmIHRoaXMuaXNfc2V0X3dpbmRvd190b190cmFuc2ZlcnJlZCgpOworICAgIGJvb2xlYW4gdGhhdF9wcmVzZW50X3dpbmRvd190b190cmFuc2ZlcnJlZCA9IHRydWUgJiYgdGhhdC5pc19zZXRfd2luZG93X3RvX3RyYW5zZmVycmVkKCk7CisgICAgaWYgKHRoaXNfcHJlc2VudF93aW5kb3dfdG9fdHJhbnNmZXJyZWQgfHwgdGhhdF9wcmVzZW50X3dpbmRvd190b190cmFuc2ZlcnJlZCkgeworICAgICAgaWYgKCEodGhpc19wcmVzZW50X3dpbmRvd190b190cmFuc2ZlcnJlZCAmJiB0aGF0X3ByZXNlbnRfd2luZG93X3RvX3RyYW5zZmVycmVkKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKCF0aGlzLndpbmRvd190b190cmFuc2ZlcnJlZC5lcXVhbHModGhhdC53aW5kb3dfdG9fdHJhbnNmZXJyZWQpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbGVhbiB0aGlzX3ByZXNlbnRfd2luZG93X3RvX2NvbXBsZXRlX2xhdGVuY2llc19tcyA9IHRydWUgJiYgdGhpcy5pc19zZXRfd2luZG93X3RvX2NvbXBsZXRlX2xhdGVuY2llc19tcygpOworICAgIGJvb2xlYW4gdGhhdF9wcmVzZW50X3dpbmRvd190b19jb21wbGV0ZV9sYXRlbmNpZXNfbXMgPSB0cnVlICYmIHRoYXQuaXNfc2V0X3dpbmRvd190b19jb21wbGV0ZV9sYXRlbmNpZXNfbXMoKTsKKyAgICBpZiAodGhpc19wcmVzZW50X3dpbmRvd190b19jb21wbGV0ZV9sYXRlbmNpZXNfbXMgfHwgdGhhdF9wcmVzZW50X3dpbmRvd190b19jb21wbGV0ZV9sYXRlbmNpZXNfbXMpIHsKKyAgICAgIGlmICghKHRoaXNfcHJlc2VudF93aW5kb3dfdG9fY29tcGxldGVfbGF0ZW5jaWVzX21zICYmIHRoYXRfcHJlc2VudF93aW5kb3dfdG9fY29tcGxldGVfbGF0ZW5jaWVzX21zKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKCF0aGlzLndpbmRvd190b19jb21wbGV0ZV9sYXRlbmNpZXNfbXMuZXF1YWxzKHRoYXQud2luZG93X3RvX2NvbXBsZXRlX2xhdGVuY2llc19tcykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBib29sZWFuIHRoaXNfcHJlc2VudF93aW5kb3dfdG9fYWNrZWQgPSB0cnVlICYmIHRoaXMuaXNfc2V0X3dpbmRvd190b19hY2tlZCgpOworICAgIGJvb2xlYW4gdGhhdF9wcmVzZW50X3dpbmRvd190b19hY2tlZCA9IHRydWUgJiYgdGhhdC5pc19zZXRfd2luZG93X3RvX2Fja2VkKCk7CisgICAgaWYgKHRoaXNfcHJlc2VudF93aW5kb3dfdG9fYWNrZWQgfHwgdGhhdF9wcmVzZW50X3dpbmRvd190b19hY2tlZCkgeworICAgICAgaWYgKCEodGhpc19wcmVzZW50X3dpbmRvd190b19hY2tlZCAmJiB0aGF0X3ByZXNlbnRfd2luZG93X3RvX2Fja2VkKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKCF0aGlzLndpbmRvd190b19hY2tlZC5lcXVhbHModGhhdC53aW5kb3dfdG9fYWNrZWQpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbGVhbiB0aGlzX3ByZXNlbnRfd2luZG93X3RvX2ZhaWxlZCA9IHRydWUgJiYgdGhpcy5pc19zZXRfd2luZG93X3RvX2ZhaWxlZCgpOworICAgIGJvb2xlYW4gdGhhdF9wcmVzZW50X3dpbmRvd190b19mYWlsZWQgPSB0cnVlICYmIHRoYXQuaXNfc2V0X3dpbmRvd190b19mYWlsZWQoKTsKKyAgICBpZiAodGhpc19wcmVzZW50X3dpbmRvd190b19mYWlsZWQgfHwgdGhhdF9wcmVzZW50X3dpbmRvd190b19mYWlsZWQpIHsKKyAgICAgIGlmICghKHRoaXNfcHJlc2VudF93aW5kb3dfdG9fZmFpbGVkICYmIHRoYXRfcHJlc2VudF93aW5kb3dfdG9fZmFpbGVkKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKCF0aGlzLndpbmRvd190b19mYWlsZWQuZXF1YWxzKHRoYXQud2luZG93X3RvX2ZhaWxlZCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgIExpc3Q8T2JqZWN0PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7CisKKyAgICBib29sZWFuIHByZXNlbnRfd2luZG93X3RvX2VtaXR0ZWQgPSB0cnVlICYmIChpc19zZXRfd2luZG93X3RvX2VtaXR0ZWQoKSk7CisgICAgbGlzdC5hZGQocHJlc2VudF93aW5kb3dfdG9fZW1pdHRlZCk7CisgICAgaWYgKHByZXNlbnRfd2luZG93X3RvX2VtaXR0ZWQpCisgICAgICBsaXN0LmFkZCh3aW5kb3dfdG9fZW1pdHRlZCk7CisKKyAgICBib29sZWFuIHByZXNlbnRfd2luZG93X3RvX3RyYW5zZmVycmVkID0gdHJ1ZSAmJiAoaXNfc2V0X3dpbmRvd190b190cmFuc2ZlcnJlZCgpKTsKKyAgICBsaXN0LmFkZChwcmVzZW50X3dpbmRvd190b190cmFuc2ZlcnJlZCk7CisgICAgaWYgKHByZXNlbnRfd2luZG93X3RvX3RyYW5zZmVycmVkKQorICAgICAgbGlzdC5hZGQod2luZG93X3RvX3RyYW5zZmVycmVkKTsKKworICAgIGJvb2xlYW4gcHJlc2VudF93aW5kb3dfdG9fY29tcGxldGVfbGF0ZW5jaWVzX21zID0gdHJ1ZSAmJiAoaXNfc2V0X3dpbmRvd190b19jb21wbGV0ZV9sYXRlbmNpZXNfbXMoKSk7CisgICAgbGlzdC5hZGQocHJlc2VudF93aW5kb3dfdG9fY29tcGxldGVfbGF0ZW5jaWVzX21zKTsKKyAgICBpZiAocHJlc2VudF93aW5kb3dfdG9fY29tcGxldGVfbGF0ZW5jaWVzX21zKQorICAgICAgbGlzdC5hZGQod2luZG93X3RvX2NvbXBsZXRlX2xhdGVuY2llc19tcyk7CisKKyAgICBib29sZWFuIHByZXNlbnRfd2luZG93X3RvX2Fja2VkID0gdHJ1ZSAmJiAoaXNfc2V0X3dpbmRvd190b19hY2tlZCgpKTsKKyAgICBsaXN0LmFkZChwcmVzZW50X3dpbmRvd190b19hY2tlZCk7CisgICAgaWYgKHByZXNlbnRfd2luZG93X3RvX2Fja2VkKQorICAgICAgbGlzdC5hZGQod2luZG93X3RvX2Fja2VkKTsKKworICAgIGJvb2xlYW4gcHJlc2VudF93aW5kb3dfdG9fZmFpbGVkID0gdHJ1ZSAmJiAoaXNfc2V0X3dpbmRvd190b19mYWlsZWQoKSk7CisgICAgbGlzdC5hZGQocHJlc2VudF93aW5kb3dfdG9fZmFpbGVkKTsKKyAgICBpZiAocHJlc2VudF93aW5kb3dfdG9fZmFpbGVkKQorICAgICAgbGlzdC5hZGQod2luZG93X3RvX2ZhaWxlZCk7CisKKyAgICByZXR1cm4gbGlzdC5oYXNoQ29kZSgpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBpbnQgY29tcGFyZVRvKFRvcG9sb2d5U3RhdHMgb3RoZXIpIHsKKyAgICBpZiAoIWdldENsYXNzKCkuZXF1YWxzKG90aGVyLmdldENsYXNzKCkpKSB7CisgICAgICByZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCkuY29tcGFyZVRvKG90aGVyLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICB9CisKKyAgICBpbnQgbGFzdENvbXBhcmlzb24gPSAwOworCisgICAgbGFzdENvbXBhcmlzb24gPSBCb29sZWFuLnZhbHVlT2YoaXNfc2V0X3dpbmRvd190b19lbWl0dGVkKCkpLmNvbXBhcmVUbyhvdGhlci5pc19zZXRfd2luZG93X3RvX2VtaXR0ZWQoKSk7CisgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICB9CisgICAgaWYgKGlzX3NldF93aW5kb3dfdG9fZW1pdHRlZCgpKSB7CisgICAgICBsYXN0Q29tcGFyaXNvbiA9IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvbXBhcmVUbyh0aGlzLndpbmRvd190b19lbWl0dGVkLCBvdGhlci53aW5kb3dfdG9fZW1pdHRlZCk7CisgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICB9CisgICAgfQorICAgIGxhc3RDb21wYXJpc29uID0gQm9vbGVhbi52YWx1ZU9mKGlzX3NldF93aW5kb3dfdG9fdHJhbnNmZXJyZWQoKSkuY29tcGFyZVRvKG90aGVyLmlzX3NldF93aW5kb3dfdG9fdHJhbnNmZXJyZWQoKSk7CisgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICB9CisgICAgaWYgKGlzX3NldF93aW5kb3dfdG9fdHJhbnNmZXJyZWQoKSkgeworICAgICAgbGFzdENvbXBhcmlzb24gPSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy53aW5kb3dfdG9fdHJhbnNmZXJyZWQsIG90aGVyLndpbmRvd190b190cmFuc2ZlcnJlZCk7CisgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICB9CisgICAgfQorICAgIGxhc3RDb21wYXJpc29uID0gQm9vbGVhbi52YWx1ZU9mKGlzX3NldF93aW5kb3dfdG9fY29tcGxldGVfbGF0ZW5jaWVzX21zKCkpLmNvbXBhcmVUbyhvdGhlci5pc19zZXRfd2luZG93X3RvX2NvbXBsZXRlX2xhdGVuY2llc19tcygpKTsKKyAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgIH0KKyAgICBpZiAoaXNfc2V0X3dpbmRvd190b19jb21wbGV0ZV9sYXRlbmNpZXNfbXMoKSkgeworICAgICAgbGFzdENvbXBhcmlzb24gPSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy53aW5kb3dfdG9fY29tcGxldGVfbGF0ZW5jaWVzX21zLCBvdGhlci53aW5kb3dfdG9fY29tcGxldGVfbGF0ZW5jaWVzX21zKTsKKyAgICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICAgIH0KKyAgICB9CisgICAgbGFzdENvbXBhcmlzb24gPSBCb29sZWFuLnZhbHVlT2YoaXNfc2V0X3dpbmRvd190b19hY2tlZCgpKS5jb21wYXJlVG8ob3RoZXIuaXNfc2V0X3dpbmRvd190b19hY2tlZCgpKTsKKyAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgIH0KKyAgICBpZiAoaXNfc2V0X3dpbmRvd190b19hY2tlZCgpKSB7CisgICAgICBsYXN0Q29tcGFyaXNvbiA9IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvbXBhcmVUbyh0aGlzLndpbmRvd190b19hY2tlZCwgb3RoZXIud2luZG93X3RvX2Fja2VkKTsKKyAgICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICAgIH0KKyAgICB9CisgICAgbGFzdENvbXBhcmlzb24gPSBCb29sZWFuLnZhbHVlT2YoaXNfc2V0X3dpbmRvd190b19mYWlsZWQoKSkuY29tcGFyZVRvKG90aGVyLmlzX3NldF93aW5kb3dfdG9fZmFpbGVkKCkpOworICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgfQorICAgIGlmIChpc19zZXRfd2luZG93X3RvX2ZhaWxlZCgpKSB7CisgICAgICBsYXN0Q29tcGFyaXNvbiA9IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvbXBhcmVUbyh0aGlzLndpbmRvd190b19mYWlsZWQsIG90aGVyLndpbmRvd190b19mYWlsZWQpOworICAgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHB1YmxpYyBfRmllbGRzIGZpZWxkRm9ySWQoaW50IGZpZWxkSWQpIHsKKyAgICByZXR1cm4gX0ZpZWxkcy5maW5kQnlUaHJpZnRJZChmaWVsZElkKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHJlYWQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIGlwcm90KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgc2NoZW1lcy5nZXQoaXByb3QuZ2V0U2NoZW1lKCkpLmdldFNjaGVtZSgpLnJlYWQoaXByb3QsIHRoaXMpOworICB9CisKKyAgcHVibGljIHZvaWQgd3JpdGUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIG9wcm90KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgc2NoZW1lcy5nZXQob3Byb3QuZ2V0U2NoZW1lKCkpLmdldFNjaGVtZSgpLndyaXRlKG9wcm90LCB0aGlzKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigiVG9wb2xvZ3lTdGF0cygiKTsKKyAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKKworICAgIGlmIChpc19zZXRfd2luZG93X3RvX2VtaXR0ZWQoKSkgeworICAgICAgc2IuYXBwZW5kKCJ3aW5kb3dfdG9fZW1pdHRlZDoiKTsKKyAgICAgIGlmICh0aGlzLndpbmRvd190b19lbWl0dGVkID09IG51bGwpIHsKKyAgICAgICAgc2IuYXBwZW5kKCJudWxsIik7CisgICAgICB9IGVsc2UgeworICAgICAgICBzYi5hcHBlbmQodGhpcy53aW5kb3dfdG9fZW1pdHRlZCk7CisgICAgICB9CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0KKyAgICBpZiAoaXNfc2V0X3dpbmRvd190b190cmFuc2ZlcnJlZCgpKSB7CisgICAgICBpZiAoIWZpcnN0KSBzYi5hcHBlbmQoIiwgIik7CisgICAgICBzYi5hcHBlbmQoIndpbmRvd190b190cmFuc2ZlcnJlZDoiKTsKKyAgICAgIGlmICh0aGlzLndpbmRvd190b190cmFuc2ZlcnJlZCA9PSBudWxsKSB7CisgICAgICAgIHNiLmFwcGVuZCgibnVsbCIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2IuYXBwZW5kKHRoaXMud2luZG93X3RvX3RyYW5zZmVycmVkKTsKKyAgICAgIH0KKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfQorICAgIGlmIChpc19zZXRfd2luZG93X3RvX2NvbXBsZXRlX2xhdGVuY2llc19tcygpKSB7CisgICAgICBpZiAoIWZpcnN0KSBzYi5hcHBlbmQoIiwgIik7CisgICAgICBzYi5hcHBlbmQoIndpbmRvd190b19jb21wbGV0ZV9sYXRlbmNpZXNfbXM6Iik7CisgICAgICBpZiAodGhpcy53aW5kb3dfdG9fY29tcGxldGVfbGF0ZW5jaWVzX21zID09IG51bGwpIHsKKyAgICAgICAgc2IuYXBwZW5kKCJudWxsIik7CisgICAgICB9IGVsc2UgeworICAgICAgICBzYi5hcHBlbmQodGhpcy53aW5kb3dfdG9fY29tcGxldGVfbGF0ZW5jaWVzX21zKTsKKyAgICAgIH0KKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfQorICAgIGlmIChpc19zZXRfd2luZG93X3RvX2Fja2VkKCkpIHsKKyAgICAgIGlmICghZmlyc3QpIHNiLmFwcGVuZCgiLCAiKTsKKyAgICAgIHNiLmFwcGVuZCgid2luZG93X3RvX2Fja2VkOiIpOworICAgICAgaWYgKHRoaXMud2luZG93X3RvX2Fja2VkID09IG51bGwpIHsKKyAgICAgICAgc2IuYXBwZW5kKCJudWxsIik7CisgICAgICB9IGVsc2UgeworICAgICAgICBzYi5hcHBlbmQodGhpcy53aW5kb3dfdG9fYWNrZWQpOworICAgICAgfQorICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9CisgICAgaWYgKGlzX3NldF93aW5kb3dfdG9fZmFpbGVkKCkpIHsKKyAgICAgIGlmICghZmlyc3QpIHNiLmFwcGVuZCgiLCAiKTsKKyAgICAgIHNiLmFwcGVuZCgid2luZG93X3RvX2ZhaWxlZDoiKTsKKyAgICAgIGlmICh0aGlzLndpbmRvd190b19mYWlsZWQgPT0gbnVsbCkgeworICAgICAgICBzYi5hcHBlbmQoIm51bGwiKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNiLmFwcGVuZCh0aGlzLndpbmRvd190b19mYWlsZWQpOworICAgICAgfQorICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICB9CisgICAgc2IuYXBwZW5kKCIpIik7CisgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgIH0KKworICBwdWJsaWMgdm9pZCB2YWxpZGF0ZSgpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAvLyBjaGVjayBmb3IgcmVxdWlyZWQgZmllbGRzCisgICAgLy8gY2hlY2sgZm9yIHN1Yi1zdHJ1Y3QgdmFsaWRpdHkKKyAgfQorCisgIHByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgd3JpdGUobmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRDb21wYWN0UHJvdG9jb2wobmV3IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5USU9TdHJlYW1UcmFuc3BvcnQob3V0KSkpOworICAgIH0gY2F0Y2ggKG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24gdGUpIHsKKyAgICAgIHRocm93IG5ldyBqYXZhLmlvLklPRXhjZXB0aW9uKHRlKTsKKyAgICB9CisgIH0KKworICBwcml2YXRlIHZvaWQgcmVhZE9iamVjdChqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtIGluKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgdHJ5IHsKKyAgICAgIHJlYWQobmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRDb21wYWN0UHJvdG9jb2wobmV3IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5USU9TdHJlYW1UcmFuc3BvcnQoaW4pKSk7CisgICAgfSBjYXRjaCAob3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB0ZSkgeworICAgICAgdGhyb3cgbmV3IGphdmEuaW8uSU9FeGNlcHRpb24odGUpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRvcG9sb2d5U3RhdHNTdGFuZGFyZFNjaGVtZUZhY3RvcnkgaW1wbGVtZW50cyBTY2hlbWVGYWN0b3J5IHsKKyAgICBwdWJsaWMgVG9wb2xvZ3lTdGF0c1N0YW5kYXJkU2NoZW1lIGdldFNjaGVtZSgpIHsKKyAgICAgIHJldHVybiBuZXcgVG9wb2xvZ3lTdGF0c1N0YW5kYXJkU2NoZW1lKCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVG9wb2xvZ3lTdGF0c1N0YW5kYXJkU2NoZW1lIGV4dGVuZHMgU3RhbmRhcmRTY2hlbWU8VG9wb2xvZ3lTdGF0cz4geworCisgICAgcHVibGljIHZvaWQgcmVhZChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgaXByb3QsIFRvcG9sb2d5U3RhdHMgc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgc2NoZW1lRmllbGQ7CisgICAgICBpcHJvdC5yZWFkU3RydWN0QmVnaW4oKTsKKyAgICAgIHdoaWxlICh0cnVlKQorICAgICAgeworICAgICAgICBzY2hlbWVGaWVsZCA9IGlwcm90LnJlYWRGaWVsZEJlZ2luKCk7CisgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUT1ApIHsgCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChzY2hlbWVGaWVsZC5pZCkgeworICAgICAgICAgIGNhc2UgMTogLy8gV0lORE9XX1RPX0VNSVRURUQKKyAgICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLk1BUCkgeworICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwMzUyID0gaXByb3QucmVhZE1hcEJlZ2luKCk7CisgICAgICAgICAgICAgICAgc3RydWN0LndpbmRvd190b19lbWl0dGVkID0gbmV3IEhhc2hNYXA8U3RyaW5nLExvbmc+KDIqX21hcDM1Mi5zaXplKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgX2tleTM1MzsKKyAgICAgICAgICAgICAgICBsb25nIF92YWwzNTQ7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgX2kzNTUgPSAwOyBfaTM1NSA8IF9tYXAzNTIuc2l6ZTsgKytfaTM1NSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBfa2V5MzUzID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICAgICAgICAgICAgX3ZhbDM1NCA9IGlwcm90LnJlYWRJNjQoKTsKKyAgICAgICAgICAgICAgICAgIHN0cnVjdC53aW5kb3dfdG9fZW1pdHRlZC5wdXQoX2tleTM1MywgX3ZhbDM1NCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlwcm90LnJlYWRNYXBFbmQoKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBzdHJ1Y3Quc2V0X3dpbmRvd190b19lbWl0dGVkX2lzU2V0KHRydWUpOworICAgICAgICAgICAgfSBlbHNlIHsgCisgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgc2NoZW1lRmllbGQudHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDI6IC8vIFdJTkRPV19UT19UUkFOU0ZFUlJFRAorICAgICAgICAgICAgaWYgKHNjaGVtZUZpZWxkLnR5cGUgPT0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTUFQKSB7CisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwIF9tYXAzNTYgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKTsKKyAgICAgICAgICAgICAgICBzdHJ1Y3Qud2luZG93X3RvX3RyYW5zZmVycmVkID0gbmV3IEhhc2hNYXA8U3RyaW5nLExvbmc+KDIqX21hcDM1Ni5zaXplKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgX2tleTM1NzsKKyAgICAgICAgICAgICAgICBsb25nIF92YWwzNTg7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgX2kzNTkgPSAwOyBfaTM1OSA8IF9tYXAzNTYuc2l6ZTsgKytfaTM1OSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBfa2V5MzU3ID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICAgICAgICAgICAgX3ZhbDM1OCA9IGlwcm90LnJlYWRJNjQoKTsKKyAgICAgICAgICAgICAgICAgIHN0cnVjdC53aW5kb3dfdG9fdHJhbnNmZXJyZWQucHV0KF9rZXkzNTcsIF92YWwzNTgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpcHJvdC5yZWFkTWFwRW5kKCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgc3RydWN0LnNldF93aW5kb3dfdG9fdHJhbnNmZXJyZWRfaXNTZXQodHJ1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeyAKKyAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMzogLy8gV0lORE9XX1RPX0NPTVBMRVRFX0xBVEVOQ0lFU19NUworICAgICAgICAgICAgaWYgKHNjaGVtZUZpZWxkLnR5cGUgPT0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTUFQKSB7CisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwIF9tYXAzNjAgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKTsKKyAgICAgICAgICAgICAgICBzdHJ1Y3Qud2luZG93X3RvX2NvbXBsZXRlX2xhdGVuY2llc19tcyA9IG5ldyBIYXNoTWFwPFN0cmluZyxEb3VibGU+KDIqX21hcDM2MC5zaXplKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgX2tleTM2MTsKKyAgICAgICAgICAgICAgICBkb3VibGUgX3ZhbDM2MjsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBfaTM2MyA9IDA7IF9pMzYzIDwgX21hcDM2MC5zaXplOyArK19pMzYzKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIF9rZXkzNjEgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICBfdmFsMzYyID0gaXByb3QucmVhZERvdWJsZSgpOworICAgICAgICAgICAgICAgICAgc3RydWN0LndpbmRvd190b19jb21wbGV0ZV9sYXRlbmNpZXNfbXMucHV0KF9rZXkzNjEsIF92YWwzNjIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpcHJvdC5yZWFkTWFwRW5kKCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgc3RydWN0LnNldF93aW5kb3dfdG9fY29tcGxldGVfbGF0ZW5jaWVzX21zX2lzU2V0KHRydWUpOworICAgICAgICAgICAgfSBlbHNlIHsgCisgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgc2NoZW1lRmllbGQudHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDQ6IC8vIFdJTkRPV19UT19BQ0tFRAorICAgICAgICAgICAgaWYgKHNjaGVtZUZpZWxkLnR5cGUgPT0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTUFQKSB7CisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwIF9tYXAzNjQgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKTsKKyAgICAgICAgICAgICAgICBzdHJ1Y3Qud2luZG93X3RvX2Fja2VkID0gbmV3IEhhc2hNYXA8U3RyaW5nLExvbmc+KDIqX21hcDM2NC5zaXplKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgX2tleTM2NTsKKyAgICAgICAgICAgICAgICBsb25nIF92YWwzNjY7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgX2kzNjcgPSAwOyBfaTM2NyA8IF9tYXAzNjQuc2l6ZTsgKytfaTM2NykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICBfa2V5MzY1ID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICAgICAgICAgICAgX3ZhbDM2NiA9IGlwcm90LnJlYWRJNjQoKTsKKyAgICAgICAgICAgICAgICAgIHN0cnVjdC53aW5kb3dfdG9fYWNrZWQucHV0KF9rZXkzNjUsIF92YWwzNjYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpcHJvdC5yZWFkTWFwRW5kKCk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgc3RydWN0LnNldF93aW5kb3dfdG9fYWNrZWRfaXNTZXQodHJ1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeyAKKyAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgNTogLy8gV0lORE9XX1RPX0ZBSUxFRAorICAgICAgICAgICAgaWYgKHNjaGVtZUZpZWxkLnR5cGUgPT0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTUFQKSB7CisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwIF9tYXAzNjggPSBpcHJvdC5yZWFkTWFwQmVnaW4oKTsKKyAgICAgICAgICAgICAgICBzdHJ1Y3Qud2luZG93X3RvX2ZhaWxlZCA9IG5ldyBIYXNoTWFwPFN0cmluZyxMb25nPigyKl9tYXAzNjguc2l6ZSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIF9rZXkzNjk7CisgICAgICAgICAgICAgICAgbG9uZyBfdmFsMzcwOworICAgICAgICAgICAgICAgIGZvciAoaW50IF9pMzcxID0gMDsgX2kzNzEgPCBfbWFwMzY4LnNpemU7ICsrX2kzNzEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgX2tleTM2OSA9IGlwcm90LnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgIF92YWwzNzAgPSBpcHJvdC5yZWFkSTY0KCk7CisgICAgICAgICAgICAgICAgICBzdHJ1Y3Qud2luZG93X3RvX2ZhaWxlZC5wdXQoX2tleTM2OSwgX3ZhbDM3MCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlwcm90LnJlYWRNYXBFbmQoKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICBzdHJ1Y3Quc2V0X3dpbmRvd190b19mYWlsZWRfaXNTZXQodHJ1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeyAKKyAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOworICAgICAgICB9CisgICAgICAgIGlwcm90LnJlYWRGaWVsZEVuZCgpOworICAgICAgfQorICAgICAgaXByb3QucmVhZFN0cnVjdEVuZCgpOworICAgICAgc3RydWN0LnZhbGlkYXRlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIG9wcm90LCBUb3BvbG9neVN0YXRzIHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgc3RydWN0LnZhbGlkYXRlKCk7CisKKyAgICAgIG9wcm90LndyaXRlU3RydWN0QmVnaW4oU1RSVUNUX0RFU0MpOworICAgICAgaWYgKHN0cnVjdC53aW5kb3dfdG9fZW1pdHRlZCAhPSBudWxsKSB7CisgICAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X3dpbmRvd190b19lbWl0dGVkKCkpIHsKKyAgICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oV0lORE9XX1RPX0VNSVRURURfRklFTERfREVTQyk7CisgICAgICAgICAgeworICAgICAgICAgICAgb3Byb3Qud3JpdGVNYXBCZWdpbihuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkk2NCwgc3RydWN0LndpbmRvd190b19lbWl0dGVkLnNpemUoKSkpOworICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBMb25nPiBfaXRlcjM3MiA6IHN0cnVjdC53aW5kb3dfdG9fZW1pdHRlZC5lbnRyeVNldCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhfaXRlcjM3Mi5nZXRLZXkoKSk7CisgICAgICAgICAgICAgIG9wcm90LndyaXRlSTY0KF9pdGVyMzcyLmdldFZhbHVlKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3Byb3Qud3JpdGVNYXBFbmQoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LndpbmRvd190b190cmFuc2ZlcnJlZCAhPSBudWxsKSB7CisgICAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X3dpbmRvd190b190cmFuc2ZlcnJlZCgpKSB7CisgICAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKFdJTkRPV19UT19UUkFOU0ZFUlJFRF9GSUVMRF9ERVNDKTsKKyAgICAgICAgICB7CisgICAgICAgICAgICBvcHJvdC53cml0ZU1hcEJlZ2luKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORywgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTY0LCBzdHJ1Y3Qud2luZG93X3RvX3RyYW5zZmVycmVkLnNpemUoKSkpOworICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBMb25nPiBfaXRlcjM3MyA6IHN0cnVjdC53aW5kb3dfdG9fdHJhbnNmZXJyZWQuZW50cnlTZXQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoX2l0ZXIzNzMuZ2V0S2V5KCkpOworICAgICAgICAgICAgICBvcHJvdC53cml0ZUk2NChfaXRlcjM3My5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9wcm90LndyaXRlTWFwRW5kKCk7CisgICAgICAgICAgfQorICAgICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKHN0cnVjdC53aW5kb3dfdG9fY29tcGxldGVfbGF0ZW5jaWVzX21zICE9IG51bGwpIHsKKyAgICAgICAgaWYgKHN0cnVjdC5pc19zZXRfd2luZG93X3RvX2NvbXBsZXRlX2xhdGVuY2llc19tcygpKSB7CisgICAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKFdJTkRPV19UT19DT01QTEVURV9MQVRFTkNJRVNfTVNfRklFTERfREVTQyk7CisgICAgICAgICAgeworICAgICAgICAgICAgb3Byb3Qud3JpdGVNYXBCZWdpbihuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkRPVUJMRSwgc3RydWN0LndpbmRvd190b19jb21wbGV0ZV9sYXRlbmNpZXNfbXMuc2l6ZSgpKSk7CisgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIERvdWJsZT4gX2l0ZXIzNzQgOiBzdHJ1Y3Qud2luZG93X3RvX2NvbXBsZXRlX2xhdGVuY2llc19tcy5lbnRyeVNldCgpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhfaXRlcjM3NC5nZXRLZXkoKSk7CisgICAgICAgICAgICAgIG9wcm90LndyaXRlRG91YmxlKF9pdGVyMzc0LmdldFZhbHVlKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3Byb3Qud3JpdGVNYXBFbmQoKTsKKyAgICAgICAgICB9CisgICAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LndpbmRvd190b19hY2tlZCAhPSBudWxsKSB7CisgICAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X3dpbmRvd190b19hY2tlZCgpKSB7CisgICAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKFdJTkRPV19UT19BQ0tFRF9GSUVMRF9ERVNDKTsKKyAgICAgICAgICB7CisgICAgICAgICAgICBvcHJvdC53cml0ZU1hcEJlZ2luKG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORywgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTY0LCBzdHJ1Y3Qud2luZG93X3RvX2Fja2VkLnNpemUoKSkpOworICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBMb25nPiBfaXRlcjM3NSA6IHN0cnVjdC53aW5kb3dfdG9fYWNrZWQuZW50cnlTZXQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoX2l0ZXIzNzUuZ2V0S2V5KCkpOworICAgICAgICAgICAgICBvcHJvdC53cml0ZUk2NChfaXRlcjM3NS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9wcm90LndyaXRlTWFwRW5kKCk7CisgICAgICAgICAgfQorICAgICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKHN0cnVjdC53aW5kb3dfdG9fZmFpbGVkICE9IG51bGwpIHsKKyAgICAgICAgaWYgKHN0cnVjdC5pc19zZXRfd2luZG93X3RvX2ZhaWxlZCgpKSB7CisgICAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKFdJTkRPV19UT19GQUlMRURfRklFTERfREVTQyk7CisgICAgICAgICAgeworICAgICAgICAgICAgb3Byb3Qud3JpdGVNYXBCZWdpbihuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkk2NCwgc3RydWN0LndpbmRvd190b19mYWlsZWQuc2l6ZSgpKSk7CisgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIExvbmc+IF9pdGVyMzc2IDogc3RydWN0LndpbmRvd190b19mYWlsZWQuZW50cnlTZXQoKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoX2l0ZXIzNzYuZ2V0S2V5KCkpOworICAgICAgICAgICAgICBvcHJvdC53cml0ZUk2NChfaXRlcjM3Ni5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9wcm90LndyaXRlTWFwRW5kKCk7CisgICAgICAgICAgfQorICAgICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgb3Byb3Qud3JpdGVGaWVsZFN0b3AoKTsKKyAgICAgIG9wcm90LndyaXRlU3RydWN0RW5kKCk7CisgICAgfQorCisgIH0KKworICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUb3BvbG9neVN0YXRzVHVwbGVTY2hlbWVGYWN0b3J5IGltcGxlbWVudHMgU2NoZW1lRmFjdG9yeSB7CisgICAgcHVibGljIFRvcG9sb2d5U3RhdHNUdXBsZVNjaGVtZSBnZXRTY2hlbWUoKSB7CisgICAgICByZXR1cm4gbmV3IFRvcG9sb2d5U3RhdHNUdXBsZVNjaGVtZSgpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRvcG9sb2d5U3RhdHNUdXBsZVNjaGVtZSBleHRlbmRzIFR1cGxlU2NoZW1lPFRvcG9sb2d5U3RhdHM+IHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBwcm90LCBUb3BvbG9neVN0YXRzIHN0cnVjdCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgICAgVFR1cGxlUHJvdG9jb2wgb3Byb3QgPSAoVFR1cGxlUHJvdG9jb2wpIHByb3Q7CisgICAgICBCaXRTZXQgb3B0aW9uYWxzID0gbmV3IEJpdFNldCgpOworICAgICAgaWYgKHN0cnVjdC5pc19zZXRfd2luZG93X3RvX2VtaXR0ZWQoKSkgeworICAgICAgICBvcHRpb25hbHMuc2V0KDApOworICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5pc19zZXRfd2luZG93X3RvX3RyYW5zZmVycmVkKCkpIHsKKyAgICAgICAgb3B0aW9uYWxzLnNldCgxKTsKKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X3dpbmRvd190b19jb21wbGV0ZV9sYXRlbmNpZXNfbXMoKSkgeworICAgICAgICBvcHRpb25hbHMuc2V0KDIpOworICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5pc19zZXRfd2luZG93X3RvX2Fja2VkKCkpIHsKKyAgICAgICAgb3B0aW9uYWxzLnNldCgzKTsKKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X3dpbmRvd190b19mYWlsZWQoKSkgeworICAgICAgICBvcHRpb25hbHMuc2V0KDQpOworICAgICAgfQorICAgICAgb3Byb3Qud3JpdGVCaXRTZXQob3B0aW9uYWxzLCA1KTsKKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X3dpbmRvd190b19lbWl0dGVkKCkpIHsKKyAgICAgICAgeworICAgICAgICAgIG9wcm90LndyaXRlSTMyKHN0cnVjdC53aW5kb3dfdG9fZW1pdHRlZC5zaXplKCkpOworICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgTG9uZz4gX2l0ZXIzNzcgOiBzdHJ1Y3Qud2luZG93X3RvX2VtaXR0ZWQuZW50cnlTZXQoKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhfaXRlcjM3Ny5nZXRLZXkoKSk7CisgICAgICAgICAgICBvcHJvdC53cml0ZUk2NChfaXRlcjM3Ny5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X3dpbmRvd190b190cmFuc2ZlcnJlZCgpKSB7CisgICAgICAgIHsKKyAgICAgICAgICBvcHJvdC53cml0ZUkzMihzdHJ1Y3Qud2luZG93X3RvX3RyYW5zZmVycmVkLnNpemUoKSk7CisgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBMb25nPiBfaXRlcjM3OCA6IHN0cnVjdC53aW5kb3dfdG9fdHJhbnNmZXJyZWQuZW50cnlTZXQoKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhfaXRlcjM3OC5nZXRLZXkoKSk7CisgICAgICAgICAgICBvcHJvdC53cml0ZUk2NChfaXRlcjM3OC5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X3dpbmRvd190b19jb21wbGV0ZV9sYXRlbmNpZXNfbXMoKSkgeworICAgICAgICB7CisgICAgICAgICAgb3Byb3Qud3JpdGVJMzIoc3RydWN0LndpbmRvd190b19jb21wbGV0ZV9sYXRlbmNpZXNfbXMuc2l6ZSgpKTsKKyAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIERvdWJsZT4gX2l0ZXIzNzkgOiBzdHJ1Y3Qud2luZG93X3RvX2NvbXBsZXRlX2xhdGVuY2llc19tcy5lbnRyeVNldCgpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKF9pdGVyMzc5LmdldEtleSgpKTsKKyAgICAgICAgICAgIG9wcm90LndyaXRlRG91YmxlKF9pdGVyMzc5LmdldFZhbHVlKCkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5pc19zZXRfd2luZG93X3RvX2Fja2VkKCkpIHsKKyAgICAgICAgeworICAgICAgICAgIG9wcm90LndyaXRlSTMyKHN0cnVjdC53aW5kb3dfdG9fYWNrZWQuc2l6ZSgpKTsKKyAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIExvbmc+IF9pdGVyMzgwIDogc3RydWN0LndpbmRvd190b19hY2tlZC5lbnRyeVNldCgpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKF9pdGVyMzgwLmdldEtleSgpKTsKKyAgICAgICAgICAgIG9wcm90LndyaXRlSTY0KF9pdGVyMzgwLmdldFZhbHVlKCkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5pc19zZXRfd2luZG93X3RvX2ZhaWxlZCgpKSB7CisgICAgICAgIHsKKyAgICAgICAgICBvcHJvdC53cml0ZUkzMihzdHJ1Y3Qud2luZG93X3RvX2ZhaWxlZC5zaXplKCkpOworICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgTG9uZz4gX2l0ZXIzODEgOiBzdHJ1Y3Qud2luZG93X3RvX2ZhaWxlZC5lbnRyeVNldCgpKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKF9pdGVyMzgxLmdldEtleSgpKTsKKyAgICAgICAgICAgIG9wcm90LndyaXRlSTY0KF9pdGVyMzgxLmdldFZhbHVlKCkpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlYWQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIHByb3QsIFRvcG9sb2d5U3RhdHMgc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICBUVHVwbGVQcm90b2NvbCBpcHJvdCA9IChUVHVwbGVQcm90b2NvbCkgcHJvdDsKKyAgICAgIEJpdFNldCBpbmNvbWluZyA9IGlwcm90LnJlYWRCaXRTZXQoNSk7CisgICAgICBpZiAoaW5jb21pbmcuZ2V0KDApKSB7CisgICAgICAgIHsKKyAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwIF9tYXAzODIgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkk2NCwgaXByb3QucmVhZEkzMigpKTsKKyAgICAgICAgICBzdHJ1Y3Qud2luZG93X3RvX2VtaXR0ZWQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsTG9uZz4oMipfbWFwMzgyLnNpemUpOworICAgICAgICAgIFN0cmluZyBfa2V5MzgzOworICAgICAgICAgIGxvbmcgX3ZhbDM4NDsKKyAgICAgICAgICBmb3IgKGludCBfaTM4NSA9IDA7IF9pMzg1IDwgX21hcDM4Mi5zaXplOyArK19pMzg1KQorICAgICAgICAgIHsKKyAgICAgICAgICAgIF9rZXkzODMgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICBfdmFsMzg0ID0gaXByb3QucmVhZEk2NCgpOworICAgICAgICAgICAgc3RydWN0LndpbmRvd190b19lbWl0dGVkLnB1dChfa2V5MzgzLCBfdmFsMzg0KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RydWN0LnNldF93aW5kb3dfdG9fZW1pdHRlZF9pc1NldCh0cnVlKTsKKyAgICAgIH0KKyAgICAgIGlmIChpbmNvbWluZy5nZXQoMSkpIHsKKyAgICAgICAgeworICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAgX21hcDM4NiA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORywgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTY0LCBpcHJvdC5yZWFkSTMyKCkpOworICAgICAgICAgIHN0cnVjdC53aW5kb3dfdG9fdHJhbnNmZXJyZWQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsTG9uZz4oMipfbWFwMzg2LnNpemUpOworICAgICAgICAgIFN0cmluZyBfa2V5Mzg3OworICAgICAgICAgIGxvbmcgX3ZhbDM4ODsKKyAgICAgICAgICBmb3IgKGludCBfaTM4OSA9IDA7IF9pMzg5IDwgX21hcDM4Ni5zaXplOyArK19pMzg5KQorICAgICAgICAgIHsKKyAgICAgICAgICAgIF9rZXkzODcgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICBfdmFsMzg4ID0gaXByb3QucmVhZEk2NCgpOworICAgICAgICAgICAgc3RydWN0LndpbmRvd190b190cmFuc2ZlcnJlZC5wdXQoX2tleTM4NywgX3ZhbDM4OCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN0cnVjdC5zZXRfd2luZG93X3RvX3RyYW5zZmVycmVkX2lzU2V0KHRydWUpOworICAgICAgfQorICAgICAgaWYgKGluY29taW5nLmdldCgyKSkgeworICAgICAgICB7CisgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwMzkwID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5ET1VCTEUsIGlwcm90LnJlYWRJMzIoKSk7CisgICAgICAgICAgc3RydWN0LndpbmRvd190b19jb21wbGV0ZV9sYXRlbmNpZXNfbXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsRG91YmxlPigyKl9tYXAzOTAuc2l6ZSk7CisgICAgICAgICAgU3RyaW5nIF9rZXkzOTE7CisgICAgICAgICAgZG91YmxlIF92YWwzOTI7CisgICAgICAgICAgZm9yIChpbnQgX2kzOTMgPSAwOyBfaTM5MyA8IF9tYXAzOTAuc2l6ZTsgKytfaTM5MykKKyAgICAgICAgICB7CisgICAgICAgICAgICBfa2V5MzkxID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICAgICAgX3ZhbDM5MiA9IGlwcm90LnJlYWREb3VibGUoKTsKKyAgICAgICAgICAgIHN0cnVjdC53aW5kb3dfdG9fY29tcGxldGVfbGF0ZW5jaWVzX21zLnB1dChfa2V5MzkxLCBfdmFsMzkyKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RydWN0LnNldF93aW5kb3dfdG9fY29tcGxldGVfbGF0ZW5jaWVzX21zX2lzU2V0KHRydWUpOworICAgICAgfQorICAgICAgaWYgKGluY29taW5nLmdldCgzKSkgeworICAgICAgICB7CisgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcCBfbWFwMzk0ID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRNYXAob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JNjQsIGlwcm90LnJlYWRJMzIoKSk7CisgICAgICAgICAgc3RydWN0LndpbmRvd190b19hY2tlZCA9IG5ldyBIYXNoTWFwPFN0cmluZyxMb25nPigyKl9tYXAzOTQuc2l6ZSk7CisgICAgICAgICAgU3RyaW5nIF9rZXkzOTU7CisgICAgICAgICAgbG9uZyBfdmFsMzk2OworICAgICAgICAgIGZvciAoaW50IF9pMzk3ID0gMDsgX2kzOTcgPCBfbWFwMzk0LnNpemU7ICsrX2kzOTcpCisgICAgICAgICAgeworICAgICAgICAgICAgX2tleTM5NSA9IGlwcm90LnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgIF92YWwzOTYgPSBpcHJvdC5yZWFkSTY0KCk7CisgICAgICAgICAgICBzdHJ1Y3Qud2luZG93X3RvX2Fja2VkLnB1dChfa2V5Mzk1LCBfdmFsMzk2KTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RydWN0LnNldF93aW5kb3dfdG9fYWNrZWRfaXNTZXQodHJ1ZSk7CisgICAgICB9CisgICAgICBpZiAoaW5jb21pbmcuZ2V0KDQpKSB7CisgICAgICAgIHsKKyAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UTWFwIF9tYXAzOTggPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVE1hcChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkk2NCwgaXByb3QucmVhZEkzMigpKTsKKyAgICAgICAgICBzdHJ1Y3Qud2luZG93X3RvX2ZhaWxlZCA9IG5ldyBIYXNoTWFwPFN0cmluZyxMb25nPigyKl9tYXAzOTguc2l6ZSk7CisgICAgICAgICAgU3RyaW5nIF9rZXkzOTk7CisgICAgICAgICAgbG9uZyBfdmFsNDAwOworICAgICAgICAgIGZvciAoaW50IF9pNDAxID0gMDsgX2k0MDEgPCBfbWFwMzk4LnNpemU7ICsrX2k0MDEpCisgICAgICAgICAgeworICAgICAgICAgICAgX2tleTM5OSA9IGlwcm90LnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICAgIF92YWw0MDAgPSBpcHJvdC5yZWFkSTY0KCk7CisgICAgICAgICAgICBzdHJ1Y3Qud2luZG93X3RvX2ZhaWxlZC5wdXQoX2tleTM5OSwgX3ZhbDQwMCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN0cnVjdC5zZXRfd2luZG93X3RvX2ZhaWxlZF9pc1NldCh0cnVlKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworfQorCmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL1RvcG9sb2d5U3RhdHVzLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL1RvcG9sb2d5U3RhdHVzLmphdmEKaW5kZXggODE4M2FiMi4uMzg2NmE4YyAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9Ub3BvbG9neVN0YXR1cy5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvVG9wb2xvZ3lTdGF0dXMuamF2YQpAQCAtMTYsNyArMTYsNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIC8qKgotICogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4yKQorICogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4zKQogICoKICAqIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkcKICAqICBAZ2VuZXJhdGVkCmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL1RvcG9sb2d5U3VtbWFyeS5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9Ub3BvbG9neVN1bW1hcnkuamF2YQppbmRleCA0ZTZmZjYxLi41Mzg3ZTYyIDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL1RvcG9sb2d5U3VtbWFyeS5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9nZW5lcmF0ZWQvVG9wb2xvZ3lTdW1tYXJ5LmphdmEKQEAgLTE2LDcgKzE2LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAvKioKLSAqIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMikKKyAqIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMykKICAqCiAgKiBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HCiAgKiAgQGdlbmVyYXRlZApAQCAtNTEsNyArNTEsNyBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCiBAU3VwcHJlc3NXYXJuaW5ncyh7ImNhc3QiLCAicmF3dHlwZXMiLCAic2VyaWFsIiwgInVuY2hlY2tlZCJ9KQotQEdlbmVyYXRlZCh2YWx1ZSA9ICJBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjIpIiwgZGF0ZSA9ICIyMDE1LTQtMTciKQorQEdlbmVyYXRlZCh2YWx1ZSA9ICJBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjMpIikKIHB1YmxpYyBjbGFzcyBUb3BvbG9neVN1bW1hcnkgaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZTxUb3BvbG9neVN1bW1hcnksIFRvcG9sb2d5U3VtbWFyeS5fRmllbGRzPiwgamF2YS5pby5TZXJpYWxpemFibGUsIENsb25lYWJsZSwgQ29tcGFyYWJsZTxUb3BvbG9neVN1bW1hcnk+IHsKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdCBTVFJVQ1RfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0KCJUb3BvbG9neVN1bW1hcnkiKTsKIApAQCAtNjUsNiArNjUsMTIgQEAKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIFNDSEVEX1NUQVRVU19GSUVMRF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCgic2NoZWRfc3RhdHVzIiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuU1RSSU5HLCAoc2hvcnQpNTEzKTsKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIE9XTkVSX0ZJRUxEX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkKCJvd25lciIsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUUklORywgKHNob3J0KTUxNCk7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBSRVBMSUNBVElPTl9DT1VOVF9GSUVMRF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCgicmVwbGljYXRpb25fY291bnQiLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5JMzIsIChzaG9ydCk1MTUpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgUkVRVUVTVEVEX01FTU9OSEVBUF9GSUVMRF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCgicmVxdWVzdGVkX21lbW9uaGVhcCIsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkRPVUJMRSwgKHNob3J0KTUyMSk7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBSRVFVRVNURURfTUVNT0ZGSEVBUF9GSUVMRF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCgicmVxdWVzdGVkX21lbW9mZmhlYXAiLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5ET1VCTEUsIChzaG9ydCk1MjIpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgUkVRVUVTVEVEX0NQVV9GSUVMRF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCgicmVxdWVzdGVkX2NwdSIsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkRPVUJMRSwgKHNob3J0KTUyMyk7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBBU1NJR05FRF9NRU1PTkhFQVBfRklFTERfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQoImFzc2lnbmVkX21lbW9uaGVhcCIsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkRPVUJMRSwgKHNob3J0KTUyNCk7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBBU1NJR05FRF9NRU1PRkZIRUFQX0ZJRUxEX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkKCJhc3NpZ25lZF9tZW1vZmZoZWFwIiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuRE9VQkxFLCAoc2hvcnQpNTI1KTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkIEFTU0lHTkVEX0NQVV9GSUVMRF9ERVNDID0gbmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCgiYXNzaWduZWRfY3B1Iiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuRE9VQkxFLCAoc2hvcnQpNTI2KTsKIAogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8Q2xhc3M8PyBleHRlbmRzIElTY2hlbWU+LCBTY2hlbWVGYWN0b3J5PiBzY2hlbWVzID0gbmV3IEhhc2hNYXA8Q2xhc3M8PyBleHRlbmRzIElTY2hlbWU+LCBTY2hlbWVGYWN0b3J5PigpOwogICBzdGF0aWMgewpAQCAtODIsNiArODgsMTIgQEAKICAgcHJpdmF0ZSBTdHJpbmcgc2NoZWRfc3RhdHVzOyAvLyBvcHRpb25hbAogICBwcml2YXRlIFN0cmluZyBvd25lcjsgLy8gb3B0aW9uYWwKICAgcHJpdmF0ZSBpbnQgcmVwbGljYXRpb25fY291bnQ7IC8vIG9wdGlvbmFsCisgIHByaXZhdGUgZG91YmxlIHJlcXVlc3RlZF9tZW1vbmhlYXA7IC8vIG9wdGlvbmFsCisgIHByaXZhdGUgZG91YmxlIHJlcXVlc3RlZF9tZW1vZmZoZWFwOyAvLyBvcHRpb25hbAorICBwcml2YXRlIGRvdWJsZSByZXF1ZXN0ZWRfY3B1OyAvLyBvcHRpb25hbAorICBwcml2YXRlIGRvdWJsZSBhc3NpZ25lZF9tZW1vbmhlYXA7IC8vIG9wdGlvbmFsCisgIHByaXZhdGUgZG91YmxlIGFzc2lnbmVkX21lbW9mZmhlYXA7IC8vIG9wdGlvbmFsCisgIHByaXZhdGUgZG91YmxlIGFzc2lnbmVkX2NwdTsgLy8gb3B0aW9uYWwKIAogICAvKiogVGhlIHNldCBvZiBmaWVsZHMgdGhpcyBzdHJ1Y3QgY29udGFpbnMsIGFsb25nIHdpdGggY29udmVuaWVuY2UgbWV0aG9kcyBmb3IgZmluZGluZyBhbmQgbWFuaXB1bGF0aW5nIHRoZW0uICovCiAgIHB1YmxpYyBlbnVtIF9GaWVsZHMgaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRJZEVudW0gewpAQCAtOTQsNyArMTA2LDEzIEBACiAgICAgU1RBVFVTKChzaG9ydCk3LCAic3RhdHVzIiksCiAgICAgU0NIRURfU1RBVFVTKChzaG9ydCk1MTMsICJzY2hlZF9zdGF0dXMiKSwKICAgICBPV05FUigoc2hvcnQpNTE0LCAib3duZXIiKSwKLSAgICBSRVBMSUNBVElPTl9DT1VOVCgoc2hvcnQpNTE1LCAicmVwbGljYXRpb25fY291bnQiKTsKKyAgICBSRVBMSUNBVElPTl9DT1VOVCgoc2hvcnQpNTE1LCAicmVwbGljYXRpb25fY291bnQiKSwKKyAgICBSRVFVRVNURURfTUVNT05IRUFQKChzaG9ydCk1MjEsICJyZXF1ZXN0ZWRfbWVtb25oZWFwIiksCisgICAgUkVRVUVTVEVEX01FTU9GRkhFQVAoKHNob3J0KTUyMiwgInJlcXVlc3RlZF9tZW1vZmZoZWFwIiksCisgICAgUkVRVUVTVEVEX0NQVSgoc2hvcnQpNTIzLCAicmVxdWVzdGVkX2NwdSIpLAorICAgIEFTU0lHTkVEX01FTU9OSEVBUCgoc2hvcnQpNTI0LCAiYXNzaWduZWRfbWVtb25oZWFwIiksCisgICAgQVNTSUdORURfTUVNT0ZGSEVBUCgoc2hvcnQpNTI1LCAiYXNzaWduZWRfbWVtb2ZmaGVhcCIpLAorICAgIEFTU0lHTkVEX0NQVSgoc2hvcnQpNTI2LCAiYXNzaWduZWRfY3B1Iik7CiAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBfRmllbGRzPiBieU5hbWUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIF9GaWVsZHM+KCk7CiAKQEAgLTEyOSw2ICsxNDcsMTggQEAKICAgICAgICAgICByZXR1cm4gT1dORVI7CiAgICAgICAgIGNhc2UgNTE1OiAvLyBSRVBMSUNBVElPTl9DT1VOVAogICAgICAgICAgIHJldHVybiBSRVBMSUNBVElPTl9DT1VOVDsKKyAgICAgICAgY2FzZSA1MjE6IC8vIFJFUVVFU1RFRF9NRU1PTkhFQVAKKyAgICAgICAgICByZXR1cm4gUkVRVUVTVEVEX01FTU9OSEVBUDsKKyAgICAgICAgY2FzZSA1MjI6IC8vIFJFUVVFU1RFRF9NRU1PRkZIRUFQCisgICAgICAgICAgcmV0dXJuIFJFUVVFU1RFRF9NRU1PRkZIRUFQOworICAgICAgICBjYXNlIDUyMzogLy8gUkVRVUVTVEVEX0NQVQorICAgICAgICAgIHJldHVybiBSRVFVRVNURURfQ1BVOworICAgICAgICBjYXNlIDUyNDogLy8gQVNTSUdORURfTUVNT05IRUFQCisgICAgICAgICAgcmV0dXJuIEFTU0lHTkVEX01FTU9OSEVBUDsKKyAgICAgICAgY2FzZSA1MjU6IC8vIEFTU0lHTkVEX01FTU9GRkhFQVAKKyAgICAgICAgICByZXR1cm4gQVNTSUdORURfTUVNT0ZGSEVBUDsKKyAgICAgICAgY2FzZSA1MjY6IC8vIEFTU0lHTkVEX0NQVQorICAgICAgICAgIHJldHVybiBBU1NJR05FRF9DUFU7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICB9CkBAIC0xNzQsOCArMjA0LDE0IEBACiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBfX05VTV9XT1JLRVJTX0lTU0VUX0lEID0gMjsKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IF9fVVBUSU1FX1NFQ1NfSVNTRVRfSUQgPSAzOwogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgX19SRVBMSUNBVElPTl9DT1VOVF9JU1NFVF9JRCA9IDQ7Ci0gIHByaXZhdGUgYnl0ZSBfX2lzc2V0X2JpdGZpZWxkID0gMDsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgX0ZpZWxkcyBvcHRpb25hbHNbXSA9IHtfRmllbGRzLlNDSEVEX1NUQVRVUyxfRmllbGRzLk9XTkVSLF9GaWVsZHMuUkVQTElDQVRJT05fQ09VTlR9OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgX19SRVFVRVNURURfTUVNT05IRUFQX0lTU0VUX0lEID0gNTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IF9fUkVRVUVTVEVEX01FTU9GRkhFQVBfSVNTRVRfSUQgPSA2OworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgX19SRVFVRVNURURfQ1BVX0lTU0VUX0lEID0gNzsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IF9fQVNTSUdORURfTUVNT05IRUFQX0lTU0VUX0lEID0gODsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IF9fQVNTSUdORURfTUVNT0ZGSEVBUF9JU1NFVF9JRCA9IDk7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBfX0FTU0lHTkVEX0NQVV9JU1NFVF9JRCA9IDEwOworICBwcml2YXRlIHNob3J0IF9faXNzZXRfYml0ZmllbGQgPSAwOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBfRmllbGRzIG9wdGlvbmFsc1tdID0ge19GaWVsZHMuU0NIRURfU1RBVFVTLF9GaWVsZHMuT1dORVIsX0ZpZWxkcy5SRVBMSUNBVElPTl9DT1VOVCxfRmllbGRzLlJFUVVFU1RFRF9NRU1PTkhFQVAsX0ZpZWxkcy5SRVFVRVNURURfTUVNT0ZGSEVBUCxfRmllbGRzLlJFUVVFU1RFRF9DUFUsX0ZpZWxkcy5BU1NJR05FRF9NRU1PTkhFQVAsX0ZpZWxkcy5BU1NJR05FRF9NRU1PRkZIRUFQLF9GaWVsZHMuQVNTSUdORURfQ1BVfTsKICAgcHVibGljIHN0YXRpYyBmaW5hbCBNYXA8X0ZpZWxkcywgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGE+IG1ldGFEYXRhTWFwOwogICBzdGF0aWMgewogICAgIE1hcDxfRmllbGRzLCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YT4gdG1wTWFwID0gbmV3IEVudW1NYXA8X0ZpZWxkcywgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGE+KF9GaWVsZHMuY2xhc3MpOwpAQCAtMTk5LDYgKzIzNSwxOCBAQAogICAgICAgICBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkVmFsdWVNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5TVFJJTkcpKSk7CiAgICAgdG1wTWFwLnB1dChfRmllbGRzLlJFUExJQ0FUSU9OX0NPVU5ULCBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEoInJlcGxpY2F0aW9uX2NvdW50Iiwgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLk9QVElPTkFMLCAKICAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZFZhbHVlTWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuSTMyKSkpOworICAgIHRtcE1hcC5wdXQoX0ZpZWxkcy5SRVFVRVNURURfTUVNT05IRUFQLCBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEoInJlcXVlc3RlZF9tZW1vbmhlYXAiLCBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRSZXF1aXJlbWVudFR5cGUuT1BUSU9OQUwsIAorICAgICAgICBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkVmFsdWVNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5ET1VCTEUpKSk7CisgICAgdG1wTWFwLnB1dChfRmllbGRzLlJFUVVFU1RFRF9NRU1PRkZIRUFQLCBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEoInJlcXVlc3RlZF9tZW1vZmZoZWFwIiwgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLk9QVElPTkFMLCAKKyAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZFZhbHVlTWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuRE9VQkxFKSkpOworICAgIHRtcE1hcC5wdXQoX0ZpZWxkcy5SRVFVRVNURURfQ1BVLCBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEoInJlcXVlc3RlZF9jcHUiLCBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRSZXF1aXJlbWVudFR5cGUuT1BUSU9OQUwsIAorICAgICAgICBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkVmFsdWVNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5ET1VCTEUpKSk7CisgICAgdG1wTWFwLnB1dChfRmllbGRzLkFTU0lHTkVEX01FTU9OSEVBUCwgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhKCJhc3NpZ25lZF9tZW1vbmhlYXAiLCBvcmcuYXBhY2hlLnRocmlmdC5URmllbGRSZXF1aXJlbWVudFR5cGUuT1BUSU9OQUwsIAorICAgICAgICBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkVmFsdWVNZXRhRGF0YShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5ET1VCTEUpKSk7CisgICAgdG1wTWFwLnB1dChfRmllbGRzLkFTU0lHTkVEX01FTU9GRkhFQVAsIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YSgiYXNzaWduZWRfbWVtb2ZmaGVhcCIsIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZFJlcXVpcmVtZW50VHlwZS5PUFRJT05BTCwgCisgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRWYWx1ZU1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkRPVUJMRSkpKTsKKyAgICB0bXBNYXAucHV0KF9GaWVsZHMuQVNTSUdORURfQ1BVLCBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEoImFzc2lnbmVkX2NwdSIsIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZFJlcXVpcmVtZW50VHlwZS5PUFRJT05BTCwgCisgICAgICAgIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRWYWx1ZU1ldGFEYXRhKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkRPVUJMRSkpKTsKICAgICBtZXRhRGF0YU1hcCA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcCh0bXBNYXApOwogICAgIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhLmFkZFN0cnVjdE1ldGFEYXRhTWFwKFRvcG9sb2d5U3VtbWFyeS5jbGFzcywgbWV0YURhdGFNYXApOwogICB9CkBAIC0yNTQsNiArMzAyLDEyIEBACiAgICAgICB0aGlzLm93bmVyID0gb3RoZXIub3duZXI7CiAgICAgfQogICAgIHRoaXMucmVwbGljYXRpb25fY291bnQgPSBvdGhlci5yZXBsaWNhdGlvbl9jb3VudDsKKyAgICB0aGlzLnJlcXVlc3RlZF9tZW1vbmhlYXAgPSBvdGhlci5yZXF1ZXN0ZWRfbWVtb25oZWFwOworICAgIHRoaXMucmVxdWVzdGVkX21lbW9mZmhlYXAgPSBvdGhlci5yZXF1ZXN0ZWRfbWVtb2ZmaGVhcDsKKyAgICB0aGlzLnJlcXVlc3RlZF9jcHUgPSBvdGhlci5yZXF1ZXN0ZWRfY3B1OworICAgIHRoaXMuYXNzaWduZWRfbWVtb25oZWFwID0gb3RoZXIuYXNzaWduZWRfbWVtb25oZWFwOworICAgIHRoaXMuYXNzaWduZWRfbWVtb2ZmaGVhcCA9IG90aGVyLmFzc2lnbmVkX21lbW9mZmhlYXA7CisgICAgdGhpcy5hc3NpZ25lZF9jcHUgPSBvdGhlci5hc3NpZ25lZF9jcHU7CiAgIH0KIAogICBwdWJsaWMgVG9wb2xvZ3lTdW1tYXJ5IGRlZXBDb3B5KCkgewpAQCAtMjc3LDYgKzMzMSwxOCBAQAogICAgIHRoaXMub3duZXIgPSBudWxsOwogICAgIHNldF9yZXBsaWNhdGlvbl9jb3VudF9pc1NldChmYWxzZSk7CiAgICAgdGhpcy5yZXBsaWNhdGlvbl9jb3VudCA9IDA7CisgICAgc2V0X3JlcXVlc3RlZF9tZW1vbmhlYXBfaXNTZXQoZmFsc2UpOworICAgIHRoaXMucmVxdWVzdGVkX21lbW9uaGVhcCA9IDAuMDsKKyAgICBzZXRfcmVxdWVzdGVkX21lbW9mZmhlYXBfaXNTZXQoZmFsc2UpOworICAgIHRoaXMucmVxdWVzdGVkX21lbW9mZmhlYXAgPSAwLjA7CisgICAgc2V0X3JlcXVlc3RlZF9jcHVfaXNTZXQoZmFsc2UpOworICAgIHRoaXMucmVxdWVzdGVkX2NwdSA9IDAuMDsKKyAgICBzZXRfYXNzaWduZWRfbWVtb25oZWFwX2lzU2V0KGZhbHNlKTsKKyAgICB0aGlzLmFzc2lnbmVkX21lbW9uaGVhcCA9IDAuMDsKKyAgICBzZXRfYXNzaWduZWRfbWVtb2ZmaGVhcF9pc1NldChmYWxzZSk7CisgICAgdGhpcy5hc3NpZ25lZF9tZW1vZmZoZWFwID0gMC4wOworICAgIHNldF9hc3NpZ25lZF9jcHVfaXNTZXQoZmFsc2UpOworICAgIHRoaXMuYXNzaWduZWRfY3B1ID0gMC4wOwogICB9CiAKICAgcHVibGljIFN0cmluZyBnZXRfaWQoKSB7CkBAIC01MDQsNiArNTcwLDEzOCBAQAogICAgIF9faXNzZXRfYml0ZmllbGQgPSBFbmNvZGluZ1V0aWxzLnNldEJpdChfX2lzc2V0X2JpdGZpZWxkLCBfX1JFUExJQ0FUSU9OX0NPVU5UX0lTU0VUX0lELCB2YWx1ZSk7CiAgIH0KIAorICBwdWJsaWMgZG91YmxlIGdldF9yZXF1ZXN0ZWRfbWVtb25oZWFwKCkgeworICAgIHJldHVybiB0aGlzLnJlcXVlc3RlZF9tZW1vbmhlYXA7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfcmVxdWVzdGVkX21lbW9uaGVhcChkb3VibGUgcmVxdWVzdGVkX21lbW9uaGVhcCkgeworICAgIHRoaXMucmVxdWVzdGVkX21lbW9uaGVhcCA9IHJlcXVlc3RlZF9tZW1vbmhlYXA7CisgICAgc2V0X3JlcXVlc3RlZF9tZW1vbmhlYXBfaXNTZXQodHJ1ZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB1bnNldF9yZXF1ZXN0ZWRfbWVtb25oZWFwKCkgeworICAgIF9faXNzZXRfYml0ZmllbGQgPSBFbmNvZGluZ1V0aWxzLmNsZWFyQml0KF9faXNzZXRfYml0ZmllbGQsIF9fUkVRVUVTVEVEX01FTU9OSEVBUF9JU1NFVF9JRCk7CisgIH0KKworICAvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkIHJlcXVlc3RlZF9tZW1vbmhlYXAgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgIHB1YmxpYyBib29sZWFuIGlzX3NldF9yZXF1ZXN0ZWRfbWVtb25oZWFwKCkgeworICAgIHJldHVybiBFbmNvZGluZ1V0aWxzLnRlc3RCaXQoX19pc3NldF9iaXRmaWVsZCwgX19SRVFVRVNURURfTUVNT05IRUFQX0lTU0VUX0lEKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF9yZXF1ZXN0ZWRfbWVtb25oZWFwX2lzU2V0KGJvb2xlYW4gdmFsdWUpIHsKKyAgICBfX2lzc2V0X2JpdGZpZWxkID0gRW5jb2RpbmdVdGlscy5zZXRCaXQoX19pc3NldF9iaXRmaWVsZCwgX19SRVFVRVNURURfTUVNT05IRUFQX0lTU0VUX0lELCB2YWx1ZSk7CisgIH0KKworICBwdWJsaWMgZG91YmxlIGdldF9yZXF1ZXN0ZWRfbWVtb2ZmaGVhcCgpIHsKKyAgICByZXR1cm4gdGhpcy5yZXF1ZXN0ZWRfbWVtb2ZmaGVhcDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF9yZXF1ZXN0ZWRfbWVtb2ZmaGVhcChkb3VibGUgcmVxdWVzdGVkX21lbW9mZmhlYXApIHsKKyAgICB0aGlzLnJlcXVlc3RlZF9tZW1vZmZoZWFwID0gcmVxdWVzdGVkX21lbW9mZmhlYXA7CisgICAgc2V0X3JlcXVlc3RlZF9tZW1vZmZoZWFwX2lzU2V0KHRydWUpOworICB9CisKKyAgcHVibGljIHZvaWQgdW5zZXRfcmVxdWVzdGVkX21lbW9mZmhlYXAoKSB7CisgICAgX19pc3NldF9iaXRmaWVsZCA9IEVuY29kaW5nVXRpbHMuY2xlYXJCaXQoX19pc3NldF9iaXRmaWVsZCwgX19SRVFVRVNURURfTUVNT0ZGSEVBUF9JU1NFVF9JRCk7CisgIH0KKworICAvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkIHJlcXVlc3RlZF9tZW1vZmZoZWFwIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLworICBwdWJsaWMgYm9vbGVhbiBpc19zZXRfcmVxdWVzdGVkX21lbW9mZmhlYXAoKSB7CisgICAgcmV0dXJuIEVuY29kaW5nVXRpbHMudGVzdEJpdChfX2lzc2V0X2JpdGZpZWxkLCBfX1JFUVVFU1RFRF9NRU1PRkZIRUFQX0lTU0VUX0lEKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF9yZXF1ZXN0ZWRfbWVtb2ZmaGVhcF9pc1NldChib29sZWFuIHZhbHVlKSB7CisgICAgX19pc3NldF9iaXRmaWVsZCA9IEVuY29kaW5nVXRpbHMuc2V0Qml0KF9faXNzZXRfYml0ZmllbGQsIF9fUkVRVUVTVEVEX01FTU9GRkhFQVBfSVNTRVRfSUQsIHZhbHVlKTsKKyAgfQorCisgIHB1YmxpYyBkb3VibGUgZ2V0X3JlcXVlc3RlZF9jcHUoKSB7CisgICAgcmV0dXJuIHRoaXMucmVxdWVzdGVkX2NwdTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF9yZXF1ZXN0ZWRfY3B1KGRvdWJsZSByZXF1ZXN0ZWRfY3B1KSB7CisgICAgdGhpcy5yZXF1ZXN0ZWRfY3B1ID0gcmVxdWVzdGVkX2NwdTsKKyAgICBzZXRfcmVxdWVzdGVkX2NwdV9pc1NldCh0cnVlKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHVuc2V0X3JlcXVlc3RlZF9jcHUoKSB7CisgICAgX19pc3NldF9iaXRmaWVsZCA9IEVuY29kaW5nVXRpbHMuY2xlYXJCaXQoX19pc3NldF9iaXRmaWVsZCwgX19SRVFVRVNURURfQ1BVX0lTU0VUX0lEKTsKKyAgfQorCisgIC8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgcmVxdWVzdGVkX2NwdSBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNfc2V0X3JlcXVlc3RlZF9jcHUoKSB7CisgICAgcmV0dXJuIEVuY29kaW5nVXRpbHMudGVzdEJpdChfX2lzc2V0X2JpdGZpZWxkLCBfX1JFUVVFU1RFRF9DUFVfSVNTRVRfSUQpOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X3JlcXVlc3RlZF9jcHVfaXNTZXQoYm9vbGVhbiB2YWx1ZSkgeworICAgIF9faXNzZXRfYml0ZmllbGQgPSBFbmNvZGluZ1V0aWxzLnNldEJpdChfX2lzc2V0X2JpdGZpZWxkLCBfX1JFUVVFU1RFRF9DUFVfSVNTRVRfSUQsIHZhbHVlKTsKKyAgfQorCisgIHB1YmxpYyBkb3VibGUgZ2V0X2Fzc2lnbmVkX21lbW9uaGVhcCgpIHsKKyAgICByZXR1cm4gdGhpcy5hc3NpZ25lZF9tZW1vbmhlYXA7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfYXNzaWduZWRfbWVtb25oZWFwKGRvdWJsZSBhc3NpZ25lZF9tZW1vbmhlYXApIHsKKyAgICB0aGlzLmFzc2lnbmVkX21lbW9uaGVhcCA9IGFzc2lnbmVkX21lbW9uaGVhcDsKKyAgICBzZXRfYXNzaWduZWRfbWVtb25oZWFwX2lzU2V0KHRydWUpOworICB9CisKKyAgcHVibGljIHZvaWQgdW5zZXRfYXNzaWduZWRfbWVtb25oZWFwKCkgeworICAgIF9faXNzZXRfYml0ZmllbGQgPSBFbmNvZGluZ1V0aWxzLmNsZWFyQml0KF9faXNzZXRfYml0ZmllbGQsIF9fQVNTSUdORURfTUVNT05IRUFQX0lTU0VUX0lEKTsKKyAgfQorCisgIC8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgYXNzaWduZWRfbWVtb25oZWFwIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLworICBwdWJsaWMgYm9vbGVhbiBpc19zZXRfYXNzaWduZWRfbWVtb25oZWFwKCkgeworICAgIHJldHVybiBFbmNvZGluZ1V0aWxzLnRlc3RCaXQoX19pc3NldF9iaXRmaWVsZCwgX19BU1NJR05FRF9NRU1PTkhFQVBfSVNTRVRfSUQpOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X2Fzc2lnbmVkX21lbW9uaGVhcF9pc1NldChib29sZWFuIHZhbHVlKSB7CisgICAgX19pc3NldF9iaXRmaWVsZCA9IEVuY29kaW5nVXRpbHMuc2V0Qml0KF9faXNzZXRfYml0ZmllbGQsIF9fQVNTSUdORURfTUVNT05IRUFQX0lTU0VUX0lELCB2YWx1ZSk7CisgIH0KKworICBwdWJsaWMgZG91YmxlIGdldF9hc3NpZ25lZF9tZW1vZmZoZWFwKCkgeworICAgIHJldHVybiB0aGlzLmFzc2lnbmVkX21lbW9mZmhlYXA7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfYXNzaWduZWRfbWVtb2ZmaGVhcChkb3VibGUgYXNzaWduZWRfbWVtb2ZmaGVhcCkgeworICAgIHRoaXMuYXNzaWduZWRfbWVtb2ZmaGVhcCA9IGFzc2lnbmVkX21lbW9mZmhlYXA7CisgICAgc2V0X2Fzc2lnbmVkX21lbW9mZmhlYXBfaXNTZXQodHJ1ZSk7CisgIH0KKworICBwdWJsaWMgdm9pZCB1bnNldF9hc3NpZ25lZF9tZW1vZmZoZWFwKCkgeworICAgIF9faXNzZXRfYml0ZmllbGQgPSBFbmNvZGluZ1V0aWxzLmNsZWFyQml0KF9faXNzZXRfYml0ZmllbGQsIF9fQVNTSUdORURfTUVNT0ZGSEVBUF9JU1NFVF9JRCk7CisgIH0KKworICAvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkIGFzc2lnbmVkX21lbW9mZmhlYXAgaXMgc2V0IChoYXMgYmVlbiBhc3NpZ25lZCBhIHZhbHVlKSBhbmQgZmFsc2Ugb3RoZXJ3aXNlICovCisgIHB1YmxpYyBib29sZWFuIGlzX3NldF9hc3NpZ25lZF9tZW1vZmZoZWFwKCkgeworICAgIHJldHVybiBFbmNvZGluZ1V0aWxzLnRlc3RCaXQoX19pc3NldF9iaXRmaWVsZCwgX19BU1NJR05FRF9NRU1PRkZIRUFQX0lTU0VUX0lEKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF9hc3NpZ25lZF9tZW1vZmZoZWFwX2lzU2V0KGJvb2xlYW4gdmFsdWUpIHsKKyAgICBfX2lzc2V0X2JpdGZpZWxkID0gRW5jb2RpbmdVdGlscy5zZXRCaXQoX19pc3NldF9iaXRmaWVsZCwgX19BU1NJR05FRF9NRU1PRkZIRUFQX0lTU0VUX0lELCB2YWx1ZSk7CisgIH0KKworICBwdWJsaWMgZG91YmxlIGdldF9hc3NpZ25lZF9jcHUoKSB7CisgICAgcmV0dXJuIHRoaXMuYXNzaWduZWRfY3B1OworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X2Fzc2lnbmVkX2NwdShkb3VibGUgYXNzaWduZWRfY3B1KSB7CisgICAgdGhpcy5hc3NpZ25lZF9jcHUgPSBhc3NpZ25lZF9jcHU7CisgICAgc2V0X2Fzc2lnbmVkX2NwdV9pc1NldCh0cnVlKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHVuc2V0X2Fzc2lnbmVkX2NwdSgpIHsKKyAgICBfX2lzc2V0X2JpdGZpZWxkID0gRW5jb2RpbmdVdGlscy5jbGVhckJpdChfX2lzc2V0X2JpdGZpZWxkLCBfX0FTU0lHTkVEX0NQVV9JU1NFVF9JRCk7CisgIH0KKworICAvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkIGFzc2lnbmVkX2NwdSBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNfc2V0X2Fzc2lnbmVkX2NwdSgpIHsKKyAgICByZXR1cm4gRW5jb2RpbmdVdGlscy50ZXN0Qml0KF9faXNzZXRfYml0ZmllbGQsIF9fQVNTSUdORURfQ1BVX0lTU0VUX0lEKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF9hc3NpZ25lZF9jcHVfaXNTZXQoYm9vbGVhbiB2YWx1ZSkgeworICAgIF9faXNzZXRfYml0ZmllbGQgPSBFbmNvZGluZ1V0aWxzLnNldEJpdChfX2lzc2V0X2JpdGZpZWxkLCBfX0FTU0lHTkVEX0NQVV9JU1NFVF9JRCwgdmFsdWUpOworICB9CisKICAgcHVibGljIHZvaWQgc2V0RmllbGRWYWx1ZShfRmllbGRzIGZpZWxkLCBPYmplY3QgdmFsdWUpIHsKICAgICBzd2l0Y2ggKGZpZWxkKSB7CiAgICAgY2FzZSBJRDoKQEAgLTU4Niw2ICs3ODQsNTQgQEAKICAgICAgIH0KICAgICAgIGJyZWFrOwogCisgICAgY2FzZSBSRVFVRVNURURfTUVNT05IRUFQOgorICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgdW5zZXRfcmVxdWVzdGVkX21lbW9uaGVhcCgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2V0X3JlcXVlc3RlZF9tZW1vbmhlYXAoKERvdWJsZSl2YWx1ZSk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgUkVRVUVTVEVEX01FTU9GRkhFQVA6CisgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICB1bnNldF9yZXF1ZXN0ZWRfbWVtb2ZmaGVhcCgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2V0X3JlcXVlc3RlZF9tZW1vZmZoZWFwKChEb3VibGUpdmFsdWUpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFJFUVVFU1RFRF9DUFU6CisgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICB1bnNldF9yZXF1ZXN0ZWRfY3B1KCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzZXRfcmVxdWVzdGVkX2NwdSgoRG91YmxlKXZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBBU1NJR05FRF9NRU1PTkhFQVA6CisgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICB1bnNldF9hc3NpZ25lZF9tZW1vbmhlYXAoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNldF9hc3NpZ25lZF9tZW1vbmhlYXAoKERvdWJsZSl2YWx1ZSk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgQVNTSUdORURfTUVNT0ZGSEVBUDoKKyAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgIHVuc2V0X2Fzc2lnbmVkX21lbW9mZmhlYXAoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNldF9hc3NpZ25lZF9tZW1vZmZoZWFwKChEb3VibGUpdmFsdWUpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEFTU0lHTkVEX0NQVToKKyAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgIHVuc2V0X2Fzc2lnbmVkX2NwdSgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2V0X2Fzc2lnbmVkX2NwdSgoRG91YmxlKXZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCiAgICAgfQogICB9CiAKQEAgLTU5OCwxNiArODQ0LDE2IEBACiAgICAgICByZXR1cm4gZ2V0X25hbWUoKTsKIAogICAgIGNhc2UgTlVNX1RBU0tTOgotICAgICAgcmV0dXJuIEludGVnZXIudmFsdWVPZihnZXRfbnVtX3Rhc2tzKCkpOworICAgICAgcmV0dXJuIGdldF9udW1fdGFza3MoKTsKIAogICAgIGNhc2UgTlVNX0VYRUNVVE9SUzoKLSAgICAgIHJldHVybiBJbnRlZ2VyLnZhbHVlT2YoZ2V0X251bV9leGVjdXRvcnMoKSk7CisgICAgICByZXR1cm4gZ2V0X251bV9leGVjdXRvcnMoKTsKIAogICAgIGNhc2UgTlVNX1dPUktFUlM6Ci0gICAgICByZXR1cm4gSW50ZWdlci52YWx1ZU9mKGdldF9udW1fd29ya2VycygpKTsKKyAgICAgIHJldHVybiBnZXRfbnVtX3dvcmtlcnMoKTsKIAogICAgIGNhc2UgVVBUSU1FX1NFQ1M6Ci0gICAgICByZXR1cm4gSW50ZWdlci52YWx1ZU9mKGdldF91cHRpbWVfc2VjcygpKTsKKyAgICAgIHJldHVybiBnZXRfdXB0aW1lX3NlY3MoKTsKIAogICAgIGNhc2UgU1RBVFVTOgogICAgICAgcmV0dXJuIGdldF9zdGF0dXMoKTsKQEAgLTYxOSw3ICs4NjUsMjUgQEAKICAgICAgIHJldHVybiBnZXRfb3duZXIoKTsKIAogICAgIGNhc2UgUkVQTElDQVRJT05fQ09VTlQ6Ci0gICAgICByZXR1cm4gSW50ZWdlci52YWx1ZU9mKGdldF9yZXBsaWNhdGlvbl9jb3VudCgpKTsKKyAgICAgIHJldHVybiBnZXRfcmVwbGljYXRpb25fY291bnQoKTsKKworICAgIGNhc2UgUkVRVUVTVEVEX01FTU9OSEVBUDoKKyAgICAgIHJldHVybiBnZXRfcmVxdWVzdGVkX21lbW9uaGVhcCgpOworCisgICAgY2FzZSBSRVFVRVNURURfTUVNT0ZGSEVBUDoKKyAgICAgIHJldHVybiBnZXRfcmVxdWVzdGVkX21lbW9mZmhlYXAoKTsKKworICAgIGNhc2UgUkVRVUVTVEVEX0NQVToKKyAgICAgIHJldHVybiBnZXRfcmVxdWVzdGVkX2NwdSgpOworCisgICAgY2FzZSBBU1NJR05FRF9NRU1PTkhFQVA6CisgICAgICByZXR1cm4gZ2V0X2Fzc2lnbmVkX21lbW9uaGVhcCgpOworCisgICAgY2FzZSBBU1NJR05FRF9NRU1PRkZIRUFQOgorICAgICAgcmV0dXJuIGdldF9hc3NpZ25lZF9tZW1vZmZoZWFwKCk7CisKKyAgICBjYXNlIEFTU0lHTkVEX0NQVToKKyAgICAgIHJldHVybiBnZXRfYXNzaWduZWRfY3B1KCk7CiAKICAgICB9CiAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOwpAQCAtNjUyLDYgKzkxNiwxOCBAQAogICAgICAgcmV0dXJuIGlzX3NldF9vd25lcigpOwogICAgIGNhc2UgUkVQTElDQVRJT05fQ09VTlQ6CiAgICAgICByZXR1cm4gaXNfc2V0X3JlcGxpY2F0aW9uX2NvdW50KCk7CisgICAgY2FzZSBSRVFVRVNURURfTUVNT05IRUFQOgorICAgICAgcmV0dXJuIGlzX3NldF9yZXF1ZXN0ZWRfbWVtb25oZWFwKCk7CisgICAgY2FzZSBSRVFVRVNURURfTUVNT0ZGSEVBUDoKKyAgICAgIHJldHVybiBpc19zZXRfcmVxdWVzdGVkX21lbW9mZmhlYXAoKTsKKyAgICBjYXNlIFJFUVVFU1RFRF9DUFU6CisgICAgICByZXR1cm4gaXNfc2V0X3JlcXVlc3RlZF9jcHUoKTsKKyAgICBjYXNlIEFTU0lHTkVEX01FTU9OSEVBUDoKKyAgICAgIHJldHVybiBpc19zZXRfYXNzaWduZWRfbWVtb25oZWFwKCk7CisgICAgY2FzZSBBU1NJR05FRF9NRU1PRkZIRUFQOgorICAgICAgcmV0dXJuIGlzX3NldF9hc3NpZ25lZF9tZW1vZmZoZWFwKCk7CisgICAgY2FzZSBBU1NJR05FRF9DUFU6CisgICAgICByZXR1cm4gaXNfc2V0X2Fzc2lnbmVkX2NwdSgpOwogICAgIH0KICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CiAgIH0KQEAgLTc1OSw2ICsxMDM1LDYwIEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKKyAgICBib29sZWFuIHRoaXNfcHJlc2VudF9yZXF1ZXN0ZWRfbWVtb25oZWFwID0gdHJ1ZSAmJiB0aGlzLmlzX3NldF9yZXF1ZXN0ZWRfbWVtb25oZWFwKCk7CisgICAgYm9vbGVhbiB0aGF0X3ByZXNlbnRfcmVxdWVzdGVkX21lbW9uaGVhcCA9IHRydWUgJiYgdGhhdC5pc19zZXRfcmVxdWVzdGVkX21lbW9uaGVhcCgpOworICAgIGlmICh0aGlzX3ByZXNlbnRfcmVxdWVzdGVkX21lbW9uaGVhcCB8fCB0aGF0X3ByZXNlbnRfcmVxdWVzdGVkX21lbW9uaGVhcCkgeworICAgICAgaWYgKCEodGhpc19wcmVzZW50X3JlcXVlc3RlZF9tZW1vbmhlYXAgJiYgdGhhdF9wcmVzZW50X3JlcXVlc3RlZF9tZW1vbmhlYXApKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBpZiAodGhpcy5yZXF1ZXN0ZWRfbWVtb25oZWFwICE9IHRoYXQucmVxdWVzdGVkX21lbW9uaGVhcCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2xlYW4gdGhpc19wcmVzZW50X3JlcXVlc3RlZF9tZW1vZmZoZWFwID0gdHJ1ZSAmJiB0aGlzLmlzX3NldF9yZXF1ZXN0ZWRfbWVtb2ZmaGVhcCgpOworICAgIGJvb2xlYW4gdGhhdF9wcmVzZW50X3JlcXVlc3RlZF9tZW1vZmZoZWFwID0gdHJ1ZSAmJiB0aGF0LmlzX3NldF9yZXF1ZXN0ZWRfbWVtb2ZmaGVhcCgpOworICAgIGlmICh0aGlzX3ByZXNlbnRfcmVxdWVzdGVkX21lbW9mZmhlYXAgfHwgdGhhdF9wcmVzZW50X3JlcXVlc3RlZF9tZW1vZmZoZWFwKSB7CisgICAgICBpZiAoISh0aGlzX3ByZXNlbnRfcmVxdWVzdGVkX21lbW9mZmhlYXAgJiYgdGhhdF9wcmVzZW50X3JlcXVlc3RlZF9tZW1vZmZoZWFwKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKHRoaXMucmVxdWVzdGVkX21lbW9mZmhlYXAgIT0gdGhhdC5yZXF1ZXN0ZWRfbWVtb2ZmaGVhcCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2xlYW4gdGhpc19wcmVzZW50X3JlcXVlc3RlZF9jcHUgPSB0cnVlICYmIHRoaXMuaXNfc2V0X3JlcXVlc3RlZF9jcHUoKTsKKyAgICBib29sZWFuIHRoYXRfcHJlc2VudF9yZXF1ZXN0ZWRfY3B1ID0gdHJ1ZSAmJiB0aGF0LmlzX3NldF9yZXF1ZXN0ZWRfY3B1KCk7CisgICAgaWYgKHRoaXNfcHJlc2VudF9yZXF1ZXN0ZWRfY3B1IHx8IHRoYXRfcHJlc2VudF9yZXF1ZXN0ZWRfY3B1KSB7CisgICAgICBpZiAoISh0aGlzX3ByZXNlbnRfcmVxdWVzdGVkX2NwdSAmJiB0aGF0X3ByZXNlbnRfcmVxdWVzdGVkX2NwdSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGlmICh0aGlzLnJlcXVlc3RlZF9jcHUgIT0gdGhhdC5yZXF1ZXN0ZWRfY3B1KQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbGVhbiB0aGlzX3ByZXNlbnRfYXNzaWduZWRfbWVtb25oZWFwID0gdHJ1ZSAmJiB0aGlzLmlzX3NldF9hc3NpZ25lZF9tZW1vbmhlYXAoKTsKKyAgICBib29sZWFuIHRoYXRfcHJlc2VudF9hc3NpZ25lZF9tZW1vbmhlYXAgPSB0cnVlICYmIHRoYXQuaXNfc2V0X2Fzc2lnbmVkX21lbW9uaGVhcCgpOworICAgIGlmICh0aGlzX3ByZXNlbnRfYXNzaWduZWRfbWVtb25oZWFwIHx8IHRoYXRfcHJlc2VudF9hc3NpZ25lZF9tZW1vbmhlYXApIHsKKyAgICAgIGlmICghKHRoaXNfcHJlc2VudF9hc3NpZ25lZF9tZW1vbmhlYXAgJiYgdGhhdF9wcmVzZW50X2Fzc2lnbmVkX21lbW9uaGVhcCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGlmICh0aGlzLmFzc2lnbmVkX21lbW9uaGVhcCAhPSB0aGF0LmFzc2lnbmVkX21lbW9uaGVhcCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2xlYW4gdGhpc19wcmVzZW50X2Fzc2lnbmVkX21lbW9mZmhlYXAgPSB0cnVlICYmIHRoaXMuaXNfc2V0X2Fzc2lnbmVkX21lbW9mZmhlYXAoKTsKKyAgICBib29sZWFuIHRoYXRfcHJlc2VudF9hc3NpZ25lZF9tZW1vZmZoZWFwID0gdHJ1ZSAmJiB0aGF0LmlzX3NldF9hc3NpZ25lZF9tZW1vZmZoZWFwKCk7CisgICAgaWYgKHRoaXNfcHJlc2VudF9hc3NpZ25lZF9tZW1vZmZoZWFwIHx8IHRoYXRfcHJlc2VudF9hc3NpZ25lZF9tZW1vZmZoZWFwKSB7CisgICAgICBpZiAoISh0aGlzX3ByZXNlbnRfYXNzaWduZWRfbWVtb2ZmaGVhcCAmJiB0aGF0X3ByZXNlbnRfYXNzaWduZWRfbWVtb2ZmaGVhcCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGlmICh0aGlzLmFzc2lnbmVkX21lbW9mZmhlYXAgIT0gdGhhdC5hc3NpZ25lZF9tZW1vZmZoZWFwKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbGVhbiB0aGlzX3ByZXNlbnRfYXNzaWduZWRfY3B1ID0gdHJ1ZSAmJiB0aGlzLmlzX3NldF9hc3NpZ25lZF9jcHUoKTsKKyAgICBib29sZWFuIHRoYXRfcHJlc2VudF9hc3NpZ25lZF9jcHUgPSB0cnVlICYmIHRoYXQuaXNfc2V0X2Fzc2lnbmVkX2NwdSgpOworICAgIGlmICh0aGlzX3ByZXNlbnRfYXNzaWduZWRfY3B1IHx8IHRoYXRfcHJlc2VudF9hc3NpZ25lZF9jcHUpIHsKKyAgICAgIGlmICghKHRoaXNfcHJlc2VudF9hc3NpZ25lZF9jcHUgJiYgdGhhdF9wcmVzZW50X2Fzc2lnbmVkX2NwdSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGlmICh0aGlzLmFzc2lnbmVkX2NwdSAhPSB0aGF0LmFzc2lnbmVkX2NwdSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKwogICAgIHJldHVybiB0cnVlOwogICB9CiAKQEAgLTgxNiw2ICsxMTQ2LDM2IEBACiAgICAgaWYgKHByZXNlbnRfcmVwbGljYXRpb25fY291bnQpCiAgICAgICBsaXN0LmFkZChyZXBsaWNhdGlvbl9jb3VudCk7CiAKKyAgICBib29sZWFuIHByZXNlbnRfcmVxdWVzdGVkX21lbW9uaGVhcCA9IHRydWUgJiYgKGlzX3NldF9yZXF1ZXN0ZWRfbWVtb25oZWFwKCkpOworICAgIGxpc3QuYWRkKHByZXNlbnRfcmVxdWVzdGVkX21lbW9uaGVhcCk7CisgICAgaWYgKHByZXNlbnRfcmVxdWVzdGVkX21lbW9uaGVhcCkKKyAgICAgIGxpc3QuYWRkKHJlcXVlc3RlZF9tZW1vbmhlYXApOworCisgICAgYm9vbGVhbiBwcmVzZW50X3JlcXVlc3RlZF9tZW1vZmZoZWFwID0gdHJ1ZSAmJiAoaXNfc2V0X3JlcXVlc3RlZF9tZW1vZmZoZWFwKCkpOworICAgIGxpc3QuYWRkKHByZXNlbnRfcmVxdWVzdGVkX21lbW9mZmhlYXApOworICAgIGlmIChwcmVzZW50X3JlcXVlc3RlZF9tZW1vZmZoZWFwKQorICAgICAgbGlzdC5hZGQocmVxdWVzdGVkX21lbW9mZmhlYXApOworCisgICAgYm9vbGVhbiBwcmVzZW50X3JlcXVlc3RlZF9jcHUgPSB0cnVlICYmIChpc19zZXRfcmVxdWVzdGVkX2NwdSgpKTsKKyAgICBsaXN0LmFkZChwcmVzZW50X3JlcXVlc3RlZF9jcHUpOworICAgIGlmIChwcmVzZW50X3JlcXVlc3RlZF9jcHUpCisgICAgICBsaXN0LmFkZChyZXF1ZXN0ZWRfY3B1KTsKKworICAgIGJvb2xlYW4gcHJlc2VudF9hc3NpZ25lZF9tZW1vbmhlYXAgPSB0cnVlICYmIChpc19zZXRfYXNzaWduZWRfbWVtb25oZWFwKCkpOworICAgIGxpc3QuYWRkKHByZXNlbnRfYXNzaWduZWRfbWVtb25oZWFwKTsKKyAgICBpZiAocHJlc2VudF9hc3NpZ25lZF9tZW1vbmhlYXApCisgICAgICBsaXN0LmFkZChhc3NpZ25lZF9tZW1vbmhlYXApOworCisgICAgYm9vbGVhbiBwcmVzZW50X2Fzc2lnbmVkX21lbW9mZmhlYXAgPSB0cnVlICYmIChpc19zZXRfYXNzaWduZWRfbWVtb2ZmaGVhcCgpKTsKKyAgICBsaXN0LmFkZChwcmVzZW50X2Fzc2lnbmVkX21lbW9mZmhlYXApOworICAgIGlmIChwcmVzZW50X2Fzc2lnbmVkX21lbW9mZmhlYXApCisgICAgICBsaXN0LmFkZChhc3NpZ25lZF9tZW1vZmZoZWFwKTsKKworICAgIGJvb2xlYW4gcHJlc2VudF9hc3NpZ25lZF9jcHUgPSB0cnVlICYmIChpc19zZXRfYXNzaWduZWRfY3B1KCkpOworICAgIGxpc3QuYWRkKHByZXNlbnRfYXNzaWduZWRfY3B1KTsKKyAgICBpZiAocHJlc2VudF9hc3NpZ25lZF9jcHUpCisgICAgICBsaXN0LmFkZChhc3NpZ25lZF9jcHUpOworCiAgICAgcmV0dXJuIGxpc3QuaGFzaENvZGUoKTsKICAgfQogCkBAIC05MjcsNiArMTI4Nyw2NiBAQAogICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CiAgICAgICB9CiAgICAgfQorICAgIGxhc3RDb21wYXJpc29uID0gQm9vbGVhbi52YWx1ZU9mKGlzX3NldF9yZXF1ZXN0ZWRfbWVtb25oZWFwKCkpLmNvbXBhcmVUbyhvdGhlci5pc19zZXRfcmVxdWVzdGVkX21lbW9uaGVhcCgpKTsKKyAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgIH0KKyAgICBpZiAoaXNfc2V0X3JlcXVlc3RlZF9tZW1vbmhlYXAoKSkgeworICAgICAgbGFzdENvbXBhcmlzb24gPSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy5yZXF1ZXN0ZWRfbWVtb25oZWFwLCBvdGhlci5yZXF1ZXN0ZWRfbWVtb25oZWFwKTsKKyAgICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICAgIH0KKyAgICB9CisgICAgbGFzdENvbXBhcmlzb24gPSBCb29sZWFuLnZhbHVlT2YoaXNfc2V0X3JlcXVlc3RlZF9tZW1vZmZoZWFwKCkpLmNvbXBhcmVUbyhvdGhlci5pc19zZXRfcmVxdWVzdGVkX21lbW9mZmhlYXAoKSk7CisgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICB9CisgICAgaWYgKGlzX3NldF9yZXF1ZXN0ZWRfbWVtb2ZmaGVhcCgpKSB7CisgICAgICBsYXN0Q29tcGFyaXNvbiA9IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvbXBhcmVUbyh0aGlzLnJlcXVlc3RlZF9tZW1vZmZoZWFwLCBvdGhlci5yZXF1ZXN0ZWRfbWVtb2ZmaGVhcCk7CisgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICB9CisgICAgfQorICAgIGxhc3RDb21wYXJpc29uID0gQm9vbGVhbi52YWx1ZU9mKGlzX3NldF9yZXF1ZXN0ZWRfY3B1KCkpLmNvbXBhcmVUbyhvdGhlci5pc19zZXRfcmVxdWVzdGVkX2NwdSgpKTsKKyAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgIH0KKyAgICBpZiAoaXNfc2V0X3JlcXVlc3RlZF9jcHUoKSkgeworICAgICAgbGFzdENvbXBhcmlzb24gPSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy5yZXF1ZXN0ZWRfY3B1LCBvdGhlci5yZXF1ZXN0ZWRfY3B1KTsKKyAgICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICAgIH0KKyAgICB9CisgICAgbGFzdENvbXBhcmlzb24gPSBCb29sZWFuLnZhbHVlT2YoaXNfc2V0X2Fzc2lnbmVkX21lbW9uaGVhcCgpKS5jb21wYXJlVG8ob3RoZXIuaXNfc2V0X2Fzc2lnbmVkX21lbW9uaGVhcCgpKTsKKyAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgIH0KKyAgICBpZiAoaXNfc2V0X2Fzc2lnbmVkX21lbW9uaGVhcCgpKSB7CisgICAgICBsYXN0Q29tcGFyaXNvbiA9IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvbXBhcmVUbyh0aGlzLmFzc2lnbmVkX21lbW9uaGVhcCwgb3RoZXIuYXNzaWduZWRfbWVtb25oZWFwKTsKKyAgICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICAgIH0KKyAgICB9CisgICAgbGFzdENvbXBhcmlzb24gPSBCb29sZWFuLnZhbHVlT2YoaXNfc2V0X2Fzc2lnbmVkX21lbW9mZmhlYXAoKSkuY29tcGFyZVRvKG90aGVyLmlzX3NldF9hc3NpZ25lZF9tZW1vZmZoZWFwKCkpOworICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgfQorICAgIGlmIChpc19zZXRfYXNzaWduZWRfbWVtb2ZmaGVhcCgpKSB7CisgICAgICBsYXN0Q29tcGFyaXNvbiA9IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvbXBhcmVUbyh0aGlzLmFzc2lnbmVkX21lbW9mZmhlYXAsIG90aGVyLmFzc2lnbmVkX21lbW9mZmhlYXApOworICAgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgICAgfQorICAgIH0KKyAgICBsYXN0Q29tcGFyaXNvbiA9IEJvb2xlYW4udmFsdWVPZihpc19zZXRfYXNzaWduZWRfY3B1KCkpLmNvbXBhcmVUbyhvdGhlci5pc19zZXRfYXNzaWduZWRfY3B1KCkpOworICAgIGlmIChsYXN0Q29tcGFyaXNvbiAhPSAwKSB7CisgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgfQorICAgIGlmIChpc19zZXRfYXNzaWduZWRfY3B1KCkpIHsKKyAgICAgIGxhc3RDb21wYXJpc29uID0gb3JnLmFwYWNoZS50aHJpZnQuVEJhc2VIZWxwZXIuY29tcGFyZVRvKHRoaXMuYXNzaWduZWRfY3B1LCBvdGhlci5hc3NpZ25lZF9jcHUpOworICAgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGxhc3RDb21wYXJpc29uOworICAgICAgfQorICAgIH0KICAgICByZXR1cm4gMDsKICAgfQogCkBAIC0xMDEyLDYgKzE0MzIsNDIgQEAKICAgICAgIHNiLmFwcGVuZCh0aGlzLnJlcGxpY2F0aW9uX2NvdW50KTsKICAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICAgfQorICAgIGlmIChpc19zZXRfcmVxdWVzdGVkX21lbW9uaGVhcCgpKSB7CisgICAgICBpZiAoIWZpcnN0KSBzYi5hcHBlbmQoIiwgIik7CisgICAgICBzYi5hcHBlbmQoInJlcXVlc3RlZF9tZW1vbmhlYXA6Iik7CisgICAgICBzYi5hcHBlbmQodGhpcy5yZXF1ZXN0ZWRfbWVtb25oZWFwKTsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfQorICAgIGlmIChpc19zZXRfcmVxdWVzdGVkX21lbW9mZmhlYXAoKSkgeworICAgICAgaWYgKCFmaXJzdCkgc2IuYXBwZW5kKCIsICIpOworICAgICAgc2IuYXBwZW5kKCJyZXF1ZXN0ZWRfbWVtb2ZmaGVhcDoiKTsKKyAgICAgIHNiLmFwcGVuZCh0aGlzLnJlcXVlc3RlZF9tZW1vZmZoZWFwKTsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfQorICAgIGlmIChpc19zZXRfcmVxdWVzdGVkX2NwdSgpKSB7CisgICAgICBpZiAoIWZpcnN0KSBzYi5hcHBlbmQoIiwgIik7CisgICAgICBzYi5hcHBlbmQoInJlcXVlc3RlZF9jcHU6Iik7CisgICAgICBzYi5hcHBlbmQodGhpcy5yZXF1ZXN0ZWRfY3B1KTsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfQorICAgIGlmIChpc19zZXRfYXNzaWduZWRfbWVtb25oZWFwKCkpIHsKKyAgICAgIGlmICghZmlyc3QpIHNiLmFwcGVuZCgiLCAiKTsKKyAgICAgIHNiLmFwcGVuZCgiYXNzaWduZWRfbWVtb25oZWFwOiIpOworICAgICAgc2IuYXBwZW5kKHRoaXMuYXNzaWduZWRfbWVtb25oZWFwKTsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfQorICAgIGlmIChpc19zZXRfYXNzaWduZWRfbWVtb2ZmaGVhcCgpKSB7CisgICAgICBpZiAoIWZpcnN0KSBzYi5hcHBlbmQoIiwgIik7CisgICAgICBzYi5hcHBlbmQoImFzc2lnbmVkX21lbW9mZmhlYXA6Iik7CisgICAgICBzYi5hcHBlbmQodGhpcy5hc3NpZ25lZF9tZW1vZmZoZWFwKTsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfQorICAgIGlmIChpc19zZXRfYXNzaWduZWRfY3B1KCkpIHsKKyAgICAgIGlmICghZmlyc3QpIHNiLmFwcGVuZCgiLCAiKTsKKyAgICAgIHNiLmFwcGVuZCgiYXNzaWduZWRfY3B1OiIpOworICAgICAgc2IuYXBwZW5kKHRoaXMuYXNzaWduZWRfY3B1KTsKKyAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgfQogICAgIHNiLmFwcGVuZCgiKSIpOwogICAgIHJldHVybiBzYi50b1N0cmluZygpOwogICB9CkBAIC0xMTY1LDYgKzE2MjEsNTQgQEAKICAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgNTIxOiAvLyBSRVFVRVNURURfTUVNT05IRUFQCisgICAgICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5ET1VCTEUpIHsKKyAgICAgICAgICAgICAgc3RydWN0LnJlcXVlc3RlZF9tZW1vbmhlYXAgPSBpcHJvdC5yZWFkRG91YmxlKCk7CisgICAgICAgICAgICAgIHN0cnVjdC5zZXRfcmVxdWVzdGVkX21lbW9uaGVhcF9pc1NldCh0cnVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7IAorICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSA1MjI6IC8vIFJFUVVFU1RFRF9NRU1PRkZIRUFQCisgICAgICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5ET1VCTEUpIHsKKyAgICAgICAgICAgICAgc3RydWN0LnJlcXVlc3RlZF9tZW1vZmZoZWFwID0gaXByb3QucmVhZERvdWJsZSgpOworICAgICAgICAgICAgICBzdHJ1Y3Quc2V0X3JlcXVlc3RlZF9tZW1vZmZoZWFwX2lzU2V0KHRydWUpOworICAgICAgICAgICAgfSBlbHNlIHsgCisgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgc2NoZW1lRmllbGQudHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDUyMzogLy8gUkVRVUVTVEVEX0NQVQorICAgICAgICAgICAgaWYgKHNjaGVtZUZpZWxkLnR5cGUgPT0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuRE9VQkxFKSB7CisgICAgICAgICAgICAgIHN0cnVjdC5yZXF1ZXN0ZWRfY3B1ID0gaXByb3QucmVhZERvdWJsZSgpOworICAgICAgICAgICAgICBzdHJ1Y3Quc2V0X3JlcXVlc3RlZF9jcHVfaXNTZXQodHJ1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeyAKKyAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgNTI0OiAvLyBBU1NJR05FRF9NRU1PTkhFQVAKKyAgICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkRPVUJMRSkgeworICAgICAgICAgICAgICBzdHJ1Y3QuYXNzaWduZWRfbWVtb25oZWFwID0gaXByb3QucmVhZERvdWJsZSgpOworICAgICAgICAgICAgICBzdHJ1Y3Quc2V0X2Fzc2lnbmVkX21lbW9uaGVhcF9pc1NldCh0cnVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7IAorICAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSA1MjU6IC8vIEFTU0lHTkVEX01FTU9GRkhFQVAKKyAgICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkRPVUJMRSkgeworICAgICAgICAgICAgICBzdHJ1Y3QuYXNzaWduZWRfbWVtb2ZmaGVhcCA9IGlwcm90LnJlYWREb3VibGUoKTsKKyAgICAgICAgICAgICAgc3RydWN0LnNldF9hc3NpZ25lZF9tZW1vZmZoZWFwX2lzU2V0KHRydWUpOworICAgICAgICAgICAgfSBlbHNlIHsgCisgICAgICAgICAgICAgIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbFV0aWwuc2tpcChpcHJvdCwgc2NoZW1lRmllbGQudHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIDUyNjogLy8gQVNTSUdORURfQ1BVCisgICAgICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5ET1VCTEUpIHsKKyAgICAgICAgICAgICAgc3RydWN0LmFzc2lnbmVkX2NwdSA9IGlwcm90LnJlYWREb3VibGUoKTsKKyAgICAgICAgICAgICAgc3RydWN0LnNldF9hc3NpZ25lZF9jcHVfaXNTZXQodHJ1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeyAKKyAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOwogICAgICAgICB9CkBAIC0xMjI0LDYgKzE3MjgsMzYgQEAKICAgICAgICAgb3Byb3Qud3JpdGVJMzIoc3RydWN0LnJlcGxpY2F0aW9uX2NvdW50KTsKICAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOwogICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5pc19zZXRfcmVxdWVzdGVkX21lbW9uaGVhcCgpKSB7CisgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihSRVFVRVNURURfTUVNT05IRUFQX0ZJRUxEX0RFU0MpOworICAgICAgICBvcHJvdC53cml0ZURvdWJsZShzdHJ1Y3QucmVxdWVzdGVkX21lbW9uaGVhcCk7CisgICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X3JlcXVlc3RlZF9tZW1vZmZoZWFwKCkpIHsKKyAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKFJFUVVFU1RFRF9NRU1PRkZIRUFQX0ZJRUxEX0RFU0MpOworICAgICAgICBvcHJvdC53cml0ZURvdWJsZShzdHJ1Y3QucmVxdWVzdGVkX21lbW9mZmhlYXApOworICAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9yZXF1ZXN0ZWRfY3B1KCkpIHsKKyAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKFJFUVVFU1RFRF9DUFVfRklFTERfREVTQyk7CisgICAgICAgIG9wcm90LndyaXRlRG91YmxlKHN0cnVjdC5yZXF1ZXN0ZWRfY3B1KTsKKyAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5pc19zZXRfYXNzaWduZWRfbWVtb25oZWFwKCkpIHsKKyAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKEFTU0lHTkVEX01FTU9OSEVBUF9GSUVMRF9ERVNDKTsKKyAgICAgICAgb3Byb3Qud3JpdGVEb3VibGUoc3RydWN0LmFzc2lnbmVkX21lbW9uaGVhcCk7CisgICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X2Fzc2lnbmVkX21lbW9mZmhlYXAoKSkgeworICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oQVNTSUdORURfTUVNT0ZGSEVBUF9GSUVMRF9ERVNDKTsKKyAgICAgICAgb3Byb3Qud3JpdGVEb3VibGUoc3RydWN0LmFzc2lnbmVkX21lbW9mZmhlYXApOworICAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9hc3NpZ25lZF9jcHUoKSkgeworICAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oQVNTSUdORURfQ1BVX0ZJRUxEX0RFU0MpOworICAgICAgICBvcHJvdC53cml0ZURvdWJsZShzdHJ1Y3QuYXNzaWduZWRfY3B1KTsKKyAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgICAgfQogICAgICAgb3Byb3Qud3JpdGVGaWVsZFN0b3AoKTsKICAgICAgIG9wcm90LndyaXRlU3RydWN0RW5kKCk7CiAgICAgfQpAQCAtMTI1OCw3ICsxNzkyLDI1IEBACiAgICAgICBpZiAoc3RydWN0LmlzX3NldF9yZXBsaWNhdGlvbl9jb3VudCgpKSB7CiAgICAgICAgIG9wdGlvbmFscy5zZXQoMik7CiAgICAgICB9Ci0gICAgICBvcHJvdC53cml0ZUJpdFNldChvcHRpb25hbHMsIDMpOworICAgICAgaWYgKHN0cnVjdC5pc19zZXRfcmVxdWVzdGVkX21lbW9uaGVhcCgpKSB7CisgICAgICAgIG9wdGlvbmFscy5zZXQoMyk7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9yZXF1ZXN0ZWRfbWVtb2ZmaGVhcCgpKSB7CisgICAgICAgIG9wdGlvbmFscy5zZXQoNCk7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9yZXF1ZXN0ZWRfY3B1KCkpIHsKKyAgICAgICAgb3B0aW9uYWxzLnNldCg1KTsKKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X2Fzc2lnbmVkX21lbW9uaGVhcCgpKSB7CisgICAgICAgIG9wdGlvbmFscy5zZXQoNik7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9hc3NpZ25lZF9tZW1vZmZoZWFwKCkpIHsKKyAgICAgICAgb3B0aW9uYWxzLnNldCg3KTsKKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X2Fzc2lnbmVkX2NwdSgpKSB7CisgICAgICAgIG9wdGlvbmFscy5zZXQoOCk7CisgICAgICB9CisgICAgICBvcHJvdC53cml0ZUJpdFNldChvcHRpb25hbHMsIDkpOwogICAgICAgaWYgKHN0cnVjdC5pc19zZXRfc2NoZWRfc3RhdHVzKCkpIHsKICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoc3RydWN0LnNjaGVkX3N0YXR1cyk7CiAgICAgICB9CkBAIC0xMjY4LDYgKzE4MjAsMjQgQEAKICAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X3JlcGxpY2F0aW9uX2NvdW50KCkpIHsKICAgICAgICAgb3Byb3Qud3JpdGVJMzIoc3RydWN0LnJlcGxpY2F0aW9uX2NvdW50KTsKICAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X3JlcXVlc3RlZF9tZW1vbmhlYXAoKSkgeworICAgICAgICBvcHJvdC53cml0ZURvdWJsZShzdHJ1Y3QucmVxdWVzdGVkX21lbW9uaGVhcCk7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9yZXF1ZXN0ZWRfbWVtb2ZmaGVhcCgpKSB7CisgICAgICAgIG9wcm90LndyaXRlRG91YmxlKHN0cnVjdC5yZXF1ZXN0ZWRfbWVtb2ZmaGVhcCk7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9yZXF1ZXN0ZWRfY3B1KCkpIHsKKyAgICAgICAgb3Byb3Qud3JpdGVEb3VibGUoc3RydWN0LnJlcXVlc3RlZF9jcHUpOworICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5pc19zZXRfYXNzaWduZWRfbWVtb25oZWFwKCkpIHsKKyAgICAgICAgb3Byb3Qud3JpdGVEb3VibGUoc3RydWN0LmFzc2lnbmVkX21lbW9uaGVhcCk7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9hc3NpZ25lZF9tZW1vZmZoZWFwKCkpIHsKKyAgICAgICAgb3Byb3Qud3JpdGVEb3VibGUoc3RydWN0LmFzc2lnbmVkX21lbW9mZmhlYXApOworICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5pc19zZXRfYXNzaWduZWRfY3B1KCkpIHsKKyAgICAgICAgb3Byb3Qud3JpdGVEb3VibGUoc3RydWN0LmFzc2lnbmVkX2NwdSk7CisgICAgICB9CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC0xMjg3LDcgKzE4NTcsNyBAQAogICAgICAgc3RydWN0LnNldF91cHRpbWVfc2Vjc19pc1NldCh0cnVlKTsKICAgICAgIHN0cnVjdC5zdGF0dXMgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CiAgICAgICBzdHJ1Y3Quc2V0X3N0YXR1c19pc1NldCh0cnVlKTsKLSAgICAgIEJpdFNldCBpbmNvbWluZyA9IGlwcm90LnJlYWRCaXRTZXQoMyk7CisgICAgICBCaXRTZXQgaW5jb21pbmcgPSBpcHJvdC5yZWFkQml0U2V0KDkpOwogICAgICAgaWYgKGluY29taW5nLmdldCgwKSkgewogICAgICAgICBzdHJ1Y3Quc2NoZWRfc3RhdHVzID0gaXByb3QucmVhZFN0cmluZygpOwogICAgICAgICBzdHJ1Y3Quc2V0X3NjaGVkX3N0YXR1c19pc1NldCh0cnVlKTsKQEAgLTEzMDAsNiArMTg3MCwzMCBAQAogICAgICAgICBzdHJ1Y3QucmVwbGljYXRpb25fY291bnQgPSBpcHJvdC5yZWFkSTMyKCk7CiAgICAgICAgIHN0cnVjdC5zZXRfcmVwbGljYXRpb25fY291bnRfaXNTZXQodHJ1ZSk7CiAgICAgICB9CisgICAgICBpZiAoaW5jb21pbmcuZ2V0KDMpKSB7CisgICAgICAgIHN0cnVjdC5yZXF1ZXN0ZWRfbWVtb25oZWFwID0gaXByb3QucmVhZERvdWJsZSgpOworICAgICAgICBzdHJ1Y3Quc2V0X3JlcXVlc3RlZF9tZW1vbmhlYXBfaXNTZXQodHJ1ZSk7CisgICAgICB9CisgICAgICBpZiAoaW5jb21pbmcuZ2V0KDQpKSB7CisgICAgICAgIHN0cnVjdC5yZXF1ZXN0ZWRfbWVtb2ZmaGVhcCA9IGlwcm90LnJlYWREb3VibGUoKTsKKyAgICAgICAgc3RydWN0LnNldF9yZXF1ZXN0ZWRfbWVtb2ZmaGVhcF9pc1NldCh0cnVlKTsKKyAgICAgIH0KKyAgICAgIGlmIChpbmNvbWluZy5nZXQoNSkpIHsKKyAgICAgICAgc3RydWN0LnJlcXVlc3RlZF9jcHUgPSBpcHJvdC5yZWFkRG91YmxlKCk7CisgICAgICAgIHN0cnVjdC5zZXRfcmVxdWVzdGVkX2NwdV9pc1NldCh0cnVlKTsKKyAgICAgIH0KKyAgICAgIGlmIChpbmNvbWluZy5nZXQoNikpIHsKKyAgICAgICAgc3RydWN0LmFzc2lnbmVkX21lbW9uaGVhcCA9IGlwcm90LnJlYWREb3VibGUoKTsKKyAgICAgICAgc3RydWN0LnNldF9hc3NpZ25lZF9tZW1vbmhlYXBfaXNTZXQodHJ1ZSk7CisgICAgICB9CisgICAgICBpZiAoaW5jb21pbmcuZ2V0KDcpKSB7CisgICAgICAgIHN0cnVjdC5hc3NpZ25lZF9tZW1vZmZoZWFwID0gaXByb3QucmVhZERvdWJsZSgpOworICAgICAgICBzdHJ1Y3Quc2V0X2Fzc2lnbmVkX21lbW9mZmhlYXBfaXNTZXQodHJ1ZSk7CisgICAgICB9CisgICAgICBpZiAoaW5jb21pbmcuZ2V0KDgpKSB7CisgICAgICAgIHN0cnVjdC5hc3NpZ25lZF9jcHUgPSBpcHJvdC5yZWFkRG91YmxlKCk7CisgICAgICAgIHN0cnVjdC5zZXRfYXNzaWduZWRfY3B1X2lzU2V0KHRydWUpOworICAgICAgfQogICAgIH0KICAgfQogCmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ2VuZXJhdGVkL1dvcmtlclJlc291cmNlcy5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9Xb3JrZXJSZXNvdXJjZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWYyMmZiCi0tLSAvZGV2L251bGwKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dlbmVyYXRlZC9Xb3JrZXJSZXNvdXJjZXMuamF2YQpAQCAtMCwwICsxLDYwNSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKy8qKgorICogQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4zKQorICoKKyAqIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkcKKyAqICBAZ2VuZXJhdGVkCisgKi8KK3BhY2thZ2UgYmFja3R5cGUuc3Rvcm0uZ2VuZXJhdGVkOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLklTY2hlbWU7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLlNjaGVtZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLlN0YW5kYXJkU2NoZW1lOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuc2NoZW1lLlR1cGxlU2NoZW1lOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUdXBsZVByb3RvY29sOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5FbmNvZGluZ1V0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuYXN5bmMuQXN5bmNNZXRob2RDYWxsYmFjazsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5zZXJ2ZXIuQWJzdHJhY3ROb25ibG9ja2luZ1NlcnZlci4qOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bU1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuQml0U2V0OworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLkdlbmVyYXRlZDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitAU3VwcHJlc3NXYXJuaW5ncyh7ImNhc3QiLCAicmF3dHlwZXMiLCAic2VyaWFsIiwgInVuY2hlY2tlZCJ9KQorQEdlbmVyYXRlZCh2YWx1ZSA9ICJBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjMpIikKK3B1YmxpYyBjbGFzcyBXb3JrZXJSZXNvdXJjZXMgaW1wbGVtZW50cyBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZTxXb3JrZXJSZXNvdXJjZXMsIFdvcmtlclJlc291cmNlcy5fRmllbGRzPiwgamF2YS5pby5TZXJpYWxpemFibGUsIENsb25lYWJsZSwgQ29tcGFyYWJsZTxXb3JrZXJSZXNvdXJjZXM+IHsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFN0cnVjdCBTVFJVQ1RfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UU3RydWN0KCJXb3JrZXJSZXNvdXJjZXMiKTsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgTUVNX09OX0hFQVBfRklFTERfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQoIm1lbV9vbl9oZWFwIiwgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuRE9VQkxFLCAoc2hvcnQpMSk7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRGaWVsZCBNRU1fT0ZGX0hFQVBfRklFTERfREVTQyA9IG5ldyBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQoIm1lbV9vZmZfaGVhcCIsIG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkRPVUJMRSwgKHNob3J0KTIpOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgQ1BVX0ZJRUxEX0RFU0MgPSBuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVEZpZWxkKCJjcHUiLCBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5ET1VCTEUsIChzaG9ydCkzKTsKKworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8Q2xhc3M8PyBleHRlbmRzIElTY2hlbWU+LCBTY2hlbWVGYWN0b3J5PiBzY2hlbWVzID0gbmV3IEhhc2hNYXA8Q2xhc3M8PyBleHRlbmRzIElTY2hlbWU+LCBTY2hlbWVGYWN0b3J5PigpOworICBzdGF0aWMgeworICAgIHNjaGVtZXMucHV0KFN0YW5kYXJkU2NoZW1lLmNsYXNzLCBuZXcgV29ya2VyUmVzb3VyY2VzU3RhbmRhcmRTY2hlbWVGYWN0b3J5KCkpOworICAgIHNjaGVtZXMucHV0KFR1cGxlU2NoZW1lLmNsYXNzLCBuZXcgV29ya2VyUmVzb3VyY2VzVHVwbGVTY2hlbWVGYWN0b3J5KCkpOworICB9CisKKyAgcHJpdmF0ZSBkb3VibGUgbWVtX29uX2hlYXA7IC8vIG9wdGlvbmFsCisgIHByaXZhdGUgZG91YmxlIG1lbV9vZmZfaGVhcDsgLy8gb3B0aW9uYWwKKyAgcHJpdmF0ZSBkb3VibGUgY3B1OyAvLyBvcHRpb25hbAorCisgIC8qKiBUaGUgc2V0IG9mIGZpZWxkcyB0aGlzIHN0cnVjdCBjb250YWlucywgYWxvbmcgd2l0aCBjb252ZW5pZW5jZSBtZXRob2RzIGZvciBmaW5kaW5nIGFuZCBtYW5pcHVsYXRpbmcgdGhlbS4gKi8KKyAgcHVibGljIGVudW0gX0ZpZWxkcyBpbXBsZW1lbnRzIG9yZy5hcGFjaGUudGhyaWZ0LlRGaWVsZElkRW51bSB7CisgICAgTUVNX09OX0hFQVAoKHNob3J0KTEsICJtZW1fb25faGVhcCIpLAorICAgIE1FTV9PRkZfSEVBUCgoc2hvcnQpMiwgIm1lbV9vZmZfaGVhcCIpLAorICAgIENQVSgoc2hvcnQpMywgImNwdSIpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgX0ZpZWxkcz4gYnlOYW1lID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBfRmllbGRzPigpOworCisgICAgc3RhdGljIHsKKyAgICAgIGZvciAoX0ZpZWxkcyBmaWVsZCA6IEVudW1TZXQuYWxsT2YoX0ZpZWxkcy5jbGFzcykpIHsKKyAgICAgICAgYnlOYW1lLnB1dChmaWVsZC5nZXRGaWVsZE5hbWUoKSwgZmllbGQpOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgdGhlIF9GaWVsZHMgY29uc3RhbnQgdGhhdCBtYXRjaGVzIGZpZWxkSWQsIG9yIG51bGwgaWYgaXRzIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIF9GaWVsZHMgZmluZEJ5VGhyaWZ0SWQoaW50IGZpZWxkSWQpIHsKKyAgICAgIHN3aXRjaChmaWVsZElkKSB7CisgICAgICAgIGNhc2UgMTogLy8gTUVNX09OX0hFQVAKKyAgICAgICAgICByZXR1cm4gTUVNX09OX0hFQVA7CisgICAgICAgIGNhc2UgMjogLy8gTUVNX09GRl9IRUFQCisgICAgICAgICAgcmV0dXJuIE1FTV9PRkZfSEVBUDsKKyAgICAgICAgY2FzZSAzOiAvLyBDUFUKKyAgICAgICAgICByZXR1cm4gQ1BVOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgdGhlIF9GaWVsZHMgY29uc3RhbnQgdGhhdCBtYXRjaGVzIGZpZWxkSWQsIHRocm93aW5nIGFuIGV4Y2VwdGlvbgorICAgICAqIGlmIGl0IGlzIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIF9GaWVsZHMgZmluZEJ5VGhyaWZ0SWRPclRocm93KGludCBmaWVsZElkKSB7CisgICAgICBfRmllbGRzIGZpZWxkcyA9IGZpbmRCeVRocmlmdElkKGZpZWxkSWQpOworICAgICAgaWYgKGZpZWxkcyA9PSBudWxsKSB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJGaWVsZCAiICsgZmllbGRJZCArICIgZG9lc24ndCBleGlzdCEiKTsKKyAgICAgIHJldHVybiBmaWVsZHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCB0aGUgX0ZpZWxkcyBjb25zdGFudCB0aGF0IG1hdGNoZXMgbmFtZSwgb3IgbnVsbCBpZiBpdHMgbm90IGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgX0ZpZWxkcyBmaW5kQnlOYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICByZXR1cm4gYnlOYW1lLmdldChuYW1lKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIHNob3J0IF90aHJpZnRJZDsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBfZmllbGROYW1lOworCisgICAgX0ZpZWxkcyhzaG9ydCB0aHJpZnRJZCwgU3RyaW5nIGZpZWxkTmFtZSkgeworICAgICAgX3RocmlmdElkID0gdGhyaWZ0SWQ7CisgICAgICBfZmllbGROYW1lID0gZmllbGROYW1lOworICAgIH0KKworICAgIHB1YmxpYyBzaG9ydCBnZXRUaHJpZnRGaWVsZElkKCkgeworICAgICAgcmV0dXJuIF90aHJpZnRJZDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEZpZWxkTmFtZSgpIHsKKyAgICAgIHJldHVybiBfZmllbGROYW1lOworICAgIH0KKyAgfQorCisgIC8vIGlzc2V0IGlkIGFzc2lnbm1lbnRzCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBfX01FTV9PTl9IRUFQX0lTU0VUX0lEID0gMDsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IF9fTUVNX09GRl9IRUFQX0lTU0VUX0lEID0gMTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IF9fQ1BVX0lTU0VUX0lEID0gMjsKKyAgcHJpdmF0ZSBieXRlIF9faXNzZXRfYml0ZmllbGQgPSAwOworICBwcml2YXRlIHN0YXRpYyBmaW5hbCBfRmllbGRzIG9wdGlvbmFsc1tdID0ge19GaWVsZHMuTUVNX09OX0hFQVAsX0ZpZWxkcy5NRU1fT0ZGX0hFQVAsX0ZpZWxkcy5DUFV9OworICBwdWJsaWMgc3RhdGljIGZpbmFsIE1hcDxfRmllbGRzLCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YT4gbWV0YURhdGFNYXA7CisgIHN0YXRpYyB7CisgICAgTWFwPF9GaWVsZHMsIG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZE1ldGFEYXRhPiB0bXBNYXAgPSBuZXcgRW51bU1hcDxfRmllbGRzLCBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YT4oX0ZpZWxkcy5jbGFzcyk7CisgICAgdG1wTWFwLnB1dChfRmllbGRzLk1FTV9PTl9IRUFQLCBuZXcgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEoIm1lbV9vbl9oZWFwIiwgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLk9QVElPTkFMLCAKKyAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZFZhbHVlTWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuRE9VQkxFKSkpOworICAgIHRtcE1hcC5wdXQoX0ZpZWxkcy5NRU1fT0ZGX0hFQVAsIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YSgibWVtX29mZl9oZWFwIiwgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLk9QVElPTkFMLCAKKyAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZFZhbHVlTWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuRE9VQkxFKSkpOworICAgIHRtcE1hcC5wdXQoX0ZpZWxkcy5DUFUsIG5ldyBvcmcuYXBhY2hlLnRocmlmdC5tZXRhX2RhdGEuRmllbGRNZXRhRGF0YSgiY3B1Iiwgb3JnLmFwYWNoZS50aHJpZnQuVEZpZWxkUmVxdWlyZW1lbnRUeXBlLk9QVElPTkFMLCAKKyAgICAgICAgbmV3IG9yZy5hcGFjaGUudGhyaWZ0Lm1ldGFfZGF0YS5GaWVsZFZhbHVlTWV0YURhdGEob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuRE9VQkxFKSkpOworICAgIG1ldGFEYXRhTWFwID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKHRtcE1hcCk7CisgICAgb3JnLmFwYWNoZS50aHJpZnQubWV0YV9kYXRhLkZpZWxkTWV0YURhdGEuYWRkU3RydWN0TWV0YURhdGFNYXAoV29ya2VyUmVzb3VyY2VzLmNsYXNzLCBtZXRhRGF0YU1hcCk7CisgIH0KKworICBwdWJsaWMgV29ya2VyUmVzb3VyY2VzKCkgeworICB9CisKKyAgLyoqCisgICAqIFBlcmZvcm1zIGEgZGVlcCBjb3B5IG9uIDxpPm90aGVyPC9pPi4KKyAgICovCisgIHB1YmxpYyBXb3JrZXJSZXNvdXJjZXMoV29ya2VyUmVzb3VyY2VzIG90aGVyKSB7CisgICAgX19pc3NldF9iaXRmaWVsZCA9IG90aGVyLl9faXNzZXRfYml0ZmllbGQ7CisgICAgdGhpcy5tZW1fb25faGVhcCA9IG90aGVyLm1lbV9vbl9oZWFwOworICAgIHRoaXMubWVtX29mZl9oZWFwID0gb3RoZXIubWVtX29mZl9oZWFwOworICAgIHRoaXMuY3B1ID0gb3RoZXIuY3B1OworICB9CisKKyAgcHVibGljIFdvcmtlclJlc291cmNlcyBkZWVwQ29weSgpIHsKKyAgICByZXR1cm4gbmV3IFdvcmtlclJlc291cmNlcyh0aGlzKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICBzZXRfbWVtX29uX2hlYXBfaXNTZXQoZmFsc2UpOworICAgIHRoaXMubWVtX29uX2hlYXAgPSAwLjA7CisgICAgc2V0X21lbV9vZmZfaGVhcF9pc1NldChmYWxzZSk7CisgICAgdGhpcy5tZW1fb2ZmX2hlYXAgPSAwLjA7CisgICAgc2V0X2NwdV9pc1NldChmYWxzZSk7CisgICAgdGhpcy5jcHUgPSAwLjA7CisgIH0KKworICBwdWJsaWMgZG91YmxlIGdldF9tZW1fb25faGVhcCgpIHsKKyAgICByZXR1cm4gdGhpcy5tZW1fb25faGVhcDsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF9tZW1fb25faGVhcChkb3VibGUgbWVtX29uX2hlYXApIHsKKyAgICB0aGlzLm1lbV9vbl9oZWFwID0gbWVtX29uX2hlYXA7CisgICAgc2V0X21lbV9vbl9oZWFwX2lzU2V0KHRydWUpOworICB9CisKKyAgcHVibGljIHZvaWQgdW5zZXRfbWVtX29uX2hlYXAoKSB7CisgICAgX19pc3NldF9iaXRmaWVsZCA9IEVuY29kaW5nVXRpbHMuY2xlYXJCaXQoX19pc3NldF9iaXRmaWVsZCwgX19NRU1fT05fSEVBUF9JU1NFVF9JRCk7CisgIH0KKworICAvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkIG1lbV9vbl9oZWFwIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLworICBwdWJsaWMgYm9vbGVhbiBpc19zZXRfbWVtX29uX2hlYXAoKSB7CisgICAgcmV0dXJuIEVuY29kaW5nVXRpbHMudGVzdEJpdChfX2lzc2V0X2JpdGZpZWxkLCBfX01FTV9PTl9IRUFQX0lTU0VUX0lEKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF9tZW1fb25faGVhcF9pc1NldChib29sZWFuIHZhbHVlKSB7CisgICAgX19pc3NldF9iaXRmaWVsZCA9IEVuY29kaW5nVXRpbHMuc2V0Qml0KF9faXNzZXRfYml0ZmllbGQsIF9fTUVNX09OX0hFQVBfSVNTRVRfSUQsIHZhbHVlKTsKKyAgfQorCisgIHB1YmxpYyBkb3VibGUgZ2V0X21lbV9vZmZfaGVhcCgpIHsKKyAgICByZXR1cm4gdGhpcy5tZW1fb2ZmX2hlYXA7CisgIH0KKworICBwdWJsaWMgdm9pZCBzZXRfbWVtX29mZl9oZWFwKGRvdWJsZSBtZW1fb2ZmX2hlYXApIHsKKyAgICB0aGlzLm1lbV9vZmZfaGVhcCA9IG1lbV9vZmZfaGVhcDsKKyAgICBzZXRfbWVtX29mZl9oZWFwX2lzU2V0KHRydWUpOworICB9CisKKyAgcHVibGljIHZvaWQgdW5zZXRfbWVtX29mZl9oZWFwKCkgeworICAgIF9faXNzZXRfYml0ZmllbGQgPSBFbmNvZGluZ1V0aWxzLmNsZWFyQml0KF9faXNzZXRfYml0ZmllbGQsIF9fTUVNX09GRl9IRUFQX0lTU0VUX0lEKTsKKyAgfQorCisgIC8qKiBSZXR1cm5zIHRydWUgaWYgZmllbGQgbWVtX29mZl9oZWFwIGlzIHNldCAoaGFzIGJlZW4gYXNzaWduZWQgYSB2YWx1ZSkgYW5kIGZhbHNlIG90aGVyd2lzZSAqLworICBwdWJsaWMgYm9vbGVhbiBpc19zZXRfbWVtX29mZl9oZWFwKCkgeworICAgIHJldHVybiBFbmNvZGluZ1V0aWxzLnRlc3RCaXQoX19pc3NldF9iaXRmaWVsZCwgX19NRU1fT0ZGX0hFQVBfSVNTRVRfSUQpOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X21lbV9vZmZfaGVhcF9pc1NldChib29sZWFuIHZhbHVlKSB7CisgICAgX19pc3NldF9iaXRmaWVsZCA9IEVuY29kaW5nVXRpbHMuc2V0Qml0KF9faXNzZXRfYml0ZmllbGQsIF9fTUVNX09GRl9IRUFQX0lTU0VUX0lELCB2YWx1ZSk7CisgIH0KKworICBwdWJsaWMgZG91YmxlIGdldF9jcHUoKSB7CisgICAgcmV0dXJuIHRoaXMuY3B1OworICB9CisKKyAgcHVibGljIHZvaWQgc2V0X2NwdShkb3VibGUgY3B1KSB7CisgICAgdGhpcy5jcHUgPSBjcHU7CisgICAgc2V0X2NwdV9pc1NldCh0cnVlKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHVuc2V0X2NwdSgpIHsKKyAgICBfX2lzc2V0X2JpdGZpZWxkID0gRW5jb2RpbmdVdGlscy5jbGVhckJpdChfX2lzc2V0X2JpdGZpZWxkLCBfX0NQVV9JU1NFVF9JRCk7CisgIH0KKworICAvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkIGNwdSBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNfc2V0X2NwdSgpIHsKKyAgICByZXR1cm4gRW5jb2RpbmdVdGlscy50ZXN0Qml0KF9faXNzZXRfYml0ZmllbGQsIF9fQ1BVX0lTU0VUX0lEKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHNldF9jcHVfaXNTZXQoYm9vbGVhbiB2YWx1ZSkgeworICAgIF9faXNzZXRfYml0ZmllbGQgPSBFbmNvZGluZ1V0aWxzLnNldEJpdChfX2lzc2V0X2JpdGZpZWxkLCBfX0NQVV9JU1NFVF9JRCwgdmFsdWUpOworICB9CisKKyAgcHVibGljIHZvaWQgc2V0RmllbGRWYWx1ZShfRmllbGRzIGZpZWxkLCBPYmplY3QgdmFsdWUpIHsKKyAgICBzd2l0Y2ggKGZpZWxkKSB7CisgICAgY2FzZSBNRU1fT05fSEVBUDoKKyAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgIHVuc2V0X21lbV9vbl9oZWFwKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzZXRfbWVtX29uX2hlYXAoKERvdWJsZSl2YWx1ZSk7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgTUVNX09GRl9IRUFQOgorICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgdW5zZXRfbWVtX29mZl9oZWFwKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzZXRfbWVtX29mZl9oZWFwKChEb3VibGUpdmFsdWUpOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIENQVToKKyAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgIHVuc2V0X2NwdSgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2V0X2NwdSgoRG91YmxlKXZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgfQorICB9CisKKyAgcHVibGljIE9iamVjdCBnZXRGaWVsZFZhbHVlKF9GaWVsZHMgZmllbGQpIHsKKyAgICBzd2l0Y2ggKGZpZWxkKSB7CisgICAgY2FzZSBNRU1fT05fSEVBUDoKKyAgICAgIHJldHVybiBnZXRfbWVtX29uX2hlYXAoKTsKKworICAgIGNhc2UgTUVNX09GRl9IRUFQOgorICAgICAgcmV0dXJuIGdldF9tZW1fb2ZmX2hlYXAoKTsKKworICAgIGNhc2UgQ1BVOgorICAgICAgcmV0dXJuIGdldF9jcHUoKTsKKworICAgIH0KKyAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgIH0KKworICAvKiogUmV0dXJucyB0cnVlIGlmIGZpZWxkIGNvcnJlc3BvbmRpbmcgdG8gZmllbGRJRCBpcyBzZXQgKGhhcyBiZWVuIGFzc2lnbmVkIGEgdmFsdWUpIGFuZCBmYWxzZSBvdGhlcndpc2UgKi8KKyAgcHVibGljIGJvb2xlYW4gaXNTZXQoX0ZpZWxkcyBmaWVsZCkgeworICAgIGlmIChmaWVsZCA9PSBudWxsKSB7CisgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgc3dpdGNoIChmaWVsZCkgeworICAgIGNhc2UgTUVNX09OX0hFQVA6CisgICAgICByZXR1cm4gaXNfc2V0X21lbV9vbl9oZWFwKCk7CisgICAgY2FzZSBNRU1fT0ZGX0hFQVA6CisgICAgICByZXR1cm4gaXNfc2V0X21lbV9vZmZfaGVhcCgpOworICAgIGNhc2UgQ1BVOgorICAgICAgcmV0dXJuIGlzX3NldF9jcHUoKTsKKyAgICB9CisgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgdGhhdCkgeworICAgIGlmICh0aGF0ID09IG51bGwpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKHRoYXQgaW5zdGFuY2VvZiBXb3JrZXJSZXNvdXJjZXMpCisgICAgICByZXR1cm4gdGhpcy5lcXVhbHMoKFdvcmtlclJlc291cmNlcyl0aGF0KTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoV29ya2VyUmVzb3VyY2VzIHRoYXQpIHsKKyAgICBpZiAodGhhdCA9PSBudWxsKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgYm9vbGVhbiB0aGlzX3ByZXNlbnRfbWVtX29uX2hlYXAgPSB0cnVlICYmIHRoaXMuaXNfc2V0X21lbV9vbl9oZWFwKCk7CisgICAgYm9vbGVhbiB0aGF0X3ByZXNlbnRfbWVtX29uX2hlYXAgPSB0cnVlICYmIHRoYXQuaXNfc2V0X21lbV9vbl9oZWFwKCk7CisgICAgaWYgKHRoaXNfcHJlc2VudF9tZW1fb25faGVhcCB8fCB0aGF0X3ByZXNlbnRfbWVtX29uX2hlYXApIHsKKyAgICAgIGlmICghKHRoaXNfcHJlc2VudF9tZW1fb25faGVhcCAmJiB0aGF0X3ByZXNlbnRfbWVtX29uX2hlYXApKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBpZiAodGhpcy5tZW1fb25faGVhcCAhPSB0aGF0Lm1lbV9vbl9oZWFwKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbGVhbiB0aGlzX3ByZXNlbnRfbWVtX29mZl9oZWFwID0gdHJ1ZSAmJiB0aGlzLmlzX3NldF9tZW1fb2ZmX2hlYXAoKTsKKyAgICBib29sZWFuIHRoYXRfcHJlc2VudF9tZW1fb2ZmX2hlYXAgPSB0cnVlICYmIHRoYXQuaXNfc2V0X21lbV9vZmZfaGVhcCgpOworICAgIGlmICh0aGlzX3ByZXNlbnRfbWVtX29mZl9oZWFwIHx8IHRoYXRfcHJlc2VudF9tZW1fb2ZmX2hlYXApIHsKKyAgICAgIGlmICghKHRoaXNfcHJlc2VudF9tZW1fb2ZmX2hlYXAgJiYgdGhhdF9wcmVzZW50X21lbV9vZmZfaGVhcCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGlmICh0aGlzLm1lbV9vZmZfaGVhcCAhPSB0aGF0Lm1lbV9vZmZfaGVhcCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2xlYW4gdGhpc19wcmVzZW50X2NwdSA9IHRydWUgJiYgdGhpcy5pc19zZXRfY3B1KCk7CisgICAgYm9vbGVhbiB0aGF0X3ByZXNlbnRfY3B1ID0gdHJ1ZSAmJiB0aGF0LmlzX3NldF9jcHUoKTsKKyAgICBpZiAodGhpc19wcmVzZW50X2NwdSB8fCB0aGF0X3ByZXNlbnRfY3B1KSB7CisgICAgICBpZiAoISh0aGlzX3ByZXNlbnRfY3B1ICYmIHRoYXRfcHJlc2VudF9jcHUpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBpZiAodGhpcy5jcHUgIT0gdGhhdC5jcHUpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgIExpc3Q8T2JqZWN0PiBsaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7CisKKyAgICBib29sZWFuIHByZXNlbnRfbWVtX29uX2hlYXAgPSB0cnVlICYmIChpc19zZXRfbWVtX29uX2hlYXAoKSk7CisgICAgbGlzdC5hZGQocHJlc2VudF9tZW1fb25faGVhcCk7CisgICAgaWYgKHByZXNlbnRfbWVtX29uX2hlYXApCisgICAgICBsaXN0LmFkZChtZW1fb25faGVhcCk7CisKKyAgICBib29sZWFuIHByZXNlbnRfbWVtX29mZl9oZWFwID0gdHJ1ZSAmJiAoaXNfc2V0X21lbV9vZmZfaGVhcCgpKTsKKyAgICBsaXN0LmFkZChwcmVzZW50X21lbV9vZmZfaGVhcCk7CisgICAgaWYgKHByZXNlbnRfbWVtX29mZl9oZWFwKQorICAgICAgbGlzdC5hZGQobWVtX29mZl9oZWFwKTsKKworICAgIGJvb2xlYW4gcHJlc2VudF9jcHUgPSB0cnVlICYmIChpc19zZXRfY3B1KCkpOworICAgIGxpc3QuYWRkKHByZXNlbnRfY3B1KTsKKyAgICBpZiAocHJlc2VudF9jcHUpCisgICAgICBsaXN0LmFkZChjcHUpOworCisgICAgcmV0dXJuIGxpc3QuaGFzaENvZGUoKTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgaW50IGNvbXBhcmVUbyhXb3JrZXJSZXNvdXJjZXMgb3RoZXIpIHsKKyAgICBpZiAoIWdldENsYXNzKCkuZXF1YWxzKG90aGVyLmdldENsYXNzKCkpKSB7CisgICAgICByZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCkuY29tcGFyZVRvKG90aGVyLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICB9CisKKyAgICBpbnQgbGFzdENvbXBhcmlzb24gPSAwOworCisgICAgbGFzdENvbXBhcmlzb24gPSBCb29sZWFuLnZhbHVlT2YoaXNfc2V0X21lbV9vbl9oZWFwKCkpLmNvbXBhcmVUbyhvdGhlci5pc19zZXRfbWVtX29uX2hlYXAoKSk7CisgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICB9CisgICAgaWYgKGlzX3NldF9tZW1fb25faGVhcCgpKSB7CisgICAgICBsYXN0Q29tcGFyaXNvbiA9IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlSGVscGVyLmNvbXBhcmVUbyh0aGlzLm1lbV9vbl9oZWFwLCBvdGhlci5tZW1fb25faGVhcCk7CisgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICB9CisgICAgfQorICAgIGxhc3RDb21wYXJpc29uID0gQm9vbGVhbi52YWx1ZU9mKGlzX3NldF9tZW1fb2ZmX2hlYXAoKSkuY29tcGFyZVRvKG90aGVyLmlzX3NldF9tZW1fb2ZmX2hlYXAoKSk7CisgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICB9CisgICAgaWYgKGlzX3NldF9tZW1fb2ZmX2hlYXAoKSkgeworICAgICAgbGFzdENvbXBhcmlzb24gPSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy5tZW1fb2ZmX2hlYXAsIG90aGVyLm1lbV9vZmZfaGVhcCk7CisgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICB9CisgICAgfQorICAgIGxhc3RDb21wYXJpc29uID0gQm9vbGVhbi52YWx1ZU9mKGlzX3NldF9jcHUoKSkuY29tcGFyZVRvKG90aGVyLmlzX3NldF9jcHUoKSk7CisgICAgaWYgKGxhc3RDb21wYXJpc29uICE9IDApIHsKKyAgICAgIHJldHVybiBsYXN0Q29tcGFyaXNvbjsKKyAgICB9CisgICAgaWYgKGlzX3NldF9jcHUoKSkgeworICAgICAgbGFzdENvbXBhcmlzb24gPSBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZUhlbHBlci5jb21wYXJlVG8odGhpcy5jcHUsIG90aGVyLmNwdSk7CisgICAgICBpZiAobGFzdENvbXBhcmlzb24gIT0gMCkgeworICAgICAgICByZXR1cm4gbGFzdENvbXBhcmlzb247CisgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworICB9CisKKyAgcHVibGljIF9GaWVsZHMgZmllbGRGb3JJZChpbnQgZmllbGRJZCkgeworICAgIHJldHVybiBfRmllbGRzLmZpbmRCeVRocmlmdElkKGZpZWxkSWQpOworICB9CisKKyAgcHVibGljIHZvaWQgcmVhZChvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgaXByb3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICBzY2hlbWVzLmdldChpcHJvdC5nZXRTY2hlbWUoKSkuZ2V0U2NoZW1lKCkucmVhZChpcHJvdCwgdGhpcyk7CisgIH0KKworICBwdWJsaWMgdm9pZCB3cml0ZShvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2wgb3Byb3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICBzY2hlbWVzLmdldChvcHJvdC5nZXRTY2hlbWUoKSkuZ2V0U2NoZW1lKCkud3JpdGUob3Byb3QsIHRoaXMpOworICB9CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCJXb3JrZXJSZXNvdXJjZXMoIik7CisgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7CisKKyAgICBpZiAoaXNfc2V0X21lbV9vbl9oZWFwKCkpIHsKKyAgICAgIHNiLmFwcGVuZCgibWVtX29uX2hlYXA6Iik7CisgICAgICBzYi5hcHBlbmQodGhpcy5tZW1fb25faGVhcCk7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0KKyAgICBpZiAoaXNfc2V0X21lbV9vZmZfaGVhcCgpKSB7CisgICAgICBpZiAoIWZpcnN0KSBzYi5hcHBlbmQoIiwgIik7CisgICAgICBzYi5hcHBlbmQoIm1lbV9vZmZfaGVhcDoiKTsKKyAgICAgIHNiLmFwcGVuZCh0aGlzLm1lbV9vZmZfaGVhcCk7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0KKyAgICBpZiAoaXNfc2V0X2NwdSgpKSB7CisgICAgICBpZiAoIWZpcnN0KSBzYi5hcHBlbmQoIiwgIik7CisgICAgICBzYi5hcHBlbmQoImNwdToiKTsKKyAgICAgIHNiLmFwcGVuZCh0aGlzLmNwdSk7CisgICAgICBmaXJzdCA9IGZhbHNlOworICAgIH0KKyAgICBzYi5hcHBlbmQoIikiKTsKKyAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgfQorCisgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKCkgdGhyb3dzIG9yZy5hcGFjaGUudGhyaWZ0LlRFeGNlcHRpb24geworICAgIC8vIGNoZWNrIGZvciByZXF1aXJlZCBmaWVsZHMKKyAgICAvLyBjaGVjayBmb3Igc3ViLXN0cnVjdCB2YWxpZGl0eQorICB9CisKKyAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgIHRyeSB7CisgICAgICB3cml0ZShuZXcgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVENvbXBhY3RQcm90b2NvbChuZXcgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRJT1N0cmVhbVRyYW5zcG9ydChvdXQpKSk7CisgICAgfSBjYXRjaCAob3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB0ZSkgeworICAgICAgdGhyb3cgbmV3IGphdmEuaW8uSU9FeGNlcHRpb24odGUpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0KGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0gaW4pIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICB0cnkgeworICAgICAgLy8gaXQgZG9lc24ndCBzZWVtIGxpa2UgeW91IHNob3VsZCBoYXZlIHRvIGRvIHRoaXMsIGJ1dCBqYXZhIHNlcmlhbGl6YXRpb24gaXMgd2Fja3ksIGFuZCBkb2Vzbid0IGNhbGwgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IuCisgICAgICBfX2lzc2V0X2JpdGZpZWxkID0gMDsKKyAgICAgIHJlYWQobmV3IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRDb21wYWN0UHJvdG9jb2wobmV3IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5USU9TdHJlYW1UcmFuc3BvcnQoaW4pKSk7CisgICAgfSBjYXRjaCAob3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB0ZSkgeworICAgICAgdGhyb3cgbmV3IGphdmEuaW8uSU9FeGNlcHRpb24odGUpOworICAgIH0KKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIFdvcmtlclJlc291cmNlc1N0YW5kYXJkU2NoZW1lRmFjdG9yeSBpbXBsZW1lbnRzIFNjaGVtZUZhY3RvcnkgeworICAgIHB1YmxpYyBXb3JrZXJSZXNvdXJjZXNTdGFuZGFyZFNjaGVtZSBnZXRTY2hlbWUoKSB7CisgICAgICByZXR1cm4gbmV3IFdvcmtlclJlc291cmNlc1N0YW5kYXJkU2NoZW1lKCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgV29ya2VyUmVzb3VyY2VzU3RhbmRhcmRTY2hlbWUgZXh0ZW5kcyBTdGFuZGFyZFNjaGVtZTxXb3JrZXJSZXNvdXJjZXM+IHsKKworICAgIHB1YmxpYyB2b2lkIHJlYWQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIGlwcm90LCBXb3JrZXJSZXNvdXJjZXMgc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5URmllbGQgc2NoZW1lRmllbGQ7CisgICAgICBpcHJvdC5yZWFkU3RydWN0QmVnaW4oKTsKKyAgICAgIHdoaWxlICh0cnVlKQorICAgICAgeworICAgICAgICBzY2hlbWVGaWVsZCA9IGlwcm90LnJlYWRGaWVsZEJlZ2luKCk7CisgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLlNUT1ApIHsgCisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChzY2hlbWVGaWVsZC5pZCkgeworICAgICAgICAgIGNhc2UgMTogLy8gTUVNX09OX0hFQVAKKyAgICAgICAgICAgIGlmIChzY2hlbWVGaWVsZC50eXBlID09IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRUeXBlLkRPVUJMRSkgeworICAgICAgICAgICAgICBzdHJ1Y3QubWVtX29uX2hlYXAgPSBpcHJvdC5yZWFkRG91YmxlKCk7CisgICAgICAgICAgICAgIHN0cnVjdC5zZXRfbWVtX29uX2hlYXBfaXNTZXQodHJ1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeyAKKyAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMjogLy8gTUVNX09GRl9IRUFQCisgICAgICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5ET1VCTEUpIHsKKyAgICAgICAgICAgICAgc3RydWN0Lm1lbV9vZmZfaGVhcCA9IGlwcm90LnJlYWREb3VibGUoKTsKKyAgICAgICAgICAgICAgc3RydWN0LnNldF9tZW1fb2ZmX2hlYXBfaXNTZXQodHJ1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeyAKKyAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgMzogLy8gQ1BVCisgICAgICAgICAgICBpZiAoc2NoZW1lRmllbGQudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5ET1VCTEUpIHsKKyAgICAgICAgICAgICAgc3RydWN0LmNwdSA9IGlwcm90LnJlYWREb3VibGUoKTsKKyAgICAgICAgICAgICAgc3RydWN0LnNldF9jcHVfaXNTZXQodHJ1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeyAKKyAgICAgICAgICAgICAgb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sVXRpbC5za2lwKGlwcm90LCBzY2hlbWVGaWVsZC50eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UUHJvdG9jb2xVdGlsLnNraXAoaXByb3QsIHNjaGVtZUZpZWxkLnR5cGUpOworICAgICAgICB9CisgICAgICAgIGlwcm90LnJlYWRGaWVsZEVuZCgpOworICAgICAgfQorICAgICAgaXByb3QucmVhZFN0cnVjdEVuZCgpOworICAgICAgc3RydWN0LnZhbGlkYXRlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGUob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIG9wcm90LCBXb3JrZXJSZXNvdXJjZXMgc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICBzdHJ1Y3QudmFsaWRhdGUoKTsKKworICAgICAgb3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbihTVFJVQ1RfREVTQyk7CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9tZW1fb25faGVhcCgpKSB7CisgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihNRU1fT05fSEVBUF9GSUVMRF9ERVNDKTsKKyAgICAgICAgb3Byb3Qud3JpdGVEb3VibGUoc3RydWN0Lm1lbV9vbl9oZWFwKTsKKyAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpOworICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5pc19zZXRfbWVtX29mZl9oZWFwKCkpIHsKKyAgICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKE1FTV9PRkZfSEVBUF9GSUVMRF9ERVNDKTsKKyAgICAgICAgb3Byb3Qud3JpdGVEb3VibGUoc3RydWN0Lm1lbV9vZmZfaGVhcCk7CisgICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKTsKKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X2NwdSgpKSB7CisgICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbihDUFVfRklFTERfREVTQyk7CisgICAgICAgIG9wcm90LndyaXRlRG91YmxlKHN0cnVjdC5jcHUpOworICAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCk7CisgICAgICB9CisgICAgICBvcHJvdC53cml0ZUZpZWxkU3RvcCgpOworICAgICAgb3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKTsKKyAgICB9CisKKyAgfQorCisgIHByaXZhdGUgc3RhdGljIGNsYXNzIFdvcmtlclJlc291cmNlc1R1cGxlU2NoZW1lRmFjdG9yeSBpbXBsZW1lbnRzIFNjaGVtZUZhY3RvcnkgeworICAgIHB1YmxpYyBXb3JrZXJSZXNvdXJjZXNUdXBsZVNjaGVtZSBnZXRTY2hlbWUoKSB7CisgICAgICByZXR1cm4gbmV3IFdvcmtlclJlc291cmNlc1R1cGxlU2NoZW1lKCk7CisgICAgfQorICB9CisKKyAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgV29ya2VyUmVzb3VyY2VzVHVwbGVTY2hlbWUgZXh0ZW5kcyBUdXBsZVNjaGVtZTxXb3JrZXJSZXNvdXJjZXM+IHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlKG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbCBwcm90LCBXb3JrZXJSZXNvdXJjZXMgc3RydWN0KSB0aHJvd3Mgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbiB7CisgICAgICBUVHVwbGVQcm90b2NvbCBvcHJvdCA9IChUVHVwbGVQcm90b2NvbCkgcHJvdDsKKyAgICAgIEJpdFNldCBvcHRpb25hbHMgPSBuZXcgQml0U2V0KCk7CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9tZW1fb25faGVhcCgpKSB7CisgICAgICAgIG9wdGlvbmFscy5zZXQoMCk7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9tZW1fb2ZmX2hlYXAoKSkgeworICAgICAgICBvcHRpb25hbHMuc2V0KDEpOworICAgICAgfQorICAgICAgaWYgKHN0cnVjdC5pc19zZXRfY3B1KCkpIHsKKyAgICAgICAgb3B0aW9uYWxzLnNldCgyKTsKKyAgICAgIH0KKyAgICAgIG9wcm90LndyaXRlQml0U2V0KG9wdGlvbmFscywgMyk7CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9tZW1fb25faGVhcCgpKSB7CisgICAgICAgIG9wcm90LndyaXRlRG91YmxlKHN0cnVjdC5tZW1fb25faGVhcCk7CisgICAgICB9CisgICAgICBpZiAoc3RydWN0LmlzX3NldF9tZW1fb2ZmX2hlYXAoKSkgeworICAgICAgICBvcHJvdC53cml0ZURvdWJsZShzdHJ1Y3QubWVtX29mZl9oZWFwKTsKKyAgICAgIH0KKyAgICAgIGlmIChzdHJ1Y3QuaXNfc2V0X2NwdSgpKSB7CisgICAgICAgIG9wcm90LndyaXRlRG91YmxlKHN0cnVjdC5jcHUpOworICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlYWQob3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFByb3RvY29sIHByb3QsIFdvcmtlclJlc291cmNlcyBzdHJ1Y3QpIHRocm93cyBvcmcuYXBhY2hlLnRocmlmdC5URXhjZXB0aW9uIHsKKyAgICAgIFRUdXBsZVByb3RvY29sIGlwcm90ID0gKFRUdXBsZVByb3RvY29sKSBwcm90OworICAgICAgQml0U2V0IGluY29taW5nID0gaXByb3QucmVhZEJpdFNldCgzKTsKKyAgICAgIGlmIChpbmNvbWluZy5nZXQoMCkpIHsKKyAgICAgICAgc3RydWN0Lm1lbV9vbl9oZWFwID0gaXByb3QucmVhZERvdWJsZSgpOworICAgICAgICBzdHJ1Y3Quc2V0X21lbV9vbl9oZWFwX2lzU2V0KHRydWUpOworICAgICAgfQorICAgICAgaWYgKGluY29taW5nLmdldCgxKSkgeworICAgICAgICBzdHJ1Y3QubWVtX29mZl9oZWFwID0gaXByb3QucmVhZERvdWJsZSgpOworICAgICAgICBzdHJ1Y3Quc2V0X21lbV9vZmZfaGVhcF9pc1NldCh0cnVlKTsKKyAgICAgIH0KKyAgICAgIGlmIChpbmNvbWluZy5nZXQoMikpIHsKKyAgICAgICAgc3RydWN0LmNwdSA9IGlwcm90LnJlYWREb3VibGUoKTsKKyAgICAgICAgc3RydWN0LnNldF9jcHVfaXNTZXQodHJ1ZSk7CisgICAgICB9CisgICAgfQorICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dyb3VwaW5nL0xvYWQuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9ncm91cGluZy9Mb2FkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEwYzc5MQotLS0gL2Rldi9udWxsCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9ncm91cGluZy9Mb2FkLmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYmFja3R5cGUuc3Rvcm0uZ3JvdXBpbmc7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKKworLyoqCisgKiBSZXByZXNlbnRzIHRoZSBsb2FkIHRoYXQgYSBCb2x0IGlzIGN1cnJlbnRseSB1bmRlciB0byBoZWxwIGluCisgKiBkZWNpZGluZyB3aGVyZSB0byByb3V0ZSBhIHR1cGxlLCB0byBoZWxwIGJhbGFuY2UgdGhlIGxvYWQuCisgKi8KK3B1YmxpYyBjbGFzcyBMb2FkIHsKKyAgICBwcml2YXRlIGJvb2xlYW4gaGFzTWV0cmljcyA9IGZhbHNlOworICAgIHByaXZhdGUgZG91YmxlIGJvbHRMb2FkID0gMC4wOyAvLzAgbm8gbG9hZCB0byAxIGZ1bGx5IGxvYWRlZAorICAgIHByaXZhdGUgZG91YmxlIGNvbm5lY3Rpb25Mb2FkID0gMC4wOyAvLzAgbm8gbG9hZCB0byAxIGZ1bGx5IGxvYWRlZAorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IGxvYWQKKyAgICAgKiBAcGFyYW0gaGFzTWV0cmljcyBoYXZlIG1ldHJpY3MgYmVlbiByZXBvcnRlZCB5ZXQ/CisgICAgICogQHBhcmFtIGJvbHRMb2FkIHRoZSBsb2FkIGFzIHJlcG9ydGVkIGJ5IHRoZSBib2x0IDAuMCBubyBsb2FkIDEuMCBmdWxseSBsb2FkZWQKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbkxvYWQgdGhlIGxvYWQgYXMgcmVwb3J0ZWQgYnkgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIGJvbHQgMC4wIG5vIGxvYWQgMS4wIGZ1bGx5IGxvYWRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTG9hZChib29sZWFuIGhhc01ldHJpY3MsIGRvdWJsZSBib2x0TG9hZCwgZG91YmxlIGNvbm5lY3Rpb25Mb2FkKSB7CisgICAgICAgIHRoaXMuaGFzTWV0cmljcyA9IGhhc01ldHJpY3M7CisgICAgICAgIHRoaXMuYm9sdExvYWQgPSBib2x0TG9hZDsKKyAgICAgICAgdGhpcy5jb25uZWN0aW9uTG9hZCA9IGNvbm5lY3Rpb25Mb2FkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBtZXRyaWNzIGhhdmUgYmVlbiByZXBvcnRlZCBzbyBmYXIuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzTWV0cmljcygpIHsKKyAgICAgICAgcmV0dXJuIGhhc01ldHJpY3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgbG9hZCBhcyByZXBvcnRlZCBieSB0aGUgYm9sdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZG91YmxlIGdldEJvbHRMb2FkKCkgeworICAgICAgICByZXR1cm4gYm9sdExvYWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgbG9hZCBhcyByZXBvcnRlZCBieSB0aGUgY29ubmVjdGlvbgorICAgICAqLworICAgIHB1YmxpYyBkb3VibGUgZ2V0Q29ubmVjdGlvbkxvYWQoKSB7CisgICAgICAgIHJldHVybiBjb25uZWN0aW9uTG9hZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBsb2FkIHRoYXQgaXMgYSBjb21iaW5hdGlvbiBvZiBzdWIgbG9hZHMuCisgICAgICovCisgICAgcHVibGljIGRvdWJsZSBnZXRMb2FkKCkgeworICAgICAgICBpZiAoIWhhc01ldHJpY3MpIHsKKyAgICAgICAgICAgIHJldHVybiAxLjA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb25Mb2FkID4gYm9sdExvYWQgPyBjb25uZWN0aW9uTG9hZCA6IGJvbHRMb2FkOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiWzpsb2FkICIrYm9sdExvYWQrIiAiK2Nvbm5lY3Rpb25Mb2FkKyJdIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ3JvdXBpbmcvTG9hZEF3YXJlQ3VzdG9tU3RyZWFtR3JvdXBpbmcuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9ncm91cGluZy9Mb2FkQXdhcmVDdXN0b21TdHJlYW1Hcm91cGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzOTI3M2YKLS0tIC9kZXYvbnVsbAorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ3JvdXBpbmcvTG9hZEF3YXJlQ3VzdG9tU3RyZWFtR3JvdXBpbmcuamF2YQpAQCAtMCwwICsxLDI0IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBiYWNrdHlwZS5zdG9ybS5ncm91cGluZzsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitwdWJsaWMgaW50ZXJmYWNlIExvYWRBd2FyZUN1c3RvbVN0cmVhbUdyb3VwaW5nIGV4dGVuZHMgQ3VzdG9tU3RyZWFtR3JvdXBpbmcgeworICAgTGlzdDxJbnRlZ2VyPiBjaG9vc2VUYXNrcyhpbnQgdGFza0lkLCBMaXN0PE9iamVjdD4gdmFsdWVzLCBMb2FkTWFwcGluZyBsb2FkKTsKK30KZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9ncm91cGluZy9Mb2FkQXdhcmVTaHVmZmxlR3JvdXBpbmcuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9ncm91cGluZy9Mb2FkQXdhcmVTaHVmZmxlR3JvdXBpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTliNTg1Ci0tLSAvZGV2L251bGwKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dyb3VwaW5nL0xvYWRBd2FyZVNodWZmbGVHcm91cGluZy5qYXZhCkBAIC0wLDAgKzEsNzYgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGJhY2t0eXBlLnN0b3JtLmdyb3VwaW5nOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CisKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5nZW5lcmF0ZWQuR2xvYmFsU3RyZWFtSWQ7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0udGFzay5Xb3JrZXJUb3BvbG9neUNvbnRleHQ7CisKK3B1YmxpYyBjbGFzcyBMb2FkQXdhcmVTaHVmZmxlR3JvdXBpbmcgaW1wbGVtZW50cyBMb2FkQXdhcmVDdXN0b21TdHJlYW1Hcm91cGluZywgU2VyaWFsaXphYmxlIHsKKyAgICBwcml2YXRlIFJhbmRvbSByYW5kb207CisgICAgcHJpdmF0ZSBMaXN0PEludGVnZXI+W10gcmV0czsKKyAgICBwcml2YXRlIGludFtdIHRhcmdldHM7CisgICAgcHJpdmF0ZSBpbnRbXSBsb2FkczsKKyAgICBwcml2YXRlIGludCB0b3RhbDsKKyAgICBwcml2YXRlIGxvbmcgbGFzdFVwZGF0ZSA9IDA7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBwcmVwYXJlKFdvcmtlclRvcG9sb2d5Q29udGV4dCBjb250ZXh0LCBHbG9iYWxTdHJlYW1JZCBzdHJlYW0sIExpc3Q8SW50ZWdlcj4gdGFyZ2V0VGFza3MpIHsKKyAgICAgICAgcmFuZG9tID0gbmV3IFJhbmRvbSgpOworICAgICAgICByZXRzID0gKExpc3Q8SW50ZWdlcj5bXSluZXcgTGlzdDw/Plt0YXJnZXRUYXNrcy5zaXplKCldOworICAgICAgICB0YXJnZXRzID0gbmV3IGludFt0YXJnZXRUYXNrcy5zaXplKCldOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhcmdldHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHJldHNbaV0gPSBBcnJheXMuYXNMaXN0KHRhcmdldFRhc2tzLmdldChpKSk7CisgICAgICAgICAgICB0YXJnZXRzW2ldID0gdGFyZ2V0VGFza3MuZ2V0KGkpOworICAgICAgICB9CisgICAgICAgIGxvYWRzID0gbmV3IGludFt0YXJnZXRzLmxlbmd0aF07CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8SW50ZWdlcj4gY2hvb3NlVGFza3MoaW50IHRhc2tJZCwgTGlzdDxPYmplY3Q+IHZhbHVlcykgeworICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTk9UIElNUExFTUVOVEVEIik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8SW50ZWdlcj4gY2hvb3NlVGFza3MoaW50IHRhc2tJZCwgTGlzdDxPYmplY3Q+IHZhbHVlcywgTG9hZE1hcHBpbmcgbG9hZCkgeworICAgICAgICBpZiAoKGxhc3RVcGRhdGUgKyAxMDAwKSA8IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKSB7CisgICAgICAgICAgICBpbnQgbG9jYWxfdG90YWwgPSAwOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YXJnZXRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaW50IHZhbCA9IChpbnQpKDEwMSAtIChsb2FkLmdldCh0YXJnZXRzW2ldKSAqIDEwMCkpOworICAgICAgICAgICAgICAgIGxvYWRzW2ldID0gdmFsOworICAgICAgICAgICAgICAgIGxvY2FsX3RvdGFsICs9IHZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRvdGFsID0gbG9jYWxfdG90YWw7CisgICAgICAgICAgICBsYXN0VXBkYXRlID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIH0KKyAgICAgICAgaW50IHNlbGVjdGVkID0gcmFuZG9tLm5leHRJbnQodG90YWwpOworICAgICAgICBpbnQgc3VtID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YXJnZXRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBzdW0gKz0gbG9hZHNbaV07CisgICAgICAgICAgICBpZiAoc2VsZWN0ZWQgPCBzdW0pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0c1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0c1tyZXRzLmxlbmd0aC0xXTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ3JvdXBpbmcvTG9hZE1hcHBpbmcuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9ncm91cGluZy9Mb2FkTWFwcGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZDg5ODMKLS0tIC9kZXYvbnVsbAorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ3JvdXBpbmcvTG9hZE1hcHBpbmcuamF2YQpAQCAtMCwwICsxLDY0IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBiYWNrdHlwZS5zdG9ybS5ncm91cGluZzsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2U7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworLyoqCisgKiBIb2xkcyBhIGxpc3Qgb2YgdGhlIGN1cnJlbnQgbG9hZHMKKyAqLworcHVibGljIGNsYXNzIExvYWRNYXBwaW5nIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2FkIE5PVF9DT05ORUNURUQgPSBuZXcgTG9hZChmYWxzZSwgMS4wLCAxLjApOworICAgIHByaXZhdGUgZmluYWwgQXRvbWljUmVmZXJlbmNlPE1hcDxJbnRlZ2VyLExvYWQ+PiBfbG9jYWwgPSBuZXcgQXRvbWljUmVmZXJlbmNlPE1hcDxJbnRlZ2VyLExvYWQ+PihuZXcgSGFzaE1hcDxJbnRlZ2VyLExvYWQ+KCkpOworICAgIHByaXZhdGUgZmluYWwgQXRvbWljUmVmZXJlbmNlPE1hcDxJbnRlZ2VyLExvYWQ+PiBfcmVtb3RlID0gbmV3IEF0b21pY1JlZmVyZW5jZTxNYXA8SW50ZWdlcixMb2FkPj4obmV3IEhhc2hNYXA8SW50ZWdlcixMb2FkPigpKTsKKworICAgIHB1YmxpYyB2b2lkIHNldExvY2FsKE1hcDxJbnRlZ2VyLCBEb3VibGU+IGxvY2FsKSB7CisgICAgICAgIE1hcDxJbnRlZ2VyLCBMb2FkPiBuZXdMb2NhbCA9IG5ldyBIYXNoTWFwPEludGVnZXIsIExvYWQ+KCk7CisgICAgICAgIGlmIChsb2NhbCAhPSBudWxsKSB7CisgICAgICAgICAgZm9yIChNYXAuRW50cnk8SW50ZWdlciwgRG91YmxlPiBlbnRyeTogbG9jYWwuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgbmV3TG9jYWwucHV0KGVudHJ5LmdldEtleSgpLCBuZXcgTG9hZCh0cnVlLCBlbnRyeS5nZXRWYWx1ZSgpLCAwLjApKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgX2xvY2FsLnNldChuZXdMb2NhbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UmVtb3RlKE1hcDxJbnRlZ2VyLCBMb2FkPiByZW1vdGUpIHsKKyAgICAgICAgaWYgKHJlbW90ZSAhPSBudWxsKSB7CisgICAgICAgICAgX3JlbW90ZS5zZXQobmV3IEhhc2hNYXA8SW50ZWdlciwgTG9hZD4ocmVtb3RlKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgX3JlbW90ZS5zZXQobmV3IEhhc2hNYXA8SW50ZWdlciwgTG9hZD4oKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgTG9hZCBnZXRMb2FkKGludCB0YXNrKSB7CisgICAgICAgIExvYWQgcmV0ID0gX2xvY2FsLmdldCgpLmdldCh0YXNrKTsKKyAgICAgICAgaWYgKHJldCA9PSBudWxsKSB7CisgICAgICAgICAgcmV0ID0gX3JlbW90ZS5nZXQoKS5nZXQodGFzayk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJldCA9PSBudWxsKSB7CisgICAgICAgICAgcmV0ID0gTk9UX0NPTk5FQ1RFRDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHB1YmxpYyBkb3VibGUgZ2V0KGludCB0YXNrKSB7CisgICAgICAgIHJldHVybiBnZXRMb2FkKHRhc2spLmdldExvYWQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ3JvdXBpbmcvUGFydGlhbEtleUdyb3VwaW5nLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ3JvdXBpbmcvUGFydGlhbEtleUdyb3VwaW5nLmphdmEKaW5kZXggNDNhZDVhMC4uZTkyMTU2ZSAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dyb3VwaW5nL1BhcnRpYWxLZXlHcm91cGluZy5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9ncm91cGluZy9QYXJ0aWFsS2V5R3JvdXBpbmcuamF2YQpAQCAtMjQsNyArMjQsNiBAQAogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiBpbXBvcnQgYmFja3R5cGUuc3Rvcm0uZ2VuZXJhdGVkLkdsb2JhbFN0cmVhbUlkOwotaW1wb3J0IGJhY2t0eXBlLnN0b3JtLmdyb3VwaW5nLkN1c3RvbVN0cmVhbUdyb3VwaW5nOwogaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnRhc2suV29ya2VyVG9wb2xvZ3lDb250ZXh0OwogaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnR1cGxlLkZpZWxkczsKIApAQCAtNTksOSArNTgsOSBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIExpc3Q8SW50ZWdlcj4gY2hvb3NlVGFza3MoaW50IHRhc2tJZCwgTGlzdDxPYmplY3Q+IHZhbHVlcykgewotICAgICAgICBMaXN0PEludGVnZXI+IGJvbHRJZHMgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KDEpOworICAgICAgICBMaXN0PEludGVnZXI+IGJvbHRJZHMgPSBuZXcgQXJyYXlMaXN0PD4oMSk7CiAgICAgICAgIGlmICh2YWx1ZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgYnl0ZVtdIHJhdyA9IG51bGw7CisgICAgICAgICAgICBieXRlW10gcmF3OwogICAgICAgICAgICAgaWYgKGZpZWxkcyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgTGlzdDxPYmplY3Q+IHNlbGVjdGVkRmllbGRzID0gb3V0RmllbGRzLnNlbGVjdChmaWVsZHMsIHZhbHVlcyk7CiAgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciBvdXQgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKHNlbGVjdGVkRmllbGRzLnNpemUoKSAqIDQpOwpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dyb3VwaW5nL1NodWZmbGVHcm91cGluZy5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2dyb3VwaW5nL1NodWZmbGVHcm91cGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNzU1YmIKLS0tIC9kZXYvbnVsbAorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vZ3JvdXBpbmcvU2h1ZmZsZUdyb3VwaW5nLmphdmEKQEAgLTAsMCArMSw2NSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYmFja3R5cGUuc3Rvcm0uZ3JvdXBpbmc7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CisKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5nZW5lcmF0ZWQuR2xvYmFsU3RyZWFtSWQ7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0udGFzay5Xb3JrZXJUb3BvbG9neUNvbnRleHQ7CisKK3B1YmxpYyBjbGFzcyBTaHVmZmxlR3JvdXBpbmcgaW1wbGVtZW50cyBDdXN0b21TdHJlYW1Hcm91cGluZywgU2VyaWFsaXphYmxlIHsKKyAgICBwcml2YXRlIFJhbmRvbSByYW5kb207CisgICAgcHJpdmF0ZSBBcnJheUxpc3Q8TGlzdDxJbnRlZ2VyPj4gY2hvaWNlczsKKyAgICBwcml2YXRlIEF0b21pY0ludGVnZXIgY3VycmVudDsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHByZXBhcmUoV29ya2VyVG9wb2xvZ3lDb250ZXh0IGNvbnRleHQsIEdsb2JhbFN0cmVhbUlkIHN0cmVhbSwgTGlzdDxJbnRlZ2VyPiB0YXJnZXRUYXNrcykgeworICAgICAgICByYW5kb20gPSBuZXcgUmFuZG9tKCk7CisgICAgICAgIGNob2ljZXMgPSBuZXcgQXJyYXlMaXN0PExpc3Q8SW50ZWdlcj4+KHRhcmdldFRhc2tzLnNpemUoKSk7CisgICAgICAgIGZvciAoSW50ZWdlciBpOiB0YXJnZXRUYXNrcykgeworICAgICAgICAgICAgY2hvaWNlcy5hZGQoQXJyYXlzLmFzTGlzdChpKSk7CisgICAgICAgIH0KKyAgICAgICAgQ29sbGVjdGlvbnMuc2h1ZmZsZShjaG9pY2VzLCByYW5kb20pOworICAgICAgICBjdXJyZW50ID0gbmV3IEF0b21pY0ludGVnZXIoMCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8SW50ZWdlcj4gY2hvb3NlVGFza3MoaW50IHRhc2tJZCwgTGlzdDxPYmplY3Q+IHZhbHVlcykgeworICAgICAgICBpbnQgcmlnaHROb3c7CisgICAgICAgIGludCBzaXplID0gY2hvaWNlcy5zaXplKCk7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICByaWdodE5vdyA9IGN1cnJlbnQuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgICAgICAgICBpZiAocmlnaHROb3cgPCBzaXplKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNob2ljZXMuZ2V0KHJpZ2h0Tm93KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocmlnaHROb3cgPT0gc2l6ZSkgeworICAgICAgICAgICAgICAgIGN1cnJlbnQuc2V0KDApOworICAgICAgICAgICAgICAgIC8vVGhpcyBzaG91bGQgYmUgdGhyZWFkIHNhZmUgc28gbG9uZyBhcyBBcnJheUxpc3QgZG9lcyBub3QgaGF2ZSBhbnkgaW50ZXJuYWwgc3RhdGUgdGhhdCBjYW4gYmUgbWVzc2VkIHVwIGJ5IG11bHRpLXRyZWFkZWQgYWNjZXNzLgorICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLnNodWZmbGUoY2hvaWNlcywgcmFuZG9tKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gY2hvaWNlcy5nZXQoMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvL3JhY2UgY29uZGl0aW9uIHdpdGggYW5vdGhlciB0aHJlYWQsIGFuZCB3ZSBsb3N0CisgICAgICAgICAgICAvLyB0cnkgYWdhaW4KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9ob29rcy9CYXNlV29ya2VySG9vay5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2hvb2tzL0Jhc2VXb3JrZXJIb29rLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE0NmFjMgotLS0gL2Rldi9udWxsCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9ob29rcy9CYXNlV29ya2VySG9vay5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGJhY2t0eXBlLnN0b3JtLmhvb2tzOworCitpbXBvcnQgYmFja3R5cGUuc3Rvcm0udGFzay5Xb3JrZXJUb3BvbG9neUNvbnRleHQ7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIEEgQmFzZVdvcmtlckhvb2sgaXMgYSBub29wIGltcGxlbWVudGF0aW9uIG9mIElXb3JrZXJIb29rLiBZb3UKKyAqIG1heSBleHRlbmRzIHRoaXMgY2xhc3MgYW5kIGltcGxlbWVudCBhbnkgYW5kL29yIGFsbCBtZXRob2RzIHlvdQorICogbmVlZCBmb3IgeW91ciB3b3JrZXJzLgorICovCitwdWJsaWMgY2xhc3MgQmFzZVdvcmtlckhvb2sgaW1wbGVtZW50cyBJV29ya2VySG9vaywgU2VyaWFsaXphYmxlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyNTg5NDY2NDg1MTk4MzM5NTI5TDsKKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGEgd29ya2VyIGlzIHN0YXJ0ZWQKKyAgICAgKgorICAgICAqIEBwYXJhbSBzdG9ybUNvbmYgVGhlIFN0b3JtIGNvbmZpZ3VyYXRpb24gZm9yIHRoaXMgd29ya2VyCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhpcyBvYmplY3QgY2FuIGJlIHVzZWQgdG8gZ2V0IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgd29ya2VyJ3MgcGxhY2Ugd2l0aGluIHRoZSB0b3BvbG9neQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHN0YXJ0KE1hcCBzdG9ybUNvbmYsIFdvcmtlclRvcG9sb2d5Q29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIC8vIE5PT1AKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgcmlnaHQgYmVmb3JlIGEgd29ya2VyIHNodXRzIGRvd24KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzaHV0ZG93bigpIHsKKyAgICAgICAgLy8gTk9PUAorICAgIH0KK30KZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9ob29rcy9JV29ya2VySG9vay5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2hvb2tzL0lXb3JrZXJIb29rLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZiMzk0NgotLS0gL2Rldi9udWxsCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9ob29rcy9JV29ya2VySG9vay5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGJhY2t0eXBlLnN0b3JtLmhvb2tzOworCitpbXBvcnQgYmFja3R5cGUuc3Rvcm0udGFzay5Xb3JrZXJUb3BvbG9neUNvbnRleHQ7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIEFuIElXb3JrZXJIb29rIHJlcHJlc2VudHMgYSB0b3BvbG9neSBjb21wb25lbnQgdGhhdCBjYW4gYmUgZXhlY3V0ZWQKKyAqIHdoZW4gYSB3b3JrZXIgc3RhcnRzLCBhbmQgd2hlbiBhIHdvcmtlciBzaHV0cyBkb3duLiBJdCBjYW4gYmUgdXNlZnVsCisgKiB3aGVuIHlvdSB3YW50IHRvIGV4ZWN1dGUgb3BlcmF0aW9ucyBiZWZvcmUgdG9wb2xvZ3kgcHJvY2Vzc2luZyBzdGFydHMsCisgKiBvciBjbGVhbnVwIG9wZXJhdGlvbnMgYmVmb3JlIHlvdXIgd29ya2VycyBzaHV0IGRvd24uCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSVdvcmtlckhvb2sgZXh0ZW5kcyBTZXJpYWxpemFibGUgeworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIGEgd29ya2VyIGlzIHN0YXJ0ZWQKKyAgICAgKgorICAgICAqIEBwYXJhbSBzdG9ybUNvbmYgVGhlIFN0b3JtIGNvbmZpZ3VyYXRpb24gZm9yIHRoaXMgd29ya2VyCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhpcyBvYmplY3QgY2FuIGJlIHVzZWQgdG8gZ2V0IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgd29ya2VyJ3MgcGxhY2Ugd2l0aGluIHRoZSB0b3BvbG9neQorICAgICAqLworICAgIHZvaWQgc3RhcnQoTWFwIHN0b3JtQ29uZiwgV29ya2VyVG9wb2xvZ3lDb250ZXh0IGNvbnRleHQpOworCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHJpZ2h0IGJlZm9yZSBhIHdvcmtlciBzaHV0cyBkb3duCisgICAgICovCisgICAgdm9pZCBzaHV0ZG93bigpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9sb2dnaW5nL1RocmlmdEFjY2Vzc0xvZ2dlci5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2xvZ2dpbmcvVGhyaWZ0QWNjZXNzTG9nZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM3NGFmMAotLS0gL2Rldi9udWxsCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9sb2dnaW5nL1RocmlmdEFjY2Vzc0xvZ2dlci5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGJhY2t0eXBlLnN0b3JtLmxvZ2dpbmc7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworcHVibGljIGNsYXNzIFRocmlmdEFjY2Vzc0xvZ2dlciB7CisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihUaHJpZnRBY2Nlc3NMb2dnZXIuY2xhc3MpOworICBwdWJsaWMgdm9pZCBsb2coU3RyaW5nIGxvZ01lc3NhZ2UpIHsKKyAgICBMT0cuaW5mbyhsb2dNZXNzYWdlKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2xvZ2dpbmcvZmlsdGVycy9BY2Nlc3NMb2dnaW5nRmlsdGVyLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vbG9nZ2luZy9maWx0ZXJzL0FjY2Vzc0xvZ2dpbmdGaWx0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzM2OGYxCi0tLSAvZGV2L251bGwKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL2xvZ2dpbmcvZmlsdGVycy9BY2Nlc3NMb2dnaW5nRmlsdGVyLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYmFja3R5cGUuc3Rvcm0ubG9nZ2luZy5maWx0ZXJzOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXJDaGFpbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlckNvbmZpZzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworCitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworcHVibGljIGNsYXNzIEFjY2Vzc0xvZ2dpbmdGaWx0ZXIgaW1wbGVtZW50cyBGaWx0ZXIgeworCisgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihBY2Nlc3NMb2dnaW5nRmlsdGVyLmNsYXNzKTsKKyAgcHVibGljIHZvaWQgaW5pdChGaWx0ZXJDb25maWcgY29uZmlnKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisgIH0KKworICBwdWJsaWMgdm9pZCBkb0ZpbHRlcihTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsIEZpbHRlckNoYWluIGNoYWluKSB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworICAgIGhhbmRsZSgoSHR0cFNlcnZsZXRSZXF1ZXN0KXJlcXVlc3QsIChIdHRwU2VydmxldFJlc3BvbnNlKXJlc3BvbnNlLCBjaGFpbik7CisgIH0KKworICBwdWJsaWMgdm9pZCBoYW5kbGUoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsIEZpbHRlckNoYWluIGNoYWluKSB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb257CisgICAgaWYgKHJlcXVlc3QgIT0gbnVsbCkgeworICAgICAgTE9HLmluZm8oIkFjY2VzcyBmcm9tOiB7fSB1cmw6IHt9IHByaW5jaXBhbDoge30iLCByZXF1ZXN0LmdldFJlbW90ZUFkZHIoKSwgcmVxdWVzdC5nZXRSZXF1ZXN0VVJMKCksCisgICAgICAgICAgICAgIChyZXF1ZXN0LmdldFVzZXJQcmluY2lwYWwoKSA9PSBudWxsID8gIiIgOiByZXF1ZXN0LmdldFVzZXJQcmluY2lwYWwoKS5nZXROYW1lKCkpKTsKKyAgICB9CisgICAgY2hhaW4uZG9GaWx0ZXIocmVxdWVzdCwgcmVzcG9uc2UpOworICB9CisKKyAgcHVibGljIHZvaWQgZGVzdHJveSgpIHsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvc3Rvcm0tc3RhcnRlci90ZXN0L2p2bS9zdG9ybS9zdGFydGVyL3Rvb2xzL01vY2tUdXBsZUhlbHBlcnMuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXNzYWdpbmcvQWRkcmVzc2VkVHVwbGUuamF2YQpzaW1pbGFyaXR5IGluZGV4IDYwJQpjb3B5IGZyb20gZXhhbXBsZXMvc3Rvcm0tc3RhcnRlci90ZXN0L2p2bS9zdG9ybS9zdGFydGVyL3Rvb2xzL01vY2tUdXBsZUhlbHBlcnMuamF2YQpjb3B5IHRvIHN0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXNzYWdpbmcvQWRkcmVzc2VkVHVwbGUuamF2YQppbmRleCBiMjUzMzUwLi5kZTlhM2U2IDEwMDY0NAotLS0gYS9leGFtcGxlcy9zdG9ybS1zdGFydGVyL3Rlc3QvanZtL3N0b3JtL3N0YXJ0ZXIvdG9vbHMvTW9ja1R1cGxlSGVscGVycy5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXNzYWdpbmcvQWRkcmVzc2VkVHVwbGUuamF2YQpAQCAtMTUsMjYgKzE1LDMyIEBACiAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwotcGFja2FnZSBzdG9ybS5zdGFydGVyLnRvb2xzOworcGFja2FnZSBiYWNrdHlwZS5zdG9ybS5tZXNzYWdpbmc7CiAKLWltcG9ydCBiYWNrdHlwZS5zdG9ybS5Db25zdGFudHM7CiBpbXBvcnQgYmFja3R5cGUuc3Rvcm0udHVwbGUuVHVwbGU7CiAKLWltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by4qOworLyoqCisgKiBBIFR1cGxlIHRoYXQgaXMgYWRkcmVzc2VkIHRvIGEgZGVzdGluYXRpb24uCisgKi8KK3B1YmxpYyBjbGFzcyBBZGRyZXNzZWRUdXBsZSB7CisgICAgcHVibGljIGZpbmFsIFR1cGxlIHR1cGxlOworICAgIHB1YmxpYyBmaW5hbCBpbnQgZGVzdDsKIAotcHVibGljIGZpbmFsIGNsYXNzIE1vY2tUdXBsZUhlbHBlcnMgeworICAgIHB1YmxpYyBBZGRyZXNzZWRUdXBsZShpbnQgZGVzdCwgVHVwbGUgdHVwbGUpIHsKKyAgICAgICAgdGhpcy5kZXN0ID0gZGVzdDsKKyAgICAgICAgdGhpcy50dXBsZSA9IHR1cGxlOworICAgIH0KIAotICBwcml2YXRlIE1vY2tUdXBsZUhlbHBlcnMoKSB7Ci0gIH0KKyAgICBwdWJsaWMgVHVwbGUgZ2V0VHVwbGUoKSB7CisgICAgICAgIHJldHVybiB0dXBsZTsKKyAgICB9CiAKLSAgcHVibGljIHN0YXRpYyBUdXBsZSBtb2NrVGlja1R1cGxlKCkgewotICAgIHJldHVybiBtb2NrVHVwbGUoQ29uc3RhbnRzLlNZU1RFTV9DT01QT05FTlRfSUQsIENvbnN0YW50cy5TWVNURU1fVElDS19TVFJFQU1fSUQpOwotICB9CisgICAgcHVibGljIGludCBnZXREZXN0KCkgeworICAgICAgICByZXR1cm4gZGVzdDsKKyAgICB9CiAKLSAgcHVibGljIHN0YXRpYyBUdXBsZSBtb2NrVHVwbGUoU3RyaW5nIGNvbXBvbmVudElkLCBTdHJpbmcgc3RyZWFtSWQpIHsKLSAgICBUdXBsZSB0dXBsZSA9IG1vY2soVHVwbGUuY2xhc3MpOwotICAgIHdoZW4odHVwbGUuZ2V0U291cmNlQ29tcG9uZW50KCkpLnRoZW5SZXR1cm4oY29tcG9uZW50SWQpOwotICAgIHdoZW4odHVwbGUuZ2V0U291cmNlU3RyZWFtSWQoKSkudGhlblJldHVybihzdHJlYW1JZCk7Ci0gICAgcmV0dXJuIHR1cGxlOwotICB9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJbZGVzdDogIitkZXN0KyIgdHVwbGU6ICIrdHVwbGUrIl0iOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXNzYWdpbmcvQ29ubmVjdGlvbldpdGhTdGF0dXMuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXNzYWdpbmcvQ29ubmVjdGlvbldpdGhTdGF0dXMuamF2YQppbmRleCAzNzk4MWNhLi5iOTJiMGQ2IDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vbWVzc2FnaW5nL0Nvbm5lY3Rpb25XaXRoU3RhdHVzLmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21lc3NhZ2luZy9Db25uZWN0aW9uV2l0aFN0YXR1cy5qYXZhCkBAIC0zOSw5ICszOSw5IEBACiAgICAgICogZGF0YSBzZW5kaW5nIG9yIHJlY2VpdmluZy4gQWxsIGRhdGEgc2VuZGluZyByZXF1ZXN0IHdpbGwgYmUgZHJvcHBlZC4KICAgICAgKi8KICAgICBDbG9zZWQKLSAgfTsKKyAgfQogCi0gIC8qKgorICAgIC8qKgogICAgKiB3aGV0aGVyIHRoaXMgY29ubmVjdGlvbiBpcyBhdmFpbGFibGUgdG8gdHJhbnNmZXIgZGF0YQogICAgKi8KICAgcHVibGljIGFic3RyYWN0IFN0YXR1cyBzdGF0dXMoKTsKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXNzYWdpbmcvRGVzZXJpYWxpemluZ0Nvbm5lY3Rpb25DYWxsYmFjay5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21lc3NhZ2luZy9EZXNlcmlhbGl6aW5nQ29ubmVjdGlvbkNhbGxiYWNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUyZDNhYQotLS0gL2Rldi9udWxsCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXNzYWdpbmcvRGVzZXJpYWxpemluZ0Nvbm5lY3Rpb25DYWxsYmFjay5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGJhY2t0eXBlLnN0b3JtLm1lc3NhZ2luZzsKKworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnRhc2suR2VuZXJhbFRvcG9sb2d5Q29udGV4dDsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS50dXBsZS5BZGRyZXNzZWRUdXBsZTsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5zZXJpYWxpemF0aW9uLktyeW9UdXBsZURlc2VyaWFsaXplcjsKKworaW1wb3J0IGNsb2p1cmUubGFuZy5JRm47CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogQSBjbGFzcyB0aGF0IGlzIGNhbGxlZCB3aGVuIGEgVGFza01lc3NhZ2UgYXJyaXZlcy4KKyAqLworcHVibGljIGNsYXNzIERlc2VyaWFsaXppbmdDb25uZWN0aW9uQ2FsbGJhY2sgaW1wbGVtZW50cyBJQ29ubmVjdGlvbkNhbGxiYWNrIHsKKyAgICBwcml2YXRlIGZpbmFsIElGbiBfY2I7CisgICAgcHJpdmF0ZSBmaW5hbCBNYXAgX2NvbmY7CisgICAgcHJpdmF0ZSBmaW5hbCBHZW5lcmFsVG9wb2xvZ3lDb250ZXh0IF9jb250ZXh0OworICAgIHByaXZhdGUgZmluYWwgVGhyZWFkTG9jYWw8S3J5b1R1cGxlRGVzZXJpYWxpemVyPiBfZGVzID0KKyAgICAgICAgIG5ldyBUaHJlYWRMb2NhbDxLcnlvVHVwbGVEZXNlcmlhbGl6ZXI+KCkgeworICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgIHByb3RlY3RlZCBLcnlvVHVwbGVEZXNlcmlhbGl6ZXIgaW5pdGlhbFZhbHVlKCkgeworICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEtyeW9UdXBsZURlc2VyaWFsaXplcihfY29uZiwgX2NvbnRleHQpOworICAgICAgICAgICAgIH0KKyAgICAgICAgIH07CisKKyAgICBwdWJsaWMgRGVzZXJpYWxpemluZ0Nvbm5lY3Rpb25DYWxsYmFjayhmaW5hbCBNYXAgY29uZiwgZmluYWwgR2VuZXJhbFRvcG9sb2d5Q29udGV4dCBjb250ZXh0LCBJRm4gY2FsbGJhY2spIHsKKyAgICAgICAgX2NvbmYgPSBjb25mOworICAgICAgICBfY29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIF9jYiA9IGNhbGxiYWNrOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlY3YoTGlzdDxUYXNrTWVzc2FnZT4gYmF0Y2gpIHsKKyAgICAgICAgS3J5b1R1cGxlRGVzZXJpYWxpemVyIGRlcyA9IF9kZXMuZ2V0KCk7CisgICAgICAgIEFycmF5TGlzdDxBZGRyZXNzZWRUdXBsZT4gcmV0ID0gbmV3IEFycmF5TGlzdDw+KGJhdGNoLnNpemUoKSk7CisgICAgICAgIGZvciAoVGFza01lc3NhZ2UgbWVzc2FnZTogYmF0Y2gpIHsKKyAgICAgICAgICAgIHJldC5hZGQobmV3IEFkZHJlc3NlZFR1cGxlKG1lc3NhZ2UudGFzaygpLCBkZXMuZGVzZXJpYWxpemUobWVzc2FnZS5tZXNzYWdlKCkpKSk7CisgICAgICAgIH0KKyAgICAgICAgX2NiLmludm9rZShyZXQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXNzYWdpbmcvSUNvbm5lY3Rpb24uamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXNzYWdpbmcvSUNvbm5lY3Rpb24uamF2YQppbmRleCBlYWQ0OTM1Li5hMDNiM2EyIDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vbWVzc2FnaW5nL0lDb25uZWN0aW9uLmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21lc3NhZ2luZy9JQ29ubmVjdGlvbi5qYXZhCkBAIC0xNywxNiArMTcsMjMgQEAKICAqLwogcGFja2FnZSBiYWNrdHlwZS5zdG9ybS5tZXNzYWdpbmc7CiAKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5ncm91cGluZy5Mb2FkOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOwogCi1wdWJsaWMgaW50ZXJmYWNlIElDb25uZWN0aW9uIHsgICAKLSAgICAKK3B1YmxpYyBpbnRlcmZhY2UgSUNvbm5lY3Rpb24gewogICAgIC8qKgotICAgICAqIHJlY2VpdmUgYSBiYXRjaCBtZXNzYWdlIGl0ZXJhdG9yIChjb25zaXN0cyB0YXNrSWQgYW5kIHBheWxvYWQpCi0gICAgICogQHBhcmFtIGZsYWdzIDA6IGJsb2NrLCAxOiBub24tYmxvY2sKLSAgICAgKiBAcmV0dXJuCisgICAgICogUmVnaXN0ZXIgYSBjYWxsYmFjayB0byBiZSBub3RpZmllZCB3aGVuIGRhdGEgaXMgcmVhZHkgdG8gYmUgcHJvY2Vzc2VkLgorICAgICAqIEBwYXJhbSBjYiB0aGUgY2FsbGJhY2sgdG8gcHJvY2VzcyB0aGUgbWVzc2FnZXMuCiAgICAgICovCi0gICAgcHVibGljIEl0ZXJhdG9yPFRhc2tNZXNzYWdlPiByZWN2KGludCBmbGFncywgaW50IGNsaWVudElkKTsKKyAgICBwdWJsaWMgdm9pZCByZWdpc3RlclJlY3YoSUNvbm5lY3Rpb25DYWxsYmFjayBjYik7CisKKyAgICAvKioKKyAgICAgKiBTZW5kIGxvYWQgbWV0cmljcyB0byBhbGwgZG93bnN0cmVhbSBjb25uZWN0aW9ucy4KKyAgICAgKiBAcGFyYW0gdGFza1RvTG9hZCBhIG1hcCBmcm9tIHRoZSB0YXNrIGlkIHRvIHRoZSBsb2FkIGZvciB0aGF0IHRhc2suCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2VuZExvYWRNZXRyaWNzKE1hcDxJbnRlZ2VyLCBEb3VibGU+IHRhc2tUb0xvYWQpOwogICAgIAogICAgIC8qKgogICAgICAqIHNlbmQgYSBtZXNzYWdlIHdpdGggdGFza0lkIGFuZCBwYXlsb2FkCkBAIC00Myw2ICs1MCwxMyBAQAogICAgIHB1YmxpYyB2b2lkIHNlbmQoSXRlcmF0b3I8VGFza01lc3NhZ2U+IG1zZ3MpOwogICAgIAogICAgIC8qKgorICAgICAqIEdldCB0aGUgY3VycmVudCBsb2FkIGZvciB0aGUgZ2l2ZW4gdGFza3MKKyAgICAgKiBAcGFyYW0gdGFza3MgdGhlIHRhc2tzIHRvIGxvb2sgZm9yLgorICAgICAqIEByZXR1cm4gYSBMb2FkIGZvciBlYWNoIG9mIHRoZSB0YXNrcyBpdCBrbm93cyBhYm91dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWFwPEludGVnZXIsIExvYWQ+IGdldExvYWQoQ29sbGVjdGlvbjxJbnRlZ2VyPiB0YXNrcyk7CisKKyAgICAvKioKICAgICAgKiBjbG9zZSB0aGlzIGNvbm5lY3Rpb24KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpOwpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21lc3NhZ2luZy9JQ29ubmVjdGlvbkNhbGxiYWNrLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vbWVzc2FnaW5nL0lDb25uZWN0aW9uQ2FsbGJhY2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2YwODI4Ci0tLSAvZGV2L251bGwKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21lc3NhZ2luZy9JQ29ubmVjdGlvbkNhbGxiYWNrLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYmFja3R5cGUuc3Rvcm0ubWVzc2FnaW5nOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogQSBjbGFzcyB0aGF0IGlzIGNhbGxlZCB3aGVuIGEgVGFza01lc3NhZ2UgYXJyaXZlcy4KKyAqLworcHVibGljIGludGVyZmFjZSBJQ29ubmVjdGlvbkNhbGxiYWNrIHsKKyAgICAvKioKKyAgICAgKiBBIGJhdGNoIG9mIG5ldyBtZXNzYWdlcyBoYXZlIGFycml2ZWQgdG8gYmUgcHJvY2Vzc2VkCisgICAgICogQHBhcmFtIGJhdGNoIHRoZSBtZXNzYWdlcyB0byBiZSBwcm9jZXNzZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWN2KExpc3Q8VGFza01lc3NhZ2U+IGJhdGNoKTsKK30KZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXNzYWdpbmcvSUNvbnRleHQuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXNzYWdpbmcvSUNvbnRleHQuamF2YQppbmRleCA4NjQ1YTZmLi40MmY1OWJkIDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vbWVzc2FnaW5nL0lDb250ZXh0LmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21lc3NhZ2luZy9JQ29udGV4dC5qYXZhCkBAIC01Niw0ICs1Niw0IEBACiAgICAgICogQHJldHVybiBjbGllbnQgc2lkZSBjb25uZWN0aW9uCiAgICAgICovCiAgICAgcHVibGljIElDb25uZWN0aW9uIGNvbm5lY3QoU3RyaW5nIHN0b3JtX2lkLCBTdHJpbmcgaG9zdCwgaW50IHBvcnQpOwotfTsKK30KZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXNzYWdpbmcvVHJhbnNwb3J0RmFjdG9yeS5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21lc3NhZ2luZy9UcmFuc3BvcnRGYWN0b3J5LmphdmEKaW5kZXggNjU2YjMyMy4uYzU1MWUwZCAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21lc3NhZ2luZy9UcmFuc3BvcnRGYWN0b3J5LmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21lc3NhZ2luZy9UcmFuc3BvcnRGYWN0b3J5LmphdmEKQEAgLTMyLDcgKzMyLDcgQEAKICAgICAgICAgU3RyaW5nIHRyYW5zcG9ydF9wbHVnaW5fa2xhc3NOYW1lID0gKFN0cmluZylzdG9ybV9jb25mLmdldChDb25maWcuU1RPUk1fTUVTU0FHSU5HX1RSQU5TUE9SVCk7CiAgICAgICAgIExPRy5pbmZvKCJTdG9ybSBwZWVyIHRyYW5zcG9ydCBwbHVnaW46Iit0cmFuc3BvcnRfcGx1Z2luX2tsYXNzTmFtZSk7CiAKLSAgICAgICAgSUNvbnRleHQgdHJhbnNwb3J0ID0gbnVsbDsKKyAgICAgICAgSUNvbnRleHQgdHJhbnNwb3J0OwogICAgICAgICB0cnkgewogICAgICAgICAgICAgLy9jcmVhdGUgYSBmYWN0b3J5IGNsYXNzCiAgICAgICAgICAgICBDbGFzcyBrbGFzcyA9IENsYXNzLmZvck5hbWUodHJhbnNwb3J0X3BsdWdpbl9rbGFzc05hbWUpOwpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21lc3NhZ2luZy9sb2NhbC9Db250ZXh0LmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vbWVzc2FnaW5nL2xvY2FsL0NvbnRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjhmZTY0Ci0tLSAvZGV2L251bGwKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21lc3NhZ2luZy9sb2NhbC9Db250ZXh0LmphdmEKQEAgLTAsMCArMSwxNjQgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGJhY2t0eXBlLnN0b3JtLm1lc3NhZ2luZy5sb2NhbDsKKworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7CisKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5Db25maWc7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0uZ3JvdXBpbmcuTG9hZDsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5tZXNzYWdpbmcuSUNvbm5lY3Rpb247CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0ubWVzc2FnaW5nLlRhc2tNZXNzYWdlOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLm1lc3NhZ2luZy5JQ29ubmVjdGlvbkNhbGxiYWNrOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLm1lc3NhZ2luZy5JQ29udGV4dDsKKworcHVibGljIGNsYXNzIENvbnRleHQgaW1wbGVtZW50cyBJQ29udGV4dCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKENvbnRleHQuY2xhc3MpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTG9jYWxTZXJ2ZXIgaW1wbGVtZW50cyBJQ29ubmVjdGlvbiB7CisgICAgICAgIElDb25uZWN0aW9uQ2FsbGJhY2sgX2NiOworICAgICAgICBmaW5hbCBDb25jdXJyZW50SGFzaE1hcDxJbnRlZ2VyLCBEb3VibGU+IF9sb2FkID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPD4oKTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJSZWN2KElDb25uZWN0aW9uQ2FsbGJhY2sgY2IpIHsKKyAgICAgICAgICAgIF9jYiA9IGNiOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNlbmQoaW50IHRhc2tJZCwgIGJ5dGVbXSBwYXlsb2FkKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTSE9VTEQgTk9UIEhBUFBFTiIpOworICAgICAgICB9CisgCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZW5kKEl0ZXJhdG9yPFRhc2tNZXNzYWdlPiBtc2dzKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTSE9VTEQgTk9UIEhBUFBFTiIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBNYXA8SW50ZWdlciwgTG9hZD4gZ2V0TG9hZChDb2xsZWN0aW9uPEludGVnZXI+IHRhc2tzKSB7CisgICAgICAgICAgICBNYXA8SW50ZWdlciwgTG9hZD4gcmV0ID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICAgICAgZm9yIChJbnRlZ2VyIHRhc2sgOiB0YXNrcykgeworICAgICAgICAgICAgICAgIERvdWJsZSBmb3VuZCA9IF9sb2FkLmdldCh0YXNrKTsKKyAgICAgICAgICAgICAgICBpZiAoZm91bmQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXQucHV0KHRhc2ssIG5ldyBMb2FkKHRydWUsIGZvdW5kLCAwKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJldDsgCisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2VuZExvYWRNZXRyaWNzKE1hcDxJbnRlZ2VyLCBEb3VibGU+IHRhc2tUb0xvYWQpIHsKKyAgICAgICAgICAgIF9sb2FkLnB1dEFsbCh0YXNrVG9Mb2FkKTsKKyAgICAgICAgfQorIAorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgICAgICAgICAvL05PT1AKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBMb2NhbENsaWVudCBpbXBsZW1lbnRzIElDb25uZWN0aW9uIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBMb2NhbFNlcnZlciBfc2VydmVyOworCisgICAgICAgIHB1YmxpYyBMb2NhbENsaWVudChMb2NhbFNlcnZlciBzZXJ2ZXIpIHsKKyAgICAgICAgICAgIF9zZXJ2ZXIgPSBzZXJ2ZXI7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJSZWN2KElDb25uZWN0aW9uQ2FsbGJhY2sgY2IpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlNIT1VMRCBOT1QgSEFQUEVOIik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2VuZChpbnQgdGFza0lkLCAgYnl0ZVtdIHBheWxvYWQpIHsKKyAgICAgICAgICAgIGlmIChfc2VydmVyLl9jYiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgX3NlcnZlci5fY2IucmVjdihBcnJheXMuYXNMaXN0KG5ldyBUYXNrTWVzc2FnZSh0YXNrSWQsIHBheWxvYWQpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNlbmQoSXRlcmF0b3I8VGFza01lc3NhZ2U+IG1zZ3MpIHsKKyAgICAgICAgICAgIGlmIChfc2VydmVyLl9jYiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQXJyYXlMaXN0PFRhc2tNZXNzYWdlPiByZXQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAobXNncy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0LmFkZChtc2dzLm5leHQoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9zZXJ2ZXIuX2NiLnJlY3YocmV0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTWFwPEludGVnZXIsIExvYWQ+IGdldExvYWQoQ29sbGVjdGlvbjxJbnRlZ2VyPiB0YXNrcykgeworICAgICAgICAgICAgcmV0dXJuIF9zZXJ2ZXIuZ2V0TG9hZCh0YXNrcyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2VuZExvYWRNZXRyaWNzKE1hcDxJbnRlZ2VyLCBEb3VibGU+IHRhc2tUb0xvYWQpIHsKKyAgICAgICAgICAgIF9zZXJ2ZXIuc2VuZExvYWRNZXRyaWNzKHRhc2tUb0xvYWQpOworICAgICAgICB9CisgCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgICAgIC8vTk9PUAorICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIENvbmN1cnJlbnRIYXNoTWFwPFN0cmluZywgTG9jYWxTZXJ2ZXI+IF9yZWdpc3RyeSA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDw+KCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgTG9jYWxTZXJ2ZXIgZ2V0TG9jYWxTZXJ2ZXIoU3RyaW5nIG5vZGVJZCwgaW50IHBvcnQpIHsKKyAgICAgICAgU3RyaW5nIGtleSA9IG5vZGVJZCArICItIiArIHBvcnQ7CisgICAgICAgIExvY2FsU2VydmVyIHJldCA9IF9yZWdpc3RyeS5nZXQoa2V5KTsKKyAgICAgICAgaWYgKHJldCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXQgPSBuZXcgTG9jYWxTZXJ2ZXIoKTsKKyAgICAgICAgICAgIExvY2FsU2VydmVyIHRtcCA9IF9yZWdpc3RyeS5wdXRJZkFic2VudChrZXksIHJldCk7CisgICAgICAgICAgICBpZiAodG1wICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXQgPSB0bXA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgICAgIAorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcHJlcGFyZShNYXAgc3Rvcm1fY29uZikgeworICAgICAgICAvL05PT1AKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSUNvbm5lY3Rpb24gYmluZChTdHJpbmcgc3Rvcm1faWQsIGludCBwb3J0KSB7CisgICAgICAgIHJldHVybiBnZXRMb2NhbFNlcnZlcihzdG9ybV9pZCwgcG9ydCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIElDb25uZWN0aW9uIGNvbm5lY3QoU3RyaW5nIHN0b3JtX2lkLCBTdHJpbmcgaG9zdCwgaW50IHBvcnQpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBMb2NhbENsaWVudChnZXRMb2NhbFNlcnZlcihzdG9ybV9pZCwgcG9ydCkpOworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVybSgpIHsKKyAgICAgICAgLy9OT09QCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21lc3NhZ2luZy9uZXR0eS9DbGllbnQuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXNzYWdpbmcvbmV0dHkvQ2xpZW50LmphdmEKaW5kZXggODY5NzkwNy4uNGY4MTNiYSAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21lc3NhZ2luZy9uZXR0eS9DbGllbnQuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vbWVzc2FnaW5nL25ldHR5L0NsaWVudC5qYXZhCkBAIC0xNyw5ICsxNywyMiBAQAogICovCiBwYWNrYWdlIGJhY2t0eXBlLnN0b3JtLm1lc3NhZ2luZy5uZXR0eTsKIAoraW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LlNvY2tldEFkZHJlc3M7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0Jvb2xlYW47CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY1JlZmVyZW5jZTsKK2ltcG9ydCBqYXZhLmxhbmcuSW50ZXJydXB0ZWRFeGNlcHRpb247CisKIGltcG9ydCBiYWNrdHlwZS5zdG9ybS5Db25maWc7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0uZ3JvdXBpbmcuTG9hZDsKIGltcG9ydCBiYWNrdHlwZS5zdG9ybS5tZXNzYWdpbmcuQ29ubmVjdGlvbldpdGhTdGF0dXM7CiBpbXBvcnQgYmFja3R5cGUuc3Rvcm0ubWVzc2FnaW5nLlRhc2tNZXNzYWdlOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLm1lc3NhZ2luZy5JQ29ubmVjdGlvbkNhbGxiYWNrOwogaW1wb3J0IGJhY2t0eXBlLnN0b3JtLm1ldHJpYy5hcGkuSVN0YXRlZnVsT2JqZWN0OwogaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnV0aWxzLlN0b3JtQm91bmRlZEV4cG9uZW50aWFsQmFja29mZlJldHJ5OwogaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnV0aWxzLlV0aWxzOwpAQCAtMzQsMTcgKzQ3LDExIEBACiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAotaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOwotaW1wb3J0IGphdmEubmV0LlNvY2tldEFkZHJlc3M7CisKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOwogaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNMb25nOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2U7CiAKIGltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrU3RhdGU7CiAKQEAgLTYwLDcgKzY3LDcgQEAKICAqICAgICAtIE5vdGU6IFRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGRyb3BzIGFueSBtZXNzYWdlcyB0aGF0IGFyZSBiZWluZyBlbnF1ZXVlZCBmb3Igc2VuZGluZyBpZiB0aGUgY29ubmVjdGlvbiB0bwogICogICAgICAgdGhlIHJlbW90ZSBkZXN0aW5hdGlvbiBpcyBjdXJyZW50bHkgdW5hdmFpbGFibGUuCiAgKi8KLXB1YmxpYyBjbGFzcyBDbGllbnQgZXh0ZW5kcyBDb25uZWN0aW9uV2l0aFN0YXR1cyBpbXBsZW1lbnRzIElTdGF0ZWZ1bE9iamVjdCB7CitwdWJsaWMgY2xhc3MgQ2xpZW50IGV4dGVuZHMgQ29ubmVjdGlvbldpdGhTdGF0dXMgaW1wbGVtZW50cyBJU3RhdGVmdWxPYmplY3QsIElTYXNsQ2xpZW50IHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFBFTkRJTkdfTUVTU0FHRVNfRkxVU0hfVElNRU9VVF9NUyA9IDYwMDAwMEw7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBQRU5ESU5HX01FU1NBR0VTX0ZMVVNIX0lOVEVSVkFMX01TID0gMTAwMEw7CiAKQEAgLTczLDE3ICs4MCwxMiBAQAogICAgIHByaXZhdGUgZmluYWwgQ2xpZW50Qm9vdHN0cmFwIGJvb3RzdHJhcDsKICAgICBwcml2YXRlIGZpbmFsIEluZXRTb2NrZXRBZGRyZXNzIGRzdEFkZHJlc3M7CiAgICAgcHJvdGVjdGVkIGZpbmFsIFN0cmluZyBkc3RBZGRyZXNzUHJlZml4ZWROYW1lOworICAgIHByaXZhdGUgdm9sYXRpbGUgTWFwPEludGVnZXIsIERvdWJsZT4gc2VydmVyTG9hZCA9IG51bGw7CiAKICAgICAvKioKICAgICAgKiBUaGUgY2hhbm5lbCB1c2VkIGZvciBhbGwgd3JpdGUgb3BlcmF0aW9ucyBmcm9tIHRoaXMgY2xpZW50IHRvIHRoZSByZW1vdGUgZGVzdGluYXRpb24uCiAgICAgICovCi0gICAgcHJpdmF0ZSBmaW5hbCBBdG9taWNSZWZlcmVuY2U8Q2hhbm5lbD4gY2hhbm5lbFJlZiA9IG5ldyBBdG9taWNSZWZlcmVuY2U8Q2hhbm5lbD4oKTsKLQotCi0gICAgLyoqCi0gICAgICogTWF4aW11bSBudW1iZXIgb2YgcmVjb25uZWN0aW9uIGF0dGVtcHRzIHdlIHdpbGwgcGVyZm9ybSBhZnRlciBhIGRpc2Nvbm5lY3QgYmVmb3JlIGdpdmluZyB1cC4KLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIGludCBtYXhSZWNvbm5lY3Rpb25BdHRlbXB0czsKKyAgICBwcml2YXRlIGZpbmFsIEF0b21pY1JlZmVyZW5jZTxDaGFubmVsPiBjaGFubmVsUmVmID0gbmV3IEF0b21pY1JlZmVyZW5jZTw+KCk7CiAKICAgICAvKioKICAgICAgKiBUb3RhbCBudW1iZXIgb2YgY29ubmVjdGlvbiBhdHRlbXB0cy4KQEAgLTExMCw2ICsxMTIsMTAgQEAKICAgICAgKi8KICAgICBwcml2YXRlIGZpbmFsIEF0b21pY0xvbmcgcGVuZGluZ01lc3NhZ2VzID0gbmV3IEF0b21pY0xvbmcoMCk7CiAKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoZSBTQVNMIGNoYW5uZWwgaXMgcmVhZHkuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBBdG9taWNCb29sZWFuIHNhc2xDaGFubmVsUmVhZHkgPSBuZXcgQXRvbWljQm9vbGVhbihmYWxzZSk7CiAKICAgICAvKioKICAgICAgKiBUaGlzIGZsYWcgaXMgc2V0IHRvIHRydWUgaWYgYW5kIG9ubHkgaWYgYSBjbGllbnQgaW5zdGFuY2UgaXMgYmVpbmcgY2xvc2VkLgpAQCAtMTMxLDI4ICsxMzcsMzAgQEAKICAgICAgICAgdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7CiAgICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7CiAgICAgICAgIGludCBidWZmZXJTaXplID0gVXRpbHMuZ2V0SW50KHN0b3JtQ29uZi5nZXQoQ29uZmlnLlNUT1JNX01FU1NBR0lOR19ORVRUWV9CVUZGRVJfU0laRSkpOworICAgICAgICAvLyBpZiBTQVNMIGF1dGhlbnRpY2F0aW9uIGlzIGRpc2FibGVkLCBzYXNsQ2hhbm5lbFJlYWR5IGlzIGluaXRpYWxpemVkIGFzIHRydWU7IG90aGVyd2lzZSBmYWxzZQorICAgICAgICBzYXNsQ2hhbm5lbFJlYWR5LnNldCghVXRpbHMuZ2V0Qm9vbGVhbihzdG9ybUNvbmYuZ2V0KENvbmZpZy5TVE9STV9NRVNTQUdJTkdfTkVUVFlfQVVUSEVOVElDQVRJT04pLCBmYWxzZSkpOwogICAgICAgICBMT0cuaW5mbygiY3JlYXRpbmcgTmV0dHkgQ2xpZW50LCBjb25uZWN0aW5nIHRvIHt9Ont9LCBidWZmZXJTaXplOiB7fSIsIGhvc3QsIHBvcnQsIGJ1ZmZlclNpemUpOwogICAgICAgICBpbnQgbWVzc2FnZUJhdGNoU2l6ZSA9IFV0aWxzLmdldEludChzdG9ybUNvbmYuZ2V0KENvbmZpZy5TVE9STV9ORVRUWV9NRVNTQUdFX0JBVENIX1NJWkUpLCAyNjIxNDQpOwogCi0gICAgICAgIG1heFJlY29ubmVjdGlvbkF0dGVtcHRzID0gVXRpbHMuZ2V0SW50KHN0b3JtQ29uZi5nZXQoQ29uZmlnLlNUT1JNX01FU1NBR0lOR19ORVRUWV9NQVhfUkVUUklFUykpOworICAgICAgICBpbnQgbWF4UmVjb25uZWN0aW9uQXR0ZW1wdHMgPSBVdGlscy5nZXRJbnQoc3Rvcm1Db25mLmdldChDb25maWcuU1RPUk1fTUVTU0FHSU5HX05FVFRZX01BWF9SRVRSSUVTKSk7CiAgICAgICAgIGludCBtaW5XYWl0TXMgPSBVdGlscy5nZXRJbnQoc3Rvcm1Db25mLmdldChDb25maWcuU1RPUk1fTUVTU0FHSU5HX05FVFRZX01JTl9TTEVFUF9NUykpOwogICAgICAgICBpbnQgbWF4V2FpdE1zID0gVXRpbHMuZ2V0SW50KHN0b3JtQ29uZi5nZXQoQ29uZmlnLlNUT1JNX01FU1NBR0lOR19ORVRUWV9NQVhfU0xFRVBfTVMpKTsKICAgICAgICAgcmV0cnlQb2xpY3kgPSBuZXcgU3Rvcm1Cb3VuZGVkRXhwb25lbnRpYWxCYWNrb2ZmUmV0cnkobWluV2FpdE1zLCBtYXhXYWl0TXMsIG1heFJlY29ubmVjdGlvbkF0dGVtcHRzKTsKIAogICAgICAgICAvLyBJbml0aWF0ZSBjb25uZWN0aW9uIHRvIHJlbW90ZSBkZXN0aW5hdGlvbgotICAgICAgICBib290c3RyYXAgPSBjcmVhdGVDbGllbnRCb290c3RyYXAoZmFjdG9yeSwgYnVmZmVyU2l6ZSk7CisgICAgICAgIGJvb3RzdHJhcCA9IGNyZWF0ZUNsaWVudEJvb3RzdHJhcChmYWN0b3J5LCBidWZmZXJTaXplLCBzdG9ybUNvbmYpOwogICAgICAgICBkc3RBZGRyZXNzID0gbmV3IEluZXRTb2NrZXRBZGRyZXNzKGhvc3QsIHBvcnQpOwogICAgICAgICBkc3RBZGRyZXNzUHJlZml4ZWROYW1lID0gcHJlZml4ZWROYW1lKGRzdEFkZHJlc3MpOwogICAgICAgICBzY2hlZHVsZUNvbm5lY3QoTk9fREVMQVlfTVMpOwogICAgICAgICBiYXRjaGVyID0gbmV3IE1lc3NhZ2VCdWZmZXIobWVzc2FnZUJhdGNoU2l6ZSk7CiAgICAgfQogCi0gICAgcHJpdmF0ZSBDbGllbnRCb290c3RyYXAgY3JlYXRlQ2xpZW50Qm9vdHN0cmFwKENoYW5uZWxGYWN0b3J5IGZhY3RvcnksIGludCBidWZmZXJTaXplKSB7CisgICAgcHJpdmF0ZSBDbGllbnRCb290c3RyYXAgY3JlYXRlQ2xpZW50Qm9vdHN0cmFwKENoYW5uZWxGYWN0b3J5IGZhY3RvcnksIGludCBidWZmZXJTaXplLCBNYXAgc3Rvcm1Db25mKSB7CiAgICAgICAgIENsaWVudEJvb3RzdHJhcCBib290c3RyYXAgPSBuZXcgQ2xpZW50Qm9vdHN0cmFwKGZhY3RvcnkpOwogICAgICAgICBib290c3RyYXAuc2V0T3B0aW9uKCJ0Y3BOb0RlbGF5IiwgdHJ1ZSk7CiAgICAgICAgIGJvb3RzdHJhcC5zZXRPcHRpb24oInNlbmRCdWZmZXJTaXplIiwgYnVmZmVyU2l6ZSk7CiAgICAgICAgIGJvb3RzdHJhcC5zZXRPcHRpb24oImtlZXBBbGl2ZSIsIHRydWUpOwotICAgICAgICBib290c3RyYXAuc2V0UGlwZWxpbmVGYWN0b3J5KG5ldyBTdG9ybUNsaWVudFBpcGVsaW5lRmFjdG9yeSh0aGlzKSk7CisgICAgICAgIGJvb3RzdHJhcC5zZXRQaXBlbGluZUZhY3RvcnkobmV3IFN0b3JtQ2xpZW50UGlwZWxpbmVGYWN0b3J5KHRoaXMsIHN0b3JtQ29uZikpOwogICAgICAgICByZXR1cm4gYm9vdHN0cmFwOwogICAgIH0KIApAQCAtMTY0LDE0ICsxNzIsMTQgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBXZSB3aWxsIHJldHJ5IGNvbm5lY3Rpb24gd2l0aCBleHBvbmVudGlhbCBiYWNrLW9mZiBwb2xpY3kKKyAgICAgKiBFbnF1ZXVlIGEgdGFzayBtZXNzYWdlIHRvIGJlIHNlbnQgdG8gc2VydmVyCiAgICAgICovCiAgICAgcHJpdmF0ZSB2b2lkIHNjaGVkdWxlQ29ubmVjdChsb25nIGRlbGF5TXMpIHsKICAgICAgICAgc2NoZWR1bGVyLm5ld1RpbWVvdXQobmV3IENvbm5lY3QoZHN0QWRkcmVzcyksIGRlbGF5TXMsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBib29sZWFuIHJlY29ubmVjdGluZ0FsbG93ZWQoKSB7Ci0gICAgICAgIHJldHVybiAhY2xvc2luZyAmJiBjb25uZWN0aW9uQXR0ZW1wdHMuZ2V0KCkgPD0gKG1heFJlY29ubmVjdGlvbkF0dGVtcHRzICsgMSk7CisgICAgICAgIHJldHVybiAhY2xvc2luZzsKICAgICB9CiAKICAgICBwcml2YXRlIGJvb2xlYW4gY29ubmVjdGlvbkVzdGFibGlzaGVkKENoYW5uZWwgY2hhbm5lbCkgewpAQCAtMTk2LDcgKzIwNCwxMSBAQAogICAgICAgICB9IGVsc2UgaWYgKCFjb25uZWN0aW9uRXN0YWJsaXNoZWQoY2hhbm5lbFJlZi5nZXQoKSkpIHsKICAgICAgICAgICAgIHJldHVybiBTdGF0dXMuQ29ubmVjdGluZzsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBTdGF0dXMuUmVhZHk7CisgICAgICAgICAgICBpZiAoc2FzbENoYW5uZWxSZWFkeS5nZXQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBTdGF0dXMuUmVhZHk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBTdGF0dXMuQ29ubmVjdGluZzsgLy8gbmVlZCB0byB3YWl0IHVudGlsIHNhc2wgY2hhbm5lbCBpcyBhbHNvIHJlYWR5CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTIwNiwxMSArMjE4LDE2IEBACiAgICAgICogQHRocm93cyBqYXZhLmxhbmcuVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gd2hlbmV2ZXIgdGhpcyBtZXRob2QgaXMgYmVpbmcgY2FsbGVkLgogICAgICAqLwogICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJdGVyYXRvcjxUYXNrTWVzc2FnZT4gcmVjdihpbnQgZmxhZ3MsIGludCBjbGllbnRJZCkgeworICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyUmVjdihJQ29ubmVjdGlvbkNhbGxiYWNrIGNiKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiQ2xpZW50IGNvbm5lY3Rpb24gc2hvdWxkIG5vdCByZWNlaXZlIGFueSBtZXNzYWdlcyIpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNlbmRMb2FkTWV0cmljcyhNYXA8SW50ZWdlciwgRG91YmxlPiB0YXNrVG9Mb2FkKSB7CisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDbGllbnQgY29ubmVjdGlvbiBzaG91bGQgbm90IHNlbmQgbG9hZCBtZXRyaWNzIik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2VuZChpbnQgdGFza0lkLCBieXRlW10gcGF5bG9hZCkgewogICAgICAgICBUYXNrTWVzc2FnZSBtc2cgPSBuZXcgVGFza01lc3NhZ2UodGFza0lkLCBwYXlsb2FkKTsKICAgICAgICAgTGlzdDxUYXNrTWVzc2FnZT4gd3JhcHBlciA9IG5ldyBBcnJheUxpc3Q8VGFza01lc3NhZ2U+KDEpOwpAQCAtMjg5LDExICszMDYsMTQgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIHB1YmxpYyBJbmV0U29ja2V0QWRkcmVzcyBnZXREc3RBZGRyZXNzKCkgeworICAgICAgICByZXR1cm4gZHN0QWRkcmVzczsKKyAgICB9CisKICAgICBwcml2YXRlIGJvb2xlYW4gaGFzTWVzc2FnZXMoSXRlcmF0b3I8VGFza01lc3NhZ2U+IG1zZ3MpIHsKICAgICAgICAgcmV0dXJuIG1zZ3MgIT0gbnVsbCAmJiBtc2dzLmhhc05leHQoKTsKICAgICB9CiAKLQogICAgIHByaXZhdGUgdm9pZCBkcm9wTWVzc2FnZXMoSXRlcmF0b3I8VGFza01lc3NhZ2U+IG1zZ3MpIHsKICAgICAgICAgLy8gV2UgY29uc3VtZSB0aGUgaXRlcmF0b3IgYnkgdHJhdmVyc2luZyBhbmQgdGh1cyAiZW1wdHlpbmciIGl0LgogICAgICAgICBpbnQgbXNnQ291bnQgPSBpdGVyYXRvclNpemUobXNncyk7CkBAIC0zODksMTUgKzQwOSwxMyBAQAogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFBFTkRJTkdfTUVTU0FHRVNfRkxVU0hfSU5URVJWQUxfTVMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgfQogCi0KICAgICBwcml2YXRlIHZvaWQgY2xvc2VDaGFubmVsKCkgewogICAgICAgICBDaGFubmVsIGNoYW5uZWwgPSBjaGFubmVsUmVmLmdldCgpOwogICAgICAgICBpZiAoY2hhbm5lbCAhPSBudWxsKSB7CkBAIC00MDYsOSArNDI0LDI5IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICB2b2lkIHNldExvYWRNZXRyaWNzKE1hcDxJbnRlZ2VyLCBEb3VibGU+IHRhc2tUb0xvYWQpIHsKKyAgICAgICAgdGhpcy5zZXJ2ZXJMb2FkID0gdGFza1RvTG9hZDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWFwPEludGVnZXIsIExvYWQ+IGdldExvYWQoQ29sbGVjdGlvbjxJbnRlZ2VyPiB0YXNrcykgeworICAgICAgICBNYXA8SW50ZWdlciwgRG91YmxlPiBsb2FkQ2FjaGUgPSBzZXJ2ZXJMb2FkOworICAgICAgICBNYXA8SW50ZWdlciwgTG9hZD4gcmV0ID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgTG9hZD4oKTsKKyAgICAgICAgaWYgKGxvYWRDYWNoZSAhPSBudWxsKSB7CisgICAgICAgICAgICBkb3VibGUgY2xpZW50TG9hZCA9IE1hdGgubWluKHBlbmRpbmdNZXNzYWdlcy5nZXQoKSwgMTAyNCkvMTAyNC4wOworICAgICAgICAgICAgZm9yIChJbnRlZ2VyIHRhc2sgOiB0YXNrcykgeworICAgICAgICAgICAgICAgIERvdWJsZSBmb3VuZCA9IGxvYWRDYWNoZS5nZXQodGFzayk7CisgICAgICAgICAgICAgICAgaWYgKGZvdW5kICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0LnB1dCh0YXNrLCBuZXcgTG9hZCh0cnVlLCBmb3VuZCwgY2xpZW50TG9hZCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBPYmplY3QgZ2V0U3RhdGUoKSB7Ci0gICAgICAgIExPRy5pbmZvKCJHZXR0aW5nIG1ldHJpY3MgZm9yIGNsaWVudCBjb25uZWN0aW9uIHRvIHt9IiwgZHN0QWRkcmVzc1ByZWZpeGVkTmFtZSk7CisgICAgICAgIExPRy5kZWJ1ZygiR2V0dGluZyBtZXRyaWNzIGZvciBjbGllbnQgY29ubmVjdGlvbiB0byB7fSIsIGRzdEFkZHJlc3NQcmVmaXhlZE5hbWUpOwogICAgICAgICBIYXNoTWFwPFN0cmluZywgT2JqZWN0PiByZXQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKICAgICAgICAgcmV0LnB1dCgicmVjb25uZWN0cyIsIHRvdGFsQ29ubmVjdGlvbkF0dGVtcHRzLmdldEFuZFNldCgwKSk7CiAgICAgICAgIHJldC5wdXQoInNlbnQiLCBtZXNzYWdlc1NlbnQuZ2V0QW5kU2V0KDApKTsKQEAgLTQyMiwxMCArNDYwLDI4IEBACiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogCi0gICAgcHVibGljIE1hcCBnZXRTdG9ybUNvbmYoKSB7CisgICAgcHVibGljIE1hcCBnZXRDb25maWcoKSB7CiAgICAgICAgIHJldHVybiBzdG9ybUNvbmY7CiAgICAgfQogCisgICAgLyoqIElTYXNsQ2xpZW50IGludGVyZmFjZSAqKi8KKyAgICBwdWJsaWMgdm9pZCBjaGFubmVsQ29ubmVjdGVkKENoYW5uZWwgY2hhbm5lbCkgeworLy8gICAgICAgIHNldENoYW5uZWwoY2hhbm5lbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2hhbm5lbFJlYWR5KCkgeworICAgICAgICBzYXNsQ2hhbm5lbFJlYWR5LnNldCh0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIG5hbWUoKSB7CisgICAgICAgIHJldHVybiAoU3RyaW5nKXN0b3JtQ29uZi5nZXQoQ29uZmlnLlRPUE9MT0dZX05BTUUpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgc2VjcmV0S2V5KCkgeworICAgICAgICByZXR1cm4gU2FzbFV0aWxzLmdldFNlY3JldEtleShzdG9ybUNvbmYpOworICAgIH0KKyAgICAvKiogZW5kICoqLworCiAgICAgcHJpdmF0ZSBTdHJpbmcgc3JjQWRkcmVzc05hbWUoKSB7CiAgICAgICAgIFN0cmluZyBuYW1lID0gbnVsbDsKICAgICAgICAgQ2hhbm5lbCBjaGFubmVsID0gY2hhbm5lbFJlZi5nZXQoKTsKQEAgLTUxOSw1ICs1NzUsNCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotCiB9CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vbWVzc2FnaW5nL25ldHR5L0NvbnRleHQuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXNzYWdpbmcvbmV0dHkvQ29udGV4dC5qYXZhCmluZGV4IDVkMjdhMTYuLmJjOTc4YjYgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXNzYWdpbmcvbmV0dHkvQ29udGV4dC5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXNzYWdpbmcvbmV0dHkvQ29udGV4dC5qYXZhCkBAIC0xOSwxMiArMTksOCBAQAogCiBpbXBvcnQgb3JnLmpib3NzLm5ldHR5LmNoYW5uZWwuc29ja2V0Lm5pby5OaW9DbGllbnRTb2NrZXRDaGFubmVsRmFjdG9yeTsKIGltcG9ydCBvcmcuamJvc3MubmV0dHkudXRpbC5IYXNoZWRXaGVlbFRpbWVyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZTsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRGYWN0b3J5OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKQEAgLTM0LDggKzMwLDYgQEAKIGltcG9ydCBiYWNrdHlwZS5zdG9ybS51dGlscy5VdGlsczsKIAogcHVibGljIGNsYXNzIENvbnRleHQgaW1wbGVtZW50cyBJQ29udGV4dCB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKENvbnRleHQuY2xhc3MpOwotICAgICAgICAKICAgICBAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQogICAgIHByaXZhdGUgTWFwIHN0b3JtX2NvbmY7CiAgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBJQ29ubmVjdGlvbj4gY29ubmVjdGlvbnM7CkBAIC00OSw3ICs0Myw3IEBACiAgICAgQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKICAgICBwdWJsaWMgdm9pZCBwcmVwYXJlKE1hcCBzdG9ybV9jb25mKSB7CiAgICAgICAgIHRoaXMuc3Rvcm1fY29uZiA9IHN0b3JtX2NvbmY7Ci0gICAgICAgIGNvbm5lY3Rpb25zID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJQ29ubmVjdGlvbj4oKTsKKyAgICAgICAgY29ubmVjdGlvbnMgPSBuZXcgSGFzaE1hcDw+KCk7CiAKICAgICAgICAgLy9lYWNoIGNvbnRleHQgd2lsbCBoYXZlIGEgc2luZ2xlIGNsaWVudCBjaGFubmVsIGZhY3RvcnkKICAgICAgICAgaW50IG1heFdvcmtlcnMgPSBVdGlscy5nZXRJbnQoc3Rvcm1fY29uZi5nZXQoQ29uZmlnLlNUT1JNX01FU1NBR0lOR19ORVRUWV9DTElFTlRfV09SS0VSX1RIUkVBRFMpKTsKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXNzYWdpbmcvbmV0dHkvQ29udHJvbE1lc3NhZ2UuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXNzYWdpbmcvbmV0dHkvQ29udHJvbE1lc3NhZ2UuamF2YQppbmRleCBmYjNlZmU2Li43ZjYwMDc4IDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vbWVzc2FnaW5nL25ldHR5L0NvbnRyb2xNZXNzYWdlLmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21lc3NhZ2luZy9uZXR0eS9Db250cm9sTWVzc2FnZS5qYXZhCkBAIC0yMyw3ICsyMyw3IEBACiBpbXBvcnQgb3JnLmpib3NzLm5ldHR5LmJ1ZmZlci5DaGFubmVsQnVmZmVyT3V0cHV0U3RyZWFtOwogaW1wb3J0IG9yZy5qYm9zcy5uZXR0eS5idWZmZXIuQ2hhbm5lbEJ1ZmZlcnM7CiAKLWVudW0gQ29udHJvbE1lc3NhZ2UgeworcHVibGljIGVudW0gQ29udHJvbE1lc3NhZ2UgaW1wbGVtZW50cyBJTmV0dHlTZXJpYWxpemFibGUgewogICAgIENMT1NFX01FU1NBR0UoKHNob3J0KS0xMDApLAogICAgIEVPQl9NRVNTQUdFKChzaG9ydCktMjAxKSwKICAgICBPS19SRVNQT05TRSgoc2hvcnQpLTIwMCksCkBAIC0zOSwzMyArMzksMzcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gYSBjb250cm9sIG1lc3NhZ2UgcGVyIGFuIGVuY29kZWQgc3RhdHVzIGNvZGUKLSAgICAgKiBAcGFyYW0gZW5jb2RlZAotICAgICAqIEByZXR1cm4KKyAgICAgKiBAcGFyYW0gZW5jb2RlZCBzdGF0dXMgY29kZQorICAgICAqIEByZXR1cm4gYSBjb250cm9sIG1lc3NhZ2UgcGVyIGFuIGVuY29kZWQgc3RhdHVzIGNvZGUKICAgICAgKi8KLSAgICBzdGF0aWMgQ29udHJvbE1lc3NhZ2UgbWtNZXNzYWdlKHNob3J0IGVuY29kZWQpIHsKKyAgICBwdWJsaWMgc3RhdGljIENvbnRyb2xNZXNzYWdlIG1rTWVzc2FnZShzaG9ydCBlbmNvZGVkKSB7CiAgICAgICAgIGZvcihDb250cm9sTWVzc2FnZSBjbTogQ29udHJvbE1lc3NhZ2UudmFsdWVzKCkpIHsKICAgICAgICAgICBpZihlbmNvZGVkID09IGNtLmNvZGUpIHJldHVybiBjbTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKLSAgICBpbnQgZW5jb2RlTGVuZ3RoKCkgeworICAgIHB1YmxpYyBpbnQgZW5jb2RlTGVuZ3RoKCkgewogICAgICAgICByZXR1cm4gMjsgLy9zaG9ydAogICAgIH0KICAgICAKICAgICAvKioKICAgICAgKiBlbmNvZGUgdGhlIGN1cnJlbnQgQ29udHJvbCBNZXNzYWdlIGludG8gYSBjaGFubmVsIGJ1ZmZlcgotICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAqLwotICAgIENoYW5uZWxCdWZmZXIgYnVmZmVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgQ2hhbm5lbEJ1ZmZlciBidWZmZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBDaGFubmVsQnVmZmVyT3V0cHV0U3RyZWFtIGJvdXQgPSBuZXcgQ2hhbm5lbEJ1ZmZlck91dHB1dFN0cmVhbShDaGFubmVsQnVmZmVycy5kaXJlY3RCdWZmZXIoZW5jb2RlTGVuZ3RoKCkpKTsgICAgICAKICAgICAgICAgd3JpdGUoYm91dCk7CiAgICAgICAgIGJvdXQuY2xvc2UoKTsKICAgICAgICAgcmV0dXJuIGJvdXQuYnVmZmVyKCk7CiAgICAgfQogCi0gICAgdm9pZCB3cml0ZShDaGFubmVsQnVmZmVyT3V0cHV0U3RyZWFtIGJvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcHVibGljIHN0YXRpYyBDb250cm9sTWVzc2FnZSByZWFkKGJ5dGVbXSBzZXJpYWwpIHsKKyAgICAgICAgQ2hhbm5lbEJ1ZmZlciBjbV9idWZmZXIgPSBDaGFubmVsQnVmZmVycy5jb3BpZWRCdWZmZXIoc2VyaWFsKTsKKyAgICAgICAgcmV0dXJuIG1rTWVzc2FnZShjbV9idWZmZXIuZ2V0U2hvcnQoMCkpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShDaGFubmVsQnVmZmVyT3V0cHV0U3RyZWFtIGJvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGJvdXQud3JpdGVTaG9ydChjb2RlKTsgICAgICAgIAogICAgIH0gCiB9CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vbWVzc2FnaW5nL25ldHR5L0lOZXR0eVNlcmlhbGl6YWJsZS5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21lc3NhZ2luZy9uZXR0eS9JTmV0dHlTZXJpYWxpemFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2M2ZGUyCi0tLSAvZGV2L251bGwKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21lc3NhZ2luZy9uZXR0eS9JTmV0dHlTZXJpYWxpemFibGUuamF2YQpAQCAtMCwwICsxLDI2IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBiYWNrdHlwZS5zdG9ybS5tZXNzYWdpbmcubmV0dHk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IG9yZy5qYm9zcy5uZXR0eS5idWZmZXIuQ2hhbm5lbEJ1ZmZlcjsKKworcHVibGljIGludGVyZmFjZSBJTmV0dHlTZXJpYWxpemFibGUgeworICAgIENoYW5uZWxCdWZmZXIgYnVmZmVyKCkgdGhyb3dzIElPRXhjZXB0aW9uOworICAgIGludCBlbmNvZGVMZW5ndGgoKTsKK30KZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXNzYWdpbmcvbmV0dHkvSVNhc2xDbGllbnQuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXNzYWdpbmcvbmV0dHkvSVNhc2xDbGllbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2RjZmU4Ci0tLSAvZGV2L251bGwKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21lc3NhZ2luZy9uZXR0eS9JU2FzbENsaWVudC5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGJhY2t0eXBlLnN0b3JtLm1lc3NhZ2luZy5uZXR0eTsKKworaW1wb3J0IG9yZy5qYm9zcy5uZXR0eS5jaGFubmVsLkNoYW5uZWw7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0uQ29uZmlnOworCitwdWJsaWMgaW50ZXJmYWNlIElTYXNsQ2xpZW50IHsKKyAgICB2b2lkIGNoYW5uZWxDb25uZWN0ZWQoQ2hhbm5lbCBjaGFubmVsKTsKKyAgICB2b2lkIGNoYW5uZWxSZWFkeSgpOworICAgIFN0cmluZyBuYW1lKCk7CisgICAgU3RyaW5nIHNlY3JldEtleSgpOworfQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21lc3NhZ2luZy9uZXR0eS9JU2FzbFNlcnZlci5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21lc3NhZ2luZy9uZXR0eS9JU2FzbFNlcnZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMDNkY2MKLS0tIC9kZXYvbnVsbAorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vbWVzc2FnaW5nL25ldHR5L0lTYXNsU2VydmVyLmphdmEKQEAgLTAsMCArMSwyNiBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYmFja3R5cGUuc3Rvcm0ubWVzc2FnaW5nLm5ldHR5OworCitpbXBvcnQgb3JnLmpib3NzLm5ldHR5LmNoYW5uZWwuQ2hhbm5lbDsKKworcHVibGljIGludGVyZmFjZSBJU2FzbFNlcnZlciBleHRlbmRzIElTZXJ2ZXIgeworICAgIFN0cmluZyBuYW1lKCk7CisgICAgU3RyaW5nIHNlY3JldEtleSgpOworICAgIHZvaWQgYXV0aGVudGljYXRlZChDaGFubmVsIGMpOworfQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21lc3NhZ2luZy9uZXR0eS9JU2VydmVyLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vbWVzc2FnaW5nL25ldHR5L0lTZXJ2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDQ2NDkyCi0tLSAvZGV2L251bGwKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21lc3NhZ2luZy9uZXR0eS9JU2VydmVyLmphdmEKQEAgLTAsMCArMSwyNiBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYmFja3R5cGUuc3Rvcm0ubWVzc2FnaW5nLm5ldHR5OworCitpbXBvcnQgb3JnLmpib3NzLm5ldHR5LmNoYW5uZWwuQ2hhbm5lbDsKKworcHVibGljIGludGVyZmFjZSBJU2VydmVyIHsKKyAgICB2b2lkIGNoYW5uZWxDb25uZWN0ZWQoQ2hhbm5lbCBjKTsKKyAgICB2b2lkIHJlY2VpdmVkKE9iamVjdCBtZXNzYWdlLCBTdHJpbmcgcmVtb3RlLCBDaGFubmVsIGNoYW5uZWwpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbjsKKyAgICB2b2lkIGNsb3NlQ2hhbm5lbChDaGFubmVsIGMpOworfQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21lc3NhZ2luZy9uZXR0eS9LZXJiZXJvc1Nhc2xDbGllbnRIYW5kbGVyLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vbWVzc2FnaW5nL25ldHR5L0tlcmJlcm9zU2FzbENsaWVudEhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTg4MDBkCi0tLSAvZGV2L251bGwKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21lc3NhZ2luZy9uZXR0eS9LZXJiZXJvc1Nhc2xDbGllbnRIYW5kbGVyLmphdmEKQEAgLTAsMCArMSwxNTIgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGJhY2t0eXBlLnN0b3JtLm1lc3NhZ2luZy5uZXR0eTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBvcmcuamJvc3MubmV0dHkuY2hhbm5lbC5DaGFubmVsOworaW1wb3J0IG9yZy5qYm9zcy5uZXR0eS5jaGFubmVsLkNoYW5uZWxIYW5kbGVyQ29udGV4dDsKK2ltcG9ydCBvcmcuamJvc3MubmV0dHkuY2hhbm5lbC5DaGFubmVsU3RhdGVFdmVudDsKK2ltcG9ydCBvcmcuamJvc3MubmV0dHkuY2hhbm5lbC5DaGFubmVsczsKK2ltcG9ydCBvcmcuamJvc3MubmV0dHkuY2hhbm5lbC5NZXNzYWdlRXZlbnQ7CitpbXBvcnQgb3JnLmpib3NzLm5ldHR5LmNoYW5uZWwuU2ltcGxlQ2hhbm5lbFVwc3RyZWFtSGFuZGxlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitwdWJsaWMgY2xhc3MgS2VyYmVyb3NTYXNsQ2xpZW50SGFuZGxlciBleHRlbmRzIFNpbXBsZUNoYW5uZWxVcHN0cmVhbUhhbmRsZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkKKyAgICAgICAgLmdldExvZ2dlcihLZXJiZXJvc1Nhc2xDbGllbnRIYW5kbGVyLmNsYXNzKTsKKyAgICBwcml2YXRlIElTYXNsQ2xpZW50IGNsaWVudDsKKyAgICBsb25nIHN0YXJ0X3RpbWU7CisgICAgLyoqIFVzZWQgZm9yIGNsaWVudCBvciBzZXJ2ZXIncyB0b2tlbiB0byBzZW5kIG9yIHJlY2VpdmUgZnJvbSBlYWNoIG90aGVyLiAqLworICAgIHByaXZhdGUgTWFwIHN0b3JtX2NvbmY7CisgICAgcHJpdmF0ZSBTdHJpbmcgamFhc19zZWN0aW9uOworCisgICAgcHVibGljIEtlcmJlcm9zU2FzbENsaWVudEhhbmRsZXIoSVNhc2xDbGllbnQgY2xpZW50LCBNYXAgc3Rvcm1fY29uZiwgU3RyaW5nIGphYXNfc2VjdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7CisgICAgICAgIHRoaXMuc3Rvcm1fY29uZiA9IHN0b3JtX2NvbmY7CisgICAgICAgIHRoaXMuamFhc19zZWN0aW9uID0gamFhc19zZWN0aW9uOworICAgICAgICBzdGFydF90aW1lID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2hhbm5lbENvbm5lY3RlZChDaGFubmVsSGFuZGxlckNvbnRleHQgY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbm5lbFN0YXRlRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgLy8gcmVnaXN0ZXIgdGhlIG5ld2x5IGVzdGFibGlzaGVkIGNoYW5uZWwKKyAgICAgICAgQ2hhbm5lbCBjaGFubmVsID0gY3R4LmdldENoYW5uZWwoKTsKKyAgICAgICAgY2xpZW50LmNoYW5uZWxDb25uZWN0ZWQoY2hhbm5lbCk7CisKKyAgICAgICAgTE9HLmluZm8oIkNvbm5lY3Rpb24gZXN0YWJsaXNoZWQgZnJvbSB7fSB0byB7fSIsCisgICAgICAgICAgICAgICAgIGNoYW5uZWwuZ2V0TG9jYWxBZGRyZXNzKCksIGNoYW5uZWwuZ2V0UmVtb3RlQWRkcmVzcygpKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgS2VyYmVyb3NTYXNsTmV0dHlDbGllbnQgc2FzbE5ldHR5Q2xpZW50ID0gS2VyYmVyb3NTYXNsTmV0dHlDbGllbnRTdGF0ZS5nZXRLZXJiZXJvc1Nhc2xOZXR0eUNsaWVudAorICAgICAgICAgICAgICAgIC5nZXQoY2hhbm5lbCk7CisKKyAgICAgICAgICAgIGlmIChzYXNsTmV0dHlDbGllbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIExPRy5kZWJ1ZygiQ3JlYXRpbmcgc2FzbE5ldHR5Q2xpZW50IG5vdyBmb3IgY2hhbm5lbDoge30iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsKTsKKyAgICAgICAgICAgICAgICBzYXNsTmV0dHlDbGllbnQgPSBuZXcgS2VyYmVyb3NTYXNsTmV0dHlDbGllbnQoc3Rvcm1fY29uZiwgamFhc19zZWN0aW9uKTsKKyAgICAgICAgICAgICAgICBLZXJiZXJvc1Nhc2xOZXR0eUNsaWVudFN0YXRlLmdldEtlcmJlcm9zU2FzbE5ldHR5Q2xpZW50LnNldChjaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhc2xOZXR0eUNsaWVudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBMT0cuZGVidWcoIkdvaW5nIHRvIGluaXRpYXRlIEtlcmJlcm9zIG5lZ290aWF0aW9ucy4iKTsKKyAgICAgICAgICAgIGJ5dGVbXSBpbml0aWFsQ2hhbGxlbmdlID0gc2FzbE5ldHR5Q2xpZW50LnNhc2xSZXNwb25zZShuZXcgU2FzbE1lc3NhZ2VUb2tlbihuZXcgYnl0ZVswXSkpOworICAgICAgICAgICAgTE9HLmRlYnVnKCJTZW5kaW5nIGluaXRpYWwgY2hhbGxlbmdlOiB7fSIsIGluaXRpYWxDaGFsbGVuZ2UpOworICAgICAgICAgICAgY2hhbm5lbC53cml0ZShuZXcgU2FzbE1lc3NhZ2VUb2tlbihpbml0aWFsQ2hhbGxlbmdlKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0cuZXJyb3IoIkZhaWxlZCB0byBhdXRoZW50aWNhdGUgd2l0aCBzZXJ2ZXIgZHVlIHRvIGVycm9yOiAiLAorICAgICAgICAgICAgICAgICAgICAgIGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG1lc3NhZ2VSZWNlaXZlZChDaGFubmVsSGFuZGxlckNvbnRleHQgY3R4LCBNZXNzYWdlRXZlbnQgZXZlbnQpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBMT0cuZGVidWcoInNlbmQvcmVjdiB0aW1lIChtcyk6IHt9IiwKKyAgICAgICAgICAgICAgICAgIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIHN0YXJ0X3RpbWUpKTsKKworICAgICAgICBDaGFubmVsIGNoYW5uZWwgPSBjdHguZ2V0Q2hhbm5lbCgpOworCisgICAgICAgIC8vIEdlbmVyYXRlIFNBU0wgcmVzcG9uc2UgdG8gc2VydmVyIHVzaW5nIENoYW5uZWwtbG9jYWwgU0FTTCBjbGllbnQuCisgICAgICAgIEtlcmJlcm9zU2FzbE5ldHR5Q2xpZW50IHNhc2xOZXR0eUNsaWVudCA9IEtlcmJlcm9zU2FzbE5ldHR5Q2xpZW50U3RhdGUuZ2V0S2VyYmVyb3NTYXNsTmV0dHlDbGllbnQKKyAgICAgICAgICAgIC5nZXQoY2hhbm5lbCk7CisgICAgICAgIGlmIChzYXNsTmV0dHlDbGllbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigic2FzbE5ldHR5Q2xpZW50IHdhcyB1bmV4cGVjdGVkbHkgbnVsbCBmb3IgY2hhbm5lbDoiICsgY2hhbm5lbCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBleGFtaW5lIHRoZSByZXNwb25zZSBtZXNzYWdlIGZyb20gc2VydmVyCisgICAgICAgIGlmIChldmVudC5nZXRNZXNzYWdlKCkgaW5zdGFuY2VvZiBDb250cm9sTWVzc2FnZSkgeworICAgICAgICAgICAgQ29udHJvbE1lc3NhZ2UgbXNnID0gKENvbnRyb2xNZXNzYWdlKSBldmVudC5nZXRNZXNzYWdlKCk7CisgICAgICAgICAgICBpZiAobXNnID09IENvbnRyb2xNZXNzYWdlLlNBU0xfQ09NUExFVEVfUkVRVUVTVCkgeworICAgICAgICAgICAgICAgIExPRy5kZWJ1ZygiU2VydmVyIGhhcyBzZW50IHVzIHRoZSBTYXNsQ29tcGxldGUgbWVzc2FnZS4gQWxsb3dpbmcgbm9ybWFsIHdvcmsgdG8gcHJvY2VlZC4iKTsKKworICAgICAgICAgICAgICAgIGlmICghc2FzbE5ldHR5Q2xpZW50LmlzQ29tcGxldGUoKSkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJTZXJ2ZXIgcmV0dXJuZWQgYSBTYXNsLWNvbXBsZXRlIG1lc3NhZ2UsIGJ1dCBhcyBmYXIgYXMgd2UgY2FuIHRlbGwsIHdlIGFyZSBub3QgYXV0aGVudGljYXRlZCB5ZXQuIjsKKyAgICAgICAgICAgICAgICAgICAgTE9HLmVycm9yKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjdHguZ2V0UGlwZWxpbmUoKS5yZW1vdmUodGhpcyk7CisgICAgICAgICAgICAgICAgdGhpcy5jbGllbnQuY2hhbm5lbFJlYWR5KCk7CisKKyAgICAgICAgICAgICAgICAvLyBXZSBjYWxsIGZpcmVNZXNzYWdlUmVjZWl2ZWQgc2luY2UgdGhlIGNsaWVudCBpcyBhbGxvd2VkIHRvCisgICAgICAgICAgICAgICAgLy8gcGVyZm9ybSB0aGlzIHJlcXVlc3QuIFRoZSBjbGllbnQncyByZXF1ZXN0IHdpbGwgbm93IHByb2NlZWQKKyAgICAgICAgICAgICAgICAvLyB0byB0aGUgbmV4dCBwaXBlbGluZSBjb21wb25lbnQgbmFtZWx5IFN0b3JtQ2xpZW50SGFuZGxlci4KKyAgICAgICAgICAgICAgICBDaGFubmVscy5maXJlTWVzc2FnZVJlY2VpdmVkKGN0eCwgbXNnKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HLndhcm4oIlVuZXhwZWN0ZWQgY29udHJvbCBtZXNzYWdlOiB7fSIsIG1zZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoZXZlbnQuZ2V0TWVzc2FnZSgpIGluc3RhbmNlb2YgU2FzbE1lc3NhZ2VUb2tlbikgeworICAgICAgICAgICAgU2FzbE1lc3NhZ2VUb2tlbiBzYXNsVG9rZW5NZXNzYWdlID0gKFNhc2xNZXNzYWdlVG9rZW4pIGV2ZW50CisgICAgICAgICAgICAgICAgLmdldE1lc3NhZ2UoKTsKKyAgICAgICAgICAgIExPRy5kZWJ1ZygiUmVzcG9uZGluZyB0byBzZXJ2ZXIncyB0b2tlbiBvZiBsZW5ndGg6IHt9IiwKKyAgICAgICAgICAgICAgICAgICAgICBzYXNsVG9rZW5NZXNzYWdlLmdldFNhc2xUb2tlbigpLmxlbmd0aCk7CisKKyAgICAgICAgICAgIC8vIEdlbmVyYXRlIFNBU0wgcmVzcG9uc2UgKGJ1dCB3ZSBvbmx5IGFjdHVhbGx5IHNlbmQgdGhlIHJlc3BvbnNlIGlmCisgICAgICAgICAgICAvLyBpdCdzIG5vbi1udWxsLgorICAgICAgICAgICAgYnl0ZVtdIHJlc3BvbnNlVG9TZXJ2ZXIgPSBzYXNsTmV0dHlDbGllbnQKKyAgICAgICAgICAgICAgICAuc2FzbFJlc3BvbnNlKHNhc2xUb2tlbk1lc3NhZ2UpOworICAgICAgICAgICAgaWYgKHJlc3BvbnNlVG9TZXJ2ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIElmIHdlIGdlbmVyYXRlIGEgbnVsbCByZXNwb25zZSwgdGhlbiBhdXRoZW50aWNhdGlvbiBoYXMgY29tcGxldGVkCisgICAgICAgICAgICAgICAgLy8gKGlmIG5vdCwgd2FybiksIGFuZCByZXR1cm4gd2l0aG91dCBzZW5kaW5nIGEgcmVzcG9uc2UgYmFjayB0byB0aGUKKyAgICAgICAgICAgICAgICAvLyBzZXJ2ZXIuCisgICAgICAgICAgICAgICAgTE9HLmRlYnVnKCJSZXNwb25zZSB0byBzZXJ2ZXIgaXMgbnVsbDogYXV0aGVudGljYXRpb24gc2hvdWxkIG5vdyBiZSBjb21wbGV0ZS4iKTsKKyAgICAgICAgICAgICAgICBpZiAoIXNhc2xOZXR0eUNsaWVudC5pc0NvbXBsZXRlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HLndhcm4oIkdlbmVyYXRlZCBhIG51bGwgcmVzcG9uc2UsIGJ1dCBhdXRoZW50aWNhdGlvbiBpcyBub3QgY29tcGxldGUuIik7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIk91ciByZXBvbnNlIHRvIHRoZSBzZXJ2ZXIgaXMgbnVsbCwgYnV0IGFzIGZhciBhcyB3ZSBjYW4gdGVsbCwgd2UgYXJlIG5vdCBhdXRoZW50aWNhdGVkIHlldC4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhpcy5jbGllbnQuY2hhbm5lbFJlYWR5KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMT0cuZGVidWcoIlJlc3BvbnNlIHRvIHNlcnZlciB0b2tlbiBoYXMgbGVuZ3RoOiB7fSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlVG9TZXJ2ZXIubGVuZ3RoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIENvbnN0cnVjdCBhIG1lc3NhZ2UgY29udGFpbmluZyB0aGUgU0FTTCByZXNwb25zZSBhbmQgc2VuZCBpdCB0byB0aGUKKyAgICAgICAgICAgIC8vIHNlcnZlci4KKyAgICAgICAgICAgIFNhc2xNZXNzYWdlVG9rZW4gc2FzbFJlc3BvbnNlID0gbmV3IFNhc2xNZXNzYWdlVG9rZW4ocmVzcG9uc2VUb1NlcnZlcik7CisgICAgICAgICAgICBjaGFubmVsLndyaXRlKHNhc2xSZXNwb25zZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0cuZXJyb3IoIlVuZXhwZWN0ZWQgbWVzc2FnZSBmcm9tIHNlcnZlcjoge30iLCBldmVudC5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21lc3NhZ2luZy9uZXR0eS9LZXJiZXJvc1Nhc2xOZXR0eUNsaWVudC5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21lc3NhZ2luZy9uZXR0eS9LZXJiZXJvc1Nhc2xOZXR0eUNsaWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwZGM0YjYKLS0tIC9kZXYvbnVsbAorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vbWVzc2FnaW5nL25ldHR5L0tlcmJlcm9zU2FzbE5ldHR5Q2xpZW50LmphdmEKQEAgLTAsMCArMSwyMDMgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGJhY2t0eXBlLnN0b3JtLm1lc3NhZ2luZy5uZXR0eTsKKworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLkNvbmZpZzsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5zZWN1cml0eS5hdXRoLkF1dGhVdGlsczsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb247CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKK2ltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLlN1YmplY3Q7CitpbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC5jYWxsYmFjay5DYWxsYmFjazsKK2ltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLmNhbGxiYWNrLkNhbGxiYWNrSGFuZGxlcjsKK2ltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLmNhbGxiYWNrLlVuc3VwcG9ydGVkQ2FsbGJhY2tFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC5rZXJiZXJvcy5LZXJiZXJvc1RpY2tldDsKK2ltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLmxvZ2luLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC5sb2dpbi5Mb2dpbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZWN1cml0eS5zYXNsLlNhc2w7CitpbXBvcnQgamF2YXguc2VjdXJpdHkuc2FzbC5TYXNsQ2xpZW50OworaW1wb3J0IGphdmF4LnNlY3VyaXR5LnNhc2wuU2FzbEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnpvb2tlZXBlci5Mb2dpbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnpvb2tlZXBlci5zZXJ2ZXIuYXV0aC5LZXJiZXJvc05hbWU7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworLyoqCisgKiBJbXBsZW1lbnRzIFNBU0wgbG9naWMgZm9yIHN0b3JtIHdvcmtlciBjbGllbnQgcHJvY2Vzc2VzLgorICovCitwdWJsaWMgY2xhc3MgS2VyYmVyb3NTYXNsTmV0dHlDbGllbnQgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkKKyAgICAgICAgLmdldExvZ2dlcihLZXJiZXJvc1Nhc2xOZXR0eUNsaWVudC5jbGFzcyk7CisKKyAgICAvKioKKyAgICAgKiBVc2VkIHRvIHJlc3BvbmQgdG8gc2VydmVyJ3MgY291bnRlcnBhcnQsIFNhc2xTZXJ2ZXIgd2l0aCBTQVNMIHRva2VucworICAgICAqIHJlcHJlc2VudGVkIGFzIGJ5dGUgYXJyYXlzLgorICAgICAqLworICAgIHByaXZhdGUgU2FzbENsaWVudCBzYXNsQ2xpZW50OworICAgIHByaXZhdGUgU3ViamVjdCBzdWJqZWN0OworICAgIHByaXZhdGUgU3RyaW5nIGphYXNfc2VjdGlvbjsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIEtlcmJlcm9zU2FzbE5ldHR5Q2xpZW50IGZvciBhdXRoZW50aWNhdGlvbiB3aXRoIHNlcnZlcnMuCisgICAgICovCisgICAgcHVibGljIEtlcmJlcm9zU2FzbE5ldHR5Q2xpZW50KE1hcCBzdG9ybV9jb25mLCBTdHJpbmcgamFhc19zZWN0aW9uKSB7CisgICAgICAgIExPRy5kZWJ1ZygiS2VyYmVyb3NTYXNsTmV0dHlDbGllbnQ6IENyZWF0aW5nIFNBU0wge30gY2xpZW50IHRvIGF1dGhlbnRpY2F0ZSB0byBzZXJ2ZXIgIiwKKyAgICAgICAgICAgICAgICAgIFNhc2xVdGlscy5LRVJCRVJPUyk7CisKKyAgICAgICAgTE9HLmluZm8oIkNyZWF0aW5nIEtlcmJlcm9zIENsaWVudC4iKTsKKworICAgICAgICBDb25maWd1cmF0aW9uIGxvZ2luX2NvbmY7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsb2dpbl9jb25mID0gQXV0aFV0aWxzLkdldENvbmZpZ3VyYXRpb24oc3Rvcm1fY29uZik7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBMT0cuZXJyb3IoIkZhaWxlZCB0byBnZXQgbG9naW5fY29uZjogIiwgdCk7CisgICAgICAgICAgICB0aHJvdyB0OworICAgICAgICB9CisgICAgICAgIExPRy5kZWJ1ZygiS2VyYmVyb3NTYXNsTmV0dHlDbGllbnQ6IGF1dGhtZXRob2Qge30iLCBTYXNsVXRpbHMuS0VSQkVST1MpOworCisgICAgICAgIFNhc2xDbGllbnRDYWxsYmFja0hhbmRsZXIgY2ggPSBuZXcgU2FzbENsaWVudENhbGxiYWNrSGFuZGxlcigpOworCisgICAgICAgIHN1YmplY3QgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgTE9HLmRlYnVnKCJTZXR0aW5nIENvbmZpZ3VyYXRpb24gdG8gbG9naW5fY29uZmlnOiB7fSIsIGxvZ2luX2NvbmYpOworICAgICAgICAgICAgLy9zcGVjaWZ5IGEgY29uZmlndXJhdGlvbiBvYmplY3QgdG8gYmUgdXNlZAorICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5zZXRDb25maWd1cmF0aW9uKGxvZ2luX2NvbmYpOworICAgICAgICAgICAgLy9ub3cgbG9naW4KKyAgICAgICAgICAgIExPRy5kZWJ1ZygiVHJ5aW5nIHRvIGxvZ2luLiIpOworICAgICAgICAgICAgTG9naW4gbG9naW4gPSBuZXcgTG9naW4oamFhc19zZWN0aW9uLCBjaCk7CisgICAgICAgICAgICBzdWJqZWN0ID0gbG9naW4uZ2V0U3ViamVjdCgpOworICAgICAgICAgICAgTE9HLmRlYnVnKCJHb3QgU3ViamVjdDoge30iLCBzdWJqZWN0LnRvU3RyaW5nKCkpOworICAgICAgICB9IGNhdGNoIChMb2dpbkV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgTE9HLmVycm9yKCJDbGllbnQgZmFpbGVkIHRvIGxvZ2luIGluIHByaW5jaXBhbDoiICsgZXgsIGV4KTsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vY2hlY2sgdGhlIGNyZWRlbnRpYWwgb2Ygb3VyIHByaW5jaXBhbAorICAgICAgICBpZiAoc3ViamVjdC5nZXRQcml2YXRlQ3JlZGVudGlhbHMoS2VyYmVyb3NUaWNrZXQuY2xhc3MpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgTE9HLmVycm9yKCJGYWlsZWQgdG8gdmVyaWZ5IHVzZXIgcHJpbmNpcGFsLiIpOworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkZhaWwgdG8gdmVyaWZ5IHVzZXIgcHJpbmNpcGFsIHdpdGggc2VjdGlvbiBcIiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgamFhc19zZWN0aW9uICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiBpbiBsb2dpbiBjb25maWd1cmF0aW9uIGZpbGUgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dpbl9jb25mKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzZXJ2aWNlTmFtZSA9IEF1dGhVdGlscy5nZXQobG9naW5fY29uZiwgamFhc19zZWN0aW9uLCAic2VydmljZU5hbWUiKTsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTE9HLmVycm9yKCJGYWlsZWQgdG8gZ2V0IHNlcnZpY2UgbmFtZS4iLCBlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFByaW5jaXBhbCBwcmluY2lwYWwgPSAoUHJpbmNpcGFsKXN1YmplY3QuZ2V0UHJpbmNpcGFscygpLnRvQXJyYXkoKVswXTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBmUHJpbmNpcGFsTmFtZSA9IHByaW5jaXBhbC5nZXROYW1lKCk7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZkhvc3QgPSAoU3RyaW5nKXN0b3JtX2NvbmYuZ2V0KENvbmZpZy5QQUNFTUFLRVJfSE9TVCk7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZlNlcnZpY2VOYW1lID0gc2VydmljZU5hbWU7CisgICAgICAgICAgICBmaW5hbCBDYWxsYmFja0hhbmRsZXIgZmNoID0gY2g7CisgICAgICAgICAgICBMT0cuZGVidWcoIktlcmJlcm9zIENsaWVudCB3aXRoIHByaW5jaXBhbDoge30sIGhvc3Q6IHt9IiwgZlByaW5jaXBhbE5hbWUsIGZIb3N0KTsKKyAgICAgICAgICAgIHNhc2xDbGllbnQgPSBTdWJqZWN0LmRvQXMoc3ViamVjdCwgbmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb248U2FzbENsaWVudD4oKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBTYXNsQ2xpZW50IHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wcyA9IG5ldyBUcmVlTWFwPFN0cmluZyxTdHJpbmc+KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHMucHV0KFNhc2wuUU9QLCAiYXV0aCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzLnB1dChTYXNsLlNFUlZFUl9BVVRILCAiZmFsc2UiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2FzbC5jcmVhdGVTYXNsQ2xpZW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nW10geyBTYXNsVXRpbHMuS0VSQkVST1MgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZlByaW5jaXBhbE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZTZXJ2aWNlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkhvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzLCBmY2gpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HLmVycm9yKCJTdWJqZWN0IGZhaWxlZCB0byBjcmVhdGUgc2FzbCBjbGllbnQuIiwgZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIExPRy5pbmZvKCJHb3QgQ2xpZW50OiB7fSIsIHNhc2xDbGllbnQpOworCisgICAgICAgIH0gY2F0Y2ggKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTE9HLmVycm9yKCJLZXJiZXJvc1Nhc2xOZXR0eUNsaWVudDogQ291bGQgbm90IGNyZWF0ZSBTYXNsIE5ldHR5IENsaWVudC4iKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNDb21wbGV0ZSgpIHsKKyAgICAgICAgcmV0dXJuIHNhc2xDbGllbnQuaXNDb21wbGV0ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc3BvbmQgdG8gc2VydmVyJ3MgU0FTTCB0b2tlbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzYXNsVG9rZW5NZXNzYWdlCisgICAgICogICAgICAgICAgICBjb250YWlucyBzZXJ2ZXIncyBTQVNMIHRva2VuCisgICAgICogQHJldHVybiBjbGllbnQncyByZXNwb25zZSBTQVNMIHRva2VuCisgICAgICovCisgICAgcHVibGljIGJ5dGVbXSBzYXNsUmVzcG9uc2UoU2FzbE1lc3NhZ2VUb2tlbiBzYXNsVG9rZW5NZXNzYWdlKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBTYXNsTWVzc2FnZVRva2VuIGZTYXNsVG9rZW5NZXNzYWdlID0gc2FzbFRva2VuTWVzc2FnZTsKKyAgICAgICAgICAgIGJ5dGUgW10gcmV0dmFsID0gU3ViamVjdC5kb0FzKHN1YmplY3QsIG5ldyBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uPGJ5dGVbXT4oKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBieXRlW10gcnVuKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gcmV0dmFsID0gc2FzbENsaWVudC5ldmFsdWF0ZUNoYWxsZW5nZShmU2FzbFRva2VuTWVzc2FnZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTYXNsVG9rZW4oKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNhc2xFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPRy5lcnJvcigic2FzbFJlc3BvbnNlOiBGYWlsZWQgdG8gcmVzcG9uZCB0byBTQVNMIHNlcnZlcidzIHRva2VuOiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICAgICB9CisgICAgICAgIGNhdGNoIChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExPRy5lcnJvcigiRmFpbGVkIHRvIGdlbmVyYXRlIHJlc3BvbnNlIGZvciB0b2tlbjogIiwgZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudGF0aW9uIG9mIGphdmF4LnNlY3VyaXR5LmF1dGguY2FsbGJhY2suQ2FsbGJhY2tIYW5kbGVyIHRoYXQgd29ya3MKKyAgICAgKiB3aXRoIFN0b3JtIHRvcG9sb2d5IHRva2Vucy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTYXNsQ2xpZW50Q2FsbGJhY2tIYW5kbGVyIGltcGxlbWVudHMgQ2FsbGJhY2tIYW5kbGVyIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogSW1wbGVtZW50YXRpb24gdXNlZCB0byByZXNwb25kIHRvIFNBU0wgdG9rZW5zIGZyb20gc2VydmVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2tzCisgICAgICAgICAqICAgICAgICAgICAgb2JqZWN0cyB0aGF0IGluZGljYXRlIHdoYXQgY3JlZGVudGlhbCBpbmZvcm1hdGlvbiB0aGUKKyAgICAgICAgICogICAgICAgICAgICBzZXJ2ZXIncyBTYXNsU2VydmVyIHJlcXVpcmVzIGZyb20gdGhlIGNsaWVudC4KKyAgICAgICAgICogQHRocm93cyBVbnN1cHBvcnRlZENhbGxiYWNrRXhjZXB0aW9uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGUoQ2FsbGJhY2tbXSBjYWxsYmFja3MpIHRocm93cyBVbnN1cHBvcnRlZENhbGxiYWNrRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZvciAoQ2FsbGJhY2sgY2FsbGJhY2sgOiBjYWxsYmFja3MpIHsKKyAgICAgICAgICAgICAgICBMT0cuaW5mbygiS2VyYmVyb3MgQ2xpZW50IENhbGxiYWNrIEhhbmRsZXIgZ290IGNhbGxiYWNrOiB7fSIsIGNhbGxiYWNrLmdldENsYXNzKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vbWVzc2FnaW5nL25ldHR5L0tlcmJlcm9zU2FzbE5ldHR5Q2xpZW50U3RhdGUuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXNzYWdpbmcvbmV0dHkvS2VyYmVyb3NTYXNsTmV0dHlDbGllbnRTdGF0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NDZhYTUKLS0tIC9kZXYvbnVsbAorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vbWVzc2FnaW5nL25ldHR5L0tlcmJlcm9zU2FzbE5ldHR5Q2xpZW50U3RhdGUuamF2YQpAQCAtMCwwICsxLDMxIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBiYWNrdHlwZS5zdG9ybS5tZXNzYWdpbmcubmV0dHk7CisKK2ltcG9ydCBvcmcuamJvc3MubmV0dHkuY2hhbm5lbC5DaGFubmVsOworaW1wb3J0IG9yZy5qYm9zcy5uZXR0eS5jaGFubmVsLkNoYW5uZWxMb2NhbDsKKworZmluYWwgY2xhc3MgS2VyYmVyb3NTYXNsTmV0dHlDbGllbnRTdGF0ZSB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENoYW5uZWxMb2NhbDxLZXJiZXJvc1Nhc2xOZXR0eUNsaWVudD4gZ2V0S2VyYmVyb3NTYXNsTmV0dHlDbGllbnQgPSBuZXcgQ2hhbm5lbExvY2FsPEtlcmJlcm9zU2FzbE5ldHR5Q2xpZW50PigpIHsKKyAgICAgICAgcHJvdGVjdGVkIEtlcmJlcm9zU2FzbE5ldHR5Q2xpZW50IGluaXRpYWxWYWx1ZShDaGFubmVsIGNoYW5uZWwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfTsKKworfQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21lc3NhZ2luZy9uZXR0eS9LZXJiZXJvc1Nhc2xOZXR0eVNlcnZlci5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21lc3NhZ2luZy9uZXR0eS9LZXJiZXJvc1Nhc2xOZXR0eVNlcnZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNmMwMWIKLS0tIC9kZXYvbnVsbAorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vbWVzc2FnaW5nL25ldHR5L0tlcmJlcm9zU2FzbE5ldHR5U2VydmVyLmphdmEKQEAgLTAsMCArMSwyMTAgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGJhY2t0eXBlLnN0b3JtLm1lc3NhZ2luZy5uZXR0eTsKKworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnNlY3VyaXR5LmF1dGguQXV0aFV0aWxzOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnNlY3VyaXR5LmF1dGguS2VyYmVyb3NQcmluY2lwYWxUb0xvY2FsOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5QcmluY2lwYWw7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7CitpbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC5TdWJqZWN0OworaW1wb3J0IGphdmF4LnNlY3VyaXR5LmF1dGguY2FsbGJhY2suQ2FsbGJhY2s7CitpbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC5jYWxsYmFjay5DYWxsYmFja0hhbmRsZXI7CitpbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC5jYWxsYmFjay5VbnN1cHBvcnRlZENhbGxiYWNrRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlY3VyaXR5LmF1dGgua2VyYmVyb3MuS2VyYmVyb3NQcmluY2lwYWw7CitpbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC5rZXJiZXJvcy5LZXJiZXJvc1RpY2tldDsKK2ltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLmxvZ2luLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC5sb2dpbi5Mb2dpbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZWN1cml0eS5zYXNsLkF1dGhvcml6ZUNhbGxiYWNrOworaW1wb3J0IGphdmF4LnNlY3VyaXR5LnNhc2wuU2FzbDsKK2ltcG9ydCBqYXZheC5zZWN1cml0eS5zYXNsLlNhc2xFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VjdXJpdHkuc2FzbC5TYXNsU2VydmVyOworaW1wb3J0IG9yZy5hcGFjaGUuem9va2VlcGVyLkxvZ2luOworaW1wb3J0IG9yZy5hcGFjaGUuem9va2VlcGVyLnNlcnZlci5hdXRoLktlcmJlcm9zTmFtZTsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCisKK2NsYXNzIEtlcmJlcm9zU2FzbE5ldHR5U2VydmVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5CisgICAgICAgIC5nZXRMb2dnZXIoS2VyYmVyb3NTYXNsTmV0dHlTZXJ2ZXIuY2xhc3MpOworCisgICAgcHJpdmF0ZSBTYXNsU2VydmVyIHNhc2xTZXJ2ZXI7CisgICAgcHJpdmF0ZSBTdWJqZWN0IHN1YmplY3Q7CisgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gYXV0aG9yaXplZFVzZXJzOworCisgICAgS2VyYmVyb3NTYXNsTmV0dHlTZXJ2ZXIoTWFwIHN0b3JtX2NvbmYsIFN0cmluZyBqYWFzX3NlY3Rpb24sIExpc3Q8U3RyaW5nPiBhdXRob3JpemVkVXNlcnMpIHsKKyAgICAgICAgdGhpcy5hdXRob3JpemVkVXNlcnMgPSBhdXRob3JpemVkVXNlcnM7CisgICAgICAgIExPRy5kZWJ1ZygiR2V0dGluZyBDb25maWd1cmF0aW9uLiIpOworICAgICAgICBDb25maWd1cmF0aW9uIGxvZ2luX2NvbmY7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsb2dpbl9jb25mID0gQXV0aFV0aWxzLkdldENvbmZpZ3VyYXRpb24oc3Rvcm1fY29uZik7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBMT0cuZXJyb3IoIkZhaWxlZCB0byBnZXQgbG9naW5fY29uZjogIiwgdCk7CisgICAgICAgICAgICB0aHJvdyB0OworICAgICAgICB9CisKKyAgICAgICAgTE9HLmRlYnVnKCJLZXJiZXJvc1Nhc2xOZXR0eVNlcnZlcjogYXV0aG1ldGhvZCB7fSIsIFNhc2xVdGlscy5LRVJCRVJPUyk7CisKKyAgICAgICAgS2VyYmVyb3NTYXNsQ2FsbGJhY2tIYW5kbGVyIGNoID0gbmV3IEtlcmJlcm9zU2FzbE5ldHR5U2VydmVyLktlcmJlcm9zU2FzbENhbGxiYWNrSGFuZGxlcihhdXRob3JpemVkVXNlcnMpOworCisgICAgICAgIC8vbG9naW4gb3VyIHByaW5jaXBhbAorICAgICAgICBzdWJqZWN0ID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIExPRy5kZWJ1ZygiU2V0dGluZyBDb25maWd1cmF0aW9uIHRvIGxvZ2luX2NvbmZpZzoge30iLCBsb2dpbl9jb25mKTsKKyAgICAgICAgICAgIC8vc3BlY2lmeSBhIGNvbmZpZ3VyYXRpb24gb2JqZWN0IHRvIGJlIHVzZWQKKyAgICAgICAgICAgIENvbmZpZ3VyYXRpb24uc2V0Q29uZmlndXJhdGlvbihsb2dpbl9jb25mKTsKKyAgICAgICAgICAgIC8vbm93IGxvZ2luCisgICAgICAgICAgICBMT0cuZGVidWcoIlRyeWluZyB0byBsb2dpbi4iKTsKKyAgICAgICAgICAgIExvZ2luIGxvZ2luID0gbmV3IExvZ2luKGphYXNfc2VjdGlvbiwgY2gpOworICAgICAgICAgICAgc3ViamVjdCA9IGxvZ2luLmdldFN1YmplY3QoKTsKKyAgICAgICAgICAgIExPRy5kZWJ1ZygiR290IFN1YmplY3Q6IHt9Iiwgc3ViamVjdC50b1N0cmluZygpKTsKKyAgICAgICAgfSBjYXRjaCAoTG9naW5FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIExPRy5lcnJvcigiU2VydmVyIGZhaWxlZCB0byBsb2dpbiBpbiBwcmluY2lwYWw6IiwgZXgpOworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOworICAgICAgICB9CisKKyAgICAgICAgLy9jaGVjayB0aGUgY3JlZGVudGlhbCBvZiBvdXIgcHJpbmNpcGFsCisgICAgICAgIGlmIChzdWJqZWN0LmdldFByaXZhdGVDcmVkZW50aWFscyhLZXJiZXJvc1RpY2tldC5jbGFzcykuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBMT0cuZXJyb3IoIkZhaWxlZCB0byB2ZXJpZnl1c2VyIHByaW5jaXBhbC4iKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJGYWlsIHRvIHZlcmlmeSB1c2VyIHByaW5jaXBhbCB3aXRoIHNlY3Rpb24gXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGphYXNfc2VjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXCIgaW4gbG9naW4gY29uZmlndXJhdGlvbiBmaWxlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbG9naW5fY29uZik7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgTE9HLmluZm8oIkNyZWF0aW5nIEtlcmJlcm9zIFNlcnZlci4iKTsKKyAgICAgICAgICAgIGZpbmFsIENhbGxiYWNrSGFuZGxlciBmY2ggPSBjaDsKKyAgICAgICAgICAgIFByaW5jaXBhbCBwID0gKFByaW5jaXBhbClzdWJqZWN0LmdldFByaW5jaXBhbHMoKS50b0FycmF5KClbMF07CisgICAgICAgICAgICBLZXJiZXJvc05hbWUga05hbWUgPSBuZXcgS2VyYmVyb3NOYW1lKHAuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBmSG9zdCA9IGtOYW1lLmdldEhvc3ROYW1lKCk7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZlNlcnZpY2VOYW1lID0ga05hbWUuZ2V0U2VydmljZU5hbWUoKTsKKyAgICAgICAgICAgIExPRy5kZWJ1ZygiU2VydmVyIHdpdGggaG9zdDoge30iLCBmSG9zdCk7CisgICAgICAgICAgICBzYXNsU2VydmVyID0KKyAgICAgICAgICAgICAgICBTdWJqZWN0LmRvQXMoc3ViamVjdCwgbmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb248U2FzbFNlcnZlcj4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgU2FzbFNlcnZlciBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wcyA9IG5ldyBUcmVlTWFwPFN0cmluZyxTdHJpbmc+KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzLnB1dChTYXNsLlFPUCwgImF1dGgiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHMucHV0KFNhc2wuU0VSVkVSX0FVVEgsICJmYWxzZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU2FzbC5jcmVhdGVTYXNsU2VydmVyKFNhc2xVdGlscy5LRVJCRVJPUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmU2VydmljZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZkhvc3QsIHByb3BzLCBmY2gpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HLmVycm9yKCJTdWJqZWN0IGZhaWxlZCB0byBjcmVhdGUgc2FzbCBzZXJ2ZXIuIiwgZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBMT0cuaW5mbygiR290IFNlcnZlcjoge30iLCBzYXNsU2VydmVyKTsKKworICAgICAgICB9IGNhdGNoIChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExPRy5lcnJvcigiS2VyYmVyb3NTYXNsTmV0dHlTZXJ2ZXI6IENvdWxkIG5vdCBjcmVhdGUgU2FzbFNlcnZlcjogIiwgZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzQ29tcGxldGUoKSB7CisgICAgICAgIHJldHVybiBzYXNsU2VydmVyLmlzQ29tcGxldGUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFVzZXJOYW1lKCkgeworICAgICAgICByZXR1cm4gc2FzbFNlcnZlci5nZXRBdXRob3JpemF0aW9uSUQoKTsKKyAgICB9CisKKyAgICAvKiogQ2FsbGJhY2tIYW5kbGVyIGZvciBTQVNMIERJR0VTVC1NRDUgbWVjaGFuaXNtICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBLZXJiZXJvc1Nhc2xDYWxsYmFja0hhbmRsZXIgaW1wbGVtZW50cyBDYWxsYmFja0hhbmRsZXIgeworCisgICAgICAgIC8qKiBVc2VkIHRvIGF1dGhlbnRpY2F0ZSB0aGUgY2xpZW50cyAqLworICAgICAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBhdXRob3JpemVkVXNlcnM7CisKKyAgICAgICAgcHVibGljIEtlcmJlcm9zU2FzbENhbGxiYWNrSGFuZGxlcihMaXN0PFN0cmluZz4gYXV0aG9yaXplZFVzZXJzKSB7CisgICAgICAgICAgICBMT0cuZGVidWcoIktlcmJlcm9zU2FzbENhbGxiYWNrOiBDcmVhdGluZyBLZXJiZXJvc1Nhc2xDYWxsYmFjayBoYW5kbGVyLiIpOworICAgICAgICAgICAgdGhpcy5hdXRob3JpemVkVXNlcnMgPSBhdXRob3JpemVkVXNlcnM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlKENhbGxiYWNrW10gY2FsbGJhY2tzKSB0aHJvd3MgSU9FeGNlcHRpb24sIFVuc3VwcG9ydGVkQ2FsbGJhY2tFeGNlcHRpb24geworICAgICAgICAgICAgZm9yIChDYWxsYmFjayBjYWxsYmFjayA6IGNhbGxiYWNrcykgeworICAgICAgICAgICAgICAgIExPRy5pbmZvKCJLZXJiZXJvcyBDYWxsYmFjayBIYW5kbGVyIGdvdCBjYWxsYmFjazoge30iLCBjYWxsYmFjay5nZXRDbGFzcygpKTsKKyAgICAgICAgICAgICAgICBpZihjYWxsYmFjayBpbnN0YW5jZW9mIEF1dGhvcml6ZUNhbGxiYWNrKSB7CisgICAgICAgICAgICAgICAgICAgIEF1dGhvcml6ZUNhbGxiYWNrIGFjID0gKEF1dGhvcml6ZUNhbGxiYWNrKWNhbGxiYWNrOworICAgICAgICAgICAgICAgICAgICBpZighYWMuZ2V0QXV0aGVudGljYXRpb25JRCgpLmVxdWFscyhhYy5nZXRBdXRob3JpemF0aW9uSUQoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPRy5kZWJ1Zygie30gIT0ge30iLCBhYy5nZXRBdXRoZW50aWNhdGlvbklEKCksIGFjLmdldEF1dGhvcml6YXRpb25JRCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgTE9HLmRlYnVnKCJBdXRob3JpemVkIFVzZXJzOiB7fSIsIGF1dGhvcml6ZWRVc2Vycyk7CisgICAgICAgICAgICAgICAgICAgIExPRy5kZWJ1ZygiQ2hlY2tpbmcgYXV0aG9yaXphdGlvbiBmb3I6IHt9IiwgYWMuZ2V0QXV0aG9yaXphdGlvbklEKCkpOworICAgICAgICAgICAgICAgICAgICBmb3IoU3RyaW5nIHVzZXIgOiBhdXRob3JpemVkVXNlcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZXF1ZXN0ZXIgPSBhYy5nZXRBdXRob3JpemF0aW9uSUQoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgS2VyYmVyb3NQcmluY2lwYWwgcHJpbmNpcGFsID0gbmV3IEtlcmJlcm9zUHJpbmNpcGFsKHJlcXVlc3Rlcik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZXIgPSBuZXcgS2VyYmVyb3NQcmluY2lwYWxUb0xvY2FsKCkudG9Mb2NhbChwcmluY2lwYWwpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZihyZXF1ZXN0ZXIuZXF1YWxzKHVzZXIpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjLnNldEF1dGhvcml6ZWQodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVc2VkIGJ5IFNhc2xUb2tlbk1lc3NhZ2U6OnByb2Nlc3NUb2tlbigpIHRvIHJlc3BvbmQgdG8gc2VydmVyIFNBU0wKKyAgICAgKiB0b2tlbnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdG9rZW4KKyAgICAgKiAgICAgICAgICAgIFNlcnZlcidzIFNBU0wgdG9rZW4KKyAgICAgKiBAcmV0dXJuIHRva2VuIHRvIHNlbmQgYmFjayB0byB0aGUgc2VydmVyLgorICAgICAqLworICAgIHB1YmxpYyBieXRlW10gcmVzcG9uc2UoZmluYWwgYnl0ZVtdIHRva2VuKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBieXRlIFtdIHJldHZhbCA9IFN1YmplY3QuZG9BcyhzdWJqZWN0LCBuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjxieXRlW10+KCkgeworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYnl0ZVtdIHJ1bigpeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0cuZGVidWcoInJlc3BvbnNlOiBSZXNwb25kaW5nIHRvIGlucHV0IHRva2VuIG9mIGxlbmd0aDoge30iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbi5sZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSByZXR2YWwgPSBzYXNsU2VydmVyLmV2YWx1YXRlUmVzcG9uc2UodG9rZW4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChTYXNsRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0cuZXJyb3IoInJlc3BvbnNlOiBGYWlsZWQgdG8gZXZhbHVhdGUgY2xpZW50IHRva2VuIG9mIGxlbmd0aDoge30gOiB7fSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuLmxlbmd0aCwgZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHJldHVybiByZXR2YWw7CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2ggKFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTE9HLmVycm9yKCJGYWlsZWQgdG8gZ2VuZXJhdGUgcmVzcG9uc2UgZm9yIHRva2VuOiAiLCBlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21lc3NhZ2luZy9uZXR0eS9LZXJiZXJvc1Nhc2xOZXR0eVNlcnZlclN0YXRlLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vbWVzc2FnaW5nL25ldHR5L0tlcmJlcm9zU2FzbE5ldHR5U2VydmVyU3RhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2ExMjdlCi0tLSAvZGV2L251bGwKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21lc3NhZ2luZy9uZXR0eS9LZXJiZXJvc1Nhc2xOZXR0eVNlcnZlclN0YXRlLmphdmEKQEAgLTAsMCArMSwzMCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYmFja3R5cGUuc3Rvcm0ubWVzc2FnaW5nLm5ldHR5OworCitpbXBvcnQgb3JnLmpib3NzLm5ldHR5LmNoYW5uZWwuQ2hhbm5lbDsKK2ltcG9ydCBvcmcuamJvc3MubmV0dHkuY2hhbm5lbC5DaGFubmVsTG9jYWw7CisKK2ZpbmFsIGNsYXNzIEtlcmJlcm9zU2FzbE5ldHR5U2VydmVyU3RhdGUgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDaGFubmVsTG9jYWw8S2VyYmVyb3NTYXNsTmV0dHlTZXJ2ZXI+IGdldEtlcmJlcm9zU2FzbE5ldHR5U2VydmVyID0gbmV3IENoYW5uZWxMb2NhbDxLZXJiZXJvc1Nhc2xOZXR0eVNlcnZlcj4oKSB7CisgICAgICAgICAgICBwcm90ZWN0ZWQgS2VyYmVyb3NTYXNsTmV0dHlTZXJ2ZXIgaW5pdGlhbFZhbHVlKENoYW5uZWwgY2hhbm5lbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9OworfQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21lc3NhZ2luZy9uZXR0eS9LZXJiZXJvc1Nhc2xTZXJ2ZXJIYW5kbGVyLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vbWVzc2FnaW5nL25ldHR5L0tlcmJlcm9zU2FzbFNlcnZlckhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzFkYTE3Ci0tLSAvZGV2L251bGwKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21lc3NhZ2luZy9uZXR0eS9LZXJiZXJvc1Nhc2xTZXJ2ZXJIYW5kbGVyLmphdmEKQEAgLTAsMCArMSwxMzMgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGJhY2t0eXBlLnN0b3JtLm1lc3NhZ2luZy5uZXR0eTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBvcmcuamJvc3MubmV0dHkuY2hhbm5lbC5DaGFubmVsOworaW1wb3J0IG9yZy5qYm9zcy5uZXR0eS5jaGFubmVsLkNoYW5uZWxIYW5kbGVyQ29udGV4dDsKK2ltcG9ydCBvcmcuamJvc3MubmV0dHkuY2hhbm5lbC5DaGFubmVsczsKK2ltcG9ydCBvcmcuamJvc3MubmV0dHkuY2hhbm5lbC5FeGNlcHRpb25FdmVudDsKK2ltcG9ydCBvcmcuamJvc3MubmV0dHkuY2hhbm5lbC5NZXNzYWdlRXZlbnQ7CitpbXBvcnQgb3JnLmpib3NzLm5ldHR5LmNoYW5uZWwuU2ltcGxlQ2hhbm5lbFVwc3RyZWFtSGFuZGxlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitwdWJsaWMgY2xhc3MgS2VyYmVyb3NTYXNsU2VydmVySGFuZGxlciBleHRlbmRzIFNpbXBsZUNoYW5uZWxVcHN0cmVhbUhhbmRsZXIgeworCisgICAgSVNhc2xTZXJ2ZXIgc2VydmVyOworICAgIC8qKiBVc2VkIGZvciBjbGllbnQgb3Igc2VydmVyJ3MgdG9rZW4gdG8gc2VuZCBvciByZWNlaXZlIGZyb20gZWFjaCBvdGhlci4gKi8KKyAgICBwcml2YXRlIE1hcCBzdG9ybV9jb25mOworICAgIHByaXZhdGUgU3RyaW5nIGphYXNfc2VjdGlvbjsKKyAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBhdXRob3JpemVkVXNlcnM7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyRmFjdG9yeQorICAgICAgICAuZ2V0TG9nZ2VyKEtlcmJlcm9zU2FzbFNlcnZlckhhbmRsZXIuY2xhc3MpOworCisgICAgcHVibGljIEtlcmJlcm9zU2FzbFNlcnZlckhhbmRsZXIoSVNhc2xTZXJ2ZXIgc2VydmVyLCBNYXAgc3Rvcm1fY29uZiwgU3RyaW5nIGphYXNfc2VjdGlvbiwgTGlzdDxTdHJpbmc+IGF1dGhvcml6ZWRVc2VycykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7CisgICAgICAgIHRoaXMuc3Rvcm1fY29uZiA9IHN0b3JtX2NvbmY7CisgICAgICAgIHRoaXMuamFhc19zZWN0aW9uID0gamFhc19zZWN0aW9uOworICAgICAgICB0aGlzLmF1dGhvcml6ZWRVc2VycyA9IGF1dGhvcml6ZWRVc2VyczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBtZXNzYWdlUmVjZWl2ZWQoQ2hhbm5lbEhhbmRsZXJDb250ZXh0IGN0eCwgTWVzc2FnZUV2ZW50IGUpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBPYmplY3QgbXNnID0gZS5nZXRNZXNzYWdlKCk7CisgICAgICAgIGlmIChtc2cgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgQ2hhbm5lbCBjaGFubmVsID0gY3R4LmdldENoYW5uZWwoKTsKKworCisgICAgICAgIGlmIChtc2cgaW5zdGFuY2VvZiBTYXNsTWVzc2FnZVRva2VuKSB7CisgICAgICAgICAgICAvLyBpbml0aWFsaXplIHNlcnZlci1zaWRlIFNBU0wgZnVuY3Rpb25hbGl0eSwgaWYgd2UgaGF2ZW4ndCB5ZXQKKyAgICAgICAgICAgIC8vIChpbiB3aGljaCBjYXNlIHdlIGFyZSBsb29raW5nIGF0IHRoZSBmaXJzdCBTQVNMIG1lc3NhZ2UgZnJvbSB0aGUKKyAgICAgICAgICAgIC8vIGNsaWVudCkuCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIExPRy5kZWJ1ZygiR290IFNhc2xNZXNzYWdlVG9rZW4hIik7CisKKyAgICAgICAgICAgICAgICBLZXJiZXJvc1Nhc2xOZXR0eVNlcnZlciBzYXNsTmV0dHlTZXJ2ZXIgPSBLZXJiZXJvc1Nhc2xOZXR0eVNlcnZlclN0YXRlLmdldEtlcmJlcm9zU2FzbE5ldHR5U2VydmVyCisgICAgICAgICAgICAgICAgICAgIC5nZXQoY2hhbm5lbCk7CisgICAgICAgICAgICAgICAgaWYgKHNhc2xOZXR0eVNlcnZlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIExPRy5kZWJ1ZygiTm8gc2FzbE5ldHR5U2VydmVyIGZvciB7fSAgeWV0OyBjcmVhdGluZyBub3csIHdpdGggdG9wb2xvZ3kgdG9rZW46ICIsIGNoYW5uZWwpOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2FzbE5ldHR5U2VydmVyID0gbmV3IEtlcmJlcm9zU2FzbE5ldHR5U2VydmVyKHN0b3JtX2NvbmYsIGphYXNfc2VjdGlvbiwgYXV0aG9yaXplZFVzZXJzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtlcmJlcm9zU2FzbE5ldHR5U2VydmVyU3RhdGUuZ2V0S2VyYmVyb3NTYXNsTmV0dHlTZXJ2ZXIuc2V0KGNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXNsTmV0dHlTZXJ2ZXIpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HLmVycm9yKCJFcnJvciBvY2N1cnJlZCB3aGlsZSBjcmVhdGluZyBzYXNsTmV0dHlTZXJ2ZXIgb24gc2VydmVyIHt9IGZvciBjbGllbnQge30iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwuZ2V0TG9jYWxBZGRyZXNzKCksIGNoYW5uZWwuZ2V0UmVtb3RlQWRkcmVzcygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGlvZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIExPRy5kZWJ1ZygiRm91bmQgZXhpc3Rpbmcgc2FzbE5ldHR5U2VydmVyIG9uIHNlcnZlcjoge30gZm9yIGNsaWVudCB7fSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsLmdldExvY2FsQWRkcmVzcygpLCBjaGFubmVsLmdldFJlbW90ZUFkZHJlc3MoKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnl0ZVtdIHJlc3BvbnNlQnl0ZXMgPSBzYXNsTmV0dHlTZXJ2ZXIucmVzcG9uc2UoKChTYXNsTWVzc2FnZVRva2VuKSBtc2cpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFNhc2xUb2tlbigpKTsKKworICAgICAgICAgICAgICAgIFNhc2xNZXNzYWdlVG9rZW4gc2FzbFRva2VuTWVzc2FnZVJlcXVlc3QgPSBuZXcgU2FzbE1lc3NhZ2VUb2tlbihyZXNwb25zZUJ5dGVzKTsKKworICAgICAgICAgICAgICAgIGlmKHNhc2xUb2tlbk1lc3NhZ2VSZXF1ZXN0LmdldFNhc2xUb2tlbigpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbC53cml0ZShDb250cm9sTWVzc2FnZS5TQVNMX0NPTVBMRVRFX1JFUVVFU1QpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFNlbmQgcmVzcG9uc2UgdG8gY2xpZW50LgorICAgICAgICAgICAgICAgICAgICBjaGFubmVsLndyaXRlKHNhc2xUb2tlbk1lc3NhZ2VSZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoc2FzbE5ldHR5U2VydmVyLmlzQ29tcGxldGUoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBJZiBhdXRoZW50aWNhdGlvbiBvZiBjbGllbnQgaXMgY29tcGxldGUsIHdlIHdpbGwgYWxzbyBzZW5kIGEKKyAgICAgICAgICAgICAgICAgICAgLy8gU0FTTC1Db21wbGV0ZSBtZXNzYWdlIHRvIHRoZSBjbGllbnQuCisgICAgICAgICAgICAgICAgICAgIExPRy5pbmZvKCJTQVNMIGF1dGhlbnRpY2F0aW9uIGlzIGNvbXBsZXRlIGZvciBjbGllbnQgd2l0aCB1c2VybmFtZToge30iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXNsTmV0dHlTZXJ2ZXIuZ2V0VXNlck5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwud3JpdGUoQ29udHJvbE1lc3NhZ2UuU0FTTF9DT01QTEVURV9SRVFVRVNUKTsKKyAgICAgICAgICAgICAgICAgICAgTE9HLmRlYnVnKCJSZW1vdmluZyBTYXNsU2VydmVySGFuZGxlciBmcm9tIHBpcGVsaW5lIHNpbmNlIFNBU0wgYXV0aGVudGljYXRpb24gaXMgY29tcGxldGUuIik7CisgICAgICAgICAgICAgICAgICAgIGN0eC5nZXRQaXBlbGluZSgpLnJlbW92ZSh0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgc2VydmVyLmF1dGhlbnRpY2F0ZWQoY2hhbm5lbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICBMT0cuZXJyb3IoIkZhaWxlZCB0byBoYW5kbGUgU2FzbE1lc3NhZ2VUb2tlbjogIiwgZXgpOworICAgICAgICAgICAgICAgIHRocm93IGV4OworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gQ2xpZW50IHNob3VsZCBub3QgYmUgc2VuZGluZyBvdGhlci10aGFuLVNBU0wgbWVzc2FnZXMgYmVmb3JlCisgICAgICAgICAgICAvLyBTYXNsU2VydmVySGFuZGxlciBoYXMgcmVtb3ZlZCBpdHNlbGYgZnJvbSB0aGUgcGlwZWxpbmUuIFN1Y2gKKyAgICAgICAgICAgIC8vIG5vbi1TQVNMIHJlcXVlc3RzIHdpbGwgYmUgZGVuaWVkIGJ5IHRoZSBBdXRob3JpemUgY2hhbm5lbCBoYW5kbGVyCisgICAgICAgICAgICAvLyAodGhlIG5leHQgaGFuZGxlciB1cHN0cmVhbSBpbiB0aGUgc2VydmVyIHBpcGVsaW5lKSBpZiBTQVNMCisgICAgICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiBoYXMgbm90IGNvbXBsZXRlZC4KKyAgICAgICAgICAgIExPRy53YXJuKCJTZW5kaW5nIHVwc3RyZWFtIGFuIHVuZXhwZWN0ZWQgbm9uLVNBU0wgbWVzc2FnZSA6IHt9IiwKKyAgICAgICAgICAgICAgICAgICAgIG1zZyk7CisgICAgICAgICAgICBDaGFubmVscy5maXJlTWVzc2FnZVJlY2VpdmVkKGN0eCwgbXNnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGV4Y2VwdGlvbkNhdWdodChDaGFubmVsSGFuZGxlckNvbnRleHQgY3R4LCBFeGNlcHRpb25FdmVudCBlKSB7CisgICAgICAgIGlmKHNlcnZlciAhPSBudWxsKSB7CisgICAgICAgICAgICBzZXJ2ZXIuY2xvc2VDaGFubmVsKGUuZ2V0Q2hhbm5lbCgpKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21lc3NhZ2luZy9uZXR0eS9NZXNzYWdlQmF0Y2guamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXNzYWdpbmcvbmV0dHkvTWVzc2FnZUJhdGNoLmphdmEKaW5kZXggZWMwZGMwZi4uZmVhMzNmZCAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21lc3NhZ2luZy9uZXR0eS9NZXNzYWdlQmF0Y2guamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vbWVzc2FnaW5nL25ldHR5L01lc3NhZ2VCYXRjaC5qYXZhCkBAIC0zMSw3ICszMSw3IEBACiAKICAgICBNZXNzYWdlQmF0Y2goaW50IGJ1ZmZlcl9zaXplKSB7CiAgICAgICAgIHRoaXMuYnVmZmVyX3NpemUgPSBidWZmZXJfc2l6ZTsKLSAgICAgICAgbXNncyA9IG5ldyBBcnJheUxpc3Q8VGFza01lc3NhZ2U+KCk7CisgICAgICAgIG1zZ3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgICAgZW5jb2RlZF9sZW5ndGggPSBDb250cm9sTWVzc2FnZS5FT0JfTUVTU0FHRS5lbmNvZGVMZW5ndGgoKTsKICAgICB9CiAKQEAgLTU0LDI0ICs1NCwyMSBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEhhcyB0aGlzIGJhdGNoIHVzZWQgdXAgYWxsb3dlZCBidWZmZXIgc2l6ZQotICAgICAqIEByZXR1cm4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBiYXRjaCB1c2VkIHVwIGFsbG93ZWQgYnVmZmVyIHNpemUKICAgICAgKi8KICAgICBib29sZWFuIGlzRnVsbCgpIHsKICAgICAgICAgcmV0dXJuIGVuY29kZWRfbGVuZ3RoID49IGJ1ZmZlcl9zaXplOwogICAgIH0KIAogICAgIC8qKgotICAgICAqIHRydWUgaWYgdGhpcyBiYXRjaCBkb2Vzbid0IGhhdmUgYW55IG1lc3NhZ2VzIAotICAgICAqIEByZXR1cm4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBiYXRjaCBkb2Vzbid0IGhhdmUgYW55IG1lc3NhZ2VzCiAgICAgICovCiAgICAgYm9vbGVhbiBpc0VtcHR5KCkgewogICAgICAgICByZXR1cm4gbXNncy5pc0VtcHR5KCk7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogIyBvZiBtc2dzIGluIHRoaXMgYmF0Y2gKLSAgICAgKiBAcmV0dXJuCisgICAgICogQHJldHVybiBudW1iZXIgb2YgbXNncyBpbiB0aGlzIGJhdGNoCiAgICAgICovCiAgICAgaW50IHNpemUoKSB7CiAgICAgICAgIHJldHVybiBtc2dzLnNpemUoKTsKQEAgLTgzLDggKzgwLDkgQEAKICAgICBDaGFubmVsQnVmZmVyIGJ1ZmZlcigpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBDaGFubmVsQnVmZmVyT3V0cHV0U3RyZWFtIGJvdXQgPSBuZXcgQ2hhbm5lbEJ1ZmZlck91dHB1dFN0cmVhbShDaGFubmVsQnVmZmVycy5kaXJlY3RCdWZmZXIoZW5jb2RlZF9sZW5ndGgpKTsKICAgICAgICAgCi0gICAgICAgIGZvciAoVGFza01lc3NhZ2UgbXNnIDogbXNncykKKyAgICAgICAgZm9yIChUYXNrTWVzc2FnZSBtc2cgOiBtc2dzKSB7CiAgICAgICAgICAgICB3cml0ZVRhc2tNZXNzYWdlKGJvdXQsIG1zZyk7CisgICAgICAgIH0KIAogICAgICAgICAvL2FkZCBhIEVORF9PRl9CQVRDSCBpbmRpY2F0b3IKICAgICAgICAgQ29udHJvbE1lc3NhZ2UuRU9CX01FU1NBR0Uud3JpdGUoYm91dCk7CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vbWVzc2FnaW5nL25ldHR5L01lc3NhZ2VEZWNvZGVyLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vbWVzc2FnaW5nL25ldHR5L01lc3NhZ2VEZWNvZGVyLmphdmEKaW5kZXggN2Q4YmY1NC4uMzk3ZWMyMSAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21lc3NhZ2luZy9uZXR0eS9NZXNzYWdlRGVjb2Rlci5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXNzYWdpbmcvbmV0dHkvTWVzc2FnZURlY29kZXIuamF2YQpAQCAtNDMsNyArNDMsNyBAQAogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KIAotICAgICAgICBMaXN0PE9iamVjdD4gcmV0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7CisgICAgICAgIExpc3Q8T2JqZWN0PiByZXQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKIAogICAgICAgICAvLyBVc2Ugd2hpbGUgbG9vcCwgdHJ5IHRvIGRlY29kZSBhcyBtb3JlIG1lc3NhZ2VzIGFzIHBvc3NpYmxlIGluIHNpbmdsZSBjYWxsCiAgICAgICAgIHdoaWxlIChhdmFpbGFibGUgPj0gMikgewpAQCAtNzAsNyArNzAsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgCiAgICAgICAgICAgICAvL2Nhc2UgMjogU2FzbFRva2VuTWVzc2FnZVJlcXVlc3QKLSAgICAgICAgICAgIGlmKGNvZGU9PS01MDApIHsKKyAgICAgICAgICAgIGlmKGNvZGUgPT0gU2FzbE1lc3NhZ2VUb2tlbi5JREVOVElGSUVSKSB7CiAgICAgICAgICAgICAJLy8gTWFrZSBzdXJlIHRoYXQgd2UgaGF2ZSByZWNlaXZlZCBhdCBsZWFzdCBhbiBpbnRlZ2VyIChsZW5ndGgpIAogICAgICAgICAgICAgICAgIGlmIChidWYucmVhZGFibGVCeXRlcygpIDwgNCkgewogICAgICAgICAgICAgICAgICAgICAvL25lZWQgbW9yZSBkYXRhCkBAIC0xMDAsNyArMTAwLDYgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gY2FzZSAzOiB0YXNrIE1lc3NhZ2UKLSAgICAgICAgICAgIHNob3J0IHRhc2sgPSBjb2RlOwogCiAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIHJlY2VpdmVkIGF0IGxlYXN0IGFuIGludGVnZXIgKGxlbmd0aCkKICAgICAgICAgICAgIGlmIChhdmFpbGFibGUgPCA0KSB7CkBAIC0xMTUsNyArMTE0LDcgQEAKICAgICAgICAgICAgIGF2YWlsYWJsZSAtPSA0OwogCiAgICAgICAgICAgICBpZiAobGVuZ3RoIDw9IDApIHsKLSAgICAgICAgICAgICAgICByZXQuYWRkKG5ldyBUYXNrTWVzc2FnZSh0YXNrLCBudWxsKSk7CisgICAgICAgICAgICAgICAgcmV0LmFkZChuZXcgVGFza01lc3NhZ2UoY29kZSwgbnVsbCkpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCkBAIC0xMzMsNyArMTMyLDcgQEAKIAogICAgICAgICAgICAgLy8gU3VjY2Vzc2Z1bGx5IGRlY29kZWQgYSBmcmFtZS4KICAgICAgICAgICAgIC8vIFJldHVybiBhIFRhc2tNZXNzYWdlIG9iamVjdAotICAgICAgICAgICAgcmV0LmFkZChuZXcgVGFza01lc3NhZ2UodGFzaywgcGF5bG9hZC5hcnJheSgpKSk7CisgICAgICAgICAgICByZXQuYWRkKG5ldyBUYXNrTWVzc2FnZShjb2RlLCBwYXlsb2FkLmFycmF5KCkpKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChyZXQuc2l6ZSgpID09IDApIHsKQEAgLTE0Miw0ICsxNDEsNCBAQAogICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgfQogICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vbWVzc2FnaW5nL25ldHR5L05ldHR5UmVuYW1lVGhyZWFkRmFjdG9yeS5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21lc3NhZ2luZy9uZXR0eS9OZXR0eVJlbmFtZVRocmVhZEZhY3RvcnkuamF2YQppbmRleCAzYTkxYTU4Li4yYTFjZGVhIDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vbWVzc2FnaW5nL25ldHR5L05ldHR5UmVuYW1lVGhyZWFkRmFjdG9yeS5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXNzYWdpbmcvbmV0dHkvTmV0dHlSZW5hbWVUaHJlYWRGYWN0b3J5LmphdmEKQEAgLTMzLDggKzMzLDkgQEAKICAgICBmaW5hbCBUaHJlYWRHcm91cCBncm91cDsKICAgICBmaW5hbCBBdG9taWNJbnRlZ2VyIGluZGV4ID0gbmV3IEF0b21pY0ludGVnZXIoMSk7CiAgICAgZmluYWwgU3RyaW5nIG5hbWU7CisgICAgc3RhdGljIGZpbmFsIE5ldHR5VW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyIHVuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlciA9IG5ldyBOZXR0eVVuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlcigpOwogCi0gICAgTmV0dHlSZW5hbWVUaHJlYWRGYWN0b3J5KFN0cmluZyBuYW1lKSB7CisgICAgcHVibGljIE5ldHR5UmVuYW1lVGhyZWFkRmFjdG9yeShTdHJpbmcgbmFtZSkgewogICAgICAgICBTZWN1cml0eU1hbmFnZXIgcyA9IFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKTsKICAgICAgICAgZ3JvdXAgPSAocyAhPSBudWxsKT8gcy5nZXRUaHJlYWRHcm91cCgpIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRUaHJlYWRHcm91cCgpOwpAQCAtNDMsMTAgKzQ0LDEzIEBACiAKICAgICBwdWJsaWMgVGhyZWFkIG5ld1RocmVhZChSdW5uYWJsZSByKSB7CiAgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChncm91cCwgciwgbmFtZSArICItIiArIGluZGV4LmdldEFuZEluY3JlbWVudCgpLCAwKTsKLSAgICAgICAgaWYgKHQuaXNEYWVtb24oKSkKKyAgICAgICAgaWYgKHQuaXNEYWVtb24oKSkgewogICAgICAgICAgICAgdC5zZXREYWVtb24oZmFsc2UpOwotICAgICAgICBpZiAodC5nZXRQcmlvcml0eSgpICE9IFRocmVhZC5OT1JNX1BSSU9SSVRZKQorICAgICAgICB9CisgICAgICAgIGlmICh0LmdldFByaW9yaXR5KCkgIT0gVGhyZWFkLk5PUk1fUFJJT1JJVFkpIHsKICAgICAgICAgICAgIHQuc2V0UHJpb3JpdHkoVGhyZWFkLk5PUk1fUFJJT1JJVFkpOworICAgICAgICB9CisgICAgICAgIHQuc2V0VW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyKHVuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlcik7CiAgICAgICAgIHJldHVybiB0OwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXNzYWdpbmcvbmV0dHkvTmV0dHlVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXNzYWdpbmcvbmV0dHkvTmV0dHlVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDhiNWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21lc3NhZ2luZy9uZXR0eS9OZXR0eVVuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGJhY2t0eXBlLnN0b3JtLm1lc3NhZ2luZy5uZXR0eTsKKworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnV0aWxzLlV0aWxzOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK3B1YmxpYyBjbGFzcyBOZXR0eVVuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlciBpbXBsZW1lbnRzIFRocmVhZC5VbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihOZXR0eVVuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlci5jbGFzcyk7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdW5jYXVnaHRFeGNlcHRpb24oVGhyZWFkIHQsIFRocm93YWJsZSBlKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBVdGlscy5oYW5kbGVVbmNhdWdodEV4Y2VwdGlvbihlKTsKKyAgICAgICAgfSBjYXRjaCAoRXJyb3IgZXJyb3IpIHsKKyAgICAgICAgICAgIExPRy5pbmZvKCJSZWNlaXZlZCBlcnJvciBpbiBuZXR0eSB0aHJlYWQuLiB0ZXJtaW5hdGluZyBzZXJ2ZXIuLi4iKTsKKyAgICAgICAgICAgIFJ1bnRpbWUuZ2V0UnVudGltZSgpLmV4aXQoMSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vbWVzc2FnaW5nL25ldHR5L1Nhc2xNZXNzYWdlVG9rZW4uamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXNzYWdpbmcvbmV0dHkvU2FzbE1lc3NhZ2VUb2tlbi5qYXZhCmluZGV4IGQwZDNjYTEuLjhhMTMzZDEgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXNzYWdpbmcvbmV0dHkvU2FzbE1lc3NhZ2VUb2tlbi5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXNzYWdpbmcvbmV0dHkvU2FzbE1lc3NhZ2VUb2tlbi5qYXZhCkBAIC0xNyw2ICsxNyw3IEBACiAgKi8KIHBhY2thZ2UgYmFja3R5cGUuc3Rvcm0ubWVzc2FnaW5nLm5ldHR5OwogCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBvcmcuamJvc3MubmV0dHkuYnVmZmVyLkNoYW5uZWxCdWZmZXI7CiBpbXBvcnQgb3JnLmpib3NzLm5ldHR5LmJ1ZmZlci5DaGFubmVsQnVmZmVyT3V0cHV0U3RyZWFtOwogaW1wb3J0IG9yZy5qYm9zcy5uZXR0eS5idWZmZXIuQ2hhbm5lbEJ1ZmZlcnM7CkBAIC0yNiw3ICsyNyw5IEBACiAvKioKICAqIFNlbmQgYW5kIHJlY2VpdmUgU0FTTCB0b2tlbnMuCiAgKi8KLXB1YmxpYyBjbGFzcyBTYXNsTWVzc2FnZVRva2VuIHsKK3B1YmxpYyBjbGFzcyBTYXNsTWVzc2FnZVRva2VuIGltcGxlbWVudHMgSU5ldHR5U2VyaWFsaXphYmxlIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IElERU5USUZJRVIgPSAtNTAwOworCiAgICAgLyoqIENsYXNzIGxvZ2dlciAqLwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5CiAgICAgICAgICAgICAuZ2V0TG9nZ2VyKFNhc2xNZXNzYWdlVG9rZW4uY2xhc3MpOwpAQCAtNjksMzEgKzcyLDQzIEBACiAgICAgICAgIHRoaXMudG9rZW4gPSB0b2tlbjsKICAgICB9CiAKLSAgICBpbnQgZW5jb2RlTGVuZ3RoKCkgeworICAgIHB1YmxpYyBpbnQgZW5jb2RlTGVuZ3RoKCkgewogICAgICAgICByZXR1cm4gMiArIDQgKyB0b2tlbi5sZW5ndGg7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogZW5jb2RlIHRoZSBjdXJyZW50IFNhc2xUb2tlbiBNZXNzYWdlIGludG8gYSBjaGFubmVsIGJ1ZmZlcgotICAgICAqIFNhc2xUb2tlbk1lc3NhZ2VSZXF1ZXN0IGlzIGVuY29kZWQgYXM6IGlkZW50aWZpZXIgLi4uLiBzaG9ydCgyKSBhbHdheXMgaXQKLSAgICAgKiBpcyAtNTAwIHBheWxvYWQgbGVuZ3RoIC4uLi4gaW50IHBheWxvYWQgLi4uLiBieXRlW10KKyAgICAgKiBTYXNsVG9rZW5NZXNzYWdlUmVxdWVzdCBpcyBlbmNvZGVkIGFzOiBpZGVudGlmaWVyIC4uLi4gc2hvcnQoMikKKyAgICAgKiBwYXlsb2FkIGxlbmd0aCAuLi4uIGludCBwYXlsb2FkIC4uLi4gYnl0ZVtdCiAgICAgICogCi0gICAgICogQHRocm93cyBFeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICovCi0gICAgQ2hhbm5lbEJ1ZmZlciBidWZmZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgQ2hhbm5lbEJ1ZmZlciBidWZmZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICBDaGFubmVsQnVmZmVyT3V0cHV0U3RyZWFtIGJvdXQgPSBuZXcgQ2hhbm5lbEJ1ZmZlck91dHB1dFN0cmVhbSgKICAgICAgICAgICAgICAgICBDaGFubmVsQnVmZmVycy5kaXJlY3RCdWZmZXIoZW5jb2RlTGVuZ3RoKCkpKTsKLSAgICAgICAgc2hvcnQgaWRlbnRpZmllciA9IC01MDA7CiAgICAgICAgIGludCBwYXlsb2FkX2xlbiA9IDA7CiAgICAgICAgIGlmICh0b2tlbiAhPSBudWxsKQogICAgICAgICAgICAgcGF5bG9hZF9sZW4gPSB0b2tlbi5sZW5ndGg7CiAKLSAgICAgICAgYm91dC53cml0ZVNob3J0KChzaG9ydCkgaWRlbnRpZmllcik7Ci0gICAgICAgIGJvdXQud3JpdGVJbnQoKGludCkgcGF5bG9hZF9sZW4pOworICAgICAgICBib3V0LndyaXRlU2hvcnQoSURFTlRJRklFUik7CisgICAgICAgIGJvdXQud3JpdGVJbnQocGF5bG9hZF9sZW4pOworCiAgICAgICAgIGlmIChwYXlsb2FkX2xlbiA+IDApIHsKICAgICAgICAgICAgIGJvdXQud3JpdGUodG9rZW4pOwogICAgICAgICB9CiAgICAgICAgIGJvdXQuY2xvc2UoKTsKICAgICAgICAgcmV0dXJuIGJvdXQuYnVmZmVyKCk7CiAgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgU2FzbE1lc3NhZ2VUb2tlbiByZWFkKGJ5dGVbXSBzZXJpYWwpIHsKKyAgICAgICAgQ2hhbm5lbEJ1ZmZlciBzbV9idWZmZXIgPSBDaGFubmVsQnVmZmVycy5jb3BpZWRCdWZmZXIoc2VyaWFsKTsKKyAgICAgICAgc2hvcnQgaWRlbnRpZmllciA9IHNtX2J1ZmZlci5yZWFkU2hvcnQoKTsKKyAgICAgICAgaW50IHBheWxvYWRfbGVuID0gc21fYnVmZmVyLnJlYWRJbnQoKTsKKyAgICAgICAgaWYoaWRlbnRpZmllciAhPSBJREVOVElGSUVSKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBieXRlIHRva2VuW10gPSBuZXcgYnl0ZVtwYXlsb2FkX2xlbl07CisgICAgICAgIHNtX2J1ZmZlci5yZWFkQnl0ZXModG9rZW4sIDAsIHBheWxvYWRfbGVuKTsKKyAgICAgICAgcmV0dXJuIG5ldyBTYXNsTWVzc2FnZVRva2VuKHRva2VuKTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vbWVzc2FnaW5nL25ldHR5L1Nhc2xOZXR0eUNsaWVudC5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21lc3NhZ2luZy9uZXR0eS9TYXNsTmV0dHlDbGllbnQuamF2YQppbmRleCAwMjNlOTUwLi40ZjU3OWZiIDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vbWVzc2FnaW5nL25ldHR5L1Nhc2xOZXR0eUNsaWVudC5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXNzYWdpbmcvbmV0dHkvU2FzbE5ldHR5Q2xpZW50LmphdmEKQEAgLTUyLDkgKzUyLDggQEAKICAgICAgKi8KICAgICBwdWJsaWMgU2FzbE5ldHR5Q2xpZW50KFN0cmluZyB0b3BvbG9neU5hbWUsIGJ5dGVbXSB0b2tlbikgewogICAgICAgICB0cnkgewotICAgICAgICAgICAgTE9HLmRlYnVnKCJTYXNsTmV0dHlDbGllbnQ6IENyZWF0aW5nIFNBU0wgIgotICAgICAgICAgICAgICAgICAgICArIFNhc2xVdGlscy5BVVRIX0RJR0VTVF9NRDUKLSAgICAgICAgICAgICAgICAgICAgKyAiIGNsaWVudCB0byBhdXRoZW50aWNhdGUgdG8gc2VydmVyICIpOworICAgICAgICAgICAgTE9HLmRlYnVnKCJTYXNsTmV0dHlDbGllbnQ6IENyZWF0aW5nIFNBU0wge30gY2xpZW50IHRvIGF1dGhlbnRpY2F0ZSB0byBzZXJ2ZXIgIiwKKyAgICAgICAgICAgICAgICAgICAgICBTYXNsVXRpbHMuQVVUSF9ESUdFU1RfTUQ1KTsKIAogICAgICAgICAgICAgc2FzbENsaWVudCA9IFNhc2wuY3JlYXRlU2FzbENsaWVudCgKICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZ1tdIHsgU2FzbFV0aWxzLkFVVEhfRElHRVNUX01ENSB9LCBudWxsLCBudWxsLApAQCAtODEsOSArODAsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBieXRlW10gc2FzbFJlc3BvbnNlKFNhc2xNZXNzYWdlVG9rZW4gc2FzbFRva2VuTWVzc2FnZSkgewogICAgICAgICB0cnkgewotICAgICAgICAgICAgYnl0ZVtdIHJldHZhbCA9IHNhc2xDbGllbnQuZXZhbHVhdGVDaGFsbGVuZ2Uoc2FzbFRva2VuTWVzc2FnZQotICAgICAgICAgICAgICAgICAgICAuZ2V0U2FzbFRva2VuKCkpOwotICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgICAgIHJldHVybiBzYXNsQ2xpZW50LmV2YWx1YXRlQ2hhbGxlbmdlKHNhc2xUb2tlbk1lc3NhZ2UuZ2V0U2FzbFRva2VuKCkpOwogICAgICAgICB9IGNhdGNoIChTYXNsRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIExPRy5lcnJvcigKICAgICAgICAgICAgICAgICAgICAgInNhc2xSZXNwb25zZTogRmFpbGVkIHRvIHJlc3BvbmQgdG8gU0FTTCBzZXJ2ZXIncyB0b2tlbjoiLApAQCAtMTA0LDggKzEwMSw2IEBACiAKICAgICAgICAgLyoqCiAgICAgICAgICAqIFNldCBwcml2YXRlIG1lbWJlcnMgdXNpbmcgdG9wb2xvZ3kgdG9rZW4uCi0gICAgICAgICAqIAotICAgICAgICAgKiBAcGFyYW0gdG9wb2xvZ3lUb2tlbgogICAgICAgICAgKi8KICAgICAgICAgcHVibGljIFNhc2xDbGllbnRDYWxsYmFja0hhbmRsZXIoU3RyaW5nIHRvcG9sb2d5VG9rZW4sIGJ5dGVbXSB0b2tlbikgewogICAgICAgICAgICAgdGhpcy51c2VyTmFtZSA9IFNhc2xVdGlscwpAQCAtMTQxLDI2ICsxMzYsMTkgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAobmMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBMT0cuZGVidWcoImhhbmRsZTogU0FTTCBjbGllbnQgY2FsbGJhY2s6IHNldHRpbmcgdXNlcm5hbWU6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHVzZXJOYW1lKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgTE9HLmRlYnVnKCJoYW5kbGU6IFNBU0wgY2xpZW50IGNhbGxiYWNrOiBzZXR0aW5nIHVzZXJuYW1lOiB7fSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJOYW1lKTsKICAgICAgICAgICAgICAgICBuYy5zZXROYW1lKHVzZXJOYW1lKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChwYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKExPRy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIExPRy5kZWJ1ZygiaGFuZGxlOiBTQVNMIGNsaWVudCBjYWxsYmFjazogc2V0dGluZyB1c2VyUGFzc3dvcmQiKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgTE9HLmRlYnVnKCJoYW5kbGU6IFNBU0wgY2xpZW50IGNhbGxiYWNrOiBzZXR0aW5nIHVzZXJQYXNzd29yZCIpOwogICAgICAgICAgICAgICAgIHBjLnNldFBhc3N3b3JkKHVzZXJQYXNzd29yZCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAocmMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChMT0cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBMT0cuZGVidWcoImhhbmRsZTogU0FTTCBjbGllbnQgY2FsbGJhY2s6IHNldHRpbmcgcmVhbG06ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHJjLmdldERlZmF1bHRUZXh0KCkpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBMT0cuZGVidWcoImhhbmRsZTogU0FTTCBjbGllbnQgY2FsbGJhY2s6IHNldHRpbmcgcmVhbG06IHt9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjLmdldERlZmF1bHRUZXh0KCkpOwogICAgICAgICAgICAgICAgIHJjLnNldFRleHQocmMuZ2V0RGVmYXVsdFRleHQoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0KIH0KZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXNzYWdpbmcvbmV0dHkvU2FzbE5ldHR5U2VydmVyLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vbWVzc2FnaW5nL25ldHR5L1Nhc2xOZXR0eVNlcnZlci5qYXZhCmluZGV4IDJjYjQ3ZDkuLjg4N2E2YzYgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXNzYWdpbmcvbmV0dHkvU2FzbE5ldHR5U2VydmVyLmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21lc3NhZ2luZy9uZXR0eS9TYXNsTmV0dHlTZXJ2ZXIuamF2YQpAQCAtMTgsOSArMTgsNiBAQAogcGFja2FnZSBiYWNrdHlwZS5zdG9ybS5tZXNzYWdpbmcubmV0dHk7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiBpbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC5jYWxsYmFjay5DYWxsYmFjazsKIGltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLmNhbGxiYWNrLkNhbGxiYWNrSGFuZGxlcjsKQEAgLTMzLDEzMyArMzAsMTI4IEBACiBpbXBvcnQgamF2YXguc2VjdXJpdHkuc2FzbC5TYXNsRXhjZXB0aW9uOwogaW1wb3J0IGphdmF4LnNlY3VyaXR5LnNhc2wuU2FzbFNlcnZlcjsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5jb2RlYy5iaW5hcnkuQmFzZTY0OwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKIGNsYXNzIFNhc2xOZXR0eVNlcnZlciB7CiAKLQlwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyRmFjdG9yeQotCQkJLmdldExvZ2dlcihTYXNsTmV0dHlTZXJ2ZXIuY2xhc3MpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5CisgICAgICAgIC5nZXRMb2dnZXIoU2FzbE5ldHR5U2VydmVyLmNsYXNzKTsKIAotCXByaXZhdGUgU2FzbFNlcnZlciBzYXNsU2VydmVyOworICAgICAgICBwcml2YXRlIFNhc2xTZXJ2ZXIgc2FzbFNlcnZlcjsKIAotCVNhc2xOZXR0eVNlcnZlcihTdHJpbmcgdG9wb2xvZ3lOYW1lLCBieXRlW10gdG9rZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0JCUxPRy5kZWJ1ZygiU2FzbE5ldHR5U2VydmVyOiBUb3BvbG9neSB0b2tlbiBpczogIiArIHRvcG9sb2d5TmFtZQotCQkJCSsgIiB3aXRoIGF1dGhtZXRob2QgIiArIFNhc2xVdGlscy5BVVRIX0RJR0VTVF9NRDUpOworICAgIFNhc2xOZXR0eVNlcnZlcihTdHJpbmcgdG9wb2xvZ3lOYW1lLCBieXRlW10gdG9rZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIExPRy5kZWJ1ZygiU2FzbE5ldHR5U2VydmVyOiBUb3BvbG9neSB0b2tlbiBpczoge30gd2l0aCBhdXRobWV0aG9kIHt9IiwKKyAgICAgICAgICAgICAgICAgIHRvcG9sb2d5TmFtZSwgU2FzbFV0aWxzLkFVVEhfRElHRVNUX01ENSk7CiAKLQkJdHJ5IHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFNhc2xEaWdlc3RDYWxsYmFja0hhbmRsZXIgY2ggPSBuZXcgU2FzbE5ldHR5U2VydmVyLlNhc2xEaWdlc3RDYWxsYmFja0hhbmRsZXIoCisgICAgICAgICAgICAgICAgdG9wb2xvZ3lOYW1lLCB0b2tlbik7CiAKLQkJCVNhc2xEaWdlc3RDYWxsYmFja0hhbmRsZXIgY2ggPSBuZXcgU2FzbE5ldHR5U2VydmVyLlNhc2xEaWdlc3RDYWxsYmFja0hhbmRsZXIoCi0JCQkJCXRvcG9sb2d5TmFtZSwgdG9rZW4pOworICAgICAgICAgICAgc2FzbFNlcnZlciA9IFNhc2wuY3JlYXRlU2FzbFNlcnZlcihTYXNsVXRpbHMuQVVUSF9ESUdFU1RfTUQ1LCBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYXNsVXRpbHMuREVGQVVMVF9SRUFMTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FzbFV0aWxzLmdldFNhc2xQcm9wcygpLCBjaCk7CisgICAgICAgIH0gY2F0Y2ggKFNhc2xFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTE9HLmVycm9yKCJTYXNsTmV0dHlTZXJ2ZXI6IENvdWxkIG5vdCBjcmVhdGUgU2FzbFNlcnZlcjogIiwgZSk7CisgICAgICAgIH0KKyAgICB9CiAKLQkJCXNhc2xTZXJ2ZXIgPSBTYXNsLmNyZWF0ZVNhc2xTZXJ2ZXIoU2FzbFV0aWxzLkFVVEhfRElHRVNUX01ENSwgbnVsbCwKLQkJCQkJU2FzbFV0aWxzLkRFRkFVTFRfUkVBTE0sIFNhc2xVdGlscy5nZXRTYXNsUHJvcHMoKSwgY2gpOworICAgIHB1YmxpYyBib29sZWFuIGlzQ29tcGxldGUoKSB7CisgICAgICAgIHJldHVybiBzYXNsU2VydmVyLmlzQ29tcGxldGUoKTsKKyAgICB9CiAKLQkJfSBjYXRjaCAoU2FzbEV4Y2VwdGlvbiBlKSB7Ci0JCQlMT0cuZXJyb3IoIlNhc2xOZXR0eVNlcnZlcjogQ291bGQgbm90IGNyZWF0ZSBTYXNsU2VydmVyOiAiICsgZSk7Ci0JCX0KKyAgICBwdWJsaWMgU3RyaW5nIGdldFVzZXJOYW1lKCkgeworICAgICAgICByZXR1cm4gc2FzbFNlcnZlci5nZXRBdXRob3JpemF0aW9uSUQoKTsKKyAgICB9CiAKLQl9CisgICAgLyoqIENhbGxiYWNrSGFuZGxlciBmb3IgU0FTTCBESUdFU1QtTUQ1IG1lY2hhbmlzbSAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2FzbERpZ2VzdENhbGxiYWNrSGFuZGxlciBpbXBsZW1lbnRzIENhbGxiYWNrSGFuZGxlciB7CiAKLQlwdWJsaWMgYm9vbGVhbiBpc0NvbXBsZXRlKCkgewotCQlyZXR1cm4gc2FzbFNlcnZlci5pc0NvbXBsZXRlKCk7Ci0JfQorICAgICAgICAvKiogVXNlZCB0byBhdXRoZW50aWNhdGUgdGhlIGNsaWVudHMgKi8KKyAgICAgICAgcHJpdmF0ZSBieXRlW10gdXNlclBhc3N3b3JkOworICAgICAgICBwcml2YXRlIFN0cmluZyB1c2VyTmFtZTsKIAotCXB1YmxpYyBTdHJpbmcgZ2V0VXNlck5hbWUoKSB7Ci0JCXJldHVybiBzYXNsU2VydmVyLmdldEF1dGhvcml6YXRpb25JRCgpOwotCX0KKyAgICAgICAgcHVibGljIFNhc2xEaWdlc3RDYWxsYmFja0hhbmRsZXIoU3RyaW5nIHRvcG9sb2d5TmFtZSwgYnl0ZVtdIHRva2VuKSB7CisgICAgICAgICAgICBMT0cuZGVidWcoIlNhc2xEaWdlc3RDYWxsYmFjazogQ3JlYXRpbmcgU2FzbERpZ2VzdENhbGxiYWNrIGhhbmRsZXIgd2l0aCB0b3BvbG9neSB0b2tlbjoge30iLCB0b3BvbG9neU5hbWUpOworICAgICAgICAgICAgdGhpcy51c2VyTmFtZSA9IHRvcG9sb2d5TmFtZTsKKyAgICAgICAgICAgIHRoaXMudXNlclBhc3N3b3JkID0gdG9rZW47CisgICAgICAgIH0KIAotCS8qKiBDYWxsYmFja0hhbmRsZXIgZm9yIFNBU0wgRElHRVNULU1ENSBtZWNoYW5pc20gKi8KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFNhc2xEaWdlc3RDYWxsYmFja0hhbmRsZXIgaW1wbGVtZW50cyBDYWxsYmFja0hhbmRsZXIgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlKENhbGxiYWNrW10gY2FsbGJhY2tzKSB0aHJvd3MgSU9FeGNlcHRpb24sCisgICAgICAgICAgICBVbnN1cHBvcnRlZENhbGxiYWNrRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIE5hbWVDYWxsYmFjayBuYyA9IG51bGw7CisgICAgICAgICAgICBQYXNzd29yZENhbGxiYWNrIHBjID0gbnVsbDsKKyAgICAgICAgICAgIEF1dGhvcml6ZUNhbGxiYWNrIGFjID0gbnVsbDsKIAotCQkvKiogVXNlZCB0byBhdXRoZW50aWNhdGUgdGhlIGNsaWVudHMgKi8KLQkJcHJpdmF0ZSBieXRlW10gdXNlclBhc3N3b3JkOwotCQlwcml2YXRlIFN0cmluZyB1c2VyTmFtZTsKKyAgICAgICAgICAgIGZvciAoQ2FsbGJhY2sgY2FsbGJhY2sgOiBjYWxsYmFja3MpIHsKKyAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2sgaW5zdGFuY2VvZiBBdXRob3JpemVDYWxsYmFjaykgeworICAgICAgICAgICAgICAgICAgICBhYyA9IChBdXRob3JpemVDYWxsYmFjaykgY2FsbGJhY2s7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjYWxsYmFjayBpbnN0YW5jZW9mIE5hbWVDYWxsYmFjaykgeworICAgICAgICAgICAgICAgICAgICBuYyA9IChOYW1lQ2FsbGJhY2spIGNhbGxiYWNrOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2FsbGJhY2sgaW5zdGFuY2VvZiBQYXNzd29yZENhbGxiYWNrKSB7CisgICAgICAgICAgICAgICAgICAgIHBjID0gKFBhc3N3b3JkQ2FsbGJhY2spIGNhbGxiYWNrOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2FsbGJhY2sgaW5zdGFuY2VvZiBSZWFsbUNhbGxiYWNrKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyByZWFsbSBpcyBpZ25vcmVkCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkQ2FsbGJhY2tFeGNlcHRpb24oY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoYW5kbGU6IFVucmVjb2duaXplZCBTQVNMIERJR0VTVC1NRDUgQ2FsbGJhY2siKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAKLQkJcHVibGljIFNhc2xEaWdlc3RDYWxsYmFja0hhbmRsZXIoU3RyaW5nIHRvcG9sb2d5TmFtZSwgYnl0ZVtdIHRva2VuKSB7Ci0JCQlMT0cuZGVidWcoIlNhc2xEaWdlc3RDYWxsYmFjazogQ3JlYXRpbmcgU2FzbERpZ2VzdENhbGxiYWNrIGhhbmRsZXIgIgotCQkJCQkrICJ3aXRoIHRvcG9sb2d5IHRva2VuOiAiICsgdG9wb2xvZ3lOYW1lKTsKLQkJCXRoaXMudXNlck5hbWUgPSB0b3BvbG9neU5hbWU7Ci0JCQl0aGlzLnVzZXJQYXNzd29yZCA9IHRva2VuOwotCQl9CisgICAgICAgICAgICBpZiAobmMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIExPRy5kZWJ1ZygiaGFuZGxlOiBTQVNMIHNlcnZlciBESUdFU1QtTUQ1IGNhbGxiYWNrOiBzZXR0aW5nIHVzZXJuYW1lIGZvciBjbGllbnQ6IHt9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlck5hbWUpOworICAgICAgICAgICAgICAgIG5jLnNldE5hbWUodXNlck5hbWUpOworICAgICAgICAgICAgfQogCi0JCUBPdmVycmlkZQotCQlwdWJsaWMgdm9pZCBoYW5kbGUoQ2FsbGJhY2tbXSBjYWxsYmFja3MpIHRocm93cyBJT0V4Y2VwdGlvbiwKLQkJCQlVbnN1cHBvcnRlZENhbGxiYWNrRXhjZXB0aW9uIHsKLQkJCU5hbWVDYWxsYmFjayBuYyA9IG51bGw7Ci0JCQlQYXNzd29yZENhbGxiYWNrIHBjID0gbnVsbDsKLQkJCUF1dGhvcml6ZUNhbGxiYWNrIGFjID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChwYyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY2hhcltdIHBhc3N3b3JkID0gU2FzbFV0aWxzLmVuY29kZVBhc3N3b3JkKHVzZXJQYXNzd29yZCk7CiAKLQkJCWZvciAoQ2FsbGJhY2sgY2FsbGJhY2sgOiBjYWxsYmFja3MpIHsKLQkJCQlpZiAoY2FsbGJhY2sgaW5zdGFuY2VvZiBBdXRob3JpemVDYWxsYmFjaykgewotCQkJCQlhYyA9IChBdXRob3JpemVDYWxsYmFjaykgY2FsbGJhY2s7Ci0JCQkJfSBlbHNlIGlmIChjYWxsYmFjayBpbnN0YW5jZW9mIE5hbWVDYWxsYmFjaykgewotCQkJCQluYyA9IChOYW1lQ2FsbGJhY2spIGNhbGxiYWNrOwotCQkJCX0gZWxzZSBpZiAoY2FsbGJhY2sgaW5zdGFuY2VvZiBQYXNzd29yZENhbGxiYWNrKSB7Ci0JCQkJCXBjID0gKFBhc3N3b3JkQ2FsbGJhY2spIGNhbGxiYWNrOwotCQkJCX0gZWxzZSBpZiAoY2FsbGJhY2sgaW5zdGFuY2VvZiBSZWFsbUNhbGxiYWNrKSB7Ci0JCQkJCWNvbnRpbnVlOyAvLyByZWFsbSBpcyBpZ25vcmVkCi0JCQkJfSBlbHNlIHsKLQkJCQkJdGhyb3cgbmV3IFVuc3VwcG9ydGVkQ2FsbGJhY2tFeGNlcHRpb24oY2FsbGJhY2ssCi0JCQkJCQkJImhhbmRsZTogVW5yZWNvZ25pemVkIFNBU0wgRElHRVNULU1ENSBDYWxsYmFjayIpOwotCQkJCX0KLQkJCX0KKyAgICAgICAgICAgICAgICBMT0cuZGVidWcoImhhbmRsZTogU0FTTCBzZXJ2ZXIgRElHRVNULU1ENSBjYWxsYmFjazogc2V0dGluZyBwYXNzd29yZCBmb3IgY2xpZW50OiAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyUGFzc3dvcmQpOwogCi0JCQlpZiAobmMgIT0gbnVsbCkgewotCQkJCUxPRy5kZWJ1ZygiaGFuZGxlOiBTQVNMIHNlcnZlciBESUdFU1QtTUQ1IGNhbGxiYWNrOiBzZXR0aW5nICIKLQkJCQkJCSsgInVzZXJuYW1lIGZvciBjbGllbnQ6ICIgKyB1c2VyTmFtZSk7CisgICAgICAgICAgICAgICAgcGMuc2V0UGFzc3dvcmQocGFzc3dvcmQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFjICE9IG51bGwpIHsKIAotCQkJCW5jLnNldE5hbWUodXNlck5hbWUpOwotCQkJfQorICAgICAgICAgICAgICAgIFN0cmluZyBhdXRoaWQgPSBhYy5nZXRBdXRoZW50aWNhdGlvbklEKCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGF1dGh6aWQgPSBhYy5nZXRBdXRob3JpemF0aW9uSUQoKTsKIAotCQkJaWYgKHBjICE9IG51bGwpIHsKLQkJCQljaGFyW10gcGFzc3dvcmQgPSBTYXNsVXRpbHMuZW5jb2RlUGFzc3dvcmQodXNlclBhc3N3b3JkKTsKKyAgICAgICAgICAgICAgICBpZiAoYXV0aGlkLmVxdWFscyhhdXRoemlkKSkgeworICAgICAgICAgICAgICAgICAgICBhYy5zZXRBdXRob3JpemVkKHRydWUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGFjLnNldEF1dGhvcml6ZWQoZmFsc2UpOworICAgICAgICAgICAgICAgIH0KIAotCQkJCUxPRy5kZWJ1ZygiaGFuZGxlOiBTQVNMIHNlcnZlciBESUdFU1QtTUQ1IGNhbGxiYWNrOiBzZXR0aW5nICIKLQkJCQkJCSsgInBhc3N3b3JkIGZvciBjbGllbnQ6ICIgKyB1c2VyUGFzc3dvcmQpOworICAgICAgICAgICAgICAgIGlmIChhYy5pc0F1dGhvcml6ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBMT0cuZGVidWcoImhhbmRsZTogU0FTTCBzZXJ2ZXIgRElHRVNULU1ENSBjYWxsYmFjazogc2V0dGluZyBjYW5vbmljYWxpemVkIGNsaWVudCBJRDogIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXJOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgYWMuc2V0QXV0aG9yaXplZElEKGF1dGh6aWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KIAotCQkJCXBjLnNldFBhc3N3b3JkKHBhc3N3b3JkKTsKLQkJCX0KLQkJCWlmIChhYyAhPSBudWxsKSB7Ci0KLQkJCQlTdHJpbmcgYXV0aGlkID0gYWMuZ2V0QXV0aGVudGljYXRpb25JRCgpOwotCQkJCVN0cmluZyBhdXRoemlkID0gYWMuZ2V0QXV0aG9yaXphdGlvbklEKCk7Ci0KLQkJCQlpZiAoYXV0aGlkLmVxdWFscyhhdXRoemlkKSkgewotCQkJCQlhYy5zZXRBdXRob3JpemVkKHRydWUpOwotCQkJCX0gZWxzZSB7Ci0JCQkJCWFjLnNldEF1dGhvcml6ZWQoZmFsc2UpOwotCQkJCX0KLQotCQkJCWlmIChhYy5pc0F1dGhvcml6ZWQoKSkgewotCQkJCQlMT0cuZGVidWcoImhhbmRsZTogU0FTTCBzZXJ2ZXIgRElHRVNULU1ENSBjYWxsYmFjazogc2V0dGluZyAiCi0JCQkJCQkJKyAiY2Fub25pY2FsaXplZCBjbGllbnQgSUQ6ICIgKyB1c2VyTmFtZSk7Ci0JCQkJCWFjLnNldEF1dGhvcml6ZWRJRChhdXRoemlkKTsKLQkJCQl9Ci0JCQl9Ci0JCX0KLQl9Ci0KLQkvKioKLQkgKiBVc2VkIGJ5IFNhc2xUb2tlbk1lc3NhZ2U6OnByb2Nlc3NUb2tlbigpIHRvIHJlc3BvbmQgdG8gc2VydmVyIFNBU0wKLQkgKiB0b2tlbnMuCi0JICogCi0JICogQHBhcmFtIHRva2VuCi0JICogICAgICAgICAgICBTZXJ2ZXIncyBTQVNMIHRva2VuCi0JICogQHJldHVybiB0b2tlbiB0byBzZW5kIGJhY2sgdG8gdGhlIHNlcnZlci4KLQkgKi8KLQlwdWJsaWMgYnl0ZVtdIHJlc3BvbnNlKGJ5dGVbXSB0b2tlbikgewotCQl0cnkgewotCQkJTE9HLmRlYnVnKCJyZXNwb25zZTogUmVzcG9uZGluZyB0byBpbnB1dCB0b2tlbiBvZiBsZW5ndGg6ICIKLQkJCQkJKyB0b2tlbi5sZW5ndGgpOwotCQkJYnl0ZVtdIHJldHZhbCA9IHNhc2xTZXJ2ZXIuZXZhbHVhdGVSZXNwb25zZSh0b2tlbik7Ci0JCQlMT0cuZGVidWcoInJlc3BvbnNlOiBSZXNwb25zZSB0b2tlbiBsZW5ndGg6ICIgKyByZXR2YWwubGVuZ3RoKTsKLQkJCXJldHVybiByZXR2YWw7Ci0JCX0gY2F0Y2ggKFNhc2xFeGNlcHRpb24gZSkgewotCQkJTE9HLmVycm9yKCJyZXNwb25zZTogRmFpbGVkIHRvIGV2YWx1YXRlIGNsaWVudCB0b2tlbiBvZiBsZW5ndGg6ICIKLQkJCQkJKyB0b2tlbi5sZW5ndGggKyAiIDogIiArIGUpOwotCQkJcmV0dXJuIG51bGw7Ci0JCX0KLQl9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorICAgIC8qKgorICAgICAqIFVzZWQgYnkgU2FzbFRva2VuTWVzc2FnZTo6cHJvY2Vzc1Rva2VuKCkgdG8gcmVzcG9uZCB0byBzZXJ2ZXIgU0FTTAorICAgICAqIHRva2Vucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0b2tlbgorICAgICAqICAgICAgICAgICAgU2VydmVyJ3MgU0FTTCB0b2tlbgorICAgICAqIEByZXR1cm4gdG9rZW4gdG8gc2VuZCBiYWNrIHRvIHRoZSBzZXJ2ZXIuCisgICAgICovCisgICAgcHVibGljIGJ5dGVbXSByZXNwb25zZShieXRlW10gdG9rZW4pIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIExPRy5kZWJ1ZygicmVzcG9uc2U6IFJlc3BvbmRpbmcgdG8gaW5wdXQgdG9rZW4gb2YgbGVuZ3RoOiB7fSIsCisgICAgICAgICAgICAgICAgICAgICAgdG9rZW4ubGVuZ3RoKTsKKyAgICAgICAgICAgIGJ5dGVbXSByZXR2YWwgPSBzYXNsU2VydmVyLmV2YWx1YXRlUmVzcG9uc2UodG9rZW4pOworICAgICAgICAgICAgTE9HLmRlYnVnKCJyZXNwb25zZTogUmVzcG9uc2UgdG9rZW4gbGVuZ3RoOiB7fSIsIHJldHZhbC5sZW5ndGgpOworICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICAgICAgfSBjYXRjaCAoU2FzbEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0cuZXJyb3IoInJlc3BvbnNlOiBGYWlsZWQgdG8gZXZhbHVhdGUgY2xpZW50IHRva2VuIG9mIGxlbmd0aDoge30gOiB7fSIsCisgICAgICAgICAgICAgICAgICAgICAgdG9rZW4ubGVuZ3RoLCBlKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21lc3NhZ2luZy9uZXR0eS9TYXNsTmV0dHlTZXJ2ZXJTdGF0ZS5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21lc3NhZ2luZy9uZXR0eS9TYXNsTmV0dHlTZXJ2ZXJTdGF0ZS5qYXZhCmluZGV4IDk4MDA5NTkuLjQyNjRlNTEgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXNzYWdpbmcvbmV0dHkvU2FzbE5ldHR5U2VydmVyU3RhdGUuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vbWVzc2FnaW5nL25ldHR5L1Nhc2xOZXR0eVNlcnZlclN0YXRlLmphdmEKQEAgLTIyLDEwICsyMiw5IEBACiAKIGZpbmFsIGNsYXNzIFNhc2xOZXR0eVNlcnZlclN0YXRlIHsKIAotCXB1YmxpYyBzdGF0aWMgZmluYWwgQ2hhbm5lbExvY2FsPFNhc2xOZXR0eVNlcnZlcj4gZ2V0U2FzbE5ldHR5U2VydmVyID0gbmV3IENoYW5uZWxMb2NhbDxTYXNsTmV0dHlTZXJ2ZXI+KCkgewotCQlwcm90ZWN0ZWQgU2FzbE5ldHR5U2VydmVyIGluaXRpYWxWYWx1ZShDaGFubmVsIGNoYW5uZWwpIHsKLQkJCXJldHVybiBudWxsOwotCQl9Ci0JfTsKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENoYW5uZWxMb2NhbDxTYXNsTmV0dHlTZXJ2ZXI+IGdldFNhc2xOZXR0eVNlcnZlciA9IG5ldyBDaGFubmVsTG9jYWw8U2FzbE5ldHR5U2VydmVyPigpIHsKKyAgICAgICAgICAgIHByb3RlY3RlZCBTYXNsTmV0dHlTZXJ2ZXIgaW5pdGlhbFZhbHVlKENoYW5uZWwgY2hhbm5lbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9OworfQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21lc3NhZ2luZy9uZXR0eS9TYXNsU3Rvcm1DbGllbnRIYW5kbGVyLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vbWVzc2FnaW5nL25ldHR5L1Nhc2xTdG9ybUNsaWVudEhhbmRsZXIuamF2YQppbmRleCAxMmI0NjZjLi45ODBjMGY2IDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vbWVzc2FnaW5nL25ldHR5L1Nhc2xTdG9ybUNsaWVudEhhbmRsZXIuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vbWVzc2FnaW5nL25ldHR5L1Nhc2xTdG9ybUNsaWVudEhhbmRsZXIuamF2YQpAQCAtMjgsMTkgKzI4LDE4IEBACiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAotaW1wb3J0IGJhY2t0eXBlLnN0b3JtLkNvbmZpZzsKLQogcHVibGljIGNsYXNzIFNhc2xTdG9ybUNsaWVudEhhbmRsZXIgZXh0ZW5kcyBTaW1wbGVDaGFubmVsVXBzdHJlYW1IYW5kbGVyIHsKIAogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5CiAgICAgICAgICAgICAuZ2V0TG9nZ2VyKFNhc2xTdG9ybUNsaWVudEhhbmRsZXIuY2xhc3MpOwotICAgIHByaXZhdGUgQ2xpZW50IGNsaWVudDsKKworICAgIHByaXZhdGUgSVNhc2xDbGllbnQgY2xpZW50OwogICAgIGxvbmcgc3RhcnRfdGltZTsKICAgICAvKiogVXNlZCBmb3IgY2xpZW50IG9yIHNlcnZlcidzIHRva2VuIHRvIHNlbmQgb3IgcmVjZWl2ZSBmcm9tIGVhY2ggb3RoZXIuICovCiAgICAgcHJpdmF0ZSBieXRlW10gdG9rZW47Ci0gICAgcHJpdmF0ZSBTdHJpbmcgdG9wb2xvZ3lOYW1lOworICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CiAKLSAgICBwdWJsaWMgU2FzbFN0b3JtQ2xpZW50SGFuZGxlcihDbGllbnQgY2xpZW50KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgIHB1YmxpYyBTYXNsU3Rvcm1DbGllbnRIYW5kbGVyKElTYXNsQ2xpZW50IGNsaWVudCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7CiAgICAgICAgIHN0YXJ0X3RpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKICAgICAgICAgZ2V0U0FTTENyZWRlbnRpYWxzKCk7CkBAIC01MSw5ICs1MCw3IEBACiAgICAgICAgICAgICBDaGFubmVsU3RhdGVFdmVudCBldmVudCkgewogICAgICAgICAvLyByZWdpc3RlciB0aGUgbmV3bHkgZXN0YWJsaXNoZWQgY2hhbm5lbAogICAgICAgICBDaGFubmVsIGNoYW5uZWwgPSBjdHguZ2V0Q2hhbm5lbCgpOwotCi0gICAgICAgIExPRy5pbmZvKCJDb25uZWN0aW9uIGVzdGFibGlzaGVkIGZyb20gIiArIGNoYW5uZWwuZ2V0TG9jYWxBZGRyZXNzKCkKLSAgICAgICAgICAgICAgICArICIgdG8gIiArIGNoYW5uZWwuZ2V0UmVtb3RlQWRkcmVzcygpKTsKKyAgICAgICAgY2xpZW50LmNoYW5uZWxDb25uZWN0ZWQoY2hhbm5lbCk7CiAKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIFNhc2xOZXR0eUNsaWVudCBzYXNsTmV0dHlDbGllbnQgPSBTYXNsTmV0dHlDbGllbnRTdGF0ZS5nZXRTYXNsTmV0dHlDbGllbnQKQEAgLTYyLDE3ICs1OSwxNiBAQAogICAgICAgICAgICAgaWYgKHNhc2xOZXR0eUNsaWVudCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgTE9HLmRlYnVnKCJDcmVhdGluZyBzYXNsTmV0dHlDbGllbnQgbm93ICIgKyAiZm9yIGNoYW5uZWw6ICIKICAgICAgICAgICAgICAgICAgICAgICAgICsgY2hhbm5lbCk7Ci0gICAgICAgICAgICAgICAgc2FzbE5ldHR5Q2xpZW50ID0gbmV3IFNhc2xOZXR0eUNsaWVudCh0b3BvbG9neU5hbWUsIHRva2VuKTsKKyAgICAgICAgICAgICAgICBzYXNsTmV0dHlDbGllbnQgPSBuZXcgU2FzbE5ldHR5Q2xpZW50KG5hbWUsIHRva2VuKTsKICAgICAgICAgICAgICAgICBTYXNsTmV0dHlDbGllbnRTdGF0ZS5nZXRTYXNsTmV0dHlDbGllbnQuc2V0KGNoYW5uZWwsCiAgICAgICAgICAgICAgICAgICAgICAgICBzYXNsTmV0dHlDbGllbnQpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgTE9HLmRlYnVnKCJTZW5kaW5nIFNBU0xfVE9LRU5fTUVTU0FHRV9SRVFVRVNUIik7CiAgICAgICAgICAgICBjaGFubmVsLndyaXRlKENvbnRyb2xNZXNzYWdlLlNBU0xfVE9LRU5fTUVTU0FHRV9SRVFVRVNUKTsKICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIExPRy5lcnJvcigiRmFpbGVkIHRvIGF1dGhlbnRpY2F0ZSB3aXRoIHNlcnZlciAiICsgImR1ZSB0byBlcnJvcjogIiwKICAgICAgICAgICAgICAgICAgICAgZSk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotCiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC05Niw3ICs5Miw3IEBACiAgICAgICAgICAgICBDb250cm9sTWVzc2FnZSBtc2cgPSAoQ29udHJvbE1lc3NhZ2UpIGV2ZW50LmdldE1lc3NhZ2UoKTsKICAgICAgICAgICAgIGlmIChtc2cgPT0gQ29udHJvbE1lc3NhZ2UuU0FTTF9DT01QTEVURV9SRVFVRVNUKSB7CiAgICAgICAgICAgICAgICAgTE9HLmRlYnVnKCJTZXJ2ZXIgaGFzIHNlbnQgdXMgdGhlIFNhc2xDb21wbGV0ZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJtZXNzYWdlLiBBbGxvd2luZyBub3JtYWwgd29yayB0byBwcm9jZWVkLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICArICJtZXNzYWdlLiBBbGxvd2luZyBub3JtYWwgd29yayB0byBwcm9jZWVkLiIpOwogCiAgICAgICAgICAgICAgICAgaWYgKCFzYXNsTmV0dHlDbGllbnQuaXNDb21wbGV0ZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIExPRy5lcnJvcigiU2VydmVyIHJldHVybmVkIGEgU2FzbC1jb21wbGV0ZSBtZXNzYWdlLCAiCkBAIC0xMDYsNiArMTAyLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJ3ZSBjYW4gdGVsbCwgd2UgYXJlIG5vdCBhdXRoZW50aWNhdGVkIHlldC4iKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY3R4LmdldFBpcGVsaW5lKCkucmVtb3ZlKHRoaXMpOworICAgICAgICAgICAgICAgIHRoaXMuY2xpZW50LmNoYW5uZWxSZWFkeSgpOworCiAgICAgICAgICAgICAgICAgLy8gV2UgY2FsbCBmaXJlTWVzc2FnZVJlY2VpdmVkIHNpbmNlIHRoZSBjbGllbnQgaXMgYWxsb3dlZCB0bwogICAgICAgICAgICAgICAgIC8vIHBlcmZvcm0gdGhpcyByZXF1ZXN0LiBUaGUgY2xpZW50J3MgcmVxdWVzdCB3aWxsIG5vdyBwcm9jZWVkCiAgICAgICAgICAgICAgICAgLy8gdG8gdGhlIG5leHQgcGlwZWxpbmUgY29tcG9uZW50IG5hbWVseSBTdG9ybUNsaWVudEhhbmRsZXIuCkBAIC0xMTYsNyArMTE0LDcgQEAKICAgICAgICAgU2FzbE1lc3NhZ2VUb2tlbiBzYXNsVG9rZW5NZXNzYWdlID0gKFNhc2xNZXNzYWdlVG9rZW4pIGV2ZW50CiAgICAgICAgICAgICAgICAgLmdldE1lc3NhZ2UoKTsKICAgICAgICAgTE9HLmRlYnVnKCJSZXNwb25kaW5nIHRvIHNlcnZlcidzIHRva2VuIG9mIGxlbmd0aDogIgotICAgICAgICAgICAgICAgICsgc2FzbFRva2VuTWVzc2FnZS5nZXRTYXNsVG9rZW4oKS5sZW5ndGgpOworICAgICAgICAgICAgICAgICAgKyBzYXNsVG9rZW5NZXNzYWdlLmdldFNhc2xUb2tlbigpLmxlbmd0aCk7CiAKICAgICAgICAgLy8gR2VuZXJhdGUgU0FTTCByZXNwb25zZSAoYnV0IHdlIG9ubHkgYWN0dWFsbHkgc2VuZCB0aGUgcmVzcG9uc2UgaWYKICAgICAgICAgLy8gaXQncyBub24tbnVsbC4KQEAgLTEyNywxNyArMTI1LDE4IEBACiAgICAgICAgICAgICAvLyAoaWYgbm90LCB3YXJuKSwgYW5kIHJldHVybiB3aXRob3V0IHNlbmRpbmcgYSByZXNwb25zZSBiYWNrIHRvIHRoZQogICAgICAgICAgICAgLy8gc2VydmVyLgogICAgICAgICAgICAgTE9HLmRlYnVnKCJSZXNwb25zZSB0byBzZXJ2ZXIgaXMgbnVsbDogIgotICAgICAgICAgICAgICAgICAgICArICJhdXRoZW50aWNhdGlvbiBzaG91bGQgbm93IGJlIGNvbXBsZXRlLiIpOworICAgICAgICAgICAgICAgICAgICAgICsgImF1dGhlbnRpY2F0aW9uIHNob3VsZCBub3cgYmUgY29tcGxldGUuIik7CiAgICAgICAgICAgICBpZiAoIXNhc2xOZXR0eUNsaWVudC5pc0NvbXBsZXRlKCkpIHsKICAgICAgICAgICAgICAgICBMT0cud2FybigiR2VuZXJhdGVkIGEgbnVsbCByZXNwb25zZSwgIgogICAgICAgICAgICAgICAgICAgICAgICAgKyAiYnV0IGF1dGhlbnRpY2F0aW9uIGlzIG5vdCBjb21wbGV0ZS4iKTsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJTZXJ2ZXIgcmVwb25zZSBpcyBudWxsLCBidXQgYXMgZmFyIGFzICIKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJTZXJ2ZXIgcmVzcG9uc2UgaXMgbnVsbCwgYnV0IGFzIGZhciBhcyAiCiAgICAgICAgICAgICAgICAgICAgICAgICArICJ3ZSBjYW4gdGVsbCwgd2UgYXJlIG5vdCBhdXRoZW50aWNhdGVkIHlldC4iKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRoaXMuY2xpZW50LmNoYW5uZWxSZWFkeSgpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgTE9HLmRlYnVnKCJSZXNwb25zZSB0byBzZXJ2ZXIgdG9rZW4gaGFzIGxlbmd0aDoiCi0gICAgICAgICAgICAgICAgICAgICsgcmVzcG9uc2VUb1NlcnZlci5sZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgICsgcmVzcG9uc2VUb1NlcnZlci5sZW5ndGgpOwogICAgICAgICB9CiAgICAgICAgIC8vIENvbnN0cnVjdCBhIG1lc3NhZ2UgY29udGFpbmluZyB0aGUgU0FTTCByZXNwb25zZSBhbmQgc2VuZCBpdCB0byB0aGUKICAgICAgICAgLy8gc2VydmVyLgpAQCAtMTQ2LDEyICsxNDUsMTQgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgZ2V0U0FTTENyZWRlbnRpYWxzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgdG9wb2xvZ3lOYW1lID0gKFN0cmluZykgdGhpcy5jbGllbnQuZ2V0U3Rvcm1Db25mKCkuZ2V0KENvbmZpZy5UT1BPTE9HWV9OQU1FKTsKLSAgICAgICAgU3RyaW5nIHNlY3JldEtleSA9IFNhc2xVdGlscy5nZXRTZWNyZXRLZXkodGhpcy5jbGllbnQuZ2V0U3Rvcm1Db25mKCkpOworICAgICAgICBTdHJpbmcgc2VjcmV0S2V5OworICAgICAgICBuYW1lID0gY2xpZW50Lm5hbWUoKTsKKyAgICAgICAgc2VjcmV0S2V5ID0gY2xpZW50LnNlY3JldEtleSgpOworCiAgICAgICAgIGlmIChzZWNyZXRLZXkgIT0gbnVsbCkgewogICAgICAgICAgICAgdG9rZW4gPSBzZWNyZXRLZXkuZ2V0Qnl0ZXMoKTsKICAgICAgICAgfQotICAgICAgICBMT0cuZGVidWcoIlNBU0wgY3JlZGVudGlhbHMgZm9yIHN0b3JtIHRvcG9sb2d5ICIgKyB0b3BvbG9neU5hbWUKKyAgICAgICAgTE9HLmRlYnVnKCJTQVNMIGNyZWRlbnRpYWxzIGZvciBzdG9ybSB0b3BvbG9neSAiICsgbmFtZQogICAgICAgICAgICAgICAgICsgIiBpcyAiICsgc2VjcmV0S2V5KTsKICAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21lc3NhZ2luZy9uZXR0eS9TYXNsU3Rvcm1TZXJ2ZXJIYW5kbGVyLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vbWVzc2FnaW5nL25ldHR5L1Nhc2xTdG9ybVNlcnZlckhhbmRsZXIuamF2YQppbmRleCAwMjQ0OGUyLi5hOGY5OTc4IDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vbWVzc2FnaW5nL25ldHR5L1Nhc2xTdG9ybVNlcnZlckhhbmRsZXIuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vbWVzc2FnaW5nL25ldHR5L1Nhc2xTdG9ybVNlcnZlckhhbmRsZXIuamF2YQpAQCAtMjgsMTEgKzI4LDkgQEAKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCi1pbXBvcnQgYmFja3R5cGUuc3Rvcm0uQ29uZmlnOwotCiBwdWJsaWMgY2xhc3MgU2FzbFN0b3JtU2VydmVySGFuZGxlciBleHRlbmRzIFNpbXBsZUNoYW5uZWxVcHN0cmVhbUhhbmRsZXIgewogCi0gICAgU2VydmVyIHNlcnZlcjsKKyAgICBJU2FzbFNlcnZlciBzZXJ2ZXI7CiAgICAgLyoqIFVzZWQgZm9yIGNsaWVudCBvciBzZXJ2ZXIncyB0b2tlbiB0byBzZW5kIG9yIHJlY2VpdmUgZnJvbSBlYWNoIG90aGVyLiAqLwogICAgIHByaXZhdGUgYnl0ZVtdIHRva2VuOwogICAgIHByaXZhdGUgU3RyaW5nIHRvcG9sb2d5TmFtZTsKQEAgLTQwLDcgKzM4LDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyRmFjdG9yeQogICAgICAgICAgICAgLmdldExvZ2dlcihTYXNsU3Rvcm1TZXJ2ZXJIYW5kbGVyLmNsYXNzKTsKIAotICAgIHB1YmxpYyBTYXNsU3Rvcm1TZXJ2ZXJIYW5kbGVyKFNlcnZlciBzZXJ2ZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgcHVibGljIFNhc2xTdG9ybVNlcnZlckhhbmRsZXIoSVNhc2xTZXJ2ZXIgc2VydmVyKSB0aHJvd3MgSU9FeGNlcHRpb24gewogICAgICAgICB0aGlzLnNlcnZlciA9IHNlcnZlcjsKICAgICAgICAgZ2V0U0FTTENyZWRlbnRpYWxzKCk7CiAgICAgfQpAQCAtNTUsNyArNTMsNyBAQAogICAgICAgICBDaGFubmVsIGNoYW5uZWwgPSBjdHguZ2V0Q2hhbm5lbCgpOwogCiAgICAgICAgIGlmIChtc2cgaW5zdGFuY2VvZiBDb250cm9sTWVzc2FnZQotICAgICAgICAgICAgICAgICYmICgoQ29udHJvbE1lc3NhZ2UpIGUuZ2V0TWVzc2FnZSgpKSA9PSBDb250cm9sTWVzc2FnZS5TQVNMX1RPS0VOX01FU1NBR0VfUkVRVUVTVCkgeworICAgICAgICAgICAgICAgICYmIGUuZ2V0TWVzc2FnZSgpID09IENvbnRyb2xNZXNzYWdlLlNBU0xfVE9LRU5fTUVTU0FHRV9SRVFVRVNUKSB7CiAgICAgICAgICAgICAvLyBpbml0aWFsaXplIHNlcnZlci1zaWRlIFNBU0wgZnVuY3Rpb25hbGl0eSwgaWYgd2UgaGF2ZW4ndCB5ZXQKICAgICAgICAgICAgIC8vIChpbiB3aGljaCBjYXNlIHdlIGFyZSBsb29raW5nIGF0IHRoZSBmaXJzdCBTQVNMIG1lc3NhZ2UgZnJvbSB0aGUKICAgICAgICAgICAgIC8vIGNsaWVudCkuCkBAIC04NSw3ICs4Myw3IEBACiAgICAgICAgICAgICBMT0cuZGVidWcoInByb2Nlc3NUb2tlbjogIFdpdGggbmV0dHlTZXJ2ZXI6ICIgKyBzYXNsTmV0dHlTZXJ2ZXIKICAgICAgICAgICAgICAgICAgICAgKyAiIGFuZCB0b2tlbiBsZW5ndGg6ICIgKyB0b2tlbi5sZW5ndGgpOwogCi0gICAgICAgICAgICBTYXNsTWVzc2FnZVRva2VuIHNhc2xUb2tlbk1lc3NhZ2VSZXF1ZXN0ID0gbnVsbDsKKyAgICAgICAgICAgIFNhc2xNZXNzYWdlVG9rZW4gc2FzbFRva2VuTWVzc2FnZVJlcXVlc3Q7CiAgICAgICAgICAgICBzYXNsVG9rZW5NZXNzYWdlUmVxdWVzdCA9IG5ldyBTYXNsTWVzc2FnZVRva2VuKAogICAgICAgICAgICAgICAgICAgICBzYXNsTmV0dHlTZXJ2ZXIucmVzcG9uc2UobmV3IGJ5dGVbMF0pKTsKICAgICAgICAgICAgIC8vIFNlbmQgcmVzcG9uc2UgdG8gY2xpZW50LgpAQCAtMTAyLDEwICsxMDAsOCBAQAogICAgICAgICAgICAgU2FzbE5ldHR5U2VydmVyIHNhc2xOZXR0eVNlcnZlciA9IFNhc2xOZXR0eVNlcnZlclN0YXRlLmdldFNhc2xOZXR0eVNlcnZlcgogICAgICAgICAgICAgICAgICAgICAuZ2V0KGNoYW5uZWwpOwogICAgICAgICAgICAgaWYgKHNhc2xOZXR0eVNlcnZlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNhc2xOZXR0eVNlcnZlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oInNhc2xOZXR0eVNlcnZlciB3YXMgdW5leHBlY3RlZGx5ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJudWxsIGZvciBjaGFubmVsOiAiICsgY2hhbm5lbCk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oInNhc2xOZXR0eVNlcnZlciB3YXMgdW5leHBlY3RlZGx5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIm51bGwgZm9yIGNoYW5uZWw6ICIgKyBjaGFubmVsKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIFNhc2xNZXNzYWdlVG9rZW4gc2FzbFRva2VuTWVzc2FnZVJlcXVlc3QgPSBuZXcgU2FzbE1lc3NhZ2VUb2tlbigKICAgICAgICAgICAgICAgICAgICAgc2FzbE5ldHR5U2VydmVyLnJlc3BvbnNlKCgoU2FzbE1lc3NhZ2VUb2tlbikgbXNnKQpAQCAtMTIzLDggKzExOSw4IEBACiAgICAgICAgICAgICAgICAgTE9HLmRlYnVnKCJSZW1vdmluZyBTYXNsU2VydmVySGFuZGxlciBmcm9tIHBpcGVsaW5lIHNpbmNlIFNBU0wgIgogICAgICAgICAgICAgICAgICAgICAgICAgKyAiYXV0aGVudGljYXRpb24gaXMgY29tcGxldGUuIik7CiAgICAgICAgICAgICAgICAgY3R4LmdldFBpcGVsaW5lKCkucmVtb3ZlKHRoaXMpOworICAgICAgICAgICAgICAgIHNlcnZlci5hdXRoZW50aWNhdGVkKGNoYW5uZWwpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gQ2xpZW50IHNob3VsZCBub3QgYmUgc2VuZGluZyBvdGhlci10aGFuLVNBU0wgbWVzc2FnZXMgYmVmb3JlCiAgICAgICAgICAgICAvLyBTYXNsU2VydmVySGFuZGxlciBoYXMgcmVtb3ZlZCBpdHNlbGYgZnJvbSB0aGUgcGlwZWxpbmUuIFN1Y2gKQEAgLTEzOSwxNyArMTM1LDE5IEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBleGNlcHRpb25DYXVnaHQoQ2hhbm5lbEhhbmRsZXJDb250ZXh0IGN0eCwgRXhjZXB0aW9uRXZlbnQgZSkgewotICAgICAgICBzZXJ2ZXIuY2xvc2VDaGFubmVsKGUuZ2V0Q2hhbm5lbCgpKTsKKyAgICAgICAgaWYoc2VydmVyICE9IG51bGwpIHNlcnZlci5jbG9zZUNoYW5uZWwoZS5nZXRDaGFubmVsKCkpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBnZXRTQVNMQ3JlZGVudGlhbHMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICB0b3BvbG9neU5hbWUgPSAoU3RyaW5nKSB0aGlzLnNlcnZlci5zdG9ybV9jb25mCi0gICAgICAgICAgICAgICAgLmdldChDb25maWcuVE9QT0xPR1lfTkFNRSk7Ci0gICAgICAgIFN0cmluZyBzZWNyZXRLZXkgPSBTYXNsVXRpbHMuZ2V0U2VjcmV0S2V5KHRoaXMuc2VydmVyLnN0b3JtX2NvbmYpOworICAgICAgICBTdHJpbmcgc2VjcmV0S2V5OworICAgICAgICB0b3BvbG9neU5hbWUgPSBzZXJ2ZXIubmFtZSgpOworICAgICAgICBzZWNyZXRLZXkgPSBzZXJ2ZXIuc2VjcmV0S2V5KCk7CisKICAgICAgICAgaWYgKHNlY3JldEtleSAhPSBudWxsKSB7CiAgICAgICAgICAgICB0b2tlbiA9IHNlY3JldEtleS5nZXRCeXRlcygpOwogICAgICAgICB9Ci0gICAgICAgIExPRy5kZWJ1ZygiU0FTTCBjcmVkZW50aWFscyBmb3Igc3Rvcm0gdG9wb2xvZ3kgIiArIHRvcG9sb2d5TmFtZQotICAgICAgICAgICAgICAgICsgIiBpcyAiICsgc2VjcmV0S2V5KTsKKworICAgICAgICBMT0cuZGVidWcoIlNBU0wgY3JlZGVudGlhbHMgZm9yIHN0b3JtIHRvcG9sb2d5IHt9IGlzIHt9IiwKKyAgICAgICAgICAgICAgICAgIHRvcG9sb2d5TmFtZSwgc2VjcmV0S2V5KTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vbWVzc2FnaW5nL25ldHR5L1Nhc2xVdGlscy5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21lc3NhZ2luZy9uZXR0eS9TYXNsVXRpbHMuamF2YQppbmRleCBhMmQwYjI2Li40YTgxMDZiIDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vbWVzc2FnaW5nL25ldHR5L1Nhc2xVdGlscy5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXNzYWdpbmcvbmV0dHkvU2FzbFV0aWxzLmphdmEKQEAgLTE3LDcgKzE3LDYgQEAKICAqLwogcGFja2FnZSBiYWNrdHlwZS5zdG9ybS5tZXNzYWdpbmcubmV0dHk7CiAKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIApAQCAtMjksMTEgKzI4LDEyIEBACiBpbXBvcnQgYmFja3R5cGUuc3Rvcm0uQ29uZmlnOwogCiBjbGFzcyBTYXNsVXRpbHMgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFUkJFUk9TID0gIkdTU0FQSSI7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVVUSF9ESUdFU1RfTUQ1ID0gIkRJR0VTVC1NRDUiOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUkVBTE0gPSAiZGVmYXVsdCI7CiAKICAgICBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRTYXNsUHJvcHMoKSB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wcyA9IG5ldyBIYXNoTWFwPD4oKTsKICAgICAgICAgcHJvcHMucHV0KFNhc2wuUE9MSUNZX05PUExBSU5URVhULCAidHJ1ZSIpOwogICAgICAgICByZXR1cm4gcHJvcHM7CiAgICAgfQpAQCAtNjIsMTMgKzYyLDcgQEAKICAgICB9CiAKICAgICBzdGF0aWMgU3RyaW5nIGdldFNlY3JldEtleShNYXAgY29uZikgewotICAgICAgICBpZiAoY29uZiA9PSBudWxsIHx8IGNvbmYuaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICAgICAgU3RyaW5nIHNlY3JldFBheUxvYWQgPSAoU3RyaW5nKSBjb25mCi0gICAgICAgICAgICAgICAgLmdldChDb25maWcuU1RPUk1fWk9PS0VFUEVSX1RPUE9MT0dZX0FVVEhfUEFZTE9BRCk7Ci0KLSAgICAgICAgcmV0dXJuIHNlY3JldFBheUxvYWQ7CisgICAgICAgIHJldHVybiBjb25mID09IG51bGwgfHwgY29uZi5pc0VtcHR5KCkgPyBudWxsIDogKFN0cmluZykgY29uZi5nZXQoQ29uZmlnLlNUT1JNX1pPT0tFRVBFUl9UT1BPTE9HWV9BVVRIX1BBWUxPQUQpOwogICAgIH0KIAogfQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21lc3NhZ2luZy9uZXR0eS9TZXJ2ZXIuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXNzYWdpbmcvbmV0dHkvU2VydmVyLmphdmEKaW5kZXggZTk4NDE0NC4uNDk5MGY2MyAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21lc3NhZ2luZy9uZXR0eS9TZXJ2ZXIuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vbWVzc2FnaW5nL25ldHR5L1NlcnZlci5qYXZhCkBAIC0xNywxOSArMTcsMjYgQEAKICAqLwogcGFja2FnZSBiYWNrdHlwZS5zdG9ybS5tZXNzYWdpbmcubmV0dHk7CiAKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5Db25maWc7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0uZ3JvdXBpbmcuTG9hZDsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5tZXNzYWdpbmcuQ29ubmVjdGlvbldpdGhTdGF0dXM7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0ubWVzc2FnaW5nLklDb25uZWN0aW9uQ2FsbGJhY2s7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0ubWVzc2FnaW5nLlRhc2tNZXNzYWdlOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLm1ldHJpYy5hcGkuSVN0YXRlZnVsT2JqZWN0OworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnNlcmlhbGl6YXRpb24uS3J5b1ZhbHVlc1NlcmlhbGl6ZXI7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0udXRpbHMuVXRpbHM7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5ldC5JbmV0U29ja2V0QWRkcmVzczsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkxpbmtlZEJsb2NraW5nUXVldWU7CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkRmFjdG9yeTsKLQoraW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOwogaW1wb3J0IG9yZy5qYm9zcy5uZXR0eS5ib290c3RyYXAuU2VydmVyQm9vdHN0cmFwOwogaW1wb3J0IG9yZy5qYm9zcy5uZXR0eS5jaGFubmVsLkNoYW5uZWw7CiBpbXBvcnQgb3JnLmpib3NzLm5ldHR5LmNoYW5uZWwuQ2hhbm5lbEZhY3Rvcnk7CkBAIC0zOSw3NCArNDYsNDggQEAKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCi1pbXBvcnQgYmFja3R5cGUuc3Rvcm0uQ29uZmlnOwotaW1wb3J0IGJhY2t0eXBlLnN0b3JtLm1lc3NhZ2luZy5Db25uZWN0aW9uV2l0aFN0YXR1czsKLWltcG9ydCBiYWNrdHlwZS5zdG9ybS5tZXNzYWdpbmcuSUNvbm5lY3Rpb247Ci1pbXBvcnQgYmFja3R5cGUuc3Rvcm0ubWVzc2FnaW5nLlRhc2tNZXNzYWdlOwotaW1wb3J0IGJhY2t0eXBlLnN0b3JtLm1ldHJpYy5hcGkuSVN0YXRlZnVsT2JqZWN0OwotaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnV0aWxzLlV0aWxzOwotCi1jbGFzcyBTZXJ2ZXIgZXh0ZW5kcyBDb25uZWN0aW9uV2l0aFN0YXR1cyBpbXBsZW1lbnRzIElTdGF0ZWZ1bE9iamVjdCB7CitjbGFzcyBTZXJ2ZXIgZXh0ZW5kcyBDb25uZWN0aW9uV2l0aFN0YXR1cyBpbXBsZW1lbnRzIElTdGF0ZWZ1bE9iamVjdCwgSVNhc2xTZXJ2ZXIgewogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFNlcnZlci5jbGFzcyk7CiAgICAgQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKICAgICBNYXAgc3Rvcm1fY29uZjsKICAgICBpbnQgcG9ydDsKLSAgICBwcml2YXRlIGZpbmFsIENvbmN1cnJlbnRIYXNoTWFwPFN0cmluZywgQXRvbWljSW50ZWdlcj4gbWVzc2FnZXNFbnF1ZXVlZCA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDxTdHJpbmcsIEF0b21pY0ludGVnZXI+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBDb25jdXJyZW50SGFzaE1hcDxTdHJpbmcsIEF0b21pY0ludGVnZXI+IG1lc3NhZ2VzRW5xdWV1ZWQgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8PigpOwogICAgIHByaXZhdGUgZmluYWwgQXRvbWljSW50ZWdlciBtZXNzYWdlc0RlcXVldWVkID0gbmV3IEF0b21pY0ludGVnZXIoMCk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBBdG9taWNJbnRlZ2VyW10gcGVuZGluZ01lc3NhZ2VzOwotICAgIAotICAgIAotICAgIC8vIENyZWF0ZSBtdWx0aXBsZSBxdWV1ZXMgZm9yIGluY29taW5nIG1lc3NhZ2VzLiBUaGUgc2l6ZSBlcXVhbHMgdGhlIG51bWJlciBvZiByZWNlaXZlciB0aHJlYWRzLgotICAgIC8vIEZvciBtZXNzYWdlIHdoaWNoIGlzIHNlbnQgdG8gc2FtZSB0YXNrLCBpdCB3aWxsIGJlIHN0b3JlZCBpbiB0aGUgc2FtZSBxdWV1ZSB0byBwcmVzZXJ2ZSB0aGUgbWVzc2FnZSBvcmRlci4KLSAgICBwcml2YXRlIExpbmtlZEJsb2NraW5nUXVldWU8QXJyYXlMaXN0PFRhc2tNZXNzYWdlPj5bXSBtZXNzYWdlX3F1ZXVlOwogICAgIAogICAgIHZvbGF0aWxlIENoYW5uZWxHcm91cCBhbGxDaGFubmVscyA9IG5ldyBEZWZhdWx0Q2hhbm5lbEdyb3VwKCJzdG9ybS1zZXJ2ZXIiKTsKICAgICBmaW5hbCBDaGFubmVsRmFjdG9yeSBmYWN0b3J5OwogICAgIGZpbmFsIFNlcnZlckJvb3RzdHJhcCBib290c3RyYXA7Ci0gICAgCi0gICAgcHJpdmF0ZSBpbnQgcXVldWVDb3VudDsKLSAgICBwcml2YXRlIHZvbGF0aWxlIEhhc2hNYXA8SW50ZWdlciwgSW50ZWdlcj4gdGFza1RvUXVldWVJZCA9IG51bGw7Ci0gICAgaW50IHJvdW5kUm9iaW5RdWV1ZUlkOwotCQorIAogICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBjbG9zaW5nID0gZmFsc2U7CiAgICAgTGlzdDxUYXNrTWVzc2FnZT4gY2xvc2VNZXNzYWdlID0gQXJyYXlzLmFzTGlzdChuZXcgVGFza01lc3NhZ2UoLTEsIG51bGwpKTsKLSAgICAKKyAgICBwcml2YXRlIEtyeW9WYWx1ZXNTZXJpYWxpemVyIF9zZXI7CisgICAgcHJpdmF0ZSBJQ29ubmVjdGlvbkNhbGxiYWNrIF9jYiA9IG51bGw7IAogICAgIAogICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCiAgICAgU2VydmVyKE1hcCBzdG9ybV9jb25mLCBpbnQgcG9ydCkgewogICAgICAgICB0aGlzLnN0b3JtX2NvbmYgPSBzdG9ybV9jb25mOwogICAgICAgICB0aGlzLnBvcnQgPSBwb3J0OwotICAgICAgICAKLSAgICAgICAgcXVldWVDb3VudCA9IFV0aWxzLmdldEludChzdG9ybV9jb25mLmdldChDb25maWcuV09SS0VSX1JFQ0VJVkVSX1RIUkVBRF9DT1VOVCksIDEpOwotICAgICAgICByb3VuZFJvYmluUXVldWVJZCA9IDA7Ci0gICAgICAgIHRhc2tUb1F1ZXVlSWQgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPigpOwotICAgIAotICAgICAgICBtZXNzYWdlX3F1ZXVlID0gbmV3IExpbmtlZEJsb2NraW5nUXVldWVbcXVldWVDb3VudF07Ci0gICAgICAgIHBlbmRpbmdNZXNzYWdlcyA9IG5ldyBBdG9taWNJbnRlZ2VyW3F1ZXVlQ291bnRdOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHF1ZXVlQ291bnQ7IGkrKykgewotICAgICAgICAgICAgbWVzc2FnZV9xdWV1ZVtpXSA9IG5ldyBMaW5rZWRCbG9ja2luZ1F1ZXVlPEFycmF5TGlzdDxUYXNrTWVzc2FnZT4+KCk7Ci0gICAgICAgICAgICBwZW5kaW5nTWVzc2FnZXNbaV0gPSBuZXcgQXRvbWljSW50ZWdlcigwKTsKLSAgICAgICAgfQotICAgICAgICAKKyAgICAgICAgX3NlciA9IG5ldyBLcnlvVmFsdWVzU2VyaWFsaXplcihzdG9ybV9jb25mKTsKKwogICAgICAgICAvLyBDb25maWd1cmUgdGhlIHNlcnZlci4KICAgICAgICAgaW50IGJ1ZmZlcl9zaXplID0gVXRpbHMuZ2V0SW50KHN0b3JtX2NvbmYuZ2V0KENvbmZpZy5TVE9STV9NRVNTQUdJTkdfTkVUVFlfQlVGRkVSX1NJWkUpKTsKICAgICAgICAgaW50IGJhY2tsb2cgPSBVdGlscy5nZXRJbnQoc3Rvcm1fY29uZi5nZXQoQ29uZmlnLlNUT1JNX01FU1NBR0lOR19ORVRUWV9TT0NLRVRfQkFDS0xPRyksIDUwMCk7CiAgICAgICAgIGludCBtYXhXb3JrZXJzID0gVXRpbHMuZ2V0SW50KHN0b3JtX2NvbmYuZ2V0KENvbmZpZy5TVE9STV9NRVNTQUdJTkdfTkVUVFlfU0VSVkVSX1dPUktFUl9USFJFQURTKSk7CiAKLSAgICAgICAgVGhyZWFkRmFjdG9yeSBib3NzRmFjdG9yeSA9IG5ldyBOZXR0eVJlbmFtZVRocmVhZEZhY3RvcnkobmFtZSgpICsgIi1ib3NzIik7Ci0gICAgICAgIFRocmVhZEZhY3Rvcnkgd29ya2VyRmFjdG9yeSA9IG5ldyBOZXR0eVJlbmFtZVRocmVhZEZhY3RvcnkobmFtZSgpICsgIi13b3JrZXIiKTsKLSAgICAgICAgCisgICAgICAgIFRocmVhZEZhY3RvcnkgYm9zc0ZhY3RvcnkgPSBuZXcgTmV0dHlSZW5hbWVUaHJlYWRGYWN0b3J5KG5ldHR5X25hbWUoKSArICItYm9zcyIpOworICAgICAgICBUaHJlYWRGYWN0b3J5IHdvcmtlckZhY3RvcnkgPSBuZXcgTmV0dHlSZW5hbWVUaHJlYWRGYWN0b3J5KG5ldHR5X25hbWUoKSArICItd29ya2VyIik7CisKICAgICAgICAgaWYgKG1heFdvcmtlcnMgPiAwKSB7Ci0gICAgICAgICAgICBmYWN0b3J5ID0gbmV3IE5pb1NlcnZlclNvY2tldENoYW5uZWxGYWN0b3J5KEV4ZWN1dG9ycy5uZXdDYWNoZWRUaHJlYWRQb29sKGJvc3NGYWN0b3J5KSwgCisgICAgICAgICAgICBmYWN0b3J5ID0gbmV3IE5pb1NlcnZlclNvY2tldENoYW5uZWxGYWN0b3J5KEV4ZWN1dG9ycy5uZXdDYWNoZWRUaHJlYWRQb29sKGJvc3NGYWN0b3J5KSwKICAgICAgICAgICAgICAgICBFeGVjdXRvcnMubmV3Q2FjaGVkVGhyZWFkUG9vbCh3b3JrZXJGYWN0b3J5KSwgbWF4V29ya2Vycyk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmYWN0b3J5ID0gbmV3IE5pb1NlcnZlclNvY2tldENoYW5uZWxGYWN0b3J5KEV4ZWN1dG9ycy5uZXdDYWNoZWRUaHJlYWRQb29sKGJvc3NGYWN0b3J5KSwgCisgICAgICAgICAgICBmYWN0b3J5ID0gbmV3IE5pb1NlcnZlclNvY2tldENoYW5uZWxGYWN0b3J5KEV4ZWN1dG9ycy5uZXdDYWNoZWRUaHJlYWRQb29sKGJvc3NGYWN0b3J5KSwKICAgICAgICAgICAgICAgICBFeGVjdXRvcnMubmV3Q2FjaGVkVGhyZWFkUG9vbCh3b3JrZXJGYWN0b3J5KSk7CiAgICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIExPRy5pbmZvKCJDcmVhdGUgTmV0dHkgU2VydmVyICIgKyBuYW1lKCkgKyAiLCBidWZmZXJfc2l6ZTogIiArIGJ1ZmZlcl9zaXplICsgIiwgbWF4V29ya2VyczogIiArIG1heFdvcmtlcnMpOwotICAgICAgICAKKworICAgICAgICBMT0cuaW5mbygiQ3JlYXRlIE5ldHR5IFNlcnZlciAiICsgbmV0dHlfbmFtZSgpICsgIiwgYnVmZmVyX3NpemU6ICIgKyBidWZmZXJfc2l6ZSArICIsIG1heFdvcmtlcnM6ICIgKyBtYXhXb3JrZXJzKTsKKwogICAgICAgICBib290c3RyYXAgPSBuZXcgU2VydmVyQm9vdHN0cmFwKGZhY3RvcnkpOwogICAgICAgICBib290c3RyYXAuc2V0T3B0aW9uKCJjaGlsZC50Y3BOb0RlbGF5IiwgdHJ1ZSk7CiAgICAgICAgIGJvb3RzdHJhcC5zZXRPcHRpb24oImNoaWxkLnJlY2VpdmVCdWZmZXJTaXplIiwgYnVmZmVyX3NpemUpOwpAQCAtMTIxLDQ4ICsxMDIsNiBAQAogICAgICAgICBhbGxDaGFubmVscy5hZGQoY2hhbm5lbCk7CiAgICAgfQogICAgIAotICAgIHByaXZhdGUgQXJyYXlMaXN0PFRhc2tNZXNzYWdlPltdIGdyb3VwTWVzc2FnZXMoTGlzdDxUYXNrTWVzc2FnZT4gbXNncykgewotICAgICAgICBBcnJheUxpc3Q8VGFza01lc3NhZ2U+IG1lc3NhZ2VHcm91cHNbXSA9IG5ldyBBcnJheUxpc3RbcXVldWVDb3VudF07Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtc2dzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBUYXNrTWVzc2FnZSBtZXNzYWdlID0gbXNncy5nZXQoaSk7Ci0gICAgICAgICAgICBpbnQgdGFzayA9IG1lc3NhZ2UudGFzaygpOwotCi0gICAgICAgICAgICBpZiAodGFzayA9PSAtMSkgewotICAgICAgICAgICAgICAgIGNsb3NpbmcgPSB0cnVlOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBJbnRlZ2VyIHF1ZXVlSWQgPSBnZXRNZXNzYWdlUXVldWVJZCh0YXNrKTsKLQotICAgICAgICAgICAgaWYgKG51bGwgPT0gbWVzc2FnZUdyb3Vwc1txdWV1ZUlkXSkgewotICAgICAgICAgICAgICAgIG1lc3NhZ2VHcm91cHNbcXVldWVJZF0gPSBuZXcgQXJyYXlMaXN0PFRhc2tNZXNzYWdlPigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbWVzc2FnZUdyb3Vwc1txdWV1ZUlkXS5hZGQobWVzc2FnZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1lc3NhZ2VHcm91cHM7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgSW50ZWdlciBnZXRNZXNzYWdlUXVldWVJZChpbnQgdGFzaykgewotICAgICAgICAvLyB0cnkgdG8gY29uc3RydWN0IHRoZSBtYXAgZnJvbSB0YXNrSWQgLT4gcXVldWVJZCBpbiByb3VuZCByb2JpbiBtYW5uZXIuCi0gICAgICAgIEludGVnZXIgcXVldWVJZCA9IHRhc2tUb1F1ZXVlSWQuZ2V0KHRhc2spOwotICAgICAgICBpZiAobnVsbCA9PSBxdWV1ZUlkKSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgICAgICBxdWV1ZUlkID0gdGFza1RvUXVldWVJZC5nZXQodGFzayk7Ci0gICAgICAgICAgICAgICAgaWYgKHF1ZXVlSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBxdWV1ZUlkID0gcm91bmRSb2JpblF1ZXVlSWQrKzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJvdW5kUm9iaW5RdWV1ZUlkID09IHF1ZXVlQ291bnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJvdW5kUm9iaW5RdWV1ZUlkID0gMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBIYXNoTWFwPEludGVnZXIsIEludGVnZXI+IG5ld1JlZiA9IG5ldyBIYXNoTWFwPEludGVnZXIsIEludGVnZXI+KHRhc2tUb1F1ZXVlSWQpOwotICAgICAgICAgICAgICAgICAgICBuZXdSZWYucHV0KHRhc2ssIHF1ZXVlSWQpOwotICAgICAgICAgICAgICAgICAgICB0YXNrVG9RdWV1ZUlkID0gbmV3UmVmOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcXVldWVJZDsKLSAgICB9Ci0KICAgICBwcml2YXRlIHZvaWQgYWRkUmVjZWl2ZUNvdW50KFN0cmluZyBmcm9tLCBpbnQgYW1vdW50KSB7CiAgICAgICAgIC8vVGhpcyBpcyBwb3NzaWJseSBsb3NzeSBpbiB0aGUgY2FzZSB3aGVyZSBhIHZhbHVlIGlzIGRlbGV0ZWQKICAgICAgICAgLy8gYmVjYXVzZSBpdCBoYXMgcmVjZWl2ZWQgbm8gbWVzc2FnZXMgb3ZlciB0aGUgbWV0cmljcyBjb2xsZWN0aW9uCkBAIC0xODEsOSArMTIwLDggQEAKICAgICAgICAgfQogICAgIH0KIAotCiAgICAgLyoqCi0gICAgICogZW5xdWV1ZSBhIHJlY2VpdmVkIG1lc3NhZ2UgCisgICAgICogZW5xdWV1ZSBhIHJlY2VpdmVkIG1lc3NhZ2UKICAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgZW5xdWV1ZShMaXN0PFRhc2tNZXNzYWdlPiBtc2dzLCBTdHJpbmcgZnJvbSkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKQEAgLTE5MSw2NSArMTI5LDI4IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgYWRkUmVjZWl2ZUNvdW50KGZyb20sIG1zZ3Muc2l6ZSgpKTsKLSAgICAgICAgQXJyYXlMaXN0PFRhc2tNZXNzYWdlPiBtZXNzYWdlR3JvdXBzW10gPSBncm91cE1lc3NhZ2VzKG1zZ3MpOwotCi0gICAgICAgIGlmIChudWxsID09IG1lc3NhZ2VHcm91cHMgfHwgY2xvc2luZykgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpbnQgcmVjZWl2ZXJJZCA9IDA7IHJlY2VpdmVySWQgPCBtZXNzYWdlR3JvdXBzLmxlbmd0aDsgcmVjZWl2ZXJJZCsrKSB7Ci0gICAgICAgICAgICBBcnJheUxpc3Q8VGFza01lc3NhZ2U+IG1zZ0dyb3VwID0gbWVzc2FnZUdyb3Vwc1tyZWNlaXZlcklkXTsKLSAgICAgICAgICAgIGlmIChudWxsICE9IG1zZ0dyb3VwKSB7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZV9xdWV1ZVtyZWNlaXZlcklkXS5wdXQobXNnR3JvdXApOwotICAgICAgICAgICAgICAgIHBlbmRpbmdNZXNzYWdlc1tyZWNlaXZlcklkXS5hZGRBbmRHZXQobXNnR3JvdXAuc2l6ZSgpKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKF9jYiAhPSBudWxsKSB7CisgICAgICAgICAgICBfY2IucmVjdihtc2dzKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIHB1YmxpYyBJdGVyYXRvcjxUYXNrTWVzc2FnZT4gcmVjdihpbnQgZmxhZ3MsIGludCByZWNlaXZlcklkKSB7Ci0gICAgICAgIGlmIChjbG9zaW5nKSB7Ci0gICAgICAgICAgICByZXR1cm4gY2xvc2VNZXNzYWdlLml0ZXJhdG9yKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBBcnJheUxpc3Q8VGFza01lc3NhZ2U+IHJldCA9IG51bGw7Ci0gICAgICAgIGludCBxdWV1ZUlkID0gcmVjZWl2ZXJJZCAlIHF1ZXVlQ291bnQ7Ci0gICAgICAgIGlmICgoZmxhZ3MgJiAweDAxKSA9PSAweDAxKSB7Ci0gICAgICAgICAgICAvL25vbi1ibG9ja2luZwotICAgICAgICAgICAgcmV0ID0gbWVzc2FnZV9xdWV1ZVtxdWV1ZUlkXS5wb2xsKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIEFycmF5TGlzdDxUYXNrTWVzc2FnZT4gcmVxdWVzdCA9IG1lc3NhZ2VfcXVldWVbcXVldWVJZF0udGFrZSgpOwotICAgICAgICAgICAgICAgIExPRy5kZWJ1ZygicmVxdWVzdCB0byBiZSBwcm9jZXNzZWQ6IHt9IiwgcmVxdWVzdCk7Ci0gICAgICAgICAgICAgICAgcmV0ID0gcmVxdWVzdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTE9HLmluZm8oImV4Y2VwdGlvbiB3aXRoaW4gbXNnIHJlY2VpdmluZyIsIGUpOwotICAgICAgICAgICAgICAgIHJldCA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobnVsbCAhPSByZXQpIHsKLSAgICAgICAgICAgIG1lc3NhZ2VzRGVxdWV1ZWQuYWRkQW5kR2V0KHJldC5zaXplKCkpOwotICAgICAgICAgICAgcGVuZGluZ01lc3NhZ2VzW3F1ZXVlSWRdLmFkZEFuZEdldCgwIC0gcmV0LnNpemUoKSk7Ci0gICAgICAgICAgICByZXR1cm4gcmV0Lml0ZXJhdG9yKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJSZWN2KElDb25uZWN0aW9uQ2FsbGJhY2sgY2IpIHsKKyAgICAgICAgX2NiID0gY2I7CiAgICAgfQotICAgCisKICAgICAvKioKICAgICAgKiByZWdpc3RlciBhIG5ld2x5IGNyZWF0ZWQgY2hhbm5lbAotICAgICAqIEBwYXJhbSBjaGFubmVsCisgICAgICogQHBhcmFtIGNoYW5uZWwgbmV3bHkgY3JlYXRlZCBjaGFubmVsCiAgICAgICovCiAgICAgcHJvdGVjdGVkIHZvaWQgYWRkQ2hhbm5lbChDaGFubmVsIGNoYW5uZWwpIHsKICAgICAgICAgYWxsQ2hhbm5lbHMuYWRkKGNoYW5uZWwpOwogICAgIH0KLSAgICAKKwogICAgIC8qKgotICAgICAqIGNsb3NlIGEgY2hhbm5lbAotICAgICAqIEBwYXJhbSBjaGFubmVsCisgICAgICogQHBhcmFtIGNoYW5uZWwgY2hhbm5lbCB0byBjbG9zZQogICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIGNsb3NlQ2hhbm5lbChDaGFubmVsIGNoYW5uZWwpIHsKKyAgICBwdWJsaWMgdm9pZCBjbG9zZUNoYW5uZWwoQ2hhbm5lbCBjaGFubmVsKSB7CiAgICAgICAgIGNoYW5uZWwuY2xvc2UoKS5hd2FpdFVuaW50ZXJydXB0aWJseSgpOwogICAgICAgICBhbGxDaGFubmVscy5yZW1vdmUoY2hhbm5lbCk7CiAgICAgfQpAQCAtMjY1LDE1ICsxNjYsMzMgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNlbmRMb2FkTWV0cmljcyhNYXA8SW50ZWdlciwgRG91YmxlPiB0YXNrVG9Mb2FkKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBNZXNzYWdlQmF0Y2ggbWIgPSBuZXcgTWVzc2FnZUJhdGNoKDEpOworICAgICAgICAgICAgbWIuYWRkKG5ldyBUYXNrTWVzc2FnZSgtMSwgX3Nlci5zZXJpYWxpemUoQXJyYXlzLmFzTGlzdCgoT2JqZWN0KXRhc2tUb0xvYWQpKSkpOworICAgICAgICAgICAgYWxsQ2hhbm5lbHMud3JpdGUobWIpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNYXA8SW50ZWdlciwgTG9hZD4gZ2V0TG9hZChDb2xsZWN0aW9uPEludGVnZXI+IHRhc2tzKSB7CisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJTZXJ2ZXIgY29ubmVjdGlvbiBjYW5ub3QgZ2V0IGxvYWQiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZW5kKGludCB0YXNrLCBieXRlW10gbWVzc2FnZSkgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlNlcnZlciBjb25uZWN0aW9uIHNob3VsZCBub3Qgc2VuZCBhbnkgbWVzc2FnZXMiKTsKICAgICB9Ci0gICAgCisKKyAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBzZW5kKEl0ZXJhdG9yPFRhc2tNZXNzYWdlPiBtc2dzKSB7CiAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlNlcnZlciBjb25uZWN0aW9uIHNob3VsZCBub3Qgc2VuZCBhbnkgbWVzc2FnZXMiKTsKICAgICB9Ci0JCi0gICAgcHVibGljIFN0cmluZyBuYW1lKCkgeworCisgICAgcHVibGljIFN0cmluZyBuZXR0eV9uYW1lKCkgewogICAgICAgcmV0dXJuICJOZXR0eS1zZXJ2ZXItbG9jYWxob3N0LSIgKyBwb3J0OwogICAgIH0KIApAQCAtMzA2LDE0ICsyMjUsOSBAQAogICAgIH0KIAogICAgIHB1YmxpYyBPYmplY3QgZ2V0U3RhdGUoKSB7Ci0gICAgICAgIExPRy5pbmZvKCJHZXR0aW5nIG1ldHJpY3MgZm9yIHNlcnZlciBvbiBwb3J0IHt9IiwgcG9ydCk7Ci0gICAgICAgIEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IHJldCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworICAgICAgICBMT0cuZGVidWcoIkdldHRpbmcgbWV0cmljcyBmb3Igc2VydmVyIG9uIHBvcnQge30iLCBwb3J0KTsKKyAgICAgICAgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gcmV0ID0gbmV3IEhhc2hNYXA8PigpOwogICAgICAgICByZXQucHV0KCJkZXF1ZXVlZE1lc3NhZ2VzIiwgbWVzc2FnZXNEZXF1ZXVlZC5nZXRBbmRTZXQoMCkpOwotICAgICAgICBBcnJheUxpc3Q8SW50ZWdlcj4gcGVuZGluZyA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4ocGVuZGluZ01lc3NhZ2VzLmxlbmd0aCk7Ci0gICAgICAgIGZvciAoQXRvbWljSW50ZWdlciBwOiBwZW5kaW5nTWVzc2FnZXMpIHsKLSAgICAgICAgICAgIHBlbmRpbmcuYWRkKHAuZ2V0KCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldC5wdXQoInBlbmRpbmciLCBwZW5kaW5nKTsKICAgICAgICAgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+IGVucXVldWVkID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOwogICAgICAgICBJdGVyYXRvcjxNYXAuRW50cnk8U3RyaW5nLCBBdG9taWNJbnRlZ2VyPj4gaXQgPSBtZXNzYWdlc0VucXVldWVkLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKICAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewpAQCAtMzMwLDggKzI0NCwzMCBAQAogICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KIAotICAgIEBPdmVycmlkZSBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJOZXR0eSBzZXJ2ZXIgbGlzdGVuaW5nIG9uIHBvcnQgJXMiLCBwb3J0KTsKKyAgICAvKiogSW1wbGVtZW50aW5nIElTZXJ2ZXIuICoqLworICAgIHB1YmxpYyB2b2lkIGNoYW5uZWxDb25uZWN0ZWQoQ2hhbm5lbCBjKSB7CisgICAgICAgIGFkZENoYW5uZWwoYyk7CiAgICAgfQogCisgICAgcHVibGljIHZvaWQgcmVjZWl2ZWQoT2JqZWN0IG1lc3NhZ2UsIFN0cmluZyByZW1vdGUsIENoYW5uZWwgY2hhbm5lbCkgIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIExpc3Q8VGFza01lc3NhZ2U+bXNncyA9IChMaXN0PFRhc2tNZXNzYWdlPiltZXNzYWdlOworICAgICAgICBlbnF1ZXVlKG1zZ3MsIHJlbW90ZSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBuYW1lKCkgeworICAgICAgICByZXR1cm4gKFN0cmluZylzdG9ybV9jb25mLmdldChDb25maWcuVE9QT0xPR1lfTkFNRSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBzZWNyZXRLZXkoKSB7CisgICAgICAgIHJldHVybiBTYXNsVXRpbHMuZ2V0U2VjcmV0S2V5KHN0b3JtX2NvbmYpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGF1dGhlbnRpY2F0ZWQoQ2hhbm5lbCBjKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiTmV0dHkgc2VydmVyIGxpc3RlbmluZyBvbiBwb3J0ICVzIiwgcG9ydCk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21lc3NhZ2luZy9uZXR0eS9TdG9ybUNsaWVudEhhbmRsZXIuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXNzYWdpbmcvbmV0dHkvU3Rvcm1DbGllbnRIYW5kbGVyLmphdmEKaW5kZXggMmQyNTAwMS4uODc3YjZkOCAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21lc3NhZ2luZy9uZXR0eS9TdG9ybUNsaWVudEhhbmRsZXIuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vbWVzc2FnaW5nL25ldHR5L1N0b3JtQ2xpZW50SGFuZGxlci5qYXZhCkBAIC0xNyw3ICsxNywyMCBAQAogICovCiBwYWNrYWdlIGJhY2t0eXBlLnN0b3JtLm1lc3NhZ2luZy5uZXR0eTsKIAoraW1wb3J0IGJhY2t0eXBlLnN0b3JtLm1lc3NhZ2luZy5UYXNrTWVzc2FnZTsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5zZXJpYWxpemF0aW9uLktyeW9WYWx1ZXNEZXNlcmlhbGl6ZXI7CisKIGltcG9ydCBqYXZhLm5ldC5Db25uZWN0RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5qYm9zcy5uZXR0eS5jaGFubmVsLkNoYW5uZWw7CitpbXBvcnQgb3JnLmpib3NzLm5ldHR5LmNoYW5uZWwuQ2hhbm5lbEhhbmRsZXJDb250ZXh0OworaW1wb3J0IG9yZy5qYm9zcy5uZXR0eS5jaGFubmVsLkNoYW5uZWxTdGF0ZUV2ZW50OworaW1wb3J0IG9yZy5qYm9zcy5uZXR0eS5jaGFubmVsLkV4Y2VwdGlvbkV2ZW50OworaW1wb3J0IG9yZy5qYm9zcy5uZXR0eS5jaGFubmVsLk1lc3NhZ2VFdmVudDsKK2ltcG9ydCBvcmcuamJvc3MubmV0dHkuY2hhbm5lbC5TaW1wbGVDaGFubmVsVXBzdHJlYW1IYW5kbGVyOwogCiBpbXBvcnQgb3JnLmpib3NzLm5ldHR5LmNoYW5uZWwuKjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwpAQCAtMjYsOSArMzksNDEgQEAKIHB1YmxpYyBjbGFzcyBTdG9ybUNsaWVudEhhbmRsZXIgZXh0ZW5kcyBTaW1wbGVDaGFubmVsVXBzdHJlYW1IYW5kbGVyICB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFN0b3JtQ2xpZW50SGFuZGxlci5jbGFzcyk7CiAgICAgcHJpdmF0ZSBDbGllbnQgY2xpZW50OwotICAgIAotICAgIFN0b3JtQ2xpZW50SGFuZGxlcihDbGllbnQgY2xpZW50KSB7CisgICAgcHJpdmF0ZSBLcnlvVmFsdWVzRGVzZXJpYWxpemVyIF9kZXM7CisKKyAgICBTdG9ybUNsaWVudEhhbmRsZXIoQ2xpZW50IGNsaWVudCwgTWFwIGNvbmYpIHsKICAgICAgICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7CisgICAgICAgIF9kZXMgPSBuZXcgS3J5b1ZhbHVlc0Rlc2VyaWFsaXplcihjb25mKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBtZXNzYWdlUmVjZWl2ZWQoQ2hhbm5lbEhhbmRsZXJDb250ZXh0IGN0eCwgTWVzc2FnZUV2ZW50IGV2ZW50KSB7CisgICAgICAgIC8vZXhhbWluZSB0aGUgcmVzcG9uc2UgbWVzc2FnZSBmcm9tIHNlcnZlcgorICAgICAgICBPYmplY3QgbWVzc2FnZSA9IGV2ZW50LmdldE1lc3NhZ2UoKTsKKyAgICAgICAgaWYgKG1lc3NhZ2UgaW5zdGFuY2VvZiBDb250cm9sTWVzc2FnZSkgeworICAgICAgICAgICAgQ29udHJvbE1lc3NhZ2UgbXNnID0gKENvbnRyb2xNZXNzYWdlKW1lc3NhZ2U7CisgICAgICAgICAgICBpZiAobXNnPT1Db250cm9sTWVzc2FnZS5GQUlMVVJFX1JFU1BPTlNFKSB7CisgICAgICAgICAgICAgICAgTE9HLmluZm8oImZhaWx1cmUgcmVzcG9uc2U6e30iLCBtc2cpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG1lc3NhZ2UgaW5zdGFuY2VvZiBMaXN0KSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIC8vVGhpcyBzaG91bGQgYmUgdGhlIG1ldHJpY3MsIGFuZCB0aGVyZSBzaG91bGQgb25seSBiZSBvbmUgb2YgdGhlbQorICAgICAgICAgICAgICAgIExpc3Q8VGFza01lc3NhZ2U+IGxpc3QgPSAoTGlzdDxUYXNrTWVzc2FnZT4pbWVzc2FnZTsKKyAgICAgICAgICAgICAgICBpZiAobGlzdC5zaXplKCkgPCAxKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRGlkbid0IHNlZSBlbm91Z2ggbG9hZCBtZXRyaWNzICgiK2NsaWVudC5nZXREc3RBZGRyZXNzKCkrIikgIitsaXN0KTsKKyAgICAgICAgICAgICAgICBpZiAobGlzdC5zaXplKCkgIT0gMSkgTE9HLndhcm4oIk1lc3NhZ2VzIGFyZSBub3QgYmVpbmcgZGVsaXZlcmVkIGZhc3QgZW5vdWdoLCBnb3QgIitsaXN0LnNpemUoKSsiIG1ldHJpY3MgbWVzc2FnZXMgYXQgb25jZSgiK2NsaWVudC5nZXREc3RBZGRyZXNzKCkrIikiKTsKKyAgICAgICAgICAgICAgICBUYXNrTWVzc2FnZSB0bSA9ICgoTGlzdDxUYXNrTWVzc2FnZT4pbWVzc2FnZSkuZ2V0KGxpc3Quc2l6ZSgpIC0gMSk7CisgICAgICAgICAgICAgICAgaWYgKHRtLnRhc2soKSAhPSAtMSkgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk1ldHJpY3MgbWVzc2FnZXMgYXJlIHNlbnQgdG8gdGhlIHN5c3RlbSB0YXNrICgiK2NsaWVudC5nZXREc3RBZGRyZXNzKCkrIikgIit0bSk7CisgICAgICAgICAgICAgICAgTGlzdCBtZXRyaWNzID0gX2Rlcy5kZXNlcmlhbGl6ZSh0bS5tZXNzYWdlKCkpOworICAgICAgICAgICAgICAgIGlmIChtZXRyaWNzLnNpemUoKSA8IDEpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJObyBtZXRyaWNzIGRhdGEgaW4gdGhlIG1ldHJpY3MgbWVzc2FnZSAoIitjbGllbnQuZ2V0RHN0QWRkcmVzcygpKyIpICIrbWV0cmljcyk7CisgICAgICAgICAgICAgICAgaWYgKCEobWV0cmljcy5nZXQoMCkgaW5zdGFuY2VvZiBNYXApKSB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhlIG1ldHJpY3MgZGlkIG5vdCBoYXZlIGEgbWFwIGluIHRoZSBmaXJzdCBzbG90ICgiK2NsaWVudC5nZXREc3RBZGRyZXNzKCkrIikgIittZXRyaWNzKTsKKyAgICAgICAgICAgICAgICBjbGllbnQuc2V0TG9hZE1ldHJpY3MoKE1hcDxJbnRlZ2VyLCBEb3VibGU+KW1ldHJpY3MuZ2V0KDApKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJEb24ndCBrbm93IGhvdyB0byBoYW5kbGUgYSBtZXNzYWdlIG9mIHR5cGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtZXNzYWdlICsgIiAoIiArIGNsaWVudC5nZXREc3RBZGRyZXNzKCkgKyAiKSIpOworICAgICAgICB9CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCkBAIC00MCw3ICs4NSw3IEBACiAgICAgcHVibGljIHZvaWQgZXhjZXB0aW9uQ2F1Z2h0KENoYW5uZWxIYW5kbGVyQ29udGV4dCBjdHgsIEV4Y2VwdGlvbkV2ZW50IGV2ZW50KSB7CiAgICAgICAgIFRocm93YWJsZSBjYXVzZSA9IGV2ZW50LmdldENhdXNlKCk7CiAgICAgICAgIGlmICghKGNhdXNlIGluc3RhbmNlb2YgQ29ubmVjdEV4Y2VwdGlvbikpIHsKLSAgICAgICAgICAgIExPRy5pbmZvKCJDb25uZWN0aW9uIGZhaWxlZCAiICsgY2xpZW50LmRzdEFkZHJlc3NQcmVmaXhlZE5hbWUsIGNhdXNlKTsKKyAgICAgICAgICAgIExPRy5pbmZvKCJDb25uZWN0aW9uIHRvICIrY2xpZW50LmdldERzdEFkZHJlc3MoKSsiIGZhaWxlZDoiLCBjYXVzZSk7CiAgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vbWVzc2FnaW5nL25ldHR5L1N0b3JtQ2xpZW50UGlwZWxpbmVGYWN0b3J5LmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vbWVzc2FnaW5nL25ldHR5L1N0b3JtQ2xpZW50UGlwZWxpbmVGYWN0b3J5LmphdmEKaW5kZXggNGJlMDZjZC4uNjE1OGVlZiAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21lc3NhZ2luZy9uZXR0eS9TdG9ybUNsaWVudFBpcGVsaW5lRmFjdG9yeS5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXNzYWdpbmcvbmV0dHkvU3Rvcm1DbGllbnRQaXBlbGluZUZhY3RvcnkuamF2YQpAQCAtMjIsMTIgKzIyLDE1IEBACiBpbXBvcnQgb3JnLmpib3NzLm5ldHR5LmNoYW5uZWwuQ2hhbm5lbHM7CiAKIGltcG9ydCBiYWNrdHlwZS5zdG9ybS5Db25maWc7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKIAogY2xhc3MgU3Rvcm1DbGllbnRQaXBlbGluZUZhY3RvcnkgaW1wbGVtZW50cyBDaGFubmVsUGlwZWxpbmVGYWN0b3J5IHsKICAgICBwcml2YXRlIENsaWVudCBjbGllbnQ7CisgICAgcHJpdmF0ZSBNYXAgY29uZjsKIAotICAgIFN0b3JtQ2xpZW50UGlwZWxpbmVGYWN0b3J5KENsaWVudCBjbGllbnQpIHsKKyAgICBTdG9ybUNsaWVudFBpcGVsaW5lRmFjdG9yeShDbGllbnQgY2xpZW50LCBNYXAgY29uZikgewogICAgICAgICB0aGlzLmNsaWVudCA9IGNsaWVudDsKKyAgICAgICAgdGhpcy5jb25mID0gY29uZjsKICAgICB9CiAKICAgICBwdWJsaWMgQ2hhbm5lbFBpcGVsaW5lIGdldFBpcGVsaW5lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CkBAIC0zOSwxNSArNDIsMTUgQEAKICAgICAgICAgLy8gRW5jb2RlcgogICAgICAgICBwaXBlbGluZS5hZGRMYXN0KCJlbmNvZGVyIiwgbmV3IE1lc3NhZ2VFbmNvZGVyKCkpOwogCi0gICAgICAgIGJvb2xlYW4gaXNOZXR0eUF1dGggPSAoQm9vbGVhbikgdGhpcy5jbGllbnQuZ2V0U3Rvcm1Db25mKCkuZ2V0KENvbmZpZy5TVE9STV9NRVNTQUdJTkdfTkVUVFlfQVVUSEVOVElDQVRJT04pOworICAgICAgICBib29sZWFuIGlzTmV0dHlBdXRoID0gKEJvb2xlYW4pIGNvbmYKKyAgICAgICAgICAgICAgICAuZ2V0KENvbmZpZy5TVE9STV9NRVNTQUdJTkdfTkVUVFlfQVVUSEVOVElDQVRJT04pOwogICAgICAgICBpZiAoaXNOZXR0eUF1dGgpIHsKICAgICAgICAgICAgIC8vIEF1dGhlbnRpY2F0ZTogUmVtb3ZlZCBhZnRlciBhdXRoZW50aWNhdGlvbiBjb21wbGV0ZXMKICAgICAgICAgICAgIHBpcGVsaW5lLmFkZExhc3QoInNhc2xDbGllbnRIYW5kbGVyIiwgbmV3IFNhc2xTdG9ybUNsaWVudEhhbmRsZXIoCiAgICAgICAgICAgICAgICAgICAgIGNsaWVudCkpOwogICAgICAgICB9CiAgICAgICAgIC8vIGJ1c2luZXNzIGxvZ2ljLgotICAgICAgICBwaXBlbGluZS5hZGRMYXN0KCJoYW5kbGVyIiwgbmV3IFN0b3JtQ2xpZW50SGFuZGxlcihjbGllbnQpKTsKLQorICAgICAgICBwaXBlbGluZS5hZGRMYXN0KCJoYW5kbGVyIiwgbmV3IFN0b3JtQ2xpZW50SGFuZGxlcihjbGllbnQsIGNvbmYpKTsKICAgICAgICAgcmV0dXJuIHBpcGVsaW5lOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXNzYWdpbmcvbmV0dHkvU3Rvcm1TZXJ2ZXJIYW5kbGVyLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vbWVzc2FnaW5nL25ldHR5L1N0b3JtU2VydmVySGFuZGxlci5qYXZhCmluZGV4IDZiNzExNzEuLjgxNDBkZjYgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXNzYWdpbmcvbmV0dHkvU3Rvcm1TZXJ2ZXJIYW5kbGVyLmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21lc3NhZ2luZy9uZXR0eS9TdG9ybVNlcnZlckhhbmRsZXIuamF2YQpAQCAtMTcsNyArMTcsOCBAQAogICovCiBwYWNrYWdlIGJhY2t0eXBlLnN0b3JtLm1lc3NhZ2luZy5uZXR0eTsKIAotaW1wb3J0IGJhY2t0eXBlLnN0b3JtLm1lc3NhZ2luZy5UYXNrTWVzc2FnZTsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS51dGlscy5VdGlsczsKK2ltcG9ydCBvcmcuamJvc3MubmV0dHkuY2hhbm5lbC5DaGFubmVsOwogaW1wb3J0IG9yZy5qYm9zcy5uZXR0eS5jaGFubmVsLkNoYW5uZWxIYW5kbGVyQ29udGV4dDsKIGltcG9ydCBvcmcuamJvc3MubmV0dHkuY2hhbm5lbC5DaGFubmVsU3RhdGVFdmVudDsKIGltcG9ydCBvcmcuamJvc3MubmV0dHkuY2hhbm5lbC5FeGNlcHRpb25FdmVudDsKQEAgLTI1LDMzICsyNiwzOSBAQAogaW1wb3J0IG9yZy5qYm9zcy5uZXR0eS5jaGFubmVsLlNpbXBsZUNoYW5uZWxVcHN0cmVhbUhhbmRsZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKIAotY2xhc3MgU3Rvcm1TZXJ2ZXJIYW5kbGVyIGV4dGVuZHMgU2ltcGxlQ2hhbm5lbFVwc3RyZWFtSGFuZGxlciAgeworcHVibGljIGNsYXNzIFN0b3JtU2VydmVySGFuZGxlciBleHRlbmRzIFNpbXBsZUNoYW5uZWxVcHN0cmVhbUhhbmRsZXIgIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoU3Rvcm1TZXJ2ZXJIYW5kbGVyLmNsYXNzKTsKLSAgICBTZXJ2ZXIgc2VydmVyOworICAgIElTZXJ2ZXIgc2VydmVyOwogICAgIHByaXZhdGUgQXRvbWljSW50ZWdlciBmYWlsdXJlX2NvdW50OyAKKyAgICBwcml2YXRlIENoYW5uZWwgY2hhbm5lbDsKICAgICAKLSAgICBTdG9ybVNlcnZlckhhbmRsZXIoU2VydmVyIHNlcnZlcikgeworICAgIHB1YmxpYyBTdG9ybVNlcnZlckhhbmRsZXIoSVNlcnZlciBzZXJ2ZXIpIHsKICAgICAgICAgdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7CiAgICAgICAgIGZhaWx1cmVfY291bnQgPSBuZXcgQXRvbWljSW50ZWdlcigwKTsKICAgICB9CiAgICAgCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgY2hhbm5lbENvbm5lY3RlZChDaGFubmVsSGFuZGxlckNvbnRleHQgY3R4LCBDaGFubmVsU3RhdGVFdmVudCBlKSB7Ci0gICAgICAgIHNlcnZlci5hZGRDaGFubmVsKGUuZ2V0Q2hhbm5lbCgpKTsKKyAgICAgICAgc2VydmVyLmNoYW5uZWxDb25uZWN0ZWQoZS5nZXRDaGFubmVsKCkpOworICAgICAgICBpZihjaGFubmVsICE9IG51bGwpIHsKKyAgICAgICAgICAgIExPRy5kZWJ1ZygiUmVwbGFjaW5nIGNoYW5uZWwgd2l0aCBuZXcgY2hhbm5lbDoge30gLT4gIiwKKyAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsLCBlLmdldENoYW5uZWwoKSk7CisgICAgICAgIH0KKyAgICAgICAgY2hhbm5lbCA9IGUuZ2V0Q2hhbm5lbCgpOworICAgICAgICBzZXJ2ZXIuY2hhbm5lbENvbm5lY3RlZChjaGFubmVsKTsKICAgICB9CiAgICAgCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgbWVzc2FnZVJlY2VpdmVkKENoYW5uZWxIYW5kbGVyQ29udGV4dCBjdHgsIE1lc3NhZ2VFdmVudCBlKSB7Ci0gICAgICBMaXN0PFRhc2tNZXNzYWdlPiBtc2dzID0gKExpc3Q8VGFza01lc3NhZ2U+KSBlLmdldE1lc3NhZ2UoKTsKKyAgICAgIE9iamVjdCBtc2dzID0gZS5nZXRNZXNzYWdlKCk7CiAgICAgICBpZiAobXNncyA9PSBudWxsKSB7CiAgICAgICAgIHJldHVybjsKICAgICAgIH0KICAgICAgIAogICAgICAgdHJ5IHsKLSAgICAgICAgc2VydmVyLmVucXVldWUobXNncywgZS5nZXRSZW1vdGVBZGRyZXNzKCkudG9TdHJpbmcoKSk7CisgICAgICAgIHNlcnZlci5yZWNlaXZlZChtc2dzLCBlLmdldFJlbW90ZUFkZHJlc3MoKS50b1N0cmluZygpLCBjaGFubmVsKTsKICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUxKSB7CiAgICAgICAgIExPRy5pbmZvKCJmYWlsZWQgdG8gZW5xdWV1ZSBhIHJlcXVlc3QgbWVzc2FnZSIsIGUpOwogICAgICAgICBmYWlsdXJlX2NvdW50LmluY3JlbWVudEFuZEdldCgpOwpAQCAtNjEsNiArNjgsNyBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGV4Y2VwdGlvbkNhdWdodChDaGFubmVsSGFuZGxlckNvbnRleHQgY3R4LCBFeGNlcHRpb25FdmVudCBlKSB7CiAgICAgICAgIExPRy5lcnJvcigic2VydmVyIGVycm9ycyBpbiBoYW5kbGluZyB0aGUgcmVxdWVzdCIsIGUuZ2V0Q2F1c2UoKSk7CisgICAgICAgIFV0aWxzLmhhbmRsZVVuY2F1Z2h0RXhjZXB0aW9uKGUuZ2V0Q2F1c2UoKSk7CiAgICAgICAgIHNlcnZlci5jbG9zZUNoYW5uZWwoZS5nZXRDaGFubmVsKCkpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXRyaWMvRXZlbnRMb2dnZXJCb2x0LmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vbWV0cmljL0V2ZW50TG9nZ2VyQm9sdC5qYXZhCmluZGV4IDE3ZWJiZDEuLjZkNDNlNjUgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXRyaWMvRXZlbnRMb2dnZXJCb2x0LmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21ldHJpYy9FdmVudExvZ2dlckJvbHQuamF2YQpAQCAtMSwyMCArMSwyOSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KIHBhY2thZ2UgYmFja3R5cGUuc3Rvcm0ubWV0cmljOwogCiBpbXBvcnQgYmFja3R5cGUuc3Rvcm0udGFzay5JQm9sdDsKIGltcG9ydCBiYWNrdHlwZS5zdG9ybS50YXNrLk91dHB1dENvbGxlY3RvcjsKIGltcG9ydCBiYWNrdHlwZS5zdG9ybS50YXNrLlRvcG9sb2d5Q29udGV4dDsKLWltcG9ydCBiYWNrdHlwZS5zdG9ybS50dXBsZS5GaWVsZHM7CiBpbXBvcnQgYmFja3R5cGUuc3Rvcm0udHVwbGUuVHVwbGU7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7Ci1pbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKLWltcG9ydCBqYXZhLm5pby5maWxlLlBhdGg7Ci1pbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoczsKLWltcG9ydCBqYXZhLm5pby5maWxlLlN0YW5kYXJkT3Blbk9wdGlvbjsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IHN0YXRpYyBiYWNrdHlwZS5zdG9ybS5tZXRyaWMuSUV2ZW50TG9nZ2VyLkV2ZW50SW5mbzsKIApkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21ldHJpYy9GaWxlQmFzZWRFdmVudExvZ2dlci5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21ldHJpYy9GaWxlQmFzZWRFdmVudExvZ2dlci5qYXZhCmluZGV4IDM4MzRjNTUuLjMwMDM0MjcgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXRyaWMvRmlsZUJhc2VkRXZlbnRMb2dnZXIuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vbWV0cmljL0ZpbGVCYXNlZEV2ZW50TG9nZ2VyLmphdmEKQEAgLTEsMyArMSwyMCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KIHBhY2thZ2UgYmFja3R5cGUuc3Rvcm0ubWV0cmljOwogCiBpbXBvcnQgYmFja3R5cGUuc3Rvcm0udGFzay5Ub3BvbG9neUNvbnRleHQ7CkBAIC01LDYgKzIyLDcgQEAKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAogaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOwogaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CkBAIC0xNyw3ICszNSw3IEBACiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CiAKIHB1YmxpYyBjbGFzcyBGaWxlQmFzZWRFdmVudExvZ2dlciBpbXBsZW1lbnRzIElFdmVudExvZ2dlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEZpbGVCYXNlZEV2ZW50TG9nZ2VyLmNsYXNzKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoRmlsZUJhc2VkRXZlbnRMb2dnZXIuY2xhc3MpOwogCiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZMVVNIX0lOVEVSVkFMX01JTExJUyA9IDEwMDA7CiAKQEAgLTYxLDExICs3OSwxMSBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgcHJlcGFyZShNYXAgc3Rvcm1Db25mLCBUb3BvbG9neUNvbnRleHQgY29udGV4dCkgewotICAgICAgICBTdHJpbmcgbG9nRGlyOworICAgICAgICBTdHJpbmcgbG9nRGlyOyAvLyBzdG9ybSBsb2NhbCBkaXJlY3RvcnkKICAgICAgICAgU3RyaW5nIHN0b3JtSWQgPSBjb250ZXh0LmdldFN0b3JtSWQoKTsKICAgICAgICAgaW50IHBvcnQgPSBjb250ZXh0LmdldFRoaXNXb3JrZXJQb3J0KCk7Ci0gICAgICAgIGlmKChsb2dEaXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInN0b3JtLmxvZy5kaXIiKSkgPT0gbnVsbAotICAgICAgICAgICAgICAgICYmIChsb2dEaXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImphdmEuaW8udG1wZGlyIikpID09IG51bGwpIHsKKyAgICAgICAgaWYgKChsb2dEaXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInN0b3JtLmxvY2FsLmRpciIpKSA9PSBudWxsICYmCisgICAgICAgICAgICAgICAgKGxvZ0RpciA9IChTdHJpbmcpc3Rvcm1Db25mLmdldCgic3Rvcm0ubG9jYWwuZGlyIikpID09IG51bGwpIHsKICAgICAgICAgICAgIFN0cmluZyBtc2cgPSAiQ291bGQgbm90IGRldGVybWluZSB0aGUgZGlyZWN0b3J5IHRvIGxvZyBldmVudHMuIjsKICAgICAgICAgICAgIExPRy5lcnJvcihtc2cpOwogICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obXNnKTsKQEAgLTc3LDcgKzk1LDE2IEBACiAgICAgICAgICAqIEluY2x1ZGUgdGhlIHRvcG9sb2d5IG5hbWUgJiB3b3JrZXIgcG9ydCBpbiB0aGUgZmlsZSBuYW1lIHNvIHRoYXQKICAgICAgICAgICogbXVsdGlwbGUgZXZlbnQgbG9nZ2VycyBjYW4gbG9nIGluZGVwZW5kZW50bHkuCiAgICAgICAgICAqLwotICAgICAgICBpbml0TG9nV3JpdGVyKFBhdGhzLmdldChsb2dEaXIsIFN0cmluZy5mb3JtYXQoIiVzLWV2ZW50cy0lZC5sb2ciLCBzdG9ybUlkLCBwb3J0KSkpOworICAgICAgICBQYXRoIHBhdGggPSBQYXRocy5nZXQobG9nRGlyLCAid29ya2Vycy1hcnRpZmFjdHMiLCBzdG9ybUlkLCBJbnRlZ2VyLnRvU3RyaW5nKHBvcnQpLCAiZXZlbnRzLmxvZyIpOworICAgICAgICBpZiAoIXBhdGguaXNBYnNvbHV0ZSgpKSB7CisgICAgICAgICAgICBwYXRoID0gUGF0aHMuZ2V0KFN5c3RlbS5nZXRQcm9wZXJ0eSgic3Rvcm0uaG9tZSIpLCBsb2dEaXIsICJ3b3JrZXJzLWFydGlmYWN0cyIsCisgICAgICAgICAgICAgICAgICAgIHN0b3JtSWQsIEludGVnZXIudG9TdHJpbmcocG9ydCksICJldmVudHMubG9nIik7CisgICAgICAgIH0KKyAgICAgICAgRmlsZSBkaXIgPSBwYXRoLnRvRmlsZSgpLmdldFBhcmVudEZpbGUoKTsKKyAgICAgICAgaWYgKCFkaXIuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICBkaXIubWtkaXJzKCk7CisgICAgICAgIH0KKyAgICAgICAgaW5pdExvZ1dyaXRlcihwYXRoKTsKICAgICAgICAgc2V0VXBGbHVzaFRhc2soKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXRyaWMvSHR0cEZvcndhcmRpbmdNZXRyaWNzQ29uc3VtZXIuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXRyaWMvSHR0cEZvcndhcmRpbmdNZXRyaWNzQ29uc3VtZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjQyNDJhCi0tLSAvZGV2L251bGwKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21ldHJpYy9IdHRwRm9yd2FyZGluZ01ldHJpY3NDb25zdW1lci5qYXZhCkBAIC0wLDAgKzEsODAgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGJhY2t0eXBlLnN0b3JtLm1ldHJpYzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS5uZXQuSHR0cFVSTENvbm5lY3Rpb247CisKK2ltcG9ydCBjb20uZXNvdGVyaWNzb2Z0d2FyZS5rcnlvLmlvLk91dHB1dDsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5zZXJpYWxpemF0aW9uLktyeW9WYWx1ZXNTZXJpYWxpemVyOworCitpbXBvcnQgYmFja3R5cGUuc3Rvcm0ubWV0cmljLmFwaS5JTWV0cmljc0NvbnN1bWVyOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnRhc2suSUVycm9yUmVwb3J0ZXI7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0udGFzay5Ub3BvbG9neUNvbnRleHQ7CisKKy8qKgorICogTGlzdGVucyBmb3IgYWxsIG1ldHJpY3MgYW5kIFBPU1RzIHRoZW0gc2VyaWFsaXplZCB0byBhIGNvbmZpZ3VyZWQgVVJMCisgKgorICogVG8gdXNlLCBhZGQgdGhpcyB0byB5b3VyIHRvcG9sb2d5J3MgY29uZmlndXJhdGlvbjoKKyAqICAgY29uZi5yZWdpc3Rlck1ldHJpY3NDb25zdW1lcihiYWNrdHlwZS5zdG9ybS5tZXRyaWNzLkh0dHBGb3J3YXJkaW5nTWV0cmljc0NvbnN1bWVyLmNsYXNzLCAiaHR0cDovL2V4YW1wbGUuY29tOjgwODAvbWV0cmljcy9teS10b3BvbG9neS8iLCAxKTsKKyAqCisgKiBUaGUgYm9keSBvZiB0aGUgcG9zdCBpcyBkYXRhIHNlcmlhbGl6ZWQgdXNpbmcgYmFja3R5cGUuc3Rvcm0uc2VyaWFsaXphdGlvbi5LcnlvVmFsdWVzU2VyaWFsaXplciwgd2l0aCB0aGUgZGF0YSBwYXNzZWQgaW4KKyAqIGFzIGEgbGlzdCBvZiBbVGFza0luZm8sIENvbGxlY3Rpb248RGF0YVBvaW50Pl0uICBNb3JlIHRoaW5ncyBtYXkgYmUgYXBwZW5kZWQgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdCBpbiB0aGUgZnV0dXJlLgorICoKKyAqIFRoZSB2YWx1ZXMgY2FuIGJlIGRlc2VyaWFsaXplZCB1c2luZyB0aGUgYmFja3R5cGUuc3Rvcm0uc2VyaWFsaXphdGlvbi5LcnlvVmFsdWVzRGVzZXJpYWxpemVyLCBhbmQgYSAKKyAqIGNvcnJlY3QgY29uZmlnICsgY2xhc3NwYXRoLiAKKyAqLworcHVibGljIGNsYXNzIEh0dHBGb3J3YXJkaW5nTWV0cmljc0NvbnN1bWVyIGltcGxlbWVudHMgSU1ldHJpY3NDb25zdW1lciB7CisgICAgcHJpdmF0ZSB0cmFuc2llbnQgVVJMIF91cmw7IAorICAgIHByaXZhdGUgdHJhbnNpZW50IElFcnJvclJlcG9ydGVyIF9lcnJvclJlcG9ydGVyOworICAgIHByaXZhdGUgdHJhbnNpZW50IEtyeW9WYWx1ZXNTZXJpYWxpemVyIF9zZXJpYWxpemVyOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcHJlcGFyZShNYXAgc3Rvcm1Db25mLCBPYmplY3QgcmVnaXN0cmF0aW9uQXJndW1lbnQsIFRvcG9sb2d5Q29udGV4dCBjb250ZXh0LCBJRXJyb3JSZXBvcnRlciBlcnJvclJlcG9ydGVyKSB7IAorICAgICAgICB0cnkgeworICAgICAgICAgICAgX3VybCA9IG5ldyBVUkwoKFN0cmluZylyZWdpc3RyYXRpb25Bcmd1bWVudCk7CisgICAgICAgICAgICBfZXJyb3JSZXBvcnRlciA9IGVycm9yUmVwb3J0ZXI7CisgICAgICAgICAgICBfc2VyaWFsaXplciA9IG5ldyBLcnlvVmFsdWVzU2VyaWFsaXplcihzdG9ybUNvbmYpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBoYW5kbGVEYXRhUG9pbnRzKFRhc2tJbmZvIHRhc2tJbmZvLCBDb2xsZWN0aW9uPERhdGFQb2ludD4gZGF0YVBvaW50cykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgSHR0cFVSTENvbm5lY3Rpb24gY29uID0gKEh0dHBVUkxDb25uZWN0aW9uKV91cmwub3BlbkNvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgIGNvbi5zZXRSZXF1ZXN0TWV0aG9kKCJQT1NUIik7CisgICAgICAgICAgICBjb24uc2V0RG9PdXRwdXQodHJ1ZSk7CisgICAgICAgICAgICBPdXRwdXQgb3V0ID0gbmV3IE91dHB1dChjb24uZ2V0T3V0cHV0U3RyZWFtKCkpOworICAgICAgICAgICAgX3NlcmlhbGl6ZXIuc2VyaWFsaXplSW50byhBcnJheXMuYXNMaXN0KHRhc2tJbmZvLCBkYXRhUG9pbnRzKSwgb3V0KTsKKyAgICAgICAgICAgIG91dC5mbHVzaCgpOworICAgICAgICAgICAgb3V0LmNsb3NlKCk7CisgICAgICAgICAgICAvL1RoZSBjb25uZWN0aW9uIGlzIG5vdCBzZW50IHVubGVzcyBhIHJlc3BvbnNlIGlzIHJlcXVlc3RlZAorICAgICAgICAgICAgaW50IHJlc3BvbnNlID0gY29uLmdldFJlc3BvbnNlQ29kZSgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbGVhbnVwKCkgeyB9Cit9CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vbWV0cmljL0h0dHBGb3J3YXJkaW5nTWV0cmljc1NlcnZlci5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21ldHJpYy9IdHRwRm9yd2FyZGluZ01ldHJpY3NTZXJ2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YThmNjc2Ci0tLSAvZGV2L251bGwKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21ldHJpYy9IdHRwRm9yd2FyZGluZ01ldHJpY3NTZXJ2ZXIuamF2YQpAQCAtMCwwICsxLDExOCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYmFja3R5cGUuc3Rvcm0ubWV0cmljOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEubmV0LlNlcnZlclNvY2tldDsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKKworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLm1ldHJpYy5hcGkuSU1ldHJpY3NDb25zdW1lci5UYXNrSW5mbzsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5tZXRyaWMuYXBpLklNZXRyaWNzQ29uc3VtZXIuRGF0YVBvaW50OworCitpbXBvcnQgY29tLmVzb3Rlcmljc29mdHdhcmUua3J5by5pby5JbnB1dDsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5zZXJpYWxpemF0aW9uLktyeW9WYWx1ZXNEZXNlcmlhbGl6ZXI7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0udXRpbHMuVXRpbHM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZXR0eS5zZXJ2ZXIuU2VydmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpldHR5LnNlcnZsZXQuU2VydmxldENvbnRleHRIYW5kbGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpldHR5LnNlcnZsZXQuU2VydmxldEhvbGRlcjsKKworLyoqCisgKiBBIHNlcnZlciB0aGF0IGNhbiBsaXN0ZW4gZm9yIG1ldHJpY3MgZnJvbSB0aGUgSHR0cEZvcndhcmRpbmdNZXRyaWNzQ29uc3VtZXIuCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBIdHRwRm9yd2FyZGluZ01ldHJpY3NTZXJ2ZXIgeworICAgIHByaXZhdGUgTWFwIF9jb25mOworICAgIHByaXZhdGUgU2VydmVyIF9zZXJ2ZXIgPSBudWxsOworICAgIHByaXZhdGUgaW50IF9wb3J0ID0gLTE7CisgICAgcHJpdmF0ZSBTdHJpbmcgX3VybCA9IG51bGw7CisKKyAgICBUaHJlYWRMb2NhbDxLcnlvVmFsdWVzRGVzZXJpYWxpemVyPiBfZGVzID0gbmV3IFRocmVhZExvY2FsPEtyeW9WYWx1ZXNEZXNlcmlhbGl6ZXI+KCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIEtyeW9WYWx1ZXNEZXNlcmlhbGl6ZXIgaW5pdGlhbFZhbHVlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBLcnlvVmFsdWVzRGVzZXJpYWxpemVyKF9jb25mKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIGNsYXNzIE1ldHJpY3NDb2xsZWN0aW9uU2VydmxldCBleHRlbmRzIEh0dHBTZXJ2bGV0CisgICAgeworICAgICAgICBwcm90ZWN0ZWQgdm9pZCBkb1Bvc3QoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgorICAgICAgICB7CisgICAgICAgICAgICBJbnB1dCBpbiA9IG5ldyBJbnB1dChyZXF1ZXN0LmdldElucHV0U3RyZWFtKCkpOworICAgICAgICAgICAgTGlzdDxPYmplY3Q+IG1ldHJpY3MgPSBfZGVzLmdldCgpLmRlc2VyaWFsaXplRnJvbShpbik7CisgICAgICAgICAgICBoYW5kbGUoKFRhc2tJbmZvKW1ldHJpY3MuZ2V0KDApLCAoQ29sbGVjdGlvbjxEYXRhUG9pbnQ+KW1ldHJpY3MuZ2V0KDEpKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhIdHRwU2VydmxldFJlc3BvbnNlLlNDX09LKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBIdHRwRm9yd2FyZGluZ01ldHJpY3NTZXJ2ZXIoTWFwIGNvbmYpIHsKKyAgICAgICAgX2NvbmYgPSBVdGlscy5yZWFkU3Rvcm1Db25maWcoKTsKKyAgICAgICAgaWYgKGNvbmYgIT0gbnVsbCkgeworICAgICAgICAgICAgX2NvbmYucHV0QWxsKGNvbmYpOworICAgICAgICB9CisgICAgfQorCisgICAgLy9UaGlzIG5lZWRzIHRvIGJlIHRocmVhZCBzYWZlCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgaGFuZGxlKFRhc2tJbmZvIHRhc2tJbmZvLCBDb2xsZWN0aW9uPERhdGFQb2ludD4gZGF0YVBvaW50cyk7CisKKyAgICBwdWJsaWMgdm9pZCBzZXJ2ZShJbnRlZ2VyIHBvcnQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChfc2VydmVyICE9IG51bGwpIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGUgc2VydmVyIGlzIGFscmVhZHkgcnVubmluZyIpOworICAgIAorICAgICAgICAgICAgaWYgKHBvcnQgPT0gbnVsbCB8fCBwb3J0IDw9IDApIHsKKyAgICAgICAgICAgICAgICBTZXJ2ZXJTb2NrZXQgcyA9IG5ldyBTZXJ2ZXJTb2NrZXQoMCk7CisgICAgICAgICAgICAgICAgcG9ydCA9IHMuZ2V0TG9jYWxQb3J0KCk7CisgICAgICAgICAgICAgICAgcy5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX3NlcnZlciA9IG5ldyBTZXJ2ZXIocG9ydCk7CisgICAgICAgICAgICBfcG9ydCA9IHBvcnQ7CisgICAgICAgICAgICBfdXJsID0gImh0dHA6Ly8iK0luZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLmdldEhvc3ROYW1lKCkrIjoiK19wb3J0KyIvIjsKKyAKKyAgICAgICAgICAgIFNlcnZsZXRDb250ZXh0SGFuZGxlciBjb250ZXh0ID0gbmV3IFNlcnZsZXRDb250ZXh0SGFuZGxlcihTZXJ2bGV0Q29udGV4dEhhbmRsZXIuU0VTU0lPTlMpOworICAgICAgICAgICAgY29udGV4dC5zZXRDb250ZXh0UGF0aCgiLyIpOworICAgICAgICAgICAgX3NlcnZlci5zZXRIYW5kbGVyKGNvbnRleHQpOworIAorICAgICAgICAgICAgY29udGV4dC5hZGRTZXJ2bGV0KG5ldyBTZXJ2bGV0SG9sZGVyKG5ldyBNZXRyaWNzQ29sbGVjdGlvblNlcnZsZXQoKSksIi8qIik7CisKKyAgICAgICAgICAgIF9zZXJ2ZXIuc3RhcnQoKTsKKyAgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNlcnZlKCkgeworICAgICAgICBzZXJ2ZShudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFBvcnQoKSB7CisgICAgICAgIHJldHVybiBfcG9ydDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFVybCgpIHsKKyAgICAgICAgcmV0dXJuIF91cmw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21ldHJpYy9JRXZlbnRMb2dnZXIuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXRyaWMvSUV2ZW50TG9nZ2VyLmphdmEKaW5kZXggOWQwZTdlOS4uNWZkNWEzMiAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21ldHJpYy9JRXZlbnRMb2dnZXIuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vbWV0cmljL0lFdmVudExvZ2dlci5qYXZhCkBAIC0xLDggKzEsMjMgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCiBwYWNrYWdlIGJhY2t0eXBlLnN0b3JtLm1ldHJpYzsKIAotaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnRhc2suT3V0cHV0Q29sbGVjdG9yOwogaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnRhc2suVG9wb2xvZ3lDb250ZXh0OwotaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnR1cGxlLlR1cGxlOwogCiBpbXBvcnQgamF2YS51dGlsLkRhdGU7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKQEAgLTM3LDExICs1Miw3IEBACiAgICAgICAgICAqLwogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nQnVpbGRlcihuZXcgRGF0ZShMb25nLnBhcnNlTG9uZyh0cykpLnRvU3RyaW5nKCkpLmFwcGVuZCgiLCIpCi0gICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoY29tcG9uZW50KS5hcHBlbmQoIiwiKQotICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKHRhc2spLmFwcGVuZCgiLCIpCi0gICAgICAgICAgICAgICAgICAgIC5hcHBlbmQobWVzc2FnZUlkKS5hcHBlbmQoIiwiKQotICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKHZhbHVlcykudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShMb25nLnBhcnNlTG9uZyh0cykpLnRvU3RyaW5nKCkgKyAiLCIgKyBjb21wb25lbnQgKyAiLCIgKyB0YXNrICsgIiwiICsgbWVzc2FnZUlkICsgIiwiICsgdmFsdWVzOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vbWV0cmljL0xvZ2dpbmdNZXRyaWNzQ29uc3VtZXIuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXRyaWMvTG9nZ2luZ01ldHJpY3NDb25zdW1lci5qYXZhCmluZGV4IGMxYzdjMGEuLjk4ZmI1MjcgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXRyaWMvTG9nZ2luZ01ldHJpY3NDb25zdW1lci5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXRyaWMvTG9nZ2luZ01ldHJpY3NDb25zdW1lci5qYXZhCkBAIC0yNiw3ICsyNiw2IEBACiBpbXBvcnQgYmFja3R5cGUuc3Rvcm0ubWV0cmljLmFwaS5JTWV0cmljc0NvbnN1bWVyOwogaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnRhc2suSUVycm9yUmVwb3J0ZXI7CiBpbXBvcnQgYmFja3R5cGUuc3Rvcm0udGFzay5Ub3BvbG9neUNvbnRleHQ7Ci1pbXBvcnQgYmFja3R5cGUuc3Rvcm0udXRpbHMuVXRpbHM7CiAKIC8qCiAgKiBMaXN0ZW5zIGZvciBhbGwgbWV0cmljcywgZHVtcHMgdGhlbSB0byBsb2cKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXRyaWMvTWV0cmljc0NvbnN1bWVyQm9sdC5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21ldHJpYy9NZXRyaWNzQ29uc3VtZXJCb2x0LmphdmEKaW5kZXggNWE0MGMyNy4uZTNlYzA2OSAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21ldHJpYy9NZXRyaWNzQ29uc3VtZXJCb2x0LmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21ldHJpYy9NZXRyaWNzQ29uc3VtZXJCb2x0LmphdmEKQEAgLTIwLDcgKzIwLDYgQEAKIGltcG9ydCBiYWNrdHlwZS5zdG9ybS5Db25maWc7CiBpbXBvcnQgYmFja3R5cGUuc3Rvcm0ubWV0cmljLmFwaS5JTWV0cmljc0NvbnN1bWVyOwogaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnRhc2suSUJvbHQ7Ci1pbXBvcnQgYmFja3R5cGUuc3Rvcm0udGFzay5JRXJyb3JSZXBvcnRlcjsKIGltcG9ydCBiYWNrdHlwZS5zdG9ybS50YXNrLk91dHB1dENvbGxlY3RvcjsKIGltcG9ydCBiYWNrdHlwZS5zdG9ybS50YXNrLlRvcG9sb2d5Q29udGV4dDsKIGltcG9ydCBiYWNrdHlwZS5zdG9ybS50dXBsZS5UdXBsZTsKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXRyaWMvU3lzdGVtQm9sdC5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21ldHJpYy9TeXN0ZW1Cb2x0LmphdmEKaW5kZXggZDBiYmU0NC4uNWNiYTdkMyAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21ldHJpYy9TeXN0ZW1Cb2x0LmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21ldHJpYy9TeXN0ZW1Cb2x0LmphdmEKQEAgLTE4LDcgKzE4LDYgQEAKIHBhY2thZ2UgYmFja3R5cGUuc3Rvcm0ubWV0cmljOwogCiBpbXBvcnQgYmFja3R5cGUuc3Rvcm0uQ29uZmlnOwotaW1wb3J0IGJhY2t0eXBlLnN0b3JtLm1ldHJpYy5hcGkuQXNzaWduYWJsZU1ldHJpYzsKIGltcG9ydCBiYWNrdHlwZS5zdG9ybS5tZXRyaWMuYXBpLklNZXRyaWM7CiBpbXBvcnQgYmFja3R5cGUuc3Rvcm0udGFzay5JQm9sdDsKIGltcG9ydCBiYWNrdHlwZS5zdG9ybS50YXNrLk91dHB1dENvbGxlY3RvcjsKQEAgLTI4LDEyICsyNyw5IEBACiBpbXBvcnQgY2xvanVyZS5sYW5nLkFGbjsKIGltcG9ydCBjbG9qdXJlLmxhbmcuSUZuOwogaW1wb3J0IGNsb2p1cmUubGFuZy5SVDsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCiBpbXBvcnQgamF2YS5sYW5nLm1hbmFnZW1lbnQuKjsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiAKQEAgLTQxLDcgKzM3LDYgQEAKIC8vIFRhc2tJRCBpcyBhbHdheXMgLTEsIHRoZXJlZm9yZSB5b3UgY2FuIG9ubHkgc2VuZC11bmFuY2hvcmVkIHR1cGxlcyB0byBjby1sb2NhdGVkIFN5c3RlbUJvbHQuCiAvLyBUaGlzIGJvbHQgd2FzIGNvbmNlaXZlZCB0byBleHBvcnQgd29ya2VyIHN0YXRzIHZpYSBtZXRyaWNzIGFwaS4KIHB1YmxpYyBjbGFzcyBTeXN0ZW1Cb2x0IGltcGxlbWVudHMgSUJvbHQgewotICAgIHByaXZhdGUgc3RhdGljIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihTeXN0ZW1Cb2x0LmNsYXNzKTsKICAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIF9wcmVwYXJlV2FzQ2FsbGVkID0gZmFsc2U7CiAKICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBNZW1vcnlVc2FnZU1ldHJpYyBpbXBsZW1lbnRzIElNZXRyaWMgewpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21ldHJpYy9hcGkvQ291bnRNZXRyaWMuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXRyaWMvYXBpL0NvdW50TWV0cmljLmphdmEKaW5kZXggZGQwNDhiOC4uNmIzMTdkYSAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21ldHJpYy9hcGkvQ291bnRNZXRyaWMuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vbWV0cmljL2FwaS9Db3VudE1ldHJpYy5qYXZhCkBAIC0xNyw4ICsxNyw2IEBACiAgKi8KIHBhY2thZ2UgYmFja3R5cGUuc3Rvcm0ubWV0cmljLmFwaTsKIAotaW1wb3J0IGJhY2t0eXBlLnN0b3JtLm1ldHJpYy5hcGkuSU1ldHJpYzsKLQogcHVibGljIGNsYXNzIENvdW50TWV0cmljIGltcGxlbWVudHMgSU1ldHJpYyB7CiAgICAgbG9uZyBfdmFsdWUgPSAwOwogCmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vbWV0cmljL2FwaS9NZWFuUmVkdWNlci5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21ldHJpYy9hcGkvTWVhblJlZHVjZXIuamF2YQppbmRleCBlMjVlMjZkLi5mZGU3MDUzIDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vbWV0cmljL2FwaS9NZWFuUmVkdWNlci5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXRyaWMvYXBpL01lYW5SZWR1Y2VyLmphdmEKQEAgLTE3LDggKzE3LDYgQEAKICAqLwogcGFja2FnZSBiYWNrdHlwZS5zdG9ybS5tZXRyaWMuYXBpOwogCi1pbXBvcnQgYmFja3R5cGUuc3Rvcm0ubWV0cmljLmFwaS5JUmVkdWNlcjsKLQogY2xhc3MgTWVhblJlZHVjZXJTdGF0ZSB7CiAgICAgcHVibGljIGludCBjb3VudCA9IDA7CiAgICAgcHVibGljIGRvdWJsZSBzdW0gPSAwLjA7CkBAIC00Nyw3ICs0NSw3IEBACiAKICAgICBwdWJsaWMgT2JqZWN0IGV4dHJhY3RSZXN1bHQoTWVhblJlZHVjZXJTdGF0ZSBhY2MpIHsKICAgICAgICAgaWYoYWNjLmNvdW50ID4gMCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBEb3VibGUoYWNjLnN1bSAvIChkb3VibGUpYWNjLmNvdW50KTsKKyAgICAgICAgICAgIHJldHVybiBhY2Muc3VtIC8gKGRvdWJsZSkgYWNjLmNvdW50OwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXRyaWMvYXBpL011bHRpQ291bnRNZXRyaWMuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXRyaWMvYXBpL011bHRpQ291bnRNZXRyaWMuamF2YQppbmRleCBjNDIwYTE2Li5hNjA3N2U2IDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vbWV0cmljL2FwaS9NdWx0aUNvdW50TWV0cmljLmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21ldHJpYy9hcGkvTXVsdGlDb3VudE1ldHJpYy5qYXZhCkBAIC0yMiw3ICsyMiw3IEBACiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIAogcHVibGljIGNsYXNzIE11bHRpQ291bnRNZXRyaWMgaW1wbGVtZW50cyBJTWV0cmljIHsKLSAgICBNYXA8U3RyaW5nLCBDb3VudE1ldHJpYz4gX3ZhbHVlID0gbmV3IEhhc2hNYXAoKTsKKyAgICBNYXA8U3RyaW5nLCBDb3VudE1ldHJpYz4gX3ZhbHVlID0gbmV3IEhhc2hNYXA8PigpOwogCiAgICAgcHVibGljIE11bHRpQ291bnRNZXRyaWMoKSB7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21ldHJpYy9hcGkvTXVsdGlSZWR1Y2VkTWV0cmljLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vbWV0cmljL2FwaS9NdWx0aVJlZHVjZWRNZXRyaWMuamF2YQppbmRleCA1MzBiMTY4Li5kOWQzYTAyIDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vbWV0cmljL2FwaS9NdWx0aVJlZHVjZWRNZXRyaWMuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vbWV0cmljL2FwaS9NdWx0aVJlZHVjZWRNZXRyaWMuamF2YQpAQCAtMjIsNyArMjIsNyBAQAogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIHB1YmxpYyBjbGFzcyBNdWx0aVJlZHVjZWRNZXRyaWMgaW1wbGVtZW50cyBJTWV0cmljIHsKLSAgICBNYXA8U3RyaW5nLCBSZWR1Y2VkTWV0cmljPiBfdmFsdWUgPSBuZXcgSGFzaE1hcCgpOworICAgIE1hcDxTdHJpbmcsIFJlZHVjZWRNZXRyaWM+IF92YWx1ZSA9IG5ldyBIYXNoTWFwPD4oKTsKICAgICBJUmVkdWNlciBfcmVkdWNlcjsKIAogICAgIHB1YmxpYyBNdWx0aVJlZHVjZWRNZXRyaWMoSVJlZHVjZXIgcmVkdWNlcikgewpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21ldHJpYy9hcGkvcnBjL0NvdW50U2hlbGxNZXRyaWMuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXRyaWMvYXBpL3JwYy9Db3VudFNoZWxsTWV0cmljLmphdmEKaW5kZXggZGVmNzRjMi4uZWFlOTgyYiAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21ldHJpYy9hcGkvcnBjL0NvdW50U2hlbGxNZXRyaWMuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vbWV0cmljL2FwaS9ycGMvQ291bnRTaGVsbE1ldHJpYy5qYXZhCkBAIC0yMSw4ICsyMSw3IEBACiAKIHB1YmxpYyBjbGFzcyBDb3VudFNoZWxsTWV0cmljIGV4dGVuZHMgQ291bnRNZXRyaWMgaW1wbGVtZW50cyBJU2hlbGxNZXRyaWMgewogICAgIC8qKioKLSAgICAgKiBAcGFyYW0KLSAgICAgKiAgcGFyYW1zIHNob3VsZCBiZSBudWxsIG9yIGxvbmcKKyAgICAgKiBAcGFyYW0gdmFsdWUgc2hvdWxkIGJlIG51bGwgb3IgbG9uZwogICAgICAqICBpZiB2YWx1ZSBpcyBudWxsLCBpdCB3aWxsIGNhbGwgaW5jcigpCiAgICAgICogIGlmIHZhbHVlIGlzIGxvbmcsIGl0IHdpbGwgY2FsbCBpbmNyQnkoKGxvbmcpcGFyYW1zKQogICAgICAqICovCmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vbWV0cmljL2ludGVybmFsL0NvdW50U3RhdEFuZE1ldHJpYy5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21ldHJpYy9pbnRlcm5hbC9Db3VudFN0YXRBbmRNZXRyaWMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTRhOWUyCi0tLSAvZGV2L251bGwKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21ldHJpYy9pbnRlcm5hbC9Db3VudFN0YXRBbmRNZXRyaWMuamF2YQpAQCAtMCwwICsxLDIxMSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiA8cC8+CisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIDxwLz4KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGJhY2t0eXBlLnN0b3JtLm1ldHJpYy5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLlRpbWVyOworaW1wb3J0IGphdmEudXRpbC5UaW1lclRhc2s7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0xvbmc7CisKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5tZXRyaWMuYXBpLklNZXRyaWM7CisKKy8qKgorICogQWN0cyBhcyBhIENvdW50IE1ldHJpYywgYnV0IGFsc28ga2VlcHMgdHJhY2sgb2YgYXBwcm94aW1hdGUgY291bnRzCisgKiBmb3IgdGhlIGxhc3QgMTAgbWlucywgMyBob3VycywgMSBkYXksIGFuZCBhbGwgdGltZS4KKyAqLworcHVibGljIGNsYXNzIENvdW50U3RhdEFuZE1ldHJpYyBpbXBsZW1lbnRzIElNZXRyaWN7CisgICAgcHJpdmF0ZSBmaW5hbCBBdG9taWNMb25nIF9jdXJyZW50QnVja2V0OworICAgIC8vIEFsbCBpbnRlcm5hbCBzdGF0ZSBleGNlcHQgZm9yIHRoZSBjb3VudCBvZiB0aGUgY3VycmVudCBidWNrZXQgYXJlCisgICAgLy8gcHJvdGVjdGVkIHVzaW5nIGEgbG9jayBvbiB0aGlzIGNvdW50ZXIKKyAgICBwcml2YXRlIGxvbmcgX2J1Y2tldFN0YXJ0OworCisgICAgLy9leGFjdCB2YXJpYWJsZSB0aW1lLCB0aGF0IGlzIGFkZGVkIHRvIHRoZSBjdXJyZW50IGJ1Y2tldAorICAgIHByaXZhdGUgbG9uZyBfZXhhY3RFeHRyYTsKKyAKKyAgICAvLzEwIG1pbiB2YWx1ZXMKKyAgICBwcml2YXRlIGZpbmFsIGludCBfdG1TaXplOworICAgIHByaXZhdGUgZmluYWwgbG9uZ1tdIF90bUJ1Y2tldHM7CisgICAgcHJpdmF0ZSBmaW5hbCBsb25nW10gX3RtVGltZTsKKyAgICAKKyAgICAvLzMgaG91ciB2YWx1ZXMKKyAgICBwcml2YXRlIGZpbmFsIGludCBfdGhTaXplOworICAgIHByaXZhdGUgZmluYWwgbG9uZ1tdIF90aEJ1Y2tldHM7CisgICAgcHJpdmF0ZSBmaW5hbCBsb25nW10gX3RoVGltZTsKKworICAgIC8vMSBkYXkgdmFsdWVzCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgX29kU2l6ZTsKKyAgICBwcml2YXRlIGZpbmFsIGxvbmdbXSBfb2RCdWNrZXRzOworICAgIHByaXZhdGUgZmluYWwgbG9uZ1tdIF9vZFRpbWU7CisgCisgICAgLy9hbGwgdGltZQorICAgIHByaXZhdGUgbG9uZyBfYWxsVGltZTsKKworICAgIHByaXZhdGUgZmluYWwgVGltZXJUYXNrIF90YXNrOworCisgICAgLyoqCisgICAgICogQHBhcmFtIG51bUJ1Y2tldHMgdGhlIG51bWJlciBvZiBidWNrZXRzIHRvIGRpdmlkZSB0aGUgdGltZSBwZXJpb2RzIGludG8uCisgICAgICovCisgICAgcHVibGljIENvdW50U3RhdEFuZE1ldHJpYyhpbnQgbnVtQnVja2V0cykgeworICAgICAgICB0aGlzKG51bUJ1Y2tldHMsIC0xKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvcgorICAgICAqIEBwYXJhbSBudW1CdWNrZXRzIHRoZSBudW1iZXIgb2YgYnVja2V0cyB0byBkaXZpZGUgdGhlIHRpbWUgcGVyaW9kcyBpbnRvLgorICAgICAqIEBwYXJhbSBzdGFydFRpbWUgaWYgcG9zaXRpdmUgdGhlIHNpbXVsYXRlZCB0aW1lIHRvIHN0YXJ0IHRoZSBmcm9tLgorICAgICAqLworICAgIENvdW50U3RhdEFuZE1ldHJpYyhpbnQgbnVtQnVja2V0cywgbG9uZyBzdGFydFRpbWUpeworICAgICAgICBudW1CdWNrZXRzID0gTWF0aC5tYXgobnVtQnVja2V0cywgMik7CisgICAgICAgIC8vV2Ugd2FudCB0byBjYXB0dXJlIHRoZSBmdWxsIHRpbWUgcmFuZ2UsIHNvIHRoZSB0YXJnZXQgc2l6ZSBpcyBhcworICAgICAgICAvLyBpZiB3ZSBoYWQgb25lIGJ1Y2tldCBsZXNzLCB0aGVuIHdlIGRvCisgICAgICAgIF90bVNpemUgPSAxMCAqIDYwICogMTAwMCAvIChudW1CdWNrZXRzIC0gMSk7CisgICAgICAgIF90aFNpemUgPSAzICogNjAgKiA2MCAqIDEwMDAgLyAobnVtQnVja2V0cyAtIDEpOworICAgICAgICBfb2RTaXplID0gMjQgKiA2MCAqIDYwICogMTAwMCAvIChudW1CdWNrZXRzIC0gMSk7CisgICAgICAgIGlmIChfdG1TaXplIDwgMSB8fCBfdGhTaXplIDwgMSB8fCBfb2RTaXplIDwgMSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibnVtYmVyIG9mIGJ1Y2tldHMgaXMgdG9vIGxhcmdlIHRvIGJlIHN1cHBvcnRlZCIpOworICAgICAgICB9CisgICAgICAgIF90bUJ1Y2tldHMgPSBuZXcgbG9uZ1tudW1CdWNrZXRzXTsKKyAgICAgICAgX3RtVGltZSA9IG5ldyBsb25nW251bUJ1Y2tldHNdOworICAgICAgICBfdGhCdWNrZXRzID0gbmV3IGxvbmdbbnVtQnVja2V0c107CisgICAgICAgIF90aFRpbWUgPSBuZXcgbG9uZ1tudW1CdWNrZXRzXTsKKyAgICAgICAgX29kQnVja2V0cyA9IG5ldyBsb25nW251bUJ1Y2tldHNdOworICAgICAgICBfb2RUaW1lID0gbmV3IGxvbmdbbnVtQnVja2V0c107CisgICAgICAgIF9hbGxUaW1lID0gMDsKKyAgICAgICAgX2V4YWN0RXh0cmEgPSAwOworCisgICAgICAgIF9idWNrZXRTdGFydCA9IHN0YXJ0VGltZSA+PSAwID8gc3RhcnRUaW1lIDogU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIF9jdXJyZW50QnVja2V0ID0gbmV3IEF0b21pY0xvbmcoMCk7CisgICAgICAgIGlmIChzdGFydFRpbWUgPCAwKSB7CisgICAgICAgICAgICBfdGFzayA9IG5ldyBGcmVzaGVyKCk7CisgICAgICAgICAgICBNZXRyaWNTdGF0VGltZXIuX3RpbWVyLnNjaGVkdWxlQXRGaXhlZFJhdGUoX3Rhc2ssIF90bVNpemUsIF90bVNpemUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgX3Rhc2sgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5jcmVhc2UgdGhlIGNvdW50IGJ5IHRoZSBnaXZlbiB2YWx1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb3VudCBudW1iZXIgdG8gY291bnQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbmNCeShsb25nIGNvdW50KSB7CisgICAgICAgIF9jdXJyZW50QnVja2V0LmFkZEFuZEdldChjb3VudCk7CisgICAgfQorCisgICAKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgT2JqZWN0IGdldFZhbHVlQW5kUmVzZXQoKSB7CisgICAgICAgIHJldHVybiBnZXRWYWx1ZUFuZFJlc2V0KFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKyAgICB9CisKKyAgICBzeW5jaHJvbml6ZWQgT2JqZWN0IGdldFZhbHVlQW5kUmVzZXQobG9uZyBub3cpIHsKKyAgICAgICAgbG9uZyB2YWx1ZSA9IF9jdXJyZW50QnVja2V0LmdldEFuZFNldCgwKTsKKyAgICAgICAgbG9uZyB0aW1lU3BlbnQgPSBub3cgLSBfYnVja2V0U3RhcnQ7CisgICAgICAgIGxvbmcgcmV0ID0gdmFsdWUgKyBfZXhhY3RFeHRyYTsKKyAgICAgICAgX2J1Y2tldFN0YXJ0ID0gbm93OworICAgICAgICBfZXhhY3RFeHRyYSA9IDA7CisgICAgICAgIHJvdGF0ZUJ1Y2tldHModmFsdWUsIHRpbWVTcGVudCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgc3luY2hyb25pemVkIHZvaWQgcm90YXRlU2NoZWQobG9uZyBub3cpIHsKKyAgICAgICAgbG9uZyB2YWx1ZSA9IF9jdXJyZW50QnVja2V0LmdldEFuZFNldCgwKTsKKyAgICAgICAgbG9uZyB0aW1lU3BlbnQgPSBub3cgLSBfYnVja2V0U3RhcnQ7CisgICAgICAgIF9leGFjdEV4dHJhICs9IHZhbHVlOworICAgICAgICBfYnVja2V0U3RhcnQgPSBub3c7CisgICAgICAgIHJvdGF0ZUJ1Y2tldHModmFsdWUsIHRpbWVTcGVudCk7CisgICAgfQorCisgICAgc3luY2hyb25pemVkIHZvaWQgcm90YXRlQnVja2V0cyhsb25nIHZhbHVlLCBsb25nIHRpbWVTcGVudCkgeworICAgICAgICByb3RhdGUodmFsdWUsIHRpbWVTcGVudCwgX3RtU2l6ZSwgX3RtVGltZSwgX3RtQnVja2V0cyk7CisgICAgICAgIHJvdGF0ZSh2YWx1ZSwgdGltZVNwZW50LCBfdGhTaXplLCBfdGhUaW1lLCBfdGhCdWNrZXRzKTsKKyAgICAgICAgcm90YXRlKHZhbHVlLCB0aW1lU3BlbnQsIF9vZFNpemUsIF9vZFRpbWUsIF9vZEJ1Y2tldHMpOworICAgICAgICBfYWxsVGltZSArPSB2YWx1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHJvdGF0ZShsb25nIHZhbHVlLCBsb25nIHRpbWVTcGVudCwgbG9uZyB0YXJnZXRTaXplLCBsb25nIFtdIHRpbWVzLCBsb25nIFtdIGJ1Y2tldHMpIHsKKyAgICAgICAgdGltZXNbMF0gKz0gdGltZVNwZW50OworICAgICAgICBidWNrZXRzWzBdICs9IHZhbHVlOworCisgICAgICAgIGxvbmcgY3VycmVudFRpbWUgPSAwOworICAgICAgICBsb25nIGN1cnJlbnRWYWwgPSAwOworICAgICAgICBpZiAodGltZXNbMF0gPj0gdGFyZ2V0U2l6ZSkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBidWNrZXRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgbG9uZyB0bXBUaW1lID0gdGltZXNbaV07CisgICAgICAgICAgICAgICAgdGltZXNbaV0gPSBjdXJyZW50VGltZTsKKyAgICAgICAgICAgICAgICBjdXJyZW50VGltZSA9IHRtcFRpbWU7CisKKyAgICAgICAgICAgICAgICBsb25nIGNudCA9IGJ1Y2tldHNbaV07CisgICAgICAgICAgICAgICAgYnVja2V0c1tpXSA9IGN1cnJlbnRWYWw7CisgICAgICAgICAgICAgICAgY3VycmVudFZhbCA9IGNudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gYSBtYXAgb2YgdGltZSB3aW5kb3cgdG8gY291bnQuCisgICAgICogS2V5cyBhcmUgIjYwMCIgZm9yIGxhc3QgMTAgbWlucworICAgICAqICIxMDgwMCIgZm9yIHRoZSBsYXN0IDMgaG91cnMKKyAgICAgKiAiODY0MDAiIGZvciB0aGUgbGFzdCBkYXkKKyAgICAgKiAiOmFsbC10aW1lIiBmb3IgYWxsIHRpbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3luY2hyb25pemVkIE1hcDxTdHJpbmcsIExvbmc+IGdldFRpbWVDb3VudHMoKSB7CisgICAgICAgIHJldHVybiBnZXRUaW1lQ291bnRzKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKyAgICB9CisKKyAgICBzeW5jaHJvbml6ZWQgTWFwPFN0cmluZywgTG9uZz4gZ2V0VGltZUNvdW50cyhsb25nIG5vdykgeworICAgICAgICBNYXA8U3RyaW5nLCBMb25nPiByZXQgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIGxvbmcgdmFsdWUgPSBfY3VycmVudEJ1Y2tldC5nZXQoKTsKKyAgICAgICAgbG9uZyB0aW1lU3BlbnQgPSBub3cgLSBfYnVja2V0U3RhcnQ7CisgICAgICAgIHJldC5wdXQoIjYwMCIsIHJlYWRBcHByb3hpbWF0ZVRpbWUodmFsdWUsIHRpbWVTcGVudCwgX3RtVGltZSwgX3RtQnVja2V0cywgNjAwICogMTAwMCkpOworICAgICAgICByZXQucHV0KCIxMDgwMCIsIHJlYWRBcHByb3hpbWF0ZVRpbWUodmFsdWUsIHRpbWVTcGVudCwgX3RoVGltZSwgX3RoQnVja2V0cywgMTA4MDAgKiAxMDAwKSk7CisgICAgICAgIHJldC5wdXQoIjg2NDAwIiwgcmVhZEFwcHJveGltYXRlVGltZSh2YWx1ZSwgdGltZVNwZW50LCBfb2RUaW1lLCBfb2RCdWNrZXRzLCA4NjQwMCAqIDEwMDApKTsKKyAgICAgICAgcmV0LnB1dCgiOmFsbC10aW1lIiwgdmFsdWUgKyBfYWxsVGltZSk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgbG9uZyByZWFkQXBwcm94aW1hdGVUaW1lKGxvbmcgdmFsdWUsIGxvbmcgdGltZVNwZW50LCBsb25nW10gYnVja2V0VGltZSwgbG9uZ1tdIGJ1Y2tldHMsIGxvbmcgZGVzaXJlZFRpbWUpIHsKKyAgICAgICAgbG9uZyB0aW1lTmVlZGVkID0gZGVzaXJlZFRpbWUgLSB0aW1lU3BlbnQ7CisgICAgICAgIGxvbmcgdG90YWwgPSB2YWx1ZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBidWNrZXRUaW1lLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAodGltZU5lZWRlZCA8IGJ1Y2tldFRpbWVbaV0pIHsKKyAgICAgICAgICAgICAgICBkb3VibGUgcGN0ID0gdGltZU5lZWRlZC8oKGRvdWJsZSlidWNrZXRUaW1lW2ldKTsKKyAgICAgICAgICAgICAgICB0b3RhbCArPSAobG9uZykocGN0ICogYnVja2V0c1tpXSk7CisgICAgICAgICAgICAgICAgdGltZU5lZWRlZCA9IDA7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0b3RhbCArPSBidWNrZXRzW2ldOworICAgICAgICAgICAgdGltZU5lZWRlZCAtPSBidWNrZXRUaW1lW2ldOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0b3RhbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgaWYgKF90YXNrICE9IG51bGwpIHsKKyAgICAgICAgICAgIF90YXNrLmNhbmNlbCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBGcmVzaGVyIGV4dGVuZHMgVGltZXJUYXNrIHsKKyAgICAgICAgcHVibGljIHZvaWQgcnVuICgpIHsKKyAgICAgICAgICAgIHJvdGF0ZVNjaGVkKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXRyaWMvaW50ZXJuYWwvTGF0ZW5jeVN0YXRBbmRNZXRyaWMuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXRyaWMvaW50ZXJuYWwvTGF0ZW5jeVN0YXRBbmRNZXRyaWMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTRmOTVlCi0tLSAvZGV2L251bGwKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21ldHJpYy9pbnRlcm5hbC9MYXRlbmN5U3RhdEFuZE1ldHJpYy5qYXZhCkBAIC0wLDAgKzEsMjYyIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIDxwLz4KKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogPHAvPgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYmFja3R5cGUuc3Rvcm0ubWV0cmljLmludGVybmFsOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuVGltZXJUYXNrOworCitpbXBvcnQgYmFja3R5cGUuc3Rvcm0ubWV0cmljLmFwaS5JTWV0cmljOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnV0aWxzLlV0aWxzOworCisvKioKKyAqIEFjdHMgYXMgYSBMYXRlbmN5IE1ldHJpYywgYnV0IGFsc28ga2VlcHMgdHJhY2sgb2YgYXBwcm94aW1hdGUgbGF0ZW5jeQorICogZm9yIHRoZSBsYXN0IDEwIG1pbnMsIDMgaG91cnMsIDEgZGF5LCBhbmQgYWxsIHRpbWUuCisgKi8KK3B1YmxpYyBjbGFzcyBMYXRlbmN5U3RhdEFuZE1ldHJpYyBpbXBsZW1lbnRzIElNZXRyaWMgeworICAgIC8vVGhlIGN1cnJlbnQgbGF0IGFuZCBjb3VudCBidWNrZXRzIGFyZSBwcm90ZWN0ZWQgYnkgYSBkaWZmZXJlbnQgbG9jaworICAgIC8vIGZyb20gdGhlIG90aGVyIGJ1Y2tldHMuICBUaGlzIGlzIHRvIHJlZHVjZSB0aGUgbG9jayBjb250ZW50aW9uCisgICAgLy8gV2hlbiBkb2luZyBjb21wbGV4IGNhbGN1bGF0aW9ucy4gIE5ldmVyIGdyYWIgdGhlIGluc3RhbmNlIG9iamVjdCBsb2NrCisgICAgLy8gd2hpbGUgaG9sZGluZyBfY3VycmVudExvY2sgdG8gYXZvaWQgZGVhZGxvY2tzCisgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgX2N1cnJlbnRMb2NrID0gbmV3IGJ5dGVbMF07CisgICAgcHJpdmF0ZSBsb25nIF9jdXJyZW50TGF0QnVja2V0OworICAgIHByaXZhdGUgbG9uZyBfY3VycmVudENvdW50QnVja2V0OworCisgICAgLy8gQWxsIGludGVybmFsIHN0YXRlIGV4Y2VwdCBmb3IgdGhlIGN1cnJlbnQgYnVja2V0cyBhcmUKKyAgICAvLyBwcm90ZWN0ZWQgdXNpbmcgdGhlIE9iamVjdCBMb2NrCisgICAgcHJpdmF0ZSBsb25nIF9idWNrZXRTdGFydDsKKworICAgIC8vZXhhY3QgdmFyaWFibGUgdGltZSwgdGhhdCBpcyBhZGRlZCB0byB0aGUgY3VycmVudCBidWNrZXQKKyAgICBwcml2YXRlIGxvbmcgX2V4YWN0RXh0cmFMYXQ7CisgICAgcHJpdmF0ZSBsb25nIF9leGFjdEV4dHJhQ291bnQ7CisgCisgICAgLy8xMCBtaW4gdmFsdWVzCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgX3RtU2l6ZTsKKyAgICBwcml2YXRlIGZpbmFsIGxvbmdbXSBfdG1MYXRCdWNrZXRzOworICAgIHByaXZhdGUgZmluYWwgbG9uZ1tdIF90bUNvdW50QnVja2V0czsKKyAgICBwcml2YXRlIGZpbmFsIGxvbmdbXSBfdG1UaW1lOworICAgIAorICAgIC8vMyBob3VyIHZhbHVlcworICAgIHByaXZhdGUgZmluYWwgaW50IF90aFNpemU7CisgICAgcHJpdmF0ZSBmaW5hbCBsb25nW10gX3RoTGF0QnVja2V0czsKKyAgICBwcml2YXRlIGZpbmFsIGxvbmdbXSBfdGhDb3VudEJ1Y2tldHM7CisgICAgcHJpdmF0ZSBmaW5hbCBsb25nW10gX3RoVGltZTsKKworICAgIC8vMSBkYXkgdmFsdWVzCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgX29kU2l6ZTsKKyAgICBwcml2YXRlIGZpbmFsIGxvbmdbXSBfb2RMYXRCdWNrZXRzOworICAgIHByaXZhdGUgZmluYWwgbG9uZ1tdIF9vZENvdW50QnVja2V0czsKKyAgICBwcml2YXRlIGZpbmFsIGxvbmdbXSBfb2RUaW1lOworIAorICAgIC8vYWxsIHRpbWUKKyAgICBwcml2YXRlIGxvbmcgX2FsbFRpbWVMYXQ7CisgICAgcHJpdmF0ZSBsb25nIF9hbGxUaW1lQ291bnQ7CisKKyAgICBwcml2YXRlIGZpbmFsIFRpbWVyVGFzayBfdGFzazsKKworICAgIC8qKgorICAgICAqIEBwYXJhbSBudW1CdWNrZXRzIHRoZSBudW1iZXIgb2YgYnVja2V0cyB0byBkaXZpZGUgdGhlIHRpbWUgcGVyaW9kcyBpbnRvLgorICAgICAqLworICAgIHB1YmxpYyBMYXRlbmN5U3RhdEFuZE1ldHJpYyhpbnQgbnVtQnVja2V0cykgeworICAgICAgICB0aGlzKG51bUJ1Y2tldHMsIC0xKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvcgorICAgICAqIEBwYXJhbSBudW1CdWNrZXRzIHRoZSBudW1iZXIgb2YgYnVja2V0cyB0byBkaXZpZGUgdGhlIHRpbWUgcGVyaW9kcyBpbnRvLgorICAgICAqIEBwYXJhbSBzdGFydFRpbWUgaWYgcG9zaXRpdmUgdGhlIHNpbXVsYXRlZCB0aW1lIHRvIHN0YXJ0IHRoZSBmcm9tLgorICAgICAqLworICAgIExhdGVuY3lTdGF0QW5kTWV0cmljKGludCBudW1CdWNrZXRzLCBsb25nIHN0YXJ0VGltZSl7CisgICAgICAgIG51bUJ1Y2tldHMgPSBNYXRoLm1heChudW1CdWNrZXRzLCAyKTsKKyAgICAgICAgLy9XZSB3YW50IHRvIGNhcHR1cmUgdGhlIGZ1bGwgdGltZSByYW5nZSwgc28gdGhlIHRhcmdldCBzaXplIGlzIGFzCisgICAgICAgIC8vIGlmIHdlIGhhZCBvbmUgYnVja2V0IGxlc3MsIHRoZW4gd2UgZG8KKyAgICAgICAgX3RtU2l6ZSA9IDEwICogNjAgKiAxMDAwIC8gKG51bUJ1Y2tldHMgLSAxKTsKKyAgICAgICAgX3RoU2l6ZSA9IDMgKiA2MCAqIDYwICogMTAwMCAvIChudW1CdWNrZXRzIC0gMSk7CisgICAgICAgIF9vZFNpemUgPSAyNCAqIDYwICogNjAgKiAxMDAwIC8gKG51bUJ1Y2tldHMgLSAxKTsKKyAgICAgICAgaWYgKF90bVNpemUgPCAxIHx8IF90aFNpemUgPCAxIHx8IF9vZFNpemUgPCAxKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJudW1iZXIgb2YgYnVja2V0cyBpcyB0b28gbGFyZ2UgdG8gYmUgc3VwcG9ydGVkIik7CisgICAgICAgIH0KKyAgICAgICAgX3RtTGF0QnVja2V0cyA9IG5ldyBsb25nW251bUJ1Y2tldHNdOworICAgICAgICBfdG1Db3VudEJ1Y2tldHMgPSBuZXcgbG9uZ1tudW1CdWNrZXRzXTsKKyAgICAgICAgX3RtVGltZSA9IG5ldyBsb25nW251bUJ1Y2tldHNdOworICAgICAgICBfdGhMYXRCdWNrZXRzID0gbmV3IGxvbmdbbnVtQnVja2V0c107CisgICAgICAgIF90aENvdW50QnVja2V0cyA9IG5ldyBsb25nW251bUJ1Y2tldHNdOworICAgICAgICBfdGhUaW1lID0gbmV3IGxvbmdbbnVtQnVja2V0c107CisgICAgICAgIF9vZExhdEJ1Y2tldHMgPSBuZXcgbG9uZ1tudW1CdWNrZXRzXTsKKyAgICAgICAgX29kQ291bnRCdWNrZXRzID0gbmV3IGxvbmdbbnVtQnVja2V0c107CisgICAgICAgIF9vZFRpbWUgPSBuZXcgbG9uZ1tudW1CdWNrZXRzXTsKKyAgICAgICAgX2FsbFRpbWVMYXQgPSAwOworICAgICAgICBfYWxsVGltZUNvdW50ID0gMDsKKyAgICAgICAgX2V4YWN0RXh0cmFMYXQgPSAwOworICAgICAgICBfZXhhY3RFeHRyYUNvdW50ID0gMDsKKworICAgICAgICBfYnVja2V0U3RhcnQgPSBzdGFydFRpbWUgPj0gMCA/IHN0YXJ0VGltZSA6IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBfY3VycmVudExhdEJ1Y2tldCA9IDA7CisgICAgICAgIF9jdXJyZW50Q291bnRCdWNrZXQgPSAwOworICAgICAgICBpZiAoc3RhcnRUaW1lIDwgMCkgeworICAgICAgICAgICAgX3Rhc2sgPSBuZXcgRnJlc2hlcigpOworICAgICAgICAgICAgTWV0cmljU3RhdFRpbWVyLl90aW1lci5zY2hlZHVsZUF0Rml4ZWRSYXRlKF90YXNrLCBfdG1TaXplLCBfdG1TaXplKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF90YXNrID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlY29yZCBhIHNwZWNpZmljIGxhdGVuY3kKKyAgICAgKgorICAgICAqIEBwYXJhbSBsYXRlbmN5IHdoYXQgd2UgYXJlIHJlY29yZGluZworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlY29yZChsb25nIGxhdGVuY3kpIHsKKyAgICAgICAgc3luY2hyb25pemVkKF9jdXJyZW50TG9jaykgeworICAgICAgICAgICAgX2N1cnJlbnRMYXRCdWNrZXQgKz0gbGF0ZW5jeTsKKyAgICAgICAgICAgIF9jdXJyZW50Q291bnRCdWNrZXQrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgT2JqZWN0IGdldFZhbHVlQW5kUmVzZXQoKSB7CisgICAgICAgIHJldHVybiBnZXRWYWx1ZUFuZFJlc2V0KFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKyAgICB9CisKKyAgICBzeW5jaHJvbml6ZWQgT2JqZWN0IGdldFZhbHVlQW5kUmVzZXQobG9uZyBub3cpIHsKKyAgICAgICAgbG9uZyBsYXQ7CisgICAgICAgIGxvbmcgY291bnQ7CisgICAgICAgIHN5bmNocm9uaXplZChfY3VycmVudExvY2spIHsKKyAgICAgICAgICAgIGxhdCA9IF9jdXJyZW50TGF0QnVja2V0OworICAgICAgICAgICAgY291bnQgPSBfY3VycmVudENvdW50QnVja2V0OworICAgICAgICAgICAgX2N1cnJlbnRMYXRCdWNrZXQgPSAwOworICAgICAgICAgICAgX2N1cnJlbnRDb3VudEJ1Y2tldCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBsb25nIHRpbWVTcGVudCA9IG5vdyAtIF9idWNrZXRTdGFydDsKKyAgICAgICAgbG9uZyBleGFjdEV4dHJhQ291bnRTdW0gPSBjb3VudCArIF9leGFjdEV4dHJhQ291bnQ7CisgICAgICAgIGRvdWJsZSByZXQgPSBVdGlscy56ZXJvSWZOYU5PckluZigKKyAgICAgICAgICAgICAgICAoKGRvdWJsZSkgKGxhdCArIF9leGFjdEV4dHJhTGF0KSkgLyBleGFjdEV4dHJhQ291bnRTdW0pOworICAgICAgICBfYnVja2V0U3RhcnQgPSBub3c7CisgICAgICAgIF9leGFjdEV4dHJhTGF0ID0gMDsKKyAgICAgICAgX2V4YWN0RXh0cmFDb3VudCA9IDA7CisgICAgICAgIHJvdGF0ZUJ1Y2tldHMobGF0LCBjb3VudCwgdGltZVNwZW50KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCByb3RhdGVTY2hlZChsb25nIG5vdykgeworICAgICAgICBsb25nIGxhdDsKKyAgICAgICAgbG9uZyBjb3VudDsKKyAgICAgICAgc3luY2hyb25pemVkKF9jdXJyZW50TG9jaykgeworICAgICAgICAgICAgbGF0ID0gX2N1cnJlbnRMYXRCdWNrZXQ7CisgICAgICAgICAgICBjb3VudCA9IF9jdXJyZW50Q291bnRCdWNrZXQ7CisgICAgICAgICAgICBfY3VycmVudExhdEJ1Y2tldCA9IDA7CisgICAgICAgICAgICBfY3VycmVudENvdW50QnVja2V0ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGxvbmcgdGltZVNwZW50ID0gbm93IC0gX2J1Y2tldFN0YXJ0OworICAgICAgICBfZXhhY3RFeHRyYUxhdCArPSBsYXQ7CisgICAgICAgIF9leGFjdEV4dHJhQ291bnQgKz0gY291bnQ7CisgICAgICAgIF9idWNrZXRTdGFydCA9IG5vdzsKKyAgICAgICAgcm90YXRlQnVja2V0cyhsYXQsIGNvdW50LCB0aW1lU3BlbnQpOworICAgIH0KKworICAgIHN5bmNocm9uaXplZCB2b2lkIHJvdGF0ZUJ1Y2tldHMobG9uZyBsYXQsIGxvbmcgY291bnQsIGxvbmcgdGltZVNwZW50KSB7CisgICAgICAgIHJvdGF0ZShsYXQsIGNvdW50LCB0aW1lU3BlbnQsIF90bVNpemUsIF90bVRpbWUsIF90bUxhdEJ1Y2tldHMsIF90bUNvdW50QnVja2V0cyk7CisgICAgICAgIHJvdGF0ZShsYXQsIGNvdW50LCB0aW1lU3BlbnQsIF90aFNpemUsIF90aFRpbWUsIF90aExhdEJ1Y2tldHMsIF90aENvdW50QnVja2V0cyk7CisgICAgICAgIHJvdGF0ZShsYXQsIGNvdW50LCB0aW1lU3BlbnQsIF9vZFNpemUsIF9vZFRpbWUsIF9vZExhdEJ1Y2tldHMsIF9vZENvdW50QnVja2V0cyk7CisgICAgICAgIF9hbGxUaW1lTGF0ICs9IGxhdDsKKyAgICAgICAgX2FsbFRpbWVDb3VudCArPSBjb3VudDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHJvdGF0ZShsb25nIGxhdCwgbG9uZyBjb3VudCwgbG9uZyB0aW1lU3BlbnQsIGxvbmcgdGFyZ2V0U2l6ZSwKKyAgICAgICAgICAgIGxvbmcgW10gdGltZXMsIGxvbmcgW10gbGF0QnVja2V0cywgbG9uZyBbXSBjb3VudEJ1Y2tldHMpIHsKKyAgICAgICAgdGltZXNbMF0gKz0gdGltZVNwZW50OworICAgICAgICBsYXRCdWNrZXRzWzBdICs9IGxhdDsKKyAgICAgICAgY291bnRCdWNrZXRzWzBdICs9IGNvdW50OworCisgICAgICAgIGxvbmcgY3VycmVudFRpbWUgPSAwOworICAgICAgICBsb25nIGN1cnJlbnRMYXQgPSAwOworICAgICAgICBsb25nIGN1cnJlbnRDb3VudCA9IDA7CisgICAgICAgIGlmICh0aW1lc1swXSA+PSB0YXJnZXRTaXplKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxhdEJ1Y2tldHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBsb25nIHRtcFRpbWUgPSB0aW1lc1tpXTsKKyAgICAgICAgICAgICAgICB0aW1lc1tpXSA9IGN1cnJlbnRUaW1lOworICAgICAgICAgICAgICAgIGN1cnJlbnRUaW1lID0gdG1wVGltZTsKKworICAgICAgICAgICAgICAgIGxvbmcgbHQgPSBsYXRCdWNrZXRzW2ldOworICAgICAgICAgICAgICAgIGxhdEJ1Y2tldHNbaV0gPSBjdXJyZW50TGF0OworICAgICAgICAgICAgICAgIGN1cnJlbnRMYXQgPSBsdDsKKworICAgICAgICAgICAgICAgIGxvbmcgY250ID0gY291bnRCdWNrZXRzW2ldOworICAgICAgICAgICAgICAgIGNvdW50QnVja2V0c1tpXSA9IGN1cnJlbnRDb3VudDsKKyAgICAgICAgICAgICAgICBjdXJyZW50Q291bnQgPSBjbnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIGEgbWFwIG9mIHRpbWUgd2luZG93IHRvIGF2ZXJhZ2UgbGF0ZW5jeS4KKyAgICAgKiBLZXlzIGFyZSAiNjAwIiBmb3IgbGFzdCAxMCBtaW5zCisgICAgICogIjEwODAwIiBmb3IgdGhlIGxhc3QgMyBob3VycworICAgICAqICI4NjQwMCIgZm9yIHRoZSBsYXN0IGRheQorICAgICAqICI6YWxsLXRpbWUiIGZvciBhbGwgdGltZQorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgTWFwPFN0cmluZywgRG91YmxlPiBnZXRUaW1lTGF0QXZnKCkgeworICAgICAgICByZXR1cm4gZ2V0VGltZUxhdEF2ZyhTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgfQorCisgICAgc3luY2hyb25pemVkIE1hcDxTdHJpbmcsIERvdWJsZT4gZ2V0VGltZUxhdEF2Zyhsb25nIG5vdykgeworICAgICAgICBNYXA8U3RyaW5nLCBEb3VibGU+IHJldCA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgbG9uZyBsYXQ7CisgICAgICAgIGxvbmcgY291bnQ7CisgICAgICAgIHN5bmNocm9uaXplZChfY3VycmVudExvY2spIHsKKyAgICAgICAgICAgIGxhdCA9IF9jdXJyZW50TGF0QnVja2V0OworICAgICAgICAgICAgY291bnQgPSBfY3VycmVudENvdW50QnVja2V0OworICAgICAgICB9CisgICAgICAgIGxvbmcgdGltZVNwZW50ID0gbm93IC0gX2J1Y2tldFN0YXJ0OworICAgICAgICByZXQucHV0KCI2MDAiLCByZWFkQXBwcm94aW1hdGVMYXRBdmcobGF0LCBjb3VudCwgdGltZVNwZW50LCBfdG1UaW1lLCBfdG1MYXRCdWNrZXRzLCBfdG1Db3VudEJ1Y2tldHMsIDYwMCAqIDEwMDApKTsKKyAgICAgICAgcmV0LnB1dCgiMTA4MDAiLCByZWFkQXBwcm94aW1hdGVMYXRBdmcobGF0LCBjb3VudCwgdGltZVNwZW50LCBfdGhUaW1lLCBfdGhMYXRCdWNrZXRzLCBfdGhDb3VudEJ1Y2tldHMsIDEwODAwICogMTAwMCkpOworICAgICAgICByZXQucHV0KCI4NjQwMCIsIHJlYWRBcHByb3hpbWF0ZUxhdEF2ZyhsYXQsIGNvdW50LCB0aW1lU3BlbnQsIF9vZFRpbWUsIF9vZExhdEJ1Y2tldHMsIF9vZENvdW50QnVja2V0cywgODY0MDAgKiAxMDAwKSk7CisgICAgICAgIGxvbmcgYWxsVGltZUNvdW50U3VtID0gY291bnQgKyBfYWxsVGltZUNvdW50OworICAgICAgICByZXQucHV0KCI6YWxsLXRpbWUiLCBVdGlscy56ZXJvSWZOYU5PckluZigKKyAgICAgICAgICAgICAgICAoZG91YmxlKSBsYXQgKyBfYWxsVGltZUxhdCkvYWxsVGltZUNvdW50U3VtKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBkb3VibGUgcmVhZEFwcHJveGltYXRlTGF0QXZnKGxvbmcgbGF0LCBsb25nIGNvdW50LCBsb25nIHRpbWVTcGVudCwgbG9uZ1tdIGJ1Y2tldFRpbWUsCisgICAgICAgICAgICAgIGxvbmdbXSBsYXRCdWNrZXRzLCBsb25nW10gY291bnRCdWNrZXRzLCBsb25nIGRlc2lyZWRUaW1lKSB7CisgICAgICAgIGxvbmcgdGltZU5lZWRlZCA9IGRlc2lyZWRUaW1lIC0gdGltZVNwZW50OworICAgICAgICBsb25nIHRvdGFsTGF0ID0gbGF0OworICAgICAgICBsb25nIHRvdGFsQ291bnQgPSBjb3VudDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBidWNrZXRUaW1lLmxlbmd0aCAmJiB0aW1lTmVlZGVkID4gMDsgaSsrKSB7CisgICAgICAgICAgICAvL0Rvbid0IHByby1yYXRlIGFueXRoaW5nLCBpdCBpcyBhbGwgYXBwcm94aW1hdGUgc28gYW4gZXh0cmEgYnVja2V0IGlzIG5vdCB0aGF0IGJhZC4KKyAgICAgICAgICAgIHRvdGFsTGF0ICs9IGxhdEJ1Y2tldHNbaV07CisgICAgICAgICAgICB0b3RhbENvdW50ICs9IGNvdW50QnVja2V0c1tpXTsKKyAgICAgICAgICAgIHRpbWVOZWVkZWQgLT0gYnVja2V0VGltZVtpXTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gVXRpbHMuemVyb0lmTmFOT3JJbmYoKChkb3VibGUpIHRvdGFsTGF0KSAvIHRvdGFsQ291bnQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgICAgICBpZiAoX3Rhc2sgIT0gbnVsbCkgeworICAgICAgICAgICAgX3Rhc2suY2FuY2VsKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIEZyZXNoZXIgZXh0ZW5kcyBUaW1lclRhc2sgeworICAgICAgICBwdWJsaWMgdm9pZCBydW4gKCkgeworICAgICAgICAgICAgcm90YXRlU2NoZWQoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21ldHJpYy9pbnRlcm5hbC9NZXRyaWNTdGF0VGltZXIuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXRyaWMvaW50ZXJuYWwvTWV0cmljU3RhdFRpbWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY0ODc5MwotLS0gL2Rldi9udWxsCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXRyaWMvaW50ZXJuYWwvTWV0cmljU3RhdFRpbWVyLmphdmEKQEAgLTAsMCArMSwyNyBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiA8cC8+CisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIDxwLz4KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGJhY2t0eXBlLnN0b3JtLm1ldHJpYy5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEudXRpbC5UaW1lcjsKKworLyoqCisgKiBKdXN0IGhvbGRzIGEgc2luZ2xldG9uIG1ldHJpYy9zdGF0IHRpbWVyIGZvciB1c2UgYnkgbWV0cmljL3N0YXQgY2FsY3VsYXRpb25zCisgKi8KK2NsYXNzIE1ldHJpY1N0YXRUaW1lciB7CisgICAgc3RhdGljIFRpbWVyIF90aW1lciA9IG5ldyBUaW1lcigibWV0cmljL3N0YXQgdGltZXIiLCB0cnVlKTsKK30KZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXRyaWMvaW50ZXJuYWwvTXVsdGlDb3VudFN0YXRBbmRNZXRyaWMuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXRyaWMvaW50ZXJuYWwvTXVsdGlDb3VudFN0YXRBbmRNZXRyaWMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmFlNGJmCi0tLSAvZGV2L251bGwKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21ldHJpYy9pbnRlcm5hbC9NdWx0aUNvdW50U3RhdEFuZE1ldHJpYy5qYXZhCkBAIC0wLDAgKzEsMTEyIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIDxwLz4KKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogPHAvPgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYmFja3R5cGUuc3Rvcm0ubWV0cmljLmludGVybmFsOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKKworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLm1ldHJpYy5hcGkuSU1ldHJpYzsKKworLyoqCisgKiBBY3RzIGFzIGEgTXVsdGlDb3VudCBNZXRyaWMsIGJ1dCBrZWVwcyB0cmFjayBvZiBhcHByb3hpbWF0ZSBjb3VudHMKKyAqIGZvciB0aGUgbGFzdCAxMCBtaW5zLCAzIGhvdXJzLCAxIGRheSwgYW5kIGFsbCB0aW1lLiBmb3IgdGhlIHNhbWUga2V5cworICovCitwdWJsaWMgY2xhc3MgTXVsdGlDb3VudFN0YXRBbmRNZXRyaWM8VD4gaW1wbGVtZW50cyBJTWV0cmljIHsKKyAgICBwcml2YXRlIENvbmN1cnJlbnRIYXNoTWFwPFQsIENvdW50U3RhdEFuZE1ldHJpYz4gX2NvdW50cyA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDw+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgX251bUJ1Y2tldHM7CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gbnVtQnVja2V0cyB0aGUgbnVtYmVyIG9mIGJ1Y2tldHMgdG8gZGl2aWRlIHRoZSB0aW1lIHBlcmlvZHMgaW50by4KKyAgICAgKi8KKyAgICBwdWJsaWMgTXVsdGlDb3VudFN0YXRBbmRNZXRyaWMoaW50IG51bUJ1Y2tldHMpIHsKKyAgICAgICAgX251bUJ1Y2tldHMgPSBudW1CdWNrZXRzOworICAgIH0KKworICAgIENvdW50U3RhdEFuZE1ldHJpYyBnZXQoVCBrZXkpIHsKKyAgICAgICAgQ291bnRTdGF0QW5kTWV0cmljIGMgPSBfY291bnRzLmdldChrZXkpOworICAgICAgICBpZiAoYyA9PSBudWxsKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgeworICAgICAgICAgICAgICAgIGMgPSBfY291bnRzLmdldChrZXkpOworICAgICAgICAgICAgICAgIGlmIChjID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYyA9IG5ldyBDb3VudFN0YXRBbmRNZXRyaWMoX251bUJ1Y2tldHMpOworICAgICAgICAgICAgICAgICAgICBfY291bnRzLnB1dChrZXksIGMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmNyZWFzZSB0aGUgY291bnQgYnkgdGhlIGdpdmVuIHZhbHVlLgorICAgICAqCisgICAgICogQHBhcmFtIGNvdW50IG51bWJlciB0byBjb3VudAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGluY0J5KFQga2V5LCBsb25nIGNvdW50KSB7CisgICAgICAgIGdldChrZXkpLmluY0J5KGNvdW50KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGtleVRvU3RyaW5nKFQga2V5KSB7CisgICAgICAgIGlmIChrZXkgaW5zdGFuY2VvZiBMaXN0KSB7CisgICAgICAgICAgICAvL1RoaXMgaXMgYSBiaXQgb2YgYSBoYWNrLiAgSWYgaXQgaXMgYSBsaXN0LCB0aGVuIGl0IGlzIFtjb21wb25lbnQsIHN0cmVhbV0KKyAgICAgICAgICAgIC8vd2Ugd2FudCB0byBmb3JtYXQgdGhpcyBhcyBjb21wb25lbnQ6c3RyZWFtCisgICAgICAgICAgICBMaXN0PFN0cmluZz4gbGsgPSAoTGlzdDxTdHJpbmc+KWtleTsKKyAgICAgICAgICAgIHJldHVybiBsay5nZXQoMCkgKyAiOiIgKyBsay5nZXQoMSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGtleS50b1N0cmluZygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWVBbmRSZXNldCgpIHsKKyAgICAgICAgTWFwPFN0cmluZywgTG9uZz4gcmV0ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMb25nPigpOworICAgICAgICBmb3IgKE1hcC5FbnRyeTxULCBDb3VudFN0YXRBbmRNZXRyaWM+IGVudHJ5OiBfY291bnRzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBrZXkgPSBrZXlUb1N0cmluZyhlbnRyeS5nZXRLZXkoKSk7CisgICAgICAgICAgICAvL1RoZXJlIGNvdWxkIGJlIGNvbGxpc2lvbnMgaWYga2V5VG9TdHJpbmcgcmV0dXJucyBvbmx5IHBhcnQgb2YgYSByZXN1bHQuCisgICAgICAgICAgICBMb25nIHZhbCA9IChMb25nKWVudHJ5LmdldFZhbHVlKCkuZ2V0VmFsdWVBbmRSZXNldCgpOworICAgICAgICAgICAgTG9uZyBvdGhlciA9IHJldC5nZXQoa2V5KTsKKyAgICAgICAgICAgIHZhbCArPSBvdGhlciA9PSBudWxsID8gMGwgOiBvdGhlcjsKKyAgICAgICAgICAgIHJldC5wdXQoa2V5LCB2YWwpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgcHVibGljIE1hcDxTdHJpbmcsIE1hcDxULCBMb25nPj4gZ2V0VGltZUNvdW50cygpIHsKKyAgICAgICAgTWFwPFN0cmluZywgTWFwPFQsIExvbmc+PiByZXQgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIGZvciAoTWFwLkVudHJ5PFQsIENvdW50U3RhdEFuZE1ldHJpYz4gZW50cnk6IF9jb3VudHMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgVCBrZXkgPSBlbnRyeS5nZXRLZXkoKTsKKyAgICAgICAgICAgIE1hcDxTdHJpbmcsIExvbmc+IHRvRmxpcCA9IGVudHJ5LmdldFZhbHVlKCkuZ2V0VGltZUNvdW50cygpOworICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBMb25nPiBzdWJFbnRyeTogdG9GbGlwLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdGltZSA9IHN1YkVudHJ5LmdldEtleSgpOworICAgICAgICAgICAgICAgIE1hcDxULCBMb25nPiB0bXAgPSByZXQuZ2V0KHRpbWUpOworICAgICAgICAgICAgICAgIGlmICh0bXAgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0bXAgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgICAgICAgICAgICAgIHJldC5wdXQodGltZSwgdG1wKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdG1wLnB1dChrZXksIHN1YkVudHJ5LmdldFZhbHVlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgICAgIGZvciAoQ291bnRTdGF0QW5kTWV0cmljIGNjOiBfY291bnRzLnZhbHVlcygpKSB7CisgICAgICAgICAgICBjYy5jbG9zZSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21ldHJpYy9pbnRlcm5hbC9NdWx0aUxhdGVuY3lTdGF0QW5kTWV0cmljLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vbWV0cmljL2ludGVybmFsL011bHRpTGF0ZW5jeVN0YXRBbmRNZXRyaWMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzJlZWYxCi0tLSAvZGV2L251bGwKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21ldHJpYy9pbnRlcm5hbC9NdWx0aUxhdGVuY3lTdGF0QW5kTWV0cmljLmphdmEKQEAgLTAsMCArMSwxMDkgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogPHAvPgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiA8cC8+CisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBiYWNrdHlwZS5zdG9ybS5tZXRyaWMuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwOworCitpbXBvcnQgYmFja3R5cGUuc3Rvcm0ubWV0cmljLmFwaS5JTWV0cmljOworCisvKioKKyAqIEFjdHMgYXMgYSBMYXRuZWN5IE1ldHJpYyBmb3IgbXVsdGlwbGUga2V5cywgYnV0IGtlZXBzIHRyYWNrIG9mIGFwcHJveGltYXRlIGNvdW50cworICogZm9yIHRoZSBsYXN0IDEwIG1pbnMsIDMgaG91cnMsIDEgZGF5LCBhbmQgYWxsIHRpbWUuIGZvciB0aGUgc2FtZSBrZXlzCisgKi8KK3B1YmxpYyBjbGFzcyBNdWx0aUxhdGVuY3lTdGF0QW5kTWV0cmljPFQ+IGltcGxlbWVudHMgSU1ldHJpYyB7CisgICAgcHJpdmF0ZSBDb25jdXJyZW50SGFzaE1hcDxULCBMYXRlbmN5U3RhdEFuZE1ldHJpYz4gX2xhdCA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDw+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgX251bUJ1Y2tldHM7CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gbnVtQnVja2V0cyB0aGUgbnVtYmVyIG9mIGJ1Y2tldHMgdG8gZGl2aWRlIHRoZSB0aW1lIHBlcmlvZHMgaW50by4KKyAgICAgKi8KKyAgICBwdWJsaWMgTXVsdGlMYXRlbmN5U3RhdEFuZE1ldHJpYyhpbnQgbnVtQnVja2V0cykgeworICAgICAgICBfbnVtQnVja2V0cyA9IG51bUJ1Y2tldHM7CisgICAgfQorCisgICAgTGF0ZW5jeVN0YXRBbmRNZXRyaWMgZ2V0KFQga2V5KSB7CisgICAgICAgIExhdGVuY3lTdGF0QW5kTWV0cmljIGMgPSBfbGF0LmdldChrZXkpOworICAgICAgICBpZiAoYyA9PSBudWxsKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQodGhpcykgeworICAgICAgICAgICAgICAgIGMgPSBfbGF0LmdldChrZXkpOworICAgICAgICAgICAgICAgIGlmIChjID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYyA9IG5ldyBMYXRlbmN5U3RhdEFuZE1ldHJpYyhfbnVtQnVja2V0cyk7CisgICAgICAgICAgICAgICAgICAgIF9sYXQucHV0KGtleSwgYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBjOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlY29yZCBhIGxhdGVuY3kgdmFsdWUKKyAgICAgKgorICAgICAqIEBwYXJhbSBsYXRlbmN5IHRoZSBtZWFzdXJlbWVudCB0byByZWNvcmQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWNvcmQoVCBrZXksIGxvbmcgbGF0ZW5jeSkgeworICAgICAgICBnZXQoa2V5KS5yZWNvcmQobGF0ZW5jeSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFN0cmluZyBrZXlUb1N0cmluZyhUIGtleSkgeworICAgICAgICBpZiAoa2V5IGluc3RhbmNlb2YgTGlzdCkgeworICAgICAgICAgICAgLy9UaGlzIGlzIGEgYml0IG9mIGEgaGFjay4gIElmIGl0IGlzIGEgbGlzdCwgdGhlbiBpdCBpcyBbY29tcG9uZW50LCBzdHJlYW1dCisgICAgICAgICAgICAvL3dlIHdhbnQgdG8gZm9ybWF0IHRoaXMgYXMgY29tcG9uZW50OnN0cmVhbQorICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGxrID0gKExpc3Q8U3RyaW5nPilrZXk7CisgICAgICAgICAgICByZXR1cm4gbGsuZ2V0KDApICsgIjoiICsgbGsuZ2V0KDEpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBrZXkudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0IGdldFZhbHVlQW5kUmVzZXQoKSB7CisgICAgICAgIE1hcDxTdHJpbmcsIERvdWJsZT4gcmV0ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBEb3VibGU+KCk7CisgICAgICAgIGZvciAoTWFwLkVudHJ5PFQsIExhdGVuY3lTdGF0QW5kTWV0cmljPiBlbnRyeTogX2xhdC5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICBTdHJpbmcga2V5ID0ga2V5VG9TdHJpbmcoZW50cnkuZ2V0S2V5KCkpOworICAgICAgICAgICAgRG91YmxlIHZhbCA9IChEb3VibGUpZW50cnkuZ2V0VmFsdWUoKS5nZXRWYWx1ZUFuZFJlc2V0KCk7CisgICAgICAgICAgICByZXQucHV0KGtleSwgdmFsKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBNYXA8VCwgRG91YmxlPj4gZ2V0VGltZUxhdEF2ZygpIHsKKyAgICAgICAgTWFwPFN0cmluZywgTWFwPFQsIERvdWJsZT4+IHJldCA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgZm9yIChNYXAuRW50cnk8VCwgTGF0ZW5jeVN0YXRBbmRNZXRyaWM+IGVudHJ5OiBfbGF0LmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIFQga2V5ID0gZW50cnkuZ2V0S2V5KCk7CisgICAgICAgICAgICBNYXA8U3RyaW5nLCBEb3VibGU+IHRvRmxpcCA9IGVudHJ5LmdldFZhbHVlKCkuZ2V0VGltZUxhdEF2ZygpOworICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBEb3VibGU+IHN1YkVudHJ5OiB0b0ZsaXAuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyB0aW1lID0gc3ViRW50cnkuZ2V0S2V5KCk7CisgICAgICAgICAgICAgICAgTWFwPFQsIERvdWJsZT4gdG1wID0gcmV0LmdldCh0aW1lKTsKKyAgICAgICAgICAgICAgICBpZiAodG1wID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICAgICAgICAgICAgICByZXQucHV0KHRpbWUsIHRtcCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRtcC5wdXQoa2V5LCBzdWJFbnRyeS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgICAgICBmb3IgKExhdGVuY3lTdGF0QW5kTWV0cmljIGw6IF9sYXQudmFsdWVzKCkpIHsKKyAgICAgICAgICAgIGwuY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXRyaWMvaW50ZXJuYWwvUmF0ZVRyYWNrZXIuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9tZXRyaWMvaW50ZXJuYWwvUmF0ZVRyYWNrZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2ViNmFlCi0tLSAvZGV2L251bGwKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL21ldHJpYy9pbnRlcm5hbC9SYXRlVHJhY2tlci5qYXZhCkBAIC0wLDAgKzEsMTY1IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIDxwLz4KKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogPHAvPgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYmFja3R5cGUuc3Rvcm0ubWV0cmljLmludGVybmFsOworCitpbXBvcnQgamF2YS51dGlsLlRpbWVyOworaW1wb3J0IGphdmEudXRpbC5UaW1lclRhc2s7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0xvbmc7CisKKy8qKgorICogVGhpcyBjbGFzcyBpcyBhIHV0aWxpdHkgdG8gdHJhY2sgdGhlIHJhdGUgb2Ygc29tZXRoaW5nLgorICovCitwdWJsaWMgY2xhc3MgUmF0ZVRyYWNrZXJ7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgX2J1Y2tldFNpemVNaWxsaXM7CisgICAgLy9PbGQgQnVja2V0cyBhbmQgdGhlaXIgbGVuZ3RoIGFyZSBvbmx5IHRvdWNoZWQgd2hlbiByb3RhdGluZyBvciBnYXRoZXJpbmcgdGhlIG1ldHJpY3MsIHdoaWNoIHNob3VsZCBub3QgYmUgdGhhdCBmcmVxdWVudAorICAgIC8vIEFzIHN1Y2ggYWxsIGFjY2VzcyB0byB0aGVtIHNob3VsZCBiZSBwcm90ZWN0ZWQgYnkgc3luY2hyb25pemluZyB3aXRoIHRoZSBSYXRlVHJhY2tlciBpbnN0YW5jZQorICAgIHByaXZhdGUgZmluYWwgbG9uZ1tdIF9idWNrZXRUaW1lOworICAgIHByaXZhdGUgZmluYWwgbG9uZ1tdIF9vbGRCdWNrZXRzOworICAgIAorICAgIHByaXZhdGUgZmluYWwgQXRvbWljTG9uZyBfYnVja2V0U3RhcnQ7CisgICAgcHJpdmF0ZSBmaW5hbCBBdG9taWNMb25nIF9jdXJyZW50QnVja2V0OworICAgIAorICAgIHByaXZhdGUgZmluYWwgVGltZXJUYXNrIF90YXNrOworCisgICAgLyoqCisgICAgICogQHBhcmFtIHZhbGlkVGltZVdpbmRvd0luTWlscyBldmVudHMgdGhhdCBoYXBwZW5lZCBiZWZvcmUgdmFsaWRUaW1lV2luZG93SW5NaWxzIGFyZSBub3QgY29uc2lkZXJlZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgd2hlbiByZXBvcnRpbmcgdGhlIHJhdGUuCisgICAgICogQHBhcmFtIG51bUJ1Y2tldHMgdGhlIG51bWJlciBvZiB0aW1lIHNpbGRlcyB0byBkaXZpZGUgdmFsaWRUaW1lV2luZG93cy4gVGhlIG1vcmUgYnVja2V0cywKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgdGhlIHNtb3RoZXIgdGhlIHJlcG9ydGVkIHJlc3VsdHMgd2lsbCBiZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUmF0ZVRyYWNrZXIoaW50IHZhbGlkVGltZVdpbmRvd0luTWlscywgaW50IG51bUJ1Y2tldHMpIHsKKyAgICAgICAgdGhpcyh2YWxpZFRpbWVXaW5kb3dJbk1pbHMsIG51bUJ1Y2tldHMsIC0xKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvcgorICAgICAqIEBwYXJhbSB2YWxpZFRpbWVXaW5kb3dJbk1pbHMgZXZlbnRzIHRoYXQgaGFwcGVuZWQgYmVmb3JlIHZhbGlkVGltZVdpbmRvdyBhcmUgbm90IGNvbnNpZGVyZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gcmVwb3J0aW5nIHRoZSByYXRlLgorICAgICAqIEBwYXJhbSBudW1CdWNrZXRzIHRoZSBudW1iZXIgb2YgdGltZSBzaWxkZXMgdG8gZGl2aWRlIHZhbGlkVGltZVdpbmRvd3MuIFRoZSBtb3JlIGJ1Y2tldHMsCisgICAgICogICAgICAgICAgICAgICAgICAgIHRoZSBzbW90aGVyIHRoZSByZXBvcnRlZCByZXN1bHRzIHdpbGwgYmUuCisgICAgICogQHBhcmFtIHN0YXJ0VGltZSBpZiBwb3NpdGl2ZSB0aGUgc2ltdWxhdGVkIHRpbWUgdG8gc3RhcnQgdGhlIGZpcnN0IGJ1Y2tldCBhdC4KKyAgICAgKi8KKyAgICBSYXRlVHJhY2tlcihpbnQgdmFsaWRUaW1lV2luZG93SW5NaWxzLCBpbnQgbnVtQnVja2V0cywgbG9uZyBzdGFydFRpbWUpeworICAgICAgICBudW1CdWNrZXRzID0gTWF0aC5tYXgobnVtQnVja2V0cywgMSk7CisgICAgICAgIF9idWNrZXRTaXplTWlsbGlzID0gdmFsaWRUaW1lV2luZG93SW5NaWxzIC8gbnVtQnVja2V0czsKKyAgICAgICAgaWYgKF9idWNrZXRTaXplTWlsbGlzIDwgMSApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInZhbGlkVGltZVdpbmRvd0luTWlsaXMgYW5kIG51bU9mU2lsZGVzIGNhdXNlIGVhY2ggc2xpZGUgdG8gaGF2ZSBhIHdpbmRvdyB0aGF0IGlzIHRvbyBzbWFsbCIpOworICAgICAgICB9CisgICAgICAgIF9idWNrZXRUaW1lID0gbmV3IGxvbmdbbnVtQnVja2V0cyAtIDFdOworICAgICAgICBfb2xkQnVja2V0cyA9IG5ldyBsb25nW251bUJ1Y2tldHMgLSAxXTsKKworICAgICAgICBfYnVja2V0U3RhcnQgPSBuZXcgQXRvbWljTG9uZyhzdGFydFRpbWUgPj0gMCA/IHN0YXJ0VGltZSA6IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKyAgICAgICAgX2N1cnJlbnRCdWNrZXQgPSBuZXcgQXRvbWljTG9uZygwKTsKKyAgICAgICAgaWYgKHN0YXJ0VGltZSA8IDApIHsKKyAgICAgICAgICAgIF90YXNrID0gbmV3IEZyZXNoZXIoKTsKKyAgICAgICAgICAgIE1ldHJpY1N0YXRUaW1lci5fdGltZXIuc2NoZWR1bGVBdEZpeGVkUmF0ZShfdGFzaywgX2J1Y2tldFNpemVNaWxsaXMsIF9idWNrZXRTaXplTWlsbGlzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF90YXNrID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIE5vdGlmeSB0aGUgdHJhY2tlciB1cG9uIG5ldyBhcnJpdmFscworICAgICAqCisgICAgICogQHBhcmFtIGNvdW50IG51bWJlciBvZiBhcnJpdmFscworICAgICAqLworICAgIHB1YmxpYyB2b2lkIG5vdGlmeShsb25nIGNvdW50KSB7CisgICAgICAgIF9jdXJyZW50QnVja2V0LmFkZEFuZEdldChjb3VudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgYXBwcm94aW1hdGUgYXZlcmFnZSByYXRlIHBlciBzZWNvbmQuCisgICAgICovCisgICAgcHVibGljIHN5bmNocm9uaXplZCBkb3VibGUgcmVwb3J0UmF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIHJlcG9ydFJhdGUoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgIH0KKworICAgIHN5bmNocm9uaXplZCBkb3VibGUgcmVwb3J0UmF0ZShsb25nIGN1cnJlbnRUaW1lKSB7CisgICAgICAgIGxvbmcgZHVyYXRpb24gPSBNYXRoLm1heCgxbCwgY3VycmVudFRpbWUgLSBfYnVja2V0U3RhcnQuZ2V0KCkpOworICAgICAgICBsb25nIGV2ZW50cyA9IF9jdXJyZW50QnVja2V0LmdldCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IF9vbGRCdWNrZXRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBldmVudHMgKz0gX29sZEJ1Y2tldHNbaV07CisgICAgICAgICAgICBkdXJhdGlvbiArPSBfYnVja2V0VGltZVtpXTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBldmVudHMgKiAxMDAwLjAgLyBkdXJhdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgaWYgKF90YXNrICE9IG51bGwpIHsKKyAgICAgICAgICAgIF90YXNrLmNhbmNlbCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUm90YXRlIHRoZSBidWNrZXRzIGEgc2V0IG51bWJlciBvZiB0aW1lcyBmb3IgdGVzdGluZyBwdXJwb3Nlcy4KKyAgICAgKiBAcGFyYW0gbnVtVG9FY2xpcHNlIHRoZSBudW1iZXIgb2Ygcm90YXRpb25zIHRvIHBlcmZvcm0uCisgICAgICovCisgICAgZmluYWwgdm9pZCBmb3JjZVJvdGF0ZShpbnQgbnVtVG9FY2xpcHNlLCBsb25nIGludGVydmFsKSB7CisgICAgICAgIGxvbmcgdGltZSA9IF9idWNrZXRTdGFydC5nZXQoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Ub0VjbGlwc2U7IGkrKykgeworICAgICAgICAgICAgdGltZSArPSBpbnRlcnZhbDsKKyAgICAgICAgICAgIHJvdGF0ZUJ1Y2tldHModGltZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIHJvdGF0ZUJ1Y2tldHMobG9uZyB0aW1lKSB7CisgICAgICAgIGxvbmcgdGltZVNwZW50ID0gdGltZSAtIF9idWNrZXRTdGFydC5nZXRBbmRTZXQodGltZSk7IAorICAgICAgICBsb25nIGN1cnJlbnRWYWwgPSBfY3VycmVudEJ1Y2tldC5nZXRBbmRTZXQoMCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgX29sZEJ1Y2tldHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGxvbmcgdG1wVGltZSA9IF9idWNrZXRUaW1lW2ldOworICAgICAgICAgICAgX2J1Y2tldFRpbWVbaV0gPSB0aW1lU3BlbnQ7CisgICAgICAgICAgICB0aW1lU3BlbnQgPSB0bXBUaW1lOworCisgICAgICAgICAgICBsb25nIGNudCA9IF9vbGRCdWNrZXRzW2ldOworICAgICAgICAgICAgX29sZEJ1Y2tldHNbaV0gPSBjdXJyZW50VmFsOworICAgICAgICAgICAgY3VycmVudFZhbCA9IGNudDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgRnJlc2hlciBleHRlbmRzIFRpbWVyVGFzayB7CisgICAgICAgIHB1YmxpYyB2b2lkIHJ1biAoKSB7CisgICAgICAgICAgICByb3RhdGVCdWNrZXRzKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluIChTdHJpbmcgYXJnc1tdKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgaW50IG51bWJlciA9IChhcmdzLmxlbmd0aCA+PSAxKSA/IEludGVnZXIucGFyc2VJbnQoYXJnc1swXSkgOiAxMDAwMDAwMDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgICAgICAgICAgdGVzdFJhdGUobnVtYmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdFJhdGUoaW50IG51bWJlcikgeworICAgICAgICBSYXRlVHJhY2tlciBydCA9IG5ldyBSYXRlVHJhY2tlcigxMDAwMCwgMTApOworICAgICAgICBsb25nIHN0YXJ0ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyOyBpKyspIHsKKyAgICAgICAgICAgIHJ0Lm5vdGlmeSgxKTsKKyAgICAgICAgICAgIGlmICgoaSAlIDEwMDAwMDApID09IDApIHsKKyAgICAgICAgICAgICAgICAvL1RoZXJlIGlzIGFuIGlzc3VlIHdpdGggc29tZSBKVk0gdmVyc2lvbnMgd2hlcmUgYW4gaW50ZWdlciBmb3IgbG9vcCB0aGF0IHRha2VzIGEgbG9uZyB0aW1lCisgICAgICAgICAgICAgICAgLy8gY2FuIHN0YXJ2ZSBvdGhlciB0aHJlYWRzIHJlc3VsdGluZyBpbiAgdGhlIHRpbWVyIHRocmVhZCBub3QgZ2V0dGluZyBjYWxsZWQuCisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHdvcmsgYXJvdW5kIGZvciB0aGF0LCBhbmQgd2Ugc3RpbGwgZ2V0IHRoZSBzYW1lIHJlc3VsdHMuCisgICAgICAgICAgICAgICAgVGhyZWFkLnlpZWxkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbG9uZyBlbmQgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgZG91YmxlIHJhdGUgPSBydC5yZXBvcnRSYXRlKCk7CisgICAgICAgIHJ0LmNsb3NlKCk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCJ0aW1lICUsOGQgY291bnQgJSw4ZCByYXRlICUsMTUuMmYgcmVwb3J0ZWQgcmF0ZSAlLDE1LjJmXG4iLCBlbmQtc3RhcnQsbnVtYmVyLCAoKG51bWJlciAqIDEwMDAuMCkvKGVuZC1zdGFydCkpLCByYXRlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vbmV0d29ya3RvcG9ncmFwaHkvQWJzdHJhY3RETlNUb1N3aXRjaE1hcHBpbmcuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9uZXR3b3JrdG9wb2dyYXBoeS9BYnN0cmFjdEROU1RvU3dpdGNoTWFwcGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxN2NhNDAKLS0tIC9kZXYvbnVsbAorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vbmV0d29ya3RvcG9ncmFwaHkvQWJzdHJhY3RETlNUb1N3aXRjaE1hcHBpbmcuamF2YQpAQCAtMCwwICsxLDk1IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIDxwPgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiA8cD4KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYmFja3R5cGUuc3Rvcm0ubmV0d29ya3RvcG9ncmFwaHk7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogVGhpcyBpcyBhIGJhc2UgY2xhc3MgZm9yIEROUyB0byBTd2l0Y2ggbWFwcGluZ3MuIDxwLz4gSXQgaXMgbm90IG1hbmRhdG9yeSB0bworICogZGVyaXZlIHtAbGluayBETlNUb1N3aXRjaE1hcHBpbmd9IGltcGxlbWVudGF0aW9ucyBmcm9tIGl0LCBidXQgaXQgaXMgc3Ryb25nbHkKKyAqIHJlY29tbWVuZGVkLCBhcyBpdCBtYWtlcyBpdCBlYXN5IGZvciB0aGUgZGV2ZWxvcGVycyB0byBhZGQgbmV3IG1ldGhvZHMKKyAqIHRvIHRoaXMgYmFzZSBjbGFzcyB0aGF0IGFyZSBhdXRvbWF0aWNhbGx5IHBpY2tlZCB1cCBieSBhbGwgaW1wbGVtZW50YXRpb25zLgorICogPHAvPgorICoKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RE5TVG9Td2l0Y2hNYXBwaW5nCisgICAgICAgIGltcGxlbWVudHMgRE5TVG9Td2l0Y2hNYXBwaW5nIHsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbiB1bmNvbmZpZ3VyZWQgaW5zdGFuY2UKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQWJzdHJhY3RETlNUb1N3aXRjaE1hcHBpbmcoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJlZGljYXRlIHRoYXQgaW5kaWNhdGVzIHRoYXQgdGhlIHN3aXRjaCBtYXBwaW5nIGlzIGtub3duIHRvIGJlCisgICAgICogc2luZ2xlLXN3aXRjaC4gVGhlIGJhc2UgY2xhc3MgcmV0dXJucyBmYWxzZTogaXQgYXNzdW1lcyBhbGwgbWFwcGluZ3MgYXJlCisgICAgICogbXVsdGktcmFjay4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyB3aXRoIG1ldGhvZHMgdGhhdCBhcmUgbW9yZSBhd2FyZQorICAgICAqIG9mIHRoZWlyIHRvcG9sb2dpZXMuCisgICAgICoKKyAgICAgKiA8cC8+CisgICAgICoKKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbWFwcGluZyB0aGlua3MgdGhhdCBpdCBpcyBvbiBhIHNpbmdsZSBzd2l0Y2gKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NpbmdsZVN3aXRjaCgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhIGNvcHkgb2YgdGhlIG1hcCAoZm9yIGRpYWdub3N0aWNzKQorICAgICAqIEByZXR1cm4gYSBjbG9uZSBvZiB0aGUgbWFwIG9yIG51bGwgZm9yIG5vbmUga25vd24KKyAgICAgKi8KKyAgICBwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRTd2l0Y2hNYXAoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlIGEgc3RyaW5nIGxpc3RpbmcgdGhlIHN3aXRjaCBtYXBwaW5nIGltcGxlbWVudGF0aW9uLAorICAgICAqIHRoZSBtYXBwaW5nIGZvciBldmVyeSBrbm93biBub2RlIGFuZCB0aGUgbnVtYmVyIG9mIG5vZGVzIGFuZAorICAgICAqIHVuaXF1ZSBzd2l0Y2hlcyBrbm93biBhYm91dCAtZWFjaCBlbnRyeSB0byBhIHNlcGFyYXRlIGxpbmUuCisgICAgICogQHJldHVybiBhIHN0cmluZyB0aGF0IGNhbiBiZSBwcmVzZW50ZWQgdG8gdGhlIG9wcyB0ZWFtIG9yIHVzZWQgaW4KKyAgICAgKiBkZWJ1ZyBtZXNzYWdlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGR1bXBUb3BvbG9neSgpIHsKKyAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiByYWNrID0gZ2V0U3dpdGNoTWFwKCk7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJNYXBwaW5nOiAiKS5hcHBlbmQodG9TdHJpbmcoKSkuYXBwZW5kKCJcbiIpOworICAgICAgICBpZiAocmFjayAhPSBudWxsKSB7CisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiTWFwOlxuIik7CisgICAgICAgICAgICBTZXQ8U3RyaW5nPiBzd2l0Y2hlcyA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBlbnRyeSA6IHJhY2suZW50cnlTZXQoKSkgeworICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIgICIpCisgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGVudHJ5LmdldEtleSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiIC0+ICIpCisgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGVudHJ5LmdldFZhbHVlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCJcbiIpOworICAgICAgICAgICAgICAgIHN3aXRjaGVzLmFkZChlbnRyeS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJOb2RlczogIikuYXBwZW5kKHJhY2suc2l6ZSgpKS5hcHBlbmQoIlxuIik7CisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiU3dpdGNoZXM6ICIpLmFwcGVuZChzd2l0Y2hlcy5zaXplKCkpLmFwcGVuZCgiXG4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJObyB0b3BvbG9neSBpbmZvcm1hdGlvbiIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vbmV0d29ya3RvcG9ncmFwaHkvRE5TVG9Td2l0Y2hNYXBwaW5nLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vbmV0d29ya3RvcG9ncmFwaHkvRE5TVG9Td2l0Y2hNYXBwaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJmYmIxOQotLS0gL2Rldi9udWxsCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9uZXR3b3JrdG9wb2dyYXBoeS9ETlNUb1N3aXRjaE1hcHBpbmcuamF2YQpAQCAtMCwwICsxLDUwIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIDxwPgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiA8cD4KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGJhY2t0eXBlLnN0b3JtLm5ldHdvcmt0b3BvZ3JhcGh5OworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiBBbiBpbnRlcmZhY2UgdGhhdCBtdXN0IGJlIGltcGxlbWVudGVkIHRvIGFsbG93IHBsdWdnYWJsZQorICogRE5TLW5hbWUvSVAtYWRkcmVzcyB0byBSYWNrSUQgcmVzb2x2ZXJzLgorICoKKyAqLworcHVibGljIGludGVyZmFjZSBETlNUb1N3aXRjaE1hcHBpbmcgeworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIERFRkFVTFRfUkFDSyA9ICIvZGVmYXVsdC1yYWNrIjsKKworICAgIC8qKgorICAgICAqIFJlc29sdmVzIGEgbGlzdCBvZiBETlMtbmFtZXMvSVAtYWRkcmVzcyBhbmQgcmV0dXJucyBiYWNrIGEgbWFwIG9mIEROUy1uYW1lLT5zd2l0Y2ggaW5mb3JtYXRpb24gKCBuZXR3b3JrIHBhdGhzKS4KKyAgICAgKiBDb25zaWRlciBhbiBlbGVtZW50IGluIHRoZSBhcmd1bWVudCBsaXN0IC0geC55LmNvbS4gVGhlIHN3aXRjaCBpbmZvcm1hdGlvbgorICAgICAqIHRoYXQgaXMgcmV0dXJuZWQgbXVzdCBiZSBhIG5ldHdvcmsgcGF0aCBvZiB0aGUgZm9ybSAvZm9vL3JhY2ssCisgICAgICogd2hlcmUgLyBpcyB0aGUgcm9vdCwgYW5kICdmb28nIGlzIHRoZSBzd2l0Y2ggd2hlcmUgJ3JhY2snIGlzIGNvbm5lY3RlZC4KKyAgICAgKiBOb3RlIHRoZSBob3N0bmFtZS9pcC1hZGRyZXNzIGlzIG5vdCBwYXJ0IG9mIHRoZSByZXR1cm5lZCBwYXRoLgorICAgICAqIFRoZSBuZXR3b3JrIHRvcG9sb2d5IG9mIHRoZSBjbHVzdGVyIHdvdWxkIGRldGVybWluZSB0aGUgbnVtYmVyIG9mCisgICAgICogY29tcG9uZW50cyBpbiB0aGUgbmV0d29yayBwYXRoLgorICAgICAqIDxwLz4KKyAgICAgKgorICAgICAqIElmIGEgbmFtZSBjYW5ub3QgYmUgcmVzb2x2ZWQgdG8gYSByYWNrLCB0aGUgaW1wbGVtZW50YXRpb24KKyAgICAgKiBzaG91bGQgcmV0dXJuIHtERUZBVUxUX1JBQ0t9LiBUaGlzCisgICAgICogaXMgd2hhdCB0aGUgYnVuZGxlZCBpbXBsZW1lbnRhdGlvbnMgZG8sIHRob3VnaCBpdCBpcyBub3QgYSBmb3JtYWwgcmVxdWlyZW1lbnQKKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lcyB0aGUgbGlzdCBvZiBob3N0cyB0byByZXNvbHZlIChjYW4gYmUgZW1wdHkpCisgICAgICogQHJldHVybiBNYXAgb2YgaG9zdHMgdG8gcmVzb2x2ZWQgbmV0d29yayBwYXRocy4KKyAgICAgKiBJZiA8aT5uYW1lczwvaT4gaXMgZW1wdHksIHRoZW4gcmV0dXJuIGVtcHR5IE1hcAorICAgICAqLworICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IHJlc29sdmUoTGlzdDxTdHJpbmc+IG5hbWVzKTsKK30KZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9uZXR3b3JrdG9wb2dyYXBoeS9EZWZhdWx0UmFja0ROU1RvU3dpdGNoTWFwcGluZy5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL25ldHdvcmt0b3BvZ3JhcGh5L0RlZmF1bHRSYWNrRE5TVG9Td2l0Y2hNYXBwaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThlYWM2MAotLS0gL2Rldi9udWxsCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9uZXR3b3JrdG9wb2dyYXBoeS9EZWZhdWx0UmFja0ROU1RvU3dpdGNoTWFwcGluZy5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGJhY2t0eXBlLnN0b3JtLm5ldHdvcmt0b3BvZ3JhcGh5OworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKKworLyoqCisgKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIHtAbGluayBETlNUb1N3aXRjaE1hcHBpbmd9IGludGVyZmFjZQorICogICAgSXQgcmV0dXJucyB0aGUgREVGQVVMVF9SQUNLIGZvciBldmVyeSBob3N0LgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgRGVmYXVsdFJhY2tETlNUb1N3aXRjaE1hcHBpbmcgZXh0ZW5kcyBBYnN0cmFjdEROU1RvU3dpdGNoTWFwcGluZyB7CisKKyAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gbWFwcGluZ0NhY2hlID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPD4oKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNYXA8U3RyaW5nLFN0cmluZz4gcmVzb2x2ZShMaXN0PFN0cmluZz4gbmFtZXMpIHsKKworICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IG0gPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIGlmIChuYW1lcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIC8vbmFtZSBsaXN0IGlzIGVtcHR5LCByZXR1cm4gYW4gZW1wdHkgbWFwCisgICAgICAgICAgICByZXR1cm4gbTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKFN0cmluZyBuYW1lIDogbmFtZXMpIHsKKyAgICAgICAgICAgIG0ucHV0KG5hbWUsIERFRkFVTFRfUkFDSyk7CisgICAgICAgICAgICBtYXBwaW5nQ2FjaGUucHV0KG5hbWUsIERFRkFVTFRfUkFDSyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG07CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJEZWZhdWx0UmFja0ROU1RvU3dpdGNoTWFwcGluZyAoIiArIG1hcHBpbmdDYWNoZS5zaXplKCkgKyAiIG1hcHBpbmdzIGNhY2hlZCkiICsgZHVtcFRvcG9sb2d5KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL25pbWJ1cy9JTGVhZGVyRWxlY3Rvci5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL25pbWJ1cy9JTGVhZGVyRWxlY3Rvci5qYXZhCmluZGV4IGE1NGFlN2UuLjViNTRkNDYgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9uaW1idXMvSUxlYWRlckVsZWN0b3IuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vbmltYnVzL0lMZWFkZXJFbGVjdG9yLmphdmEKQEAgLTEsMTAgKzEsMjMgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCiBwYWNrYWdlIGJhY2t0eXBlLnN0b3JtLm5pbWJ1czsKIAotaW1wb3J0IG9yZy5hcGFjaGUuY3VyYXRvci5mcmFtZXdvcmsuQ3VyYXRvckZyYW1ld29yazsKLQogaW1wb3J0IGphdmEuaW8uQ2xvc2VhYmxlOwotaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOwotaW1wb3J0IGphdmEubmV0LlVua25vd25Ib3N0RXhjZXB0aW9uOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKQEAgLTE1LDcgKzI4LDcgQEAKIAogICAgIC8qKgogICAgICAqIE1ldGhvZCBndWFyYW50ZWVkIHRvIGJlIGNhbGxlZCBhcyBwYXJ0IG9mIGluaXRpYWxpemF0aW9uIG9mIGxlYWRlciBlbGVjdG9yIGluc3RhbmNlLgotICAgICAqIEBwYXJhbSBjb25mCisgICAgICogQHBhcmFtIGNvbmYgY29uZmlndXJhdGlvbgogICAgICAqLwogICAgIHZvaWQgcHJlcGFyZShNYXAgY29uZik7CiAKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9uaW1idXMvSVRvcG9sb2d5QWN0aW9uTm90aWZpZXJQbHVnaW4uamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9uaW1idXMvSVRvcG9sb2d5QWN0aW9uTm90aWZpZXJQbHVnaW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTM5YzA1Ci0tLSAvZGV2L251bGwKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL25pbWJ1cy9JVG9wb2xvZ3lBY3Rpb25Ob3RpZmllclBsdWdpbi5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGJhY2t0eXBlLnN0b3JtLm5pbWJ1czsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogQSBwbHVnaW4gaW50ZXJmYWNlIHRoYXQgZ2V0cyBpbnZva2VkIGFueSB0aW1lIHRoZXJlIGlzIGFuIGFjdGlvbiBmb3IgYSB0b3BvbG9neS4KKyAqLworcHVibGljIGludGVyZmFjZSBJVG9wb2xvZ3lBY3Rpb25Ob3RpZmllclBsdWdpbiB7CisgICAgLyoqCisgICAgICogQ2FsbGVkIG9uY2UgZHVyaW5nIG5pbWJ1cyBpbml0aWFsaXphdGlvbi4KKyAgICAgKiBAcGFyYW0gU3Rvcm1Db25mCisgICAgICovCisgICAgdm9pZCBwcmVwYXJlKE1hcCBTdG9ybUNvbmYpOworCisgICAgLyoqCisgICAgICogV2hlbiBhIG5ldyBhY3Rpb25zIGlzIGV4ZWN1dGVkIGZvciBhIHRvcG9sb2d5LCB0aGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZC4KKyAgICAgKiBAcGFyYW0gdG9wb2xvZ3lOYW1lCisgICAgICogQHBhcmFtIGFjdGlvbgorICAgICAqLworICAgIHZvaWQgbm90aWZ5KFN0cmluZyB0b3BvbG9neU5hbWUsIFN0cmluZyBhY3Rpb24pOworCisgICAgLyoqCisgICAgICogY2FsbGVkIGR1cmluZyBzaHV0ZG93bi4KKyAgICAgKi8KKyAgICB2b2lkIGNsZWFudXAoKTsKK30KZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9uaW1idXMvTmltYnVzSW5mby5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL25pbWJ1cy9OaW1idXNJbmZvLmphdmEKaW5kZXggYmY1NmUyZC4uNTM5ZGY2MiAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL25pbWJ1cy9OaW1idXNJbmZvLmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL25pbWJ1cy9OaW1idXNJbmZvLmphdmEKQEAgLTEsNiArMSwyNSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KIHBhY2thZ2UgYmFja3R5cGUuc3Rvcm0ubmltYnVzOwogCiBpbXBvcnQgYmFja3R5cGUuc3Rvcm0uQ29uZmlnOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKIGltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKIGltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKQEAgLTgsNiArMjcsNyBAQAogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIHB1YmxpYyBjbGFzcyBOaW1idXNJbmZvIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoTmltYnVzSW5mby5jbGFzcyk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFTElNID0gIjoiOwogCiAgICAgcHJpdmF0ZSBTdHJpbmcgaG9zdDsKQEAgLTMyLDYgKzUyLDExIEBACiAgICAgcHVibGljIHN0YXRpYyBOaW1idXNJbmZvIGZyb21Db25mKE1hcCBjb25mKSB7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBTdHJpbmcgaG9zdCA9IEluZXRBZGRyZXNzLmdldExvY2FsSG9zdCgpLmdldENhbm9uaWNhbEhvc3ROYW1lKCk7CisgICAgICAgICAgICBpZiAoY29uZi5jb250YWluc0tleShDb25maWcuU1RPUk1fTE9DQUxfSE9TVE5BTUUpKSB7CisgICAgICAgICAgICAgICAgaG9zdCA9IGNvbmYuZ2V0KENvbmZpZy5TVE9STV9MT0NBTF9IT1NUTkFNRSkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBMT0cuaW5mbygiT3ZlcnJpZGluZyBuaW1idXMgaG9zdCB0byBzdG9ybS5sb2NhbC5ob3N0bmFtZSAtPiB7fSIsIGhvc3QpOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBpbnQgcG9ydCA9IEludGVnZXIucGFyc2VJbnQoY29uZi5nZXQoQ29uZmlnLk5JTUJVU19USFJJRlRfUE9SVCkudG9TdHJpbmcoKSk7CiAgICAgICAgICAgICByZXR1cm4gbmV3IE5pbWJ1c0luZm8oaG9zdCwgcG9ydCwgZmFsc2UpOwogCkBAIC02OSw5ICs5NCw3IEBACiAKICAgICAgICAgaWYgKGlzTGVhZGVyICE9IHRoYXQuaXNMZWFkZXIpIHJldHVybiBmYWxzZTsKICAgICAgICAgaWYgKHBvcnQgIT0gdGhhdC5wb3J0KSByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGlmICghaG9zdC5lcXVhbHModGhhdC5ob3N0KSkgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gaG9zdC5lcXVhbHModGhhdC5ob3N0KTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zY2hlZHVsZXIvQ2x1c3Rlci5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NjaGVkdWxlci9DbHVzdGVyLmphdmEKaW5kZXggZTBjN2NjNy4uZmYyYjIzMyAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NjaGVkdWxlci9DbHVzdGVyLmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NjaGVkdWxlci9DbHVzdGVyLmphdmEKQEAgLTI1LDEyICsyNSwyNiBAQAogaW1wb3J0IGphdmEudXRpbC5NYXA7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIAoraW1wb3J0IGJhY2t0eXBlLnN0b3JtLkNvbmZpZzsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5uZXR3b3JrdG9wb2dyYXBoeS5ETlNUb1N3aXRjaE1hcHBpbmc7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0udXRpbHMuVXRpbHM7CisKIHB1YmxpYyBjbGFzcyBDbHVzdGVyIHsKIAogICAgIC8qKgogICAgICAqIGtleTogc3VwZXJ2aXNvciBpZCwgdmFsdWU6IHN1cGVydmlzb3IgZGV0YWlscwogICAgICAqLwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgU3VwZXJ2aXNvckRldGFpbHM+ICAgc3VwZXJ2aXNvcnM7CisgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdXBlcnZpc29yRGV0YWlscz4gc3VwZXJ2aXNvcnM7CisgICAgLyoqCisgICAgICoga2V5OiBzdXBlcnZpc29yIGlkLCB2YWx1ZTogc3VwZXJ2aXNvcidzIHRvdGFsIGFuZCB1c2VkIHJlc291cmNlcworICAgICAqLworICAgIHByaXZhdGUgTWFwPFN0cmluZywgRG91YmxlW10+IHN1cGVydmlzb3JzUmVzb3VyY2VzOworCisgICAgLyoqCisgICAgICoga2V5OiByYWNrLCB2YWx1ZTogbm9kZXMgaW4gdGhhdCByYWNrCisgICAgICovCisgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IG5ldHdvcmtUb3BvZ3JhcGh5OworCiAgICAgLyoqCiAgICAgICoga2V5OiB0b3BvbG9neUlkLCB2YWx1ZTogdG9wb2xvZ3kncyBjdXJyZW50IGFzc2lnbm1lbnRzLgogICAgICAqLwpAQCAtNDEsMjkgKzU1LDQwIEBACiAgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IHN0YXR1czsKIAogICAgIC8qKgorICAgICAqIGtleSB0b3BvbG9neUlkLCBWYWx1ZTogcmVxdWVzdGVkIGFuZCBhc3NpZ25lZCByZXNvdXJjZXMgKGUuZy4sIG9uLWhlYXAvb2ZmLWhlYXAgbWVtLCBjcHUpIGZvciBlYWNoIHRvcG9sb2d5LgorICAgICAqLworICAgIHByaXZhdGUgTWFwPFN0cmluZywgRG91YmxlW10+IHJlc291cmNlczsKKworICAgIC8qKgogICAgICAqIGEgbWFwIGZyb20gaG9zdG5hbWUgdG8gc3VwZXJ2aXNvciBpZC4KICAgICAgKi8KLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gICAgICAgIGhvc3RUb0lkOwotICAgIAorICAgIHByaXZhdGUgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBob3N0VG9JZDsKKworICAgIHByaXZhdGUgTWFwIGNvbmYgPSBudWxsOworCiAgICAgcHJpdmF0ZSBTZXQ8U3RyaW5nPiBibGFja0xpc3RlZEhvc3RzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwogICAgIHByaXZhdGUgSU5pbWJ1cyBpbmltYnVzOwogCi0gICAgcHVibGljIENsdXN0ZXIoSU5pbWJ1cyBuaW1idXMsIE1hcDxTdHJpbmcsIFN1cGVydmlzb3JEZXRhaWxzPiBzdXBlcnZpc29ycywgTWFwPFN0cmluZywgU2NoZWR1bGVyQXNzaWdubWVudEltcGw+IGFzc2lnbm1lbnRzKXsKKyAgICBwdWJsaWMgQ2x1c3RlcihJTmltYnVzIG5pbWJ1cywgTWFwPFN0cmluZywgU3VwZXJ2aXNvckRldGFpbHM+IHN1cGVydmlzb3JzLCBNYXA8U3RyaW5nLCBTY2hlZHVsZXJBc3NpZ25tZW50SW1wbD4gYXNzaWdubWVudHMsIE1hcCBzdG9ybV9jb25mKXsKICAgICAgICAgdGhpcy5pbmltYnVzID0gbmltYnVzOwogICAgICAgICB0aGlzLnN1cGVydmlzb3JzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdXBlcnZpc29yRGV0YWlscz4oc3VwZXJ2aXNvcnMuc2l6ZSgpKTsKICAgICAgICAgdGhpcy5zdXBlcnZpc29ycy5wdXRBbGwoc3VwZXJ2aXNvcnMpOwogICAgICAgICB0aGlzLmFzc2lnbm1lbnRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTY2hlZHVsZXJBc3NpZ25tZW50SW1wbD4oYXNzaWdubWVudHMuc2l6ZSgpKTsKICAgICAgICAgdGhpcy5hc3NpZ25tZW50cy5wdXRBbGwoYXNzaWdubWVudHMpOwogICAgICAgICB0aGlzLnN0YXR1cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworICAgICAgICB0aGlzLnJlc291cmNlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgRG91YmxlW10+KCk7CisgICAgICAgIHRoaXMuc3VwZXJ2aXNvcnNSZXNvdXJjZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIERvdWJsZVtdPigpOwogICAgICAgICB0aGlzLmhvc3RUb0lkID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+KCk7Ci0gICAgICAgIGZvciAoU3RyaW5nIG5vZGVJZCA6IHN1cGVydmlzb3JzLmtleVNldCgpKSB7Ci0gICAgICAgICAgICBTdXBlcnZpc29yRGV0YWlscyBzdXBlcnZpc29yID0gc3VwZXJ2aXNvcnMuZ2V0KG5vZGVJZCk7CisgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgU3VwZXJ2aXNvckRldGFpbHM+IGVudHJ5IDogc3VwZXJ2aXNvcnMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgU3RyaW5nIG5vZGVJZCA9IGVudHJ5LmdldEtleSgpOworICAgICAgICAgICAgU3VwZXJ2aXNvckRldGFpbHMgc3VwZXJ2aXNvciA9IGVudHJ5LmdldFZhbHVlKCk7CiAgICAgICAgICAgICBTdHJpbmcgaG9zdCA9IHN1cGVydmlzb3IuZ2V0SG9zdCgpOwogICAgICAgICAgICAgaWYgKCF0aGlzLmhvc3RUb0lkLmNvbnRhaW5zS2V5KGhvc3QpKSB7CiAgICAgICAgICAgICAgICAgdGhpcy5ob3N0VG9JZC5wdXQoaG9zdCwgbmV3IEFycmF5TGlzdDxTdHJpbmc+KCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgdGhpcy5ob3N0VG9JZC5nZXQoaG9zdCkuYWRkKG5vZGVJZCk7CiAgICAgICAgIH0KKyAgICAgICAgdGhpcy5jb25mID0gc3Rvcm1fY29uZjsKICAgICB9CiAgICAgCiAgICAgcHVibGljIHZvaWQgc2V0QmxhY2tsaXN0ZWRIb3N0cyhTZXQ8U3RyaW5nPiBob3N0cykgewpAQCAtOTUsMTAgKzEyMCw3IEBACiAgICAgfQogICAgIAogICAgIC8qKgotICAgICAqIEdldHMgYWxsIHRoZSB0b3BvbG9naWVzIHdoaWNoIG5lZWRzIHNjaGVkdWxpbmcuCi0gICAgICogCi0gICAgICogQHBhcmFtIHRvcG9sb2dpZXMKLSAgICAgKiBAcmV0dXJuCisgICAgICogQHJldHVybiBhbGwgdGhlIHRvcG9sb2dpZXMgd2hpY2ggbmVlZHMgc2NoZWR1bGluZy4KICAgICAgKi8KICAgICBwdWJsaWMgTGlzdDxUb3BvbG9neURldGFpbHM+IG5lZWRzU2NoZWR1bGluZ1RvcG9sb2dpZXMoVG9wb2xvZ2llcyB0b3BvbG9naWVzKSB7CiAgICAgICAgIExpc3Q8VG9wb2xvZ3lEZXRhaWxzPiByZXQgPSBuZXcgQXJyYXlMaXN0PFRvcG9sb2d5RGV0YWlscz4oKTsKQEAgLTEyMywxOSArMTQ1LDEyIEBACiAgICAgcHVibGljIGJvb2xlYW4gbmVlZHNTY2hlZHVsaW5nKFRvcG9sb2d5RGV0YWlscyB0b3BvbG9neSkgewogICAgICAgICBpbnQgZGVzaXJlZE51bVdvcmtlcnMgPSB0b3BvbG9neS5nZXROdW1Xb3JrZXJzKCk7CiAgICAgICAgIGludCBhc3NpZ25lZE51bVdvcmtlcnMgPSB0aGlzLmdldEFzc2lnbmVkTnVtV29ya2Vycyh0b3BvbG9neSk7Ci0KLSAgICAgICAgaWYgKGRlc2lyZWROdW1Xb3JrZXJzID4gYXNzaWduZWROdW1Xb3JrZXJzKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0aGlzLmdldFVuYXNzaWduZWRFeGVjdXRvcnModG9wb2xvZ3kpLnNpemUoKSA+IDA7CisgICAgICAgIHJldHVybiBkZXNpcmVkTnVtV29ya2VycyA+IGFzc2lnbmVkTnVtV29ya2VycyB8fCB0aGlzLmdldFVuYXNzaWduZWRFeGVjdXRvcnModG9wb2xvZ3kpLnNpemUoKSA+IDA7CiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyBhIGV4ZWN1dG9yIC0+IGNvbXBvbmVudC1pZCBtYXAgd2hpY2ggbmVlZHMgc2NoZWR1bGluZyBpbiB0aGlzIHRvcG9sb2d5LgotICAgICAqIAogICAgICAqIEBwYXJhbSB0b3BvbG9neQotICAgICAqIEByZXR1cm4KKyAgICAgKiBAcmV0dXJuIGEgZXhlY3V0b3IgLT4gY29tcG9uZW50LWlkIG1hcCB3aGljaCBuZWVkcyBzY2hlZHVsaW5nIGluIHRoaXMgdG9wb2xvZ3kuCiAgICAgICovCiAgICAgcHVibGljIE1hcDxFeGVjdXRvckRldGFpbHMsIFN0cmluZz4gZ2V0TmVlZHNTY2hlZHVsaW5nRXhlY3V0b3JUb0NvbXBvbmVudHMoVG9wb2xvZ3lEZXRhaWxzIHRvcG9sb2d5KSB7CiAgICAgICAgIENvbGxlY3Rpb248RXhlY3V0b3JEZXRhaWxzPiBhbGxFeGVjdXRvcnMgPSBuZXcgSGFzaFNldCh0b3BvbG9neS5nZXRFeGVjdXRvcnMoKSk7CkBAIC0xNTAsMTYgKzE2NSwxNSBAQAogICAgIH0KICAgICAKICAgICAvKioKLSAgICAgKiBHZXRzIGEgY29tcG9uZW50LWlkIC0+IGV4ZWN1dG9ycyBtYXAgd2hpY2ggbmVlZHMgc2NoZWR1bGluZyBpbiB0aGlzIHRvcG9sb2d5LgotICAgICAqIAogICAgICAqIEBwYXJhbSB0b3BvbG9neQotICAgICAqIEByZXR1cm4KKyAgICAgKiBAcmV0dXJuIGEgY29tcG9uZW50LWlkIC0+IGV4ZWN1dG9ycyBtYXAgd2hpY2ggbmVlZHMgc2NoZWR1bGluZyBpbiB0aGlzIHRvcG9sb2d5LgogICAgICAqLwogICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBMaXN0PEV4ZWN1dG9yRGV0YWlscz4+IGdldE5lZWRzU2NoZWR1bGluZ0NvbXBvbmVudFRvRXhlY3V0b3JzKFRvcG9sb2d5RGV0YWlscyB0b3BvbG9neSkgewogICAgICAgICBNYXA8RXhlY3V0b3JEZXRhaWxzLCBTdHJpbmc+IGV4ZWN1dG9yVG9Db21wb25lbnRzID0gdGhpcy5nZXROZWVkc1NjaGVkdWxpbmdFeGVjdXRvclRvQ29tcG9uZW50cyh0b3BvbG9neSk7CiAgICAgICAgIE1hcDxTdHJpbmcsIExpc3Q8RXhlY3V0b3JEZXRhaWxzPj4gY29tcG9uZW50VG9FeGVjdXRvcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8RXhlY3V0b3JEZXRhaWxzPj4oKTsKLSAgICAgICAgZm9yIChFeGVjdXRvckRldGFpbHMgZXhlY3V0b3IgOiBleGVjdXRvclRvQ29tcG9uZW50cy5rZXlTZXQoKSkgewotICAgICAgICAgICAgU3RyaW5nIGNvbXBvbmVudCA9IGV4ZWN1dG9yVG9Db21wb25lbnRzLmdldChleGVjdXRvcik7CisgICAgICAgIGZvciAoTWFwLkVudHJ5PEV4ZWN1dG9yRGV0YWlscywgU3RyaW5nPiBlbnRyeSA6IGV4ZWN1dG9yVG9Db21wb25lbnRzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIEV4ZWN1dG9yRGV0YWlscyBleGVjdXRvciA9IGVudHJ5LmdldEtleSgpOworICAgICAgICAgICAgU3RyaW5nIGNvbXBvbmVudCA9IGVudHJ5LmdldFZhbHVlKCk7CiAgICAgICAgICAgICBpZiAoIWNvbXBvbmVudFRvRXhlY3V0b3JzLmNvbnRhaW5zS2V5KGNvbXBvbmVudCkpIHsKICAgICAgICAgICAgICAgICBjb21wb25lbnRUb0V4ZWN1dG9ycy5wdXQoY29tcG9uZW50LCBuZXcgQXJyYXlMaXN0PEV4ZWN1dG9yRGV0YWlscz4oKSk7CiAgICAgICAgICAgICB9CkBAIC0xNzMsOSArMTg3LDYgQEAKIAogICAgIC8qKgogICAgICAqIEdldCBhbGwgdGhlIHVzZWQgcG9ydHMgb2YgdGhpcyBzdXBlcnZpc29yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjbHVzdGVyCi0gICAgICogQHJldHVybgogICAgICAqLwogICAgIHB1YmxpYyBTZXQ8SW50ZWdlcj4gZ2V0VXNlZFBvcnRzKFN1cGVydmlzb3JEZXRhaWxzIHN1cGVydmlzb3IpIHsKICAgICAgICAgTWFwPFN0cmluZywgU2NoZWR1bGVyQXNzaWdubWVudD4gYXNzaWdubWVudHMgPSB0aGlzLmdldEFzc2lnbm1lbnRzKCk7CkBAIC0xOTQsOSArMjA1LDYgQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgYXZhaWxhYmxlIHBvcnRzIG9mIHRoaXMgc3VwZXJ2aXNvci4KLSAgICAgKiAKLSAgICAgKiBAcGFyYW0gY2x1c3RlcgotICAgICAqIEByZXR1cm4KICAgICAgKi8KICAgICBwdWJsaWMgU2V0PEludGVnZXI+IGdldEF2YWlsYWJsZVBvcnRzKFN1cGVydmlzb3JEZXRhaWxzIHN1cGVydmlzb3IpIHsKICAgICAgICAgU2V0PEludGVnZXI+IHVzZWRQb3J0cyA9IHRoaXMuZ2V0VXNlZFBvcnRzKHN1cGVydmlzb3IpOwpAQCAtMjE1LDkgKzIyMyw2IEBACiAKICAgICAvKioKICAgICAgKiBSZXR1cm4gYWxsIHRoZSBhdmFpbGFibGUgc2xvdHMgb24gdGhpcyBzdXBlcnZpc29yLgotICAgICAqIAotICAgICAqIEBwYXJhbSBjbHVzdGVyCi0gICAgICogQHJldHVybgogICAgICAqLwogICAgIHB1YmxpYyBMaXN0PFdvcmtlclNsb3Q+IGdldEF2YWlsYWJsZVNsb3RzKFN1cGVydmlzb3JEZXRhaWxzIHN1cGVydmlzb3IpIHsKICAgICAgICAgU2V0PEludGVnZXI+IHBvcnRzID0gdGhpcy5nZXRBdmFpbGFibGVQb3J0cyhzdXBlcnZpc29yKTsKQEAgLTI2MSwyMCArMjY2LDE3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIHdvcmtlcnMgYXNzaWduZWQgdG8gdGhpcyB0b3BvbG9neS4KLSAgICAgKiAKICAgICAgKiBAcGFyYW0gdG9wb2xvZ3kKLSAgICAgKiBAcmV0dXJuCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHdvcmtlcnMgYXNzaWduZWQgdG8gdGhpcyB0b3BvbG9neS4KICAgICAgKi8KICAgICBwdWJsaWMgaW50IGdldEFzc2lnbmVkTnVtV29ya2VycyhUb3BvbG9neURldGFpbHMgdG9wb2xvZ3kpIHsKLSAgICAgICAgU2NoZWR1bGVyQXNzaWdubWVudCBhc3NpZ25tZW50ID0gdGhpcy5nZXRBc3NpZ25tZW50QnlJZCh0b3BvbG9neS5nZXRJZCgpKTsKLSAgICAgICAgaWYgKHRvcG9sb2d5ID09IG51bGwgfHwgYXNzaWdubWVudCA9PSBudWxsKSB7CisgICAgICAgIFNjaGVkdWxlckFzc2lnbm1lbnQgYXNzaWdubWVudCA9IHRvcG9sb2d5ICE9IG51bGwgPyB0aGlzLmdldEFzc2lnbm1lbnRCeUlkKHRvcG9sb2d5LmdldElkKCkpIDogbnVsbDsKKyAgICAgICAgaWYgKGFzc2lnbm1lbnQgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KIAogICAgICAgICBTZXQ8V29ya2VyU2xvdD4gc2xvdHMgPSBuZXcgSGFzaFNldDxXb3JrZXJTbG90PigpOwogICAgICAgICBzbG90cy5hZGRBbGwoYXNzaWdubWVudC5nZXRFeGVjdXRvclRvU2xvdCgpLnZhbHVlcygpKTsKLQogICAgICAgICByZXR1cm4gc2xvdHMuc2l6ZSgpOwogICAgIH0KIApAQCAtMzA0LDkgKzMwNiw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogR2V0cyBhbGwgdGhlIGF2YWlsYWJsZSBzbG90cyBpbiB0aGUgY2x1c3Rlci4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuCisgICAgICogQHJldHVybiBhbGwgdGhlIGF2YWlsYWJsZSB3b3JrZXIgc2xvdHMgaW4gdGhlIGNsdXN0ZXIuCiAgICAgICovCiAgICAgcHVibGljIExpc3Q8V29ya2VyU2xvdD4gZ2V0QXZhaWxhYmxlU2xvdHMoKSB7CiAgICAgICAgIExpc3Q8V29ya2VyU2xvdD4gc2xvdHMgPSBuZXcgQXJyYXlMaXN0PFdvcmtlclNsb3Q+KCk7CkBAIC0zNTQsMTAgKzM1NCw4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogQ2hlY2tzIHRoZSBzcGVjaWZpZWQgc2xvdCBpcyBvY2N1cGllZC4KLSAgICAgKiAKICAgICAgKiBAcGFyYW0gc2xvdCB0aGUgc2xvdCBiZSB0byBjaGVja2VkLgotICAgICAqIEByZXR1cm4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBzbG90IGlzIG9jY3VwaWVkLgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzU2xvdE9jY3VwaWVkKFdvcmtlclNsb3Qgc2xvdCkgewogICAgICAgICBmb3IgKFNjaGVkdWxlckFzc2lnbm1lbnQgYXNzaWdubWVudCA6IHRoaXMuYXNzaWdubWVudHMudmFsdWVzKCkpIHsKQEAgLTQyNyw3ICs0MjUsNyBAQAogICAgICAgICBmb3IgKFN0cmluZyB0b3BvbG9neUlkIDogdGhpcy5hc3NpZ25tZW50cy5rZXlTZXQoKSkgewogICAgICAgICAgICAgcmV0LnB1dCh0b3BvbG9neUlkLCB0aGlzLmFzc2lnbm1lbnRzLmdldCh0b3BvbG9neUlkKSk7CiAgICAgICAgIH0KLSAgICAgICAgCisKICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiAKQEAgLTQzOCw2ICs0MzYsMTMwIEBACiAgICAgICAgIHJldHVybiB0aGlzLnN1cGVydmlzb3JzOwogICAgIH0KIAorICAgIC8qCisgICAgKiBOb3RlOiBNYWtlIHN1cmUgdGhlIHByb3BlciBjb25mIHdhcyBwYXNzZWQgaW50byB0aGUgQ2x1c3RlciBjb25zdHJ1Y3RvciBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uCisgICAgKiBJdCB0cmllcyB0byBsb2FkIHRoZSBwcm9wZXIgbmV0d29yayB0b3BvZ3JhcGh5IGRldGVjdGlvbiBwbHVnaW4gc3BlY2lmaWVkIGluIHRoZSBjb25maWcuCisgICAgKi8KKyAgICBwdWJsaWMgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBnZXROZXR3b3JrVG9wb2dyYXBoeSgpIHsKKyAgICAgICAgaWYgKG5ldHdvcmtUb3BvZ3JhcGh5ID09IG51bGwpIHsKKyAgICAgICAgICAgIG5ldHdvcmtUb3BvZ3JhcGh5ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+KCk7CisgICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBzdXBlcnZpc29ySG9zdE5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgICAgICAgICBmb3IgKFN1cGVydmlzb3JEZXRhaWxzIHMgOiBzdXBlcnZpc29ycy52YWx1ZXMoKSkgeworICAgICAgICAgICAgICAgIHN1cGVydmlzb3JIb3N0TmFtZXMuYWRkKHMuZ2V0SG9zdCgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nIGNsYXp6ID0gKFN0cmluZykgY29uZi5nZXQoQ29uZmlnLlNUT1JNX05FVFdPUktfVE9QT0dSQVBIWV9QTFVHSU4pOworICAgICAgICAgICAgRE5TVG9Td2l0Y2hNYXBwaW5nIHRvcG9ncmFwaHlNYXBwZXIgPSAoRE5TVG9Td2l0Y2hNYXBwaW5nKSBVdGlscy5uZXdJbnN0YW5jZShjbGF6eik7CisKKyAgICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcmVzb2x2ZWRTdXBlclZpc29ycyA9IHRvcG9ncmFwaHlNYXBwZXIucmVzb2x2ZShzdXBlcnZpc29ySG9zdE5hbWVzKTsKKyAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBlbnRyeSA6IHJlc29sdmVkU3VwZXJWaXNvcnMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBob3N0TmFtZSA9IGVudHJ5LmdldEtleSgpOworICAgICAgICAgICAgICAgIFN0cmluZyByYWNrID0gZW50cnkuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gbm9kZXNGb3JSYWNrID0gbmV0d29ya1RvcG9ncmFwaHkuZ2V0KHJhY2spOworICAgICAgICAgICAgICAgIGlmIChub2Rlc0ZvclJhY2sgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBub2Rlc0ZvclJhY2sgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgICAgICAgICAgICAgbmV0d29ya1RvcG9ncmFwaHkucHV0KHJhY2ssIG5vZGVzRm9yUmFjayk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5vZGVzRm9yUmFjay5hZGQoaG9zdE5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXR3b3JrVG9wb2dyYXBoeTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBnZXRTdHJpbmdGcm9tU3RyaW5nTGlzdChPYmplY3QgbykgeworICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgZm9yIChTdHJpbmcgcyA6IChMaXN0PFN0cmluZz4pIG8pIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZChzKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiICIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KKworICAgIC8qCisgICAgKiBHZXQgaGVhcCBtZW1vcnkgdXNhZ2UgZm9yIGEgd29ya2VyJ3MgbWFpbiBwcm9jZXNzIGFuZCBsb2d3cml0ZXIgcHJvY2VzcworICAgICogKi8KKyAgICBwcml2YXRlIERvdWJsZSBnZXRBc3NpZ25lZE1lbW9yeUZvclNsb3QoTWFwIHRvcENvbmYpIHsKKyAgICAgICAgRG91YmxlIHRvdGFsV29ya2VyTWVtb3J5ID0gMC4wOworCisgICAgICAgIFN0cmluZyB0b3BvbG9neVdvcmtlckNoaWxkb3B0cyA9IG51bGw7CisgICAgICAgIGlmICh0b3BDb25mLmdldChDb25maWcuVE9QT0xPR1lfV09SS0VSX0NISUxET1BUUykgaW5zdGFuY2VvZiBMaXN0KSB7CisgICAgICAgICAgICB0b3BvbG9neVdvcmtlckNoaWxkb3B0cyA9IGdldFN0cmluZ0Zyb21TdHJpbmdMaXN0KHRvcENvbmYuZ2V0KENvbmZpZy5UT1BPTE9HWV9XT1JLRVJfQ0hJTERPUFRTKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0b3BvbG9neVdvcmtlckNoaWxkb3B0cyA9IFV0aWxzLmdldFN0cmluZyh0b3BDb25mLmdldChDb25maWcuVE9QT0xPR1lfV09SS0VSX0NISUxET1BUUyksIG51bGwpOworICAgICAgICB9CisgICAgICAgIERvdWJsZSBtZW1Ub3BvbG9neVdvcmtlckNoaWxkb3B0cyA9IFV0aWxzLnBhcnNlSnZtSGVhcE1lbUJ5Q2hpbGRPcHRzKHRvcG9sb2d5V29ya2VyQ2hpbGRvcHRzLCBudWxsKTsKKworICAgICAgICBTdHJpbmcgd29ya2VyQ2hpbGRvcHRzID0gbnVsbDsKKyAgICAgICAgaWYgKHRvcENvbmYuZ2V0KENvbmZpZy5XT1JLRVJfQ0hJTERPUFRTKSBpbnN0YW5jZW9mIExpc3QpIHsKKyAgICAgICAgICAgIHdvcmtlckNoaWxkb3B0cyA9IGdldFN0cmluZ0Zyb21TdHJpbmdMaXN0KHRvcENvbmYuZ2V0KENvbmZpZy5XT1JLRVJfQ0hJTERPUFRTKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3b3JrZXJDaGlsZG9wdHMgPSBVdGlscy5nZXRTdHJpbmcodG9wQ29uZi5nZXQoQ29uZmlnLldPUktFUl9DSElMRE9QVFMpLCBudWxsKTsKKyAgICAgICAgfQorICAgICAgICBEb3VibGUgbWVtV29ya2VyQ2hpbGRvcHRzID0gVXRpbHMucGFyc2VKdm1IZWFwTWVtQnlDaGlsZE9wdHMod29ya2VyQ2hpbGRvcHRzLCBudWxsKTsKKworICAgICAgICBpZiAobWVtVG9wb2xvZ3lXb3JrZXJDaGlsZG9wdHMgIT0gbnVsbCkgeworICAgICAgICAgICAgdG90YWxXb3JrZXJNZW1vcnkgKz0gbWVtVG9wb2xvZ3lXb3JrZXJDaGlsZG9wdHM7CisgICAgICAgIH0gZWxzZSBpZiAobWVtV29ya2VyQ2hpbGRvcHRzICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRvdGFsV29ya2VyTWVtb3J5ICs9IG1lbVdvcmtlckNoaWxkb3B0czsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRvdGFsV29ya2VyTWVtb3J5ICs9IFV0aWxzLmdldEludCh0b3BDb25mLmdldChDb25maWcuV09SS0VSX0hFQVBfTUVNT1JZX01CKSk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgdG9wb1dvcmtlckx3Q2hpbGRvcHRzID0gbnVsbDsKKyAgICAgICAgaWYgKHRvcENvbmYuZ2V0KENvbmZpZy5UT1BPTE9HWV9XT1JLRVJfTE9HV1JJVEVSX0NISUxET1BUUykgaW5zdGFuY2VvZiBMaXN0KSB7CisgICAgICAgICAgICB0b3BvV29ya2VyTHdDaGlsZG9wdHMgPSBnZXRTdHJpbmdGcm9tU3RyaW5nTGlzdCh0b3BDb25mLmdldChDb25maWcuVE9QT0xPR1lfV09SS0VSX0xPR1dSSVRFUl9DSElMRE9QVFMpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRvcG9Xb3JrZXJMd0NoaWxkb3B0cyA9IFV0aWxzLmdldFN0cmluZyh0b3BDb25mLmdldChDb25maWcuVE9QT0xPR1lfV09SS0VSX0xPR1dSSVRFUl9DSElMRE9QVFMpLCBudWxsKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodG9wb1dvcmtlckx3Q2hpbGRvcHRzICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRvdGFsV29ya2VyTWVtb3J5ICs9IFV0aWxzLnBhcnNlSnZtSGVhcE1lbUJ5Q2hpbGRPcHRzKHRvcG9Xb3JrZXJMd0NoaWxkb3B0cywgMC4wKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdG90YWxXb3JrZXJNZW1vcnk7CisgICAgfQorCisgICAgLyoKKyAgICAqIFVwZGF0ZSBtZW1vcnkgdXNhZ2UgZm9yIGVhY2ggdG9wb2xvZ3kgYW5kIGVhY2ggc3VwZXJ2aXNvciBub2RlIGFmdGVyIGV2ZXJ5IHJvdW5kIG9mIHNjaGVkdWxpbmcKKyAgICAqICovCisgICAgcHVibGljIHZvaWQgdXBkYXRlQXNzaWduZWRNZW1vcnlGb3JUb3BvbG9neUFuZFN1cGVydmlzb3IoVG9wb2xvZ2llcyB0b3BvbG9naWVzKSB7CisgICAgICAgIE1hcDxTdHJpbmcsIERvdWJsZT4gc3VwZXJ2aXNvclRvQXNzaWduZWRNZW0gPSBuZXcgSGFzaE1hcDxTdHJpbmcsIERvdWJsZT4oKTsKKworICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFNjaGVkdWxlckFzc2lnbm1lbnQ+IGVudHJ5IDogdGhpcy5nZXRBc3NpZ25tZW50cygpLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIFN0cmluZyB0b3BJZCA9IGVudHJ5LmdldFZhbHVlKCkuZ2V0VG9wb2xvZ3lJZCgpOworICAgICAgICAgICAgTWFwIHRvcENvbmYgPSB0b3BvbG9naWVzLmdldEJ5SWQodG9wSWQpLmdldENvbmYoKTsKKyAgICAgICAgICAgIERvdWJsZSBhc3NpZ25lZE1lbUZvclRvcG9sb2d5ID0gMC4wOworICAgICAgICAgICAgRG91YmxlIGFzc2lnbmVkTWVtUGVyU2xvdCA9IGdldEFzc2lnbmVkTWVtb3J5Rm9yU2xvdCh0b3BDb25mKTsKKyAgICAgICAgICAgIGZvciAoV29ya2VyU2xvdCB3czogZW50cnkuZ2V0VmFsdWUoKS5nZXRTbG90cygpKSB7CisgICAgICAgICAgICAgICAgYXNzaWduZWRNZW1Gb3JUb3BvbG9neSArPSBhc3NpZ25lZE1lbVBlclNsb3Q7CisgICAgICAgICAgICAgICAgU3RyaW5nIG5vZGVJZCA9IHdzLmdldE5vZGVJZCgpOworICAgICAgICAgICAgICAgIGlmIChzdXBlcnZpc29yVG9Bc3NpZ25lZE1lbS5jb250YWluc0tleShub2RlSWQpKSB7CisgICAgICAgICAgICAgICAgICAgIHN1cGVydmlzb3JUb0Fzc2lnbmVkTWVtLnB1dChub2RlSWQsIHN1cGVydmlzb3JUb0Fzc2lnbmVkTWVtLmdldChub2RlSWQpICsgYXNzaWduZWRNZW1QZXJTbG90KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzdXBlcnZpc29yVG9Bc3NpZ25lZE1lbS5wdXQobm9kZUlkLCBhc3NpZ25lZE1lbVBlclNsb3QpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0aGlzLmdldFJlc291cmNlc01hcCgpLmNvbnRhaW5zS2V5KHRvcElkKSkgeworICAgICAgICAgICAgICAgIERvdWJsZVtdIHRvcG9fcmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzTWFwKCkuZ2V0KHRvcElkKTsKKyAgICAgICAgICAgICAgICB0b3BvX3Jlc291cmNlc1szXSA9IGFzc2lnbmVkTWVtRm9yVG9wb2xvZ3k7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIERvdWJsZVtdIHRvcG9fcmVzb3VyY2VzID0gezAuMCwgMC4wLCAwLjAsIDAuMCwgMC4wLCAwLjB9OworICAgICAgICAgICAgICAgIHRvcG9fcmVzb3VyY2VzWzNdID0gYXNzaWduZWRNZW1Gb3JUb3BvbG9neTsKKyAgICAgICAgICAgICAgICB0aGlzLnNldFJlc291cmNlcyh0b3BJZCwgdG9wb19yZXNvdXJjZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBEb3VibGU+IGVudHJ5IDogc3VwZXJ2aXNvclRvQXNzaWduZWRNZW0uZW50cnlTZXQoKSkgeworICAgICAgICAgICAgU3RyaW5nIG5vZGVJZCA9IGVudHJ5LmdldEtleSgpOworICAgICAgICAgICAgaWYgKHRoaXMuc3VwZXJ2aXNvcnNSZXNvdXJjZXMuY29udGFpbnNLZXkobm9kZUlkKSkgeworICAgICAgICAgICAgICAgIERvdWJsZVtdIHN1cGVydmlzb3JfcmVzb3VyY2VzID0gc3VwZXJ2aXNvcnNSZXNvdXJjZXMuZ2V0KG5vZGVJZCk7CisgICAgICAgICAgICAgICAgc3VwZXJ2aXNvcl9yZXNvdXJjZXNbMl0gPSBlbnRyeS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBEb3VibGVbXSBzdXBlcnZpc29yX3Jlc291cmNlcyA9IHswLjAsIDAuMCwgMC4wLCAwLjB9OworICAgICAgICAgICAgICAgIHN1cGVydmlzb3JfcmVzb3VyY2VzWzJdID0gZW50cnkuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgICAgICB0aGlzLnN1cGVydmlzb3JzUmVzb3VyY2VzLnB1dChub2RlSWQsIHN1cGVydmlzb3JfcmVzb3VyY2VzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIHB1YmxpYyB2b2lkIHNldFN0YXR1cyhTdHJpbmcgdG9wb2xvZ3lJZCwgU3RyaW5nIHN0YXR1cykgewogICAgICAgICB0aGlzLnN0YXR1cy5wdXQodG9wb2xvZ3lJZCwgc3RhdHVzKTsKICAgICB9CkBAIC00NDUsNCArNTY3LDI0IEBACiAgICAgcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0U3RhdHVzTWFwKCkgewogICAgICAgICByZXR1cm4gdGhpcy5zdGF0dXM7CiAgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2VzKFN0cmluZyB0b3BvbG9neUlkLCBEb3VibGVbXSByZXNvdXJjZXMpIHsKKyAgICAgICAgdGhpcy5yZXNvdXJjZXMucHV0KHRvcG9sb2d5SWQsIHJlc291cmNlcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2VzTWFwKE1hcDxTdHJpbmcsIERvdWJsZVtdPiB0b3BvbG9naWVzX3Jlc291cmNlcykgeworICAgICAgICB0aGlzLnJlc291cmNlcy5wdXRBbGwodG9wb2xvZ2llc19yZXNvdXJjZXMpOworICAgIH0KKworICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBEb3VibGVbXT4gZ2V0UmVzb3VyY2VzTWFwKCkgeworICAgICAgICByZXR1cm4gdGhpcy5yZXNvdXJjZXM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3VwZXJ2aXNvcnNSZXNvdXJjZXNNYXAoTWFwPFN0cmluZywgRG91YmxlW10+IHN1cGVydmlzb3JzX3Jlc291cmNlcykgeworICAgICAgICB0aGlzLnN1cGVydmlzb3JzUmVzb3VyY2VzLnB1dEFsbChzdXBlcnZpc29yc19yZXNvdXJjZXMpOworICAgIH0KKworICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBEb3VibGVbXT4gZ2V0U3VwZXJ2aXNvcnNSZXNvdXJjZXNNYXAoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnN1cGVydmlzb3JzUmVzb3VyY2VzOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zY2hlZHVsZXIvU2NoZWR1bGVyQXNzaWdubWVudEltcGwuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zY2hlZHVsZXIvU2NoZWR1bGVyQXNzaWdubWVudEltcGwuamF2YQppbmRleCAwOGFmNGI3Li5lMDZhYmY4IDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2NoZWR1bGVyL1NjaGVkdWxlckFzc2lnbm1lbnRJbXBsLmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NjaGVkdWxlci9TY2hlZHVsZXJBc3NpZ25tZW50SW1wbC5qYXZhCkBAIC0zOCw3ICszOCw3IEBACiAgICAgCiAgICAgcHVibGljIFNjaGVkdWxlckFzc2lnbm1lbnRJbXBsKFN0cmluZyB0b3BvbG9neUlkLCBNYXA8RXhlY3V0b3JEZXRhaWxzLCBXb3JrZXJTbG90PiBleGVjdXRvclRvU2xvdHMpIHsKICAgICAgICAgdGhpcy50b3BvbG9neUlkID0gdG9wb2xvZ3lJZDsKLSAgICAgICAgdGhpcy5leGVjdXRvclRvU2xvdCA9IG5ldyBIYXNoTWFwPEV4ZWN1dG9yRGV0YWlscywgV29ya2VyU2xvdD4oMCk7CisgICAgICAgIHRoaXMuZXhlY3V0b3JUb1Nsb3QgPSBuZXcgSGFzaE1hcDw+KDApOwogICAgICAgICBpZiAoZXhlY3V0b3JUb1Nsb3RzICE9IG51bGwpIHsKICAgICAgICAgICAgIHRoaXMuZXhlY3V0b3JUb1Nsb3QucHV0QWxsKGV4ZWN1dG9yVG9TbG90cyk7CiAgICAgICAgIH0KQEAgLTQ2LDEzICs0NiwxMSBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFNldDxXb3JrZXJTbG90PiBnZXRTbG90cygpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBIYXNoU2V0KGV4ZWN1dG9yVG9TbG90LnZhbHVlcygpKTsKKyAgICAgICAgcmV0dXJuIG5ldyBIYXNoU2V0PD4oZXhlY3V0b3JUb1Nsb3QudmFsdWVzKCkpOwogICAgIH0gICAgCiAgICAgCiAgICAgLyoqCiAgICAgICogQXNzaWduIHRoZSBzbG90IHRvIGV4ZWN1dG9ycy4KLSAgICAgKiBAcGFyYW0gc2xvdAotICAgICAqIEBwYXJhbSBleGVjdXRvcnMKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBhc3NpZ24oV29ya2VyU2xvdCBzbG90LCBDb2xsZWN0aW9uPEV4ZWN1dG9yRGV0YWlscz4gZXhlY3V0b3JzKSB7CiAgICAgICAgIGZvciAoRXhlY3V0b3JEZXRhaWxzIGV4ZWN1dG9yIDogZXhlY3V0b3JzKSB7CkBAIC02MiwxMCArNjAsOSBAQAogICAgIAogICAgIC8qKgogICAgICAqIFJlbGVhc2UgdGhlIHNsb3Qgb2NjdXBpZWQgYnkgdGhpcyBhc3NpZ25tZW50LgotICAgICAqIEBwYXJhbSBzbG90CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgdW5hc3NpZ25CeVNsb3QoV29ya2VyU2xvdCBzbG90KSB7Ci0gICAgICAgIExpc3Q8RXhlY3V0b3JEZXRhaWxzPiBleGVjdXRvcnMgPSBuZXcgQXJyYXlMaXN0PEV4ZWN1dG9yRGV0YWlscz4oKTsKKyAgICAgICAgTGlzdDxFeGVjdXRvckRldGFpbHM+IGV4ZWN1dG9ycyA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgICBmb3IgKEV4ZWN1dG9yRGV0YWlscyBleGVjdXRvciA6IHRoaXMuZXhlY3V0b3JUb1Nsb3Qua2V5U2V0KCkpIHsKICAgICAgICAgICAgIFdvcmtlclNsb3Qgd3MgPSB0aGlzLmV4ZWN1dG9yVG9TbG90LmdldChleGVjdXRvcik7CiAgICAgICAgICAgICBpZiAod3MuZXF1YWxzKHNsb3QpKSB7CkBAIC04MCw5ICs3Nyw4IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogRG9lcyB0aGlzIHNsb3Qgb2NjdXBpZWQgYnkgdGhpcyBhc3NpZ25tZW50PwogICAgICAqIEBwYXJhbSBzbG90Ci0gICAgICogQHJldHVybgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBzbG90IGlzIG9jY3VwaWVkIGJ5IHRoaXMgYXNzaWdubWVudAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzU2xvdE9jY3VwaWVkKFdvcmtlclNsb3Qgc2xvdCkgewogICAgICAgICByZXR1cm4gdGhpcy5leGVjdXRvclRvU2xvdC5jb250YWluc1ZhbHVlKHNsb3QpOwpAQCAtMTAxLDggKzk3LDcgQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGV4ZWN1dG9ycyBjb3ZlcmVkIGJ5IHRoaXMgYXNzaWdubWVudHMKLSAgICAgKiBAcmV0dXJuCisgICAgICogQHJldHVybiB0aGUgZXhlY3V0b3JzIGNvdmVyZWQgYnkgdGhpcyBhc3NpZ25tZW50cwogICAgICAqLwogICAgIHB1YmxpYyBTZXQ8RXhlY3V0b3JEZXRhaWxzPiBnZXRFeGVjdXRvcnMoKSB7CiAgICAgICAgIHJldHVybiB0aGlzLmV4ZWN1dG9yVG9TbG90LmtleVNldCgpOwpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NjaGVkdWxlci9TdXBlcnZpc29yRGV0YWlscy5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NjaGVkdWxlci9TdXBlcnZpc29yRGV0YWlscy5qYXZhCmluZGV4IDc0OTdmMjYuLmE3NDhlMTEgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zY2hlZHVsZXIvU3VwZXJ2aXNvckRldGFpbHMuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2NoZWR1bGVyL1N1cGVydmlzb3JEZXRhaWxzLmphdmEKQEAgLTIwLDggKzIwLDE0IEBACiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgYmFja3R5cGUuc3Rvcm0uQ29uZmlnOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKIHB1YmxpYyBjbGFzcyBTdXBlcnZpc29yRGV0YWlscyB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFN1cGVydmlzb3JEZXRhaWxzLmNsYXNzKTsKIAogICAgIFN0cmluZyBpZDsKICAgICAvKioKQEAgLTM3LDI5ICs0Myw1MCBAQAogICAgICAqIGFsbCB0aGUgcG9ydHMgb2YgdGhlIHN1cGVydmlzb3IKICAgICAgKi8KICAgICBTZXQ8SW50ZWdlcj4gYWxsUG9ydHM7CisgICAgLyoqCisgICAgICogTWFwIGNvbnRhaW5pbmcgYSBtYW5pZmVzdCBvZiByZXNvdXJjZXMgZm9yIHRoZSBub2RlIHRoZSBzdXBlcnZpc29yIHJlc2lkZXMKKyAgICAgKi8KKyAgICBwcml2YXRlIE1hcDxTdHJpbmcsIERvdWJsZT4gX3RvdGFsX3Jlc291cmNlczsKIAotICAgIHB1YmxpYyBTdXBlcnZpc29yRGV0YWlscyhTdHJpbmcgaWQsIE9iamVjdCBtZXRhKXsKLSAgICAgICAgdGhpcy5pZCA9IGlkOwotICAgICAgICB0aGlzLm1ldGEgPSBtZXRhOwotICAgICAgICBhbGxQb3J0cyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdXBlcnZpc29yRGV0YWlscyhTdHJpbmcgaWQsIE9iamVjdCBtZXRhLCBDb2xsZWN0aW9uPE51bWJlcj4gYWxsUG9ydHMpewotICAgICAgICB0aGlzLmlkID0gaWQ7Ci0gICAgICAgIHRoaXMubWV0YSA9IG1ldGE7Ci0gICAgICAgIHNldEFsbFBvcnRzKGFsbFBvcnRzKTsKLSAgICB9CisgICAgcHVibGljIFN1cGVydmlzb3JEZXRhaWxzKFN0cmluZyBpZCwgU3RyaW5nIGhvc3QsIE9iamVjdCBtZXRhLCBPYmplY3Qgc2NoZWR1bGVyTWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbjxOdW1iZXI+IGFsbFBvcnRzLCBNYXA8U3RyaW5nLCBEb3VibGU+IHRvdGFsX3Jlc291cmNlcyl7CiAKLSAgICBwdWJsaWMgU3VwZXJ2aXNvckRldGFpbHMoU3RyaW5nIGlkLCBTdHJpbmcgaG9zdCwgT2JqZWN0IHNjaGVkdWxlck1ldGEsIENvbGxlY3Rpb248TnVtYmVyPiBhbGxQb3J0cyl7CiAgICAgICAgIHRoaXMuaWQgPSBpZDsKICAgICAgICAgdGhpcy5ob3N0ID0gaG9zdDsKKyAgICAgICAgdGhpcy5tZXRhID0gbWV0YTsKICAgICAgICAgdGhpcy5zY2hlZHVsZXJNZXRhID0gc2NoZWR1bGVyTWV0YTsKKyAgICAgICAgaWYoYWxsUG9ydHMhPW51bGwpIHsKKyAgICAgICAgICAgIHNldEFsbFBvcnRzKGFsbFBvcnRzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRoaXMuYWxsUG9ydHMgPSBuZXcgSGFzaFNldDw+KCk7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5fdG90YWxfcmVzb3VyY2VzID0gdG90YWxfcmVzb3VyY2VzOworICAgICAgICBMT0cuZGVidWcoIkNyZWF0aW5nIGEgbmV3IHN1cGVydmlzb3IgKHt9LXt9KSB3aXRoIHJlc291cmNlczoge30iLCB0aGlzLmhvc3QsIHRoaXMuaWQsIHRvdGFsX3Jlc291cmNlcyk7CisgICAgfQogCi0gICAgICAgIHNldEFsbFBvcnRzKGFsbFBvcnRzKTsKKyAgICBwdWJsaWMgU3VwZXJ2aXNvckRldGFpbHMoU3RyaW5nIGlkLCBPYmplY3QgbWV0YSl7CisgICAgICAgIHRoaXMoaWQsIG51bGwsIG1ldGEsIG51bGwsIG51bGwsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBTdXBlcnZpc29yRGV0YWlscyhTdHJpbmcgaWQsIE9iamVjdCBtZXRhLCBNYXA8U3RyaW5nLCBEb3VibGU+IHRvdGFsX3Jlc291cmNlcykgeworICAgICAgICB0aGlzKGlkLCBudWxsLCBtZXRhLCBudWxsLCBudWxsLCB0b3RhbF9yZXNvdXJjZXMpOworICAgIH0KKworICAgIHB1YmxpYyBTdXBlcnZpc29yRGV0YWlscyhTdHJpbmcgaWQsIE9iamVjdCBtZXRhLCBDb2xsZWN0aW9uPE51bWJlcj4gYWxsUG9ydHMpeworICAgICAgICB0aGlzKGlkLCBudWxsLCBtZXRhLCBudWxsLCBhbGxQb3J0cywgbnVsbCk7CisgICAgfQorCisgICAgcHVibGljIFN1cGVydmlzb3JEZXRhaWxzKFN0cmluZyBpZCwgU3RyaW5nIGhvc3QsIE9iamVjdCBzY2hlZHVsZXJNZXRhLCBDb2xsZWN0aW9uPE51bWJlcj4gYWxsUG9ydHMpIHsKKyAgICAgICAgdGhpcyhpZCwgaG9zdCwgbnVsbCwgc2NoZWR1bGVyTWV0YSwgYWxsUG9ydHMsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBTdXBlcnZpc29yRGV0YWlscyhTdHJpbmcgaWQsIFN0cmluZyBob3N0LCBPYmplY3Qgc2NoZWR1bGVyTWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbjxOdW1iZXI+IGFsbFBvcnRzLCBNYXA8U3RyaW5nLCBEb3VibGU+IHRvdGFsX3Jlc291cmNlcykgeworICAgICAgICB0aGlzKGlkLCBob3N0LCBudWxsLCBzY2hlZHVsZXJNZXRhLCBhbGxQb3J0cywgdG90YWxfcmVzb3VyY2VzKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgc2V0QWxsUG9ydHMoQ29sbGVjdGlvbjxOdW1iZXI+IGFsbFBvcnRzKSB7Ci0gICAgICAgIHRoaXMuYWxsUG9ydHMgPSBuZXcgSGFzaFNldDxJbnRlZ2VyPigpOworICAgICAgICB0aGlzLmFsbFBvcnRzID0gbmV3IEhhc2hTZXQ8PigpOwogICAgICAgICBpZihhbGxQb3J0cyE9bnVsbCkgewogICAgICAgICAgICAgZm9yKE51bWJlciBuOiBhbGxQb3J0cykgewogICAgICAgICAgICAgICAgIHRoaXMuYWxsUG9ydHMuYWRkKG4uaW50VmFsdWUoKSk7CkBAIC04Niw0ICsxMTMsMTYgQEAKICAgICBwdWJsaWMgT2JqZWN0IGdldFNjaGVkdWxlck1ldGEoKSB7CiAgICAgICAgIHJldHVybiB0aGlzLnNjaGVkdWxlck1ldGE7CiAgICAgfQorCisgICAgcHJpdmF0ZSBEb3VibGUgZ2V0VG90YWxSZXNvdXJjZShTdHJpbmcgdHlwZSkgeworICAgICAgICByZXR1cm4gdGhpcy5fdG90YWxfcmVzb3VyY2VzLmdldCh0eXBlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRG91YmxlIGdldFRvdGFsTWVtb3J5KCkgeworICAgICAgICByZXR1cm4gZ2V0VG90YWxSZXNvdXJjZShDb25maWcuU1VQRVJWSVNPUl9NRU1PUllfQ0FQQUNJVFlfTUIpOworICAgIH0KKworICAgIHB1YmxpYyBEb3VibGUgZ2V0VG90YWxDUFUoKSB7CisgICAgICAgIHJldHVybiBnZXRUb3RhbFJlc291cmNlKENvbmZpZy5TVVBFUlZJU09SX0NQVV9DQVBBQ0lUWSk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NjaGVkdWxlci9Ub3BvbG9naWVzLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2NoZWR1bGVyL1RvcG9sb2dpZXMuamF2YQppbmRleCA3MGFmMWI0Li4wODI4YTczIDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2NoZWR1bGVyL1RvcG9sb2dpZXMuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2NoZWR1bGVyL1RvcG9sb2dpZXMuamF2YQpAQCAtMjEsMTkgKzIxLDIyIEBACiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIAoraW1wb3J0IGJhY2t0eXBlLnN0b3JtLnNjaGVkdWxlci5yZXNvdXJjZS5Db21wb25lbnQ7CisKIHB1YmxpYyBjbGFzcyBUb3BvbG9naWVzIHsKICAgICBNYXA8U3RyaW5nLCBUb3BvbG9neURldGFpbHM+IHRvcG9sb2dpZXM7CiAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBuYW1lVG9JZDsKLSAgICAKKyAgICBNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBDb21wb25lbnQ+PiBfYWxsQ29tcG9uZW50czsKKwogICAgIHB1YmxpYyBUb3BvbG9naWVzKE1hcDxTdHJpbmcsIFRvcG9sb2d5RGV0YWlscz4gdG9wb2xvZ2llcykgewotICAgICAgICBpZih0b3BvbG9naWVzPT1udWxsKSB0b3BvbG9naWVzID0gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgdGhpcy50b3BvbG9naWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBUb3BvbG9neURldGFpbHM+KHRvcG9sb2dpZXMuc2l6ZSgpKTsKKyAgICAgICAgaWYodG9wb2xvZ2llcz09bnVsbCkgdG9wb2xvZ2llcyA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgdGhpcy50b3BvbG9naWVzID0gbmV3IEhhc2hNYXA8Pih0b3BvbG9naWVzLnNpemUoKSk7CiAgICAgICAgIHRoaXMudG9wb2xvZ2llcy5wdXRBbGwodG9wb2xvZ2llcyk7Ci0gICAgICAgIHRoaXMubmFtZVRvSWQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4odG9wb2xvZ2llcy5zaXplKCkpOworICAgICAgICB0aGlzLm5hbWVUb0lkID0gbmV3IEhhc2hNYXA8Pih0b3BvbG9naWVzLnNpemUoKSk7CiAgICAgICAgIAotICAgICAgICBmb3IgKFN0cmluZyB0b3BvbG9neUlkIDogdG9wb2xvZ2llcy5rZXlTZXQoKSkgewotICAgICAgICAgICAgVG9wb2xvZ3lEZXRhaWxzIHRvcG9sb2d5ID0gdG9wb2xvZ2llcy5nZXQodG9wb2xvZ3lJZCk7Ci0gICAgICAgICAgICB0aGlzLm5hbWVUb0lkLnB1dCh0b3BvbG9neS5nZXROYW1lKCksIHRvcG9sb2d5SWQpOworICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFRvcG9sb2d5RGV0YWlscz4gZW50cnkgOiB0b3BvbG9naWVzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIFRvcG9sb2d5RGV0YWlscyB0b3BvbG9neSA9IGVudHJ5LmdldFZhbHVlKCk7CisgICAgICAgICAgICB0aGlzLm5hbWVUb0lkLnB1dCh0b3BvbG9neS5nZXROYW1lKCksIGVudHJ5LmdldEtleSgpKTsKICAgICAgICAgfQogICAgIH0KICAgICAKQEAgLTU0LDQgKzU3LDE0IEBACiAgICAgcHVibGljIENvbGxlY3Rpb248VG9wb2xvZ3lEZXRhaWxzPiBnZXRUb3BvbG9naWVzKCkgewogICAgICAgICByZXR1cm4gdGhpcy50b3BvbG9naWVzLnZhbHVlcygpOwogICAgIH0KKworICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBDb21wb25lbnQ+PiBnZXRBbGxDb21wb25lbnRzKCkgeworICAgICAgICBpZiAoX2FsbENvbXBvbmVudHMgPT0gbnVsbCkgeworICAgICAgICAgICAgX2FsbENvbXBvbmVudHMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFRvcG9sb2d5RGV0YWlscz4gZW50cnkgOiB0aGlzLnRvcG9sb2dpZXMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgICAgIF9hbGxDb21wb25lbnRzLnB1dChlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKS5nZXRDb21wb25lbnRzKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBfYWxsQ29tcG9uZW50czsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2NoZWR1bGVyL1RvcG9sb2d5RGV0YWlscy5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NjaGVkdWxlci9Ub3BvbG9neURldGFpbHMuamF2YQppbmRleCA2ZGFmNGVkLi45NWFhNWM4IDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2NoZWR1bGVyL1RvcG9sb2d5RGV0YWlscy5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zY2hlZHVsZXIvVG9wb2xvZ3lEZXRhaWxzLmphdmEKQEAgLTE3LDEyICsxNywyNCBAQAogICovCiBwYWNrYWdlIGJhY2t0eXBlLnN0b3JtLnNjaGVkdWxlcjsKIAoraW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIAogaW1wb3J0IGJhY2t0eXBlLnN0b3JtLkNvbmZpZzsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5nZW5lcmF0ZWQuQm9sdDsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5nZW5lcmF0ZWQuR2xvYmFsU3RyZWFtSWQ7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0uZ2VuZXJhdGVkLkdyb3VwaW5nOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLmdlbmVyYXRlZC5TcG91dFNwZWM7CiBpbXBvcnQgYmFja3R5cGUuc3Rvcm0uZ2VuZXJhdGVkLlN0b3JtVG9wb2xvZ3k7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0uc2NoZWR1bGVyLnJlc291cmNlLkNvbXBvbmVudDsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5zY2hlZHVsZXIucmVzb3VyY2UuUmVzb3VyY2VVdGlsczsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS51dGlscy5VdGlsczsKKworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKIAogcHVibGljIGNsYXNzIFRvcG9sb2d5RGV0YWlscyB7CkBAIC0zMSw1OSArNDMsMzk0IEBACiAgICAgU3Rvcm1Ub3BvbG9neSB0b3BvbG9neTsKICAgICBNYXA8RXhlY3V0b3JEZXRhaWxzLCBTdHJpbmc+IGV4ZWN1dG9yVG9Db21wb25lbnQ7CiAgICAgaW50IG51bVdvcmtlcnM7Ci0gCisgICAgLy88RXhlY3V0b3JEZXRhaWxzIC0gVGFzaywgTWFwPFN0cmluZyAtIFR5cGUgb2YgcmVzb3VyY2UsIE1hcDxTdHJpbmcgLSB0eXBlIG9mIHRoYXQgcmVzb3VyY2UsIERvdWJsZSAtIGFtb3VudD4+PgorICAgIHByaXZhdGUgTWFwPEV4ZWN1dG9yRGV0YWlscywgTWFwPFN0cmluZywgRG91YmxlPj4gX3Jlc291cmNlTGlzdDsKKyAgICAvL01heCBoZWFwIHNpemUgZm9yIGEgd29ya2VyIHVzZWQgYnkgdG9wb2xvZ3kKKyAgICBwcml2YXRlIERvdWJsZSB0b3BvbG9neVdvcmtlck1heEhlYXBTaXplOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFRvcG9sb2d5RGV0YWlscy5jbGFzcyk7CisKICAgICBwdWJsaWMgVG9wb2xvZ3lEZXRhaWxzKFN0cmluZyB0b3BvbG9neUlkLCBNYXAgdG9wb2xvZ3lDb25mLCBTdG9ybVRvcG9sb2d5IHRvcG9sb2d5LCBpbnQgbnVtV29ya2VycykgewogICAgICAgICB0aGlzLnRvcG9sb2d5SWQgPSB0b3BvbG9neUlkOwogICAgICAgICB0aGlzLnRvcG9sb2d5Q29uZiA9IHRvcG9sb2d5Q29uZjsKICAgICAgICAgdGhpcy50b3BvbG9neSA9IHRvcG9sb2d5OwogICAgICAgICB0aGlzLm51bVdvcmtlcnMgPSBudW1Xb3JrZXJzOwogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyBUb3BvbG9neURldGFpbHMoU3RyaW5nIHRvcG9sb2d5SWQsIE1hcCB0b3BvbG9neUNvbmYsIFN0b3JtVG9wb2xvZ3kgdG9wb2xvZ3ksIGludCBudW1Xb3JrZXJzLCBNYXA8RXhlY3V0b3JEZXRhaWxzLCBTdHJpbmc+IGV4ZWN1dG9yVG9Db21wb25lbnRzKSB7CiAgICAgICAgIHRoaXModG9wb2xvZ3lJZCwgdG9wb2xvZ3lDb25mLCB0b3BvbG9neSwgbnVtV29ya2Vycyk7Ci0gICAgICAgIHRoaXMuZXhlY3V0b3JUb0NvbXBvbmVudCA9IG5ldyBIYXNoTWFwPEV4ZWN1dG9yRGV0YWlscywgU3RyaW5nPigwKTsKKyAgICAgICAgdGhpcy5leGVjdXRvclRvQ29tcG9uZW50ID0gbmV3IEhhc2hNYXA8PigwKTsKICAgICAgICAgaWYgKGV4ZWN1dG9yVG9Db21wb25lbnRzICE9IG51bGwpIHsKICAgICAgICAgICAgIHRoaXMuZXhlY3V0b3JUb0NvbXBvbmVudC5wdXRBbGwoZXhlY3V0b3JUb0NvbXBvbmVudHMpOwogICAgICAgICB9CisgICAgICAgIHRoaXMuaW5pdFJlc291cmNlTGlzdCgpOworICAgICAgICB0aGlzLmluaXRDb25maWdzKCk7CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKICAgICAgICAgcmV0dXJuIHRvcG9sb2d5SWQ7CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gKFN0cmluZyl0aGlzLnRvcG9sb2d5Q29uZi5nZXQoQ29uZmlnLlRPUE9MT0dZX05BTUUpOworICAgICAgICByZXR1cm4gKFN0cmluZykgdGhpcy50b3BvbG9neUNvbmYuZ2V0KENvbmZpZy5UT1BPTE9HWV9OQU1FKTsKICAgICB9Ci0gICAgCisKICAgICBwdWJsaWMgTWFwIGdldENvbmYoKSB7CiAgICAgICAgIHJldHVybiB0b3BvbG9neUNvbmY7CiAgICAgfQotICAgIAorCiAgICAgcHVibGljIGludCBnZXROdW1Xb3JrZXJzKCkgewogICAgICAgICByZXR1cm4gbnVtV29ya2VyczsKICAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0b3JtVG9wb2xvZ3kgZ2V0VG9wb2xvZ3koKSB7Ci0gICAgICAgIHJldHVybiB0b3BvbG9neTsKLSAgICB9CiAKICAgICBwdWJsaWMgTWFwPEV4ZWN1dG9yRGV0YWlscywgU3RyaW5nPiBnZXRFeGVjdXRvclRvQ29tcG9uZW50KCkgewogICAgICAgICByZXR1cm4gdGhpcy5leGVjdXRvclRvQ29tcG9uZW50OwogICAgIH0KIAogICAgIHB1YmxpYyBNYXA8RXhlY3V0b3JEZXRhaWxzLCBTdHJpbmc+IHNlbGVjdEV4ZWN1dG9yVG9Db21wb25lbnQoQ29sbGVjdGlvbjxFeGVjdXRvckRldGFpbHM+IGV4ZWN1dG9ycykgewotICAgICAgICBNYXA8RXhlY3V0b3JEZXRhaWxzLCBTdHJpbmc+IHJldCA9IG5ldyBIYXNoTWFwPEV4ZWN1dG9yRGV0YWlscywgU3RyaW5nPihleGVjdXRvcnMuc2l6ZSgpKTsKKyAgICAgICAgTWFwPEV4ZWN1dG9yRGV0YWlscywgU3RyaW5nPiByZXQgPSBuZXcgSGFzaE1hcDw+KGV4ZWN1dG9ycy5zaXplKCkpOwogICAgICAgICBmb3IgKEV4ZWN1dG9yRGV0YWlscyBleGVjdXRvciA6IGV4ZWN1dG9ycykgewogICAgICAgICAgICAgU3RyaW5nIGNvbXBJZCA9IHRoaXMuZXhlY3V0b3JUb0NvbXBvbmVudC5nZXQoZXhlY3V0b3IpOwogICAgICAgICAgICAgaWYgKGNvbXBJZCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgcmV0LnB1dChleGVjdXRvciwgY29tcElkKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICAKKwogICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KLSAgICAKKwogICAgIHB1YmxpYyBDb2xsZWN0aW9uPEV4ZWN1dG9yRGV0YWlscz4gZ2V0RXhlY3V0b3JzKCkgewogICAgICAgICByZXR1cm4gdGhpcy5leGVjdXRvclRvQ29tcG9uZW50LmtleVNldCgpOwogICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0UmVzb3VyY2VMaXN0KCkgeworICAgICAgICBfcmVzb3VyY2VMaXN0ID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICAvLyBFeHRyYWN0IGJvbHQgbWVtb3J5IGluZm8KKyAgICAgICAgaWYgKHRoaXMudG9wb2xvZ3kuZ2V0X2JvbHRzKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBCb2x0PiBib2x0IDogdGhpcy50b3BvbG9neS5nZXRfYm9sdHMoKS5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICAgICAgLy90aGUganNvbl9jb25mIGlzIHBvcHVsYXRlZCBieSBUb3BvbG9neUJ1aWxkZXIgKGUuZy4gYm9sdERlY2xhcmVyLnNldE1lbW9yeUxvYWQpCisgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgRG91YmxlPiB0b3BvbG9neV9yZXNvdXJjZXMgPSBSZXNvdXJjZVV0aWxzLnBhcnNlUmVzb3VyY2VzKGJvbHQKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRWYWx1ZSgpLmdldF9jb21tb24oKS5nZXRfanNvbl9jb25mKCkpOworICAgICAgICAgICAgICAgIFJlc291cmNlVXRpbHMuY2hlY2tJbnRpYWxpemF0aW9uKHRvcG9sb2d5X3Jlc291cmNlcywgYm9sdC5nZXRWYWx1ZSgpLnRvU3RyaW5nKCksIHRoaXMudG9wb2xvZ3lDb25mKTsKKyAgICAgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxFeGVjdXRvckRldGFpbHMsIFN0cmluZz4gYW5FeGVjdXRvclRvQ29tcG9uZW50IDogZXhlY3V0b3JUb0NvbXBvbmVudC5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChib2x0LmdldEtleSgpLmVxdWFscyhhbkV4ZWN1dG9yVG9Db21wb25lbnQuZ2V0VmFsdWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9yZXNvdXJjZUxpc3QucHV0KGFuRXhlY3V0b3JUb0NvbXBvbmVudC5nZXRLZXkoKSwgdG9wb2xvZ3lfcmVzb3VyY2VzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBFeHRyYWN0IHNwb3V0IG1lbW9yeSBpbmZvCisgICAgICAgIGlmICh0aGlzLnRvcG9sb2d5LmdldF9zcG91dHMoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFNwb3V0U3BlYz4gc3BvdXQgOiB0aGlzLnRvcG9sb2d5LmdldF9zcG91dHMoKS5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgRG91YmxlPiB0b3BvbG9neV9yZXNvdXJjZXMgPSBSZXNvdXJjZVV0aWxzLnBhcnNlUmVzb3VyY2VzKHNwb3V0CisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VmFsdWUoKS5nZXRfY29tbW9uKCkuZ2V0X2pzb25fY29uZigpKTsKKyAgICAgICAgICAgICAgICBSZXNvdXJjZVV0aWxzLmNoZWNrSW50aWFsaXphdGlvbih0b3BvbG9neV9yZXNvdXJjZXMsIHNwb3V0LmdldFZhbHVlKCkudG9TdHJpbmcoKSwgdGhpcy50b3BvbG9neUNvbmYpOworICAgICAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PEV4ZWN1dG9yRGV0YWlscywgU3RyaW5nPiBhbkV4ZWN1dG9yVG9Db21wb25lbnQgOiBleGVjdXRvclRvQ29tcG9uZW50LmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNwb3V0LmdldEtleSgpLmVxdWFscyhhbkV4ZWN1dG9yVG9Db21wb25lbnQuZ2V0VmFsdWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9yZXNvdXJjZUxpc3QucHV0KGFuRXhlY3V0b3JUb0NvbXBvbmVudC5nZXRLZXkoKSwgdG9wb2xvZ3lfcmVzb3VyY2VzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPRy53YXJuKCJUb3BvbG9neSAiICsgdG9wb2xvZ3lJZCArICIgZG9lcyBub3Qgc2VlbSB0byBoYXZlIGFueSBzcG91dHMhIik7CisgICAgICAgIH0KKyAgICAgICAgLy9zY2hlZHVsZSB0YXNrcyB0aGF0IGFyZSBub3QgcGFydCBvZiBjb21wb25lbnRzIHJldHVybmVkIGZyb20gdG9wb2xvZ3kuZ2V0X3Nwb3V0IG9yIHRvcG9sb2d5LmdldGJvbHQgKEFLQSBzeXMgdGFza3MgbW9zdCBzcGVjaWZpY2FsbHkgX19hY2tlciB0YXNrcykKKyAgICAgICAgZm9yKEV4ZWN1dG9yRGV0YWlscyBleGVjIDogdGhpcy5nZXRFeGVjdXRvcnMoKSkgeworICAgICAgICAgICAgaWYgKCFfcmVzb3VyY2VMaXN0LmNvbnRhaW5zS2V5KGV4ZWMpKSB7CisgICAgICAgICAgICAgICAgTE9HLmRlYnVnKAorICAgICAgICAgICAgICAgICAgICAgICAgIlNjaGVkdWxpbmcge30ge30gd2l0aCBtZW1vcnkgcmVxdWlyZW1lbnQgYXMgJ29uIGhlYXAnIC0ge30gYW5kICdvZmYgaGVhcCcgLSB7fSBhbmQgQ1BVIHJlcXVpcmVtZW50IGFzIHt9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0RXhlY3V0b3JUb0NvbXBvbmVudCgpLmdldChleGVjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWMsCisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvcG9sb2d5Q29uZi5nZXQoQ29uZmlnLlRPUE9MT0dZX0NPTVBPTkVOVF9SRVNPVVJDRVNfT05IRUFQX01FTU9SWV9NQiksCisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvcG9sb2d5Q29uZi5nZXQoQ29uZmlnLlRPUE9MT0dZX0NPTVBPTkVOVF9SRVNPVVJDRVNfT0ZGSEVBUF9NRU1PUllfTUIpLAorICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b3BvbG9neUNvbmYuZ2V0KENvbmZpZy5UT1BPTE9HWV9DT01QT05FTlRfQ1BVX1BDT1JFX1BFUkNFTlQpKTsKKyAgICAgICAgICAgICAgICB0aGlzLmFkZERlZmF1bHRSZXNmb3JFeGVjKGV4ZWMpOworICAgICAgICAgICAgfSAKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgTGlzdDxFeGVjdXRvckRldGFpbHM+IGNvbXBvbmVudFRvRXhlY3MoU3RyaW5nIGNvbXApIHsKKyAgICAgICAgTGlzdDxFeGVjdXRvckRldGFpbHM+IGV4ZWNzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGZvciAoTWFwLkVudHJ5PEV4ZWN1dG9yRGV0YWlscywgU3RyaW5nPiBlbnRyeSA6IGV4ZWN1dG9yVG9Db21wb25lbnQuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgaWYgKGVudHJ5LmdldFZhbHVlKCkuZXF1YWxzKGNvbXApKSB7CisgICAgICAgICAgICAgICAgZXhlY3MuYWRkKGVudHJ5LmdldEtleSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXhlY3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBub24tc3lzdGVtIGNvbXBvbmVudHMgb2YgdGhlIHRvcG9sb2d5IGdyYXBoCisgICAgICogRWFjaCBDb21wb25lbnQgb2JqZWN0IGluIHRoZSByZXR1cm5pbmcgbWFwIGlzIHBvcHVsYXRlZCB3aXRoIHRoZSBsaXN0IG9mIGl0cworICAgICAqIHBhcmVudHMsIGNoaWxkcmVuIGFuZCBleGVjcyBhc3NpZ25lZCB0byB0aGF0IGNvbXBvbmVudC4KKyAgICAgKiBAcmV0dXJuIGEgbWFwIG9mIGNvbXBvbmVudHMKKyAgICAgKi8KKyAgICBwdWJsaWMgTWFwPFN0cmluZywgQ29tcG9uZW50PiBnZXRDb21wb25lbnRzKCkgeworICAgICAgICBNYXA8U3RyaW5nLCBDb21wb25lbnQ+IGFsbF9jb21wID0gbmV3IEhhc2hNYXA8PigpOworCisgICAgICAgIFN0b3JtVG9wb2xvZ3kgc3Rvcm1fdG9wbyA9IHRoaXMudG9wb2xvZ3k7CisgICAgICAgIC8vIHNwb3V0cworICAgICAgICBpZiAoc3Rvcm1fdG9wby5nZXRfc3BvdXRzKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTcG91dFNwZWM+IHNwb3V0RW50cnkgOiBzdG9ybV90b3BvCisgICAgICAgICAgICAgICAgICAgIC5nZXRfc3BvdXRzKCkuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgICAgIGlmICghVXRpbHMuaXNTeXN0ZW1JZChzcG91dEVudHJ5LmdldEtleSgpKSkgeworICAgICAgICAgICAgICAgICAgICBDb21wb25lbnQgbmV3Q29tcDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFsbF9jb21wLmNvbnRhaW5zS2V5KHNwb3V0RW50cnkuZ2V0S2V5KCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb21wID0gYWxsX2NvbXAuZ2V0KHNwb3V0RW50cnkuZ2V0S2V5KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29tcC5leGVjcyA9IGNvbXBvbmVudFRvRXhlY3MobmV3Q29tcC5pZCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb21wID0gbmV3IENvbXBvbmVudChzcG91dEVudHJ5LmdldEtleSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbXAuZXhlY3MgPSBjb21wb25lbnRUb0V4ZWNzKG5ld0NvbXAuaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgYWxsX2NvbXAucHV0KHNwb3V0RW50cnkuZ2V0S2V5KCksIG5ld0NvbXApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG5ld0NvbXAudHlwZSA9IENvbXBvbmVudC5Db21wb25lbnRUeXBlLlNQT1VUOworCisgICAgICAgICAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PEdsb2JhbFN0cmVhbUlkLCBHcm91cGluZz4gc3BvdXRJbnB1dCA6IHNwb3V0RW50cnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VmFsdWUoKS5nZXRfY29tbW9uKCkuZ2V0X2lucHV0cygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbXAucGFyZW50cy5hZGQoc3BvdXRJbnB1dC5nZXRLZXkoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0X2NvbXBvbmVudElkKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhbGxfY29tcC5jb250YWluc0tleShzcG91dElucHV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRLZXkoKS5nZXRfY29tcG9uZW50SWQoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxfY29tcC5wdXQoc3BvdXRJbnB1dC5nZXRLZXkoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0X2NvbXBvbmVudElkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ29tcG9uZW50KHNwb3V0SW5wdXQuZ2V0S2V5KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldF9jb21wb25lbnRJZCgpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBhbGxfY29tcC5nZXQoc3BvdXRJbnB1dC5nZXRLZXkoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0X2NvbXBvbmVudElkKCkpLmNoaWxkcmVuLmFkZChzcG91dEVudHJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRLZXkoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gYm9sdHMKKyAgICAgICAgaWYgKHN0b3JtX3RvcG8uZ2V0X2JvbHRzKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBCb2x0PiBib2x0RW50cnkgOiBzdG9ybV90b3BvLmdldF9ib2x0cygpCisgICAgICAgICAgICAgICAgICAgIC5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFVdGlscy5pc1N5c3RlbUlkKGJvbHRFbnRyeS5nZXRLZXkoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQ29tcG9uZW50IG5ld0NvbXA7CisgICAgICAgICAgICAgICAgICAgIGlmIChhbGxfY29tcC5jb250YWluc0tleShib2x0RW50cnkuZ2V0S2V5KCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb21wID0gYWxsX2NvbXAuZ2V0KGJvbHRFbnRyeS5nZXRLZXkoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb21wLmV4ZWNzID0gY29tcG9uZW50VG9FeGVjcyhuZXdDb21wLmlkKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbXAgPSBuZXcgQ29tcG9uZW50KGJvbHRFbnRyeS5nZXRLZXkoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb21wLmV4ZWNzID0gY29tcG9uZW50VG9FeGVjcyhuZXdDb21wLmlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsbF9jb21wLnB1dChib2x0RW50cnkuZ2V0S2V5KCksIG5ld0NvbXApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG5ld0NvbXAudHlwZSA9IENvbXBvbmVudC5Db21wb25lbnRUeXBlLkJPTFQ7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8R2xvYmFsU3RyZWFtSWQsIEdyb3VwaW5nPiBib2x0SW5wdXQgOiBib2x0RW50cnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VmFsdWUoKS5nZXRfY29tbW9uKCkuZ2V0X2lucHV0cygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvbXAucGFyZW50cy5hZGQoYm9sdElucHV0LmdldEtleSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRfY29tcG9uZW50SWQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFsbF9jb21wLmNvbnRhaW5zS2V5KGJvbHRJbnB1dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0S2V5KCkuZ2V0X2NvbXBvbmVudElkKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsX2NvbXAucHV0KGJvbHRJbnB1dC5nZXRLZXkoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0X2NvbXBvbmVudElkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ29tcG9uZW50KGJvbHRJbnB1dC5nZXRLZXkoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0X2NvbXBvbmVudElkKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGFsbF9jb21wLmdldChib2x0SW5wdXQuZ2V0S2V5KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldF9jb21wb25lbnRJZCgpKS5jaGlsZHJlbi5hZGQoYm9sdEVudHJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRLZXkoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFsbF9jb21wOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIG9uIGhlYXAgbWVtb3J5IHJlcXVpcmVtZW50IGZvciBhCisgICAgICogY2VydGFpbiB0YXNrIHdpdGhpbiBhIHRvcG9sb2d5CisgICAgICogQHBhcmFtIGV4ZWMgdGhlIGV4ZWN1dG9yIHRoZSBpbnF1aXJ5IGlzIGNvbmNlcm5pbmcuCisgICAgICogQHJldHVybiBEb3VibGUgdGhlIGFtb3VudCBvZiBvbiBoZWFwIG1lbW9yeQorICAgICAqIHJlcXVpcmVtZW50IGZvciB0aGlzIGV4ZWMgaW4gdG9wb2xvZ3kgdG9wb0lkLgorICAgICAqLworICAgIHB1YmxpYyBEb3VibGUgZ2V0T25IZWFwTWVtb3J5UmVxdWlyZW1lbnQoRXhlY3V0b3JEZXRhaWxzIGV4ZWMpIHsKKyAgICAgICAgRG91YmxlIHJldCA9IG51bGw7CisgICAgICAgIGlmIChoYXNFeGVjSW5Ub3BvKGV4ZWMpKSB7CisgICAgICAgICAgICByZXQgPSBfcmVzb3VyY2VMaXN0CisgICAgICAgICAgICAgICAgICAgIC5nZXQoZXhlYykKKyAgICAgICAgICAgICAgICAgICAgLmdldChDb25maWcuVE9QT0xPR1lfQ09NUE9ORU5UX1JFU09VUkNFU19PTkhFQVBfTUVNT1JZX01CKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIG9mZiBoZWFwIG1lbW9yeSByZXF1aXJlbWVudCBmb3IgYQorICAgICAqIGNlcnRhaW4gdGFzayB3aXRoaW4gYSB0b3BvbG9neQorICAgICAqIEBwYXJhbSBleGVjIHRoZSBleGVjdXRvciB0aGUgaW5xdWlyeSBpcyBjb25jZXJuaW5nLgorICAgICAqIEByZXR1cm4gRG91YmxlIHRoZSBhbW91bnQgb2Ygb2ZmIGhlYXAgbWVtb3J5CisgICAgICogcmVxdWlyZW1lbnQgZm9yIHRoaXMgZXhlYyBpbiB0b3BvbG9neSB0b3BvSWQuCisgICAgICovCisgICAgcHVibGljIERvdWJsZSBnZXRPZmZIZWFwTWVtb3J5UmVxdWlyZW1lbnQoRXhlY3V0b3JEZXRhaWxzIGV4ZWMpIHsKKyAgICAgICAgRG91YmxlIHJldCA9IG51bGw7CisgICAgICAgIGlmIChoYXNFeGVjSW5Ub3BvKGV4ZWMpKSB7CisgICAgICAgICAgICByZXQgPSBfcmVzb3VyY2VMaXN0CisgICAgICAgICAgICAgICAgICAgIC5nZXQoZXhlYykKKyAgICAgICAgICAgICAgICAgICAgLmdldChDb25maWcuVE9QT0xPR1lfQ09NUE9ORU5UX1JFU09VUkNFU19PRkZIRUFQX01FTU9SWV9NQik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB0b3RhbCBtZW1vcnkgcmVxdWlyZW1lbnQgZm9yIGEgdGFzaworICAgICAqIEBwYXJhbSBleGVjIHRoZSBleGVjdXRvciB0aGUgaW5xdWlyeSBpcyBjb25jZXJuaW5nLgorICAgICAqIEByZXR1cm4gRG91YmxlIHRoZSB0b3RhbCBtZW1vcnkgcmVxdWlyZW1lbnQKKyAgICAgKiAgZm9yIHRoaXMgZXhlYyBpbiB0b3BvbG9neSB0b3BvSWQuCisgICAgICovCisgICAgcHVibGljIERvdWJsZSBnZXRUb3RhbE1lbVJlcVRhc2soRXhlY3V0b3JEZXRhaWxzIGV4ZWMpIHsKKyAgICAgICAgaWYgKGhhc0V4ZWNJblRvcG8oZXhlYykpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRPZmZIZWFwTWVtb3J5UmVxdWlyZW1lbnQoZXhlYykKKyAgICAgICAgICAgICAgICAgICAgKyBnZXRPbkhlYXBNZW1vcnlSZXF1aXJlbWVudChleGVjKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB0b3RhbCBtZW1vcnkgcmVzb3VyY2UgbGlzdCBmb3IgYQorICAgICAqIHNldCBvZiB0YXNrcyB0aGF0IGlzIHBhcnQgb2YgYSB0b3BvbG9neS4KKyAgICAgKiBAcmV0dXJuIE1hcDxFeGVjdXRvckRldGFpbHMsIERvdWJsZT4gYSBtYXAgb2YgdGhlIHRvdGFsIG1lbW9yeSByZXF1aXJlbWVudAorICAgICAqICBmb3IgYWxsIHRhc2tzIGluIHRvcG9sb2d5IHRvcG9JZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWFwPEV4ZWN1dG9yRGV0YWlscywgRG91YmxlPiBnZXRUb3RhbE1lbW9yeVJlc291cmNlTGlzdCgpIHsKKyAgICAgICAgTWFwPEV4ZWN1dG9yRGV0YWlscywgRG91YmxlPiByZXQgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIGZvciAoRXhlY3V0b3JEZXRhaWxzIGV4ZWMgOiBfcmVzb3VyY2VMaXN0LmtleVNldCgpKSB7CisgICAgICAgICAgICByZXQucHV0KGV4ZWMsIGdldFRvdGFsTWVtUmVxVGFzayhleGVjKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHRvdGFsIENQVSByZXF1aXJlbWVudCBmb3IgZXhlY3V0b3IKKyAgICAgKiBAcmV0dXJuIERvdWJsZSB0aGUgdG90YWwgYWJvdXQgb2YgY3B1IHJlcXVpcmVtZW50IGZvciBleGVjdXRvcgorICAgICAqLworICAgIHB1YmxpYyBEb3VibGUgZ2V0VG90YWxDcHVSZXFUYXNrKEV4ZWN1dG9yRGV0YWlscyBleGVjKSB7CisgICAgICAgIGlmIChoYXNFeGVjSW5Ub3BvKGV4ZWMpKSB7CisgICAgICAgICAgICByZXR1cm4gX3Jlc291cmNlTGlzdAorICAgICAgICAgICAgICAgICAgICAuZ2V0KGV4ZWMpCisgICAgICAgICAgICAgICAgICAgIC5nZXQoQ29uZmlnLlRPUE9MT0dZX0NPTVBPTkVOVF9DUFVfUENPUkVfUEVSQ0VOVCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogTm90ZTogVGhlIHB1YmxpYyBBUEkgcmVsZXZhbnQgdG8gcmVzb3VyY2UgYXdhcmUgc2NoZWR1bGluZyBpcyB1bnN0YWJsZSBhcyBvZiBNYXkgMjAxNS4KKyAgICAgKiAgICAgICBXZSByZXNlcnZlIHRoZSByaWdodCB0byBjaGFuZ2UgdGhlbS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHRvdGFsIG9uLWhlYXAgbWVtb3J5IHJlcXVlc3RlZCBmb3IgdGhpcyB0b3BvbG9neQorICAgICAqLworICAgIHB1YmxpYyBEb3VibGUgZ2V0VG90YWxSZXF1ZXN0ZWRNZW1PbkhlYXAoKSB7CisgICAgICAgIERvdWJsZSB0b3RhbF9tZW1vbmhlYXAgPSAwLjA7CisgICAgICAgIGZvciAoRXhlY3V0b3JEZXRhaWxzIGV4ZWMgOiB0aGlzLmdldEV4ZWN1dG9ycygpKSB7CisgICAgICAgICAgICBEb3VibGUgZXhlY19tZW0gPSBnZXRPbkhlYXBNZW1vcnlSZXF1aXJlbWVudChleGVjKTsKKyAgICAgICAgICAgIGlmIChleGVjX21lbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdG90YWxfbWVtb25oZWFwICs9IGV4ZWNfbWVtOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0b3RhbF9tZW1vbmhlYXA7CisgICAgfQorCisgICAgLyoqCisgICAgICogTm90ZTogVGhlIHB1YmxpYyBBUEkgcmVsZXZhbnQgdG8gcmVzb3VyY2UgYXdhcmUgc2NoZWR1bGluZyBpcyB1bnN0YWJsZSBhcyBvZiBNYXkgMjAxNS4KKyAgICAgKiAgICAgICBXZSByZXNlcnZlIHRoZSByaWdodCB0byBjaGFuZ2UgdGhlbS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHRvdGFsIG9mZi1oZWFwIG1lbW9yeSByZXF1ZXN0ZWQgZm9yIHRoaXMgdG9wb2xvZ3kKKyAgICAgKi8KKyAgICBwdWJsaWMgRG91YmxlIGdldFRvdGFsUmVxdWVzdGVkTWVtT2ZmSGVhcCgpIHsKKyAgICAgICAgRG91YmxlIHRvdGFsX21lbW9mZmhlYXAgPSAwLjA7CisgICAgICAgIGZvciAoRXhlY3V0b3JEZXRhaWxzIGV4ZWMgOiB0aGlzLmdldEV4ZWN1dG9ycygpKSB7CisgICAgICAgICAgICBEb3VibGUgZXhlY19tZW0gPSBnZXRPZmZIZWFwTWVtb3J5UmVxdWlyZW1lbnQoZXhlYyk7CisgICAgICAgICAgICBpZiAoZXhlY19tZW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRvdGFsX21lbW9mZmhlYXAgKz0gZXhlY19tZW07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRvdGFsX21lbW9mZmhlYXA7CisgICAgfQorCisgICAgLyoqCisgICAgICogTm90ZTogVGhlIHB1YmxpYyBBUEkgcmVsZXZhbnQgdG8gcmVzb3VyY2UgYXdhcmUgc2NoZWR1bGluZyBpcyB1bnN0YWJsZSBhcyBvZiBNYXkgMjAxNS4KKyAgICAgKiAgICAgICBXZSByZXNlcnZlIHRoZSByaWdodCB0byBjaGFuZ2UgdGhlbS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHRvdGFsIGNwdSByZXF1ZXN0ZWQgZm9yIHRoaXMgdG9wb2xvZ3kKKyAgICAgKi8KKyAgICBwdWJsaWMgRG91YmxlIGdldFRvdGFsUmVxdWVzdGVkQ3B1KCkgeworICAgICAgICBEb3VibGUgdG90YWxfY3B1ID0gMC4wOworICAgICAgICBmb3IgKEV4ZWN1dG9yRGV0YWlscyBleGVjIDogdGhpcy5nZXRFeGVjdXRvcnMoKSkgeworICAgICAgICAgICAgRG91YmxlIGV4ZWNfY3B1ID0gZ2V0VG90YWxDcHVSZXFUYXNrKGV4ZWMpOworICAgICAgICAgICAgaWYgKGV4ZWNfY3B1ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0b3RhbF9jcHUgKz0gZXhlY19jcHU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRvdGFsX2NwdTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBnZXQgdGhlIHJlc291cmNlcyByZXF1aXJlbWVudHMgZm9yIGEgZXhlY3V0b3IKKyAgICAgKiBAcGFyYW0gZXhlYworICAgICAqIEByZXR1cm4gYSBtYXAgY29udGFpbmluZyB0aGUgcmVzb3VyY2UgcmVxdWlyZW1lbnRzIGZvciB0aGlzIGV4ZWMKKyAgICAgKi8KKyAgICBwdWJsaWMgTWFwPFN0cmluZywgRG91YmxlPiBnZXRUYXNrUmVzb3VyY2VSZXFMaXN0KEV4ZWN1dG9yRGV0YWlscyBleGVjKSB7CisgICAgICAgIGlmIChoYXNFeGVjSW5Ub3BvKGV4ZWMpKSB7CisgICAgICAgICAgICByZXR1cm4gX3Jlc291cmNlTGlzdC5nZXQoZXhlYyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIGlmIGEgZXhlY3V0b3IgaXMgcGFydCBvZiB0aGlzIHRvcG9sb2d5CisgICAgICogQHJldHVybiBCb29sZWFuIHdoZXRoZXIgb3Igbm90IGEgY2VydGFpbiBFeGVjdXRvckRldGFpbCBpcyBpbmNsdWRlZCBpbiB0aGUgX3Jlc291cmNlTGlzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNFeGVjSW5Ub3BvKEV4ZWN1dG9yRGV0YWlscyBleGVjKSB7CisgICAgICAgIHJldHVybiBfcmVzb3VyY2VMaXN0ICE9IG51bGwgJiYgX3Jlc291cmNlTGlzdC5jb250YWluc0tleShleGVjKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBhZGQgcmVzb3VyY2UgcmVxdWlyZW1lbnRzIGZvciBhIGV4ZWN1dG9yCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkUmVzb3VyY2VzRm9yRXhlYyhFeGVjdXRvckRldGFpbHMgZXhlYywgTWFwPFN0cmluZywgRG91YmxlPiByZXNvdXJjZUxpc3QpIHsKKyAgICAgICAgaWYgKGhhc0V4ZWNJblRvcG8oZXhlYykpIHsKKyAgICAgICAgICAgIExPRy53YXJuKCJFeGVjdXRvciB7fSBhbHJlYWR5IGV4aXN0cy4uLlJlc291cmNlTGlzdDoge30iLCBleGVjLCBnZXRUYXNrUmVzb3VyY2VSZXFMaXN0KGV4ZWMpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBfcmVzb3VyY2VMaXN0LnB1dChleGVjLCByZXNvdXJjZUxpc3QpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBkZWZhdWx0IHJlc291cmNlIHJlcXVpcmVtZW50cyBmb3IgYSBleGVjdXRvcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZERlZmF1bHRSZXNmb3JFeGVjKEV4ZWN1dG9yRGV0YWlscyBleGVjKSB7CisgICAgICAgIE1hcDxTdHJpbmcsIERvdWJsZT4gZGVmYXVsdFJlc291cmNlTGlzdCA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgZGVmYXVsdFJlc291cmNlTGlzdC5wdXQoQ29uZmlnLlRPUE9MT0dZX0NPTVBPTkVOVF9DUFVfUENPUkVfUEVSQ0VOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFV0aWxzLmdldERvdWJsZSh0b3BvbG9neUNvbmYuZ2V0KENvbmZpZy5UT1BPTE9HWV9DT01QT05FTlRfQ1BVX1BDT1JFX1BFUkNFTlQpLCBudWxsKSk7CisgICAgICAgIGRlZmF1bHRSZXNvdXJjZUxpc3QucHV0KENvbmZpZy5UT1BPTE9HWV9DT01QT05FTlRfUkVTT1VSQ0VTX09GRkhFQVBfTUVNT1JZX01CLAorICAgICAgICAgICAgICAgICAgICAgICAgVXRpbHMuZ2V0RG91YmxlKHRvcG9sb2d5Q29uZi5nZXQoQ29uZmlnLlRPUE9MT0dZX0NPTVBPTkVOVF9SRVNPVVJDRVNfT0ZGSEVBUF9NRU1PUllfTUIpLCBudWxsKSk7CisgICAgICAgIGRlZmF1bHRSZXNvdXJjZUxpc3QucHV0KENvbmZpZy5UT1BPTE9HWV9DT01QT05FTlRfUkVTT1VSQ0VTX09OSEVBUF9NRU1PUllfTUIsCisgICAgICAgICAgICAgICAgICAgICAgICBVdGlscy5nZXREb3VibGUodG9wb2xvZ3lDb25mLmdldChDb25maWcuVE9QT0xPR1lfQ09NUE9ORU5UX1JFU09VUkNFU19PTkhFQVBfTUVNT1JZX01CKSwgbnVsbCkpOworICAgICAgICBMT0cuZGVidWcoIlNjaGVkdWxpbmcgRXhlY3V0b3I6IHt9IHdpdGggbWVtb3J5IHJlcXVpcmVtZW50IGFzIG9uSGVhcDoge30gLSBvZmZIZWFwOiB7fSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJhbmQgQ1BVIHJlcXVpcmVtZW50OiB7fSIsCisgICAgICAgICAgICAgICAgZXhlYywgdG9wb2xvZ3lDb25mLmdldChDb25maWcuVE9QT0xPR1lfQ09NUE9ORU5UX1JFU09VUkNFU19PTkhFQVBfTUVNT1JZX01CKSwKKyAgICAgICAgICAgICAgICB0b3BvbG9neUNvbmYuZ2V0KENvbmZpZy5UT1BPTE9HWV9DT01QT05FTlRfUkVTT1VSQ0VTX09GRkhFQVBfTUVNT1JZX01CKSwKKyAgICAgICAgICAgICAgICB0b3BvbG9neUNvbmYuZ2V0KENvbmZpZy5UT1BPTE9HWV9DT01QT05FTlRfQ1BVX1BDT1JFX1BFUkNFTlQpKTsKKyAgICAgICAgYWRkUmVzb3VyY2VzRm9yRXhlYyhleGVjLCBkZWZhdWx0UmVzb3VyY2VMaXN0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBpbml0aWFsaXplcyB0aGUgc2NoZWR1bGVyIG1lbWJlciB2YXJpYWJsZSBieSBleHRyYWN0aW5nIHdoYXQgc2NoZWR1bGVyCisgICAgICogdGhpcyB0b3BvbG9neSBpcyBnb2luZyB0byB1c2UgZnJvbSB0b3BvbG9neUNvbmYKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgaW5pdENvbmZpZ3MoKSB7CisgICAgICAgIHRoaXMudG9wb2xvZ3lXb3JrZXJNYXhIZWFwU2l6ZSA9IFV0aWxzLmdldERvdWJsZSh0aGlzLnRvcG9sb2d5Q29uZi5nZXQoQ29uZmlnLlRPUE9MT0dZX1dPUktFUl9NQVhfSEVBUF9TSVpFX01CKSwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBtYXggaGVhcCBzaXplIGZvciBhIHdvcmtlciB1c2VkIGJ5IHRoaXMgdG9wb2xvZ3kKKyAgICAgKiBAcmV0dXJuIHRoZSB3b3JrZXIgbWF4IGhlYXAgc2l6ZQorICAgICAqLworICAgIHB1YmxpYyBEb3VibGUgZ2V0VG9wb2xvZ3lXb3JrZXJNYXhIZWFwU2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMudG9wb2xvZ3lXb3JrZXJNYXhIZWFwU2l6ZTsKKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2NoZWR1bGVyL1dvcmtlclNsb3QuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zY2hlZHVsZXIvV29ya2VyU2xvdC5qYXZhCmluZGV4IGM4OWIzYmMuLjI1ODkyZGYgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zY2hlZHVsZXIvV29ya2VyU2xvdC5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zY2hlZHVsZXIvV29ya2VyU2xvdC5qYXZhCkBAIC0yMCw2ICsyMCwxMiBAQAogcHVibGljIGNsYXNzIFdvcmtlclNsb3QgewogICAgIFN0cmluZyBub2RlSWQ7CiAgICAgaW50IHBvcnQ7CisgICAgLy8gYW1vdW50IG9mIG9uLWhlYXAgbWVtb3J5IGFsbG9jYXRlZCB0byBpdAorICAgIGRvdWJsZSBtZW1PbkhlYXAgPSAwLjA7CisgICAgLy8gYW1vdW50IG9mIG9mZi1oZWFwIG1lbW9yeSBhbGxvY2F0ZWQgdG8gaXQKKyAgICBkb3VibGUgbWVtT2ZmSGVhcCA9IDAuMDsKKyAgICAvLyBhbW91bnQgb2YgY3B1IGFsbG9jYXRlZCB0byBpdAorICAgIGRvdWJsZSBjcHUgPSAwLjA7CiAgICAgCiAgICAgcHVibGljIFdvcmtlclNsb3QoU3RyaW5nIG5vZGVJZCwgTnVtYmVyIHBvcnQpIHsKICAgICAgICAgdGhpcy5ub2RlSWQgPSBub2RlSWQ7CkBAIC0zNCw2ICs0MCwyNSBAQAogICAgICAgICByZXR1cm4gcG9ydDsKICAgICB9CiAKKyAgICBwdWJsaWMgV29ya2VyU2xvdCBhbGxvY2F0ZVJlc291cmNlKGRvdWJsZSBtZW1PbkhlYXAsIGRvdWJsZSBtZW1PZmZIZWFwLCBkb3VibGUgY3B1KSB7CisgICAgICAgIHRoaXMubWVtT25IZWFwICs9IG1lbU9uSGVhcDsKKyAgICAgICAgdGhpcy5tZW1PZmZIZWFwICs9IG1lbU9mZkhlYXA7CisgICAgICAgIHRoaXMuY3B1ICs9IGNwdTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIGRvdWJsZSBnZXRBbGxvY2F0ZWRNZW1PbkhlYXAoKSB7CisgICAgICAgIHJldHVybiBtZW1PbkhlYXA7CisgICAgfQorCisgICAgcHVibGljIGRvdWJsZSBnZXRBbGxvY2F0ZWRNZW1PZmZIZWFwKCkgeworICAgICAgICByZXR1cm4gbWVtT2ZmSGVhcDsKKyAgICB9CisKKyAgICBwdWJsaWMgZG91YmxlIGdldEFsbG9jYXRlZENwdSgpIHsKKyAgICAgICAgcmV0dXJuIGNwdTsKKyAgICB9CisKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewogICAgICAgICByZXR1cm4gbm9kZUlkLmhhc2hDb2RlKCkgKyAxMyAqICgoSW50ZWdlcikgcG9ydCkuaGFzaENvZGUoKTsKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zY2hlZHVsZXIvbXVsdGl0ZW5hbnQvRGVmYXVsdFBvb2wuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zY2hlZHVsZXIvbXVsdGl0ZW5hbnQvRGVmYXVsdFBvb2wuamF2YQppbmRleCAzMDUzYjViLi4yZTQxOGU5IDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2NoZWR1bGVyL211bHRpdGVuYW50L0RlZmF1bHRQb29sLmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NjaGVkdWxlci9tdWx0aXRlbmFudC9EZWZhdWx0UG9vbC5qYXZhCkBAIC0zNyw4ICszNyw4IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBEZWZhdWx0UG9vbCBleHRlbmRzIE5vZGVQb29sIHsKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKERlZmF1bHRQb29sLmNsYXNzKTsKLSAgcHJpdmF0ZSBTZXQ8Tm9kZT4gX25vZGVzID0gbmV3IEhhc2hTZXQ8Tm9kZT4oKTsKLSAgcHJpdmF0ZSBIYXNoTWFwPFN0cmluZywgVG9wb2xvZ3lEZXRhaWxzPiBfdGRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBUb3BvbG9neURldGFpbHM+KCk7CisgIHByaXZhdGUgU2V0PE5vZGU+IF9ub2RlcyA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgcHJpdmF0ZSBIYXNoTWFwPFN0cmluZywgVG9wb2xvZ3lEZXRhaWxzPiBfdGRzID0gbmV3IEhhc2hNYXA8PigpOwogICAKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyB2b2lkIGFkZFRvcG9sb2d5KFRvcG9sb2d5RGV0YWlscyB0ZCkgewpAQCAtNjEsOCArNjEsOCBAQAogCiAgIEBPdmVycmlkZQogICBwdWJsaWMgQ29sbGVjdGlvbjxOb2RlPiB0YWtlTm9kZXMoaW50IG5vZGVzTmVlZGVkKSB7Ci0gICAgSGFzaFNldDxOb2RlPiByZXQgPSBuZXcgSGFzaFNldDxOb2RlPigpOwotICAgIExpbmtlZExpc3Q8Tm9kZT4gc29ydGVkTm9kZXMgPSBuZXcgTGlua2VkTGlzdDxOb2RlPihfbm9kZXMpOworICAgIEhhc2hTZXQ8Tm9kZT4gcmV0ID0gbmV3IEhhc2hTZXQ8PigpOworICAgIExpbmtlZExpc3Q8Tm9kZT4gc29ydGVkTm9kZXMgPSBuZXcgTGlua2VkTGlzdDw+KF9ub2Rlcyk7CiAgICAgQ29sbGVjdGlvbnMuc29ydChzb3J0ZWROb2RlcywgTm9kZS5GUkVFX05PREVfQ09NUEFSQVRPUl9ERUMpOwogICAgIGZvciAoTm9kZSBuOiBzb3J0ZWROb2RlcykgewogICAgICAgaWYgKG5vZGVzTmVlZGVkIDw9IHJldC5zaXplKCkpIHsKQEAgLTk1LDcgKzk1LDcgQEAKICAgcHVibGljIE5vZGVBbmRTbG90Q291bnRzIGdldE5vZGVBbmRTbG90Q291bnRJZlNsb3RzV2VyZVRha2VuKGludCBzbG90c05lZWRlZCkgewogICAgIGludCBub2Rlc0ZvdW5kID0gMDsKICAgICBpbnQgc2xvdHNGb3VuZCA9IDA7Ci0gICAgTGlua2VkTGlzdDxOb2RlPiBzb3J0ZWROb2RlcyA9IG5ldyBMaW5rZWRMaXN0PE5vZGU+KF9ub2Rlcyk7CisgICAgTGlua2VkTGlzdDxOb2RlPiBzb3J0ZWROb2RlcyA9IG5ldyBMaW5rZWRMaXN0PD4oX25vZGVzKTsKICAgICBDb2xsZWN0aW9ucy5zb3J0KHNvcnRlZE5vZGVzLCBOb2RlLkZSRUVfTk9ERV9DT01QQVJBVE9SX0RFQyk7CiAgICAgZm9yIChOb2RlIG46IHNvcnRlZE5vZGVzKSB7CiAgICAgICBpZiAoc2xvdHNOZWVkZWQgPD0gMCkgewpAQCAtMTEzLDggKzExMyw4IEBACiAgIAogICBAT3ZlcnJpZGUKICAgcHVibGljIENvbGxlY3Rpb248Tm9kZT4gdGFrZU5vZGVzQnlTbG90cyhpbnQgc2xvdHNOZWVkZWQpIHsKLSAgICBIYXNoU2V0PE5vZGU+IHJldCA9IG5ldyBIYXNoU2V0PE5vZGU+KCk7Ci0gICAgTGlua2VkTGlzdDxOb2RlPiBzb3J0ZWROb2RlcyA9IG5ldyBMaW5rZWRMaXN0PE5vZGU+KF9ub2Rlcyk7CisgICAgSGFzaFNldDxOb2RlPiByZXQgPSBuZXcgSGFzaFNldDw+KCk7CisgICAgTGlua2VkTGlzdDxOb2RlPiBzb3J0ZWROb2RlcyA9IG5ldyBMaW5rZWRMaXN0PD4oX25vZGVzKTsKICAgICBDb2xsZWN0aW9ucy5zb3J0KHNvcnRlZE5vZGVzLCBOb2RlLkZSRUVfTk9ERV9DT01QQVJBVE9SX0RFQyk7CiAgICAgZm9yIChOb2RlIG46IHNvcnRlZE5vZGVzKSB7CiAgICAgICBpZiAoc2xvdHNOZWVkZWQgPD0gMCkgewpAQCAtMTQ4LDggKzE0OCw4IEBACiAgICAgICAgIH0KICAgICAgICAgaW50IHNsb3RzVG9Vc2UgPSBNYXRoLm1pbihzbG90c1JlcXVlc3RlZCAtIHNsb3RzVXNlZCwgc2xvdHNGcmVlICsgc2xvdHNBdmFpbGFibGUpOwogICAgICAgICBpbnQgZXhlY3V0b3JzTm90UnVubmluZyA9IF9jbHVzdGVyLmdldFVuYXNzaWduZWRFeGVjdXRvcnModGQpLnNpemUoKTsKLSAgICAgICAgTE9HLmRlYnVnKCJTbG90cy4uLiByZXF1ZXN0ZWQge30gdXNlZCB7fSBmcmVlIHt9IGF2YWlsYWJsZSB7fSB0byBiZSB1c2VkIHt9LCBleGVjdXRvcnMgbm90IHJ1bm5pbmcge30iLCAKLSAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7c2xvdHNSZXF1ZXN0ZWQsIHNsb3RzVXNlZCwgc2xvdHNGcmVlLCBzbG90c0F2YWlsYWJsZSwgc2xvdHNUb1VzZSwgZXhlY3V0b3JzTm90UnVubmluZ30pOyAKKyAgICAgICAgTE9HLmRlYnVnKCJTbG90cy4uLiByZXF1ZXN0ZWQge30gdXNlZCB7fSBmcmVlIHt9IGF2YWlsYWJsZSB7fSB0byBiZSB1c2VkIHt9LCBleGVjdXRvcnMgbm90IHJ1bm5pbmcge30iLAorICAgICAgICAgICAgICAgIHNsb3RzUmVxdWVzdGVkLCBzbG90c1VzZWQsIHNsb3RzRnJlZSwgc2xvdHNBdmFpbGFibGUsIHNsb3RzVG9Vc2UsIGV4ZWN1dG9yc05vdFJ1bm5pbmcpOwogICAgICAgICBpZiAoc2xvdHNUb1VzZSA8PSAwKSB7CiAgICAgICAgICAgaWYgKGV4ZWN1dG9yc05vdFJ1bm5pbmcgPiAwKSB7CiAgICAgICAgICAgICBfY2x1c3Rlci5zZXRTdGF0dXModG9wSWQsIk5vdCBmdWxseSBzY2hlZHVsZWQgKE5vIGZyZWUgc2xvdHMgaW4gZGVmYXVsdCBwb29sKSAiK2V4ZWN1dG9yc05vdFJ1bm5pbmcrIiBleGVjdXRvcnMgbm90IHNjaGVkdWxlZCIpOwpAQCAtMTgwLDkgKzE4MCw5IEBACiAgICAgICAgIFJvdW5kUm9iaW5TbG90U2NoZWR1bGVyIHNsb3RTY2hlZCA9IAogICAgICAgICAgIG5ldyBSb3VuZFJvYmluU2xvdFNjaGVkdWxlcih0ZCwgc2xvdHNUb1VzZSwgX2NsdXN0ZXIpOwogICAgICAgICAKLSAgICAgICAgTGlua2VkTGlzdDxOb2RlPiBub2RlcyA9IG5ldyBMaW5rZWRMaXN0PE5vZGU+KF9ub2Rlcyk7CisgICAgICAgIExpbmtlZExpc3Q8Tm9kZT4gbm9kZXMgPSBuZXcgTGlua2VkTGlzdDw+KF9ub2Rlcyk7CiAgICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgTm9kZSBuID0gbnVsbDsKKyAgICAgICAgICBOb2RlIG47CiAgICAgICAgICAgZG8gewogICAgICAgICAgICAgaWYgKG5vZGVzLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGlzIHNob3VsZCBub3QgaGFwcGVuLCB3ZSIgKwpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NjaGVkdWxlci9tdWx0aXRlbmFudC9GcmVlUG9vbC5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NjaGVkdWxlci9tdWx0aXRlbmFudC9GcmVlUG9vbC5qYXZhCmluZGV4IGM2MjU4OTUuLjQ1NjkwMGIgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zY2hlZHVsZXIvbXVsdGl0ZW5hbnQvRnJlZVBvb2wuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2NoZWR1bGVyL211bHRpdGVuYW50L0ZyZWVQb29sLmphdmEKQEAgLTM1LDcgKzM1LDcgQEAKICAqLwogcHVibGljIGNsYXNzIEZyZWVQb29sIGV4dGVuZHMgTm9kZVBvb2wgewogICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoRnJlZVBvb2wuY2xhc3MpOwotICBwcml2YXRlIFNldDxOb2RlPiBfbm9kZXMgPSBuZXcgSGFzaFNldDxOb2RlPigpOworICBwcml2YXRlIFNldDxOb2RlPiBfbm9kZXMgPSBuZXcgSGFzaFNldDw+KCk7CiAgIHByaXZhdGUgaW50IF90b3RhbFNsb3RzID0gMDsKIAogICBAT3ZlcnJpZGUKQEAgLTYzLDcgKzYzLDcgQEAKICAgCiAgIEBPdmVycmlkZQogICBwdWJsaWMgQ29sbGVjdGlvbjxOb2RlPiB0YWtlTm9kZXMoaW50IG5vZGVzTmVlZGVkKSB7Ci0gICAgSGFzaFNldDxOb2RlPiByZXQgPSBuZXcgSGFzaFNldDxOb2RlPigpOworICAgIEhhc2hTZXQ8Tm9kZT4gcmV0ID0gbmV3IEhhc2hTZXQ8PigpOwogICAgIEl0ZXJhdG9yPE5vZGU+IGl0ID0gX25vZGVzLml0ZXJhdG9yKCk7CiAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSAmJiBub2Rlc05lZWRlZCA+IHJldC5zaXplKCkpIHsKICAgICAgIE5vZGUgbiA9IGl0Lm5leHQoKTsKQEAgLTg2LDcgKzg2LDcgQEAKIAogICBAT3ZlcnJpZGUKICAgcHVibGljIENvbGxlY3Rpb248Tm9kZT4gdGFrZU5vZGVzQnlTbG90cyhpbnQgc2xvdHNOZWVkZWQpIHsKLSAgICBIYXNoU2V0PE5vZGU+IHJldCA9IG5ldyBIYXNoU2V0PE5vZGU+KCk7CisgICAgSGFzaFNldDxOb2RlPiByZXQgPSBuZXcgSGFzaFNldDw+KCk7CiAgICAgSXRlcmF0b3I8Tm9kZT4gaXQgPSBfbm9kZXMuaXRlcmF0b3IoKTsKICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpICYmIHNsb3RzTmVlZGVkID4gMCkgewogICAgICAgTm9kZSBuID0gaXQubmV4dCgpOwpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NjaGVkdWxlci9tdWx0aXRlbmFudC9Jc29sYXRlZFBvb2wuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zY2hlZHVsZXIvbXVsdGl0ZW5hbnQvSXNvbGF0ZWRQb29sLmphdmEKaW5kZXggZGM3ZWRlZC4uMjVhNmYyNSAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NjaGVkdWxlci9tdWx0aXRlbmFudC9Jc29sYXRlZFBvb2wuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2NoZWR1bGVyL211bHRpdGVuYW50L0lzb2xhdGVkUG9vbC5qYXZhCkBAIC00MSw5ICs0MSw5IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBJc29sYXRlZFBvb2wgZXh0ZW5kcyBOb2RlUG9vbCB7CiAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihJc29sYXRlZFBvb2wuY2xhc3MpOwotICBwcml2YXRlIE1hcDxTdHJpbmcsIFNldDxOb2RlPj4gX3RvcG9sb2d5SWRUb05vZGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTZXQ8Tm9kZT4+KCk7Ci0gIHByaXZhdGUgSGFzaE1hcDxTdHJpbmcsIFRvcG9sb2d5RGV0YWlscz4gX3RkcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgVG9wb2xvZ3lEZXRhaWxzPigpOwotICBwcml2YXRlIEhhc2hTZXQ8U3RyaW5nPiBfaXNvbGF0ZWQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgIHByaXZhdGUgTWFwPFN0cmluZywgU2V0PE5vZGU+PiBfdG9wb2xvZ3lJZFRvTm9kZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisgIHByaXZhdGUgSGFzaE1hcDxTdHJpbmcsIFRvcG9sb2d5RGV0YWlscz4gX3RkcyA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgcHJpdmF0ZSBIYXNoU2V0PFN0cmluZz4gX2lzb2xhdGVkID0gbmV3IEhhc2hTZXQ8PigpOwogICBwcml2YXRlIGludCBfbWF4Tm9kZXM7CiAgIHByaXZhdGUgaW50IF91c2VkTm9kZXM7CiAKQEAgLTU3LDcgKzU3LDcgQEAKICAgICBTdHJpbmcgdG9wSWQgPSB0ZC5nZXRJZCgpOwogICAgIExPRy5kZWJ1ZygiQWRkaW5nIGluIFRvcG9sb2d5IHt9IiwgdG9wSWQpOwogICAgIFNjaGVkdWxlckFzc2lnbm1lbnQgYXNzaWdubWVudCA9IF9jbHVzdGVyLmdldEFzc2lnbm1lbnRCeUlkKHRvcElkKTsKLSAgICBTZXQ8Tm9kZT4gYXNzaWduZWROb2RlcyA9IG5ldyBIYXNoU2V0PE5vZGU+KCk7CisgICAgU2V0PE5vZGU+IGFzc2lnbmVkTm9kZXMgPSBuZXcgSGFzaFNldDw+KCk7CiAgICAgaWYgKGFzc2lnbm1lbnQgIT0gbnVsbCkgewogICAgICAgZm9yIChXb3JrZXJTbG90IHdzOiBhc3NpZ25tZW50LmdldFNsb3RzKCkpIHsKICAgICAgICAgTm9kZSBuID0gX25vZGVJZFRvTm9kZS5nZXQod3MuZ2V0Tm9kZUlkKCkpOwpAQCAtOTYsNyArOTYsNyBAQAogICAgICAgICBMT0cuZGVidWcoIlNjaGVkdWxpbmcgdG9wb2xvZ3kge30iLHRvcElkKTsKICAgICAgICAgU2V0PE5vZGU+IGFsbE5vZGVzID0gX3RvcG9sb2d5SWRUb05vZGVzLmdldCh0b3BJZCk7CiAgICAgICAgIE51bWJlciBub2Rlc1JlcXVlc3RlZCA9IChOdW1iZXIpIHRkLmdldENvbmYoKS5nZXQoQ29uZmlnLlRPUE9MT0dZX0lTT0xBVEVEX01BQ0hJTkVTKTsKLSAgICAgICAgaW50IHNsb3RzVG9Vc2UgPSAwOworICAgICAgICBpbnQgc2xvdHNUb1VzZTsKICAgICAgICAgaWYgKG5vZGVzUmVxdWVzdGVkID09IG51bGwpIHsKICAgICAgICAgICBzbG90c1RvVXNlID0gZ2V0Tm9kZXNGb3JOb3RJc29sYXRlZFRvcCh0ZCwgYWxsTm9kZXMsIGxlc3NlclBvb2xzKTsKICAgICAgICAgfSBlbHNlIHsKQEAgLTExMSw3ICsxMTEsNyBAQAogICAgICAgICBSb3VuZFJvYmluU2xvdFNjaGVkdWxlciBzbG90U2NoZWQgPSAKICAgICAgICAgICBuZXcgUm91bmRSb2JpblNsb3RTY2hlZHVsZXIodGQsIHNsb3RzVG9Vc2UsIF9jbHVzdGVyKTsKICAgICAgICAgCi0gICAgICAgIExpbmtlZExpc3Q8Tm9kZT4gc29ydGVkTm9kZXMgPSBuZXcgTGlua2VkTGlzdDxOb2RlPihhbGxOb2Rlcyk7CisgICAgICAgIExpbmtlZExpc3Q8Tm9kZT4gc29ydGVkTm9kZXMgPSBuZXcgTGlua2VkTGlzdDw+KGFsbE5vZGVzKTsKICAgICAgICAgQ29sbGVjdGlvbnMuc29ydChzb3J0ZWROb2RlcywgTm9kZS5GUkVFX05PREVfQ09NUEFSQVRPUl9ERUMpOwogCiAgICAgICAgIExPRy5kZWJ1ZygiTm9kZXMgc29ydGVkIGJ5IGZyZWUgc3BhY2Uge30iLCBzb3J0ZWROb2Rlcyk7CkBAIC0xNTcsOSArMTU3LDkgQEAKICAgICBpbnQgbm9kZXNVc2VkID0gX3RvcG9sb2d5SWRUb05vZGVzLmdldCh0b3BJZCkuc2l6ZSgpOwogICAgIGludCBub2Rlc05lZWRlZCA9IG5vZGVzUmVxdWVzdGVkIC0gbm9kZXNVc2VkOwogICAgIExPRy5kZWJ1ZygiTm9kZXMuLi4gcmVxdWVzdGVkIHt9IHVzZWQge30gYXZhaWxhYmxlIGZyb20gdXMge30gIiArCi0gICAgICAgICJhdmFpbCBmcm9tIG90aGVyIHt9IG5lZWRlZCB7fSIsIG5ldyBPYmplY3RbXSB7bm9kZXNSZXF1ZXN0ZWQsIAotICAgICAgICBub2Rlc1VzZWQsIG5vZGVzRnJvbVVzQXZhaWxhYmxlLCBub2Rlc0Zyb21PdGhlcnNBdmFpbGFibGUsCi0gICAgICAgIG5vZGVzTmVlZGVkfSk7CisgICAgICAgICJhdmFpbCBmcm9tIG90aGVyIHt9IG5lZWRlZCB7fSIsIG5vZGVzUmVxdWVzdGVkLAorICAgICAgICAgICAgbm9kZXNVc2VkLCBub2Rlc0Zyb21Vc0F2YWlsYWJsZSwgbm9kZXNGcm9tT3RoZXJzQXZhaWxhYmxlLAorICAgICAgICAgICAgbm9kZXNOZWVkZWQpOwogICAgIGlmICgobm9kZXNOZWVkZWQgLSBub2Rlc0Zyb21Vc0F2YWlsYWJsZSkgPiAoX21heE5vZGVzIC0gX3VzZWROb2RlcykpIHsKICAgICAgIF9jbHVzdGVyLnNldFN0YXR1cyh0b3BJZCwiTWF4IE5vZGVzKCIrX21heE5vZGVzKyIpIGZvciB0aGlzIHVzZXIgd291bGQgYmUgZXhjZWVkZWQuICIKICAgICAgICAgKyAoKG5vZGVzTmVlZGVkIC0gbm9kZXNGcm9tVXNBdmFpbGFibGUpIC0gKF9tYXhOb2RlcyAtIF91c2VkTm9kZXMpKSAKQEAgLTIyNCw4ICsyMjQsOCBAQAogICAgICAgc2xvdHNBdmFpbGFibGUgPSBOb2RlUG9vbC5zbG90c0F2YWlsYWJsZShsZXNzZXJQb29scyk7CiAgICAgfQogICAgIGludCBzbG90c1RvVXNlID0gTWF0aC5taW4oc2xvdHNSZXF1ZXN0ZWQgLSBzbG90c1VzZWQsIHNsb3RzRnJlZSArIHNsb3RzQXZhaWxhYmxlKTsKLSAgICBMT0cuZGVidWcoIlNsb3RzLi4uIHJlcXVlc3RlZCB7fSB1c2VkIHt9IGZyZWUge30gYXZhaWxhYmxlIHt9IHRvIGJlIHVzZWQge30iLCAKLSAgICAgICAgbmV3IE9iamVjdFtdIHtzbG90c1JlcXVlc3RlZCwgc2xvdHNVc2VkLCBzbG90c0ZyZWUsIHNsb3RzQXZhaWxhYmxlLCBzbG90c1RvVXNlfSk7CisgICAgTE9HLmRlYnVnKCJTbG90cy4uLiByZXF1ZXN0ZWQge30gdXNlZCB7fSBmcmVlIHt9IGF2YWlsYWJsZSB7fSB0byBiZSB1c2VkIHt9IiwKKyAgICAgICAgICAgIHNsb3RzUmVxdWVzdGVkLCBzbG90c1VzZWQsIHNsb3RzRnJlZSwgc2xvdHNBdmFpbGFibGUsIHNsb3RzVG9Vc2UpOwogICAgIGlmIChzbG90c1RvVXNlIDw9IDApIHsKICAgICAgIF9jbHVzdGVyLnNldFN0YXR1cyh0b3BJZCwgIk5vdCBFbm91Z2ggU2xvdHMgQXZhaWxhYmxlIHRvIFNjaGVkdWxlIFRvcG9sb2d5Iik7CiAgICAgICByZXR1cm4gMDsKQEAgLTIzMyw3ICsyMzMsNyBAQAogICAgIGludCBzbG90c05lZWRlZCA9IHNsb3RzVG9Vc2UgLSBzbG90c0ZyZWU7CiAgICAgaW50IG51bU5ld05vZGVzID0gTm9kZVBvb2wuZ2V0Tm9kZUNvdW50SWZTbG90c1dlcmVUYWtlbihzbG90c05lZWRlZCwgbGVzc2VyUG9vbHMpOwogICAgIExPRy5kZWJ1ZygiTm9kZXMuLi4gbmV3IHt9IHVzZWQge30gbWF4IHt9IiwKLSAgICAgICAgbmV3IE9iamVjdFtde251bU5ld05vZGVzLCBfdXNlZE5vZGVzLCBfbWF4Tm9kZXN9KTsKKyAgICAgICAgICAgIG51bU5ld05vZGVzLCBfdXNlZE5vZGVzLCBfbWF4Tm9kZXMpOwogICAgIGlmICgobnVtTmV3Tm9kZXMgKyBfdXNlZE5vZGVzKSA+IF9tYXhOb2RlcykgewogICAgICAgX2NsdXN0ZXIuc2V0U3RhdHVzKHRvcElkLCJNYXggTm9kZXMoIitfbWF4Tm9kZXMrIikgZm9yIHRoaXMgdXNlciB3b3VsZCBiZSBleGNlZWRlZC4gIiArCiAgICAgICAobnVtTmV3Tm9kZXMgLSAoX21heE5vZGVzIC0gX3VzZWROb2RlcykpICsgIiBtb3JlIG5vZGVzIG5lZWRlZCB0byBydW4gdG9wb2xvZ3kuIik7CkBAIC0yNDksNyArMjQ5LDcgQEAKICAgQE92ZXJyaWRlCiAgIHB1YmxpYyBDb2xsZWN0aW9uPE5vZGU+IHRha2VOb2RlcyhpbnQgbm9kZXNOZWVkZWQpIHsKICAgICBMT0cuZGVidWcoIlRha2luZyB7fSBmcm9tIHt9Iiwgbm9kZXNOZWVkZWQsIHRoaXMpOwotICAgIEhhc2hTZXQ8Tm9kZT4gcmV0ID0gbmV3IEhhc2hTZXQ8Tm9kZT4oKTsKKyAgICBIYXNoU2V0PE5vZGU+IHJldCA9IG5ldyBIYXNoU2V0PD4oKTsKICAgICBmb3IgKEVudHJ5PFN0cmluZywgU2V0PE5vZGU+PiBlbnRyeTogX3RvcG9sb2d5SWRUb05vZGVzLmVudHJ5U2V0KCkpIHsKICAgICAgIGlmICghX2lzb2xhdGVkLmNvbnRhaW5zKGVudHJ5LmdldEtleSgpKSkgewogICAgICAgICBJdGVyYXRvcjxOb2RlPiBpdCA9IGVudHJ5LmdldFZhbHVlKCkuaXRlcmF0b3IoKTsKQEAgLTI5Myw3ICsyOTMsNyBAQAogCiAgIEBPdmVycmlkZQogICBwdWJsaWMgQ29sbGVjdGlvbjxOb2RlPiB0YWtlTm9kZXNCeVNsb3RzKGludCBzbG90c05lZWRlZCkgewotICAgIEhhc2hTZXQ8Tm9kZT4gcmV0ID0gbmV3IEhhc2hTZXQ8Tm9kZT4oKTsKKyAgICBIYXNoU2V0PE5vZGU+IHJldCA9IG5ldyBIYXNoU2V0PD4oKTsKICAgICBmb3IgKEVudHJ5PFN0cmluZywgU2V0PE5vZGU+PiBlbnRyeTogX3RvcG9sb2d5SWRUb05vZGVzLmVudHJ5U2V0KCkpIHsKICAgICAgIGlmICghX2lzb2xhdGVkLmNvbnRhaW5zKGVudHJ5LmdldEtleSgpKSkgewogICAgICAgICBJdGVyYXRvcjxOb2RlPiBpdCA9IGVudHJ5LmdldFZhbHVlKCkuaXRlcmF0b3IoKTsKQEAgLTMyMSw5ICszMjEsNyBAQAogICAgIGludCBzbG90c0ZvdW5kID0gMDsKICAgICBmb3IgKEVudHJ5PFN0cmluZywgU2V0PE5vZGU+PiBlbnRyeTogX3RvcG9sb2d5SWRUb05vZGVzLmVudHJ5U2V0KCkpIHsKICAgICAgIGlmICghX2lzb2xhdGVkLmNvbnRhaW5zKGVudHJ5LmdldEtleSgpKSkgewotICAgICAgICBJdGVyYXRvcjxOb2RlPiBpdCA9IGVudHJ5LmdldFZhbHVlKCkuaXRlcmF0b3IoKTsKLSAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgIE5vZGUgbiA9IGl0Lm5leHQoKTsKKyAgICAgICAgZm9yIChOb2RlIG4gOiBlbnRyeS5nZXRWYWx1ZSgpKSB7CiAgICAgICAgICAgaWYgKG4uaXNBbGl2ZSgpKSB7CiAgICAgICAgICAgICBub2Rlc0ZvdW5kKys7CiAgICAgICAgICAgICBpbnQgdG90YWxTbG90c0ZyZWUgPSBuLnRvdGFsU2xvdHMoKTsKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zY2hlZHVsZXIvbXVsdGl0ZW5hbnQvTXVsdGl0ZW5hbnRTY2hlZHVsZXIuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zY2hlZHVsZXIvbXVsdGl0ZW5hbnQvTXVsdGl0ZW5hbnRTY2hlZHVsZXIuamF2YQppbmRleCAzMjBiMzg4Li42Yjc3YzYzIDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2NoZWR1bGVyL211bHRpdGVuYW50L011bHRpdGVuYW50U2NoZWR1bGVyLmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NjaGVkdWxlci9tdWx0aXRlbmFudC9NdWx0aXRlbmFudFNjaGVkdWxlci5qYXZhCkBAIC00NCw5ICs0NCw5IEBACiAgIHByaXZhdGUgTWFwPFN0cmluZywgTnVtYmVyPiBnZXRVc2VyQ29uZigpIHsKICAgICBNYXA8U3RyaW5nLCBOdW1iZXI+IHJldCA9IChNYXA8U3RyaW5nLCBOdW1iZXI+KV9jb25mLmdldChDb25maWcuTVVMVElURU5BTlRfU0NIRURVTEVSX1VTRVJfUE9PTFMpOwogICAgIGlmIChyZXQgPT0gbnVsbCkgewotICAgICAgcmV0ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBOdW1iZXI+KCk7CisgICAgICByZXQgPSBuZXcgSGFzaE1hcDw+KCk7CiAgICAgfSBlbHNlIHsKLSAgICAgIHJldCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTnVtYmVyPihyZXQpOyAKKyAgICAgIHJldCA9IG5ldyBIYXNoTWFwPD4ocmV0KTsKICAgICB9CiAKICAgICBNYXAgZnJvbUZpbGUgPSBVdGlscy5maW5kQW5kUmVhZENvbmZpZ0ZpbGUoIm11bHRpdGVuYW50LXNjaGVkdWxlci55YW1sIiwgZmFsc2UpOwpAQCAtNjUsNyArNjUsNyBAQAogICAgIAogICAgIE1hcDxTdHJpbmcsIE51bWJlcj4gdXNlckNvbmYgPSBnZXRVc2VyQ29uZigpOwogICAgIAotICAgIE1hcDxTdHJpbmcsIElzb2xhdGVkUG9vbD4gdXNlclBvb2xzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJc29sYXRlZFBvb2w+KCk7CisgICAgTWFwPFN0cmluZywgSXNvbGF0ZWRQb29sPiB1c2VyUG9vbHMgPSBuZXcgSGFzaE1hcDw+KCk7CiAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBOdW1iZXI+IGVudHJ5IDogdXNlckNvbmYuZW50cnlTZXQoKSkgewogICAgICAgdXNlclBvb2xzLnB1dChlbnRyeS5nZXRLZXkoKSwgbmV3IElzb2xhdGVkUG9vbChlbnRyeS5nZXRWYWx1ZSgpLmludFZhbHVlKCkpKTsKICAgICB9CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2NoZWR1bGVyL211bHRpdGVuYW50L05vZGUuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zY2hlZHVsZXIvbXVsdGl0ZW5hbnQvTm9kZS5qYXZhCmluZGV4IDg4M2M2NWYuLjZjMmYwNmIgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zY2hlZHVsZXIvbXVsdGl0ZW5hbnQvTm9kZS5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zY2hlZHVsZXIvbXVsdGl0ZW5hbnQvTm9kZS5qYXZhCkBAIC00MCw4ICs0MCw4IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBOb2RlIHsKICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKE5vZGUuY2xhc3MpOwotICBwcml2YXRlIE1hcDxTdHJpbmcsIFNldDxXb3JrZXJTbG90Pj4gX3RvcElkVG9Vc2VkU2xvdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsU2V0PFdvcmtlclNsb3Q+PigpOwotICBwcml2YXRlIFNldDxXb3JrZXJTbG90PiBfZnJlZVNsb3RzID0gbmV3IEhhc2hTZXQ8V29ya2VyU2xvdD4oKTsKKyAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTZXQ8V29ya2VyU2xvdD4+IF90b3BJZFRvVXNlZFNsb3RzID0gbmV3IEhhc2hNYXA8PigpOworICBwcml2YXRlIFNldDxXb3JrZXJTbG90PiBfZnJlZVNsb3RzID0gbmV3IEhhc2hTZXQ8PigpOwogICBwcml2YXRlIGZpbmFsIFN0cmluZyBfbm9kZUlkOwogICBwcml2YXRlIGJvb2xlYW4gX2lzQWxpdmU7CiAgIApAQCAtMTQzLDcgKzE0Myw3IEBACiAgICAgfQogICAgIFNldDxXb3JrZXJTbG90PiB1c2VkU2xvdHMgPSBfdG9wSWRUb1VzZWRTbG90cy5nZXQodG9wSWQpOwogICAgIGlmICh1c2VkU2xvdHMgPT0gbnVsbCkgewotICAgICAgdXNlZFNsb3RzID0gbmV3IEhhc2hTZXQ8V29ya2VyU2xvdD4oKTsKKyAgICAgIHVzZWRTbG90cyA9IG5ldyBIYXNoU2V0PD4oKTsKICAgICAgIF90b3BJZFRvVXNlZFNsb3RzLnB1dCh0b3BJZCwgdXNlZFNsb3RzKTsKICAgICB9CiAgICAgdXNlZFNsb3RzLmFkZCh3cyk7CkBAIC0xNjQsNyArMTY0LDcgQEAKICAgICAgICAgX2ZyZWVTbG90cy5hZGRBbGwoZW50cnkuZ2V0VmFsdWUoKSk7CiAgICAgICB9CiAgICAgfQotICAgIF90b3BJZFRvVXNlZFNsb3RzID0gbmV3IEhhc2hNYXA8U3RyaW5nLFNldDxXb3JrZXJTbG90Pj4oKTsKKyAgICBfdG9wSWRUb1VzZWRTbG90cyA9IG5ldyBIYXNoTWFwPD4oKTsKICAgfQogICAKICAgLyoqCkBAIC0yNDIsMTAgKzI0Miw3IEBACiAgIAogICBAT3ZlcnJpZGUKICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcikgewotICAgIGlmIChvdGhlciBpbnN0YW5jZW9mIE5vZGUpIHsKLSAgICAgIHJldHVybiBfbm9kZUlkLmVxdWFscygoKE5vZGUpb3RoZXIpLl9ub2RlSWQpOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7CisgICAgICByZXR1cm4gb3RoZXIgaW5zdGFuY2VvZiBOb2RlICYmIF9ub2RlSWQuZXF1YWxzKCgoTm9kZSkgb3RoZXIpLl9ub2RlSWQpOwogICB9CiAgIAogICBAT3ZlcnJpZGUKQEAgLTI5NSwxMyArMjkyLDEzIEBACiAgIH0KICAgCiAgIHB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgTm9kZT4gZ2V0QWxsTm9kZXNGcm9tKENsdXN0ZXIgY2x1c3RlcikgewotICAgIE1hcDxTdHJpbmcsIE5vZGU+IG5vZGVJZFRvTm9kZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgTm9kZT4oKTsKKyAgICBNYXA8U3RyaW5nLCBOb2RlPiBub2RlSWRUb05vZGUgPSBuZXcgSGFzaE1hcDw+KCk7CiAgICAgZm9yIChTdXBlcnZpc29yRGV0YWlscyBzdXAgOiBjbHVzdGVyLmdldFN1cGVydmlzb3JzKCkudmFsdWVzKCkpIHsKICAgICAgIC8vTm9kZSBJRCBhbmQgc3VwZXJ2aXNvciBJRCBhcmUgdGhlIHNhbWUuCiAgICAgICBTdHJpbmcgaWQgPSBzdXAuZ2V0SWQoKTsKICAgICAgIGJvb2xlYW4gaXNBbGl2ZSA9ICFjbHVzdGVyLmlzQmxhY2tMaXN0ZWQoaWQpOwogICAgICAgTE9HLmRlYnVnKCJGb3VuZCBhIHt9IE5vZGUge30ge30iLAotICAgICAgICAgIG5ldyBPYmplY3RbXSB7aXNBbGl2ZT8gImxpdmluZyI6ImRlYWQiLCBpZCwgc3VwLmdldEFsbFBvcnRzKCl9KTsKKyAgICAgICAgICAgICAgaXNBbGl2ZT8gImxpdmluZyI6ImRlYWQiLCBpZCwgc3VwLmdldEFsbFBvcnRzKCkpOwogICAgICAgbm9kZUlkVG9Ob2RlLnB1dChpZCwgbmV3IE5vZGUoaWQsIHN1cC5nZXRBbGxQb3J0cygpLCBpc0FsaXZlKSk7CiAgICAgfQogICAgIApkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NjaGVkdWxlci9tdWx0aXRlbmFudC9Ob2RlUG9vbC5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NjaGVkdWxlci9tdWx0aXRlbmFudC9Ob2RlUG9vbC5qYXZhCmluZGV4IDIxZDE1NzcuLjVhNDZkZjUgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zY2hlZHVsZXIvbXVsdGl0ZW5hbnQvTm9kZVBvb2wuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2NoZWR1bGVyL211bHRpdGVuYW50L05vZGVQb29sLmphdmEKQEAgLTgxLDcgKzgxLDcgQEAKICAgICAgIAogICAgICAgTWFwPEV4ZWN1dG9yRGV0YWlscywgU3RyaW5nPiBleGVjVG9Db21wID0gdGQuZ2V0RXhlY3V0b3JUb0NvbXBvbmVudCgpOwogICAgICAgU2NoZWR1bGVyQXNzaWdubWVudCBhc3NpZ25tZW50ID0gX2NsdXN0ZXIuZ2V0QXNzaWdubWVudEJ5SWQoX3RvcElkKTsKLSAgICAgIF9ub2RlVG9Db21wcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU2V0PFN0cmluZz4+KCk7CisgICAgICBfbm9kZVRvQ29tcHMgPSBuZXcgSGFzaE1hcDw+KCk7CiAKICAgICAgIGlmIChhc3NpZ25tZW50ICE9IG51bGwpIHsKICAgICAgICAgTWFwPEV4ZWN1dG9yRGV0YWlscywgV29ya2VyU2xvdD4gZXhlY1RvU2xvdCA9IGFzc2lnbm1lbnQuZ2V0RXhlY3V0b3JUb1Nsb3QoKTsKQEAgLTkwLDE0ICs5MCwxNCBAQAogICAgICAgICAgIFN0cmluZyBub2RlSWQgPSBlbnRyeS5nZXRWYWx1ZSgpLmdldE5vZGVJZCgpOwogICAgICAgICAgIFNldDxTdHJpbmc+IGNvbXBzID0gX25vZGVUb0NvbXBzLmdldChub2RlSWQpOwogICAgICAgICAgIGlmIChjb21wcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBjb21wcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICAgICAgICAgIGNvbXBzID0gbmV3IEhhc2hTZXQ8PigpOwogICAgICAgICAgICAgX25vZGVUb0NvbXBzLnB1dChub2RlSWQsIGNvbXBzKTsKICAgICAgICAgICB9CiAgICAgICAgICAgY29tcHMuYWRkKGV4ZWNUb0NvbXAuZ2V0KGVudHJ5LmdldEtleSgpKSk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICAgIAotICAgICAgX3NwcmVhZFRvU2NoZWR1bGUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8RXhlY3V0b3JEZXRhaWxzPj4oKTsKKyAgICAgIF9zcHJlYWRUb1NjaGVkdWxlID0gbmV3IEhhc2hNYXA8PigpOwogICAgICAgTGlzdDxTdHJpbmc+IHNwcmVhZENvbXBzID0gKExpc3Q8U3RyaW5nPil0ZC5nZXRDb25mKCkuZ2V0KENvbmZpZy5UT1BPTE9HWV9TUFJFQURfQ09NUE9ORU5UUyk7CiAgICAgICBpZiAoc3ByZWFkQ29tcHMgIT0gbnVsbCkgewogICAgICAgICBmb3IgKFN0cmluZyBjb21wOiBzcHJlYWRDb21wcykgewpAQCAtMTA1LDcgKzEwNSw3IEBACiAgICAgICAgIH0KICAgICAgIH0KICAgICAgIAotICAgICAgX3Nsb3RzID0gbmV3IExpbmtlZExpc3Q8U2V0PEV4ZWN1dG9yRGV0YWlscz4+KCk7CisgICAgICBfc2xvdHMgPSBuZXcgTGlua2VkTGlzdDw+KCk7CiAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNsb3RzVG9Vc2U7IGkrKykgewogICAgICAgICBfc2xvdHMuYWRkKG5ldyBIYXNoU2V0PEV4ZWN1dG9yRGV0YWlscz4oKSk7CiAgICAgICB9CkBAIC0xMTgsNyArMTE4LDcgQEAKICAgICAgICAgICBfc3ByZWFkVG9TY2hlZHVsZS5nZXQoZW50cnkuZ2V0S2V5KCkpLmFkZEFsbChlbnRyeS5nZXRWYWx1ZSgpKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICBmb3IgKEV4ZWN1dG9yRGV0YWlscyBlZDogZW50cnkuZ2V0VmFsdWUoKSkgewotICAgICAgICAgICAgTE9HLmRlYnVnKCJBc3NpZ25pbmcge30ge30gdG8gc2xvdCB7fSIsIG5ldyBPYmplY3RbXXtlbnRyeS5nZXRLZXkoKSwgZWQsIGF0fSk7CisgICAgICAgICAgICBMT0cuZGVidWcoIkFzc2lnbmluZyB7fSB7fSB0byBzbG90IHt9IiwgZW50cnkuZ2V0S2V5KCksIGVkLCBhdCk7CiAgICAgICAgICAgICBfc2xvdHMuZ2V0KGF0KS5hZGQoZWQpOwogICAgICAgICAgICAgYXQrKzsKICAgICAgICAgICAgIGlmIChhdCA+PSBfc2xvdHMuc2l6ZSgpKSB7CkBAIC0xNTEsNyArMTUxLDcgQEAKICAgICAgICAgU3RyaW5nIG5vZGVJZCA9IG4uZ2V0SWQoKTsKICAgICAgICAgU2V0PFN0cmluZz4gbm9kZUNvbXBzID0gX25vZGVUb0NvbXBzLmdldChub2RlSWQpOwogICAgICAgICBpZiAobm9kZUNvbXBzID09IG51bGwpIHsKLSAgICAgICAgICBub2RlQ29tcHMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgICAgICAgbm9kZUNvbXBzID0gbmV3IEhhc2hTZXQ8PigpOwogICAgICAgICAgIF9ub2RlVG9Db21wcy5wdXQobm9kZUlkLCBub2RlQ29tcHMpOwogICAgICAgICB9CiAgICAgICAgIGZvciAoRW50cnk8U3RyaW5nLCBMaXN0PEV4ZWN1dG9yRGV0YWlscz4+IGVudHJ5OiBfc3ByZWFkVG9TY2hlZHVsZS5lbnRyeVNldCgpKSB7CkBAIC0yNTEsNyArMjUxLDcgQEAKICAgCiAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxOb2RlPiB0YWtlTm9kZXNCeVNsb3QoaW50IHNsb3RzTmVlZGVkLE5vZGVQb29sW10gcG9vbHMpIHsKICAgICBMT0cuZGVidWcoIlRyeWluZyB0byBncmFiIHt9IGZyZWUgc2xvdHMgZnJvbSB7fSIsc2xvdHNOZWVkZWQsIHBvb2xzKTsKLSAgICBIYXNoU2V0PE5vZGU+IHJldCA9IG5ldyBIYXNoU2V0PE5vZGU+KCk7CisgICAgSGFzaFNldDxOb2RlPiByZXQgPSBuZXcgSGFzaFNldDw+KCk7CiAgICAgZm9yIChOb2RlUG9vbCBwb29sOiBwb29scykgewogICAgICAgQ29sbGVjdGlvbjxOb2RlPiBnb3QgPSBwb29sLnRha2VOb2Rlc0J5U2xvdHMoc2xvdHNOZWVkZWQpOwogICAgICAgcmV0LmFkZEFsbChnb3QpOwpAQCAtMjY2LDcgKzI2Niw3IEBACiAgIAogICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248Tm9kZT4gdGFrZU5vZGVzKGludCBub2Rlc05lZWRlZCxOb2RlUG9vbFtdIHBvb2xzKSB7CiAgICAgTE9HLmRlYnVnKCJUcnlpbmcgdG8gZ3JhYiB7fSBmcmVlIG5vZGVzIGZyb20ge30iLG5vZGVzTmVlZGVkLCBwb29scyk7Ci0gICAgSGFzaFNldDxOb2RlPiByZXQgPSBuZXcgSGFzaFNldDxOb2RlPigpOworICAgIEhhc2hTZXQ8Tm9kZT4gcmV0ID0gbmV3IEhhc2hTZXQ8PigpOwogICAgIGZvciAoTm9kZVBvb2wgcG9vbDogcG9vbHMpIHsKICAgICAgIENvbGxlY3Rpb248Tm9kZT4gZ290ID0gcG9vbC50YWtlTm9kZXMobm9kZXNOZWVkZWQpOwogICAgICAgcmV0LmFkZEFsbChnb3QpOwpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NjaGVkdWxlci9yZXNvdXJjZS9Db21wb25lbnQuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zY2hlZHVsZXIvcmVzb3VyY2UvQ29tcG9uZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY5YjVjZQotLS0gL2Rldi9udWxsCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zY2hlZHVsZXIvcmVzb3VyY2UvQ29tcG9uZW50LmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiA8cD4KKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogPHA+CisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGJhY2t0eXBlLnN0b3JtLnNjaGVkdWxlci5yZXNvdXJjZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5zY2hlZHVsZXIuRXhlY3V0b3JEZXRhaWxzOworCitwdWJsaWMgY2xhc3MgQ29tcG9uZW50IHsKKyAgICBwdWJsaWMgZW51bSBDb21wb25lbnRUeXBlIHsKKyAgICAgICAgU1BPVVQoMSksIEJPTFQoMik7CisgICAgICAgIHByaXZhdGUgaW50IHZhbHVlOworCisgICAgICAgIHByaXZhdGUgQ29tcG9uZW50VHlwZShpbnQgdmFsdWUpIHsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgaWQ7CisgICAgcHVibGljIExpc3Q8U3RyaW5nPiBwYXJlbnRzID0gbnVsbDsKKyAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGNoaWxkcmVuID0gbnVsbDsKKyAgICBwdWJsaWMgTGlzdDxFeGVjdXRvckRldGFpbHM+IGV4ZWNzID0gbnVsbDsKKyAgICBwdWJsaWMgQ29tcG9uZW50VHlwZSB0eXBlID0gbnVsbDsKKworICAgIHB1YmxpYyBDb21wb25lbnQoU3RyaW5nIGlkKSB7CisgICAgICAgIHRoaXMucGFyZW50cyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgICAgICB0aGlzLmNoaWxkcmVuID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgICAgIHRoaXMuZXhlY3MgPSBuZXcgQXJyYXlMaXN0PEV4ZWN1dG9yRGV0YWlscz4oKTsKKyAgICAgICAgdGhpcy5pZCA9IGlkOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZyByZXRWYWwgPSAie2lkOiAiICsgdGhpcy5pZCArICIgUGFyZW50czogIiArIHRoaXMucGFyZW50cy50b1N0cmluZygpICsgIiBDaGlsZHJlbjogIiArIHRoaXMuY2hpbGRyZW4udG9TdHJpbmcoKSArICIgRXhlY3M6ICIgKyB0aGlzLmV4ZWNzICsgIn0iOworICAgICAgICByZXR1cm4gcmV0VmFsOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zY2hlZHVsZXIvcmVzb3VyY2UvUkFTX05vZGUuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zY2hlZHVsZXIvcmVzb3VyY2UvUkFTX05vZGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjJlNzk1Ci0tLSAvZGV2L251bGwKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NjaGVkdWxlci9yZXNvdXJjZS9SQVNfTm9kZS5qYXZhCkBAIC0wLDAgKzEsNTc1IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIDxwPgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiA8cD4KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYmFja3R5cGUuc3Rvcm0uc2NoZWR1bGVyLnJlc291cmNlOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLkNvbmZpZzsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5zY2hlZHVsZXIuVG9wb2xvZ2llczsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5zY2hlZHVsZXIuVG9wb2xvZ3lEZXRhaWxzOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5zY2hlZHVsZXIuQ2x1c3RlcjsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5zY2hlZHVsZXIuRXhlY3V0b3JEZXRhaWxzOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnNjaGVkdWxlci5TY2hlZHVsZXJBc3NpZ25tZW50OworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnNjaGVkdWxlci5TdXBlcnZpc29yRGV0YWlsczsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5zY2hlZHVsZXIuV29ya2VyU2xvdDsKKworLyoqCisgKiBSZXByZXNlbnRzIGEgc2luZ2xlIG5vZGUgaW4gdGhlIGNsdXN0ZXIuCisgKi8KK3B1YmxpYyBjbGFzcyBSQVNfTm9kZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFJBU19Ob2RlLmNsYXNzKTsKKyAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFNldDxXb3JrZXJTbG90Pj4gX3RvcElkVG9Vc2VkU2xvdHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFNldDxXb3JrZXJTbG90Pj4oKTsKKyAgICBwcml2YXRlIFNldDxXb3JrZXJTbG90PiBfZnJlZVNsb3RzID0gbmV3IEhhc2hTZXQ8V29ya2VyU2xvdD4oKTsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBfbm9kZUlkOworICAgIHByaXZhdGUgU3RyaW5nIF9ob3N0bmFtZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gX2lzQWxpdmU7CisgICAgcHJpdmF0ZSBTdXBlcnZpc29yRGV0YWlscyBfc3VwOworICAgIHByaXZhdGUgRG91YmxlIF9hdmFpbE1lbW9yeTsKKyAgICBwcml2YXRlIERvdWJsZSBfYXZhaWxDUFU7CisgICAgcHJpdmF0ZSBMaXN0PFdvcmtlclNsb3Q+IF9zbG90czsKKyAgICBwcml2YXRlIExpc3Q8RXhlY3V0b3JEZXRhaWxzPiBfZXhlY3M7CisgICAgcHJpdmF0ZSBNYXA8V29ya2VyU2xvdCwgTGlzdDxFeGVjdXRvckRldGFpbHM+PiBfc2xvdFRvRXhlY3M7CisKKyAgICBwdWJsaWMgUkFTX05vZGUoU3RyaW5nIG5vZGVJZCwgU2V0PEludGVnZXI+IGFsbFBvcnRzLCBib29sZWFuIGlzQWxpdmUsCisgICAgICAgICAgICAgICAgICAgIFN1cGVydmlzb3JEZXRhaWxzIHN1cCkgeworICAgICAgICBfc2xvdHMgPSBuZXcgQXJyYXlMaXN0PFdvcmtlclNsb3Q+KCk7CisgICAgICAgIF9leGVjcyA9IG5ldyBBcnJheUxpc3Q8RXhlY3V0b3JEZXRhaWxzPigpOworICAgICAgICBfc2xvdFRvRXhlY3MgPSBuZXcgSGFzaE1hcDxXb3JrZXJTbG90LCBMaXN0PEV4ZWN1dG9yRGV0YWlscz4+KCk7CisgICAgICAgIF9ub2RlSWQgPSBub2RlSWQ7CisgICAgICAgIF9pc0FsaXZlID0gaXNBbGl2ZTsKKyAgICAgICAgaWYgKF9pc0FsaXZlICYmIGFsbFBvcnRzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoaW50IHBvcnQgOiBhbGxQb3J0cykgeworICAgICAgICAgICAgICAgIF9mcmVlU2xvdHMuYWRkKG5ldyBXb3JrZXJTbG90KF9ub2RlSWQsIHBvcnQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9zdXAgPSBzdXA7CisgICAgICAgICAgICBfaG9zdG5hbWUgPSBzdXAuZ2V0SG9zdCgpOworICAgICAgICAgICAgX2F2YWlsTWVtb3J5ID0gdGhpcy5nZXRUb3RhbE1lbW9yeVJlc291cmNlcygpOworICAgICAgICAgICAgX2F2YWlsQ1BVID0gdGhpcy5nZXRUb3RhbENwdVJlc291cmNlcygpOworICAgICAgICAgICAgX3Nsb3RzLmFkZEFsbChfZnJlZVNsb3RzKTsKKyAgICAgICAgICAgIGZvciAoV29ya2VyU2xvdCB3cyA6IF9zbG90cykgeworICAgICAgICAgICAgICAgIF9zbG90VG9FeGVjcy5wdXQod3MsIG5ldyBBcnJheUxpc3Q8RXhlY3V0b3JEZXRhaWxzPigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CisgICAgICAgIHJldHVybiBfbm9kZUlkOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SG9zdG5hbWUoKSB7CisgICAgICAgIHJldHVybiBfaG9zdG5hbWU7CisgICAgfQorCisgICAgcHVibGljIENvbGxlY3Rpb248V29ya2VyU2xvdD4gZ2V0RnJlZVNsb3RzKCkgeworICAgICAgICByZXR1cm4gX2ZyZWVTbG90czsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FsaXZlKCkgeworICAgICAgICByZXR1cm4gX2lzQWxpdmU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBhIGNvbGxlY3Rpb24gb2YgdGhlIHRvcG9sb2d5IGlkcyBjdXJyZW50bHkgcnVubmluZyBvbiB0aGlzIG5vZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgQ29sbGVjdGlvbjxTdHJpbmc+IGdldFJ1bm5pbmdUb3BvbG9naWVzKCkgeworICAgICAgICByZXR1cm4gX3RvcElkVG9Vc2VkU2xvdHMua2V5U2V0KCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNUb3RhbGx5RnJlZSgpIHsKKyAgICAgICAgcmV0dXJuIF90b3BJZFRvVXNlZFNsb3RzLmlzRW1wdHkoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHRvdGFsU2xvdHNGcmVlKCkgeworICAgICAgICByZXR1cm4gX2ZyZWVTbG90cy5zaXplKCk7CisgICAgfQorCisgICAgcHVibGljIGludCB0b3RhbFNsb3RzVXNlZCgpIHsKKyAgICAgICAgaW50IHRvdGFsID0gMDsKKyAgICAgICAgZm9yIChTZXQ8V29ya2VyU2xvdD4gc2xvdHMgOiBfdG9wSWRUb1VzZWRTbG90cy52YWx1ZXMoKSkgeworICAgICAgICAgICAgdG90YWwgKz0gc2xvdHMuc2l6ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0b3RhbDsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHRvdGFsU2xvdHMoKSB7CisgICAgICAgIHJldHVybiB0b3RhbFNsb3RzRnJlZSgpICsgdG90YWxTbG90c1VzZWQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IHRvdGFsU2xvdHNVc2VkKFN0cmluZyB0b3BJZCkgeworICAgICAgICBpbnQgdG90YWwgPSAwOworICAgICAgICBTZXQ8V29ya2VyU2xvdD4gc2xvdHMgPSBfdG9wSWRUb1VzZWRTbG90cy5nZXQodG9wSWQpOworICAgICAgICBpZiAoc2xvdHMgIT0gbnVsbCkgeworICAgICAgICAgICAgdG90YWwgPSBzbG90cy5zaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRvdGFsOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZVNsb3QoV29ya2VyU2xvdCB3cykgeworICAgICAgICBpZiAoIV9ub2RlSWQuZXF1YWxzKHdzLmdldE5vZGVJZCgpKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIlRyeWluZyB0byBhZGQgYSBzbG90IHRvIHRoZSB3cm9uZyBub2RlICIgKyB3cyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBpcyBub3QgYSBwYXJ0IG9mICIgKyBfbm9kZUlkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhZGRPcnBoYW5lZFNsb3QoV29ya2VyU2xvdCB3cykgeworICAgICAgICBpZiAoX2lzQWxpdmUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk9ycGhhbmVkIFNsb3RzICIgKworICAgICAgICAgICAgICAgICAgICAib25seSBhcmUgYWxsb3dlZCBvbiBkZWFkIG5vZGVzLiIpOworICAgICAgICB9CisgICAgICAgIHZhbGlkYXRlU2xvdCh3cyk7CisgICAgICAgIGlmIChfZnJlZVNsb3RzLmNvbnRhaW5zKHdzKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZvciAoU2V0PFdvcmtlclNsb3Q+IHVzZWQgOiBfdG9wSWRUb1VzZWRTbG90cy52YWx1ZXMoKSkgeworICAgICAgICAgICAgaWYgKHVzZWQuY29udGFpbnMod3MpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIF9mcmVlU2xvdHMuYWRkKHdzKTsKKyAgICAgICAgX3Nsb3RUb0V4ZWNzLnB1dCh3cywgbmV3IEFycmF5TGlzdDxFeGVjdXRvckRldGFpbHM+KCkpOworICAgIH0KKworICAgIGJvb2xlYW4gYXNzaWduSW50ZXJuYWwoV29ya2VyU2xvdCB3cywgU3RyaW5nIHRvcElkLCBib29sZWFuIGRvbnRUaHJvdykgeworICAgICAgICB2YWxpZGF0ZVNsb3Qod3MpOworICAgICAgICBpZiAoIV9mcmVlU2xvdHMucmVtb3ZlKHdzKSkgeworICAgICAgICAgICAgaWYgKGRvbnRUaHJvdykgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQXNzaWduaW5nIGEgc2xvdCB0aGF0IHdhcyBub3QgZnJlZSAiICsgd3MpOworICAgICAgICB9CisgICAgICAgIFNldDxXb3JrZXJTbG90PiB1c2VkU2xvdHMgPSBfdG9wSWRUb1VzZWRTbG90cy5nZXQodG9wSWQpOworICAgICAgICBpZiAodXNlZFNsb3RzID09IG51bGwpIHsKKyAgICAgICAgICAgIHVzZWRTbG90cyA9IG5ldyBIYXNoU2V0PFdvcmtlclNsb3Q+KCk7CisgICAgICAgICAgICBfdG9wSWRUb1VzZWRTbG90cy5wdXQodG9wSWQsIHVzZWRTbG90cyk7CisgICAgICAgIH0KKyAgICAgICAgdXNlZFNsb3RzLmFkZCh3cyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGcmVlIGFsbCBzbG90cyBvbiB0aGlzIG5vZGUuICBUaGlzIHdpbGwgdXBkYXRlIHRoZSBDbHVzdGVyIHRvby4KKyAgICAgKiBAcGFyYW0gY2x1c3RlciB0aGUgY2x1c3RlciB0byBiZSB1cGRhdGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgZnJlZUFsbFNsb3RzKENsdXN0ZXIgY2x1c3RlcikgeworICAgICAgICBpZiAoIV9pc0FsaXZlKSB7CisgICAgICAgICAgICBMT0cud2FybigiRnJlZWluZyBhbGwgc2xvdHMgb24gYSBkZWFkIG5vZGUge30gIiwgX25vZGVJZCk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChFbnRyeTxTdHJpbmcsIFNldDxXb3JrZXJTbG90Pj4gZW50cnkgOiBfdG9wSWRUb1VzZWRTbG90cy5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICBjbHVzdGVyLmZyZWVTbG90cyhlbnRyeS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIGlmIChfaXNBbGl2ZSkgeworICAgICAgICAgICAgICAgIF9mcmVlU2xvdHMuYWRkQWxsKGVudHJ5LmdldFZhbHVlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIF90b3BJZFRvVXNlZFNsb3RzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTZXQ8V29ya2VyU2xvdD4+KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRnJlZXMgYSBzaW5nbGUgc2xvdCBpbiB0aGlzIG5vZGUKKyAgICAgKiBAcGFyYW0gd3MgdGhlIHNsb3QgdG8gZnJlZQorICAgICAqIEBwYXJhbSBjbHVzdGVyIHRoZSBjbHVzdGVyIHRvIHVwZGF0ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGZyZWUoV29ya2VyU2xvdCB3cywgQ2x1c3RlciBjbHVzdGVyKSB7CisgICAgICAgIGlmIChfZnJlZVNsb3RzLmNvbnRhaW5zKHdzKSkgcmV0dXJuOworICAgICAgICBmb3IgKEVudHJ5PFN0cmluZywgU2V0PFdvcmtlclNsb3Q+PiBlbnRyeSA6IF90b3BJZFRvVXNlZFNsb3RzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIFNldDxXb3JrZXJTbG90PiBzbG90cyA9IGVudHJ5LmdldFZhbHVlKCk7CisgICAgICAgICAgICBpZiAoc2xvdHMucmVtb3ZlKHdzKSkgeworICAgICAgICAgICAgICAgIGNsdXN0ZXIuZnJlZVNsb3Qod3MpOworICAgICAgICAgICAgICAgIGlmIChfaXNBbGl2ZSkgeworICAgICAgICAgICAgICAgICAgICBfZnJlZVNsb3RzLmFkZCh3cyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUcmllZCB0byBmcmVlIGEgc2xvdCB0aGF0IHdhcyBub3QiICsKKyAgICAgICAgICAgICAgICAiIHBhcnQgb2YgdGhpcyBub2RlICIgKyBfbm9kZUlkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGcmVlcyBhbGwgdGhlIHNsb3RzIGZvciBhIHRvcG9sb2d5LgorICAgICAqIEBwYXJhbSB0b3BJZCB0aGUgdG9wb2xvZ3kgdG8gZnJlZSBzbG90cyBmb3IKKyAgICAgKiBAcGFyYW0gY2x1c3RlciB0aGUgY2x1c3RlciB0byB1cGRhdGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBmcmVlVG9wb2xvZ3koU3RyaW5nIHRvcElkLCBDbHVzdGVyIGNsdXN0ZXIpIHsKKyAgICAgICAgU2V0PFdvcmtlclNsb3Q+IHNsb3RzID0gX3RvcElkVG9Vc2VkU2xvdHMuZ2V0KHRvcElkKTsKKyAgICAgICAgaWYgKHNsb3RzID09IG51bGwgfHwgc2xvdHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZm9yIChXb3JrZXJTbG90IHdzIDogc2xvdHMpIHsKKyAgICAgICAgICAgIGNsdXN0ZXIuZnJlZVNsb3Qod3MpOworICAgICAgICAgICAgaWYgKF9pc0FsaXZlKSB7CisgICAgICAgICAgICAgICAgX2ZyZWVTbG90cy5hZGQod3MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIF90b3BJZFRvVXNlZFNsb3RzLnJlbW92ZSh0b3BJZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWxsb2NhdGUgTWVtIGFuZCBDUFUgcmVzb3VyY2VzIHRvIHRoZSBhc3NpZ25lZCBzbG90IGZvciB0aGUgdG9wb2xvZ3kncyBleGVjdXRvcnMuCisgICAgICogQHBhcmFtIHRkIHRoZSBUb3BvbG9neURldGFpbHMgdGhhdCB0aGUgc2xvdCBpcyBhc3NpZ25lZCB0by4KKyAgICAgKiBAcGFyYW0gZXhlY3V0b3JzIHRoZSBleGVjdXRvcnMgdG8gcnVuIGluIHRoYXQgc2xvdC4KKyAgICAgKiBAcGFyYW0gc2xvdCB0aGUgc2xvdCB0byBhbGxvY2F0ZSByZXNvdXJjZSB0bworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFsbG9jYXRlUmVzb3VyY2VUb1Nsb3QgKFRvcG9sb2d5RGV0YWlscyB0ZCwgQ29sbGVjdGlvbjxFeGVjdXRvckRldGFpbHM+IGV4ZWN1dG9ycywgV29ya2VyU2xvdCBzbG90KSB7CisgICAgICAgIGRvdWJsZSBvbkhlYXBNZW0gPSAwLjA7CisgICAgICAgIGRvdWJsZSBvZmZIZWFwTWVtID0gMC4wOworICAgICAgICBkb3VibGUgY3B1ID0gMC4wOworICAgICAgICBmb3IgKEV4ZWN1dG9yRGV0YWlscyBleGVjIDogZXhlY3V0b3JzKSB7CisgICAgICAgICAgICBEb3VibGUgb25IZWFwTWVtRm9yRXhlYyA9IHRkLmdldE9uSGVhcE1lbW9yeVJlcXVpcmVtZW50KGV4ZWMpOworICAgICAgICAgICAgaWYgKG9uSGVhcE1lbUZvckV4ZWMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG9uSGVhcE1lbSArPSBvbkhlYXBNZW1Gb3JFeGVjOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRG91YmxlIG9mZkhlYXBNZW1Gb3JFeGVjID0gdGQuZ2V0T2ZmSGVhcE1lbW9yeVJlcXVpcmVtZW50KGV4ZWMpOworICAgICAgICAgICAgaWYgKG9mZkhlYXBNZW1Gb3JFeGVjICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBvZmZIZWFwTWVtICs9IG9mZkhlYXBNZW1Gb3JFeGVjOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRG91YmxlIGNwdUZvckV4ZWMgPSB0ZC5nZXRUb3RhbENwdVJlcVRhc2soZXhlYyk7CisgICAgICAgICAgICBpZiAoY3B1Rm9yRXhlYyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY3B1ICs9IGNwdUZvckV4ZWM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc2xvdC5hbGxvY2F0ZVJlc291cmNlKG9uSGVhcE1lbSwgb2ZmSGVhcE1lbSwgY3B1KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhc3NpZ24oV29ya2VyU2xvdCB0YXJnZXQsIFRvcG9sb2d5RGV0YWlscyB0ZCwgQ29sbGVjdGlvbjxFeGVjdXRvckRldGFpbHM+IGV4ZWN1dG9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgQ2x1c3RlciBjbHVzdGVyKSB7CisgICAgICAgIGlmICghX2lzQWxpdmUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRyeWluZyB0byBhZGRpbmcgdG8gYSBkZWFkIG5vZGUgIiArIF9ub2RlSWQpOworICAgICAgICB9CisgICAgICAgIGlmIChfZnJlZVNsb3RzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVHJ5aW5nIHRvIGFzc2lnbiB0byBhIGZ1bGwgbm9kZSAiICsgX25vZGVJZCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGV4ZWN1dG9ycy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgTE9HLndhcm4oIlRyeWluZyB0byBhc3NpZ24gbm90aGluZyBmcm9tICIgKyB0ZC5nZXRJZCgpICsgIiB0byAiICsgX25vZGVJZCArICIgKElnbm9yZWQpIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAodGFyZ2V0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRhcmdldCA9IF9mcmVlU2xvdHMuaXRlcmF0b3IoKS5uZXh0KCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFfZnJlZVNsb3RzLmNvbnRhaW5zKHRhcmdldCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRyeWluZyB0byBhc3NpZ24gYWxyZWFkeSB1c2VkIHNsb3QiICsgdGFyZ2V0LmdldFBvcnQoKSArICJvbiBub2RlICIgKyBfbm9kZUlkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFsbG9jYXRlUmVzb3VyY2VUb1Nsb3QodGQsIGV4ZWN1dG9ycywgdGFyZ2V0KTsKKyAgICAgICAgICAgIGNsdXN0ZXIuYXNzaWduKHRhcmdldCwgdGQuZ2V0SWQoKSwgZXhlY3V0b3JzKTsKKyAgICAgICAgICAgIGFzc2lnbkludGVybmFsKHRhcmdldCwgdGQuZ2V0SWQoKSwgZmFsc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQXNzaWduIGEgZnJlZSBzbG90IG9uIHRoZSBub2RlIHRvIHRoZSBmb2xsb3dpbmcgdG9wb2xvZ3kgYW5kIGV4ZWN1dG9ycy4KKyAgICAgKiBUaGlzIHdpbGwgdXBkYXRlIHRoZSBjbHVzdGVyIHRvby4KKyAgICAgKiBAcGFyYW0gdGQgdGhlIFRvcG9sb2d5RGV0YWlscyB0byBhc3NpZ24gYSBmcmVlIHNsb3QgdG8uCisgICAgICogQHBhcmFtIGV4ZWN1dG9ycyB0aGUgZXhlY3V0b3JzIHRvIHJ1biBpbiB0aGF0IHNsb3QuCisgICAgICogQHBhcmFtIGNsdXN0ZXIgdGhlIGNsdXN0ZXIgdG8gYmUgdXBkYXRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFzc2lnbihUb3BvbG9neURldGFpbHMgdGQsIENvbGxlY3Rpb248RXhlY3V0b3JEZXRhaWxzPiBleGVjdXRvcnMsCisgICAgICAgICAgICAgICAgICAgICAgIENsdXN0ZXIgY2x1c3RlcikgeworICAgICAgICB0aGlzLmFzc2lnbihudWxsLCB0ZCwgZXhlY3V0b3JzLCBjbHVzdGVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7CisgICAgICAgIGlmIChvdGhlciBpbnN0YW5jZW9mIFJBU19Ob2RlKSB7CisgICAgICAgICAgICByZXR1cm4gX25vZGVJZC5lcXVhbHMoKChSQVNfTm9kZSkgb3RoZXIpLl9ub2RlSWQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gX25vZGVJZC5oYXNoQ29kZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAie05vZGU6ICIgKyBfc3VwLmdldEhvc3QoKSArICIsIEF2YWlsTWVtOiAiICsgX2F2YWlsTWVtb3J5LnRvU3RyaW5nKCkgKyAiLCBBdmFpbENQVTogIiArIF9hdmFpbENQVS50b1N0cmluZygpICsgIn0iOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgaW50IGNvdW50U2xvdHNVc2VkKFN0cmluZyB0b3BJZCwgQ29sbGVjdGlvbjxSQVNfTm9kZT4gbm9kZXMpIHsKKyAgICAgICAgaW50IHRvdGFsID0gMDsKKyAgICAgICAgZm9yIChSQVNfTm9kZSBuIDogbm9kZXMpIHsKKyAgICAgICAgICAgIHRvdGFsICs9IG4udG90YWxTbG90c1VzZWQodG9wSWQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0b3RhbDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGludCBjb3VudFNsb3RzVXNlZChDb2xsZWN0aW9uPFJBU19Ob2RlPiBub2RlcykgeworICAgICAgICBpbnQgdG90YWwgPSAwOworICAgICAgICBmb3IgKFJBU19Ob2RlIG4gOiBub2RlcykgeworICAgICAgICAgICAgdG90YWwgKz0gbi50b3RhbFNsb3RzVXNlZCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0b3RhbDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGludCBjb3VudEZyZWVTbG90c0FsaXZlKENvbGxlY3Rpb248UkFTX05vZGU+IG5vZGVzKSB7CisgICAgICAgIGludCB0b3RhbCA9IDA7CisgICAgICAgIGZvciAoUkFTX05vZGUgbiA6IG5vZGVzKSB7CisgICAgICAgICAgICBpZiAobi5pc0FsaXZlKCkpIHsKKyAgICAgICAgICAgICAgICB0b3RhbCArPSBuLnRvdGFsU2xvdHNGcmVlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRvdGFsOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgaW50IGNvdW50VG90YWxTbG90c0FsaXZlKENvbGxlY3Rpb248UkFTX05vZGU+IG5vZGVzKSB7CisgICAgICAgIGludCB0b3RhbCA9IDA7CisgICAgICAgIGZvciAoUkFTX05vZGUgbiA6IG5vZGVzKSB7CisgICAgICAgICAgICBpZiAobi5pc0FsaXZlKCkpIHsKKyAgICAgICAgICAgICAgICB0b3RhbCArPSBuLnRvdGFsU2xvdHMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdG90YWw7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBNYXA8U3RyaW5nLCBSQVNfTm9kZT4gZ2V0QWxsTm9kZXNGcm9tKENsdXN0ZXIgY2x1c3RlciwgVG9wb2xvZ2llcyB0b3BvbG9naWVzKSB7CisgICAgICAgIE1hcDxTdHJpbmcsIFJBU19Ob2RlPiBub2RlSWRUb05vZGUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFJBU19Ob2RlPigpOworICAgICAgICBmb3IgKFN1cGVydmlzb3JEZXRhaWxzIHN1cCA6IGNsdXN0ZXIuZ2V0U3VwZXJ2aXNvcnMoKS52YWx1ZXMoKSkgeworICAgICAgICAgICAgLy9Ob2RlIElEIGFuZCBzdXBlcnZpc29yIElEIGFyZSB0aGUgc2FtZS4KKyAgICAgICAgICAgIFN0cmluZyBpZCA9IHN1cC5nZXRJZCgpOworICAgICAgICAgICAgYm9vbGVhbiBpc0FsaXZlID0gIWNsdXN0ZXIuaXNCbGFja0xpc3RlZChpZCk7CisgICAgICAgICAgICBMT0cuZGVidWcoIkZvdW5kIGEge30gTm9kZSB7fSB7fSIsCisgICAgICAgICAgICAgICAgICAgIGlzQWxpdmUgPyAibGl2aW5nIiA6ICJkZWFkIiwgaWQsIHN1cC5nZXRBbGxQb3J0cygpKTsKKyAgICAgICAgICAgIExPRy5kZWJ1ZygicmVzb3VyY2VzX21lbToge30sIHJlc291cmNlc19DUFU6IHt9Iiwgc3VwLmdldFRvdGFsTWVtb3J5KCksIHN1cC5nZXRUb3RhbENQVSgpKTsKKyAgICAgICAgICAgIG5vZGVJZFRvTm9kZS5wdXQoc3VwLmdldElkKCksIG5ldyBSQVNfTm9kZShpZCwgc3VwLmdldEFsbFBvcnRzKCksIGlzQWxpdmUsIHN1cCkpOworICAgICAgICB9CisgICAgICAgIGZvciAoRW50cnk8U3RyaW5nLCBTY2hlZHVsZXJBc3NpZ25tZW50PiBlbnRyeSA6IGNsdXN0ZXIuZ2V0QXNzaWdubWVudHMoKS5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICBTdHJpbmcgdG9wSWQgPSBlbnRyeS5nZXRWYWx1ZSgpLmdldFRvcG9sb2d5SWQoKTsKKyAgICAgICAgICAgIGZvciAoV29ya2VyU2xvdCB3b3JrZXJTbG90IDogZW50cnkuZ2V0VmFsdWUoKS5nZXRTbG90cygpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGlkID0gd29ya2VyU2xvdC5nZXROb2RlSWQoKTsKKyAgICAgICAgICAgICAgICBSQVNfTm9kZSBub2RlID0gbm9kZUlkVG9Ob2RlLmdldChpZCk7CisgICAgICAgICAgICAgICAgaWYgKG5vZGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBMT0cuaW5mbygiRm91bmQgYW4gYXNzaWduZWQgc2xvdCBvbiBhIGRlYWQgc3VwZXJ2aXNvciB7fSB3aXRoIGV4ZWN1dG9ycyB7fSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VyU2xvdCwgZ2V0RXhlY3V0b3JzKHdvcmtlclNsb3QsIGNsdXN0ZXIpKTsKKyAgICAgICAgICAgICAgICAgICAgbm9kZSA9IG5ldyBSQVNfTm9kZShpZCwgbnVsbCwgZmFsc2UsIG51bGwpOworICAgICAgICAgICAgICAgICAgICBub2RlSWRUb05vZGUucHV0KGlkLCBub2RlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFub2RlLmlzQWxpdmUoKSkgeworICAgICAgICAgICAgICAgICAgICAvL1RoZSBzdXBlcnZpc29yIG9uIHRoZSBub2RlIGRvd24gc28gYWRkIGFuIG9ycGhhbmVkIHNsb3QgdG8gaG9sZCB0aGUgdW5zdXBlcnZpc2VkIHdvcmtlcgorICAgICAgICAgICAgICAgICAgICBub2RlLmFkZE9ycGhhbmVkU2xvdCh3b3JrZXJTbG90KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG5vZGUuYXNzaWduSW50ZXJuYWwod29ya2VyU2xvdCwgdG9wSWQsIHRydWUpKSB7CisgICAgICAgICAgICAgICAgICAgIExPRy53YXJuKCJCYWQgc2NoZWR1bGluZyBzdGF0ZSwgIiArIHdvcmtlclNsb3QgKyAiIGFzc2lnbmVkIG11bHRpcGxlIHdvcmtlcnMsIHVuYXNzaWduaW5nIGV2ZXJ5dGhpbmcuLi4iKTsKKyAgICAgICAgICAgICAgICAgICAgbm9kZS5mcmVlKHdvcmtlclNsb3QsIGNsdXN0ZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBSQVNfTm9kZS51cGRhdGVBdmFpbGFibGVSZXNvdXJjZXMoY2x1c3RlciwgdG9wb2xvZ2llcywgbm9kZUlkVG9Ob2RlKTsKKworICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFNjaGVkdWxlckFzc2lnbm1lbnQ+IGVudHJ5IDogY2x1c3RlcgorICAgICAgICAgICAgICAgIC5nZXRBc3NpZ25tZW50cygpLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PEV4ZWN1dG9yRGV0YWlscywgV29ya2VyU2xvdD4gZXhlYyA6IGVudHJ5LmdldFZhbHVlKCkKKyAgICAgICAgICAgICAgICAgICAgLmdldEV4ZWN1dG9yVG9TbG90KCkuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgICAgIEV4ZWN1dG9yRGV0YWlscyBlZCA9IGV4ZWMuZ2V0S2V5KCk7CisgICAgICAgICAgICAgICAgV29ya2VyU2xvdCB3cyA9IGV4ZWMuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbm9kZV9pZCA9IHdzLmdldE5vZGVJZCgpOworICAgICAgICAgICAgICAgIGlmIChub2RlSWRUb05vZGUuY29udGFpbnNLZXkobm9kZV9pZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgUkFTX05vZGUgbm9kZSA9IG5vZGVJZFRvTm9kZS5nZXQobm9kZV9pZCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChub2RlLl9zbG90VG9FeGVjcy5jb250YWluc0tleSh3cykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuX3Nsb3RUb0V4ZWNzLmdldCh3cykuYWRkKGVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuX2V4ZWNzLmFkZChlZCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0cuaW5mbygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVSUk9SOiBzaG91bGQgaGF2ZSBub2RlIHt9IHNob3VsZCBoYXZlIHdvcmtlcjoge30iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlX2lkLCBlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIExPRy5pbmZvKCJFUlJPUjogc2hvdWxkIGhhdmUgbm9kZSB7fSIsIG5vZGVfaWQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5vZGVJZFRvTm9kZTsKKyAgICB9CisKKyAgICAvL1RoaXMgZnVuY3Rpb24gaXMgb25seSB1c2VkIGZvciBsb2dnaW5nIGluZm9ybWF0aW9uCisgICAgcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbjxFeGVjdXRvckRldGFpbHM+IGdldEV4ZWN1dG9ycyhXb3JrZXJTbG90IHdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2x1c3RlciBjbHVzdGVyKSB7CisgICAgICAgIENvbGxlY3Rpb248RXhlY3V0b3JEZXRhaWxzPiByZXRMaXN0ID0gbmV3IEFycmF5TGlzdDxFeGVjdXRvckRldGFpbHM+KCk7CisgICAgICAgIGZvciAoRW50cnk8U3RyaW5nLCBTY2hlZHVsZXJBc3NpZ25tZW50PiBlbnRyeSA6IGNsdXN0ZXIuZ2V0QXNzaWdubWVudHMoKQorICAgICAgICAgICAgICAgIC5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICBNYXA8RXhlY3V0b3JEZXRhaWxzLCBXb3JrZXJTbG90PiBleGVjdXRvclRvU2xvdCA9IGVudHJ5LmdldFZhbHVlKCkKKyAgICAgICAgICAgICAgICAgICAgLmdldEV4ZWN1dG9yVG9TbG90KCk7CisgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxFeGVjdXRvckRldGFpbHMsIFdvcmtlclNsb3Q+IGV4ZWNUb1Nsb3QgOiBleGVjdXRvclRvU2xvdAorICAgICAgICAgICAgICAgICAgICAuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgICAgIFdvcmtlclNsb3Qgc2xvdCA9IGV4ZWNUb1Nsb3QuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgICAgICBpZiAod3MuZ2V0UG9ydCgpID09IHNsb3QuZ2V0UG9ydCgpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiB3cy5nZXROb2RlSWQoKS5lcXVhbHMoc2xvdC5nZXROb2RlSWQoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgRXhlY3V0b3JEZXRhaWxzIGV4ZWMgPSBleGVjVG9TbG90LmdldEtleSgpOworICAgICAgICAgICAgICAgICAgICByZXRMaXN0LmFkZChleGVjKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldExpc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogdXBkYXRlcyB0aGUgYXZhaWxhYmxlIHJlc291cmNlcyBmb3IgZXZlcnkgbm9kZSBpbiBhIGNsdXN0ZXIKKyAgICAgKiBieSByZWNhbGN1bGF0aW5nIG1lbW9yeSByZXF1aXJlbWVudHMuCisgICAgICogQHBhcmFtIGNsdXN0ZXIgdGhlIGNsdXN0ZXIgdXNlZCBpbiB0aGlzIGNhbGN1bGF0aW9uCisgICAgICogQHBhcmFtIHRvcG9sb2dpZXMgY29udGFpbmVyIG9mIGFsbCB0b3BvbG9naWVzCisgICAgICogQHBhcmFtIG5vZGVJZFRvTm9kZSBhIG1hcCBiZXR3ZWVuIG5vZGUgaWQgYW5kIG5vZGUKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHVwZGF0ZUF2YWlsYWJsZVJlc291cmNlcyhDbHVzdGVyIGNsdXN0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9wb2xvZ2llcyB0b3BvbG9naWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIFJBU19Ob2RlPiBub2RlSWRUb05vZGUpIHsKKyAgICAgICAgLy9yZWNvbXB1dGUgbWVtb3J5CisgICAgICAgIGlmIChjbHVzdGVyLmdldEFzc2lnbm1lbnRzKCkuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgZm9yIChFbnRyeTxTdHJpbmcsIFNjaGVkdWxlckFzc2lnbm1lbnQ+IGVudHJ5IDogY2x1c3Rlci5nZXRBc3NpZ25tZW50cygpCisgICAgICAgICAgICAgICAgICAgIC5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICAgICAgTWFwPEV4ZWN1dG9yRGV0YWlscywgV29ya2VyU2xvdD4gZXhlY3V0b3JUb1Nsb3QgPSBlbnRyeS5nZXRWYWx1ZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RXhlY3V0b3JUb1Nsb3QoKTsKKyAgICAgICAgICAgICAgICBNYXA8RXhlY3V0b3JEZXRhaWxzLCBEb3VibGU+IHRvcG9NZW1vcnlSZXNvdXJjZUxpc3QgPSB0b3BvbG9naWVzLmdldEJ5SWQoZW50cnkuZ2V0S2V5KCkpLmdldFRvdGFsTWVtb3J5UmVzb3VyY2VMaXN0KCk7CisKKyAgICAgICAgICAgICAgICBpZiAodG9wb01lbW9yeVJlc291cmNlTGlzdCA9PSBudWxsIHx8IHRvcG9NZW1vcnlSZXNvdXJjZUxpc3Quc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PEV4ZWN1dG9yRGV0YWlscywgV29ya2VyU2xvdD4gZXhlY1RvU2xvdCA6IGV4ZWN1dG9yVG9TbG90CisgICAgICAgICAgICAgICAgICAgICAgICAuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgICAgICAgICBXb3JrZXJTbG90IHNsb3QgPSBleGVjVG9TbG90LmdldFZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgIEV4ZWN1dG9yRGV0YWlscyBleGVjID0gZXhlY1RvU2xvdC5nZXRLZXkoKTsKKyAgICAgICAgICAgICAgICAgICAgUkFTX05vZGUgbm9kZSA9IG5vZGVJZFRvTm9kZS5nZXQoc2xvdC5nZXROb2RlSWQoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghbm9kZS5pc0FsaXZlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgZG8gbm90IGZyZWUgdGhlIGFzc2lnbmVkIHNsb3RzICh0aGUgb3JwaGFuZWQgc2xvdHMpIG9uIHRoZSBpbmFjdGl2ZSBzdXBlcnZpc29ycworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGluYWN0aXZlIG5vZGUgd2lsbCBiZSB0cmVhdGVkIGFzIGEgMC1yZXNvdXJjZSBub2RlIGFuZCBub3QgYXZhaWxhYmxlIGZvciBvdGhlciB1bmFzc2lnbmVkIHdvcmtlcnMKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAodG9wb01lbW9yeVJlc291cmNlTGlzdC5jb250YWluc0tleShleGVjKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5jb25zdW1lUmVzb3VyY2VzZm9yVGFzayhleGVjLCB0b3BvbG9naWVzLmdldEJ5SWQoZW50cnkuZ2V0S2V5KCkpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPRy53YXJuKCJSZXNvdXJjZSBSZXEgbm90IGZvdW5kLi4uU2NoZWR1bGluZyBUYXNre30gd2l0aCBtZW1vcnkgcmVxdWlyZW1lbnQgYXMgb24gaGVhcCAtIHt9IGFuZCBvZmYgaGVhcCAtIHt9IGFuZCBDUFUgcmVxdWlyZW1lbnQgYXMge30iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWcuVE9QT0xPR1lfQ09NUE9ORU5UX1JFU09VUkNFU19PTkhFQVBfTUVNT1JZX01CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWcuVE9QT0xPR1lfQ09NUE9ORU5UX1JFU09VUkNFU19PRkZIRUFQX01FTU9SWV9NQiwgQ29uZmlnLlRPUE9MT0dZX0NPTVBPTkVOVF9DUFVfUENPUkVfUEVSQ0VOVCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0b3BvbG9naWVzLmdldEJ5SWQoZW50cnkuZ2V0S2V5KCkpLmFkZERlZmF1bHRSZXNmb3JFeGVjKGV4ZWMpOworICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5jb25zdW1lUmVzb3VyY2VzZm9yVGFzayhleGVjLCB0b3BvbG9naWVzLmdldEJ5SWQoZW50cnkuZ2V0S2V5KCkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoUkFTX05vZGUgbiA6IG5vZGVJZFRvTm9kZS52YWx1ZXMoKSkgeworICAgICAgICAgICAgICAgIG4uc2V0QXZhaWxhYmxlTWVtb3J5KG4uZ2V0QXZhaWxhYmxlTWVtb3J5UmVzb3VyY2VzKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgQXZhaWxhYmxlIE1lbW9yeSBmb3IgYSBub2RlCisgICAgICogQHBhcmFtIGFtb3VudCB0aGUgYW1vdW50IHRvIHNldCBhcyBhdmFpbGFibGUgbWVtb3J5CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QXZhaWxhYmxlTWVtb3J5KERvdWJsZSBhbW91bnQpIHsKKyAgICAgICAgX2F2YWlsTWVtb3J5ID0gYW1vdW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGF2YWlsYWJsZSBtZW1vcnkgcmVzb3VyY2VzIGZvciB0aGlzIG5vZGUKKyAgICAgKiBAcmV0dXJuIHRoZSBhdmFpbGFibGUgbWVtb3J5IGZvciB0aGlzIG5vZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgRG91YmxlIGdldEF2YWlsYWJsZU1lbW9yeVJlc291cmNlcygpIHsKKyAgICAgICAgaWYgKF9hdmFpbE1lbW9yeSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gMC4wOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfYXZhaWxNZW1vcnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdG90YWwgbWVtb3J5IHJlc291cmNlcyBmb3IgdGhpcyBub2RlCisgICAgICogQHJldHVybiB0aGUgdG90YWwgbWVtb3J5IGZvciB0aGlzIG5vZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgRG91YmxlIGdldFRvdGFsTWVtb3J5UmVzb3VyY2VzKCkgeworICAgICAgICBpZiAoX3N1cCAhPSBudWxsICYmIF9zdXAuZ2V0VG90YWxNZW1vcnkoKSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gX3N1cC5nZXRUb3RhbE1lbW9yeSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIDAuMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN1bWVzIGEgY2VydGFpbiBhbW91bnQgb2YgbWVtb3J5IGZvciB0aGlzIG5vZGUKKyAgICAgKiBAcGFyYW0gYW1vdW50IGlzIHRoZSBhbW91bnQgbWVtb3J5IHRvIGNvbnN1bWUgZnJvbSB0aGlzIG5vZGUKKyAgICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IGF2YWlsYWJsZSBtZW1vcnkgZm9yIHRoaXMgbm9kZSBhZnRlciBjb25zdW1wdGlvbgorICAgICAqLworICAgIHB1YmxpYyBEb3VibGUgY29uc3VtZU1lbW9yeShEb3VibGUgYW1vdW50KSB7CisgICAgICAgIGlmIChhbW91bnQgPiBfYXZhaWxNZW1vcnkpIHsKKyAgICAgICAgICAgIExPRy5lcnJvcigiQXR0ZW1wdGluZyB0byBjb25zdW1lIG1vcmUgbWVtb3J5IHRoYW4gYXZhaWxhYmxlISBOZWVkZWQ6IHt9LCB3ZSBvbmx5IGhhdmU6IHt9IiwgYW1vdW50LCBfYXZhaWxNZW1vcnkpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgX2F2YWlsTWVtb3J5ID0gX2F2YWlsTWVtb3J5IC0gYW1vdW50OworICAgICAgICByZXR1cm4gX2F2YWlsTWVtb3J5OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGF2YWlsYWJsZSBjcHUgcmVzb3VyY2VzIGZvciB0aGlzIG5vZGUKKyAgICAgKiBAcmV0dXJuIHRoZSBhdmFpbGFibGUgY3B1IGZvciB0aGlzIG5vZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgRG91YmxlIGdldEF2YWlsYWJsZUNwdVJlc291cmNlcygpIHsKKyAgICAgICAgaWYgKF9hdmFpbENQVSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gMC4wOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfYXZhaWxDUFU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdG90YWwgY3B1IHJlc291cmNlcyBmb3IgdGhpcyBub2RlCisgICAgICogQHJldHVybiB0aGUgdG90YWwgY3B1IGZvciB0aGlzIG5vZGUKKyAgICAgKi8KKyAgICBwdWJsaWMgRG91YmxlIGdldFRvdGFsQ3B1UmVzb3VyY2VzKCkgeworICAgICAgICBpZiAoX3N1cCAhPSBudWxsICYmIF9zdXAuZ2V0VG90YWxDUFUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gX3N1cC5nZXRUb3RhbENQVSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIDAuMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN1bWVzIGEgY2VydGFpbiBhbW91bnQgb2YgY3B1IGZvciB0aGlzIG5vZGUKKyAgICAgKiBAcGFyYW0gYW1vdW50IGlzIHRoZSBhbW91bnQgY3B1IHRvIGNvbnN1bWUgZnJvbSB0aGlzIG5vZGUKKyAgICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IGF2YWlsYWJsZSBjcHUgZm9yIHRoaXMgbm9kZSBhZnRlciBjb25zdW1wdGlvbgorICAgICAqLworICAgIHB1YmxpYyBEb3VibGUgY29uc3VtZUNQVShEb3VibGUgYW1vdW50KSB7CisgICAgICAgIGlmIChhbW91bnQgPiBfYXZhaWxDUFUpIHsKKyAgICAgICAgICAgIExPRy5lcnJvcigiQXR0ZW1wdGluZyB0byBjb25zdW1lIG1vcmUgQ1BVIHRoYW4gYXZhaWxhYmxlISBOZWVkZWQ6IHt9LCB3ZSBvbmx5IGhhdmU6IHt9IiwgYW1vdW50LCBfYXZhaWxDUFUpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgX2F2YWlsQ1BVID0gX2F2YWlsQ1BVIC0gYW1vdW50OworICAgICAgICByZXR1cm4gX2F2YWlsQ1BVOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN1bWVzIGEgY2VydGFpbiBhbW91bnQgb2YgcmVzb3VyY2VzIGZvciBhIGV4ZWN1dG9yIGluIGEgdG9wb2xvZ3kuCisgICAgICogQHBhcmFtIGV4ZWMgaXMgdGhlIGV4ZWN1dG9yIHRoYXQgaXMgY29uc3VtaW5nIHJlc291cmNlcyBvbiB0aGlzIG5vZGUKKyAgICAgKiBAcGFyYW0gdG9wbyB0aGUgdG9wb2xvZ3kgdGhlIGV4ZWN1dG9yIGlzIGEgcGFydAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNvbnN1bWVSZXNvdXJjZXNmb3JUYXNrKEV4ZWN1dG9yRGV0YWlscyBleGVjLCBUb3BvbG9neURldGFpbHMgdG9wbykgeworICAgICAgICBEb3VibGUgdGFza01lbVJlcSA9IHRvcG8uZ2V0VG90YWxNZW1SZXFUYXNrKGV4ZWMpOworICAgICAgICBEb3VibGUgdGFza0NwdVJlcSA9IHRvcG8uZ2V0VG90YWxDcHVSZXFUYXNrKGV4ZWMpOworICAgICAgICB0aGlzLmNvbnN1bWVDUFUodGFza0NwdVJlcSk7CisgICAgICAgIHRoaXMuY29uc3VtZU1lbW9yeSh0YXNrTWVtUmVxKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2NoZWR1bGVyL3Jlc291cmNlL1Jlc291cmNlQXdhcmVTY2hlZHVsZXIuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zY2hlZHVsZXIvcmVzb3VyY2UvUmVzb3VyY2VBd2FyZVNjaGVkdWxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3Yzc4NjcKLS0tIC9kZXYvbnVsbAorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2NoZWR1bGVyL3Jlc291cmNlL1Jlc291cmNlQXdhcmVTY2hlZHVsZXIuamF2YQpAQCAtMCwwICsxLDE4MyBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiA8cD4KKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogPHA+CisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGJhY2t0eXBlLnN0b3JtLnNjaGVkdWxlci5yZXNvdXJjZTsKKworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLkNvbmZpZzsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgYmFja3R5cGUuc3Rvcm0uc2NoZWR1bGVyLkNsdXN0ZXI7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0uc2NoZWR1bGVyLkV4ZWN1dG9yRGV0YWlsczsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5zY2hlZHVsZXIuSVNjaGVkdWxlcjsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5zY2hlZHVsZXIuVG9wb2xvZ2llczsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5zY2hlZHVsZXIuVG9wb2xvZ3lEZXRhaWxzOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnNjaGVkdWxlci5Xb3JrZXJTbG90OworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnNjaGVkdWxlci5yZXNvdXJjZS5zdHJhdGVnaWVzLlJlc291cmNlQXdhcmVTdHJhdGVneTsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworcHVibGljIGNsYXNzIFJlc291cmNlQXdhcmVTY2hlZHVsZXIgaW1wbGVtZW50cyBJU2NoZWR1bGVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyRmFjdG9yeQorICAgICAgICAgICAgLmdldExvZ2dlcihSZXNvdXJjZUF3YXJlU2NoZWR1bGVyLmNsYXNzKTsKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQorICAgIHByaXZhdGUgTWFwIF9jb25mOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcHJlcGFyZShNYXAgY29uZikgeworICAgICAgICBfY29uZiA9IGNvbmY7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2NoZWR1bGUoVG9wb2xvZ2llcyB0b3BvbG9naWVzLCBDbHVzdGVyIGNsdXN0ZXIpIHsKKyAgICAgICAgTE9HLmRlYnVnKCJcblxuXG5SZXJ1bm5pbmcgUmVzb3VyY2VBd2FyZVNjaGVkdWxlci4uLiIpOworCisgICAgICAgIFJlc291cmNlQXdhcmVTdHJhdGVneSBSQVN0cmF0ZWd5ID0gbmV3IFJlc291cmNlQXdhcmVTdHJhdGVneShjbHVzdGVyLCB0b3BvbG9naWVzKTsKKyAgICAgICAgTE9HLmRlYnVnKHByaW50U2NoZWR1bGluZyhjbHVzdGVyLCB0b3BvbG9naWVzKSk7CisKKyAgICAgICAgZm9yIChUb3BvbG9neURldGFpbHMgdGQgOiB0b3BvbG9naWVzLmdldFRvcG9sb2dpZXMoKSkgeworICAgICAgICAgICAgU3RyaW5nIHRvcElkID0gdGQuZ2V0SWQoKTsKKyAgICAgICAgICAgIE1hcDxXb3JrZXJTbG90LCBDb2xsZWN0aW9uPEV4ZWN1dG9yRGV0YWlscz4+IHNjaGVkdWxlckFzc2lnbm1lbnRNYXA7CisgICAgICAgICAgICBpZiAoY2x1c3Rlci5nZXRVbmFzc2lnbmVkRXhlY3V0b3JzKHRkKS5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgTE9HLmRlYnVnKCIvKioqKioqKipTY2hlZHVsaW5nIHRvcG9sb2d5IHt9ICoqKioqKioqKioqKi8iLCB0b3BJZCk7CisKKyAgICAgICAgICAgICAgICBzY2hlZHVsZXJBc3NpZ25tZW50TWFwID0gUkFTdHJhdGVneS5zY2hlZHVsZSh0ZCk7CisKKyAgICAgICAgICAgICAgICBkb3VibGUgcmVxdWVzdGVkTWVtT25IZWFwID0gdGQuZ2V0VG90YWxSZXF1ZXN0ZWRNZW1PbkhlYXAoKTsKKyAgICAgICAgICAgICAgICBkb3VibGUgcmVxdWVzdGVkTWVtT2ZmSGVhcCA9IHRkLmdldFRvdGFsUmVxdWVzdGVkTWVtT2ZmSGVhcCgpOworICAgICAgICAgICAgICAgIGRvdWJsZSByZXF1ZXN0ZWRDcHUgPSB0ZC5nZXRUb3RhbFJlcXVlc3RlZENwdSgpOworICAgICAgICAgICAgICAgIGRvdWJsZSBhc3NpZ25lZE1lbU9uSGVhcCA9IDAuMDsKKyAgICAgICAgICAgICAgICBkb3VibGUgYXNzaWduZWRNZW1PZmZIZWFwID0gMC4wOworICAgICAgICAgICAgICAgIGRvdWJsZSBhc3NpZ25lZENwdSA9IDAuMDsKKworICAgICAgICAgICAgICAgIGlmIChzY2hlZHVsZXJBc3NpZ25tZW50TWFwICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNldDxTdHJpbmc+IG5vZGVzVXNlZCA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBhc3NpZ25lZFdvcmtlcnMgPSBzY2hlZHVsZXJBc3NpZ25tZW50TWFwLmtleVNldCgpLnNpemUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFdvcmtlclNsb3QsIENvbGxlY3Rpb248RXhlY3V0b3JEZXRhaWxzPj4gd29ya2VyVG9UYXNrc0VudHJ5IDogc2NoZWR1bGVyQXNzaWdubWVudE1hcC5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV29ya2VyU2xvdCB0YXJnZXRTbG90ID0gd29ya2VyVG9UYXNrc0VudHJ5LmdldEtleSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb248RXhlY3V0b3JEZXRhaWxzPiBleGVjc05lZWRTY2hlZHVsaW5nID0gd29ya2VyVG9UYXNrc0VudHJ5LmdldFZhbHVlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkFTX05vZGUgdGFyZ2V0Tm9kZSA9IFJBU3RyYXRlZ3kuaWRUb05vZGUodGFyZ2V0U2xvdC5nZXROb2RlSWQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Tm9kZS5hc3NpZ24odGFyZ2V0U2xvdCwgdGQsIGV4ZWNzTmVlZFNjaGVkdWxpbmcsIGNsdXN0ZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPRy5kZWJ1ZygiQVNTSUdOTUVOVCAgICBUT1BPTE9HWToge30gIFRBU0tTOiB7fSBUbyBOb2RlOiB7fSBvbiBTbG90OiB7fSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZC5nZXROYW1lKCksIGV4ZWNzTmVlZFNjaGVkdWxpbmcsIHRhcmdldE5vZGUuZ2V0SG9zdG5hbWUoKSwgdGFyZ2V0U2xvdC5nZXRQb3J0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbm9kZXNVc2VkLmNvbnRhaW5zKHRhcmdldE5vZGUuZ2V0SWQoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXNVc2VkLmFkZCh0YXJnZXROb2RlLmdldElkKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ25lZE1lbU9uSGVhcCArPSB0YXJnZXRTbG90LmdldEFsbG9jYXRlZE1lbU9uSGVhcCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2lnbmVkTWVtT2ZmSGVhcCArPSB0YXJnZXRTbG90LmdldEFsbG9jYXRlZE1lbU9mZkhlYXAoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ25lZENwdSArPSB0YXJnZXRTbG90LmdldEFsbG9jYXRlZENwdSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgTE9HLmRlYnVnKCJUb3BvbG9neToge30gYXNzaWduZWQgdG8ge30gbm9kZXMgb24ge30gd29ya2VycyIsIHRkLmdldElkKCksIG5vZGVzVXNlZC5zaXplKCksIGFzc2lnbmVkV29ya2Vycyk7CisgICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyLnNldFN0YXR1cyh0ZC5nZXRJZCgpLCAiRnVsbHkgU2NoZWR1bGVkIik7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HLmVycm9yKGV4LnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgTE9HLmVycm9yKCJVbnN1Y2Nlc3NmdWwgaW4gc2NoZWR1bGluZyIsIHRkLmdldElkKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3Rlci5zZXRTdGF0dXModGQuZ2V0SWQoKSwgIlVuc3VjY2Vzc2Z1bCBpbiBzY2hlZHVsaW5nIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBMT0cuZXJyb3IoIlVuc3VjY2Vzc2Z1bCBpbiBzY2hlZHVsaW5nIiwgdGQuZ2V0SWQoKSk7CisgICAgICAgICAgICAgICAgICAgIGNsdXN0ZXIuc2V0U3RhdHVzKHRkLmdldElkKCksICJVbnN1Y2Nlc3NmdWwgaW4gc2NoZWR1bGluZyIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBEb3VibGVbXSByZXNvdXJjZXMgPSB7cmVxdWVzdGVkTWVtT25IZWFwLCByZXF1ZXN0ZWRNZW1PZmZIZWFwLCByZXF1ZXN0ZWRDcHUsCisgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ25lZE1lbU9uSGVhcCwgYXNzaWduZWRNZW1PZmZIZWFwLCBhc3NpZ25lZENwdX07CisgICAgICAgICAgICAgICAgTE9HLmRlYnVnKCJzZXRSZXNvdXJjZXMgZm9yIHt9OiByZXF1ZXN0ZWQgb24taGVhcCBtZW0sIG9mZi1oZWFwIG1lbSwgY3B1OiB7fSB7fSB7fSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICJhc3NpZ25lZCBvbi1oZWFwIG1lbSwgb2ZmLWhlYXAgbWVtLCBjcHU6IHt9IHt9IHt9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRkLmdldElkKCksIHJlcXVlc3RlZE1lbU9uSGVhcCwgcmVxdWVzdGVkTWVtT2ZmSGVhcCwgcmVxdWVzdGVkQ3B1LAorICAgICAgICAgICAgICAgICAgICAgICAgYXNzaWduZWRNZW1PbkhlYXAsIGFzc2lnbmVkTWVtT2ZmSGVhcCwgYXNzaWduZWRDcHUpOworICAgICAgICAgICAgICAgIGNsdXN0ZXIuc2V0UmVzb3VyY2VzKHRkLmdldElkKCksIHJlc291cmNlcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNsdXN0ZXIuc2V0U3RhdHVzKHRkLmdldElkKCksICJGdWxseSBTY2hlZHVsZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB1cGRhdGVTdXBlcnZpc29yc1Jlc291cmNlcyhjbHVzdGVyLCB0b3BvbG9naWVzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlU3VwZXJ2aXNvcnNSZXNvdXJjZXMoQ2x1c3RlciBjbHVzdGVyLCBUb3BvbG9naWVzIHRvcG9sb2dpZXMpIHsKKyAgICAgICAgTWFwPFN0cmluZywgRG91YmxlW10+IHN1cGVydmlzb3JzX3Jlc291cmNlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgRG91YmxlW10+KCk7CisgICAgICAgIE1hcDxTdHJpbmcsIFJBU19Ob2RlPiBub2RlcyA9IFJBU19Ob2RlLmdldEFsbE5vZGVzRnJvbShjbHVzdGVyLCB0b3BvbG9naWVzKTsKKyAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBSQVNfTm9kZT4gZW50cnkgOiBub2Rlcy5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICBSQVNfTm9kZSBub2RlID0gZW50cnkuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgIERvdWJsZSB0b3RhbE1lbSA9IG5vZGUuZ2V0VG90YWxNZW1vcnlSZXNvdXJjZXMoKTsKKyAgICAgICAgICAgIERvdWJsZSB0b3RhbENwdSA9IG5vZGUuZ2V0VG90YWxDcHVSZXNvdXJjZXMoKTsKKyAgICAgICAgICAgIERvdWJsZSB1c2VkTWVtID0gdG90YWxNZW0gLSBub2RlLmdldEF2YWlsYWJsZU1lbW9yeVJlc291cmNlcygpOworICAgICAgICAgICAgRG91YmxlIHVzZWRDcHUgPSB0b3RhbENwdSAtIG5vZGUuZ2V0QXZhaWxhYmxlQ3B1UmVzb3VyY2VzKCk7CisgICAgICAgICAgICBEb3VibGVbXSByZXNvdXJjZXMgPSB7dG90YWxNZW0sIHRvdGFsQ3B1LCB1c2VkTWVtLCB1c2VkQ3B1fTsKKyAgICAgICAgICAgIHN1cGVydmlzb3JzX3Jlc291cmNlcy5wdXQoZW50cnkuZ2V0S2V5KCksIHJlc291cmNlcyk7CisgICAgICAgIH0KKyAgICAgICAgY2x1c3Rlci5zZXRTdXBlcnZpc29yc1Jlc291cmNlc01hcChzdXBlcnZpc29yc19yZXNvdXJjZXMpOworICAgIH0KKworICAgIHByaXZhdGUgTWFwPFN0cmluZywgRG91YmxlPiBnZXRVc2VyQ29uZigpIHsKKyAgICAgICAgTWFwPFN0cmluZywgRG91YmxlPiByZXQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIERvdWJsZT4oKTsKKyAgICAgICAgcmV0LnB1dChDb25maWcuVE9QT0xPR1lfQ09NUE9ORU5UX1JFU09VUkNFU19PTkhFQVBfTUVNT1JZX01CLAorICAgICAgICAgICAgICAgIChEb3VibGUpIF9jb25mLmdldChDb25maWcuVE9QT0xPR1lfQ09NUE9ORU5UX1JFU09VUkNFU19PTkhFQVBfTUVNT1JZX01CKSk7CisgICAgICAgIHJldC5wdXQoQ29uZmlnLlRPUE9MT0dZX0NPTVBPTkVOVF9SRVNPVVJDRVNfT0ZGSEVBUF9NRU1PUllfTUIsCisgICAgICAgICAgICAgICAgKERvdWJsZSkgX2NvbmYuZ2V0KENvbmZpZy5UT1BPTE9HWV9DT01QT05FTlRfUkVTT1VSQ0VTX09GRkhFQVBfTUVNT1JZX01CKSk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogcHJpbnQgc2NoZWR1bGluZyBmb3IgZGVidWcgcHVycG9zZXMKKyAgICAgKiBAcGFyYW0gY2x1c3RlcgorICAgICAqIEBwYXJhbSB0b3BvbG9naWVzCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBwcmludFNjaGVkdWxpbmcoQ2x1c3RlciBjbHVzdGVyLCBUb3BvbG9naWVzIHRvcG9sb2dpZXMpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzdHIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBNYXA8V29ya2VyU2xvdCwgQ29sbGVjdGlvbjxFeGVjdXRvckRldGFpbHM+Pj4+IHNjaGVkdWxpbmdNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIE1hcDxXb3JrZXJTbG90LCBDb2xsZWN0aW9uPEV4ZWN1dG9yRGV0YWlscz4+Pj4oKTsKKyAgICAgICAgZm9yIChUb3BvbG9neURldGFpbHMgdG9wbyA6IHRvcG9sb2dpZXMuZ2V0VG9wb2xvZ2llcygpKSB7CisgICAgICAgICAgICBpZiAoY2x1c3Rlci5nZXRBc3NpZ25tZW50QnlJZCh0b3BvLmdldElkKCkpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxFeGVjdXRvckRldGFpbHMsIFdvcmtlclNsb3Q+IGVudHJ5IDogY2x1c3Rlci5nZXRBc3NpZ25tZW50QnlJZCh0b3BvLmdldElkKCkpLmdldEV4ZWN1dG9yVG9TbG90KCkuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgICAgICAgICBXb3JrZXJTbG90IHNsb3QgPSBlbnRyeS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbm9kZUlkID0gc2xvdC5nZXROb2RlSWQoKTsKKyAgICAgICAgICAgICAgICAgICAgRXhlY3V0b3JEZXRhaWxzIGV4ZWMgPSBlbnRyeS5nZXRLZXkoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNjaGVkdWxpbmdNYXAuY29udGFpbnNLZXkobm9kZUlkKSA9PSBmYWxzZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGluZ01hcC5wdXQobm9kZUlkLCBuZXcgSGFzaE1hcDxTdHJpbmcsIE1hcDxXb3JrZXJTbG90LCBDb2xsZWN0aW9uPEV4ZWN1dG9yRGV0YWlscz4+PigpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoc2NoZWR1bGluZ01hcC5nZXQobm9kZUlkKS5jb250YWluc0tleSh0b3BvLmdldElkKCkpID09IGZhbHNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzY2hlZHVsaW5nTWFwLmdldChub2RlSWQpLnB1dCh0b3BvLmdldElkKCksIG5ldyBIYXNoTWFwPFdvcmtlclNsb3QsIENvbGxlY3Rpb248RXhlY3V0b3JEZXRhaWxzPj4oKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHNjaGVkdWxpbmdNYXAuZ2V0KG5vZGVJZCkuZ2V0KHRvcG8uZ2V0SWQoKSkuY29udGFpbnNLZXkoc2xvdCkgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVkdWxpbmdNYXAuZ2V0KG5vZGVJZCkuZ2V0KHRvcG8uZ2V0SWQoKSkucHV0KHNsb3QsIG5ldyBMaW5rZWRMaXN0PEV4ZWN1dG9yRGV0YWlscz4oKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGluZ01hcC5nZXQobm9kZUlkKS5nZXQodG9wby5nZXRJZCgpKS5nZXQoc2xvdCkuYWRkKGV4ZWMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgTWFwPFN0cmluZywgTWFwPFdvcmtlclNsb3QsIENvbGxlY3Rpb248RXhlY3V0b3JEZXRhaWxzPj4+PiBlbnRyeSA6IHNjaGVkdWxpbmdNYXAuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgaWYgKGNsdXN0ZXIuZ2V0U3VwZXJ2aXNvckJ5SWQoZW50cnkuZ2V0S2V5KCkpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzdHIuYXBwZW5kKCIvKiogTm9kZTogIiArIGNsdXN0ZXIuZ2V0U3VwZXJ2aXNvckJ5SWQoZW50cnkuZ2V0S2V5KCkpLmdldEhvc3QoKSArICItIiArIGVudHJ5LmdldEtleSgpICsgIiAqKi9cbiIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdHIuYXBwZW5kKCIvKiogTm9kZTogVW5rbm93biBtYXkgYmUgZGVhZCAtIiArIGVudHJ5LmdldEtleSgpICsgIiAqKi9cbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBNYXA8V29ya2VyU2xvdCwgQ29sbGVjdGlvbjxFeGVjdXRvckRldGFpbHM+Pj4gdG9wb19zY2hlZCA6IHNjaGVkdWxpbmdNYXAuZ2V0KGVudHJ5LmdldEtleSgpKS5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICAgICAgc3RyLmFwcGVuZCgiXHQtLT5Ub3BvbG9neTogIiArIHRvcG9fc2NoZWQuZ2V0S2V5KCkgKyAiXG4iKTsKKyAgICAgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxXb3JrZXJTbG90LCBDb2xsZWN0aW9uPEV4ZWN1dG9yRGV0YWlscz4+IHdzIDogdG9wb19zY2hlZC5nZXRWYWx1ZSgpLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RyLmFwcGVuZCgiXHRcdC0+U2xvdCBbIiArIHdzLmdldEtleSgpLmdldFBvcnQoKSArICJdIC0+ICIgKyB3cy5nZXRWYWx1ZSgpICsgIlxuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzdHIudG9TdHJpbmcoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2NoZWR1bGVyL3Jlc291cmNlL1Jlc291cmNlVXRpbHMuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zY2hlZHVsZXIvcmVzb3VyY2UvUmVzb3VyY2VVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMmQ1YmMKLS0tIC9kZXYvbnVsbAorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2NoZWR1bGVyL3Jlc291cmNlL1Jlc291cmNlVXRpbHMuamF2YQpAQCAtMCwwICsxLDEzMyBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiA8cD4KKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogPHA+CisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGJhY2t0eXBlLnN0b3JtLnNjaGVkdWxlci5yZXNvdXJjZTsKKworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLkNvbmZpZzsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5nZW5lcmF0ZWQuQm9sdDsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5nZW5lcmF0ZWQuU3BvdXRTcGVjOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLmdlbmVyYXRlZC5TdG9ybVRvcG9sb2d5OworaW1wb3J0IG9yZy5qc29uLnNpbXBsZS5KU09OT2JqZWN0OworaW1wb3J0IG9yZy5qc29uLnNpbXBsZS5wYXJzZXIuSlNPTlBhcnNlcjsKK2ltcG9ydCBvcmcuanNvbi5zaW1wbGUucGFyc2VyLlBhcnNlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitwdWJsaWMgY2xhc3MgUmVzb3VyY2VVdGlscyB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFJlc291cmNlVXRpbHMuY2xhc3MpOworCisgICAgcHVibGljIHN0YXRpYyBNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBEb3VibGU+PiBnZXRCb2x0c1Jlc291cmNlcyhTdG9ybVRvcG9sb2d5IHRvcG9sb2d5LCBNYXAgdG9wb2xvZ3lDb25mKSB7CisgICAgICAgIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIERvdWJsZT4+IGJvbHRSZXNvdXJjZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIERvdWJsZT4+KCk7CisgICAgICAgIGlmICh0b3BvbG9neS5nZXRfYm9sdHMoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIEJvbHQ+IGJvbHQgOiB0b3BvbG9neS5nZXRfYm9sdHMoKS5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgRG91YmxlPiB0b3BvbG9neV9yZXNvdXJjZXMgPSBwYXJzZVJlc291cmNlcyhib2x0LmdldFZhbHVlKCkuZ2V0X2NvbW1vbigpLmdldF9qc29uX2NvbmYoKSk7CisgICAgICAgICAgICAgICAgY2hlY2tJbnRpYWxpemF0aW9uKHRvcG9sb2d5X3Jlc291cmNlcywgYm9sdC5nZXRWYWx1ZSgpLnRvU3RyaW5nKCksIHRvcG9sb2d5Q29uZik7CisgICAgICAgICAgICAgICAgYm9sdFJlc291cmNlcy5wdXQoYm9sdC5nZXRLZXkoKSwgdG9wb2xvZ3lfcmVzb3VyY2VzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYm9sdFJlc291cmNlczsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIERvdWJsZT4+IGdldFNwb3V0c1Jlc291cmNlcyhTdG9ybVRvcG9sb2d5IHRvcG9sb2d5LCBNYXAgdG9wb2xvZ3lDb25mKSB7CisgICAgICAgIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIERvdWJsZT4+IHNwb3V0UmVzb3VyY2VzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBEb3VibGU+PigpOworICAgICAgICBpZiAodG9wb2xvZ3kuZ2V0X3Nwb3V0cygpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgU3BvdXRTcGVjPiBzcG91dCA6IHRvcG9sb2d5LmdldF9zcG91dHMoKS5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgRG91YmxlPiB0b3BvbG9neV9yZXNvdXJjZXMgPSBwYXJzZVJlc291cmNlcyhzcG91dC5nZXRWYWx1ZSgpLmdldF9jb21tb24oKS5nZXRfanNvbl9jb25mKCkpOworICAgICAgICAgICAgICAgIGNoZWNrSW50aWFsaXphdGlvbih0b3BvbG9neV9yZXNvdXJjZXMsIHNwb3V0LmdldFZhbHVlKCkudG9TdHJpbmcoKSwgdG9wb2xvZ3lDb25mKTsKKyAgICAgICAgICAgICAgICBzcG91dFJlc291cmNlcy5wdXQoc3BvdXQuZ2V0S2V5KCksIHRvcG9sb2d5X3Jlc291cmNlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNwb3V0UmVzb3VyY2VzOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja0ludGlhbGl6YXRpb24oTWFwPFN0cmluZywgRG91YmxlPiB0b3BvbG9neV9yZXNvdXJjZXMsIFN0cmluZyBDb20sIE1hcCB0b3BvbG9neUNvbmYpIHsKKyAgICAgICAgY2hlY2tJbml0TWVtKHRvcG9sb2d5X3Jlc291cmNlcywgQ29tLCB0b3BvbG9neUNvbmYpOworICAgICAgICBjaGVja0luaXRDUFUodG9wb2xvZ3lfcmVzb3VyY2VzLCBDb20sIHRvcG9sb2d5Q29uZik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGNoZWNrSW5pdE1lbShNYXA8U3RyaW5nLCBEb3VibGU+IHRvcG9sb2d5X3Jlc291cmNlcywgU3RyaW5nIENvbSwgTWFwIHRvcG9sb2d5Q29uZikgeworICAgICAgICBpZiAoIXRvcG9sb2d5X3Jlc291cmNlcy5jb250YWluc0tleShDb25maWcuVE9QT0xPR1lfQ09NUE9ORU5UX1JFU09VUkNFU19PTkhFQVBfTUVNT1JZX01CKSkgeworICAgICAgICAgICAgdG9wb2xvZ3lfcmVzb3VyY2VzLnB1dChDb25maWcuVE9QT0xPR1lfQ09NUE9ORU5UX1JFU09VUkNFU19PTkhFQVBfTUVNT1JZX01CLAorICAgICAgICAgICAgICAgICAgICBiYWNrdHlwZS5zdG9ybS51dGlscy5VdGlscy5nZXREb3VibGUodG9wb2xvZ3lDb25mLmdldChDb25maWcuVE9QT0xPR1lfQ09NUE9ORU5UX1JFU09VUkNFU19PTkhFQVBfTUVNT1JZX01CKSwgbnVsbCkpOworICAgICAgICAgICAgZGVidWdNZXNzYWdlKCJPTkhFQVAiLCBDb20sIHRvcG9sb2d5Q29uZik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCF0b3BvbG9neV9yZXNvdXJjZXMuY29udGFpbnNLZXkoQ29uZmlnLlRPUE9MT0dZX0NPTVBPTkVOVF9SRVNPVVJDRVNfT0ZGSEVBUF9NRU1PUllfTUIpKSB7CisgICAgICAgICAgICB0b3BvbG9neV9yZXNvdXJjZXMucHV0KENvbmZpZy5UT1BPTE9HWV9DT01QT05FTlRfUkVTT1VSQ0VTX09GRkhFQVBfTUVNT1JZX01CLAorICAgICAgICAgICAgICAgICAgICBiYWNrdHlwZS5zdG9ybS51dGlscy5VdGlscy5nZXREb3VibGUodG9wb2xvZ3lDb25mLmdldChDb25maWcuVE9QT0xPR1lfQ09NUE9ORU5UX1JFU09VUkNFU19PRkZIRUFQX01FTU9SWV9NQiksIG51bGwpKTsKKyAgICAgICAgICAgIGRlYnVnTWVzc2FnZSgiT0ZGSEVBUCIsIENvbSwgdG9wb2xvZ3lDb25mKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja0luaXRDUFUoTWFwPFN0cmluZywgRG91YmxlPiB0b3BvbG9neV9yZXNvdXJjZXMsIFN0cmluZyBDb20sIE1hcCB0b3BvbG9neUNvbmYpIHsKKyAgICAgICAgaWYgKCF0b3BvbG9neV9yZXNvdXJjZXMuY29udGFpbnNLZXkoQ29uZmlnLlRPUE9MT0dZX0NPTVBPTkVOVF9DUFVfUENPUkVfUEVSQ0VOVCkpIHsKKyAgICAgICAgICAgIHRvcG9sb2d5X3Jlc291cmNlcy5wdXQoQ29uZmlnLlRPUE9MT0dZX0NPTVBPTkVOVF9DUFVfUENPUkVfUEVSQ0VOVCwKKyAgICAgICAgICAgICAgICAgICAgYmFja3R5cGUuc3Rvcm0udXRpbHMuVXRpbHMuZ2V0RG91YmxlKHRvcG9sb2d5Q29uZi5nZXQoQ29uZmlnLlRPUE9MT0dZX0NPTVBPTkVOVF9DUFVfUENPUkVfUEVSQ0VOVCksIG51bGwpKTsKKyAgICAgICAgICAgIGRlYnVnTWVzc2FnZSgiQ1BVIiwgQ29tLCB0b3BvbG9neUNvbmYpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBNYXA8U3RyaW5nLCBEb3VibGU+IHBhcnNlUmVzb3VyY2VzKFN0cmluZyBpbnB1dCkgeworICAgICAgICBNYXA8U3RyaW5nLCBEb3VibGU+IHRvcG9sb2d5X3Jlc291cmNlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgRG91YmxlPigpOworICAgICAgICBKU09OUGFyc2VyIHBhcnNlciA9IG5ldyBKU09OUGFyc2VyKCk7CisgICAgICAgIExPRy5kZWJ1ZygiSW5wdXQgdG8gcGFyc2VSZXNvdXJjZXMge30iLCBpbnB1dCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIE9iamVjdCBvYmogPSBwYXJzZXIucGFyc2UoaW5wdXQpOworICAgICAgICAgICAgICAgIEpTT05PYmplY3QganNvbk9iamVjdCA9IChKU09OT2JqZWN0KSBvYmo7CisgICAgICAgICAgICAgICAgaWYgKGpzb25PYmplY3QuY29udGFpbnNLZXkoQ29uZmlnLlRPUE9MT0dZX0NPTVBPTkVOVF9SRVNPVVJDRVNfT05IRUFQX01FTU9SWV9NQikpIHsKKyAgICAgICAgICAgICAgICAgICAgRG91YmxlIHRvcG9NZW1PbkhlYXAgPSBiYWNrdHlwZS5zdG9ybS51dGlscy5VdGlscworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXREb3VibGUoanNvbk9iamVjdC5nZXQoQ29uZmlnLlRPUE9MT0dZX0NPTVBPTkVOVF9SRVNPVVJDRVNfT05IRUFQX01FTU9SWV9NQiksIG51bGwpOworICAgICAgICAgICAgICAgICAgICB0b3BvbG9neV9yZXNvdXJjZXMucHV0KENvbmZpZy5UT1BPTE9HWV9DT01QT05FTlRfUkVTT1VSQ0VTX09OSEVBUF9NRU1PUllfTUIsIHRvcG9NZW1PbkhlYXApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoanNvbk9iamVjdC5jb250YWluc0tleShDb25maWcuVE9QT0xPR1lfQ09NUE9ORU5UX1JFU09VUkNFU19PRkZIRUFQX01FTU9SWV9NQikpIHsKKyAgICAgICAgICAgICAgICAgICAgRG91YmxlIHRvcG9NZW1PZmZIZWFwID0gYmFja3R5cGUuc3Rvcm0udXRpbHMuVXRpbHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RG91YmxlKGpzb25PYmplY3QuZ2V0KENvbmZpZy5UT1BPTE9HWV9DT01QT05FTlRfUkVTT1VSQ0VTX09GRkhFQVBfTUVNT1JZX01CKSwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIHRvcG9sb2d5X3Jlc291cmNlcy5wdXQoQ29uZmlnLlRPUE9MT0dZX0NPTVBPTkVOVF9SRVNPVVJDRVNfT0ZGSEVBUF9NRU1PUllfTUIsIHRvcG9NZW1PZmZIZWFwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGpzb25PYmplY3QuY29udGFpbnNLZXkoQ29uZmlnLlRPUE9MT0dZX0NPTVBPTkVOVF9DUFVfUENPUkVfUEVSQ0VOVCkpIHsKKyAgICAgICAgICAgICAgICAgICAgRG91YmxlIHRvcG9DUFUgPSBiYWNrdHlwZS5zdG9ybS51dGlscy5VdGlscy5nZXREb3VibGUoanNvbk9iamVjdC5nZXQoQ29uZmlnLlRPUE9MT0dZX0NPTVBPTkVOVF9DUFVfUENPUkVfUEVSQ0VOVCksIG51bGwpOworICAgICAgICAgICAgICAgICAgICB0b3BvbG9neV9yZXNvdXJjZXMucHV0KENvbmZpZy5UT1BPTE9HWV9DT01QT05FTlRfQ1BVX1BDT1JFX1BFUkNFTlQsIHRvcG9DUFUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBMT0cuZGVidWcoIlRvcG9sb2d5IFJlc291cmNlcyB7fSIsIHRvcG9sb2d5X3Jlc291cmNlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExPRy5lcnJvcigiRmFpbGVkIHRvIHBhcnNlIGNvbXBvbmVudCByZXNvdXJjZXMgaXM6IiArIGUudG9TdHJpbmcoKSwgZSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdG9wb2xvZ3lfcmVzb3VyY2VzOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZGVidWdNZXNzYWdlKFN0cmluZyBtZW1vcnlUeXBlLCBTdHJpbmcgQ29tLCBNYXAgdG9wb2xvZ3lDb25mKSB7CisgICAgICAgIGlmIChtZW1vcnlUeXBlLmVxdWFscygiT05IRUFQIikpIHsKKyAgICAgICAgICAgIExPRy5kZWJ1ZygKKyAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBleHRyYWN0IHJlc291cmNlIHJlcXVpcmVtZW50IGZvciBDb21wb25lbnQge30gXG4gUmVzb3VyY2UgOiBNZW1vcnkgVHlwZSA6IE9uIEhlYXAgc2V0IHRvIGRlZmF1bHQge30iLAorICAgICAgICAgICAgICAgICAgICBDb20sIHRvcG9sb2d5Q29uZi5nZXQoQ29uZmlnLlRPUE9MT0dZX0NPTVBPTkVOVF9SRVNPVVJDRVNfT05IRUFQX01FTU9SWV9NQikpOworICAgICAgICB9IGVsc2UgaWYgKG1lbW9yeVR5cGUuZXF1YWxzKCJPRkZIRUFQIikpIHsKKyAgICAgICAgICAgIExPRy5kZWJ1ZygKKyAgICAgICAgICAgICAgICAgICAgIlVuYWJsZSB0byBleHRyYWN0IHJlc291cmNlIHJlcXVpcmVtZW50IGZvciBDb21wb25lbnQge30gXG4gUmVzb3VyY2UgOiBNZW1vcnkgVHlwZSA6IE9mZiBIZWFwIHNldCB0byBkZWZhdWx0IHt9IiwKKyAgICAgICAgICAgICAgICAgICAgQ29tLCB0b3BvbG9neUNvbmYuZ2V0KENvbmZpZy5UT1BPTE9HWV9DT01QT05FTlRfUkVTT1VSQ0VTX09GRkhFQVBfTUVNT1JZX01CKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0cuZGVidWcoCisgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gZXh0cmFjdCByZXNvdXJjZSByZXF1aXJlbWVudCBmb3IgQ29tcG9uZW50IHt9IFxuIFJlc291cmNlIDogQ1BVIFBjb3JlIFBlcmNlbnQgc2V0IHRvIGRlZmF1bHQge30iLAorICAgICAgICAgICAgICAgICAgICBDb20sIHRvcG9sb2d5Q29uZi5nZXQoQ29uZmlnLlRPUE9MT0dZX0NPTVBPTkVOVF9DUFVfUENPUkVfUEVSQ0VOVCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NjaGVkdWxlci9yZXNvdXJjZS9zdHJhdGVnaWVzL0lTdHJhdGVneS5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NjaGVkdWxlci9yZXNvdXJjZS9zdHJhdGVnaWVzL0lTdHJhdGVneS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZjMyMjMKLS0tIC9kZXYvbnVsbAorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2NoZWR1bGVyL3Jlc291cmNlL3N0cmF0ZWdpZXMvSVN0cmF0ZWd5LmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiA8cD4KKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogPHA+CisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGJhY2t0eXBlLnN0b3JtLnNjaGVkdWxlci5yZXNvdXJjZS5zdHJhdGVnaWVzOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnNjaGVkdWxlci5Ub3BvbG9naWVzOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnNjaGVkdWxlci5FeGVjdXRvckRldGFpbHM7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0uc2NoZWR1bGVyLlRvcG9sb2d5RGV0YWlsczsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5zY2hlZHVsZXIuV29ya2VyU2xvdDsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5zY2hlZHVsZXIucmVzb3VyY2UuUkFTX05vZGU7CisKKy8qKgorICogQW4gaW50ZXJmYWNlIHRvIGZvciBpbXBsZW1lbnRpbmcgZGlmZmVyZW50IHNjaGVkdWxpbmcgc3RyYXRlZ2llcyBmb3IgdGhlIHJlc291cmNlIGF3YXJlIHNjaGVkdWxpbmcKKyAqIEluIHRoZSBmdXR1cmUgc3RhdGVnaWVzIHdpbGwgYmUgcGx1Z2dhYmxlCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSVN0cmF0ZWd5IHsKKworICAgIHB1YmxpYyBNYXA8V29ya2VyU2xvdCwgQ29sbGVjdGlvbjxFeGVjdXRvckRldGFpbHM+PiBzY2hlZHVsZShUb3BvbG9neURldGFpbHMgdGQpOworfQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NjaGVkdWxlci9yZXNvdXJjZS9zdHJhdGVnaWVzL1Jlc291cmNlQXdhcmVTdHJhdGVneS5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NjaGVkdWxlci9yZXNvdXJjZS9zdHJhdGVnaWVzL1Jlc291cmNlQXdhcmVTdHJhdGVneS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmZTM3ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2NoZWR1bGVyL3Jlc291cmNlL3N0cmF0ZWdpZXMvUmVzb3VyY2VBd2FyZVN0cmF0ZWd5LmphdmEKQEAgLTAsMCArMSw0NzkgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYmFja3R5cGUuc3Rvcm0uc2NoZWR1bGVyLnJlc291cmNlLnN0cmF0ZWdpZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKK2ltcG9ydCBqYXZhLnV0aWwuUXVldWU7CitpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnNjaGVkdWxlci5DbHVzdGVyOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnNjaGVkdWxlci5FeGVjdXRvckRldGFpbHM7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0uc2NoZWR1bGVyLlRvcG9sb2dpZXM7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0uc2NoZWR1bGVyLlRvcG9sb2d5RGV0YWlsczsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5zY2hlZHVsZXIuV29ya2VyU2xvdDsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5zY2hlZHVsZXIucmVzb3VyY2UuQ29tcG9uZW50OworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnNjaGVkdWxlci5yZXNvdXJjZS5SQVNfTm9kZTsKKworcHVibGljIGNsYXNzIFJlc291cmNlQXdhcmVTdHJhdGVneSBpbXBsZW1lbnRzIElTdHJhdGVneSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFJlc291cmNlQXdhcmVTdHJhdGVneS5jbGFzcyk7CisgICAgcHJpdmF0ZSBUb3BvbG9naWVzIF90b3BvbG9naWVzOworICAgIHByaXZhdGUgQ2x1c3RlciBfY2x1c3RlcjsKKyAgICAvL01hcCBrZXkgaXMgdGhlIHN1cGVydmlzb3IgaWQgYW5kIHRoZSB2YWx1ZSBpcyB0aGUgY29ycmVzcG9uZGluZyBSQVNfTm9kZSBPYmplY3QgCisgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBSQVNfTm9kZT4gX2F2YWlsTm9kZXM7CisgICAgcHJpdmF0ZSBSQVNfTm9kZSByZWZOb2RlID0gbnVsbDsKKyAgICAvKioKKyAgICAgKiBzdXBlcnZpc29yIGlkIC0+IE5vZGUKKyAgICAgKi8KKyAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFJBU19Ob2RlPiBfbm9kZXM7CisgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IF9jbHVzdGVySW5mbzsKKworICAgIHByaXZhdGUgZmluYWwgZG91YmxlIENQVV9XRUlHSFQgPSAxLjA7CisgICAgcHJpdmF0ZSBmaW5hbCBkb3VibGUgTUVNX1dFSUdIVCA9IDEuMDsKKyAgICBwcml2YXRlIGZpbmFsIGRvdWJsZSBORVRXT1JLX1dFSUdIVCA9IDEuMDsKKworICAgIHB1YmxpYyBSZXNvdXJjZUF3YXJlU3RyYXRlZ3koQ2x1c3RlciBjbHVzdGVyLCBUb3BvbG9naWVzIHRvcG9sb2dpZXMpIHsKKyAgICAgICAgX3RvcG9sb2dpZXMgPSB0b3BvbG9naWVzOworICAgICAgICBfY2x1c3RlciA9IGNsdXN0ZXI7CisgICAgICAgIF9ub2RlcyA9IFJBU19Ob2RlLmdldEFsbE5vZGVzRnJvbShjbHVzdGVyLCBfdG9wb2xvZ2llcyk7CisgICAgICAgIF9hdmFpbE5vZGVzID0gdGhpcy5nZXRBdmFpbE5vZGVzKCk7CisgICAgICAgIF9jbHVzdGVySW5mbyA9IGNsdXN0ZXIuZ2V0TmV0d29ya1RvcG9ncmFwaHkoKTsKKyAgICAgICAgTE9HLmRlYnVnKHRoaXMuZ2V0Q2x1c3RlckluZm8oKSk7CisgICAgfQorCisgICAgLy90aGUgcmV0dXJuZWQgVHJlZU1hcCBrZWVwcyB0aGUgQ29tcG9uZW50cyBzb3J0ZWQKKyAgICBwcml2YXRlIFRyZWVNYXA8SW50ZWdlciwgTGlzdDxFeGVjdXRvckRldGFpbHM+PiBnZXRQcmlvcml0eVRvRXhlY3V0b3JEZXRhaWxzTGlzdE1hcCgKKyAgICAgICAgICAgIFF1ZXVlPENvbXBvbmVudD4gb3JkZXJlZF9fQ29tcG9uZW50X2xpc3QsIENvbGxlY3Rpb248RXhlY3V0b3JEZXRhaWxzPiB1bmFzc2lnbmVkRXhlY3V0b3JzKSB7CisgICAgICAgIFRyZWVNYXA8SW50ZWdlciwgTGlzdDxFeGVjdXRvckRldGFpbHM+PiByZXRNYXAgPSBuZXcgVHJlZU1hcDw+KCk7CisgICAgICAgIEludGVnZXIgcmFuayA9IDA7CisgICAgICAgIGZvciAoQ29tcG9uZW50IHJhc19jb21wIDogb3JkZXJlZF9fQ29tcG9uZW50X2xpc3QpIHsKKyAgICAgICAgICAgIHJldE1hcC5wdXQocmFuaywgbmV3IEFycmF5TGlzdDxFeGVjdXRvckRldGFpbHM+KCkpOworICAgICAgICAgICAgZm9yKEV4ZWN1dG9yRGV0YWlscyBleGVjIDogcmFzX2NvbXAuZXhlY3MpIHsKKyAgICAgICAgICAgICAgICBpZih1bmFzc2lnbmVkRXhlY3V0b3JzLmNvbnRhaW5zKGV4ZWMpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldE1hcC5nZXQocmFuaykuYWRkKGV4ZWMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJhbmsrKzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0TWFwOworICAgIH0KKworICAgIHB1YmxpYyBNYXA8V29ya2VyU2xvdCwgQ29sbGVjdGlvbjxFeGVjdXRvckRldGFpbHM+PiBzY2hlZHVsZShUb3BvbG9neURldGFpbHMgdGQpIHsKKyAgICAgICAgaWYgKF9hdmFpbE5vZGVzLnNpemUoKSA8PSAwKSB7CisgICAgICAgICAgICBMT0cud2FybigiTm8gYXZhaWxhYmxlIG5vZGVzIHRvIHNjaGVkdWxlIHRhc2tzIG9uISIpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgQ29sbGVjdGlvbjxFeGVjdXRvckRldGFpbHM+IHVuYXNzaWduZWRFeGVjdXRvcnMgPSBfY2x1c3Rlci5nZXRVbmFzc2lnbmVkRXhlY3V0b3JzKHRkKTsKKyAgICAgICAgTWFwPFdvcmtlclNsb3QsIENvbGxlY3Rpb248RXhlY3V0b3JEZXRhaWxzPj4gc2NoZWR1bGVyQXNzaWdubWVudE1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgTE9HLmRlYnVnKCJFeGVjdXRvcnNOZWVkU2NoZWR1bGluZzoge30iLCB1bmFzc2lnbmVkRXhlY3V0b3JzKTsKKyAgICAgICAgQ29sbGVjdGlvbjxFeGVjdXRvckRldGFpbHM+IHNjaGVkdWxlZFRhc2tzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIExpc3Q8Q29tcG9uZW50PiBzcG91dHMgPSB0aGlzLmdldFNwb3V0cyhfdG9wb2xvZ2llcywgdGQpOworCisgICAgICAgIGlmIChzcG91dHMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIExPRy5lcnJvcigiQ2Fubm90IGZpbmQgYSBTcG91dCEiKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgUXVldWU8Q29tcG9uZW50PiBvcmRlcmVkX19Db21wb25lbnRfbGlzdCA9IGJmcyhfdG9wb2xvZ2llcywgdGQsIHNwb3V0cyk7CisKKyAgICAgICAgTWFwPEludGVnZXIsIExpc3Q8RXhlY3V0b3JEZXRhaWxzPj4gcHJpb3JpdHlUb0V4ZWN1dG9yTWFwID0gZ2V0UHJpb3JpdHlUb0V4ZWN1dG9yRGV0YWlsc0xpc3RNYXAob3JkZXJlZF9fQ29tcG9uZW50X2xpc3QsIHVuYXNzaWduZWRFeGVjdXRvcnMpOworICAgICAgICBDb2xsZWN0aW9uPEV4ZWN1dG9yRGV0YWlscz4gZXhlY3V0b3JzTm90U2NoZWR1bGVkID0gbmV3IEhhc2hTZXQ8Pih1bmFzc2lnbmVkRXhlY3V0b3JzKTsKKyAgICAgICAgSW50ZWdlciBsb25nZXN0UHJpb3JpdHlMaXN0U2l6ZSA9IHRoaXMuZ2V0TG9uZ2VzdFByaW9yaXR5TGlzdFNpemUocHJpb3JpdHlUb0V4ZWN1dG9yTWFwKTsKKyAgICAgICAgLy9QaWNrIHRoZSBmaXJzdCBleGVjdXRvciB3aXRoIHByaW9yaXR5IG9uZSwgdGhlbiB0aGUgMXN0IGV4ZWMgd2l0aCBwcmlvcml0eSAyLCBzbyBvbiBhbiBzbyBmb3J0aC4gCisgICAgICAgIC8vT25jZSB3ZSByZWFjaCB0aGUgbGFzdCBwcmlvcml0eSwgd2UgZ28gYmFjayB0byBwcmlvcml0eSAxIGFuZCBzY2hlZHVsZSB0aGUgc2Vjb25kIHRhc2sgd2l0aCBwcmlvcml0eSAxLgorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxvbmdlc3RQcmlvcml0eUxpc3RTaXplOyBpKyspIHsKKyAgICAgICAgICAgIGZvciAoRW50cnk8SW50ZWdlciwgTGlzdDxFeGVjdXRvckRldGFpbHM+PiBlbnRyeSA6IHByaW9yaXR5VG9FeGVjdXRvck1hcC5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICAgICAgSXRlcmF0b3I8RXhlY3V0b3JEZXRhaWxzPiBpdCA9IGVudHJ5LmdldFZhbHVlKCkuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgICAgICBpZiAoaXQuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIEV4ZWN1dG9yRGV0YWlscyBleGVjID0gaXQubmV4dCgpOworICAgICAgICAgICAgICAgICAgICBMT0cuZGVidWcoIlxuXG5BdHRlbXB0aW5nIHRvIHNjaGVkdWxlOiB7fSBvZiBjb21wb25lbnQge31bYXZhaWwge31dIHdpdGggcmFuayB7fSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtdIHsgZXhlYywgdGQuZ2V0RXhlY3V0b3JUb0NvbXBvbmVudCgpLmdldChleGVjKSwKKyAgICAgICAgICAgICAgICAgICAgdGQuZ2V0VGFza1Jlc291cmNlUmVxTGlzdChleGVjKSwgZW50cnkuZ2V0S2V5KCkgfSk7CisgICAgICAgICAgICAgICAgICAgIFdvcmtlclNsb3QgdGFyZ2V0U2xvdCA9IHRoaXMuZmluZFdvcmtlckZvckV4ZWMoZXhlYywgdGQsIHNjaGVkdWxlckFzc2lnbm1lbnRNYXApOworICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0U2xvdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBSQVNfTm9kZSB0YXJnZXROb2RlID0gdGhpcy5pZFRvTm9kZSh0YXJnZXRTbG90LmdldE5vZGVJZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFzY2hlZHVsZXJBc3NpZ25tZW50TWFwLmNvbnRhaW5zS2V5KHRhcmdldFNsb3QpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVyQXNzaWdubWVudE1hcC5wdXQodGFyZ2V0U2xvdCwgbmV3IExpbmtlZExpc3Q8RXhlY3V0b3JEZXRhaWxzPigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZXJBc3NpZ25tZW50TWFwLmdldCh0YXJnZXRTbG90KS5hZGQoZXhlYyk7CisgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXROb2RlLmNvbnN1bWVSZXNvdXJjZXNmb3JUYXNrKGV4ZWMsIHRkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlZFRhc2tzLmFkZChleGVjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPRy5kZWJ1ZygiVEFTSyB7fSBhc3NpZ25lZCB0byBOb2RlOiB7fSBhdmFpbCBbbWVtOiB7fSBjcHU6IHt9XSB0b3RhbCBbbWVtOiB7fSBjcHU6IHt9XSBvbiBzbG90OiB7fSIsIGV4ZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldE5vZGUsIHRhcmdldE5vZGUuZ2V0QXZhaWxhYmxlTWVtb3J5UmVzb3VyY2VzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldE5vZGUuZ2V0QXZhaWxhYmxlQ3B1UmVzb3VyY2VzKCksIHRhcmdldE5vZGUuZ2V0VG90YWxNZW1vcnlSZXNvdXJjZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Tm9kZS5nZXRUb3RhbENwdVJlc291cmNlcygpLCB0YXJnZXRTbG90KTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPRy5lcnJvcigiTm90IEVub3VnaCBSZXNvdXJjZXMgdG8gc2NoZWR1bGUgVGFzayB7fSIsIGV4ZWMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGl0LnJlbW92ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGV4ZWN1dG9yc05vdFNjaGVkdWxlZC5yZW1vdmVBbGwoc2NoZWR1bGVkVGFza3MpOworICAgICAgICBMT0cuZGVidWcoIi8qIFNjaGVkdWxpbmcgbGVmdCBvdmVyIHRhc2sgKG1vc3QgbGlrZWx5IHN5cyB0YXNrcykgKi8iKTsKKyAgICAgICAgLy8gc2NoZWR1bGUgbGVmdCBvdmVyIHN5c3RlbSB0YXNrcworICAgICAgICBmb3IgKEV4ZWN1dG9yRGV0YWlscyBleGVjIDogZXhlY3V0b3JzTm90U2NoZWR1bGVkKSB7CisgICAgICAgICAgICBXb3JrZXJTbG90IHRhcmdldFNsb3QgPSB0aGlzLmZpbmRXb3JrZXJGb3JFeGVjKGV4ZWMsIHRkLCBzY2hlZHVsZXJBc3NpZ25tZW50TWFwKTsKKyAgICAgICAgICAgIGlmICh0YXJnZXRTbG90ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBSQVNfTm9kZSB0YXJnZXROb2RlID0gdGhpcy5pZFRvTm9kZSh0YXJnZXRTbG90LmdldE5vZGVJZCgpKTsKKyAgICAgICAgICAgICAgICBpZighc2NoZWR1bGVyQXNzaWdubWVudE1hcC5jb250YWluc0tleSh0YXJnZXRTbG90KSkgeworICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZXJBc3NpZ25tZW50TWFwLnB1dCh0YXJnZXRTbG90LCBuZXcgTGlua2VkTGlzdDxFeGVjdXRvckRldGFpbHM+KCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHNjaGVkdWxlckFzc2lnbm1lbnRNYXAuZ2V0KHRhcmdldFNsb3QpLmFkZChleGVjKTsKKyAgICAgICAgICAgICAgICB0YXJnZXROb2RlLmNvbnN1bWVSZXNvdXJjZXNmb3JUYXNrKGV4ZWMsIHRkKTsKKyAgICAgICAgICAgICAgICBzY2hlZHVsZWRUYXNrcy5hZGQoZXhlYyk7CisgICAgICAgICAgICAgICAgTE9HLmRlYnVnKCJUQVNLIHt9IGFzc2lnbmVkIHRvIE5vZGU6IHt9IGF2YWlsIFttZW06IHt9IGNwdToge31dIHRvdGFsIFttZW06IHt9IGNwdToge31dIG9uIHNsb3Q6IHt9IiwgZXhlYywKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldE5vZGUsIHRhcmdldE5vZGUuZ2V0QXZhaWxhYmxlTWVtb3J5UmVzb3VyY2VzKCksCisgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXROb2RlLmdldEF2YWlsYWJsZUNwdVJlc291cmNlcygpLCB0YXJnZXROb2RlLmdldFRvdGFsTWVtb3J5UmVzb3VyY2VzKCksCisgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXROb2RlLmdldFRvdGFsQ3B1UmVzb3VyY2VzKCksIHRhcmdldFNsb3QpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMT0cuZXJyb3IoIk5vdCBFbm91Z2ggUmVzb3VyY2VzIHRvIHNjaGVkdWxlIFRhc2sge30iLCBleGVjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBleGVjdXRvcnNOb3RTY2hlZHVsZWQucmVtb3ZlQWxsKHNjaGVkdWxlZFRhc2tzKTsKKyAgICAgICAgaWYgKGV4ZWN1dG9yc05vdFNjaGVkdWxlZC5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBMT0cuZXJyb3IoIk5vdCBhbGwgZXhlY3V0b3JzIHN1Y2Nlc3NmdWxseSBzY2hlZHVsZWQ6IHt9IiwKKyAgICAgICAgICAgICAgICAgICAgZXhlY3V0b3JzTm90U2NoZWR1bGVkKTsKKyAgICAgICAgICAgIHNjaGVkdWxlckFzc2lnbm1lbnRNYXAgPSBudWxsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HLmRlYnVnKCJBbGwgcmVzb3VyY2VzIHN1Y2Nlc3NmdWxseSBzY2hlZHVsZWQhIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNjaGVkdWxlckFzc2lnbm1lbnRNYXAgPT0gbnVsbCkgeworICAgICAgICAgICAgTE9HLmVycm9yKCJUb3BvbG9neSB7fSBub3Qgc3VjY2Vzc2Z1bGx5IHNjaGVkdWxlZCEiLCB0ZC5nZXRJZCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2NoZWR1bGVyQXNzaWdubWVudE1hcDsKKyAgICB9CisKKyAgICBwcml2YXRlIFdvcmtlclNsb3QgZmluZFdvcmtlckZvckV4ZWMoRXhlY3V0b3JEZXRhaWxzIGV4ZWMsIFRvcG9sb2d5RGV0YWlscyB0ZCwgTWFwPFdvcmtlclNsb3QsIENvbGxlY3Rpb248RXhlY3V0b3JEZXRhaWxzPj4gc2NoZWR1bGVBc3NpZ25tZW50TWFwKSB7CisgICAgICBXb3JrZXJTbG90IHdzOworICAgICAgLy8gZmlyc3Qgc2NoZWR1bGluZworICAgICAgaWYgKHRoaXMucmVmTm9kZSA9PSBudWxsKSB7CisgICAgICAgICAgU3RyaW5nIGNsdXMgPSB0aGlzLmdldEJlc3RDbHVzdGVyaW5nKCk7CisgICAgICAgICAgd3MgPSB0aGlzLmdldEJlc3RXb3JrZXIoZXhlYywgdGQsIGNsdXMsIHNjaGVkdWxlQXNzaWdubWVudE1hcCk7CisgICAgICB9IGVsc2UgeworICAgICAgICAgIHdzID0gdGhpcy5nZXRCZXN0V29ya2VyKGV4ZWMsIHRkLCBzY2hlZHVsZUFzc2lnbm1lbnRNYXApOworICAgICAgfQorICAgICAgaWYod3MgIT0gbnVsbCkgeworICAgICAgICAgIHRoaXMucmVmTm9kZSA9IHRoaXMuaWRUb05vZGUod3MuZ2V0Tm9kZUlkKCkpOworICAgICAgfQorICAgICAgTE9HLmRlYnVnKCJyZWZlcmVuY2Ugbm9kZSBmb3IgdGhlIHJlc291cmNlIGF3YXJlIHNjaGVkdWxlciBpczoge30iLCB0aGlzLnJlZk5vZGUpOworICAgICAgcmV0dXJuIHdzOworICAgIH0KKworICAgIHByaXZhdGUgV29ya2VyU2xvdCBnZXRCZXN0V29ya2VyKEV4ZWN1dG9yRGV0YWlscyBleGVjLCBUb3BvbG9neURldGFpbHMgdGQsIE1hcDxXb3JrZXJTbG90LCBDb2xsZWN0aW9uPEV4ZWN1dG9yRGV0YWlscz4+IHNjaGVkdWxlQXNzaWdubWVudE1hcCkgeworICAgICAgICByZXR1cm4gdGhpcy5nZXRCZXN0V29ya2VyKGV4ZWMsIHRkLCBudWxsLCBzY2hlZHVsZUFzc2lnbm1lbnRNYXApOworICAgIH0KKworICAgIHByaXZhdGUgV29ya2VyU2xvdCBnZXRCZXN0V29ya2VyKEV4ZWN1dG9yRGV0YWlscyBleGVjLCBUb3BvbG9neURldGFpbHMgdGQsIFN0cmluZyBjbHVzdGVySWQsIE1hcDxXb3JrZXJTbG90LCBDb2xsZWN0aW9uPEV4ZWN1dG9yRGV0YWlscz4+IHNjaGVkdWxlQXNzaWdubWVudE1hcCkgeworICAgICAgICBkb3VibGUgdGFza01lbSA9IHRkLmdldFRvdGFsTWVtUmVxVGFzayhleGVjKTsKKyAgICAgICAgZG91YmxlIHRhc2tDUFUgPSB0ZC5nZXRUb3RhbENwdVJlcVRhc2soZXhlYyk7CisgICAgICAgIExpc3Q8UkFTX05vZGU+IG5vZGVzOworICAgICAgICBpZihjbHVzdGVySWQgIT0gbnVsbCkgeworICAgICAgICAgICAgbm9kZXMgPSB0aGlzLmdldEF2YWlsYWJsZU5vZGVzRnJvbUNsdXN0ZXIoY2x1c3RlcklkKTsKKyAgICAgICAgICAgIAorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbm9kZXMgPSB0aGlzLmdldEF2YWlsYWJsZU5vZGVzKCk7CisgICAgICAgIH0KKyAgICAgICAgLy9GaXJzdCBzb3J0IG5vZGVzIGJ5IGRpc3RhbmNlCisgICAgICAgIFRyZWVNYXA8RG91YmxlLCBSQVNfTm9kZT4gbm9kZVJhbmtNYXAgPSBuZXcgVHJlZU1hcDw+KCk7CisgICAgICAgIGZvciAoUkFTX05vZGUgbiA6IG5vZGVzKSB7CisgICAgICAgICAgICBpZihuLmdldEZyZWVTbG90cygpLnNpemUoKT4wKSB7CisgICAgICAgICAgICAgICAgaWYgKG4uZ2V0QXZhaWxhYmxlTWVtb3J5UmVzb3VyY2VzKCkgPj0gdGFza01lbQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgbi5nZXRBdmFpbGFibGVDcHVSZXNvdXJjZXMoKSA+PSB0YXNrQ1BVKSB7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhID0gTWF0aC5wb3coKCh0YXNrQ1BVIC0gbi5nZXRBdmFpbGFibGVDcHVSZXNvdXJjZXMoKSkvKG4uZ2V0QXZhaWxhYmxlQ3B1UmVzb3VyY2VzKCkgKyAxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoaXMuQ1BVX1dFSUdIVCwgMik7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBiID0gTWF0aC5wb3coKCh0YXNrTWVtIC0gbi5nZXRBdmFpbGFibGVNZW1vcnlSZXNvdXJjZXMoKSkvKG4uZ2V0QXZhaWxhYmxlTWVtb3J5UmVzb3VyY2VzKCkgKyAxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRoaXMuTUVNX1dFSUdIVCwgMik7CisgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBjID0gMC4wOworICAgICAgICAgICAgICAgICAgICBpZih0aGlzLnJlZk5vZGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYyA9IE1hdGgucG93KHRoaXMuZGlzdFRvTm9kZSh0aGlzLnJlZk5vZGUsIG4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogdGhpcy5ORVRXT1JLX1dFSUdIVCwgMik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZG91YmxlIGRpc3RhbmNlID0gTWF0aC5zcXJ0KGEgKyBiICsgYyk7CisgICAgICAgICAgICAgICAgICAgIG5vZGVSYW5rTWFwLnB1dChkaXN0YW5jZSwgbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vVGhlbiwgcGljayB3b3JrZXIgZnJvbSBjbG9zZXN0IG5vZGUgdGhhdCBzYXRpc2Z5IGNvbnN0cmFpbnRzCisgICAgICAgIGZvcihNYXAuRW50cnk8RG91YmxlLCBSQVNfTm9kZT4gZW50cnkgOiBub2RlUmFua01hcC5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICBSQVNfTm9kZSBuID0gZW50cnkuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgIGZvcihXb3JrZXJTbG90IHdzIDogbi5nZXRGcmVlU2xvdHMoKSkgeworICAgICAgICAgICAgICAgIGlmKGNoZWNrV29ya2VyQ29uc3RyYWludHMoZXhlYywgd3MsIHRkLCBzY2hlZHVsZUFzc2lnbm1lbnRNYXApKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB3czsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0QmVzdENsdXN0ZXJpbmcoKSB7CisgICAgICAgIFN0cmluZyBiZXN0Q2x1c3RlciA9IG51bGw7CisgICAgICAgIERvdWJsZSBtb3N0UmVzID0gMC4wOworICAgICAgICBmb3IgKEVudHJ5PFN0cmluZywgTGlzdDxTdHJpbmc+PiBjbHVzdGVyIDogX2NsdXN0ZXJJbmZvCisgICAgICAgICAgICAgICAgLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIERvdWJsZSBjbHVzdGVyVG90YWxSZXMgPSB0aGlzLmdldFRvdGFsQ2x1c3RlclJlcyhjbHVzdGVyLmdldFZhbHVlKCkpOworICAgICAgICAgICAgaWYgKGNsdXN0ZXJUb3RhbFJlcyA+IG1vc3RSZXMpIHsKKyAgICAgICAgICAgICAgICBtb3N0UmVzID0gY2x1c3RlclRvdGFsUmVzOworICAgICAgICAgICAgICAgIGJlc3RDbHVzdGVyID0gY2x1c3Rlci5nZXRLZXkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYmVzdENsdXN0ZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBEb3VibGUgZ2V0VG90YWxDbHVzdGVyUmVzKExpc3Q8U3RyaW5nPiBjbHVzdGVyKSB7CisgICAgICAgIERvdWJsZSByZXMgPSAwLjA7CisgICAgICAgIGZvciAoU3RyaW5nIG5vZGUgOiBjbHVzdGVyKSB7CisgICAgICAgICAgICByZXMgKz0gX2F2YWlsTm9kZXMuZ2V0KHRoaXMuTm9kZUhvc3RuYW1lVG9JZChub2RlKSkKKyAgICAgICAgICAgICAgICAgICAgLmdldEF2YWlsYWJsZU1lbW9yeVJlc291cmNlcygpCisgICAgICAgICAgICAgICAgICAgICsgX2F2YWlsTm9kZXMuZ2V0KHRoaXMuTm9kZUhvc3RuYW1lVG9JZChub2RlKSkKKyAgICAgICAgICAgICAgICAgICAgLmdldEF2YWlsYWJsZUNwdVJlc291cmNlcygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgcHJpdmF0ZSBEb3VibGUgZGlzdFRvTm9kZShSQVNfTm9kZSBzcmMsIFJBU19Ob2RlIGRlc3QpIHsKKyAgICAgICAgaWYgKHNyYy5nZXRJZCgpLmVxdWFscyhkZXN0LmdldElkKCkpKSB7CisgICAgICAgICAgICByZXR1cm4gMC4wOworICAgICAgICB9IGVsc2UgaWYgKHRoaXMuTm9kZVRvQ2x1c3RlcihzcmMpLmVxdWFscyh0aGlzLk5vZGVUb0NsdXN0ZXIoZGVzdCkpKSB7CisgICAgICAgICAgICByZXR1cm4gMC41OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIDEuMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIE5vZGVUb0NsdXN0ZXIoUkFTX05vZGUgbm9kZSkgeworICAgICAgICBmb3IgKEVudHJ5PFN0cmluZywgTGlzdDxTdHJpbmc+PiBlbnRyeSA6IF9jbHVzdGVySW5mbworICAgICAgICAgICAgICAgIC5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICBpZiAoZW50cnkuZ2V0VmFsdWUoKS5jb250YWlucyhub2RlLmdldEhvc3RuYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5LmdldEtleSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIExPRy5lcnJvcigiTm9kZToge30gbm90IGZvdW5kIGluIGFueSBjbHVzdGVycyIsIG5vZGUuZ2V0SG9zdG5hbWUoKSk7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICAKKyAgICBwcml2YXRlIExpc3Q8UkFTX05vZGU+IGdldEF2YWlsYWJsZU5vZGVzKCkgeworICAgICAgICBMaW5rZWRMaXN0PFJBU19Ob2RlPiBub2RlcyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKyAgICAgICAgZm9yIChTdHJpbmcgY2x1c3RlcklkIDogX2NsdXN0ZXJJbmZvLmtleVNldCgpKSB7CisgICAgICAgICAgICBub2Rlcy5hZGRBbGwodGhpcy5nZXRBdmFpbGFibGVOb2Rlc0Zyb21DbHVzdGVyKGNsdXN0ZXJJZCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBub2RlczsKKyAgICB9CisKKyAgICBwcml2YXRlIExpc3Q8UkFTX05vZGU+IGdldEF2YWlsYWJsZU5vZGVzRnJvbUNsdXN0ZXIoU3RyaW5nIGNsdXMpIHsKKyAgICAgICAgTGlzdDxSQVNfTm9kZT4gcmV0TGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBmb3IgKFN0cmluZyBub2RlX2lkIDogX2NsdXN0ZXJJbmZvLmdldChjbHVzKSkgeworICAgICAgICAgICAgcmV0TGlzdC5hZGQoX2F2YWlsTm9kZXMuZ2V0KHRoaXMKKyAgICAgICAgICAgICAgICAgICAgLk5vZGVIb3N0bmFtZVRvSWQobm9kZV9pZCkpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0TGlzdDsKKyAgICB9CisKKyAgICBwcml2YXRlIExpc3Q8V29ya2VyU2xvdD4gZ2V0QXZhaWxhYmxlV29ya2Vyc0Zyb21DbHVzdGVyKFN0cmluZyBjbHVzdGVySWQpIHsKKyAgICAgICAgTGlzdDxSQVNfTm9kZT4gbm9kZXMgPSB0aGlzLmdldEF2YWlsYWJsZU5vZGVzRnJvbUNsdXN0ZXIoY2x1c3RlcklkKTsKKyAgICAgICAgTGlzdDxXb3JrZXJTbG90PiB3b3JrZXJzID0gbmV3IExpbmtlZExpc3Q8PigpOworICAgICAgICBmb3IoUkFTX05vZGUgbm9kZSA6IG5vZGVzKSB7CisgICAgICAgICAgICB3b3JrZXJzLmFkZEFsbChub2RlLmdldEZyZWVTbG90cygpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gd29ya2VyczsKKyAgICB9CisKKyAgICBwcml2YXRlIExpc3Q8V29ya2VyU2xvdD4gZ2V0QXZhaWxhYmxlV29ya2VyKCkgeworICAgICAgICBMaXN0PFdvcmtlclNsb3Q+IHdvcmtlcnMgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgICAgIGZvciAoU3RyaW5nIGNsdXN0ZXJJZCA6IF9jbHVzdGVySW5mby5rZXlTZXQoKSkgeworICAgICAgICAgICAgd29ya2Vycy5hZGRBbGwodGhpcy5nZXRBdmFpbGFibGVXb3JrZXJzRnJvbUNsdXN0ZXIoY2x1c3RlcklkKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHdvcmtlcnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW4gY2FzZSBpbiB0aGUgZnV0dXJlIFJBUyBjYW4gb25seSB1c2UgYSBzdWJzZXQgb2Ygbm9kZXMKKyAgICAgKi8KKyAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFJBU19Ob2RlPiBnZXRBdmFpbE5vZGVzKCkgeworICAgICAgICByZXR1cm4gX25vZGVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJyZWFkdGggZmlyc3QgdHJhdmVyc2FsIG9mIHRoZSB0b3BvbG9neSBEQUcKKyAgICAgKiBAcGFyYW0gdG9wb2xvZ2llcworICAgICAqIEBwYXJhbSB0ZAorICAgICAqIEBwYXJhbSBzcG91dHMKKyAgICAgKiBAcmV0dXJuIEEgcGFydGlhbCBvcmRlcmluZyBvZiBjb21wb25lbnRzCisgICAgICovCisgICAgcHJpdmF0ZSBRdWV1ZTxDb21wb25lbnQ+IGJmcyhUb3BvbG9naWVzIHRvcG9sb2dpZXMsIFRvcG9sb2d5RGV0YWlscyB0ZCwgTGlzdDxDb21wb25lbnQ+IHNwb3V0cykgeworICAgICAgICAvLyBTaW5jZSBxdWV1ZSBpcyBhIGludGVyZmFjZQorICAgICAgICBRdWV1ZTxDb21wb25lbnQ+IG9yZGVyZWRfX0NvbXBvbmVudF9saXN0ID0gbmV3IExpbmtlZExpc3Q8Q29tcG9uZW50PigpOworICAgICAgICBIYXNoTWFwPFN0cmluZywgQ29tcG9uZW50PiB2aXNpdGVkID0gbmV3IEhhc2hNYXA8PigpOworCisgICAgICAgIC8qIHN0YXJ0IGZyb20gZWFjaCBzcG91dCB0aGF0IGlzIG5vdCB2aXNpdGVkLCBlYWNoIGRvZXMgYSBicmVhZHRoLWZpcnN0IHRyYXZlcnNlICovCisgICAgICAgIGZvciAoQ29tcG9uZW50IHNwb3V0IDogc3BvdXRzKSB7CisgICAgICAgICAgICBpZiAoIXZpc2l0ZWQuY29udGFpbnNLZXkoc3BvdXQuaWQpKSB7CisgICAgICAgICAgICAgICAgUXVldWU8Q29tcG9uZW50PiBxdWV1ZSA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKyAgICAgICAgICAgICAgICBxdWV1ZS5vZmZlcihzcG91dCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKCFxdWV1ZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQ29tcG9uZW50IGNvbXAgPSBxdWV1ZS5wb2xsKCk7CisgICAgICAgICAgICAgICAgICAgIHZpc2l0ZWQucHV0KGNvbXAuaWQsIGNvbXApOworICAgICAgICAgICAgICAgICAgICBvcmRlcmVkX19Db21wb25lbnRfbGlzdC5hZGQoY29tcCk7CisgICAgICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBuZWlnaGJvcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgICAgICAgICAgICAgbmVpZ2hib3JzLmFkZEFsbChjb21wLmNoaWxkcmVuKTsKKyAgICAgICAgICAgICAgICAgICAgbmVpZ2hib3JzLmFkZEFsbChjb21wLnBhcmVudHMpOworICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBuYklEIDogbmVpZ2hib3JzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXZpc2l0ZWQuY29udGFpbnNLZXkobmJJRCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb25lbnQgY2hpbGQgPSB0b3BvbG9naWVzLmdldEFsbENvbXBvbmVudHMoKS5nZXQodGQuZ2V0SWQoKSkuZ2V0KG5iSUQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLm9mZmVyKGNoaWxkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gb3JkZXJlZF9fQ29tcG9uZW50X2xpc3Q7CisgICAgfQorCisgICAgcHJpdmF0ZSBMaXN0PENvbXBvbmVudD4gZ2V0U3BvdXRzKFRvcG9sb2dpZXMgdG9wb2xvZ2llcywgVG9wb2xvZ3lEZXRhaWxzIHRkKSB7CisgICAgICAgIExpc3Q8Q29tcG9uZW50PiBzcG91dHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgZm9yIChDb21wb25lbnQgYyA6IHRvcG9sb2dpZXMuZ2V0QWxsQ29tcG9uZW50cygpLmdldCh0ZC5nZXRJZCgpKQorICAgICAgICAgICAgICAgIC52YWx1ZXMoKSkgeworICAgICAgICAgICAgaWYgKGMudHlwZSA9PSBDb21wb25lbnQuQ29tcG9uZW50VHlwZS5TUE9VVCkgeworICAgICAgICAgICAgICAgIHNwb3V0cy5hZGQoYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNwb3V0czsKKyAgICB9CisKKyAgICBwcml2YXRlIEludGVnZXIgZ2V0TG9uZ2VzdFByaW9yaXR5TGlzdFNpemUoTWFwPEludGVnZXIsIExpc3Q8RXhlY3V0b3JEZXRhaWxzPj4gcHJpb3JpdHlUb0V4ZWN1dG9yTWFwKSB7CisgICAgICAgIEludGVnZXIgbW9zdE51bSA9IDA7CisgICAgICAgIGZvciAoTGlzdDxFeGVjdXRvckRldGFpbHM+IGV4ZWNzIDogcHJpb3JpdHlUb0V4ZWN1dG9yTWFwLnZhbHVlcygpKSB7CisgICAgICAgICAgICBJbnRlZ2VyIG51bUV4ZWNzID0gZXhlY3Muc2l6ZSgpOworICAgICAgICAgICAgaWYgKG1vc3ROdW0gPCBudW1FeGVjcykgeworICAgICAgICAgICAgICAgIG1vc3ROdW0gPSBudW1FeGVjczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbW9zdE51bTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHJlbWFpbmluZyBhbW91bnQgbWVtb3J5IHRoYXQgY2FuIGJlIGFzc2lnbmVkIHRvIGEgd29ya2VyIGdpdmVuIHRoZSBzZXQgd29ya2VyIG1heCBoZWFwIHNpemUKKyAgICAgKiBAcGFyYW0gd3MKKyAgICAgKiBAcGFyYW0gdGQKKyAgICAgKiBAcGFyYW0gc2NoZWR1bGVBc3NpZ25tZW50TWFwCisgICAgICogQHJldHVybiBUaGUgcmVtYWluaW5nIGFtb3VudCBvZiBtZW1vcnkKKyAgICAgKi8KKyAgICBwcml2YXRlIERvdWJsZSBnZXRXb3JrZXJTY2hlZHVsZWRNZW1vcnlBdmFpbGFibGUoV29ya2VyU2xvdCB3cywgVG9wb2xvZ3lEZXRhaWxzIHRkLCBNYXA8V29ya2VyU2xvdCwgQ29sbGVjdGlvbjxFeGVjdXRvckRldGFpbHM+PiBzY2hlZHVsZUFzc2lnbm1lbnRNYXApIHsKKyAgICAgICAgRG91YmxlIG1lbVNjaGVkdWxlVXNlZCA9IHRoaXMuZ2V0V29ya2VyU2NoZWR1bGVkTWVtb3J5VXNlKHdzLCB0ZCwgc2NoZWR1bGVBc3NpZ25tZW50TWFwKTsKKyAgICAgICAgcmV0dXJuIHRkLmdldFRvcG9sb2d5V29ya2VyTWF4SGVhcFNpemUoKSAtIG1lbVNjaGVkdWxlVXNlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGFtb3VudCBvZiBtZW1vcnkgYWxyZWFkeSBhc3NpZ25lZCB0byBhIHdvcmtlcgorICAgICAqIEBwYXJhbSB3cworICAgICAqIEBwYXJhbSB0ZAorICAgICAqIEBwYXJhbSBzY2hlZHVsZUFzc2lnbm1lbnRNYXAKKyAgICAgKiBAcmV0dXJuIHRoZSBhbW91bnQgb2YgbWVtb3J5CisgICAgICovCisgICAgcHJpdmF0ZSBEb3VibGUgZ2V0V29ya2VyU2NoZWR1bGVkTWVtb3J5VXNlKFdvcmtlclNsb3Qgd3MsIFRvcG9sb2d5RGV0YWlscyB0ZCwgTWFwPFdvcmtlclNsb3QsIENvbGxlY3Rpb248RXhlY3V0b3JEZXRhaWxzPj4gc2NoZWR1bGVBc3NpZ25tZW50TWFwKSB7CisgICAgICAgIERvdWJsZSB0b3RhbE1lbSA9IDAuMDsKKyAgICAgICAgQ29sbGVjdGlvbjxFeGVjdXRvckRldGFpbHM+IGV4ZWNzID0gc2NoZWR1bGVBc3NpZ25tZW50TWFwLmdldCh3cyk7CisgICAgICAgIGlmKGV4ZWNzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvcihFeGVjdXRvckRldGFpbHMgZXhlYyA6IGV4ZWNzKSB7CisgICAgICAgICAgICAgICAgdG90YWxNZW0gKz0gdGQuZ2V0VG90YWxNZW1SZXFUYXNrKGV4ZWMpOworICAgICAgICAgICAgfQorICAgICAgICB9IAorICAgICAgICByZXR1cm4gdG90YWxNZW07CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIHdoZXRoZXIgd2UgY2FuIHNjaGVkdWxlIGFuIEV4ZWN1dG9yIGV4ZWMgb24gdGhlIHdvcmtlciBzbG90IHdzCisgICAgICogT25seSBjb25zaWRlcnMgbWVtb3J5IGN1cnJlbnRseS4gIE1heSBpbmNsdWRlIENQVSBpbiB0aGUgZnV0dXJlCisgICAgICogQHBhcmFtIGV4ZWMKKyAgICAgKiBAcGFyYW0gd3MKKyAgICAgKiBAcGFyYW0gdGQKKyAgICAgKiBAcGFyYW0gc2NoZWR1bGVBc3NpZ25tZW50TWFwCisgICAgICogQHJldHVybiBhIGJvb2xlYW46IFRydWUgZGVub3RpbmcgdGhlIGV4ZWMgY2FuIGJlIHNjaGVkdWxlZCBvbiB3cyBhbmQgZmFsc2UgaWYgaXQgY2Fubm90CisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGNoZWNrV29ya2VyQ29uc3RyYWludHMoRXhlY3V0b3JEZXRhaWxzIGV4ZWMsIFdvcmtlclNsb3Qgd3MsIFRvcG9sb2d5RGV0YWlscyB0ZCwgTWFwPFdvcmtlclNsb3QsIENvbGxlY3Rpb248RXhlY3V0b3JEZXRhaWxzPj4gc2NoZWR1bGVBc3NpZ25tZW50TWFwKSB7CisgICAgICAgIGJvb2xlYW4gcmV0VmFsID0gZmFsc2U7CisgICAgICAgIGlmKHRoaXMuZ2V0V29ya2VyU2NoZWR1bGVkTWVtb3J5QXZhaWxhYmxlKHdzLCB0ZCwgc2NoZWR1bGVBc3NpZ25tZW50TWFwKSA+PSB0ZC5nZXRUb3RhbE1lbVJlcVRhc2soZXhlYykpIHsKKyAgICAgICAgICAgIHJldFZhbCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldFZhbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGFtb3VudCBvZiByZXNvdXJjZXMgYXZhaWxhYmxlIGFuZCB0b3RhbCBmb3IgZWFjaCBub2RlCisgICAgICogQHJldHVybiBhIFN0cmluZyB3aXRoIGNsdXN0ZXIgcmVzb3VyY2UgaW5mbyBmb3IgZGVidWcKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBnZXRDbHVzdGVySW5mbygpIHsKKyAgICAgICAgU3RyaW5nIHJldFZhbCA9ICJDbHVzdGVyIGluZm86XG4iOworICAgICAgICBmb3IoRW50cnk8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGNsdXN0ZXJFbnRyeSA6IF9jbHVzdGVySW5mby5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICBTdHJpbmcgY2x1c3RlcklkID0gY2x1c3RlckVudHJ5LmdldEtleSgpOworICAgICAgICAgICAgcmV0VmFsICs9ICJSYWNrOiAiICsgY2x1c3RlcklkICsgIlxuIjsKKyAgICAgICAgICAgIGZvcihTdHJpbmcgbm9kZUhvc3RuYW1lIDogY2x1c3RlckVudHJ5LmdldFZhbHVlKCkpIHsKKyAgICAgICAgICAgICAgICBSQVNfTm9kZSBub2RlID0gdGhpcy5pZFRvTm9kZSh0aGlzLk5vZGVIb3N0bmFtZVRvSWQobm9kZUhvc3RuYW1lKSk7CisgICAgICAgICAgICAgICAgcmV0VmFsICs9ICItPiBOb2RlOiAiICsgbm9kZS5nZXRIb3N0bmFtZSgpICsgIiAiICsgbm9kZS5nZXRJZCgpICsgIlxuIjsKKyAgICAgICAgICAgICAgICByZXRWYWwgKz0gIi0tPiBBdmFpbCBSZXNvdXJjZXM6IHtNZW0gIiArIG5vZGUuZ2V0QXZhaWxhYmxlTWVtb3J5UmVzb3VyY2VzKCkgKyAiLCBDUFUgIiArIG5vZGUuZ2V0QXZhaWxhYmxlQ3B1UmVzb3VyY2VzKCkgKyAifVxuIjsKKyAgICAgICAgICAgICAgICByZXRWYWwgKz0gIi0tPiBUb3RhbCBSZXNvdXJjZXM6IHtNZW0gIiArIG5vZGUuZ2V0VG90YWxNZW1vcnlSZXNvdXJjZXMoKSArICIsIENQVSAiICsgbm9kZS5nZXRUb3RhbENwdVJlc291cmNlcygpICsgIn1cbiI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldFZhbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBob3N0bmFtZSB0byBJZAorICAgICAqIEBwYXJhbSBob3N0bmFtZQorICAgICAqIEByZXR1cm4gdGhlIGlkIG9mIGEgbm9kZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgTm9kZUhvc3RuYW1lVG9JZChTdHJpbmcgaG9zdG5hbWUpIHsKKyAgICAgICAgZm9yIChSQVNfTm9kZSBuIDogX25vZGVzLnZhbHVlcygpKSB7CisgICAgICAgICAgICBpZiAobi5nZXRIb3N0bmFtZSgpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuLmdldEhvc3RuYW1lKCkuZXF1YWxzKGhvc3RuYW1lKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuLmdldElkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgTE9HLmVycm9yKCJDYW5ub3QgZmluZCBOb2RlIHdpdGggaG9zdG5hbWUge30iLCBob3N0bmFtZSk7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgUkFTX05vZGUgZm9yIHNwZWNpZmllZCBub2RlIGlkCisgICAgICogQHBhcmFtIGlkCisgICAgICogQHJldHVybiBhIFJBU19Ob2RlIG9iamVjdAorICAgICAqLworICAgIHB1YmxpYyBSQVNfTm9kZSBpZFRvTm9kZShTdHJpbmcgaWQpIHsKKyAgICAgICAgaWYoX25vZGVzLmNvbnRhaW5zS2V5KGlkKSA9PSBmYWxzZSkgeworICAgICAgICAgICAgTE9HLmVycm9yKCJDYW5ub3QgZmluZCBOb2RlIHdpdGggSWQ6IHt9IiwgaWQpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9ub2Rlcy5nZXQoaWQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zZWN1cml0eS9hdXRoL0F1dGhVdGlscy5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NlY3VyaXR5L2F1dGgvQXV0aFV0aWxzLmphdmEKaW5kZXggYWMzZmI1My4uNmY2OTY5ZSAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NlY3VyaXR5L2F1dGgvQXV0aFV0aWxzLmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NlY3VyaXR5L2F1dGgvQXV0aFV0aWxzLmphdmEKQEAgLTIxLDI2ICsyMSwzMCBAQAogaW1wb3J0IGphdmF4LnNlY3VyaXR5LmF1dGgubG9naW4uQ29uZmlndXJhdGlvbjsKIGltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLmxvZ2luLkFwcENvbmZpZ3VyYXRpb25FbnRyeTsKIGltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLlN1YmplY3Q7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5VUklQYXJhbWV0ZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5NZXNzYWdlRGlnZXN0OwogCiBpbXBvcnQgYmFja3R5cGUuc3Rvcm0uc2VjdXJpdHkuSU5pbWJ1c0NyZWRlbnRpYWxQbHVnaW47CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIGltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLm5ldC5VUkk7CiBpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuU29ydGVkTWFwOworaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOworaW1wb3J0IGphdmEubGFuZy5TdHJpbmdCdWlsZGVyOwogCiBwdWJsaWMgY2xhc3MgQXV0aFV0aWxzIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQXV0aFV0aWxzLmNsYXNzKTsKICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dJTl9DT05URVhUX1NFUlZFUiA9ICJTdG9ybVNlcnZlciI7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HSU5fQ09OVEVYVF9DTElFTlQgPSAiU3Rvcm1DbGllbnQiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPR0lOX0NPTlRFWFRfUEFDRU1BS0VSX0RJR0VTVCA9ICJQYWNlbWFrZXJEaWdlc3QiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPR0lOX0NPTlRFWFRfUEFDRU1BS0VSX1NFUlZFUiA9ICJQYWNlbWFrZXJTZXJ2ZXIiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPR0lOX0NPTlRFWFRfUEFDRU1BS0VSX0NMSUVOVCA9ICJQYWNlbWFrZXJDbGllbnQiOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0UgPSAic3Rvcm1fdGhyaWZ0X3NlcnZlciI7CiAKICAgICAvKioKQEAgLTcxLDEyICs3NSw0MSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFB1bGwgYSBzZXQgb2Yga2V5cyBvdXQgb2YgYSBDb25maWd1cmF0aW9uLgorICAgICAqIEBwYXJhbSBjb25mIFRoZSBjb25maWcgdG8gcHVsbCB0aGUga2V5L3ZhbHVlIHBhaXJzIG91dCBvZi4KKyAgICAgKiBAcGFyYW0gY29uZl9lbnRyeSBUaGUgYXBwIGNvbmZpZ3VyYXRpb24gZW50cnkgbmFtZSB0byBnZXQgc3R1ZmYgZnJvbS4KKyAgICAgKiBAcmV0dXJuIFJldHVybiBhIG1hcCBvZiB0aGUgY29uZmlncyBpbiBjb25mLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU29ydGVkTWFwPFN0cmluZywgPz4gUHVsbENvbmZpZyhDb25maWd1cmF0aW9uIGNvbmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb25mX2VudHJ5KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZihjb25mID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIEFwcENvbmZpZ3VyYXRpb25FbnRyeSBjb25maWd1cmF0aW9uRW50cmllc1tdID0gY29uZi5nZXRBcHBDb25maWd1cmF0aW9uRW50cnkoY29uZl9lbnRyeSk7CisgICAgICAgIGlmKGNvbmZpZ3VyYXRpb25FbnRyaWVzID09IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyBlcnJvck1lc3NhZ2UgPSAiQ291bGQgbm90IGZpbmQgYSAnIiArIGNvbmZfZW50cnkKKyAgICAgICAgICAgICAgICArICInIGVudHJ5IGluIHRoaXMgY29uZmlndXJhdGlvbjogQ2xpZW50IGNhbm5vdCBzdGFydC4iOworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKGVycm9yTWVzc2FnZSk7CisgICAgICAgIH0KKworICAgICAgICBUcmVlTWFwPFN0cmluZywgT2JqZWN0PiByZXN1bHRzID0gbmV3IFRyZWVNYXA8PigpOworCisgICAgICAgIGZvcihBcHBDb25maWd1cmF0aW9uRW50cnkgZW50cnk6IGNvbmZpZ3VyYXRpb25FbnRyaWVzKSB7CisgICAgICAgICAgICBNYXA8U3RyaW5nLCA/PiBvcHRpb25zID0gZW50cnkuZ2V0T3B0aW9ucygpOworICAgICAgICAgICAgZm9yKFN0cmluZyBrZXkgOiBvcHRpb25zLmtleVNldCgpKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXQoa2V5LCBvcHRpb25zLmdldChrZXkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0czsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBDb25zdHJ1Y3QgYSBwcmluY2lwYWwgdG8gbG9jYWwgcGx1Z2luCi0gICAgICogQHBhcmFtIGNvbmYgc3Rvcm0gY29uZmlndXJhdGlvbgorICAgICAqIEBwYXJhbSBzdG9ybV9jb25mIHN0b3JtIGNvbmZpZ3VyYXRpb24KICAgICAgKiBAcmV0dXJuIHRoZSBwbHVnaW4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIElQcmluY2lwYWxUb0xvY2FsIEdldFByaW5jaXBhbFRvTG9jYWxQbHVnaW4oTWFwIHN0b3JtX2NvbmYpIHsKLSAgICAgICAgSVByaW5jaXBhbFRvTG9jYWwgcHRvbCA9IG51bGw7CisgICAgICAgIElQcmluY2lwYWxUb0xvY2FsIHB0b2w7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgU3RyaW5nIHB0b2xfa2xhc3NOYW1lID0gKFN0cmluZykgc3Rvcm1fY29uZi5nZXQoQ29uZmlnLlNUT1JNX1BSSU5DSVBBTF9UT19MT0NBTF9QTFVHSU4pOwogICAgICAgICAgIENsYXNzIGtsYXNzID0gQ2xhc3MuZm9yTmFtZShwdG9sX2tsYXNzTmFtZSk7CkBAIC05MCwxMSArMTIzLDExIEBACiAKICAgICAvKioKICAgICAgKiBDb25zdHJ1Y3QgYSBncm91cCBtYXBwaW5nIHNlcnZpY2UgcHJvdmlkZXIgcGx1Z2luCi0gICAgICogQHBhcmFtIGNvbmYgc3Rvcm0gY29uZmlndXJhdGlvbgorICAgICAqIEBwYXJhbSBzdG9ybV9jb25mIHN0b3JtIGNvbmZpZ3VyYXRpb24KICAgICAgKiBAcmV0dXJuIHRoZSBwbHVnaW4KICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIElHcm91cE1hcHBpbmdTZXJ2aWNlUHJvdmlkZXIgR2V0R3JvdXBNYXBwaW5nU2VydmljZVByb3ZpZGVyUGx1Z2luKE1hcCBzdG9ybV9jb25mKSB7Ci0gICAgICAgIElHcm91cE1hcHBpbmdTZXJ2aWNlUHJvdmlkZXIgZ21zcCA9IG51bGw7CisgICAgICAgIElHcm91cE1hcHBpbmdTZXJ2aWNlUHJvdmlkZXIgZ21zcDsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIFN0cmluZyBnbXNwX2tsYXNzTmFtZSA9IChTdHJpbmcpIHN0b3JtX2NvbmYuZ2V0KENvbmZpZy5TVE9STV9HUk9VUF9NQVBQSU5HX1NFUlZJQ0VfUFJPVklERVJfUExVR0lOKTsKICAgICAgICAgICAgIENsYXNzIGtsYXNzID0gQ2xhc3MuZm9yTmFtZShnbXNwX2tsYXNzTmFtZSk7CkBAIC0xMDcsMTMgKzE0MCwxMyBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIEdldCBhbGwgb2YgdGhlIGNvbmZpZ3VyZWQgQ3JlZGVudGlhbCBSZW53ZXIgUGx1Z2lucy4KLSAgICAgKiBAcGFyYW0gc3Rvcm1fY29uZiB0aGUgc3Rvcm0gY29uZmlndXJhdGlvbiB0byB1c2UuCisgICAgICogR2V0IGFsbCBvZiB0aGUgY29uZmlndXJlZCBDcmVkZW50aWFsIFJlbmV3ZXIgUGx1Z2lucy4KKyAgICAgKiBAcGFyYW0gY29uZiB0aGUgc3Rvcm0gY29uZmlndXJhdGlvbiB0byB1c2UuCiAgICAgICogQHJldHVybiB0aGUgY29uZmlndXJlZCBjcmVkZW50aWFsIHJlbmV3ZXJzLgogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxJQ3JlZGVudGlhbHNSZW5ld2VyPiBHZXRDcmVkZW50aWFsUmVuZXdlcnMoTWFwIGNvbmYpIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNldDxJQ3JlZGVudGlhbHNSZW5ld2VyPiByZXQgPSBuZXcgSGFzaFNldDxJQ3JlZGVudGlhbHNSZW5ld2VyPigpOworICAgICAgICAgICAgU2V0PElDcmVkZW50aWFsc1JlbmV3ZXI+IHJldCA9IG5ldyBIYXNoU2V0PD4oKTsKICAgICAgICAgICAgIENvbGxlY3Rpb248U3RyaW5nPiBjbGF6emVzID0gKENvbGxlY3Rpb248U3RyaW5nPiljb25mLmdldChDb25maWcuTklNQlVTX0NSRURFTlRJQUxfUkVORVdFUlMpOwogICAgICAgICAgICAgaWYgKGNsYXp6ZXMgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGNsYXp6IDogY2xhenplcykgewpAQCAtMTM1LDcgKzE2OCw3IEBACiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPElOaW1idXNDcmVkZW50aWFsUGx1Z2luPiBnZXROaW1idXNBdXRvQ3JlZFBsdWdpbnMoTWFwIGNvbmYpIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNldDxJTmltYnVzQ3JlZGVudGlhbFBsdWdpbj4gcmV0ID0gbmV3IEhhc2hTZXQ8SU5pbWJ1c0NyZWRlbnRpYWxQbHVnaW4+KCk7CisgICAgICAgICAgICBTZXQ8SU5pbWJ1c0NyZWRlbnRpYWxQbHVnaW4+IHJldCA9IG5ldyBIYXNoU2V0PD4oKTsKICAgICAgICAgICAgIENvbGxlY3Rpb248U3RyaW5nPiBjbGF6emVzID0gKENvbGxlY3Rpb248U3RyaW5nPiljb25mLmdldChDb25maWcuTklNQlVTX0FVVE9fQ1JFRF9QTFVHSU5TKTsKICAgICAgICAgICAgIGlmIChjbGF6emVzICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBjbGF6eiA6IGNsYXp6ZXMpIHsKQEAgLTE1Nyw3ICsxOTAsNyBAQAogICAgICAqLwogICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxJQXV0b0NyZWRlbnRpYWxzPiBHZXRBdXRvQ3JlZGVudGlhbHMoTWFwIHN0b3JtX2NvbmYpIHsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIFNldDxJQXV0b0NyZWRlbnRpYWxzPiBhdXRvcyA9IG5ldyBIYXNoU2V0PElBdXRvQ3JlZGVudGlhbHM+KCk7CisgICAgICAgICAgICBTZXQ8SUF1dG9DcmVkZW50aWFscz4gYXV0b3MgPSBuZXcgSGFzaFNldDw+KCk7CiAgICAgICAgICAgICBDb2xsZWN0aW9uPFN0cmluZz4gY2xhenplcyA9IChDb2xsZWN0aW9uPFN0cmluZz4pc3Rvcm1fY29uZi5nZXQoQ29uZmlnLlRPUE9MT0dZX0FVVE9fQ1JFREVOVElBTFMpOwogICAgICAgICAgICAgaWYgKGNsYXp6ZXMgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGNsYXp6IDogY2xhenplcykgewpAQCAtMjE2LDExICsyNDksOSBAQAogCiAgICAgLyoqCiAgICAgICogQ29uc3RydWN0IGEgdHJhbnNwb3J0IHBsdWdpbiBwZXIgc3Rvcm0gY29uZmlndXJhdGlvbgotICAgICAqIEBwYXJhbSBjb25mIHN0b3JtIGNvbmZpZ3VyYXRpb24KLSAgICAgKiBAcmV0dXJuCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBJVHJhbnNwb3J0UGx1Z2luIEdldFRyYW5zcG9ydFBsdWdpbihUaHJpZnRDb25uZWN0aW9uVHlwZSB0eXBlLCBNYXAgc3Rvcm1fY29uZiwgQ29uZmlndXJhdGlvbiBsb2dpbl9jb25mKSB7Ci0gICAgICAgIElUcmFuc3BvcnRQbHVnaW4gIHRyYW5zcG9ydFBsdWdpbiA9IG51bGw7CisgICAgICAgIElUcmFuc3BvcnRQbHVnaW4gIHRyYW5zcG9ydFBsdWdpbjsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIFN0cmluZyB0cmFuc3BvcnRfcGx1Z2luX2tsYXNzTmFtZSA9IHR5cGUuZ2V0VHJhbnNwb3J0UGx1Z2luKHN0b3JtX2NvbmYpOwogICAgICAgICAgICAgQ2xhc3Mga2xhc3MgPSBDbGFzcy5mb3JOYW1lKHRyYW5zcG9ydF9wbHVnaW5fa2xhc3NOYW1lKTsKQEAgLTIzNCw3ICsyNjUsNyBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgSUh0dHBDcmVkZW50aWFsc1BsdWdpbiBHZXRIdHRwQ3JlZGVudGlhbHNQbHVnaW4oTWFwIGNvbmYsCiAgICAgICAgICAgICBTdHJpbmcga2xhc3NOYW1lKSB7Ci0gICAgICAgIElIdHRwQ3JlZGVudGlhbHNQbHVnaW4gcGx1Z2luID0gbnVsbDsKKyAgICAgICAgSUh0dHBDcmVkZW50aWFsc1BsdWdpbiBwbHVnaW47CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBDbGFzcyBrbGFzcyA9IENsYXNzLmZvck5hbWUoa2xhc3NOYW1lKTsKICAgICAgICAgICAgIHBsdWdpbiA9IChJSHR0cENyZWRlbnRpYWxzUGx1Z2luKWtsYXNzLm5ld0luc3RhbmNlKCk7CkBAIC0yODEsNCArMzEyLDM3IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRVJOQU1FID0gInVzZXJuYW1lIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFTU1dPUkQgPSAicGFzc3dvcmQiOworCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbWFrZURpZ2VzdFBheWxvYWQoQ29uZmlndXJhdGlvbiBsb2dpbl9jb25maWcsIFN0cmluZyBjb25maWdfc2VjdGlvbikgeworICAgICAgICBTdHJpbmcgdXNlcm5hbWUgPSBudWxsOworICAgICAgICBTdHJpbmcgcGFzc3dvcmQgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgTWFwPFN0cmluZywgPz4gcmVzdWx0cyA9IEF1dGhVdGlscy5QdWxsQ29uZmlnKGxvZ2luX2NvbmZpZywgY29uZmlnX3NlY3Rpb24pOworICAgICAgICAgICAgdXNlcm5hbWUgPSAoU3RyaW5nKXJlc3VsdHMuZ2V0KFVTRVJOQU1FKTsKKyAgICAgICAgICAgIHBhc3N3b3JkID0gKFN0cmluZylyZXN1bHRzLmdldChQQVNTV09SRCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0cuZXJyb3IoIkZhaWxlZCB0byBwdWxsIHVzZXJuYW1lL3Bhc3N3b3JkIG91dCBvZiBqYWFzIGNvbmYiLCBlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKHVzZXJuYW1lID09IG51bGwgfHwgcGFzc3dvcmQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgTWVzc2FnZURpZ2VzdCBkaWdlc3QgPSBNZXNzYWdlRGlnZXN0LmdldEluc3RhbmNlKCJTSEEtNTEyIik7CisgICAgICAgICAgICBieXRlW10gb3V0cHV0ID0gZGlnZXN0LmRpZ2VzdCgodXNlcm5hbWUgKyAiOiIgKyBwYXNzd29yZCkuZ2V0Qnl0ZXMoKSk7CisKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBmb3IoYnl0ZSBiIDogb3V0cHV0KSB7CisgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiJTAyeCIsIGIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7CisgICAgICAgIH0gY2F0Y2ggKGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExPRy5lcnJvcigiQ2FudCBydW4gU0hBLTUxMiBkaWdlc3QuIEFsZ29yaXRobSBub3QgYXZhaWxhYmxlLiIsIGUpOworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CiB9CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2VjdXJpdHkvYXV0aC9EZWZhdWx0SHR0cENyZWRlbnRpYWxzUGx1Z2luLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2VjdXJpdHkvYXV0aC9EZWZhdWx0SHR0cENyZWRlbnRpYWxzUGx1Z2luLmphdmEKaW5kZXggZTI0NjllNS4uOWM4MWNkZiAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NlY3VyaXR5L2F1dGgvRGVmYXVsdEh0dHBDcmVkZW50aWFsc1BsdWdpbi5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zZWN1cml0eS9hdXRoL0RlZmF1bHRIdHRwQ3JlZGVudGlhbHNQbHVnaW4uamF2YQpAQCAtMjgsOCArMjgsNiBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKLWltcG9ydCBiYWNrdHlwZS5zdG9ybS5zZWN1cml0eS5hdXRoLlJlcUNvbnRleHQ7Ci0KIHB1YmxpYyBjbGFzcyBEZWZhdWx0SHR0cENyZWRlbnRpYWxzUGx1Z2luIGltcGxlbWVudHMgSUh0dHBDcmVkZW50aWFsc1BsdWdpbiB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9CiAgICAgICAgICAgICBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihEZWZhdWx0SHR0cENyZWRlbnRpYWxzUGx1Z2luLmNsYXNzKTsKQEAgLTUwLDcgKzQ4LDcgQEAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgU3RyaW5nIGdldFVzZXJOYW1lKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXEpIHsKLSAgICAgICAgUHJpbmNpcGFsIHByaW5jID0gbnVsbDsKKyAgICAgICAgUHJpbmNpcGFsIHByaW5jOwogICAgICAgICBpZiAocmVxICE9IG51bGwgJiYgKHByaW5jID0gcmVxLmdldFVzZXJQcmluY2lwYWwoKSkgIT0gbnVsbCkgewogICAgICAgICAgICAgU3RyaW5nIHVzZXJOYW1lID0gcHJpbmMuZ2V0TmFtZSgpOwogICAgICAgICAgICAgaWYgKHVzZXJOYW1lICE9IG51bGwgJiYgIXVzZXJOYW1lLmlzRW1wdHkoKSkgewpAQCAtODMsNyArODEsNyBAQAogICAgICAgICAgICAgdXNlck5hbWUgPSBkb0FzVXNlcjsKICAgICAgICAgfQogCi0gICAgICAgIFNldDxQcmluY2lwYWw+IHByaW5jaXBhbHMgPSBuZXcgSGFzaFNldDxQcmluY2lwYWw+KCk7CisgICAgICAgIFNldDxQcmluY2lwYWw+IHByaW5jaXBhbHMgPSBuZXcgSGFzaFNldDw+KCk7CiAgICAgICAgIGlmKHVzZXJOYW1lICE9IG51bGwpIHsKICAgICAgICAgICAgIFByaW5jaXBhbCBwID0gbmV3IFNpbmdsZVVzZXJQcmluY2lwYWwodXNlck5hbWUpOwogICAgICAgICAgICAgcHJpbmNpcGFscy5hZGQocCk7CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2VjdXJpdHkvYXV0aC9EZWZhdWx0UHJpbmNpcGFsVG9Mb2NhbC5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NlY3VyaXR5L2F1dGgvRGVmYXVsdFByaW5jaXBhbFRvTG9jYWwuamF2YQppbmRleCA3MjlkNzQ0Li45Zjk1MTAxIDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2VjdXJpdHkvYXV0aC9EZWZhdWx0UHJpbmNpcGFsVG9Mb2NhbC5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zZWN1cml0eS9hdXRoL0RlZmF1bHRQcmluY2lwYWxUb0xvY2FsLmphdmEKQEAgLTI4LDcgKzI4LDYgQEAKIHB1YmxpYyBjbGFzcyBEZWZhdWx0UHJpbmNpcGFsVG9Mb2NhbCBpbXBsZW1lbnRzIElQcmluY2lwYWxUb0xvY2FsIHsKICAgICAvKioKICAgICAgKiBJbnZva2VkIG9uY2UgaW1tZWRpYXRlbHkgYWZ0ZXIgY29uc3RydWN0aW9uCi0gICAgICogQHBhcmFtIGNvbmYgU3Rvcm0gY29uZmlndXJhdGlvbiAKICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBwcmVwYXJlKE1hcCBzdG9ybV9jb25mKSB7fQogICAgIApkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NlY3VyaXR5L2F1dGgvSUF1dGhvcml6ZXIuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zZWN1cml0eS9hdXRoL0lBdXRob3JpemVyLmphdmEKaW5kZXggZDU5MmJiNy4uZmYxZTJiYSAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NlY3VyaXR5L2F1dGgvSUF1dGhvcml6ZXIuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2VjdXJpdHkvYXV0aC9JQXV0aG9yaXplci5qYXZhCkBAIC0zMiw3ICszMiw3IEBACiBwdWJsaWMgaW50ZXJmYWNlIElBdXRob3JpemVyIHsKICAgICAvKioKICAgICAgKiBJbnZva2VkIG9uY2UgaW1tZWRpYXRlbHkgYWZ0ZXIgY29uc3RydWN0aW9uCi0gICAgICogQHBhcmFtIGNvbmYgU3Rvcm0gY29uZmlndXJhdGlvbiAKKyAgICAgKiBAcGFyYW0gc3Rvcm1fY29uZiBTdG9ybSBjb25maWd1cmF0aW9uCiAgICAgICovCiAgICAgdm9pZCBwcmVwYXJlKE1hcCBzdG9ybV9jb25mKTsKICAgICAKQEAgLTQwLDcgKzQwLDcgQEAKICAgICAgKiBwZXJtaXQoKSBtZXRob2QgaXMgaW52b2tlZCBmb3IgZWFjaCBpbmNvbWluZyBUaHJpZnQgcmVxdWVzdC4KICAgICAgKiBAcGFyYW0gY29udGV4dCByZXF1ZXN0IGNvbnRleHQgaW5jbHVkZXMgaW5mbyBhYm91dCAKICAgICAgKiBAcGFyYW0gb3BlcmF0aW9uIG9wZXJhdGlvbiBuYW1lCi0gICAgICogQHBhcmFtIHRvcG9sb2d5X3N0b3JtIGNvbmZpZ3VyYXRpb24gb2YgdGFyZ2V0ZWQgdG9wb2xvZ3kgCisgICAgICogQHBhcmFtIHRvcG9sb2d5X2NvbmYgY29uZmlndXJhdGlvbiBvZiB0YXJnZXRlZCB0b3BvbG9neQogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVxdWVzdCBpcyBhdXRob3JpemVkLCBmYWxzZSBpZiByZWplY3QKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBwZXJtaXQoUmVxQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgb3BlcmF0aW9uLCBNYXAgdG9wb2xvZ3lfY29uZik7CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2VjdXJpdHkvYXV0aC9JQ3JlZGVudGlhbHNSZW5ld2VyLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2VjdXJpdHkvYXV0aC9JQ3JlZGVudGlhbHNSZW5ld2VyLmphdmEKaW5kZXggM2VhZjZjNC4uOWE2ZjAyZSAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NlY3VyaXR5L2F1dGgvSUNyZWRlbnRpYWxzUmVuZXdlci5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zZWN1cml0eS9hdXRoL0lDcmVkZW50aWFsc1JlbmV3ZXIuamF2YQpAQCAtMTgsMTEgKzE4LDEwIEBACiAKIHBhY2thZ2UgYmFja3R5cGUuc3Rvcm0uc2VjdXJpdHkuYXV0aDsKIAotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIC8qKgotICogUHJvdmlkZXMgYSB3YXkgdG8gcmVuZXcgY3JlZGVudGlhbHMgb24gYmVoZWxmIG9mIGEgdXNlci4KKyAqIFByb3ZpZGVzIGEgd2F5IHRvIHJlbmV3IGNyZWRlbnRpYWxzIG9uIGJlaGFsZiBvZiBhIHVzZXIuCiAgKi8KIHB1YmxpYyBpbnRlcmZhY2UgSUNyZWRlbnRpYWxzUmVuZXdlciB7CiAKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zZWN1cml0eS9hdXRoL0lIdHRwQ3JlZGVudGlhbHNQbHVnaW4uamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zZWN1cml0eS9hdXRoL0lIdHRwQ3JlZGVudGlhbHNQbHVnaW4uamF2YQppbmRleCBhMDEyY2U0Li4wYjU3ZWNhIDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2VjdXJpdHkvYXV0aC9JSHR0cENyZWRlbnRpYWxzUGx1Z2luLmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NlY3VyaXR5L2F1dGgvSUh0dHBDcmVkZW50aWFsc1BsdWdpbi5qYXZhCkBAIC0yMSw4ICsyMSw2IEBACiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OwogCi1pbXBvcnQgYmFja3R5cGUuc3Rvcm0uc2VjdXJpdHkuYXV0aC5SZXFDb250ZXh0OwotCiAvKioKICAqIEludGVyZmFjZSBmb3IgaGFuZGxpbmcgY3JlZGVudGlhbHMgaW4gYW4gSHR0cFNlcnZsZXRSZXF1ZXN0CiAgKi8KZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zZWN1cml0eS9hdXRoL0lQcmluY2lwYWxUb0xvY2FsLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2VjdXJpdHkvYXV0aC9JUHJpbmNpcGFsVG9Mb2NhbC5qYXZhCmluZGV4IGZjYTNkMzcuLmU5MzhkMzkgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zZWN1cml0eS9hdXRoL0lQcmluY2lwYWxUb0xvY2FsLmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NlY3VyaXR5L2F1dGgvSVByaW5jaXBhbFRvTG9jYWwuamF2YQpAQCAtMjgsNyArMjgsNyBAQAogcHVibGljIGludGVyZmFjZSBJUHJpbmNpcGFsVG9Mb2NhbCB7CiAgICAgLyoqCiAgICAgICogSW52b2tlZCBvbmNlIGltbWVkaWF0ZWx5IGFmdGVyIGNvbnN0cnVjdGlvbgotICAgICAqIEBwYXJhbSBjb25mIFN0b3JtIGNvbmZpZ3VyYXRpb24gCisgICAgICogQHBhcmFtIHN0b3JtX2NvbmYgU3Rvcm0gY29uZmlndXJhdGlvbgogICAgICAqLwogICAgIHZvaWQgcHJlcGFyZShNYXAgc3Rvcm1fY29uZik7CiAgICAgCmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2VjdXJpdHkvYXV0aC9JVHJhbnNwb3J0UGx1Z2luLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2VjdXJpdHkvYXV0aC9JVHJhbnNwb3J0UGx1Z2luLmphdmEKaW5kZXggNWJhMjU1Ny4uYmEwOWZhZCAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NlY3VyaXR5L2F1dGgvSVRyYW5zcG9ydFBsdWdpbi5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zZWN1cml0eS9hdXRoL0lUcmFuc3BvcnRQbHVnaW4uamF2YQpAQCAtMTgsOSArMTgsNyBAQAogcGFja2FnZSBiYWNrdHlwZS5zdG9ybS5zZWN1cml0eS5hdXRoOwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKIAogaW1wb3J0IGphdmF4LnNlY3VyaXR5LmF1dGgubG9naW4uQ29uZmlndXJhdGlvbjsKIApAQCAtMjksOCArMjcsNiBAQAogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0OwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uOwogCi1pbXBvcnQgYmFja3R5cGUuc3Rvcm0uc2VjdXJpdHkuYXV0aC5UaHJpZnRDb25uZWN0aW9uVHlwZTsKLQogLyoqCiAgKiBJbnRlcmZhY2UgZm9yIFRocmlmdCBUcmFuc3BvcnQgcGx1Z2luCiAgKi8KZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zZWN1cml0eS9hdXRoL0tlcmJlcm9zUHJpbmNpcGFsVG9Mb2NhbC5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NlY3VyaXR5L2F1dGgvS2VyYmVyb3NQcmluY2lwYWxUb0xvY2FsLmphdmEKaW5kZXggMzVjNzc4OC4uMWY2N2MxNCAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NlY3VyaXR5L2F1dGgvS2VyYmVyb3NQcmluY2lwYWxUb0xvY2FsLmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NlY3VyaXR5L2F1dGgvS2VyYmVyb3NQcmluY2lwYWxUb0xvY2FsLmphdmEKQEAgLTI4LDcgKzI4LDcgQEAKIAogICAgIC8qKgogICAgICAqIEludm9rZWQgb25jZSBpbW1lZGlhdGVseSBhZnRlciBjb25zdHJ1Y3Rpb24KLSAgICAgKiBAcGFyYW0gY29uZiBTdG9ybSBjb25maWd1cmF0aW9uIAorICAgICAqIEBwYXJhbSBzdG9ybV9jb25mIFN0b3JtIGNvbmZpZ3VyYXRpb24KICAgICAgKi8KICAgICBwdWJsaWMgdm9pZCBwcmVwYXJlKE1hcCBzdG9ybV9jb25mKSB7fQogICAgIApkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NlY3VyaXR5L2F1dGgvUmVxQ29udGV4dC5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NlY3VyaXR5L2F1dGgvUmVxQ29udGV4dC5qYXZhCmluZGV4IGEyNTJmODUuLjMxYWVlZjkgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zZWN1cml0eS9hdXRoL1JlcUNvbnRleHQuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2VjdXJpdHkvYXV0aC9SZXFDb250ZXh0LmphdmEKQEAgLTIyLDggKzIyLDYgQEAKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKIGltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKIGltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCiBpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sQ29udGV4dDsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CkBAIC00NCwxNyArNDIsMjAgQEAKICAgICBwcml2YXRlIE1hcCBfc3Rvcm1fY29uZjsKICAgICBwcml2YXRlIFByaW5jaXBhbCByZWFsUHJpbmNpcGFsOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFJlcUNvbnRleHQuY2xhc3MpOwotCi0KICAgICAvKioKLSAgICAgKiBHZXQgYSByZXF1ZXN0IGNvbnRleHQgYXNzb2NpYXRlZCB3aXRoIGN1cnJlbnQgdGhyZWFkCi0gICAgICogQHJldHVybgorICAgICAqIEByZXR1cm4gYSByZXF1ZXN0IGNvbnRleHQgYXNzb2NpYXRlZCB3aXRoIGN1cnJlbnQgdGhyZWFkCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBSZXFDb250ZXh0IGNvbnRleHQoKSB7CiAgICAgICAgIHJldHVybiBjdHh0LmdldCgpOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFJlc2V0IHRoZSBjb250ZXh0IGJhY2sgdG8gYSBkZWZhdWx0LiAgdXNlZCBmb3IgdGVzdGluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVzZXQoKSB7CisgICAgICAgIGN0eHQucmVtb3ZlKCk7CisgICAgfQorCiAgICAgLy9lYWNoIHRocmVhZCB3aWxsIGhhdmUgaXRzIG93biByZXF1ZXN0IGNvbnRleHQKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUaHJlYWRMb2NhbCA8IFJlcUNvbnRleHQgPiBjdHh0ID0gCiAgICAgICAgICAgICBuZXcgVGhyZWFkTG9jYWwgPCBSZXFDb250ZXh0ID4gKCkgewpAQCAtMTI1LDggKzEyNiw3IEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgcmVxdWVzdCBpcyBhbiBpbXBlcnNvbmF0aW9uIHJlcXVlc3QuCi0gICAgICogQHJldHVybgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIHJlcXVlc3QgaXMgYW4gaW1wZXJzb25hdGlvbiByZXF1ZXN0LgogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIGlzSW1wZXJzb25hdGluZygpIHsKICAgICAgICAgcmV0dXJuIHRoaXMucmVhbFByaW5jaXBhbCAhPSBudWxsOwpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NlY3VyaXR5L2F1dGgvU2FzbFRyYW5zcG9ydFBsdWdpbi5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NlY3VyaXR5L2F1dGgvU2FzbFRyYW5zcG9ydFBsdWdpbi5qYXZhCmluZGV4IDcwMTNjZDQuLjkyMDA0ZmEgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zZWN1cml0eS9hdXRoL1Nhc2xUcmFuc3BvcnRQbHVnaW4uamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2VjdXJpdHkvYXV0aC9TYXNsVHJhbnNwb3J0UGx1Z2luLmphdmEKQEAgLTQ1LDEwICs0NSw2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnRGYWN0b3J5OwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7Ci1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7Ci0KLWltcG9ydCBiYWNrdHlwZS5zdG9ybS5zZWN1cml0eS5hdXRoLlRocmlmdENvbm5lY3Rpb25UeXBlOwogCiAvKioKICAqIEJhc2UgY2xhc3MgZm9yIFNBU0wgYXV0aGVudGljYXRpb24gcGx1Z2luLgpAQCAtNTcsNyArNTMsNiBAQAogICAgIHByb3RlY3RlZCBUaHJpZnRDb25uZWN0aW9uVHlwZSB0eXBlOwogICAgIHByb3RlY3RlZCBNYXAgc3Rvcm1fY29uZjsKICAgICBwcm90ZWN0ZWQgQ29uZmlndXJhdGlvbiBsb2dpbl9jb25mOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihTYXNsVHJhbnNwb3J0UGx1Z2luLmNsYXNzKTsKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHByZXBhcmUoVGhyaWZ0Q29ubmVjdGlvblR5cGUgdHlwZSwgTWFwIHN0b3JtX2NvbmYsIENvbmZpZ3VyYXRpb24gbG9naW5fY29uZikgewpAQCAtOTUsNyArOTAsNyBAQAogCiAgICAgLyoqCiAgICAgICogQWxsIHN1YmNsYXNzIG11c3QgaW1wbGVtZW50IHRoaXMgbWV0aG9kCi0gICAgICogQHJldHVybgorICAgICAqIEByZXR1cm4gc2VydmVyIHRyYW5zcG9ydCBmYWN0b3J5CiAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgogICAgICAqLwogICAgIHByb3RlY3RlZCBhYnN0cmFjdCBUVHJhbnNwb3J0RmFjdG9yeSBnZXRTZXJ2ZXJUcmFuc3BvcnRGYWN0b3J5KCkgdGhyb3dzIElPRXhjZXB0aW9uOwpAQCAtMTYyLDExICsxNTcsOCBAQAogICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKICAgICAgICAgICAgIGlmICh0aGlzID09IG8pIHsKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobyA9PSBudWxsIHx8IGdldENsYXNzKCkgIT0gby5nZXRDbGFzcygpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKG5hbWUuZXF1YWxzKCgoVXNlcikgbykubmFtZSkpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuICEobyA9PSBudWxsIHx8IGdldENsYXNzKCkgIT0gby5nZXRDbGFzcygpKSAmJiAobmFtZS5lcXVhbHMoKChVc2VyKSBvKS5uYW1lKSk7CiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zZWN1cml0eS9hdXRoL1NoZWxsQmFzZWRHcm91cHNNYXBwaW5nLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2VjdXJpdHkvYXV0aC9TaGVsbEJhc2VkR3JvdXBzTWFwcGluZy5qYXZhCmluZGV4IGQ4M2NmMWMuLjVmNTNjMTcgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zZWN1cml0eS9hdXRoL1NoZWxsQmFzZWRHcm91cHNNYXBwaW5nLmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NlY3VyaXR5L2F1dGgvU2hlbGxCYXNlZEdyb3Vwc01hcHBpbmcuamF2YQpAQCAtMzUsNyArMzUsNyBAQAogcHVibGljIGNsYXNzIFNoZWxsQmFzZWRHcm91cHNNYXBwaW5nIGltcGxlbWVudHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElHcm91cE1hcHBpbmdTZXJ2aWNlUHJvdmlkZXIgewogCi0gICAgcHVibGljIHN0YXRpYyBMb2dnZXIgTE9HID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoU2hlbGxCYXNlZEdyb3Vwc01hcHBpbmcuY2xhc3MpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFNoZWxsQmFzZWRHcm91cHNNYXBwaW5nLmNsYXNzKTsKICAgICBwdWJsaWMgVGltZUNhY2hlTWFwPFN0cmluZywgU2V0PFN0cmluZz4+IGNhY2hlZEdyb3VwczsKIAogICAgIC8qKgpAQCAtNDUsNyArNDUsNyBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIHByZXBhcmUoTWFwIHN0b3JtX2NvbmYpIHsKICAgICAgICAgaW50IHRpbWVvdXQgPSBVdGlscy5nZXRJbnQoc3Rvcm1fY29uZi5nZXQoQ29uZmlnLlNUT1JNX0dST1VQX01BUFBJTkdfU0VSVklDRV9DQUNIRV9EVVJBVElPTl9TRUNTKSk7Ci0gICAgICAgIGNhY2hlZEdyb3VwcyA9IG5ldyBUaW1lQ2FjaGVNYXA8U3RyaW5nLCBTZXQ8U3RyaW5nPj4odGltZW91dCk7CisgICAgICAgIGNhY2hlZEdyb3VwcyA9IG5ldyBUaW1lQ2FjaGVNYXA8Pih0aW1lb3V0KTsKICAgICB9CiAKICAgICAvKioKQEAgLTczLDE4ICs3MywxOCBAQAogICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgZW5jb3VudGVyIGFueSBlcnJvciB3aGVuIHJ1bm5pbmcgdGhlIGNvbW1hbmQKICAgICAgKi8KICAgICBwcml2YXRlIHN0YXRpYyBTZXQ8U3RyaW5nPiBnZXRVbml4R3JvdXBzKGZpbmFsIFN0cmluZyB1c2VyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBTdHJpbmcgcmVzdWx0ID0gIiI7CisgICAgICAgIFN0cmluZyByZXN1bHQ7CiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICByZXN1bHQgPSBTaGVsbFV0aWxzLmV4ZWNDb21tYW5kKFNoZWxsVXRpbHMuZ2V0R3JvdXBzRm9yVXNlckNvbW1hbmQodXNlcikpOwogICAgICAgICB9IGNhdGNoIChFeGl0Q29kZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAvLyBpZiB3ZSBkaWRuJ3QgZ2V0IHRoZSBncm91cCAtIGp1c3QgcmV0dXJuIGVtcHR5IGxpc3Q7CiAgICAgICAgICAgICBMT0cuZGVidWcoInVuYWJsZSB0byBnZXQgZ3JvdXBzIGZvciB1c2VyICIgKyB1c2VyICsgIi5TaGVsbFV0aWxzIGNvbW1hbmQgZmFpbGVkIHdpdGggZXhpdCBjb2RlICIrIGUuZ2V0RXhpdENvZGUoKSk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBIYXNoU2V0PD4oKTsKICAgICAgICAgfQogCiAgICAgICAgIFN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPQogICAgICAgICAgICAgbmV3IFN0cmluZ1Rva2VuaXplcihyZXN1bHQsIFNoZWxsVXRpbHMuVE9LRU5fU0VQQVJBVE9SX1JFR0VYKTsKLSAgICAgICAgU2V0PFN0cmluZz4gZ3JvdXBzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgICAgICBTZXQ8U3RyaW5nPiBncm91cHMgPSBuZXcgSGFzaFNldDw+KCk7CiAgICAgICAgIHdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7CiAgICAgICAgICAgICBncm91cHMuYWRkKHRva2VuaXplci5uZXh0VG9rZW4oKSk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zZWN1cml0eS9hdXRoL1NpbXBsZVRyYW5zcG9ydFBsdWdpbi5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NlY3VyaXR5L2F1dGgvU2ltcGxlVHJhbnNwb3J0UGx1Z2luLmphdmEKaW5kZXggMmFiY2RhZS4uYjczYzU4NSAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NlY3VyaXR5L2F1dGgvU2ltcGxlVHJhbnNwb3J0UGx1Z2luLmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NlY3VyaXR5L2F1dGgvU2ltcGxlVHJhbnNwb3J0UGx1Z2luLmphdmEKQEAgLTQ1LDggKzQ1LDYgQEAKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCi1pbXBvcnQgYmFja3R5cGUuc3Rvcm0uc2VjdXJpdHkuYXV0aC5UaHJpZnRDb25uZWN0aW9uVHlwZTsKLQogLyoqCiAgKiBTaW1wbGUgdHJhbnNwb3J0IGZvciBUaHJpZnQgcGx1Z2luLgogICogCkBAIC03NSw3ICs3Myw3IEBACiAKICAgICAgICAgVEhzSGFTZXJ2ZXIuQXJncyBzZXJ2ZXJfYXJncyA9IG5ldyBUSHNIYVNlcnZlci5BcmdzKHNlcnZlclRyYW5zcG9ydCkuCiAgICAgICAgICAgICAgICAgcHJvY2Vzc29yKG5ldyBTaW1wbGVXcmFwUHJvY2Vzc29yKHByb2Nlc3NvcikpLgotICAgICAgICAgICAgICAgIHdvcmtlclRocmVhZHMobnVtV29ya2VyVGhyZWFkcykuCisgICAgICAgICAgICAgICAgbWF4V29ya2VyVGhyZWFkcyhudW1Xb3JrZXJUaHJlYWRzKS4KICAgICAgICAgICAgICAgICBwcm90b2NvbEZhY3RvcnkobmV3IFRCaW5hcnlQcm90b2NvbC5GYWN0b3J5KGZhbHNlLCB0cnVlLCBtYXhCdWZmZXJTaXplLCAtMSkpOwogCiAgICAgICAgIGlmIChxdWV1ZVNpemUgIT0gbnVsbCkgewpAQCAtMTQ2LDEyICsxNDQsMTIgQEAKICAgICAgICAgICAgIGlmIChzID09IG51bGwpIHsKICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHVzZXIgPSAoU3RyaW5nKXN0b3JtX2NvbmYuZ2V0KCJkZWJ1Zy5zaW1wbGUudHJhbnNwb3J0LnVzZXIiKTsKICAgICAgICAgICAgICAgaWYgKHVzZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIEhhc2hTZXQ8UHJpbmNpcGFsPiBwcmluY2lwYWxzID0gbmV3IEhhc2hTZXQ8UHJpbmNpcGFsPigpOworICAgICAgICAgICAgICAgIEhhc2hTZXQ8UHJpbmNpcGFsPiBwcmluY2lwYWxzID0gbmV3IEhhc2hTZXQ8PigpOwogICAgICAgICAgICAgICAgIHByaW5jaXBhbHMuYWRkKG5ldyBQcmluY2lwYWwoKSB7CiAgICAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7IHJldHVybiB1c2VyOyB9CiAgICAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeyByZXR1cm4gdXNlcjsgfQogICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgICAgIHMgPSBuZXcgU3ViamVjdCh0cnVlLCBwcmluY2lwYWxzLCBuZXcgSGFzaFNldDxPYmplY3Q+KCksIG5ldyBIYXNoU2V0PE9iamVjdD4oKSk7CisgICAgICAgICAgICAgICAgcyA9IG5ldyBTdWJqZWN0KHRydWUsIHByaW5jaXBhbHMsIG5ldyBIYXNoU2V0PD4oKSwgbmV3IEhhc2hTZXQ8PigpKTsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmVxX2NvbnRleHQuc2V0U3ViamVjdChzKTsKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zZWN1cml0eS9hdXRoL1NpbmdsZVVzZXJQcmluY2lwYWwuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zZWN1cml0eS9hdXRoL1NpbmdsZVVzZXJQcmluY2lwYWwuamF2YQppbmRleCA2YWYxN2ZhLi4wY2FkYmE2IDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2VjdXJpdHkvYXV0aC9TaW5nbGVVc2VyUHJpbmNpcGFsLmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NlY3VyaXR5L2F1dGgvU2luZ2xlVXNlclByaW5jaXBhbC5qYXZhCkBAIC0zMywxMCArMzMsNyBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBhbm90aGVyKSB7Ci0gICAgICAgIGlmIChhbm90aGVyIGluc3RhbmNlb2YgU2luZ2xlVXNlclByaW5jaXBhbCkgewotICAgICAgICAgICAgcmV0dXJuIF91c2VyTmFtZS5lcXVhbHMoKChTaW5nbGVVc2VyUHJpbmNpcGFsKWFub3RoZXIpLl91c2VyTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gYW5vdGhlciBpbnN0YW5jZW9mIFNpbmdsZVVzZXJQcmluY2lwYWwgJiYgX3VzZXJOYW1lLmVxdWFscygoKFNpbmdsZVVzZXJQcmluY2lwYWwpIGFub3RoZXIpLl91c2VyTmFtZSk7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2VjdXJpdHkvYXV0aC9UQmFja29mZkNvbm5lY3QuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zZWN1cml0eS9hdXRoL1RCYWNrb2ZmQ29ubmVjdC5qYXZhCmluZGV4IGY1NDc4NjguLjk3Mjk2NzEgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zZWN1cml0eS9hdXRoL1RCYWNrb2ZmQ29ubmVjdC5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zZWN1cml0eS9hdXRoL1RCYWNrb2ZmQ29ubmVjdC5qYXZhCkBAIC0xOSw3ICsxOSw2IEBACiBwYWNrYWdlIGJhY2t0eXBlLnN0b3JtLnNlY3VyaXR5LmF1dGg7CiAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SYW5kb207CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb247CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zZWN1cml0eS9hdXRoL1RocmlmdENsaWVudC5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NlY3VyaXR5L2F1dGgvVGhyaWZ0Q2xpZW50LmphdmEKaW5kZXggOWY3N2FiOS4uOGIzZDRjNSAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NlY3VyaXR5L2F1dGgvVGhyaWZ0Q2xpZW50LmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NlY3VyaXR5L2F1dGgvVGhyaWZ0Q2xpZW50LmphdmEKQEAgLTI0LDE0ICsyNCwxMCBAQAogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnByb3RvY29sLlRQcm90b2NvbDsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFNvY2tldDsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFRyYW5zcG9ydDsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOwotaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnV0aWxzLlV0aWxzOwogaW1wb3J0IGJhY2t0eXBlLnN0b3JtLkNvbmZpZzsKLWltcG9ydCBiYWNrdHlwZS5zdG9ybS5zZWN1cml0eS5hdXRoLlRCYWNrb2ZmQ29ubmVjdDsKIAotcHVibGljIGNsYXNzIFRocmlmdENsaWVudCB7CQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihUaHJpZnRDbGllbnQuY2xhc3MpOworcHVibGljIGNsYXNzIFRocmlmdENsaWVudCB7CiAgICAgcHJpdmF0ZSBUVHJhbnNwb3J0IF90cmFuc3BvcnQ7CiAgICAgcHJvdGVjdGVkIFRQcm90b2NvbCBfcHJvdG9jb2w7CiAgICAgcHJpdmF0ZSBTdHJpbmcgX2hvc3Q7CkBAIC05MCw4ICs4Niw2IEBACiAgICAgICAgICAgICAvL2NvbnN0cnVjdCBhIHRyYW5zcG9ydCBwbHVnaW4KICAgICAgICAgICAgIElUcmFuc3BvcnRQbHVnaW4gdHJhbnNwb3J0UGx1Z2luID0gQXV0aFV0aWxzLkdldFRyYW5zcG9ydFBsdWdpbihfdHlwZSwgX2NvbmYsIGxvZ2luX2NvbmYpOwogCi0gICAgICAgICAgICBmaW5hbCBUVHJhbnNwb3J0IHVuZGVybHlpbmdUcmFuc3BvcnQgPSBzb2NrZXQ7Ci0KICAgICAgICAgICAgIC8vVE9ETyBnZXQgdGhpcyBmcm9tIHR5cGUgaW5zdGVhZCBvZiBoYXJkY29kaW5nIHRvIE5pbWJ1cy4KICAgICAgICAgICAgIC8vZXN0YWJsaXNoIGNsaWVudC1zZXJ2ZXIgdHJhbnNwb3J0IHZpYSBwbHVnaW4KICAgICAgICAgICAgIC8vZG8gcmV0cmllcyBpZiB0aGUgY29ubmVjdCBmYWlscwpAQCAtMTAwLDcgKzk0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXRpbHMuZ2V0SW50KF9jb25mLmdldChDb25maWcuU1RPUk1fTklNQlVTX1JFVFJZX1RJTUVTKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFV0aWxzLmdldEludChfY29uZi5nZXQoQ29uZmlnLlNUT1JNX05JTUJVU19SRVRSWV9JTlRFUlZBTCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVdGlscy5nZXRJbnQoX2NvbmYuZ2V0KENvbmZpZy5TVE9STV9OSU1CVVNfUkVUUllfSU5URVJWQUxfQ0VJTElORykpKTsKLSAgICAgICAgICAgIF90cmFuc3BvcnQgPSBjb25uZWN0aW9uUmV0cnkuZG9Db25uZWN0V2l0aFJldHJ5KHRyYW5zcG9ydFBsdWdpbiwgdW5kZXJseWluZ1RyYW5zcG9ydCwgX2hvc3QsIF9hc1VzZXIpOworICAgICAgICAgICAgX3RyYW5zcG9ydCA9IGNvbm5lY3Rpb25SZXRyeS5kb0Nvbm5lY3RXaXRoUmV0cnkodHJhbnNwb3J0UGx1Z2luLCBzb2NrZXQsIF9ob3N0LCBfYXNVc2VyKTsKICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NlY3VyaXR5L2F1dGgvVGhyaWZ0U2VydmVyLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2VjdXJpdHkvYXV0aC9UaHJpZnRTZXJ2ZXIuamF2YQppbmRleCA2NDI0M2NlLi5mZGJkYzdjIDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2VjdXJpdHkvYXV0aC9UaHJpZnRTZXJ2ZXIuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2VjdXJpdHkvYXV0aC9UaHJpZnRTZXJ2ZXIuamF2YQpAQCAtNTMsMTIgKzUzLDEwIEBACiAgICAgfQogCiAgICAgLyoqCi0gICAgICogSXMgVGhyaWZ0U2VydmVyIGxpc3RlbmluZyB0byByZXF1ZXN0cz8KLSAgICAgKiBAcmV0dXJuCisgICAgICogQHJldHVybiB0cnVlIGlmIFRocmlmdFNlcnZlciBpcyBsaXN0ZW5pbmcgdG8gcmVxdWVzdHM/CiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gaXNTZXJ2aW5nKCkgewotICAgICAgICBpZiAoX3NlcnZlciA9PSBudWxsKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiBfc2VydmVyLmlzU2VydmluZygpOworICAgICAgICByZXR1cm4gX3NlcnZlciAhPSBudWxsICYmIF9zZXJ2ZXIuaXNTZXJ2aW5nKCk7CiAgICAgfQogICAgIAogICAgIHB1YmxpYyB2b2lkIHNlcnZlKCkgIHsKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zZWN1cml0eS9hdXRoL2F1dGhvcml6ZXIvRFJQQ0F1dGhvcml6ZXJCYXNlLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2VjdXJpdHkvYXV0aC9hdXRob3JpemVyL0RSUENBdXRob3JpemVyQmFzZS5qYXZhCmluZGV4IGUxYmIwNzcuLjA0MjY5ZGQgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zZWN1cml0eS9hdXRoL2F1dGhvcml6ZXIvRFJQQ0F1dGhvcml6ZXJCYXNlLmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NlY3VyaXR5L2F1dGgvYXV0aG9yaXplci9EUlBDQXV0aG9yaXplckJhc2UuamF2YQpAQCAtMjYsNyArMjYsNyBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCiBwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRFJQQ0F1dGhvcml6ZXJCYXNlIGltcGxlbWVudHMgSUF1dGhvcml6ZXIgewotICAgIHB1YmxpYyBzdGF0aWMgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKERSUENBdXRob3JpemVyQmFzZS5jbGFzcyk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoRFJQQ0F1dGhvcml6ZXJCYXNlLmNsYXNzKTsKIAogICAgIC8qKgogICAgICAqIEEga2V5IG5hbWUgZm9yIHRoZSBmdW5jdGlvbiByZXF1ZXN0ZWQgdG8gYmUgZXhlY3V0ZWQgYnkgYSB1c2VyLgpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NlY3VyaXR5L2F1dGgvYXV0aG9yaXplci9EUlBDU2ltcGxlQUNMQXV0aG9yaXplci5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NlY3VyaXR5L2F1dGgvYXV0aG9yaXplci9EUlBDU2ltcGxlQUNMQXV0aG9yaXplci5qYXZhCmluZGV4IDhjZTI2ZWQuLjRhOWIzNzkgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zZWN1cml0eS9hdXRoL2F1dGhvcml6ZXIvRFJQQ1NpbXBsZUFDTEF1dGhvcml6ZXIuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2VjdXJpdHkvYXV0aC9hdXRob3JpemVyL0RSUENTaW1wbGVBQ0xBdXRob3JpemVyLmphdmEKQEAgLTI4LDcgKzI4LDYgQEAKIAogaW1wb3J0IGJhY2t0eXBlLnN0b3JtLkNvbmZpZzsKIGltcG9ydCBiYWNrdHlwZS5zdG9ybS5zZWN1cml0eS5hdXRoLlJlcUNvbnRleHQ7Ci1pbXBvcnQgYmFja3R5cGUuc3Rvcm0uc2VjdXJpdHkuYXV0aC5hdXRob3JpemVyLkRSUENBdXRob3JpemVyQmFzZTsKIGltcG9ydCBiYWNrdHlwZS5zdG9ybS5zZWN1cml0eS5hdXRoLkF1dGhVdGlsczsKIGltcG9ydCBiYWNrdHlwZS5zdG9ybS5zZWN1cml0eS5hdXRoLklQcmluY2lwYWxUb0xvY2FsOwogaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnV0aWxzLlV0aWxzOwpAQCAtMzcsNyArMzYsNyBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCiBwdWJsaWMgY2xhc3MgRFJQQ1NpbXBsZUFDTEF1dGhvcml6ZXIgZXh0ZW5kcyBEUlBDQXV0aG9yaXplckJhc2UgewotICAgIHB1YmxpYyBzdGF0aWMgTG9nZ2VyIExPRyA9CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0KICAgICAgICAgTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoRFJQQ1NpbXBsZUFDTEF1dGhvcml6ZXIuY2xhc3MpOwogCiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xJRU5UX1VTRVJTX0tFWSA9ICJjbGllbnQudXNlcnMiOwpAQCAtNTQsNyArNTMsNyBAQAogICAgICAgICBwdWJsaWMgQWNsRnVuY3Rpb25FbnRyeShDb2xsZWN0aW9uPFN0cmluZz4gY2xpZW50VXNlcnMsCiAgICAgICAgICAgICAgICAgU3RyaW5nIGludm9jYXRpb25Vc2VyKSB7CiAgICAgICAgICAgICB0aGlzLmNsaWVudFVzZXJzID0gKGNsaWVudFVzZXJzICE9IG51bGwpID8KLSAgICAgICAgICAgICAgICBuZXcgSGFzaFNldDxTdHJpbmc+KGNsaWVudFVzZXJzKSA6IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICAgICAgICAgICAgICBuZXcgSGFzaFNldDw+KGNsaWVudFVzZXJzKSA6IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKICAgICAgICAgICAgIHRoaXMuaW52b2NhdGlvblVzZXIgPSBpbnZvY2F0aW9uVXNlcjsKICAgICAgICAgfQogICAgIH0KQEAgLTY4LDI3ICs2NywyNyBAQAogICAgICAgICAvL2NoYW5nZSBpcyBhdG9taWMKICAgICAgICAgbG9uZyBub3cgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKICAgICAgICAgaWYgKChub3cgLSA1MDAwKSA+IF9sYXN0VXBkYXRlIHx8IF9hY2wgPT0gbnVsbCkgewotICAgICAgICAgICAgTWFwPFN0cmluZyxBY2xGdW5jdGlvbkVudHJ5PiBhY2wgPSBuZXcgSGFzaE1hcDxTdHJpbmcsQWNsRnVuY3Rpb25FbnRyeT4oKTsKKyAgICAgICAgICAgIE1hcDxTdHJpbmcsQWNsRnVuY3Rpb25FbnRyeT4gYWNsID0gbmV3IEhhc2hNYXA8PigpOwogICAgICAgICAgICAgTWFwIGNvbmYgPSBVdGlscy5maW5kQW5kUmVhZENvbmZpZ0ZpbGUoX2FjbEZpbGVOYW1lKTsKICAgICAgICAgICAgIGlmIChjb25mLmNvbnRhaW5zS2V5KENvbmZpZy5EUlBDX0FVVEhPUklaRVJfQUNMKSkgewogICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsTWFwPFN0cmluZyw/Pj4gY29uZkFjbCA9CiAgICAgICAgICAgICAgICAgICAgIChNYXA8U3RyaW5nLE1hcDxTdHJpbmcsPz4+KQogICAgICAgICAgICAgICAgICAgICBjb25mLmdldChDb25maWcuRFJQQ19BVVRIT1JJWkVSX0FDTCk7CiAKLSAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBmdW5jdGlvbiA6IGNvbmZBY2wua2V5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZyw/PiB2YWwgPSBjb25mQWNsLmdldChmdW5jdGlvbik7CisgICAgICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBNYXA8U3RyaW5nLCA/Pj4gZW50cnkgOiBjb25mQWNsLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZyw/PiB2YWwgPSBlbnRyeS5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPFN0cmluZz4gY2xpZW50VXNlcnMgPQogICAgICAgICAgICAgICAgICAgICAgICAgdmFsLmNvbnRhaW5zS2V5KENMSUVOVF9VU0VSU19LRVkpID8KICAgICAgICAgICAgICAgICAgICAgICAgIChDb2xsZWN0aW9uPFN0cmluZz4pIHZhbC5nZXQoQ0xJRU5UX1VTRVJTX0tFWSkgOiBudWxsOwogICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaW52b2NhdGlvblVzZXIgPQogICAgICAgICAgICAgICAgICAgICAgICAgdmFsLmNvbnRhaW5zS2V5KElOVk9DQVRJT05fVVNFUl9LRVkpID8KICAgICAgICAgICAgICAgICAgICAgICAgIChTdHJpbmcpIHZhbC5nZXQoSU5WT0NBVElPTl9VU0VSX0tFWSkgOiBudWxsOwotICAgICAgICAgICAgICAgICAgICBhY2wucHV0KGZ1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICBhY2wucHV0KGVudHJ5LmdldEtleSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBY2xGdW5jdGlvbkVudHJ5KGNsaWVudFVzZXJzLCBpbnZvY2F0aW9uVXNlcikpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSBpZiAoIV9wZXJtaXRXaGVuTWlzc2luZ0Z1bmN0aW9uRW50cnkpIHsKICAgICAgICAgICAgICAgICBMT0cud2FybigiUmVxdWlyaW5nIGV4cGxpY2l0IEFDTCBlbnRyaWVzLCBidXQgbm9uZSBnaXZlbi4gIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAiVGhlcmVmb3JlLCBhbGwgb3BlcmlhdGlvbnMgd2lsbCBiZSBkZW5pZWQuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAiVGhlcmVmb3JlLCBhbGwgb3BlcmF0aW9ucyB3aWxsIGJlIGRlbmllZC4iKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIF9hY2wgPSBhY2w7CiAgICAgICAgICAgICBfbGFzdFVwZGF0ZSA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwpAQCAtMTAwLDggKzk5LDggQEAKICAgICBwdWJsaWMgdm9pZCBwcmVwYXJlKE1hcCBjb25mKSB7CiAgICAgICAgIEJvb2xlYW4gaXNTdHJpY3QgPSAKICAgICAgICAgICAgICAgICAoQm9vbGVhbikgY29uZi5nZXQoQ29uZmlnLkRSUENfQVVUSE9SSVpFUl9BQ0xfU1RSSUNUKTsKLSAgICAgICAgX3Blcm1pdFdoZW5NaXNzaW5nRnVuY3Rpb25FbnRyeSA9IAotICAgICAgICAgICAgICAgIChpc1N0cmljdCAhPSBudWxsICYmICFpc1N0cmljdCkgPyB0cnVlIDogZmFsc2U7CisgICAgICAgIF9wZXJtaXRXaGVuTWlzc2luZ0Z1bmN0aW9uRW50cnkgPQorICAgICAgICAgICAgICAgIChpc1N0cmljdCAhPSBudWxsICYmICFpc1N0cmljdCk7CiAgICAgICAgIF9hY2xGaWxlTmFtZSA9IChTdHJpbmcpIGNvbmYuZ2V0KENvbmZpZy5EUlBDX0FVVEhPUklaRVJfQUNMX0ZJTEVOQU1FKTsKICAgICAgICAgX3B0b2wgPSBBdXRoVXRpbHMuR2V0UHJpbmNpcGFsVG9Mb2NhbFBsdWdpbihjb25mKTsKICAgICB9CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2VjdXJpdHkvYXV0aC9hdXRob3JpemVyL0RlbnlBdXRob3JpemVyLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2VjdXJpdHkvYXV0aC9hdXRob3JpemVyL0RlbnlBdXRob3JpemVyLmphdmEKaW5kZXggNWU4NGIzOC4uZDFkNmY4NyAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NlY3VyaXR5L2F1dGgvYXV0aG9yaXplci9EZW55QXV0aG9yaXplci5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zZWN1cml0eS9hdXRoL2F1dGhvcml6ZXIvRGVueUF1dGhvcml6ZXIuamF2YQpAQCAtMTksMTkgKzE5LDE0IEBACiAKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCi1pbXBvcnQgYmFja3R5cGUuc3Rvcm0uQ29uZmlnOwogaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnNlY3VyaXR5LmF1dGguSUF1dGhvcml6ZXI7CiBpbXBvcnQgYmFja3R5cGUuc3Rvcm0uc2VjdXJpdHkuYXV0aC5SZXFDb250ZXh0OwogCi1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQogLyoqCiAgKiBBbiBhdXRob3JpemF0aW9uIGltcGxlbWVudGF0aW9uIHRoYXQgZGVuaWVzIGV2ZXJ5dGhpbmcsIGZvciB0ZXN0aW5nIHB1cnBvc2VzCiAgKi8KIHB1YmxpYyBjbGFzcyBEZW55QXV0aG9yaXplciBpbXBsZW1lbnRzIElBdXRob3JpemVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoRGVueUF1dGhvcml6ZXIuY2xhc3MpOwotICAgIAorCiAgICAgLyoqCiAgICAgICogSW52b2tlZCBvbmNlIGltbWVkaWF0ZWx5IGFmdGVyIGNvbnN0cnVjdGlvbgogICAgICAqIEBwYXJhbSBjb25mIFN0b3JtIGNvbmZpZ3VyYXRpb24gCkBAIC00MSwxNyArMzYsMTIgQEAKIAogICAgIC8qKgogICAgICAqIHBlcm1pdCgpIG1ldGhvZCBpcyBpbnZva2VkIGZvciBlYWNoIGluY29taW5nIFRocmlmdCByZXF1ZXN0Ci0gICAgICogQHBhcmFtIGNvbnRyZXh0IHJlcXVlc3QgY29udGV4dCAKKyAgICAgKiBAcGFyYW0gY29udGV4dCByZXF1ZXN0IGNvbnRleHQKICAgICAgKiBAcGFyYW0gb3BlcmF0aW9uIG9wZXJhdGlvbiBuYW1lCi0gICAgICogQHBhcmFtIHRvcG9sb2d5X3N0b3JtIGNvbmZpZ3VyYXRpb24gb2YgdGFyZ2V0ZWQgdG9wb2xvZ3kgCisgICAgICogQHBhcmFtIHRvcG9sb2d5X2NvbmYgY29uZmlndXJhdGlvbiBvZiB0YXJnZXRlZCB0b3BvbG9neQogICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcmVxdWVzdCBpcyBhdXRob3JpemVkLCBmYWxzZSBpZiByZWplY3QKICAgICAgKi8KICAgICBwdWJsaWMgYm9vbGVhbiBwZXJtaXQoUmVxQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgb3BlcmF0aW9uLCBNYXAgdG9wb2xvZ3lfY29uZikgewotICAgICAgICBMT0cuaW5mbygiW3JlcSAiKyBjb250ZXh0LnJlcXVlc3RJRCgpKyAiXSBBY2Nlc3MgIgotICAgICAgICAgICAgICAgICsgIiBmcm9tOiAiICsgKGNvbnRleHQucmVtb3RlQWRkcmVzcygpID09IG51bGw/ICJudWxsIiA6IGNvbnRleHQucmVtb3RlQWRkcmVzcygpLnRvU3RyaW5nKCkpCi0gICAgICAgICAgICAgICAgKyAoY29udGV4dC5wcmluY2lwYWwoKSA9PSBudWxsPyAiIiA6ICgiIHByaW5jaXBhbDoiKyBjb250ZXh0LnByaW5jaXBhbCgpKSkKLSAgICAgICAgICAgICAgICArIiBvcDoiK29wZXJhdGlvbgotICAgICAgICAgICAgICAgICsgKHRvcG9sb2d5X2NvbmYgPT0gbnVsbD8gIiIgOiAoIiB0b3Bvb2xvZ3k6Iit0b3BvbG9neV9jb25mLmdldChDb25maWcuVE9QT0xPR1lfTkFNRSkpKSk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2VjdXJpdHkvYXV0aC9hdXRob3JpemVyL0ltcGVyc29uYXRpb25BdXRob3JpemVyLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2VjdXJpdHkvYXV0aC9hdXRob3JpemVyL0ltcGVyc29uYXRpb25BdXRob3JpemVyLmphdmEKaW5kZXggYzE1NzNhNi4uMDdlNjQ0NyAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NlY3VyaXR5L2F1dGgvYXV0aG9yaXplci9JbXBlcnNvbmF0aW9uQXV0aG9yaXplci5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zZWN1cml0eS9hdXRoL2F1dGhvcml6ZXIvSW1wZXJzb25hdGlvbkF1dGhvcml6ZXIuamF2YQpAQCAtMzgsMTQgKzM4LDE1IEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBwcmVwYXJlKE1hcCBjb25mKSB7Ci0gICAgICAgIHVzZXJJbXBlcnNvbmF0aW9uQUNMID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbXBlcnNvbmF0aW9uQUNMPigpOworICAgICAgICB1c2VySW1wZXJzb25hdGlvbkFDTCA9IG5ldyBIYXNoTWFwPD4oKTsKIAogICAgICAgICBNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+PiB1c2VyVG9Ib3N0QW5kR3JvdXAgPSAoTWFwPFN0cmluZywgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+Pj4pIGNvbmYuZ2V0KENvbmZpZy5OSU1CVVNfSU1QRVJTT05BVElPTl9BQ0wpOwogCiAgICAgICAgIGlmICh1c2VyVG9Ib3N0QW5kR3JvdXAgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChTdHJpbmcgdXNlciA6IHVzZXJUb0hvc3RBbmRHcm91cC5rZXlTZXQoKSkgewotICAgICAgICAgICAgICAgIFNldDxTdHJpbmc+IGdyb3VwcyA9IEltbXV0YWJsZVNldC5jb3B5T2YodXNlclRvSG9zdEFuZEdyb3VwLmdldCh1c2VyKS5nZXQoImdyb3VwcyIpKTsKLSAgICAgICAgICAgICAgICBTZXQ8U3RyaW5nPiBob3N0cyA9IEltbXV0YWJsZVNldC5jb3B5T2YodXNlclRvSG9zdEFuZEdyb3VwLmdldCh1c2VyKS5nZXQoImhvc3RzIikpOworICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+PiBlbnRyeSA6IHVzZXJUb0hvc3RBbmRHcm91cC5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHVzZXIgPSBlbnRyeS5nZXRLZXkoKTsKKyAgICAgICAgICAgICAgICBTZXQ8U3RyaW5nPiBncm91cHMgPSBJbW11dGFibGVTZXQuY29weU9mKGVudHJ5LmdldFZhbHVlKCkuZ2V0KCJncm91cHMiKSk7CisgICAgICAgICAgICAgICAgU2V0PFN0cmluZz4gaG9zdHMgPSBJbW11dGFibGVTZXQuY29weU9mKGVudHJ5LmdldFZhbHVlKCkuZ2V0KCJob3N0cyIpKTsKICAgICAgICAgICAgICAgICB1c2VySW1wZXJzb25hdGlvbkFDTC5wdXQodXNlciwgbmV3IEltcGVyc29uYXRpb25BQ0wodXNlciwgZ3JvdXBzLCBob3N0cykpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC02Niw3ICs2Nyw3IEBACiAgICAgICAgIFN0cmluZyB1c2VyQmVpbmdJbXBlcnNvbmF0ZWQgPSBfcHRvbC50b0xvY2FsKGNvbnRleHQucHJpbmNpcGFsKCkpOwogICAgICAgICBJbmV0QWRkcmVzcyByZW1vdGVBZGRyZXNzID0gY29udGV4dC5yZW1vdGVBZGRyZXNzKCk7CiAKLSAgICAgICAgTE9HLmluZm8oInVzZXIgPSB7fSwgcHJpbmNpcGFsID0ge30gaXMgYXR0bWVwdGluZyB0byBpbXBlcnNvbmF0ZSB1c2VyID0ge30gZm9yIG9wZXJhdGlvbiA9IHt9IGZyb20gaG9zdCA9IHt9IiwKKyAgICAgICAgTE9HLmluZm8oInVzZXIgPSB7fSwgcHJpbmNpcGFsID0ge30gaXMgYXR0ZW1wdGluZyB0byBpbXBlcnNvbmF0ZSB1c2VyID0ge30gZm9yIG9wZXJhdGlvbiA9IHt9IGZyb20gaG9zdCA9IHt9IiwKICAgICAgICAgICAgICAgICBpbXBlcnNvbmF0aW5nVXNlciwgaW1wZXJzb25hdGluZ1ByaW5jaXBhbCwgdXNlckJlaW5nSW1wZXJzb25hdGVkLCBvcGVyYXRpb24sIHJlbW90ZUFkZHJlc3MpOwogCiAgICAgICAgIC8qKgpAQCAtODIsOCArODMsOCBAQAogICAgICAgICBJbXBlcnNvbmF0aW9uQUNMIHByaW5jaXBhbEFDTCA9IHVzZXJJbXBlcnNvbmF0aW9uQUNMLmdldChpbXBlcnNvbmF0aW5nUHJpbmNpcGFsKTsKICAgICAgICAgSW1wZXJzb25hdGlvbkFDTCB1c2VyQUNMID0gdXNlckltcGVyc29uYXRpb25BQ0wuZ2V0KGltcGVyc29uYXRpbmdVc2VyKTsKIAotICAgICAgICBTZXQ8U3RyaW5nPiBhdXRob3JpemVkSG9zdHMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgICAgIFNldDxTdHJpbmc+IGF1dGhvcml6ZWRHcm91cHMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgICAgIFNldDxTdHJpbmc+IGF1dGhvcml6ZWRIb3N0cyA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgU2V0PFN0cmluZz4gYXV0aG9yaXplZEdyb3VwcyA9IG5ldyBIYXNoU2V0PD4oKTsKIAogICAgICAgICBpZiAocHJpbmNpcGFsQUNMICE9IG51bGwpIHsKICAgICAgICAgICAgIGF1dGhvcml6ZWRIb3N0cy5hZGRBbGwocHJpbmNpcGFsQUNMLmF1dGhvcml6ZWRIb3N0cyk7CkBAIC0xMjYsNyArMTI3LDcgQEAKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAKLSAgICAgICAgU2V0PFN0cmluZz4gZ3JvdXBzID0gbnVsbDsKKyAgICAgICAgU2V0PFN0cmluZz4gZ3JvdXBzOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgZ3JvdXBzID0gX2dyb3VwTWFwcGluZ1Byb3ZpZGVyLmdldEdyb3Vwcyh1c2VyQmVpbmdJbXBlcnNvbmF0ZWQpOwogICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2VjdXJpdHkvYXV0aC9hdXRob3JpemVyL05vb3BBdXRob3JpemVyLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2VjdXJpdHkvYXV0aC9hdXRob3JpemVyL05vb3BBdXRob3JpemVyLmphdmEKaW5kZXggOWFmNDRkMy4uYWI1YmQ0YiAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NlY3VyaXR5L2F1dGgvYXV0aG9yaXplci9Ob29wQXV0aG9yaXplci5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zZWN1cml0eS9hdXRoL2F1dGhvcml6ZXIvTm9vcEF1dGhvcml6ZXIuamF2YQpAQCAtMTksMTggKzE5LDEzIEBACiAKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCi1pbXBvcnQgYmFja3R5cGUuc3Rvcm0uQ29uZmlnOwogaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnNlY3VyaXR5LmF1dGguSUF1dGhvcml6ZXI7CiBpbXBvcnQgYmFja3R5cGUuc3Rvcm0uc2VjdXJpdHkuYXV0aC5SZXFDb250ZXh0OwogCi1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQogLyoqCiAgKiBBIG5vLW9wIGF1dGhvcml6YXRpb24gaW1wbGVtZW50YXRpb24gdGhhdCBpbGx1c3RyYXRlIGluZm8gYXZhaWxhYmxlIGZvciBhdXRob3JpemF0aW9uIGRlY2lzaW9ucy4KICAqLwogcHVibGljIGNsYXNzIE5vb3BBdXRob3JpemVyIGltcGxlbWVudHMgSUF1dGhvcml6ZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihOb29wQXV0aG9yaXplci5jbGFzcyk7CiAKICAgICAvKioKICAgICAgKiBJbnZva2VkIG9uY2UgaW1tZWRpYXRlbHkgYWZ0ZXIgY29uc3RydWN0aW9uCkBAIC00MywxNSArMzgsMTAgQEAKICAgICAgKiBwZXJtaXQoKSBtZXRob2QgaXMgaW52b2tlZCBmb3IgZWFjaCBpbmNvbWluZyBUaHJpZnQgcmVxdWVzdAogICAgICAqIEBwYXJhbSBjb250ZXh0IHJlcXVlc3QgY29udGV4dCBpbmNsdWRlcyBpbmZvIGFib3V0IAogICAgICAqIEBwYXJhbSBvcGVyYXRpb24gb3BlcmF0aW9uIG5hbWUKLSAgICAgKiBAcGFyYW0gdG9wb2xvZ3lfc3Rvcm0gY29uZmlndXJhdGlvbiBvZiB0YXJnZXRlZCB0b3BvbG9neSAKKyAgICAgKiBAcGFyYW0gdG9wb2xvZ3lfY29uZiBjb25maWd1cmF0aW9uIG9mIHRhcmdldGVkIHRvcG9sb2d5CiAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZXF1ZXN0IGlzIGF1dGhvcml6ZWQsIGZhbHNlIGlmIHJlamVjdAogICAgICAqLwogICAgIHB1YmxpYyBib29sZWFuIHBlcm1pdChSZXFDb250ZXh0IGNvbnRleHQsIFN0cmluZyBvcGVyYXRpb24sIE1hcCB0b3BvbG9neV9jb25mKSB7Ci0gICAgICAgIExPRy5pbmZvKCJbcmVxICIrIGNvbnRleHQucmVxdWVzdElEKCkrICJdIEFjY2VzcyAiCi0gICAgICAgICAgICAgICAgKyAiIGZyb206ICIgKyAoY29udGV4dC5yZW1vdGVBZGRyZXNzKCkgPT0gbnVsbD8gIm51bGwiIDogY29udGV4dC5yZW1vdGVBZGRyZXNzKCkudG9TdHJpbmcoKSkKLSAgICAgICAgICAgICAgICArIChjb250ZXh0LnByaW5jaXBhbCgpID09IG51bGw/ICIiIDogKCIgcHJpbmNpcGFsOiIrIGNvbnRleHQucHJpbmNpcGFsKCkpKQotICAgICAgICAgICAgICAgICsiIG9wOiIrb3BlcmF0aW9uCi0gICAgICAgICAgICAgICAgKyAodG9wb2xvZ3lfY29uZiA9PSBudWxsPyAiIiA6ICgiIHRvcG9vbG9neToiK3RvcG9sb2d5X2NvbmYuZ2V0KENvbmZpZy5UT1BPTE9HWV9OQU1FKSkpKTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NlY3VyaXR5L2F1dGgvYXV0aG9yaXplci9TaW1wbGVBQ0xBdXRob3JpemVyLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2VjdXJpdHkvYXV0aC9hdXRob3JpemVyL1NpbXBsZUFDTEF1dGhvcml6ZXIuamF2YQppbmRleCBlNTBhNTg3Li4wMDYzZjkyIDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2VjdXJpdHkvYXV0aC9hdXRob3JpemVyL1NpbXBsZUFDTEF1dGhvcml6ZXIuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2VjdXJpdHkvYXV0aC9hdXRob3JpemVyL1NpbXBsZUFDTEF1dGhvcml6ZXIuamF2YQpAQCAtNDIsOSArNDIsMzAgQEAKIHB1YmxpYyBjbGFzcyBTaW1wbGVBQ0xBdXRob3JpemVyIGltcGxlbWVudHMgSUF1dGhvcml6ZXIgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihTaW1wbGVBQ0xBdXRob3JpemVyLmNsYXNzKTsKIAotICAgIHByb3RlY3RlZCBTZXQ8U3RyaW5nPiBfdXNlckNvbW1hbmRzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPihBcnJheXMuYXNMaXN0KCJzdWJtaXRUb3BvbG9neSIsICJmaWxlVXBsb2FkIiwgImdldE5pbWJ1c0NvbmYiLCAiZ2V0Q2x1c3RlckluZm8iKSk7Ci0gICAgcHJvdGVjdGVkIFNldDxTdHJpbmc+IF9zdXBlcnZpc29yQ29tbWFuZHMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KEFycmF5cy5hc0xpc3QoImZpbGVEb3dubG9hZCIpKTsKLSAgICBwcm90ZWN0ZWQgU2V0PFN0cmluZz4gX3RvcG9Db21tYW5kcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oQXJyYXlzLmFzTGlzdCgia2lsbFRvcG9sb2d5IiwicmViYWxhbmNlIiwiYWN0aXZhdGUiLCJkZWFjdGl2YXRlIiwiZ2V0VG9wb2xvZ3lDb25mIiwiZ2V0VG9wb2xvZ3kiLCJnZXRVc2VyVG9wb2xvZ3kiLCJnZXRUb3BvbG9neUluZm8iLCJ1cGxvYWROZXdDcmVkZW50aWFscyIpKTsKKyAgICBwcm90ZWN0ZWQgU2V0PFN0cmluZz4gX3VzZXJDb21tYW5kcyA9IG5ldyBIYXNoU2V0PD4oQXJyYXlzLmFzTGlzdCgic3VibWl0VG9wb2xvZ3kiLCAiZmlsZVVwbG9hZCIsICJnZXROaW1idXNDb25mIiwgImdldENsdXN0ZXJJbmZvIikpOworICAgIHByb3RlY3RlZCBTZXQ8U3RyaW5nPiBfc3VwZXJ2aXNvckNvbW1hbmRzID0gbmV3IEhhc2hTZXQ8PihBcnJheXMuYXNMaXN0KCJmaWxlRG93bmxvYWQiKSk7CisgICAgcHJvdGVjdGVkIFNldDxTdHJpbmc+IF90b3BvQ29tbWFuZHMgPSBuZXcgSGFzaFNldDw+KEFycmF5cy5hc0xpc3QoCisgICAgICAgICAgICAia2lsbFRvcG9sb2d5IiwKKyAgICAgICAgICAgICJyZWJhbGFuY2UiLAorICAgICAgICAgICAgImFjdGl2YXRlIiwKKyAgICAgICAgICAgICJkZWFjdGl2YXRlIiwKKyAgICAgICAgICAgICJnZXRUb3BvbG9neUNvbmYiLAorICAgICAgICAgICAgImdldFRvcG9sb2d5IiwKKyAgICAgICAgICAgICJnZXRVc2VyVG9wb2xvZ3kiLAorICAgICAgICAgICAgImdldFRvcG9sb2d5SW5mbyIsCisgICAgICAgICAgICAiZ2V0VG9wb2xvZ3lQYWdlSW5mbyIsCisgICAgICAgICAgICAiZ2V0Q29tcG9uZW50UGFnZUluZm8iLAorICAgICAgICAgICAgInVwbG9hZE5ld0NyZWRlbnRpYWxzIiwKKyAgICAgICAgICAgICJzZXRMb2dDb25maWciLAorICAgICAgICAgICAgInNldFdvcmtlclByb2ZpbGVyIiwKKyAgICAgICAgICAgICJnZXRXb3JrZXJQcm9maWxlQWN0aW9uRXhwaXJ5IiwKKyAgICAgICAgICAgICJnZXRDb21wb25lbnRQZW5kaW5nUHJvZmlsZUFjdGlvbnMiLAorICAgICAgICAgICAgInN0YXJ0UHJvZmlsaW5nIiwKKyAgICAgICAgICAgICJzdG9wUHJvZmlsaW5nIiwKKyAgICAgICAgICAgICJkdW1wUHJvZmlsZSIsCisgICAgICAgICAgICAiZHVtcEpzdGFjayIsCisgICAgICAgICAgICAiZHVtcEhlYXAiLAorICAgICAgICAgICAgImdldExvZ0NvbmZpZyIpKTsKIAogICAgIHByb3RlY3RlZCBTZXQ8U3RyaW5nPiBfYWRtaW5zOwogICAgIHByb3RlY3RlZCBTZXQ8U3RyaW5nPiBfc3VwZXJ2aXNvcnM7CkBAIC01OCwxMCArNzksMTAgQEAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBwcmVwYXJlKE1hcCBjb25mKSB7Ci0gICAgICAgIF9hZG1pbnMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgICAgIF9zdXBlcnZpc29ycyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKLSAgICAgICAgX25pbWJ1c1VzZXJzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgICAgICBfbmltYnVzR3JvdXBzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgICAgICBfYWRtaW5zID0gbmV3IEhhc2hTZXQ8PigpOworICAgICAgICBfc3VwZXJ2aXNvcnMgPSBuZXcgSGFzaFNldDw+KCk7CisgICAgICAgIF9uaW1idXNVc2VycyA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgX25pbWJ1c0dyb3VwcyA9IG5ldyBIYXNoU2V0PD4oKTsKIAogICAgICAgICBpZiAoY29uZi5jb250YWluc0tleShDb25maWcuTklNQlVTX0FETUlOUykpIHsKICAgICAgICAgICAgIF9hZG1pbnMuYWRkQWxsKChDb2xsZWN0aW9uPFN0cmluZz4pY29uZi5nZXQoQ29uZmlnLk5JTUJVU19BRE1JTlMpKTsKQEAgLTkwLDE1ICsxMTEsOSBAQAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIHBlcm1pdChSZXFDb250ZXh0IGNvbnRleHQsIFN0cmluZyBvcGVyYXRpb24sIE1hcCB0b3BvbG9neV9jb25mKSB7Ci0gICAgICAgIExPRy5pbmZvKCJbcmVxICIgKyBjb250ZXh0LnJlcXVlc3RJRCgpICsgIl0gQWNjZXNzICIKLSAgICAgICAgICAgICAgICArICIgZnJvbTogIiArIChjb250ZXh0LnJlbW90ZUFkZHJlc3MoKSA9PSBudWxsID8gIm51bGwiIDogY29udGV4dC5yZW1vdGVBZGRyZXNzKCkudG9TdHJpbmcoKSkKLSAgICAgICAgICAgICAgICArIChjb250ZXh0LnByaW5jaXBhbCgpID09IG51bGwgPyAiIiA6ICgiIHByaW5jaXBhbDoiICsgY29udGV4dC5wcmluY2lwYWwoKSkpCi0gICAgICAgICAgICAgICAgKyAiIG9wOiIgKyBvcGVyYXRpb24KLSAgICAgICAgICAgICAgICArICh0b3BvbG9neV9jb25mID09IG51bGwgPyAiIiA6ICgiIHRvcG9vbG9neToiICsgdG9wb2xvZ3lfY29uZi5nZXQoQ29uZmlnLlRPUE9MT0dZX05BTUUpKSkpOwotCiAgICAgICAgIFN0cmluZyBwcmluY2lwYWwgPSBjb250ZXh0LnByaW5jaXBhbCgpLmdldE5hbWUoKTsKICAgICAgICAgU3RyaW5nIHVzZXIgPSBfcHRvbC50b0xvY2FsKGNvbnRleHQucHJpbmNpcGFsKCkpOwotICAgICAgICBTZXQ8U3RyaW5nPiB1c2VyR3JvdXBzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgICAgICBTZXQ8U3RyaW5nPiB1c2VyR3JvdXBzID0gbmV3IEhhc2hTZXQ8PigpOwogCiAgICAgICAgIGlmIChfZ3JvdXBNYXBwaW5nUHJvdmlkZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgdHJ5IHsKQEAgLTEzMCw3ICsxNDUsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBTZXQ8U3RyaW5nPiB0b3BvR3JvdXBzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgICAgICAgICAgU2V0PFN0cmluZz4gdG9wb0dyb3VwcyA9IG5ldyBIYXNoU2V0PD4oKTsKICAgICAgICAgICAgIGlmICh0b3BvbG9neV9jb25mLmNvbnRhaW5zS2V5KENvbmZpZy5UT1BPTE9HWV9HUk9VUFMpICYmIHRvcG9sb2d5X2NvbmYuZ2V0KENvbmZpZy5UT1BPTE9HWV9HUk9VUFMpICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICB0b3BvR3JvdXBzLmFkZEFsbCgoQ29sbGVjdGlvbjxTdHJpbmc+KXRvcG9sb2d5X2NvbmYuZ2V0KENvbmZpZy5UT1BPTE9HWV9HUk9VUFMpKTsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zZWN1cml0eS9hdXRoL2F1dGhvcml6ZXIvU2ltcGxlV2hpdGVsaXN0QXV0aG9yaXplci5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NlY3VyaXR5L2F1dGgvYXV0aG9yaXplci9TaW1wbGVXaGl0ZWxpc3RBdXRob3JpemVyLmphdmEKaW5kZXggNTUxMDlmOS4uNTczMWYwNiAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NlY3VyaXR5L2F1dGgvYXV0aG9yaXplci9TaW1wbGVXaGl0ZWxpc3RBdXRob3JpemVyLmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NlY3VyaXR5L2F1dGgvYXV0aG9yaXplci9TaW1wbGVXaGl0ZWxpc3RBdXRob3JpemVyLmphdmEKQEAgLTIzLDIwICsyMywxNSBAQAogaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwogCi1pbXBvcnQgYmFja3R5cGUuc3Rvcm0uQ29uZmlnOwogaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnNlY3VyaXR5LmF1dGguSUF1dGhvcml6ZXI7CiBpbXBvcnQgYmFja3R5cGUuc3Rvcm0uc2VjdXJpdHkuYXV0aC5SZXFDb250ZXh0OwogCi1pbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKLWltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKLQogLyoqCiAgKiBBbiBhdXRob3JpemF0aW9uIGltcGxlbWVudGF0aW9uIHRoYXQgc2ltcGx5IGNoZWNrcyBhIHdoaXRlbGlzdCBvZiB1c2VycyB0aGF0CiAgKiBhcmUgYWxsb3dlZCB0byB1c2UgdGhlIGNsdXN0ZXIuCiAgKi8KIHB1YmxpYyBjbGFzcyBTaW1wbGVXaGl0ZWxpc3RBdXRob3JpemVyIGltcGxlbWVudHMgSUF1dGhvcml6ZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihTaW1wbGVXaGl0ZWxpc3RBdXRob3JpemVyLmNsYXNzKTsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBXSElURUxJU1RfVVNFUlNfQ09ORiA9ICJzdG9ybS5hdXRoLnNpbXBsZS13aGl0ZS1saXN0LnVzZXJzIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXSElURUxJU1RfVVNFUlNfQ09ORiA9ICJzdG9ybS5hdXRoLnNpbXBsZS13aGl0ZS1saXN0LnVzZXJzIjsKICAgICBwcm90ZWN0ZWQgU2V0PFN0cmluZz4gdXNlcnM7CiAKICAgICAvKioKQEAgLTQ1LDcgKzQwLDcgQEAKICAgICAgKi8KICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBwcmVwYXJlKE1hcCBjb25mKSB7Ci0gICAgICAgIHVzZXJzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgICAgICB1c2VycyA9IG5ldyBIYXNoU2V0PD4oKTsKICAgICAgICAgaWYgKGNvbmYuY29udGFpbnNLZXkoV0hJVEVMSVNUX1VTRVJTX0NPTkYpKSB7CiAgICAgICAgICAgICB1c2Vycy5hZGRBbGwoKENvbGxlY3Rpb248U3RyaW5nPiljb25mLmdldChXSElURUxJU1RfVVNFUlNfQ09ORikpOwogICAgICAgICB9CkBAIC01NSwxNiArNTAsMTEgQEAKICAgICAgKiBwZXJtaXQoKSBtZXRob2QgaXMgaW52b2tlZCBmb3IgZWFjaCBpbmNvbWluZyBUaHJpZnQgcmVxdWVzdAogICAgICAqIEBwYXJhbSBjb250ZXh0IHJlcXVlc3QgY29udGV4dCBpbmNsdWRlcyBpbmZvIGFib3V0IAogICAgICAqIEBwYXJhbSBvcGVyYXRpb24gb3BlcmF0aW9uIG5hbWUKLSAgICAgKiBAcGFyYW0gdG9wb2xvZ3lfc3Rvcm0gY29uZmlndXJhdGlvbiBvZiB0YXJnZXRlZCB0b3BvbG9neSAKKyAgICAgKiBAcGFyYW0gdG9wb2xvZ3lfY29uZiBjb25maWd1cmF0aW9uIG9mIHRhcmdldGVkIHRvcG9sb2d5CiAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZXF1ZXN0IGlzIGF1dGhvcml6ZWQsIGZhbHNlIGlmIHJlamVjdAogICAgICAqLwogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIHBlcm1pdChSZXFDb250ZXh0IGNvbnRleHQsIFN0cmluZyBvcGVyYXRpb24sIE1hcCB0b3BvbG9neV9jb25mKSB7Ci0gICAgICAgIExPRy5pbmZvKCJbcmVxICIrIGNvbnRleHQucmVxdWVzdElEKCkrICJdIEFjY2VzcyAiCi0gICAgICAgICAgICAgICAgICsgIiBmcm9tOiAiICsgKGNvbnRleHQucmVtb3RlQWRkcmVzcygpID09IG51bGw/ICJudWxsIiA6IGNvbnRleHQucmVtb3RlQWRkcmVzcygpLnRvU3RyaW5nKCkpCi0gICAgICAgICAgICAgICAgICsgKGNvbnRleHQucHJpbmNpcGFsKCkgPT0gbnVsbD8gIiIgOiAoIiBwcmluY2lwYWw6IisgY29udGV4dC5wcmluY2lwYWwoKSkpCi0gICAgICAgICAgICAgICAgICsiIG9wOiIrb3BlcmF0aW9uCi0gICAgICAgICAgICAgICAgICsgKHRvcG9sb2d5X2NvbmYgPT0gbnVsbD8gIiIgOiAoIiB0b3Bvb2xvZ3k6Iit0b3BvbG9neV9jb25mLmdldChDb25maWcuVE9QT0xPR1lfTkFNRSkpKSk7CiAgICAgICAgIHJldHVybiBjb250ZXh0LnByaW5jaXBhbCgpICE9IG51bGwgPyB1c2Vycy5jb250YWlucyhjb250ZXh0LnByaW5jaXBhbCgpLmdldE5hbWUoKSkgOiBmYWxzZTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2VjdXJpdHkvYXV0aC9kaWdlc3QvQ2xpZW50Q2FsbGJhY2tIYW5kbGVyLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2VjdXJpdHkvYXV0aC9kaWdlc3QvQ2xpZW50Q2FsbGJhY2tIYW5kbGVyLmphdmEKaW5kZXggM2NhYWNhYS4uNDIwMzI2YyAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NlY3VyaXR5L2F1dGgvZGlnZXN0L0NsaWVudENhbGxiYWNrSGFuZGxlci5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zZWN1cml0eS9hdXRoL2RpZ2VzdC9DbGllbnRDYWxsYmFja0hhbmRsZXIuamF2YQpAQCAtNDYsOCArNDYsNiBAQAogICAgICAqIENvbnN0cnVjdG9yIGJhc2VkIG9uIGEgSkFBUyBjb25maWd1cmF0aW9uCiAgICAgICogCiAgICAgICogRm9yIGRpZ2VzdCwgeW91IHNob3VsZCBoYXZlIGEgcGFpciBvZiB1c2VyIG5hbWUgYW5kIHBhc3N3b3JkIGRlZmluZWQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb24KICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICovCiAgICAgcHVibGljIENsaWVudENhbGxiYWNrSGFuZGxlcihDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2VjdXJpdHkvYXV0aC9kaWdlc3QvRGlnZXN0U2FzbFRyYW5zcG9ydFBsdWdpbi5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NlY3VyaXR5L2F1dGgvZGlnZXN0L0RpZ2VzdFNhc2xUcmFuc3BvcnRQbHVnaW4uamF2YQppbmRleCBhZDY0MmQ4Li4wOWQ2Zjc4IDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2VjdXJpdHkvYXV0aC9kaWdlc3QvRGlnZXN0U2FzbFRyYW5zcG9ydFBsdWdpbi5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zZWN1cml0eS9hdXRoL2RpZ2VzdC9EaWdlc3RTYXNsVHJhbnNwb3J0UGx1Z2luLmphdmEKQEAgLTE4LDEwICsxOCw4IEBACiBwYWNrYWdlIGJhY2t0eXBlLnN0b3JtLnNlY3VyaXR5LmF1dGguZGlnZXN0OwogCiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiBpbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC5jYWxsYmFjay5DYWxsYmFja0hhbmRsZXI7Ci1pbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC5sb2dpbi5Db25maWd1cmF0aW9uOwogCiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRTYXNsQ2xpZW50VHJhbnNwb3J0OwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LnRyYW5zcG9ydC5UU2FzbFNlcnZlclRyYW5zcG9ydDsKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zZWN1cml0eS9hdXRoL2RpZ2VzdC9TZXJ2ZXJDYWxsYmFja0hhbmRsZXIuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zZWN1cml0eS9hdXRoL2RpZ2VzdC9TZXJ2ZXJDYWxsYmFja0hhbmRsZXIuamF2YQppbmRleCAxNzg4ZGFiLi5lODAwNzJjIDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2VjdXJpdHkvYXV0aC9kaWdlc3QvU2VydmVyQ2FsbGJhY2tIYW5kbGVyLmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NlY3VyaXR5L2F1dGgvZGlnZXN0L1NlcnZlckNhbGxiYWNrSGFuZGxlci5qYXZhCkBAIC0yNiw3ICsyNiw2IEBACiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAotaW1wb3J0IGphdmF4LnNlY3VyaXR5LmF1dGguU3ViamVjdDsKIGltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLmNhbGxiYWNrLkNhbGxiYWNrOwogaW1wb3J0IGphdmF4LnNlY3VyaXR5LmF1dGguY2FsbGJhY2suQ2FsbGJhY2tIYW5kbGVyOwogaW1wb3J0IGphdmF4LnNlY3VyaXR5LmF1dGguY2FsbGJhY2suTmFtZUNhbGxiYWNrOwpAQCAtNDAsNyArMzksNyBAQAogaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnNlY3VyaXR5LmF1dGguQXV0aFV0aWxzOwogCiAvKioKLSAqIFNBU0wgc2VydmVyIHNpZGUgY29sbGJhY2sgaGFuZGxlcgorICogU0FTTCBzZXJ2ZXIgc2lkZSBjYWxsYmFjayBoYW5kbGVyCiAgKi8KIHB1YmxpYyBjbGFzcyBTZXJ2ZXJDYWxsYmFja0hhbmRsZXIgaW1wbGVtZW50cyBDYWxsYmFja0hhbmRsZXIgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBVU0VSX1BSRUZJWCA9ICJ1c2VyXyI7CkBAIC00OCw3ICs0Nyw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNZU1BST1BfU1VQRVJfUEFTU1dPUkQgPSAic3Rvcm0uU0FTTEF1dGhlbnRpY2F0aW9uUHJvdmlkZXIuc3VwZXJQYXNzd29yZCI7CiAKICAgICBwcml2YXRlIFN0cmluZyB1c2VyTmFtZTsKLSAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsU3RyaW5nPiBjcmVkZW50aWFscyA9IG5ldyBIYXNoTWFwPFN0cmluZyxTdHJpbmc+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLFN0cmluZz4gY3JlZGVudGlhbHMgPSBuZXcgSGFzaE1hcDw+KCk7CiAKICAgICBwdWJsaWMgU2VydmVyQ2FsbGJhY2tIYW5kbGVyKENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb249PW51bGwpIHJldHVybjsKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zZWN1cml0eS9hdXRoL2tlcmJlcm9zL0F1dG9UR1QuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zZWN1cml0eS9hdXRoL2tlcmJlcm9zL0F1dG9UR1QuamF2YQppbmRleCBhZWQxYzRmLi5kZDU0ZTAyIDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2VjdXJpdHkvYXV0aC9rZXJiZXJvcy9BdXRvVEdULmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NlY3VyaXR5L2F1dGgva2VyYmVyb3MvQXV0b1RHVC5qYXZhCkBAIC0yMiw3ICsyMiw2IEBACiBpbXBvcnQgYmFja3R5cGUuc3Rvcm0uc2VjdXJpdHkuYXV0aC5JQ3JlZGVudGlhbHNSZW5ld2VyOwogaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnNlY3VyaXR5LmF1dGguQXV0aFV0aWxzOwogCi1pbXBvcnQgamF2YS51dGlsLkRhdGU7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBqYXZhLnV0aWwuU2V0OwogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CkBAIC0zOCw3ICszNyw2IEBACiBpbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC5rZXJiZXJvcy5LZXJiZXJvc1RpY2tldDsKIGltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLmtlcmJlcm9zLktlcmJlcm9zUHJpbmNpcGFsOwogaW1wb3J0IGphdmF4LnNlY3VyaXR5LmF1dGgubG9naW4uQ29uZmlndXJhdGlvbjsKLWltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLmxvZ2luLkxvZ2luRXhjZXB0aW9uOwogaW1wb3J0IGphdmF4LnNlY3VyaXR5LmF1dGgubG9naW4uTG9naW5Db250ZXh0OwogaW1wb3J0IGphdmF4LnNlY3VyaXR5LmF1dGguRGVzdHJveUZhaWxlZEV4Y2VwdGlvbjsKIGltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLlJlZnJlc2hGYWlsZWRFeGNlcHRpb247CkBAIC01NCw3ICs1Miw3IEBACiBwdWJsaWMgY2xhc3MgQXV0b1RHVCBpbXBsZW1lbnRzIElBdXRvQ3JlZGVudGlhbHMsIElDcmVkZW50aWFsc1JlbmV3ZXIgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihBdXRvVEdULmNsYXNzKTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBUSUNLRVRfUkVORVdfV0lORE9XID0gMC44MGY7Ci0gICAgcHJvdGVjdGVkIHN0YXRpYyBBdG9taWNSZWZlcmVuY2U8S2VyYmVyb3NUaWNrZXQ+IGtlcmJUaWNrZXQgPSBuZXcgQXRvbWljUmVmZXJlbmNlPEtlcmJlcm9zVGlja2V0PigpOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgQXRvbWljUmVmZXJlbmNlPEtlcmJlcm9zVGlja2V0PiBrZXJiVGlja2V0ID0gbmV3IEF0b21pY1JlZmVyZW5jZTw+KCk7CiAgICAgcHJpdmF0ZSBNYXAgY29uZjsKIAogICAgIHB1YmxpYyB2b2lkIHByZXBhcmUoTWFwIGNvbmYpIHsKQEAgLTY2LDExICs2NCw5IEBACiAgICAgICAgIGZvcihLZXJiZXJvc1RpY2tldCB0aWNrZXQ6IHRpY2tldHMpIHsKICAgICAgICAgICAgIEtlcmJlcm9zUHJpbmNpcGFsIHNlcnZlciA9IHRpY2tldC5nZXRTZXJ2ZXIoKTsKICAgICAgICAgICAgIGlmIChzZXJ2ZXIuZ2V0TmFtZSgpLmVxdWFscygia3JidGd0LyIgKyBzZXJ2ZXIuZ2V0UmVhbG0oKSArICJAIiArIHNlcnZlci5nZXRSZWFsbSgpKSkgewotICAgICAgICAgICAgICAgIHRpY2tldHMgPSBudWxsOwogICAgICAgICAgICAgICAgIHJldHVybiB0aWNrZXQ7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgdGlja2V0cyA9IG51bGw7CiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0gCiAKQEAgLTE2NSw3ICsxNjEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKERlc3Ryb3lGYWlsZWRFeGNlcHRpb24gIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0cud2FybigiRmFpbGVkIHRvIGRlc3RvcnkgdGlja2V0ICIsIGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPRy53YXJuKCJGYWlsZWQgdG8gZGVzdHJveSB0aWNrZXQgIiwgZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CkBAIC0xODQsNyArMTgwLDcgQEAKICAgICAgKiBAcGFyYW0gc3ViamVjdCB0aGUgc3ViamVjdCB0aGF0IHNob3VsZCBoYXZlIGEgVEdUIGluIGl0LgogICAgICAqLwogICAgIHByaXZhdGUgdm9pZCBsb2dpbkhhZG9vcFVzZXIoU3ViamVjdCBzdWJqZWN0KSB7Ci0gICAgICAgIENsYXNzPD8+IHVnaSA9IG51bGw7CisgICAgICAgIENsYXNzPD8+IHVnaTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIHVnaSA9IENsYXNzLmZvck5hbWUoIm9yZy5hcGFjaGUuaGFkb29wLnNlY3VyaXR5LlVzZXJHcm91cEluZm9ybWF0aW9uIik7CiAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NlY3VyaXR5L2F1dGgva2VyYmVyb3MvTm9PcFRUcmFzcG9ydC5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NlY3VyaXR5L2F1dGgva2VyYmVyb3MvTm9PcFRUcmFzcG9ydC5qYXZhCmluZGV4IDA3NDkzMGQuLmMwNzIxZmMgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zZWN1cml0eS9hdXRoL2tlcmJlcm9zL05vT3BUVHJhc3BvcnQuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2VjdXJpdHkvYXV0aC9rZXJiZXJvcy9Ob09wVFRyYXNwb3J0LmphdmEKQEAgLTEsMTIgKzEsMjYgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCiBwYWNrYWdlIGJhY2t0eXBlLnN0b3JtLnNlY3VyaXR5LmF1dGgua2VyYmVyb3M7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC50cmFuc3BvcnQuVFNhc2xTZXJ2ZXJUcmFuc3BvcnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb247CiAKLS8qKgotICogQ3JlYXRlZCBieSBwc2hhaCBvbiA4LzEyLzE1LgotICovCiBwdWJsaWMgY2xhc3MgTm9PcFRUcmFzcG9ydCBleHRlbmRzIFRTYXNsU2VydmVyVHJhbnNwb3J0IHsKIAogICAgIHB1YmxpYyBOb09wVFRyYXNwb3J0KFRUcmFuc3BvcnQgdHJhbnNwb3J0KSB7CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2VjdXJpdHkvYXV0aC9rZXJiZXJvcy9TZXJ2ZXJDYWxsYmFja0hhbmRsZXIuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zZWN1cml0eS9hdXRoL2tlcmJlcm9zL1NlcnZlckNhbGxiYWNrSGFuZGxlci5qYXZhCmluZGV4IDdiMTQzZjAuLjQ2ZmZhNjEgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zZWN1cml0eS9hdXRoL2tlcmJlcm9zL1NlcnZlckNhbGxiYWNrSGFuZGxlci5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zZWN1cml0eS9hdXRoL2tlcmJlcm9zL1NlcnZlckNhbGxiYWNrSGFuZGxlci5qYXZhCkBAIC04Nyw2ICs4Nyw4IEBACiAgICAgICAgIC8vYWRkIHRoZSBhdXRoTmlkIGFzIHRoZSByZWFsIHVzZXIgaW4gcmVxQ29udGV4dCdzIHN1YmplY3Qgd2hpY2ggd2lsbCBiZSB1c2VkIGR1cmluZyBhdXRob3JpemF0aW9uLgogICAgICAgICBpZighYWMuZ2V0QXV0aGVudGljYXRpb25JRCgpLmVxdWFscyhhYy5nZXRBdXRob3JpemF0aW9uSUQoKSkpIHsKICAgICAgICAgICAgIFJlcUNvbnRleHQuY29udGV4dCgpLnNldFJlYWxQcmluY2lwYWwobmV3IFNhc2xUcmFuc3BvcnRQbHVnaW4uVXNlcihhYy5nZXRBdXRoZW50aWNhdGlvbklEKCkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFJlcUNvbnRleHQuY29udGV4dCgpLnNldFJlYWxQcmluY2lwYWwobnVsbCk7CiAgICAgICAgIH0KIAogICAgICAgICBhYy5zZXRBdXRob3JpemVkKHRydWUpOwpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NlY3VyaXR5L3NlcmlhbGl6YXRpb24vQmxvd2Zpc2hUdXBsZVNlcmlhbGl6ZXIuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zZWN1cml0eS9zZXJpYWxpemF0aW9uL0Jsb3dmaXNoVHVwbGVTZXJpYWxpemVyLmphdmEKaW5kZXggOGU2NmNkZi4uZmNhMGM0NiAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NlY3VyaXR5L3NlcmlhbGl6YXRpb24vQmxvd2Zpc2hUdXBsZVNlcmlhbGl6ZXIuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2VjdXJpdHkvc2VyaWFsaXphdGlvbi9CbG93ZmlzaFR1cGxlU2VyaWFsaXplci5qYXZhCkBAIC0zNiwxOSArMzYsMTkgQEAKIGltcG9ydCBiYWNrdHlwZS5zdG9ybS5Db25maWc7CiAKIC8qKgotICogQXBwbHkgQmxvd2Zpc2ggZW5jcnB0aW9uIGZvciB0dXBsZSBjb21tdW5pY2F0aW9uIHRvIGJvbHRzCisgKiBBcHBseSBCbG93ZmlzaCBlbmNyeXB0aW9uIGZvciB0dXBsZSBjb21tdW5pY2F0aW9uIHRvIGJvbHRzCiAgKi8KIHB1YmxpYyBjbGFzcyBCbG93ZmlzaFR1cGxlU2VyaWFsaXplciBleHRlbmRzIFNlcmlhbGl6ZXI8TGlzdERlbGVnYXRlPiB7CiAgICAgLyoqCiAgICAgICogVGhlIHNlY3JldCBrZXkgKGlmIGFueSkgZm9yIGRhdGEgZW5jcnlwdGlvbiBieSBibG93ZmlzaCBwYXlsb2FkIHNlcmlhbGl6YXRpb24gZmFjdG9yeSAoQmxvd2Zpc2hTZXJpYWxpemF0aW9uRmFjdG9yeSkuIAogICAgICAqIFlvdSBzaG91bGQgdXNlIGluIHZpYSAic3Rvcm0gLWMgdG9wb2xvZ3kudHVwbGUuc2VyaWFsaXplci5ibG93ZmlzaC5rZXk9WU9VUktFWSAtYyB0b3BvbG9neS50dXBsZS5zZXJpYWxpemVyPWJhY2t0eXBlLnN0b3JtLnNlY3VyaXR5LnNlcmlhbGl6YXRpb24uQmxvd2Zpc2hUdXBsZVNlcmlhbGl6ZXIgamFyIC4uLiIuCiAgICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgU0VDUkVUX0tFWSA9ICJ0b3BvbG9neS50dXBsZS5zZXJpYWxpemVyLmJsb3dmaXNoLmtleSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VDUkVUX0tFWSA9ICJ0b3BvbG9neS50dXBsZS5zZXJpYWxpemVyLmJsb3dmaXNoLmtleSI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEJsb3dmaXNoVHVwbGVTZXJpYWxpemVyLmNsYXNzKTsKICAgICBwcml2YXRlIEJsb3dmaXNoU2VyaWFsaXplciBfc2VyaWFsaXplcjsKIAogICAgIHB1YmxpYyBCbG93ZmlzaFR1cGxlU2VyaWFsaXplcihLcnlvIGtyeW8sIE1hcCBzdG9ybV9jb25mKSB7Ci0gICAgICAgIFN0cmluZyBlbmNyeXB0aW9uX2tleSA9IG51bGw7CisgICAgICAgIFN0cmluZyBlbmNyeXB0aW9uX2tleTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGVuY3J5cHRpb25fa2V5ID0gKFN0cmluZylzdG9ybV9jb25mLmdldChTRUNSRVRfS0VZKTsKICAgICAgICAgICAgIExPRy5kZWJ1ZygiQmxvd2Zpc2ggc2VyaWFsaXplciBiZWluZyBjb25zdHJ1Y3RlZCAuLi4iKTsKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zZXJpYWxpemF0aW9uL0d6aXBUaHJpZnRTZXJpYWxpemF0aW9uRGVsZWdhdGUuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zZXJpYWxpemF0aW9uL0d6aXBUaHJpZnRTZXJpYWxpemF0aW9uRGVsZWdhdGUuamF2YQppbmRleCA5MzNhMTI1Li41NDE5M2RhIDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2VyaWFsaXphdGlvbi9HemlwVGhyaWZ0U2VyaWFsaXphdGlvbkRlbGVnYXRlLmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NlcmlhbGl6YXRpb24vR3ppcFRocmlmdFNlcmlhbGl6YXRpb25EZWxlZ2F0ZS5qYXZhCkBAIC0xNyw3ICsxNyw2IEBACiAgKi8KIHBhY2thZ2UgYmFja3R5cGUuc3Rvcm0uc2VyaWFsaXphdGlvbjsKIAotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIGltcG9ydCBiYWNrdHlwZS5zdG9ybS51dGlscy5VdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5UQmFzZTsKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zZXJpYWxpemF0aW9uL0lUdXBsZURlc2VyaWFsaXplci5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NlcmlhbGl6YXRpb24vSVR1cGxlRGVzZXJpYWxpemVyLmphdmEKaW5kZXggNGU2ODY1OC4uMDljYzQyMiAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NlcmlhbGl6YXRpb24vSVR1cGxlRGVzZXJpYWxpemVyLmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NlcmlhbGl6YXRpb24vSVR1cGxlRGVzZXJpYWxpemVyLmphdmEKQEAgLTE4LDcgKzE4LDYgQEAKIHBhY2thZ2UgYmFja3R5cGUuc3Rvcm0uc2VyaWFsaXphdGlvbjsKIAogaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnR1cGxlLlR1cGxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiAKIHB1YmxpYyBpbnRlcmZhY2UgSVR1cGxlRGVzZXJpYWxpemVyIHsKICAgICBUdXBsZSBkZXNlcmlhbGl6ZShieXRlW10gc2VyKTsgICAgICAgIApkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NlcmlhbGl6YXRpb24vS3J5b1R1cGxlRGVzZXJpYWxpemVyLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2VyaWFsaXphdGlvbi9LcnlvVHVwbGVEZXNlcmlhbGl6ZXIuamF2YQppbmRleCA1YTVlM2E0Li4wN2I5Y2Q1IDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2VyaWFsaXphdGlvbi9LcnlvVHVwbGVEZXNlcmlhbGl6ZXIuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2VyaWFsaXphdGlvbi9LcnlvVHVwbGVEZXNlcmlhbGl6ZXIuamF2YQpAQCAtMjEsMTAgKzIxLDcgQEAKIGltcG9ydCBiYWNrdHlwZS5zdG9ybS50dXBsZS5NZXNzYWdlSWQ7CiBpbXBvcnQgYmFja3R5cGUuc3Rvcm0udHVwbGUuVHVwbGU7CiBpbXBvcnQgYmFja3R5cGUuc3Rvcm0udHVwbGUuVHVwbGVJbXBsOwotaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnV0aWxzLldyaXRhYmxlVXRpbHM7CiBpbXBvcnQgY29tLmVzb3Rlcmljc29mdHdhcmUua3J5by5pby5JbnB1dDsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRGF0YUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zZXJpYWxpemF0aW9uL0tyeW9WYWx1ZXNEZXNlcmlhbGl6ZXIuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zZXJpYWxpemF0aW9uL0tyeW9WYWx1ZXNEZXNlcmlhbGl6ZXIuamF2YQppbmRleCAyMDlhZTUzLi40MTgwNjhlIDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2VyaWFsaXphdGlvbi9LcnlvVmFsdWVzRGVzZXJpYWxpemVyLmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NlcmlhbGl6YXRpb24vS3J5b1ZhbHVlc0Rlc2VyaWFsaXplci5qYXZhCkBAIC0yMSw3ICsyMSw2IEBACiBpbXBvcnQgY29tLmVzb3Rlcmljc29mdHdhcmUua3J5by5LcnlvOwogaW1wb3J0IGNvbS5lc290ZXJpY3NvZnR3YXJlLmtyeW8uaW8uSW5wdXQ7CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKQEAgLTM1LDcgKzM0LDcgQEAKICAgICB9CiAgICAgCiAgICAgcHVibGljIExpc3Q8T2JqZWN0PiBkZXNlcmlhbGl6ZUZyb20oSW5wdXQgaW5wdXQpIHsKLSAgICAJTGlzdERlbGVnYXRlIGRlbGVnYXRlID0gKExpc3REZWxlZ2F0ZSkgX2tyeW8ucmVhZE9iamVjdChpbnB1dCwgTGlzdERlbGVnYXRlLmNsYXNzKTsKKyAgICAJTGlzdERlbGVnYXRlIGRlbGVnYXRlID0gX2tyeW8ucmVhZE9iamVjdChpbnB1dCwgTGlzdERlbGVnYXRlLmNsYXNzKTsKICAgIAlyZXR1cm4gZGVsZWdhdGUuZ2V0RGVsZWdhdGUoKTsKICAgICB9CiAgICAgCmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2VyaWFsaXphdGlvbi9TZXJpYWxpemF0aW9uRmFjdG9yeS5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3NlcmlhbGl6YXRpb24vU2VyaWFsaXphdGlvbkZhY3RvcnkuamF2YQppbmRleCA1NTQ5YjFkLi40MTdmMTAyIDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc2VyaWFsaXphdGlvbi9TZXJpYWxpemF0aW9uRmFjdG9yeS5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zZXJpYWxpemF0aW9uL1NlcmlhbGl6YXRpb25GYWN0b3J5LmphdmEKQEAgLTIxLDcgKzIxLDYgQEAKIGltcG9ydCBiYWNrdHlwZS5zdG9ybS5nZW5lcmF0ZWQuQ29tcG9uZW50Q29tbW9uOwogaW1wb3J0IGJhY2t0eXBlLnN0b3JtLmdlbmVyYXRlZC5TdG9ybVRvcG9sb2d5OwogaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnNlcmlhbGl6YXRpb24udHlwZXMuQXJyYXlMaXN0U2VyaWFsaXplcjsKLWltcG9ydCBiYWNrdHlwZS5zdG9ybS5zZXJpYWxpemF0aW9uLnR5cGVzLkxpc3REZWxlZ2F0ZVNlcmlhbGl6ZXI7CiBpbXBvcnQgYmFja3R5cGUuc3Rvcm0uc2VyaWFsaXphdGlvbi50eXBlcy5IYXNoTWFwU2VyaWFsaXplcjsKIGltcG9ydCBiYWNrdHlwZS5zdG9ybS5zZXJpYWxpemF0aW9uLnR5cGVzLkhhc2hTZXRTZXJpYWxpemVyOwogaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnRyYW5zYWN0aW9uYWwuVHJhbnNhY3Rpb25BdHRlbXB0OwpAQCAtODEsMTAgKzgwLDEwIEBACiAgICAgICAgIGtyeW9GYWN0b3J5LnByZVJlZ2lzdGVyKGssIGNvbmYpOwogCiAgICAgICAgIGJvb2xlYW4gc2tpcE1pc3NpbmcgPSAoQm9vbGVhbikgY29uZi5nZXQoQ29uZmlnLlRPUE9MT0dZX1NLSVBfTUlTU0lOR19LUllPX1JFR0lTVFJBVElPTlMpOwotICAgICAgICBmb3IoU3RyaW5nIGtsYXNzTmFtZTogcmVnaXN0cmF0aW9ucy5rZXlTZXQoKSkgewotICAgICAgICAgICAgU3RyaW5nIHNlcmlhbGl6ZXJDbGFzc05hbWUgPSByZWdpc3RyYXRpb25zLmdldChrbGFzc05hbWUpOworICAgICAgICBmb3IoTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBlbnRyeTogcmVnaXN0cmF0aW9ucy5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICBTdHJpbmcgc2VyaWFsaXplckNsYXNzTmFtZSA9IGVudHJ5LmdldFZhbHVlKCk7CiAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIENsYXNzIGtsYXNzID0gQ2xhc3MuZm9yTmFtZShrbGFzc05hbWUpOworICAgICAgICAgICAgICAgIENsYXNzIGtsYXNzID0gQ2xhc3MuZm9yTmFtZShlbnRyeS5nZXRLZXkoKSk7CiAgICAgICAgICAgICAgICAgQ2xhc3Mgc2VyaWFsaXplckNsYXNzID0gbnVsbDsKICAgICAgICAgICAgICAgICBpZihzZXJpYWxpemVyQ2xhc3NOYW1lIT1udWxsKQogICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVyQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKHNlcmlhbGl6ZXJDbGFzc05hbWUpOwpAQCAtMTMwLDE3ICsxMjksMTcgQEAKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIElkRGljdGlvbmFyeSB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIEludGVnZXI+PiBzdHJlYW1OYW1ldG9JZCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWFwPFN0cmluZywgSW50ZWdlcj4+KCk7Ci0gICAgICAgIE1hcDxTdHJpbmcsIE1hcDxJbnRlZ2VyLCBTdHJpbmc+PiBzdHJlYW1JZFRvTmFtZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWFwPEludGVnZXIsIFN0cmluZz4+KCk7CisgICAgICAgIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIEludGVnZXI+PiBzdHJlYW1OYW1ldG9JZCA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgTWFwPFN0cmluZywgTWFwPEludGVnZXIsIFN0cmluZz4+IHN0cmVhbUlkVG9OYW1lID0gbmV3IEhhc2hNYXA8PigpOwogCiAgICAgICAgIHB1YmxpYyBJZERpY3Rpb25hcnkoU3Rvcm1Ub3BvbG9neSB0b3BvbG9neSkgewotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGNvbXBvbmVudE5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KHRvcG9sb2d5LmdldF9zcG91dHMoKS5rZXlTZXQoKSk7CisgICAgICAgICAgICBMaXN0PFN0cmluZz4gY29tcG9uZW50TmFtZXMgPSBuZXcgQXJyYXlMaXN0PD4odG9wb2xvZ3kuZ2V0X3Nwb3V0cygpLmtleVNldCgpKTsKICAgICAgICAgICAgIGNvbXBvbmVudE5hbWVzLmFkZEFsbCh0b3BvbG9neS5nZXRfYm9sdHMoKS5rZXlTZXQoKSk7CiAgICAgICAgICAgICBjb21wb25lbnROYW1lcy5hZGRBbGwodG9wb2xvZ3kuZ2V0X3N0YXRlX3Nwb3V0cygpLmtleVNldCgpKTsKIAogICAgICAgICAgICAgZm9yKFN0cmluZyBuYW1lOiBjb21wb25lbnROYW1lcykgewogICAgICAgICAgICAgICAgIENvbXBvbmVudENvbW1vbiBjb21tb24gPSBVdGlscy5nZXRDb21wb25lbnRDb21tb24odG9wb2xvZ3ksIG5hbWUpOwotICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBzdHJlYW1zID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KGNvbW1vbi5nZXRfc3RyZWFtcygpLmtleVNldCgpKTsKKyAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gc3RyZWFtcyA9IG5ldyBBcnJheUxpc3Q8Pihjb21tb24uZ2V0X3N0cmVhbXMoKS5rZXlTZXQoKSk7CiAgICAgICAgICAgICAgICAgc3RyZWFtTmFtZXRvSWQucHV0KG5hbWUsIGlkaWZ5KHN0cmVhbXMpKTsKICAgICAgICAgICAgICAgICBzdHJlYW1JZFRvTmFtZS5wdXQobmFtZSwgVXRpbHMucmV2ZXJzZU1hcChzdHJlYW1OYW1ldG9JZC5nZXQobmFtZSkpKTsKICAgICAgICAgICAgIH0KQEAgLTE1Niw3ICsxNTUsNyBAQAogCiAgICAgICAgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIEludGVnZXI+IGlkaWZ5KExpc3Q8U3RyaW5nPiBuYW1lcykgewogICAgICAgICAgICAgQ29sbGVjdGlvbnMuc29ydChuYW1lcyk7Ci0gICAgICAgICAgICBNYXA8U3RyaW5nLCBJbnRlZ2VyPiByZXQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEludGVnZXI+KCk7CisgICAgICAgICAgICBNYXA8U3RyaW5nLCBJbnRlZ2VyPiByZXQgPSBuZXcgSGFzaE1hcDw+KCk7CiAgICAgICAgICAgICBpbnQgaSA9IDE7CiAgICAgICAgICAgICBmb3IoU3RyaW5nIG5hbWU6IG5hbWVzKSB7CiAgICAgICAgICAgICAgICAgcmV0LnB1dChuYW1lLCBpKTsKQEAgLTIwNCw4ICsyMDMsOCBAQAogICAgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gbm9ybWFsaXplS3J5b1JlZ2lzdGVyKE1hcCBjb25mKSB7CiAgICAgICAgIC8vIFRPRE86IGRlLWR1cGxpY2F0ZSB0aGlzIGxvZ2ljIHdpdGggdGhlIGNvZGUgaW4gbmltYnVzCiAgICAgICAgIE9iamVjdCByZXMgPSBjb25mLmdldChDb25maWcuVE9QT0xPR1lfS1JZT19SRUdJU1RFUik7Ci0gICAgICAgIGlmKHJlcz09bnVsbCkgcmV0dXJuIG5ldyBUcmVlTWFwPFN0cmluZywgU3RyaW5nPigpOwotICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHJldCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworICAgICAgICBpZihyZXM9PW51bGwpIHJldHVybiBuZXcgVHJlZU1hcDw+KCk7CisgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcmV0ID0gbmV3IEhhc2hNYXA8PigpOwogICAgICAgICBpZihyZXMgaW5zdGFuY2VvZiBNYXApIHsKICAgICAgICAgICAgIHJldCA9IChNYXA8U3RyaW5nLCBTdHJpbmc+KSByZXM7CiAgICAgICAgIH0gZWxzZSB7CkBAIC0yMTksNiArMjE4LDYgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vZW5zdXJlIGFsd2F5cyBzYW1lIG9yZGVyIGZvciByZWdpc3RyYXRpb25zIHdpdGggVHJlZU1hcAotICAgICAgICByZXR1cm4gbmV3IFRyZWVNYXA8U3RyaW5nLCBTdHJpbmc+KHJldCk7CisgICAgICAgIHJldHVybiBuZXcgVHJlZU1hcDw+KHJldCk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3Nwb3V0L011bHRpU2NoZW1lLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc3BvdXQvTXVsdGlTY2hlbWUuamF2YQppbmRleCBjYTJjZTkxLi41N2JmNGNlIDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc3BvdXQvTXVsdGlTY2hlbWUuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc3BvdXQvTXVsdGlTY2hlbWUuamF2YQpAQCAtMTcsMTIgKzE3LDEzIEBACiAgKi8KIHBhY2thZ2UgYmFja3R5cGUuc3Rvcm0uc3BvdXQ7CiAKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwogCiBpbXBvcnQgYmFja3R5cGUuc3Rvcm0udHVwbGUuRmllbGRzOwogCiBwdWJsaWMgaW50ZXJmYWNlIE11bHRpU2NoZW1lIGV4dGVuZHMgU2VyaWFsaXphYmxlIHsKLSAgcHVibGljIEl0ZXJhYmxlPExpc3Q8T2JqZWN0Pj4gZGVzZXJpYWxpemUoYnl0ZVtdIHNlcik7CisgIHB1YmxpYyBJdGVyYWJsZTxMaXN0PE9iamVjdD4+IGRlc2VyaWFsaXplKEJ5dGVCdWZmZXIgc2VyKTsKICAgcHVibGljIEZpZWxkcyBnZXRPdXRwdXRGaWVsZHMoKTsKIH0KZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zcG91dC9SYXdNdWx0aVNjaGVtZS5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3Nwb3V0L1Jhd011bHRpU2NoZW1lLmphdmEKaW5kZXggN2Y3Mzk3NS4uODI0ZDE2YyAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3Nwb3V0L1Jhd011bHRpU2NoZW1lLmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3Nwb3V0L1Jhd011bHRpU2NoZW1lLmphdmEKQEAgLTE3LDYgKzE3LDcgQEAKICAqLwogcGFja2FnZSBiYWNrdHlwZS5zdG9ybS5zcG91dDsKIAoraW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIGltcG9ydCBiYWNrdHlwZS5zdG9ybS50dXBsZS5GaWVsZHM7CkBAIC0yNyw3ICsyOCw3IEBACiAKIHB1YmxpYyBjbGFzcyBSYXdNdWx0aVNjaGVtZSBpbXBsZW1lbnRzIE11bHRpU2NoZW1lIHsKICAgQE92ZXJyaWRlCi0gIHB1YmxpYyBJdGVyYWJsZTxMaXN0PE9iamVjdD4+IGRlc2VyaWFsaXplKGJ5dGVbXSBzZXIpIHsKKyAgcHVibGljIEl0ZXJhYmxlPExpc3Q8T2JqZWN0Pj4gZGVzZXJpYWxpemUoQnl0ZUJ1ZmZlciBzZXIpIHsKICAgICByZXR1cm4gYXNMaXN0KHR1cGxlKHNlcikpOwogICB9CiAKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zcG91dC9SYXdTY2hlbWUuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zcG91dC9SYXdTY2hlbWUuamF2YQppbmRleCA3ZTI2NzcwLi45MzdhY2I3IDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc3BvdXQvUmF3U2NoZW1lLmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3Nwb3V0L1Jhd1NjaGVtZS5qYXZhCkBAIC0xOCwxMiArMTgsMTcgQEAKIHBhY2thZ2UgYmFja3R5cGUuc3Rvcm0uc3BvdXQ7CiAKIGltcG9ydCBiYWNrdHlwZS5zdG9ybS50dXBsZS5GaWVsZHM7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0udXRpbHMuVXRpbHM7CisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IHN0YXRpYyBiYWNrdHlwZS5zdG9ybS51dGlscy5VdGlscy50dXBsZTsKIAogcHVibGljIGNsYXNzIFJhd1NjaGVtZSBpbXBsZW1lbnRzIFNjaGVtZSB7Ci0gICAgcHVibGljIExpc3Q8T2JqZWN0PiBkZXNlcmlhbGl6ZShieXRlW10gc2VyKSB7Ci0gICAgICAgIHJldHVybiB0dXBsZShzZXIpOworICAgIHB1YmxpYyBMaXN0PE9iamVjdD4gZGVzZXJpYWxpemUoQnl0ZUJ1ZmZlciBzZXIpIHsKKyAgICAgICAgLy8gTWFpbnRhaW4gYmFja3dhcmQgY29tcGF0aWJpbGl0eSBmb3IgMC4xMAorICAgICAgICBieXRlW10gYiA9IFV0aWxzLnRvQnl0ZUFycmF5KHNlcik7CisgICAgICAgIHJldHVybiB0dXBsZShuZXcgT2JqZWN0W117Yn0pOwogICAgIH0KIAogICAgIHB1YmxpYyBGaWVsZHMgZ2V0T3V0cHV0RmllbGRzKCkgewpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3Nwb3V0L1NjaGVtZS5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3Nwb3V0L1NjaGVtZS5qYXZhCmluZGV4IGNhNjg5NTQuLmQ2OTZhOWMgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zcG91dC9TY2hlbWUuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc3BvdXQvU2NoZW1lLmphdmEKQEAgLTE5LDEwICsxOSwxMSBAQAogCiBpbXBvcnQgYmFja3R5cGUuc3Rvcm0udHVwbGUuRmllbGRzOwogaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKIAogcHVibGljIGludGVyZmFjZSBTY2hlbWUgZXh0ZW5kcyBTZXJpYWxpemFibGUgewotICAgIHB1YmxpYyBMaXN0PE9iamVjdD4gZGVzZXJpYWxpemUoYnl0ZVtdIHNlcik7CisgICAgTGlzdDxPYmplY3Q+IGRlc2VyaWFsaXplKEJ5dGVCdWZmZXIgc2VyKTsKICAgICBwdWJsaWMgRmllbGRzIGdldE91dHB1dEZpZWxkcygpOwogfQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3Nwb3V0L1NjaGVtZUFzTXVsdGlTY2hlbWUuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zcG91dC9TY2hlbWVBc011bHRpU2NoZW1lLmphdmEKaW5kZXggMjlmN2ZjZS4uYTQ5ZDU1ZiAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3Nwb3V0L1NjaGVtZUFzTXVsdGlTY2hlbWUuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc3BvdXQvU2NoZW1lQXNNdWx0aVNjaGVtZS5qYXZhCkBAIC0xNyw2ICsxNyw3IEBACiAgKi8KIHBhY2thZ2UgYmFja3R5cGUuc3Rvcm0uc3BvdXQ7CiAKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiAKQEAgLTI5LDcgKzMwLDcgQEAKICAgICB0aGlzLnNjaGVtZSA9IHNjaGVtZTsKICAgfQogCi0gIEBPdmVycmlkZSBwdWJsaWMgSXRlcmFibGU8TGlzdDxPYmplY3Q+PiBkZXNlcmlhbGl6ZShmaW5hbCBieXRlW10gc2VyKSB7CisgIEBPdmVycmlkZSBwdWJsaWMgSXRlcmFibGU8TGlzdDxPYmplY3Q+PiBkZXNlcmlhbGl6ZShmaW5hbCBCeXRlQnVmZmVyIHNlcikgewogICAgIExpc3Q8T2JqZWN0PiBvID0gc2NoZW1lLmRlc2VyaWFsaXplKHNlcik7CiAgICAgaWYobyA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgICBlbHNlIHJldHVybiBBcnJheXMuYXNMaXN0KG8pOwpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3Nwb3V0L1NoZWxsU3BvdXQuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS9zcG91dC9TaGVsbFNwb3V0LmphdmEKaW5kZXggYTY5YjliMi4uYmZkZmU2NyAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3Nwb3V0L1NoZWxsU3BvdXQuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vc3BvdXQvU2hlbGxTcG91dC5qYXZhCkBAIC00MSwxMSArNDEsMTEgQEAKIAogCiBwdWJsaWMgY2xhc3MgU2hlbGxTcG91dCBpbXBsZW1lbnRzIElTcG91dCB7Ci0gICAgcHVibGljIHN0YXRpYyBMb2dnZXIgTE9HID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoU2hlbGxTcG91dC5jbGFzcyk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoU2hlbGxTcG91dC5jbGFzcyk7CiAKICAgICBwcml2YXRlIFNwb3V0T3V0cHV0Q29sbGVjdG9yIF9jb2xsZWN0b3I7CiAgICAgcHJpdmF0ZSBTdHJpbmdbXSBfY29tbWFuZDsKLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gZW52ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IGVudiA9IG5ldyBIYXNoTWFwPD4oKTsKICAgICBwcml2YXRlIFNoZWxsUHJvY2VzcyBfcHJvY2VzczsKICAgICAKICAgICBwcml2YXRlIFRvcG9sb2d5Q29udGV4dCBfY29udGV4dDsKQEAgLTc0LDcgKzc0LDExIEBACiAgICAgICAgIF9jb2xsZWN0b3IgPSBjb2xsZWN0b3I7CiAgICAgICAgIF9jb250ZXh0ID0gY29udGV4dDsKIAotICAgICAgICB3b3JrZXJUaW1lb3V0TWlsbHMgPSAxMDAwICogUlQuaW50Q2FzdChzdG9ybUNvbmYuZ2V0KENvbmZpZy5TVVBFUlZJU09SX1dPUktFUl9USU1FT1VUX1NFQ1MpKTsKKyAgICAgICAgaWYgKHN0b3JtQ29uZi5jb250YWluc0tleShDb25maWcuVE9QT0xPR1lfU1VCUFJPQ0VTU19USU1FT1VUX1NFQ1MpKSB7CisgICAgICAgICAgICB3b3JrZXJUaW1lb3V0TWlsbHMgPSAxMDAwICogUlQuaW50Q2FzdChzdG9ybUNvbmYuZ2V0KENvbmZpZy5UT1BPTE9HWV9TVUJQUk9DRVNTX1RJTUVPVVRfU0VDUykpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgd29ya2VyVGltZW91dE1pbGxzID0gMTAwMCAqIFJULmludENhc3Qoc3Rvcm1Db25mLmdldChDb25maWcuU1VQRVJWSVNPUl9XT1JLRVJfVElNRU9VVF9TRUNTKSk7CisgICAgICAgIH0KIAogICAgICAgICBfcHJvY2VzcyA9IG5ldyBTaGVsbFByb2Nlc3MoX2NvbW1hbmQpOwogICAgICAgICBpZiAoIWVudi5pc0VtcHR5KCkpIHsKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS90YXNrL0dlbmVyYWxUb3BvbG9neUNvbnRleHQuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS90YXNrL0dlbmVyYWxUb3BvbG9neUNvbnRleHQuamF2YQppbmRleCA1MzE0MWIxLi4xMWJkYzE5IDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vdGFzay9HZW5lcmFsVG9wb2xvZ3lDb250ZXh0LmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3Rhc2svR2VuZXJhbFRvcG9sb2d5Q29udGV4dC5qYXZhCkBAIC0xMDAsOCArMTAwLDggQEAKICAgICAgKi8KICAgICBwdWJsaWMgTGlzdDxJbnRlZ2VyPiBnZXRDb21wb25lbnRUYXNrcyhTdHJpbmcgY29tcG9uZW50SWQpIHsKICAgICAgICAgTGlzdDxJbnRlZ2VyPiByZXQgPSBfY29tcG9uZW50VG9UYXNrcy5nZXQoY29tcG9uZW50SWQpOwotICAgICAgICBpZihyZXQ9PW51bGwpIHJldHVybiBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7Ci0gICAgICAgIGVsc2UgcmV0dXJuIG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4ocmV0KTsKKyAgICAgICAgaWYocmV0PT1udWxsKSByZXR1cm4gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGVsc2UgcmV0dXJuIG5ldyBBcnJheUxpc3Q8PihyZXQpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTM4LDE0ICsxMzgsMTUgQEAKICAgICAgKiBAcmV0dXJuIE1hcCBmcm9tIHN0cmVhbSBpZCB0byBjb21wb25lbnQgaWQgdG8gdGhlIEdyb3VwaW5nIHVzZWQuCiAgICAgICovCiAgICAgcHVibGljIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIEdyb3VwaW5nPj4gZ2V0VGFyZ2V0cyhTdHJpbmcgY29tcG9uZW50SWQpIHsKLSAgICAgICAgTWFwPFN0cmluZywgTWFwPFN0cmluZywgR3JvdXBpbmc+PiByZXQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIEdyb3VwaW5nPj4oKTsKKyAgICAgICAgTWFwPFN0cmluZywgTWFwPFN0cmluZywgR3JvdXBpbmc+PiByZXQgPSBuZXcgSGFzaE1hcDw+KCk7CiAgICAgICAgIGZvcihTdHJpbmcgb3RoZXJDb21wb25lbnRJZDogZ2V0Q29tcG9uZW50SWRzKCkpIHsKICAgICAgICAgICAgIE1hcDxHbG9iYWxTdHJlYW1JZCwgR3JvdXBpbmc+IGlucHV0cyA9IGdldENvbXBvbmVudENvbW1vbihvdGhlckNvbXBvbmVudElkKS5nZXRfaW5wdXRzKCk7Ci0gICAgICAgICAgICBmb3IoR2xvYmFsU3RyZWFtSWQgaWQ6IGlucHV0cy5rZXlTZXQoKSkgeworICAgICAgICAgICAgZm9yKE1hcC5FbnRyeTxHbG9iYWxTdHJlYW1JZCwgR3JvdXBpbmc+IGVudHJ5OiBpbnB1dHMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgICAgIEdsb2JhbFN0cmVhbUlkIGlkID0gZW50cnkuZ2V0S2V5KCk7CiAgICAgICAgICAgICAgICAgaWYoaWQuZ2V0X2NvbXBvbmVudElkKCkuZXF1YWxzKGNvbXBvbmVudElkKSkgewogICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBHcm91cGluZz4gY3VyciA9IHJldC5nZXQoaWQuZ2V0X3N0cmVhbUlkKCkpOwotICAgICAgICAgICAgICAgICAgICBpZihjdXJyPT1udWxsKSBjdXJyID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBHcm91cGluZz4oKTsKLSAgICAgICAgICAgICAgICAgICAgY3Vyci5wdXQob3RoZXJDb21wb25lbnRJZCwgaW5wdXRzLmdldChpZCkpOworICAgICAgICAgICAgICAgICAgICBpZihjdXJyPT1udWxsKSBjdXJyID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICAgICAgICAgICAgICBjdXJyLnB1dChvdGhlckNvbXBvbmVudElkLCBlbnRyeS5nZXRWYWx1ZSgpKTsKICAgICAgICAgICAgICAgICAgICAgcmV0LnB1dChpZC5nZXRfc3RyZWFtSWQoKSwgY3Vycik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMTk1LDQgKzE5Niw0IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG1heDsKICAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3Rhc2svT3V0cHV0Q29sbGVjdG9yLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vdGFzay9PdXRwdXRDb2xsZWN0b3IuamF2YQppbmRleCA2MjBkMzNkLi4wMjE0ZWFhIDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vdGFzay9PdXRwdXRDb2xsZWN0b3IuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vdGFzay9PdXRwdXRDb2xsZWN0b3IuamF2YQpAQCAtMTE1LDcgKzExNSw3IEBACiAgICAgICogQHBhcmFtIHR1cGxlIHRoZSBuZXcgb3V0cHV0IHR1cGxlIGZyb20gdGhpcyBib2x0CiAgICAgICovCiAgICAgcHVibGljIHZvaWQgZW1pdERpcmVjdChpbnQgdGFza0lkLCBTdHJpbmcgc3RyZWFtSWQsIFR1cGxlIGFuY2hvciwgTGlzdDxPYmplY3Q+IHR1cGxlKSB7Ci0gICAgICAgIGVtaXREaXJlY3QodGFza0lkLCBzdHJlYW1JZCwgQXJyYXlzLmFzTGlzdChhbmNob3IpLCB0dXBsZSk7CisgICAgICAgIGVtaXREaXJlY3QodGFza0lkLCBzdHJlYW1JZCwgYW5jaG9yID09IG51bGwgPyAoTGlzdCkgbnVsbCA6IEFycmF5cy5hc0xpc3QoYW5jaG9yKSwgdHVwbGUpOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3Rhc2svU2hlbGxCb2x0LmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vdGFzay9TaGVsbEJvbHQuamF2YQppbmRleCA0NGI4ZTQ4Li4wMTAzNzE1IDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vdGFzay9TaGVsbEJvbHQuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vdGFzay9TaGVsbEJvbHQuamF2YQpAQCAtNjgsMTMgKzY4LDEyIEBACiAgKi8KIHB1YmxpYyBjbGFzcyBTaGVsbEJvbHQgaW1wbGVtZW50cyBJQm9sdCB7CiAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBUlRCRUFUX1NUUkVBTV9JRCA9ICJfX2hlYXJ0YmVhdCI7Ci0gICAgcHVibGljIHN0YXRpYyBMb2dnZXIgTE9HID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoU2hlbGxCb2x0LmNsYXNzKTsKLSAgICBQcm9jZXNzIF9zdWJwcm9jZXNzOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFNoZWxsQm9sdC5jbGFzcyk7CiAgICAgT3V0cHV0Q29sbGVjdG9yIF9jb2xsZWN0b3I7Ci0gICAgTWFwPFN0cmluZywgVHVwbGU+IF9pbnB1dHMgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8U3RyaW5nLCBUdXBsZT4oKTsKKyAgICBNYXA8U3RyaW5nLCBUdXBsZT4gX2lucHV0cyA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDw+KCk7CiAKICAgICBwcml2YXRlIFN0cmluZ1tdIF9jb21tYW5kOwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBlbnYgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gZW52ID0gbmV3IEhhc2hNYXA8PigpOwogICAgIHByaXZhdGUgU2hlbGxQcm9jZXNzIF9wcm9jZXNzOwogICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBfcnVubmluZyA9IHRydWU7CiAgICAgcHJpdmF0ZSB2b2xhdGlsZSBUaHJvd2FibGUgX2V4Y2VwdGlvbjsKQEAgLTExNSw3ICsxMTQsMTEgQEAKIAogICAgICAgICBfY29udGV4dCA9IGNvbnRleHQ7CiAKLSAgICAgICAgd29ya2VyVGltZW91dE1pbGxzID0gMTAwMCAqIFJULmludENhc3Qoc3Rvcm1Db25mLmdldChDb25maWcuU1VQRVJWSVNPUl9XT1JLRVJfVElNRU9VVF9TRUNTKSk7CisgICAgICAgIGlmIChzdG9ybUNvbmYuY29udGFpbnNLZXkoQ29uZmlnLlRPUE9MT0dZX1NVQlBST0NFU1NfVElNRU9VVF9TRUNTKSkgeworICAgICAgICAgICAgd29ya2VyVGltZW91dE1pbGxzID0gMTAwMCAqIFJULmludENhc3Qoc3Rvcm1Db25mLmdldChDb25maWcuVE9QT0xPR1lfU1VCUFJPQ0VTU19USU1FT1VUX1NFQ1MpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHdvcmtlclRpbWVvdXRNaWxscyA9IDEwMDAgKiBSVC5pbnRDYXN0KHN0b3JtQ29uZi5nZXQoQ29uZmlnLlNVUEVSVklTT1JfV09SS0VSX1RJTUVPVVRfU0VDUykpOworICAgICAgICB9CiAKICAgICAgICAgX3Byb2Nlc3MgPSBuZXcgU2hlbGxQcm9jZXNzKF9jb21tYW5kKTsKICAgICAgICAgaWYgKCFlbnYuaXNFbXB0eSgpKSB7CkBAIC0xOTgsNyArMjAxLDcgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgaGFuZGxlRW1pdChTaGVsbE1zZyBzaGVsbE1zZykgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgTGlzdDxUdXBsZT4gYW5jaG9ycyA9IG5ldyBBcnJheUxpc3Q8VHVwbGU+KCk7CisgICAgICAgIExpc3Q8VHVwbGU+IGFuY2hvcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgICAgTGlzdDxTdHJpbmc+IHJlY3ZBbmNob3JzID0gc2hlbGxNc2cuZ2V0QW5jaG9ycygpOwogICAgICAgICBpZiAocmVjdkFuY2hvcnMgIT0gbnVsbCkgewogICAgICAgICAgICAgZm9yIChTdHJpbmcgYW5jaG9yIDogcmVjdkFuY2hvcnMpIHsKQEAgLTMzNywxOCArMzQwLDI1IEBACiAgICAgICAgICAgICAgICAgICAgIHNldEhlYXJ0YmVhdCgpOwogCiAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IG5lZWQgdG8gdGFrZSBjYXJlIG9mIHN5bmMsIGNhdXNlIHdlJ3JlIGFsd2F5cyB1cGRhdGluZyBoZWFydGJlYXQKLSAgICAgICAgICAgICAgICAgICAgaWYoY29tbWFuZC5lcXVhbHMoImFjayIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVBY2soc2hlbGxNc2cuZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29tbWFuZC5lcXVhbHMoImZhaWwiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlRmFpbChzaGVsbE1zZy5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb21tYW5kLmVxdWFscygiZXJyb3IiKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlRXJyb3Ioc2hlbGxNc2cuZ2V0TXNnKCkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbW1hbmQuZXF1YWxzKCJsb2ciKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlTG9nKHNoZWxsTXNnKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb21tYW5kLmVxdWFscygiZW1pdCIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVFbWl0KHNoZWxsTXNnKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb21tYW5kLmVxdWFscygibWV0cmljcyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVNZXRyaWNzKHNoZWxsTXNnKTsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChjb21tYW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJhY2siOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUFjayhzaGVsbE1zZy5nZXRJZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgImZhaWwiOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUZhaWwoc2hlbGxNc2cuZ2V0SWQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJlcnJvciI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlRXJyb3Ioc2hlbGxNc2cuZ2V0TXNnKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAibG9nIjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVMb2coc2hlbGxNc2cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAiZW1pdCI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlRW1pdChzaGVsbE1zZyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICJtZXRyaWNzIjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVNZXRyaWNzKHNoZWxsTXNnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgewpAQCAtMzkwLDcgKzQwMCw3IEBACiAgICAgICAgICAgICBtc2cuc2V0SWQoZ2VuSWQpOwogICAgICAgICAgICAgbXNnLnNldFRhc2soQ29uc3RhbnRzLlNZU1RFTV9UQVNLX0lEKTsKICAgICAgICAgICAgIG1zZy5zZXRTdHJlYW0oSEVBUlRCRUFUX1NUUkVBTV9JRCk7Ci0gICAgICAgICAgICBtc2cuc2V0VHVwbGUobmV3IEFycmF5TGlzdDxPYmplY3Q+KCkpOworICAgICAgICAgICAgbXNnLnNldFR1cGxlKG5ldyBBcnJheUxpc3Q8PigpKTsKICAgICAgICAgICAgIHJldHVybiBtc2c7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vdGFzay9Ub3BvbG9neUNvbnRleHQuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS90YXNrL1RvcG9sb2d5Q29udGV4dC5qYXZhCmluZGV4IGNlZmEyMDcuLmU5Y2RiNWIgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS90YXNrL1RvcG9sb2d5Q29udGV4dC5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS90YXNrL1RvcG9sb2d5Q29udGV4dC5qYXZhCkBAIC01MSw4ICs1MSw4IEBACiAgKi8KIHB1YmxpYyBjbGFzcyBUb3BvbG9neUNvbnRleHQgZXh0ZW5kcyBXb3JrZXJUb3BvbG9neUNvbnRleHQgaW1wbGVtZW50cyBJTWV0cmljc0NvbnRleHQgewogICAgIHByaXZhdGUgSW50ZWdlciBfdGFza0lkOwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiBfdGFza0RhdGEgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLSAgICBwcml2YXRlIExpc3Q8SVRhc2tIb29rPiBfaG9va3MgPSBuZXcgQXJyYXlMaXN0PElUYXNrSG9vaz4oKTsKKyAgICBwcml2YXRlIE1hcDxTdHJpbmcsIE9iamVjdD4gX3Rhc2tEYXRhID0gbmV3IEhhc2hNYXA8PigpOworICAgIHByaXZhdGUgTGlzdDxJVGFza0hvb2s+IF9ob29rcyA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgIHByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiBfZXhlY3V0b3JEYXRhOwogICAgIHByaXZhdGUgTWFwPEludGVnZXIsTWFwPEludGVnZXIsIE1hcDxTdHJpbmcsIElNZXRyaWM+Pj4gX3JlZ2lzdGVyZWRNZXRyaWNzOwogICAgIHByaXZhdGUgY2xvanVyZS5sYW5nLkF0b20gX29wZW5PclByZXBhcmVXYXNDYWxsZWQ7CkBAIC0xMzksOSArMTM5LDggQEAKICAgICB9CiAKICAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBjb21wb25lbnQgaWQgZm9yIHRoaXMgdGFzay4gVGhlIGNvbXBvbmVudCBpZCBtYXBzCisgICAgICogQHJldHVybiB0aGUgY29tcG9uZW50IGlkIGZvciB0aGlzIHRhc2suIFRoZSBjb21wb25lbnQgaWQgbWFwcwogICAgICAqIHRvIGEgY29tcG9uZW50IGlkIHNwZWNpZmllZCBmb3IgYSBTcG91dCBvciBCb2x0IGluIHRoZSB0b3BvbG9neSBkZWZpbml0aW9uLgotICAgICAqIEByZXR1cm4KICAgICAgKi8KICAgICBwdWJsaWMgU3RyaW5nIGdldFRoaXNDb21wb25lbnRJZCgpIHsKICAgICAgICAgcmV0dXJuIGdldENvbXBvbmVudElkKF90YXNrSWQpOwpAQCAtMzA4LDcgKzMwNyw3IEBACiAgICAgICogQHJldHVybiBUaGUgSU1ldHJpYyBhcmd1bWVudCB1bmNoYW5nZWQuCiAgICAgICovCiAgICAgcHVibGljIDxUIGV4dGVuZHMgSU1ldHJpYz4gVCByZWdpc3Rlck1ldHJpYyhTdHJpbmcgbmFtZSwgVCBtZXRyaWMsIGludCB0aW1lQnVja2V0U2l6ZUluU2VjcykgewotICAgICAgICBpZigoQm9vbGVhbilfb3Blbk9yUHJlcGFyZVdhc0NhbGxlZC5kZXJlZigpID09IHRydWUpIHsKKyAgICAgICAgaWYoKEJvb2xlYW4pIF9vcGVuT3JQcmVwYXJlV2FzQ2FsbGVkLmRlcmVmKCkpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUb3BvbG9neUNvbnRleHQucmVnaXN0ZXJNZXRyaWMgY2FuIG9ubHkgYmUgY2FsbGVkIGZyb20gd2l0aGluIG92ZXJyaWRkZW4gIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSUJvbHQ6OnByZXBhcmUoKSBvciBJU3BvdXQ6Om9wZW4oKSBtZXRob2QuIik7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS90ZXN0aW5nL0FsdGVybmF0ZVJhY2tETlNUb1N3aXRjaE1hcHBpbmcuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS90ZXN0aW5nL0FsdGVybmF0ZVJhY2tETlNUb1N3aXRjaE1hcHBpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODg1MDU2Ci0tLSAvZGV2L251bGwKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3Rlc3RpbmcvQWx0ZXJuYXRlUmFja0ROU1RvU3dpdGNoTWFwcGluZy5qYXZhCkBAIC0wLDAgKzEsNjUgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGJhY2t0eXBlLnN0b3JtLnRlc3Rpbmc7CisKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5uZXR3b3JrdG9wb2dyYXBoeS5BYnN0cmFjdEROU1RvU3dpdGNoTWFwcGluZzsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5uZXR3b3JrdG9wb2dyYXBoeS5ETlNUb1N3aXRjaE1hcHBpbmc7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwOworCisvKioKKyAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUge0BsaW5rIEROU1RvU3dpdGNoTWFwcGluZ30gaW50ZXJmYWNlCisgKiAgICBJdCBhbHRlcm5hdGVzIGJld3RlZW4gUkFDSzEgYW5kIFJBQ0syIGZvciB0aGUgaG9zdHMuCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBBbHRlcm5hdGVSYWNrRE5TVG9Td2l0Y2hNYXBwaW5nIGV4dGVuZHMgQWJzdHJhY3RETlNUb1N3aXRjaE1hcHBpbmcgeworCisgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBtYXBwaW5nQ2FjaGUgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisKKyAgQE92ZXJyaWRlCisgIHB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IHJlc29sdmUoTGlzdDxTdHJpbmc+IG5hbWVzKSB7CisgICAgVHJlZVNldDxTdHJpbmc+IHNvcnRlZE5hbWVzID0gbmV3IFRyZWVTZXQ8U3RyaW5nPihuYW1lcyk7CisgICAgTWFwIDxTdHJpbmcsIFN0cmluZz4gbSA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworICAgIGlmIChuYW1lcy5pc0VtcHR5KCkpIHsKKyAgICAgIC8vbmFtZSBsaXN0IGlzIGVtcHR5LCByZXR1cm4gYW4gZW1wdHkgbWFwCisgICAgICByZXR1cm4gbTsKKyAgICB9CisKKyAgICBCb29sZWFuIG9kZCA9IHRydWU7CisgICAgZm9yIChTdHJpbmcgbmFtZSA6IHNvcnRlZE5hbWVzKSB7CisgICAgICBpZiAob2RkKSB7CisgICAgICAgIG0ucHV0KG5hbWUsICJSQUNLMSIpOworICAgICAgICBtYXBwaW5nQ2FjaGUucHV0KG5hbWUsICJSQUNLMSIpOworICAgICAgICBvZGQgPSBmYWxzZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIG0ucHV0KG5hbWUsICJSQUNLMiIpOworICAgICAgICBtYXBwaW5nQ2FjaGUucHV0KG5hbWUsICJSQUNLMiIpOworICAgICAgICBvZGQgPSB0cnVlOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbTsKKyAgfQorCisgIEBPdmVycmlkZQorICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgIHJldHVybiAiZGVmYXVsdFJhY2tETlNUb1N3aXRjaE1hcHBpbmcgKCIgKyBtYXBwaW5nQ2FjaGUuc2l6ZSgpICsgIiBtYXBwaW5ncyBjYWNoZWQpIjsKKyAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS90ZXN0aW5nL01lbW9yeVRyYW5zYWN0aW9uYWxTcG91dC5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3Rlc3RpbmcvTWVtb3J5VHJhbnNhY3Rpb25hbFNwb3V0LmphdmEKaW5kZXggM2I0OTJlMS4uZmFjYTc3ZCAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3Rlc3RpbmcvTWVtb3J5VHJhbnNhY3Rpb25hbFNwb3V0LmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3Rlc3RpbmcvTWVtb3J5VHJhbnNhY3Rpb25hbFNwb3V0LmphdmEKQEAgLTIzLDcgKzIzLDYgQEAKIGltcG9ydCBiYWNrdHlwZS5zdG9ybS50cmFuc2FjdGlvbmFsLlRyYW5zYWN0aW9uQXR0ZW1wdDsKIGltcG9ydCBiYWNrdHlwZS5zdG9ybS5jb29yZGluYXRpb24uQmF0Y2hPdXRwdXRDb2xsZWN0b3I7CiBpbXBvcnQgYmFja3R5cGUuc3Rvcm0udHJhbnNhY3Rpb25hbC5wYXJ0aXRpb25lZC5JUGFydGl0aW9uZWRUcmFuc2FjdGlvbmFsU3BvdXQ7Ci1pbXBvcnQgYmFja3R5cGUuc3Rvcm0udHJhbnNhY3Rpb25hbC5wYXJ0aXRpb25lZC5JUGFydGl0aW9uZWRUcmFuc2FjdGlvbmFsU3BvdXQuRW1pdHRlcjsKIGltcG9ydCBiYWNrdHlwZS5zdG9ybS50dXBsZS5GaWVsZHM7CiBpbXBvcnQgYmFja3R5cGUuc3Rvcm0udXRpbHMuUmVnaXN0ZXJlZEdsb2JhbFN0YXRlOwogaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnV0aWxzLlV0aWxzOwpAQCAtMzQsNyArMzMsNyBAQAogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIHB1YmxpYyBjbGFzcyBNZW1vcnlUcmFuc2FjdGlvbmFsU3BvdXQgaW1wbGVtZW50cyBJUGFydGl0aW9uZWRUcmFuc2FjdGlvbmFsU3BvdXQ8TWVtb3J5VHJhbnNhY3Rpb25hbFNwb3V0TWV0YT4gewotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIFRYX0ZJRUxEID0gTWVtb3J5VHJhbnNhY3Rpb25hbFNwb3V0LmNsYXNzLmdldE5hbWUoKSArICIvaWQiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRYX0ZJRUxEID0gTWVtb3J5VHJhbnNhY3Rpb25hbFNwb3V0LmNsYXNzLmdldE5hbWUoKSArICIvaWQiOwogICAgIAogICAgIHByaXZhdGUgU3RyaW5nIF9pZDsKICAgICBwcml2YXRlIFN0cmluZyBfZmluaXNoZWRQYXJ0aXRpb25zSWQ7CkBAIC04MSw3ICs4MCw3IEBACiAgICAgY2xhc3MgRW1pdHRlciBpbXBsZW1lbnRzIElQYXJ0aXRpb25lZFRyYW5zYWN0aW9uYWxTcG91dC5FbWl0dGVyPE1lbW9yeVRyYW5zYWN0aW9uYWxTcG91dE1ldGE+IHsKICAgICAgICAgCiAgICAgICAgIEludGVnZXIgX21heFNwb3V0UGVuZGluZzsKLSAgICAgICAgTWFwPEludGVnZXIsIEludGVnZXI+IF9lbXB0eVBhcnRpdGlvbnMgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPigpOworICAgICAgICBNYXA8SW50ZWdlciwgSW50ZWdlcj4gX2VtcHR5UGFydGl0aW9ucyA9IG5ldyBIYXNoTWFwPD4oKTsKICAgICAgICAgCiAgICAgICAgIHB1YmxpYyBFbWl0dGVyKE1hcCBjb25mKSB7CiAgICAgICAgICAgICBPYmplY3QgYyA9IGNvbmYuZ2V0KENvbmZpZy5UT1BPTE9HWV9NQVhfU1BPVVRfUEVORElORyk7CkBAIC0xMjUsNyArMTI0LDcgQEAKICAgICAgICAgcHVibGljIHZvaWQgZW1pdFBhcnRpdGlvbkJhdGNoKFRyYW5zYWN0aW9uQXR0ZW1wdCB0eCwgQmF0Y2hPdXRwdXRDb2xsZWN0b3IgY29sbGVjdG9yLCBpbnQgcGFydGl0aW9uLCBNZW1vcnlUcmFuc2FjdGlvbmFsU3BvdXRNZXRhIHBhcnRpdGlvbk1ldGEpIHsKICAgICAgICAgICAgIExpc3Q8TGlzdDxPYmplY3Q+PiBxdWV1ZSA9IGdldFF1ZXVlcygpLmdldChwYXJ0aXRpb24pOwogICAgICAgICAgICAgZm9yKGludCBpPXBhcnRpdGlvbk1ldGEuaW5kZXg7IGkgPCBwYXJ0aXRpb25NZXRhLmluZGV4ICsgcGFydGl0aW9uTWV0YS5hbXQ7IGkrKykgewotICAgICAgICAgICAgICAgIExpc3Q8T2JqZWN0PiB0b0VtaXQgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4ocXVldWUuZ2V0KGkpKTsKKyAgICAgICAgICAgICAgICBMaXN0PE9iamVjdD4gdG9FbWl0ID0gbmV3IEFycmF5TGlzdDw+KHF1ZXVlLmdldChpKSk7CiAgICAgICAgICAgICAgICAgdG9FbWl0LmFkZCgwLCB0eCk7CiAgICAgICAgICAgICAgICAgY29sbGVjdG9yLmVtaXQodG9FbWl0KTsgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICB9CkBAIC0xNDgsNyArMTQ3LDcgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGRlY2xhcmVPdXRwdXRGaWVsZHMoT3V0cHV0RmllbGRzRGVjbGFyZXIgZGVjbGFyZXIpIHsKLSAgICAgICAgTGlzdDxTdHJpbmc+IHRvRGVjbGFyZSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihfb3V0RmllbGRzLnRvTGlzdCgpKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IHRvRGVjbGFyZSA9IG5ldyBBcnJheUxpc3Q8Pihfb3V0RmllbGRzLnRvTGlzdCgpKTsKICAgICAgICAgdG9EZWNsYXJlLmFkZCgwLCBUWF9GSUVMRCk7CiAgICAgICAgIGRlY2xhcmVyLmRlY2xhcmUobmV3IEZpZWxkcyh0b0RlY2xhcmUpKTsKICAgICB9CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vdGVzdGluZy9PcGFxdWVNZW1vcnlUcmFuc2FjdGlvbmFsU3BvdXQuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS90ZXN0aW5nL09wYXF1ZU1lbW9yeVRyYW5zYWN0aW9uYWxTcG91dC5qYXZhCmluZGV4IDAxNTEzOTIuLjg3NmJmNTEgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS90ZXN0aW5nL09wYXF1ZU1lbW9yeVRyYW5zYWN0aW9uYWxTcG91dC5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS90ZXN0aW5nL09wYXF1ZU1lbW9yeVRyYW5zYWN0aW9uYWxTcG91dC5qYXZhCkBAIC0zNiw3ICszNiw3IEBACiAgKiBUaGlzIHNwb3V0IG9ubHkgd29ya3MgaW4gbG9jYWwgbW9kZS4KICAqLwogcHVibGljIGNsYXNzIE9wYXF1ZU1lbW9yeVRyYW5zYWN0aW9uYWxTcG91dCBpbXBsZW1lbnRzIElPcGFxdWVQYXJ0aXRpb25lZFRyYW5zYWN0aW9uYWxTcG91dDxNZW1vcnlUcmFuc2FjdGlvbmFsU3BvdXRNZXRhPiB7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgVFhfRklFTEQgPSBNZW1vcnlUcmFuc2FjdGlvbmFsU3BvdXQuY2xhc3MuZ2V0TmFtZSgpICsgIi9pZCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFhfRklFTEQgPSBNZW1vcnlUcmFuc2FjdGlvbmFsU3BvdXQuY2xhc3MuZ2V0TmFtZSgpICsgIi9pZCI7CiAgICAgCiAgICAgcHJpdmF0ZSBTdHJpbmcgX2lkOwogICAgIHByaXZhdGUgU3RyaW5nIF9maW5pc2hlZFBhcnRpdGlvbnNJZDsKQEAgLTk1LDcgKzk1LDcgQEAKICAgICBjbGFzcyBFbWl0dGVyIGltcGxlbWVudHMgSU9wYXF1ZVBhcnRpdGlvbmVkVHJhbnNhY3Rpb25hbFNwb3V0LkVtaXR0ZXI8TWVtb3J5VHJhbnNhY3Rpb25hbFNwb3V0TWV0YT4gewogICAgICAgICAKICAgICAgICAgSW50ZWdlciBfbWF4U3BvdXRQZW5kaW5nOwotICAgICAgICBNYXA8SW50ZWdlciwgSW50ZWdlcj4gX2VtcHR5UGFydGl0aW9ucyA9IG5ldyBIYXNoTWFwPEludGVnZXIsIEludGVnZXI+KCk7CisgICAgICAgIE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiBfZW1wdHlQYXJ0aXRpb25zID0gbmV3IEhhc2hNYXA8PigpOwogICAgICAgICAKICAgICAgICAgcHVibGljIEVtaXR0ZXIoTWFwIGNvbmYpIHsKICAgICAgICAgICAgIE9iamVjdCBjID0gY29uZi5nZXQoQ29uZmlnLlRPUE9MT0dZX01BWF9TUE9VVF9QRU5ESU5HKTsKQEAgLTEyMCw3ICsxMjAsNyBAQAogCiAgICAgICAgICAgICAgICAgTWVtb3J5VHJhbnNhY3Rpb25hbFNwb3V0TWV0YSByZXQgPSBuZXcgTWVtb3J5VHJhbnNhY3Rpb25hbFNwb3V0TWV0YShpbmRleCwgdG9UYWtlKTsKICAgICAgICAgICAgICAgICBmb3IoaW50IGk9cmV0LmluZGV4OyBpIDwgcmV0LmluZGV4ICsgcmV0LmFtdDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIExpc3Q8T2JqZWN0PiB0b0VtaXQgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4ocXVldWUuZ2V0KGkpKTsKKyAgICAgICAgICAgICAgICAgICAgTGlzdDxPYmplY3Q+IHRvRW1pdCA9IG5ldyBBcnJheUxpc3Q8PihxdWV1ZS5nZXQoaSkpOwogICAgICAgICAgICAgICAgICAgICB0b0VtaXQuYWRkKDAsIHR4KTsKICAgICAgICAgICAgICAgICAgICAgY29sbGVjdG9yLmVtaXQodG9FbWl0KTsgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgfQpAQCAtMTUxLDcgKzE1MSw3IEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBkZWNsYXJlT3V0cHV0RmllbGRzKE91dHB1dEZpZWxkc0RlY2xhcmVyIGRlY2xhcmVyKSB7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiB0b0RlY2xhcmUgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oX291dEZpZWxkcy50b0xpc3QoKSk7CisgICAgICAgIExpc3Q8U3RyaW5nPiB0b0RlY2xhcmUgPSBuZXcgQXJyYXlMaXN0PD4oX291dEZpZWxkcy50b0xpc3QoKSk7CiAgICAgICAgIHRvRGVjbGFyZS5hZGQoMCwgVFhfRklFTEQpOwogICAgICAgICBkZWNsYXJlci5kZWNsYXJlKG5ldyBGaWVsZHModG9EZWNsYXJlKSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3Rlc3RpbmcvVHVwbGVDYXB0dXJlQm9sdC5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3Rlc3RpbmcvVHVwbGVDYXB0dXJlQm9sdC5qYXZhCmluZGV4IGUxNjM1NzYuLmIwODVjNTQgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS90ZXN0aW5nL1R1cGxlQ2FwdHVyZUJvbHQuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vdGVzdGluZy9UdXBsZUNhcHR1cmVCb2x0LmphdmEKQEAgLTMwLDcgKzMwLDcgQEAKIAogCiBwdWJsaWMgY2xhc3MgVHVwbGVDYXB0dXJlQm9sdCBpbXBsZW1lbnRzIElSaWNoQm9sdCB7Ci0gICAgcHVibGljIHN0YXRpYyB0cmFuc2llbnQgTWFwPFN0cmluZywgTWFwPFN0cmluZywgTGlzdDxGaXhlZFR1cGxlPj4+IGVtaXR0ZWRfdHVwbGVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBMaXN0PEZpeGVkVHVwbGU+Pj4oKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIHRyYW5zaWVudCBNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBMaXN0PEZpeGVkVHVwbGU+Pj4gZW1pdHRlZF90dXBsZXMgPSBuZXcgSGFzaE1hcDw+KCk7CiAKICAgICBwcml2YXRlIFN0cmluZyBfbmFtZTsKICAgICBwcml2YXRlIE91dHB1dENvbGxlY3RvciBfY29sbGVjdG9yOwpAQCAtNjYsNyArNjYsNyBAQAogICAgIH0KIAogICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBMaXN0PEZpeGVkVHVwbGU+PiBnZXRBbmRDbGVhclJlc3VsdHMoKSB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIExpc3Q8Rml4ZWRUdXBsZT4+IHJldCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdDxGaXhlZFR1cGxlPj4oZW1pdHRlZF90dXBsZXMuZ2V0KF9uYW1lKSk7CisgICAgICAgIE1hcDxTdHJpbmcsIExpc3Q8Rml4ZWRUdXBsZT4+IHJldCA9IG5ldyBIYXNoTWFwPD4oZW1pdHRlZF90dXBsZXMuZ2V0KF9uYW1lKSk7CiAgICAgICAgIGVtaXR0ZWRfdHVwbGVzLmdldChfbmFtZSkuY2xlYXIoKTsKICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vdG9wb2xvZ3kvQmFzZUNvbmZpZ3VyYXRpb25EZWNsYXJlci5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3RvcG9sb2d5L0Jhc2VDb25maWd1cmF0aW9uRGVjbGFyZXIuamF2YQppbmRleCA0NjVmMDRkLi5iNmYzYjUzIDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vdG9wb2xvZ3kvQmFzZUNvbmZpZ3VyYXRpb25EZWNsYXJlci5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS90b3BvbG9neS9CYXNlQ29uZmlndXJhdGlvbkRlY2xhcmVyLmphdmEKQEAgLTIwLDggKzIwLDEwIEBACiBpbXBvcnQgYmFja3R5cGUuc3Rvcm0uQ29uZmlnOwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0udXRpbHMuVXRpbHM7CiAKIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlQ29uZmlndXJhdGlvbkRlY2xhcmVyPFQgZXh0ZW5kcyBDb21wb25lbnRDb25maWd1cmF0aW9uRGVjbGFyZXI+IGltcGxlbWVudHMgQ29tcG9uZW50Q29uZmlndXJhdGlvbkRlY2xhcmVyPFQ+IHsKKyAgICBwcml2YXRlIE1hcCBjb25mID0gVXRpbHMucmVhZFN0b3JtQ29uZmlnKCk7CiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIFQgYWRkQ29uZmlndXJhdGlvbihTdHJpbmcgY29uZmlnLCBPYmplY3QgdmFsdWUpIHsKICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBjb25maWdNYXAgPSBuZXcgSGFzaE1hcDw+KCk7CkBAIC00OCw3ICs1MCwzNCBAQAogICAgIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBUIHNldE51bVRhc2tzKE51bWJlciB2YWwpIHsKLSAgICAgICAgaWYodmFsIT1udWxsKSB2YWwgPSB2YWwuaW50VmFsdWUoKTsKKyAgICAgICAgaWYgKHZhbCAhPSBudWxsKSB2YWwgPSB2YWwuaW50VmFsdWUoKTsKICAgICAgICAgcmV0dXJuIGFkZENvbmZpZ3VyYXRpb24oQ29uZmlnLlRPUE9MT0dZX1RBU0tTLCB2YWwpOwogICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUIHNldE1lbW9yeUxvYWQoTnVtYmVyIG9uSGVhcCkgeworICAgICAgICByZXR1cm4gc2V0TWVtb3J5TG9hZChvbkhlYXAsIFV0aWxzLmdldERvdWJsZShjb25mLmdldChDb25maWcuVE9QT0xPR1lfQ09NUE9ORU5UX1JFU09VUkNFU19PRkZIRUFQX01FTU9SWV9NQikpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVCBzZXRNZW1vcnlMb2FkKE51bWJlciBvbkhlYXAsIE51bWJlciBvZmZIZWFwKSB7CisgICAgICAgIFQgcmV0ID0gbnVsbDsKKyAgICAgICAgaWYgKG9uSGVhcCAhPSBudWxsKSB7CisgICAgICAgICAgICBvbkhlYXAgPSBvbkhlYXAuZG91YmxlVmFsdWUoKTsKKyAgICAgICAgICAgIHJldCA9IGFkZENvbmZpZ3VyYXRpb24oQ29uZmlnLlRPUE9MT0dZX0NPTVBPTkVOVF9SRVNPVVJDRVNfT05IRUFQX01FTU9SWV9NQiwgb25IZWFwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAob2ZmSGVhcCE9bnVsbCkgeworICAgICAgICAgICAgb2ZmSGVhcCA9IG9mZkhlYXAuZG91YmxlVmFsdWUoKTsKKyAgICAgICAgICAgIHJldCA9IGFkZENvbmZpZ3VyYXRpb24oQ29uZmlnLlRPUE9MT0dZX0NPTVBPTkVOVF9SRVNPVVJDRVNfT0ZGSEVBUF9NRU1PUllfTUIsIG9mZkhlYXApOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFQgc2V0Q1BVTG9hZChOdW1iZXIgYW1vdW50KSB7CisgICAgICAgIGlmKGFtb3VudCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gYWRkQ29uZmlndXJhdGlvbihDb25maWcuVE9QT0xPR1lfQ09NUE9ORU5UX0NQVV9QQ09SRV9QRVJDRU5ULCBhbW91bnQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS90b3BvbG9neS9CYXNpY0JvbHRFeGVjdXRvci5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3RvcG9sb2d5L0Jhc2ljQm9sdEV4ZWN1dG9yLmphdmEKaW5kZXggNmM5Y2RjMS4uY2Y4MjhmZSAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3RvcG9sb2d5L0Jhc2ljQm9sdEV4ZWN1dG9yLmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3RvcG9sb2d5L0Jhc2ljQm9sdEV4ZWN1dG9yLmphdmEKQEAgLTI1LDcgKzI1LDcgQEAKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAogcHVibGljIGNsYXNzIEJhc2ljQm9sdEV4ZWN1dG9yIGltcGxlbWVudHMgSVJpY2hCb2x0IHsKLSAgICBwdWJsaWMgc3RhdGljIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihCYXNpY0JvbHRFeGVjdXRvci5jbGFzcyk7ICAgIAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEJhc2ljQm9sdEV4ZWN1dG9yLmNsYXNzKTsKICAgICAKICAgICBwcml2YXRlIElCYXNpY0JvbHQgX2JvbHQ7CiAgICAgcHJpdmF0ZSB0cmFuc2llbnQgQmFzaWNPdXRwdXRDb2xsZWN0b3IgX2NvbGxlY3RvcjsKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS90b3BvbG9neS9Db21wb25lbnRDb25maWd1cmF0aW9uRGVjbGFyZXIuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS90b3BvbG9neS9Db21wb25lbnRDb25maWd1cmF0aW9uRGVjbGFyZXIuamF2YQppbmRleCAzYTQzM2I5Li4yMDAzYzRlIDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vdG9wb2xvZ3kvQ29tcG9uZW50Q29uZmlndXJhdGlvbkRlY2xhcmVyLmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3RvcG9sb2d5L0NvbXBvbmVudENvbmZpZ3VyYXRpb25EZWNsYXJlci5qYXZhCkBAIC0yNiw0ICsyNiw3IEBACiAgICAgVCBzZXRNYXhUYXNrUGFyYWxsZWxpc20oTnVtYmVyIHZhbCk7CiAgICAgVCBzZXRNYXhTcG91dFBlbmRpbmcoTnVtYmVyIHZhbCk7CiAgICAgVCBzZXROdW1UYXNrcyhOdW1iZXIgdmFsKTsKKyAgICBUIHNldE1lbW9yeUxvYWQoTnVtYmVyIG9uSGVhcCk7CisgICAgVCBzZXRNZW1vcnlMb2FkKE51bWJlciBvbkhlYXAsIE51bWJlciBvZmZIZWFwKTsKKyAgICBUIHNldENQVUxvYWQoTnVtYmVyIGFtb3VudCk7CiB9CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vdG9wb2xvZ3kvSVdpbmRvd2VkQm9sdC5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3RvcG9sb2d5L0lXaW5kb3dlZEJvbHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzYzNzE3Ci0tLSAvZGV2L251bGwKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3RvcG9sb2d5L0lXaW5kb3dlZEJvbHQuamF2YQpAQCAtMCwwICsxLDQwIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBiYWNrdHlwZS5zdG9ybS50b3BvbG9neTsKKworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnRhc2suT3V0cHV0Q29sbGVjdG9yOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnRhc2suVG9wb2xvZ3lDb250ZXh0OworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLndpbmRvd2luZy5UdXBsZVdpbmRvdzsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogQSBib2x0IGFic3RyYWN0aW9uIGZvciBzdXBwb3J0aW5nIHRpbWUgYW5kIGNvdW50IGJhc2VkIHNsaWRpbmcgJiB0dW1ibGluZyB3aW5kb3dzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIElXaW5kb3dlZEJvbHQgZXh0ZW5kcyBJQ29tcG9uZW50IHsKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIHtAbGluayBiYWNrdHlwZS5zdG9ybS50YXNrLklCb2x0I3ByZXBhcmUoTWFwLCBUb3BvbG9neUNvbnRleHQsIE91dHB1dENvbGxlY3Rvcil9IGV4Y2VwdAorICAgICAqIHRoYXQgd2hpbGUgZW1pdHRpbmcsIHRoZSB0dXBsZXMgYXJlIGF1dG9tYXRpY2FsbHkgYW5jaG9yZWQgdG8gdGhlIHR1cGxlcyBpbiB0aGUgaW5wdXRXaW5kb3cuCisgICAgICovCisgICAgdm9pZCBwcmVwYXJlKE1hcCBzdG9ybUNvbmYsIFRvcG9sb2d5Q29udGV4dCBjb250ZXh0LCBPdXRwdXRDb2xsZWN0b3IgY29sbGVjdG9yKTsKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHRoZSB0dXBsZSB3aW5kb3cgYW5kIG9wdGlvbmFsbHkgZW1pdCBuZXcgdHVwbGVzIGJhc2VkIG9uIHRoZSB0dXBsZXMgaW4gdGhlIGlucHV0IHdpbmRvdy4KKyAgICAgKi8KKyAgICB2b2lkIGV4ZWN1dGUoVHVwbGVXaW5kb3cgaW5wdXRXaW5kb3cpOworICAgIHZvaWQgY2xlYW51cCgpOworfQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3RvcG9sb2d5L091dHB1dEZpZWxkc0dldHRlci5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3RvcG9sb2d5L091dHB1dEZpZWxkc0dldHRlci5qYXZhCmluZGV4IDBlN2ZkNTkuLjI2YTc5MWUgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS90b3BvbG9neS9PdXRwdXRGaWVsZHNHZXR0ZXIuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vdG9wb2xvZ3kvT3V0cHV0RmllbGRzR2V0dGVyLmphdmEKQEAgLTI0LDcgKzI0LDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiBwdWJsaWMgY2xhc3MgT3V0cHV0RmllbGRzR2V0dGVyIGltcGxlbWVudHMgT3V0cHV0RmllbGRzRGVjbGFyZXIgewotICAgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyZWFtSW5mbz4gX2ZpZWxkcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyZWFtSW5mbz4oKTsKKyAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmVhbUluZm8+IF9maWVsZHMgPSBuZXcgSGFzaE1hcDw+KCk7CiAKICAgICBwdWJsaWMgdm9pZCBkZWNsYXJlKEZpZWxkcyBmaWVsZHMpIHsKICAgICAgICAgZGVjbGFyZShmYWxzZSwgZmllbGRzKTsKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS90b3BvbG9neS9Ub3BvbG9neUJ1aWxkZXIuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS90b3BvbG9neS9Ub3BvbG9neUJ1aWxkZXIuamF2YQppbmRleCAzOGIzMGQ3Li45ZDJlZjYxIDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vdG9wb2xvZ3kvVG9wb2xvZ3lCdWlsZGVyLmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3RvcG9sb2d5L1RvcG9sb2d5QnVpbGRlci5qYXZhCkBAIC0xOCwyMyArMTgsMjAgQEAKIHBhY2thZ2UgYmFja3R5cGUuc3Rvcm0udG9wb2xvZ3k7CiAKIGltcG9ydCBiYWNrdHlwZS5zdG9ybS5Db25maWc7Ci1pbXBvcnQgYmFja3R5cGUuc3Rvcm0uZ2VuZXJhdGVkLkJvbHQ7Ci1pbXBvcnQgYmFja3R5cGUuc3Rvcm0uZ2VuZXJhdGVkLkNvbXBvbmVudENvbW1vbjsKLWltcG9ydCBiYWNrdHlwZS5zdG9ybS5nZW5lcmF0ZWQuQ29tcG9uZW50T2JqZWN0OwotaW1wb3J0IGJhY2t0eXBlLnN0b3JtLmdlbmVyYXRlZC5HbG9iYWxTdHJlYW1JZDsKLWltcG9ydCBiYWNrdHlwZS5zdG9ybS5nZW5lcmF0ZWQuR3JvdXBpbmc7Ci1pbXBvcnQgYmFja3R5cGUuc3Rvcm0uZ2VuZXJhdGVkLk51bGxTdHJ1Y3Q7Ci1pbXBvcnQgYmFja3R5cGUuc3Rvcm0uZ2VuZXJhdGVkLlNwb3V0U3BlYzsKLWltcG9ydCBiYWNrdHlwZS5zdG9ybS5nZW5lcmF0ZWQuU3RhdGVTcG91dFNwZWM7Ci1pbXBvcnQgYmFja3R5cGUuc3Rvcm0uZ2VuZXJhdGVkLlN0b3JtVG9wb2xvZ3k7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0uZ2VuZXJhdGVkLio7CiBpbXBvcnQgYmFja3R5cGUuc3Rvcm0uZ3JvdXBpbmcuQ3VzdG9tU3RyZWFtR3JvdXBpbmc7CiBpbXBvcnQgYmFja3R5cGUuc3Rvcm0uZ3JvdXBpbmcuUGFydGlhbEtleUdyb3VwaW5nOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLmhvb2tzLklXb3JrZXJIb29rOwogaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnR1cGxlLkZpZWxkczsKIGltcG9ydCBiYWNrdHlwZS5zdG9ybS51dGlscy5VdGlsczsKK2ltcG9ydCBvcmcuanNvbi5zaW1wbGUuSlNPTlZhbHVlOworCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgb3JnLmpzb24uc2ltcGxlLkpTT05WYWx1ZTsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS53aW5kb3dpbmcuVHVwbGVXaW5kb3c7CiAKIC8qKgogICogVG9wb2xvZ3lCdWlsZGVyIGV4cG9zZXMgdGhlIEphdmEgQVBJIGZvciBzcGVjaWZ5aW5nIGEgdG9wb2xvZ3kgZm9yIFN0b3JtCkBAIC04OSwxOCArODYsMjAgQEAKICAqIHRoZSBpbnB1dHMgZm9yIHRoYXQgY29tcG9uZW50LjwvcD4KICAqLwogcHVibGljIGNsYXNzIFRvcG9sb2d5QnVpbGRlciB7Ci0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBJUmljaEJvbHQ+IF9ib2x0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgSVJpY2hCb2x0PigpOwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgSVJpY2hTcG91dD4gX3Nwb3V0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgSVJpY2hTcG91dD4oKTsKLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIENvbXBvbmVudENvbW1vbj4gX2NvbW1vbnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIENvbXBvbmVudENvbW1vbj4oKTsKKyAgICBwcml2YXRlIE1hcDxTdHJpbmcsIElSaWNoQm9sdD4gX2JvbHRzID0gbmV3IEhhc2hNYXA8PigpOworICAgIHByaXZhdGUgTWFwPFN0cmluZywgSVJpY2hTcG91dD4gX3Nwb3V0cyA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICBwcml2YXRlIE1hcDxTdHJpbmcsIENvbXBvbmVudENvbW1vbj4gX2NvbW1vbnMgPSBuZXcgSGFzaE1hcDw+KCk7CiAKIC8vICAgIHByaXZhdGUgTWFwPFN0cmluZywgTWFwPEdsb2JhbFN0cmVhbUlkLCBHcm91cGluZz4+IF9pbnB1dHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE1hcDxHbG9iYWxTdHJlYW1JZCwgR3JvdXBpbmc+PigpOwogCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdGF0ZVNwb3V0U3BlYz4gX3N0YXRlU3BvdXRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdGF0ZVNwb3V0U3BlYz4oKTsKLSAgICAKLSAgICAKKyAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0YXRlU3BvdXRTcGVjPiBfc3RhdGVTcG91dHMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgcHJpdmF0ZSBMaXN0PEJ5dGVCdWZmZXI+IF93b3JrZXJIb29rcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisKICAgICBwdWJsaWMgU3Rvcm1Ub3BvbG9neSBjcmVhdGVUb3BvbG9neSgpIHsKLSAgICAgICAgTWFwPFN0cmluZywgQm9sdD4gYm9sdFNwZWNzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBCb2x0PigpOwotICAgICAgICBNYXA8U3RyaW5nLCBTcG91dFNwZWM+IHNwb3V0U3BlY3MgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFNwb3V0U3BlYz4oKTsKKyAgICAgICAgTWFwPFN0cmluZywgQm9sdD4gYm9sdFNwZWNzID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBNYXA8U3RyaW5nLCBTcG91dFNwZWM+IHNwb3V0U3BlY3MgPSBuZXcgSGFzaE1hcDw+KCk7CisKICAgICAgICAgZm9yKFN0cmluZyBib2x0SWQ6IF9ib2x0cy5rZXlTZXQoKSkgewogICAgICAgICAgICAgSVJpY2hCb2x0IGJvbHQgPSBfYm9sdHMuZ2V0KGJvbHRJZCk7CiAgICAgICAgICAgICBDb21wb25lbnRDb21tb24gY29tbW9uID0gZ2V0Q29tcG9uZW50Q29tbW9uKGJvbHRJZCwgYm9sdCk7CkBAIC0xMTAsMTEgKzEwOSwxNSBAQAogICAgICAgICAgICAgSVJpY2hTcG91dCBzcG91dCA9IF9zcG91dHMuZ2V0KHNwb3V0SWQpOwogICAgICAgICAgICAgQ29tcG9uZW50Q29tbW9uIGNvbW1vbiA9IGdldENvbXBvbmVudENvbW1vbihzcG91dElkLCBzcG91dCk7CiAgICAgICAgICAgICBzcG91dFNwZWNzLnB1dChzcG91dElkLCBuZXcgU3BvdXRTcGVjKENvbXBvbmVudE9iamVjdC5zZXJpYWxpemVkX2phdmEoVXRpbHMuamF2YVNlcmlhbGl6ZShzcG91dCkpLCBjb21tb24pKTsKLSAgICAgICAgICAgIAogICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgU3Rvcm1Ub3BvbG9neShzcG91dFNwZWNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9sdFNwZWNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEhhc2hNYXA8U3RyaW5nLCBTdGF0ZVNwb3V0U3BlYz4oKSk7CisKKyAgICAgICAgU3Rvcm1Ub3BvbG9neSBzdG9ybVRvcG9sb2d5ID0gbmV3IFN0b3JtVG9wb2xvZ3koc3BvdXRTcGVjcywKKyAgICAgICAgICAgICAgICBib2x0U3BlY3MsCisgICAgICAgICAgICAgICAgbmV3IEhhc2hNYXA8U3RyaW5nLCBTdGF0ZVNwb3V0U3BlYz4oKSk7CisKKyAgICAgICAgc3Rvcm1Ub3BvbG9neS5zZXRfd29ya2VyX2hvb2tzKF93b3JrZXJIb29rcyk7CisKKyAgICAgICAgcmV0dXJuIHN0b3JtVG9wb2xvZ3k7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNjgsNyArMTcxLDcgQEAKICAgICAgKgogICAgICAqIEBwYXJhbSBpZCB0aGUgaWQgb2YgdGhpcyBjb21wb25lbnQuIFRoaXMgaWQgaXMgcmVmZXJlbmNlZCBieSBvdGhlciBjb21wb25lbnRzIHRoYXQgd2FudCB0byBjb25zdW1lIHRoaXMgYm9sdCdzIG91dHB1dHMuCiAgICAgICogQHBhcmFtIGJvbHQgdGhlIGJhc2ljIGJvbHQKLSAgICAgKiBAcGFyYW0gcGFyYWxsZWxpc21faGludCB0aGUgbnVtYmVyIG9mIHRhc2tzIHRoYXQgc2hvdWxkIGJlIGFzc2lnbmVkIHRvIGV4ZWN1dGUgdGhpcyBib2x0LiBFYWNoIHRhc2sgd2lsbCBydW4gb24gYSB0aHJlYWQgaW4gYSBwcm9jZXNzIHNvbXdlaGVyZSBhcm91bmQgdGhlIGNsdXN0ZXIuCisgICAgICogQHBhcmFtIHBhcmFsbGVsaXNtX2hpbnQgdGhlIG51bWJlciBvZiB0YXNrcyB0aGF0IHNob3VsZCBiZSBhc3NpZ25lZCB0byBleGVjdXRlIHRoaXMgYm9sdC4gRWFjaCB0YXNrIHdpbGwgcnVuIG9uIGEgdGhyZWFkIGluIGEgcHJvY2VzcyBzb21ld2hlcmUgYXJvdW5kIHRoZSBjbHVzdGVyLgogICAgICAqIEByZXR1cm4gdXNlIHRoZSByZXR1cm5lZCBvYmplY3QgdG8gZGVjbGFyZSB0aGUgaW5wdXRzIHRvIHRoaXMgY29tcG9uZW50CiAgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYge0Bjb2RlIHBhcmFsbGVsaXNtX2hpbnR9IGlzIG5vdCBwb3NpdGl2ZQogICAgICAqLwpAQCAtMTc3LDYgKzE4MCwyMSBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIERlZmluZSBhIG5ldyBib2x0IGluIHRoaXMgdG9wb2xvZ3kuIFRoaXMgZGVmaW5lcyBhIHdpbmRvd2VkIGJvbHQsIGludGVuZGVkCisgICAgICogZm9yIHdpbmRvd2luZyBvcGVyYXRpb25zLiBUaGUge0BsaW5rIElXaW5kb3dlZEJvbHQjZXhlY3V0ZShUdXBsZVdpbmRvdyl9IG1ldGhvZAorICAgICAqIGlzIHRyaWdnZXJlZCBmb3IgZWFjaCB3aW5kb3cgaW50ZXJ2YWwgd2l0aCB0aGUgbGlzdCBvZiBjdXJyZW50IGV2ZW50cyBpbiB0aGUgd2luZG93LgorICAgICAqCisgICAgICogQHBhcmFtIGlkIHRoZSBpZCBvZiB0aGlzIGNvbXBvbmVudC4gVGhpcyBpZCBpcyByZWZlcmVuY2VkIGJ5IG90aGVyIGNvbXBvbmVudHMgdGhhdCB3YW50IHRvIGNvbnN1bWUgdGhpcyBib2x0J3Mgb3V0cHV0cy4KKyAgICAgKiBAcGFyYW0gYm9sdCB0aGUgd2luZG93ZWQgYm9sdAorICAgICAqIEBwYXJhbSBwYXJhbGxlbGlzbV9oaW50IHRoZSBudW1iZXIgb2YgdGFza3MgdGhhdCBzaG91bGQgYmUgYXNzaWduZWQgdG8gZXhlY3V0ZSB0aGlzIGJvbHQuIEVhY2ggdGFzayB3aWxsIHJ1biBvbiBhIHRocmVhZCBpbiBhIHByb2Nlc3Mgc29td2VoZXJlIGFyb3VuZCB0aGUgY2x1c3Rlci4KKyAgICAgKiBAcmV0dXJuIHVzZSB0aGUgcmV0dXJuZWQgb2JqZWN0IHRvIGRlY2xhcmUgdGhlIGlucHV0cyB0byB0aGlzIGNvbXBvbmVudAorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHtAY29kZSBwYXJhbGxlbGlzbV9oaW50fSBpcyBub3QgcG9zaXRpdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgQm9sdERlY2xhcmVyIHNldEJvbHQoU3RyaW5nIGlkLCBJV2luZG93ZWRCb2x0IGJvbHQsIE51bWJlciBwYXJhbGxlbGlzbV9oaW50KSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHNldEJvbHQoaWQsIG5ldyBXaW5kb3dlZEJvbHRFeGVjdXRvcihib2x0KSwgcGFyYWxsZWxpc21faGludCk7CisgICAgfQorCisgICAgLyoqCiAgICAgICogRGVmaW5lIGEgbmV3IHNwb3V0IGluIHRoaXMgdG9wb2xvZ3kuCiAgICAgICoKICAgICAgKiBAcGFyYW0gaWQgdGhlIGlkIG9mIHRoaXMgY29tcG9uZW50LiBUaGlzIGlkIGlzIHJlZmVyZW5jZWQgYnkgb3RoZXIgY29tcG9uZW50cyB0aGF0IHdhbnQgdG8gY29uc3VtZSB0aGlzIHNwb3V0J3Mgb3V0cHV0cy4KQEAgLTE5Myw3ICsyMTEsNyBAQAogICAgICAqIHdpbGwgYmUgYWxsb2NhdGVkIHRvIHRoaXMgY29tcG9uZW50LgogICAgICAqCiAgICAgICogQHBhcmFtIGlkIHRoZSBpZCBvZiB0aGlzIGNvbXBvbmVudC4gVGhpcyBpZCBpcyByZWZlcmVuY2VkIGJ5IG90aGVyIGNvbXBvbmVudHMgdGhhdCB3YW50IHRvIGNvbnN1bWUgdGhpcyBzcG91dCdzIG91dHB1dHMuCi0gICAgICogQHBhcmFtIHBhcmFsbGVsaXNtX2hpbnQgdGhlIG51bWJlciBvZiB0YXNrcyB0aGF0IHNob3VsZCBiZSBhc3NpZ25lZCB0byBleGVjdXRlIHRoaXMgc3BvdXQuIEVhY2ggdGFzayB3aWxsIHJ1biBvbiBhIHRocmVhZCBpbiBhIHByb2Nlc3Mgc29td2VoZXJlIGFyb3VuZCB0aGUgY2x1c3Rlci4KKyAgICAgKiBAcGFyYW0gcGFyYWxsZWxpc21faGludCB0aGUgbnVtYmVyIG9mIHRhc2tzIHRoYXQgc2hvdWxkIGJlIGFzc2lnbmVkIHRvIGV4ZWN1dGUgdGhpcyBzcG91dC4gRWFjaCB0YXNrIHdpbGwgcnVuIG9uIGEgdGhyZWFkIGluIGEgcHJvY2VzcyBzb21ld2hlcmUgYXJvdW5kIHRoZSBjbHVzdGVyLgogICAgICAqIEBwYXJhbSBzcG91dCB0aGUgc3BvdXQKICAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB7QGNvZGUgcGFyYWxsZWxpc21faGludH0gaXMgbm90IHBvc2l0aXZlCiAgICAgICovCkBAIC0yMTMsNiArMjMxLDE4IEBACiAgICAgICAgIC8vIFRPRE86IGZpbmlzaAogICAgIH0KIAorICAgIC8qKgorICAgICAqIEFkZCBhIG5ldyB3b3JrZXIgbGlmZWN5Y2xlIGhvb2sKKyAgICAgKgorICAgICAqIEBwYXJhbSB3b3JrZXJIb29rIHRoZSBsaWZlY3ljbGUgaG9vayB0byBhZGQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRXb3JrZXJIb29rKElXb3JrZXJIb29rIHdvcmtlckhvb2spIHsKKyAgICAgICAgaWYobnVsbCA9PSB3b3JrZXJIb29rKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJXb3JrZXJIb29rIG11c3Qgbm90IGJlIG51bGwuIik7CisgICAgICAgIH0KKworICAgICAgICBfd29ya2VySG9va3MuYWRkKEJ5dGVCdWZmZXIud3JhcChVdGlscy5qYXZhU2VyaWFsaXplKHdvcmtlckhvb2spKSk7CisgICAgfQogCiAgICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlVW51c2VkSWQoU3RyaW5nIGlkKSB7CiAgICAgICAgIGlmKF9ib2x0cy5jb250YWluc0tleShpZCkpIHsKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS90b3BvbG9neS9XaW5kb3dlZEJvbHRFeGVjdXRvci5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3RvcG9sb2d5L1dpbmRvd2VkQm9sdEV4ZWN1dG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdkNmY3MAotLS0gL2Rldi9udWxsCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS90b3BvbG9neS9XaW5kb3dlZEJvbHRFeGVjdXRvci5qYXZhCkBAIC0wLDAgKzEsMjI0IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBiYWNrdHlwZS5zdG9ybS50b3BvbG9neTsKKworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLkNvbmZpZzsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS50YXNrLklPdXRwdXRDb2xsZWN0b3I7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0udGFzay5PdXRwdXRDb2xsZWN0b3I7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0udGFzay5Ub3BvbG9neUNvbnRleHQ7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0udHVwbGUuVHVwbGU7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0ud2luZG93aW5nLlR1cGxlV2luZG93SW1wbDsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS53aW5kb3dpbmcuV2luZG93TGlmZWN5Y2xlTGlzdGVuZXI7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0ud2luZG93aW5nLldpbmRvd01hbmFnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKK2ltcG9ydCBzdGF0aWMgYmFja3R5cGUuc3Rvcm0udG9wb2xvZ3kuYmFzZS5CYXNlV2luZG93ZWRCb2x0LkNvdW50OworaW1wb3J0IHN0YXRpYyBiYWNrdHlwZS5zdG9ybS50b3BvbG9neS5iYXNlLkJhc2VXaW5kb3dlZEJvbHQuRHVyYXRpb247CisKKy8qKgorICogQW4ge0BsaW5rIElXaW5kb3dlZEJvbHR9IHdyYXBwZXIgdGhhdCBkb2VzIHRoZSB3aW5kb3dpbmcgb2YgdHVwbGVzLgorICovCitwdWJsaWMgY2xhc3MgV2luZG93ZWRCb2x0RXhlY3V0b3IgaW1wbGVtZW50cyBJUmljaEJvbHQgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihXaW5kb3dlZEJvbHRFeGVjdXRvci5jbGFzcyk7CisKKyAgICBwcml2YXRlIElXaW5kb3dlZEJvbHQgYm9sdDsKKyAgICBwcml2YXRlIHRyYW5zaWVudCBXaW5kb3dlZE91dHB1dENvbGxlY3RvciB3aW5kb3dlZE91dHB1dENvbGxlY3RvcjsKKyAgICBwcml2YXRlIHRyYW5zaWVudCBXaW5kb3dMaWZlY3ljbGVMaXN0ZW5lcjxUdXBsZT4gbGlzdGVuZXI7CisgICAgcHJpdmF0ZSB0cmFuc2llbnQgV2luZG93TWFuYWdlcjxUdXBsZT4gd2luZG93TWFuYWdlcjsKKworICAgIHB1YmxpYyBXaW5kb3dlZEJvbHRFeGVjdXRvcihJV2luZG93ZWRCb2x0IGJvbHQpIHsKKyAgICAgICAgdGhpcy5ib2x0ID0gYm9sdDsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBnZXRUb3BvbG9neVRpbWVvdXRNaWxsaXMoTWFwIHN0b3JtQ29uZikgeworICAgICAgICBpZiAoc3Rvcm1Db25mLmdldChDb25maWcuVE9QT0xPR1lfRU5BQkxFX01FU1NBR0VfVElNRU9VVFMpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gdGltZU91dHNFbmFibGVkID0gKGJvb2xlYW4pIHN0b3JtQ29uZi5nZXQoQ29uZmlnLlRPUE9MT0dZX0VOQUJMRV9NRVNTQUdFX1RJTUVPVVRTKTsKKyAgICAgICAgICAgIGlmICghdGltZU91dHNFbmFibGVkKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEludGVnZXIuTUFYX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGludCB0aW1lb3V0ID0gMDsKKyAgICAgICAgaWYgKHN0b3JtQ29uZi5nZXQoQ29uZmlnLlRPUE9MT0dZX01FU1NBR0VfVElNRU9VVF9TRUNTKSAhPSBudWxsKSB7CisgICAgICAgICAgICB0aW1lb3V0ID0gKChOdW1iZXIpIHN0b3JtQ29uZi5nZXQoQ29uZmlnLlRPUE9MT0dZX01FU1NBR0VfVElNRU9VVF9TRUNTKSkuaW50VmFsdWUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGltZW91dCAqIDEwMDA7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgZ2V0TWF4U3BvdXRQZW5kaW5nKE1hcCBzdG9ybUNvbmYpIHsKKyAgICAgICAgaW50IG1heFBlbmRpbmcgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKKyAgICAgICAgaWYgKHN0b3JtQ29uZi5nZXQoQ29uZmlnLlRPUE9MT0dZX01BWF9TUE9VVF9QRU5ESU5HKSAhPSBudWxsKSB7CisgICAgICAgICAgICBtYXhQZW5kaW5nID0gKChOdW1iZXIpIHN0b3JtQ29uZi5nZXQoQ29uZmlnLlRPUE9MT0dZX01BWF9TUE9VVF9QRU5ESU5HKSkuaW50VmFsdWUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbWF4UGVuZGluZzsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZW5zdXJlRHVyYXRpb25MZXNzVGhhblRpbWVvdXQoaW50IGR1cmF0aW9uLCBpbnQgdGltZW91dCkgeworICAgICAgICBpZiAoZHVyYXRpb24gPiB0aW1lb3V0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJXaW5kb3cgZHVyYXRpb24gKGxlbmd0aCArIHNsaWRpbmcgaW50ZXJ2YWwpIHZhbHVlICIgKyBkdXJhdGlvbiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBpcyBtb3JlIHRoYW4gIiArIENvbmZpZy5UT1BPTE9HWV9NRVNTQUdFX1RJTUVPVVRfU0VDUyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB2YWx1ZSAiICsgdGltZW91dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZW5zdXJlQ291bnRMZXNzVGhhbk1heFBlbmRpbmcoaW50IGNvdW50LCBpbnQgbWF4UGVuZGluZykgeworICAgICAgICBpZiAoY291bnQgPiBtYXhQZW5kaW5nKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJXaW5kb3cgY291bnQgKGxlbmd0aCArIHNsaWRpbmcgaW50ZXJ2YWwpIHZhbHVlICIgKyBjb3VudCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBpcyBtb3JlIHRoYW4gIiArIENvbmZpZy5UT1BPTE9HWV9NQVhfU1BPVVRfUEVORElORyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB2YWx1ZSAiICsgbWF4UGVuZGluZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGUoTWFwIHN0b3JtQ29uZiwgQ291bnQgd2luZG93TGVuZ3RoQ291bnQsIER1cmF0aW9uIHdpbmRvd0xlbmd0aER1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDb3VudCBzbGlkaW5nSW50ZXJ2YWxDb3VudCwgRHVyYXRpb24gc2xpZGluZ0ludGVydmFsRHVyYXRpb24pIHsKKworICAgICAgICBpbnQgdG9wb2xvZ3lUaW1lb3V0ID0gZ2V0VG9wb2xvZ3lUaW1lb3V0TWlsbGlzKHN0b3JtQ29uZik7CisgICAgICAgIGludCBtYXhTcG91dFBlbmRpbmcgPSBnZXRNYXhTcG91dFBlbmRpbmcoc3Rvcm1Db25mKTsKKyAgICAgICAgaWYgKHdpbmRvd0xlbmd0aER1cmF0aW9uICE9IG51bGwgJiYgc2xpZGluZ0ludGVydmFsRHVyYXRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgZW5zdXJlRHVyYXRpb25MZXNzVGhhblRpbWVvdXQod2luZG93TGVuZ3RoRHVyYXRpb24udmFsdWUgKyBzbGlkaW5nSW50ZXJ2YWxEdXJhdGlvbi52YWx1ZSwgdG9wb2xvZ3lUaW1lb3V0KTsKKyAgICAgICAgfSBlbHNlIGlmICh3aW5kb3dMZW5ndGhEdXJhdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBlbnN1cmVEdXJhdGlvbkxlc3NUaGFuVGltZW91dCh3aW5kb3dMZW5ndGhEdXJhdGlvbi52YWx1ZSwgdG9wb2xvZ3lUaW1lb3V0KTsKKyAgICAgICAgfSBlbHNlIGlmIChzbGlkaW5nSW50ZXJ2YWxEdXJhdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBlbnN1cmVEdXJhdGlvbkxlc3NUaGFuVGltZW91dChzbGlkaW5nSW50ZXJ2YWxEdXJhdGlvbi52YWx1ZSwgdG9wb2xvZ3lUaW1lb3V0KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh3aW5kb3dMZW5ndGhDb3VudCAhPSBudWxsICYmIHNsaWRpbmdJbnRlcnZhbENvdW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGVuc3VyZUNvdW50TGVzc1RoYW5NYXhQZW5kaW5nKHdpbmRvd0xlbmd0aENvdW50LnZhbHVlICsgc2xpZGluZ0ludGVydmFsQ291bnQudmFsdWUsIG1heFNwb3V0UGVuZGluZyk7CisgICAgICAgIH0gZWxzZSBpZiAod2luZG93TGVuZ3RoQ291bnQgIT0gbnVsbCkgeworICAgICAgICAgICAgZW5zdXJlQ291bnRMZXNzVGhhbk1heFBlbmRpbmcod2luZG93TGVuZ3RoQ291bnQudmFsdWUsIG1heFNwb3V0UGVuZGluZyk7CisgICAgICAgIH0gZWxzZSBpZiAoc2xpZGluZ0ludGVydmFsQ291bnQgIT0gbnVsbCkgeworICAgICAgICAgICAgZW5zdXJlQ291bnRMZXNzVGhhbk1heFBlbmRpbmcoc2xpZGluZ0ludGVydmFsQ291bnQudmFsdWUsIG1heFNwb3V0UGVuZGluZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFdpbmRvd01hbmFnZXI8VHVwbGU+IGluaXRXaW5kb3dNYW5hZ2VyKFdpbmRvd0xpZmVjeWNsZUxpc3RlbmVyPFR1cGxlPiBsaWZlY3ljbGVMaXN0ZW5lciwgTWFwIHN0b3JtQ29uZikgeworICAgICAgICBXaW5kb3dNYW5hZ2VyPFR1cGxlPiBtYW5hZ2VyID0gbmV3IFdpbmRvd01hbmFnZXI8PihsaWZlY3ljbGVMaXN0ZW5lcik7CisgICAgICAgIER1cmF0aW9uIHdpbmRvd0xlbmd0aER1cmF0aW9uID0gbnVsbDsKKyAgICAgICAgQ291bnQgd2luZG93TGVuZ3RoQ291bnQgPSBudWxsOworICAgICAgICBEdXJhdGlvbiBzbGlkaW5nSW50ZXJ2YWxEdXJhdGlvbiA9IG51bGw7CisgICAgICAgIENvdW50IHNsaWRpbmdJbnRlcnZhbENvdW50ID0gbnVsbDsKKyAgICAgICAgaWYgKHN0b3JtQ29uZi5jb250YWluc0tleShDb25maWcuVE9QT0xPR1lfQk9MVFNfV0lORE9XX0xFTkdUSF9DT1VOVCkpIHsKKyAgICAgICAgICAgIHdpbmRvd0xlbmd0aENvdW50ID0gbmV3IENvdW50KCgoTnVtYmVyKSBzdG9ybUNvbmYuZ2V0KENvbmZpZy5UT1BPTE9HWV9CT0xUU19XSU5ET1dfTEVOR1RIX0NPVU5UKSkuaW50VmFsdWUoKSk7CisgICAgICAgIH0gZWxzZSBpZiAoc3Rvcm1Db25mLmNvbnRhaW5zS2V5KENvbmZpZy5UT1BPTE9HWV9CT0xUU19XSU5ET1dfTEVOR1RIX0RVUkFUSU9OX01TKSkgeworICAgICAgICAgICAgd2luZG93TGVuZ3RoRHVyYXRpb24gPSBuZXcgRHVyYXRpb24oCisgICAgICAgICAgICAgICAgICAgICgoTnVtYmVyKSBzdG9ybUNvbmYuZ2V0KENvbmZpZy5UT1BPTE9HWV9CT0xUU19XSU5ET1dfTEVOR1RIX0RVUkFUSU9OX01TKSkuaW50VmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdG9ybUNvbmYuY29udGFpbnNLZXkoQ29uZmlnLlRPUE9MT0dZX0JPTFRTX1NMSURJTkdfSU5URVJWQUxfQ09VTlQpKSB7CisgICAgICAgICAgICBzbGlkaW5nSW50ZXJ2YWxDb3VudCA9IG5ldyBDb3VudCgoKE51bWJlcikgc3Rvcm1Db25mLmdldChDb25maWcuVE9QT0xPR1lfQk9MVFNfU0xJRElOR19JTlRFUlZBTF9DT1VOVCkpLmludFZhbHVlKCkpOworICAgICAgICB9IGVsc2UgaWYgKHN0b3JtQ29uZi5jb250YWluc0tleShDb25maWcuVE9QT0xPR1lfQk9MVFNfU0xJRElOR19JTlRFUlZBTF9EVVJBVElPTl9NUykpIHsKKyAgICAgICAgICAgIHNsaWRpbmdJbnRlcnZhbER1cmF0aW9uID0gbmV3IER1cmF0aW9uKCgoTnVtYmVyKSBzdG9ybUNvbmYuZ2V0KENvbmZpZy5UT1BPTE9HWV9CT0xUU19TTElESU5HX0lOVEVSVkFMX0RVUkFUSU9OX01TKSkuaW50VmFsdWUoKSwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGRlZmF1bHQgaXMgYSBzbGlkaW5nIHdpbmRvdyBvZiBjb3VudCAxCisgICAgICAgICAgICBzbGlkaW5nSW50ZXJ2YWxDb3VudCA9IG5ldyBDb3VudCgxKTsKKyAgICAgICAgfQorICAgICAgICAvLyB2YWxpZGF0ZQorICAgICAgICB2YWxpZGF0ZShzdG9ybUNvbmYsIHdpbmRvd0xlbmd0aENvdW50LCB3aW5kb3dMZW5ndGhEdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgc2xpZGluZ0ludGVydmFsQ291bnQsIHNsaWRpbmdJbnRlcnZhbER1cmF0aW9uKTsKKyAgICAgICAgaWYgKHdpbmRvd0xlbmd0aENvdW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1hbmFnZXIuc2V0V2luZG93TGVuZ3RoKHdpbmRvd0xlbmd0aENvdW50KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1hbmFnZXIuc2V0V2luZG93TGVuZ3RoKHdpbmRvd0xlbmd0aER1cmF0aW9uKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2xpZGluZ0ludGVydmFsQ291bnQgIT0gbnVsbCkgeworICAgICAgICAgICAgbWFuYWdlci5zZXRTbGlkaW5nSW50ZXJ2YWwoc2xpZGluZ0ludGVydmFsQ291bnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWFuYWdlci5zZXRTbGlkaW5nSW50ZXJ2YWwoc2xpZGluZ0ludGVydmFsRHVyYXRpb24pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtYW5hZ2VyOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHByZXBhcmUoTWFwIHN0b3JtQ29uZiwgVG9wb2xvZ3lDb250ZXh0IGNvbnRleHQsIE91dHB1dENvbGxlY3RvciBjb2xsZWN0b3IpIHsKKyAgICAgICAgdGhpcy53aW5kb3dlZE91dHB1dENvbGxlY3RvciA9IG5ldyBXaW5kb3dlZE91dHB1dENvbGxlY3Rvcihjb2xsZWN0b3IpOworICAgICAgICBib2x0LnByZXBhcmUoc3Rvcm1Db25mLCBjb250ZXh0LCB3aW5kb3dlZE91dHB1dENvbGxlY3Rvcik7CisgICAgICAgIHRoaXMubGlzdGVuZXIgPSBuZXdXaW5kb3dMaWZlY3ljbGVMaXN0ZW5lcigpOworICAgICAgICB0aGlzLndpbmRvd01hbmFnZXIgPSBpbml0V2luZG93TWFuYWdlcihsaXN0ZW5lciwgc3Rvcm1Db25mKTsKKyAgICAgICAgTE9HLmRlYnVnKCJJbml0aWFsaXplZCB3aW5kb3cgbWFuYWdlciB7fSAiLCB0aGlzLndpbmRvd01hbmFnZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoVHVwbGUgaW5wdXQpIHsKKyAgICAgICAgd2luZG93TWFuYWdlci5hZGQoaW5wdXQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNsZWFudXAoKSB7CisgICAgICAgIHdpbmRvd01hbmFnZXIuc2h1dGRvd24oKTsKKyAgICAgICAgYm9sdC5jbGVhbnVwKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZGVjbGFyZU91dHB1dEZpZWxkcyhPdXRwdXRGaWVsZHNEZWNsYXJlciBkZWNsYXJlcikgeworICAgICAgICBib2x0LmRlY2xhcmVPdXRwdXRGaWVsZHMoZGVjbGFyZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldENvbXBvbmVudENvbmZpZ3VyYXRpb24oKSB7CisgICAgICAgIHJldHVybiBib2x0LmdldENvbXBvbmVudENvbmZpZ3VyYXRpb24oKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFdpbmRvd0xpZmVjeWNsZUxpc3RlbmVyPFR1cGxlPiBuZXdXaW5kb3dMaWZlY3ljbGVMaXN0ZW5lcigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBXaW5kb3dMaWZlY3ljbGVMaXN0ZW5lcjxUdXBsZT4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRXhwaXJ5KExpc3Q8VHVwbGU+IHR1cGxlcykgeworICAgICAgICAgICAgICAgIGZvciAoVHVwbGUgdHVwbGUgOiB0dXBsZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgd2luZG93ZWRPdXRwdXRDb2xsZWN0b3IuYWNrKHR1cGxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25BY3RpdmF0aW9uKExpc3Q8VHVwbGU+IHR1cGxlcywgTGlzdDxUdXBsZT4gbmV3VHVwbGVzLCBMaXN0PFR1cGxlPiBleHBpcmVkVHVwbGVzKSB7CisgICAgICAgICAgICAgICAgd2luZG93ZWRPdXRwdXRDb2xsZWN0b3Iuc2V0Q29udGV4dCh0dXBsZXMpOworICAgICAgICAgICAgICAgIGJvbHQuZXhlY3V0ZShuZXcgVHVwbGVXaW5kb3dJbXBsKHR1cGxlcywgbmV3VHVwbGVzLCBleHBpcmVkVHVwbGVzKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiB7QGxpbmsgT3V0cHV0Q29sbGVjdG9yfSB3cmFwcGVyIHRoYXQgYXV0b21hdGljYWxseQorICAgICAqIGFuY2hvcnMgdGhlIHR1cGxlcyB0byBpbnB1dFR1cGxlcyB3aGlsZSBlbWl0dGluZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBXaW5kb3dlZE91dHB1dENvbGxlY3RvciBleHRlbmRzIE91dHB1dENvbGxlY3RvciB7CisgICAgICAgIHByaXZhdGUgTGlzdDxUdXBsZT4gaW5wdXRUdXBsZXM7CisKKyAgICAgICAgV2luZG93ZWRPdXRwdXRDb2xsZWN0b3IoSU91dHB1dENvbGxlY3RvciBkZWxlZ2F0ZSkgeworICAgICAgICAgICAgc3VwZXIoZGVsZWdhdGUpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBzZXRDb250ZXh0KExpc3Q8VHVwbGU+IGlucHV0VHVwbGVzKSB7CisgICAgICAgICAgICB0aGlzLmlucHV0VHVwbGVzID0gaW5wdXRUdXBsZXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIExpc3Q8SW50ZWdlcj4gZW1pdChTdHJpbmcgc3RyZWFtSWQsIExpc3Q8T2JqZWN0PiB0dXBsZSkgeworICAgICAgICAgICAgcmV0dXJuIGVtaXQoc3RyZWFtSWQsIGlucHV0VHVwbGVzLCB0dXBsZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZW1pdERpcmVjdChpbnQgdGFza0lkLCBTdHJpbmcgc3RyZWFtSWQsIExpc3Q8T2JqZWN0PiB0dXBsZSkgeworICAgICAgICAgICAgZW1pdERpcmVjdCh0YXNrSWQsIHN0cmVhbUlkLCBpbnB1dFR1cGxlcywgdHVwbGUpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vdG9wb2xvZ3kvYmFzZS9CYXNlQmF0Y2hCb2x0LmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vdG9wb2xvZ3kvYmFzZS9CYXNlQmF0Y2hCb2x0LmphdmEKaW5kZXggMzIwNjk0MS4uM2YzNTE0OSAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3RvcG9sb2d5L2Jhc2UvQmFzZUJhdGNoQm9sdC5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS90b3BvbG9neS9iYXNlL0Jhc2VCYXRjaEJvbHQuamF2YQpAQCAtMTgsNyArMTgsNiBAQAogcGFja2FnZSBiYWNrdHlwZS5zdG9ybS50b3BvbG9neS5iYXNlOwogCiBpbXBvcnQgYmFja3R5cGUuc3Rvcm0uY29vcmRpbmF0aW9uLklCYXRjaEJvbHQ7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKIAogcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VCYXRjaEJvbHQ8VD4gZXh0ZW5kcyBCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgSUJhdGNoQm9sdDxUPiB7CiAgCmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vdG9wb2xvZ3kvYmFzZS9CYXNlVHJhbnNhY3Rpb25hbFNwb3V0LmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vdG9wb2xvZ3kvYmFzZS9CYXNlVHJhbnNhY3Rpb25hbFNwb3V0LmphdmEKaW5kZXggNzA0YTk1Yi4uZTJiM2E5MyAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3RvcG9sb2d5L2Jhc2UvQmFzZVRyYW5zYWN0aW9uYWxTcG91dC5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS90b3BvbG9neS9iYXNlL0Jhc2VUcmFuc2FjdGlvbmFsU3BvdXQuamF2YQpAQCAtMTgsNyArMTgsNiBAQAogcGFja2FnZSBiYWNrdHlwZS5zdG9ybS50b3BvbG9neS5iYXNlOwogCiBpbXBvcnQgYmFja3R5cGUuc3Rvcm0udHJhbnNhY3Rpb25hbC5JVHJhbnNhY3Rpb25hbFNwb3V0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKIHB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCYXNlVHJhbnNhY3Rpb25hbFNwb3V0PFQ+IGV4dGVuZHMgQmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIElUcmFuc2FjdGlvbmFsU3BvdXQ8VD4gewogCmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vdG9wb2xvZ3kvYmFzZS9CYXNlV2luZG93ZWRCb2x0LmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vdG9wb2xvZ3kvYmFzZS9CYXNlV2luZG93ZWRCb2x0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ0YWY5MAotLS0gL2Rldi9udWxsCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS90b3BvbG9neS9iYXNlL0Jhc2VXaW5kb3dlZEJvbHQuamF2YQpAQCAtMCwwICsxLDE3OSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYmFja3R5cGUuc3Rvcm0udG9wb2xvZ3kuYmFzZTsKKworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLkNvbmZpZzsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS50YXNrLk91dHB1dENvbGxlY3RvcjsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS50YXNrLlRvcG9sb2d5Q29udGV4dDsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS50b3BvbG9neS5JV2luZG93ZWRCb2x0OworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnRvcG9sb2d5Lk91dHB1dEZpZWxkc0RlY2xhcmVyOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLndpbmRvd2luZy5UdXBsZVdpbmRvdzsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIEJhc2VXaW5kb3dlZEJvbHQgaW1wbGVtZW50cyBJV2luZG93ZWRCb2x0IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQmFzZVdpbmRvd2VkQm9sdC5jbGFzcyk7CisKKyAgICBwcml2YXRlIGZpbmFsIHRyYW5zaWVudCBNYXA8U3RyaW5nLCBPYmplY3Q+IHdpbmRvd0NvbmZpZ3VyYXRpb247CisKKyAgICAvKioKKyAgICAgKiBIb2xkcyBhIGNvdW50IHZhbHVlIGZvciBjb3VudCBiYXNlZCB3aW5kb3dzIGFuZCBzbGlkaW5nIGludGVydmFscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENvdW50IHsKKyAgICAgICAgcHVibGljIGZpbmFsIGludCB2YWx1ZTsKKworICAgICAgICBwdWJsaWMgQ291bnQoaW50IHZhbHVlKSB7CisgICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIb2xkcyBhIFRpbWUgZHVyYXRpb24gZm9yIHRpbWUgYmFzZWQgd2luZG93cyBhbmQgc2xpZGluZyBpbnRlcnZhbHMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBEdXJhdGlvbiB7CisgICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgdmFsdWU7CisKKyAgICAgICAgcHVibGljIER1cmF0aW9uKGludCB2YWx1ZSwgVGltZVVuaXQgdGltZVVuaXQpIHsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSAoaW50KSB0aW1lVW5pdC50b01pbGxpcyh2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgQmFzZVdpbmRvd2VkQm9sdCgpIHsKKyAgICAgICAgd2luZG93Q29uZmlndXJhdGlvbiA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEJhc2VXaW5kb3dlZEJvbHQgd2l0aFdpbmRvd0xlbmd0aChDb3VudCBjb3VudCkgeworICAgICAgICB3aW5kb3dDb25maWd1cmF0aW9uLnB1dChDb25maWcuVE9QT0xPR1lfQk9MVFNfV0lORE9XX0xFTkdUSF9DT1VOVCwgY291bnQudmFsdWUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwcml2YXRlIEJhc2VXaW5kb3dlZEJvbHQgd2l0aFdpbmRvd0xlbmd0aChEdXJhdGlvbiBkdXJhdGlvbikgeworICAgICAgICB3aW5kb3dDb25maWd1cmF0aW9uLnB1dChDb25maWcuVE9QT0xPR1lfQk9MVFNfV0lORE9XX0xFTkdUSF9EVVJBVElPTl9NUywgZHVyYXRpb24udmFsdWUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwcml2YXRlIEJhc2VXaW5kb3dlZEJvbHQgd2l0aFNsaWRpbmdJbnRlcnZhbChDb3VudCBjb3VudCkgeworICAgICAgICB3aW5kb3dDb25maWd1cmF0aW9uLnB1dChDb25maWcuVE9QT0xPR1lfQk9MVFNfU0xJRElOR19JTlRFUlZBTF9DT1VOVCwgY291bnQudmFsdWUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwcml2YXRlIEJhc2VXaW5kb3dlZEJvbHQgd2l0aFNsaWRpbmdJbnRlcnZhbChEdXJhdGlvbiBkdXJhdGlvbikgeworICAgICAgICB3aW5kb3dDb25maWd1cmF0aW9uLnB1dChDb25maWcuVE9QT0xPR1lfQk9MVFNfU0xJRElOR19JTlRFUlZBTF9EVVJBVElPTl9NUywgZHVyYXRpb24udmFsdWUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUdXBsZSBjb3VudCBiYXNlZCBzbGlkaW5nIHdpbmRvdyBjb25maWd1cmF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHdpbmRvd0xlbmd0aCAgICB0aGUgbnVtYmVyIG9mIHR1cGxlcyBpbiB0aGUgd2luZG93CisgICAgICogQHBhcmFtIHNsaWRpbmdJbnRlcnZhbCB0aGUgbnVtYmVyIG9mIHR1cGxlcyBhZnRlciB3aGljaCB0aGUgd2luZG93IHNsaWRlcworICAgICAqLworICAgIHB1YmxpYyBCYXNlV2luZG93ZWRCb2x0IHdpdGhXaW5kb3coQ291bnQgd2luZG93TGVuZ3RoLCBDb3VudCBzbGlkaW5nSW50ZXJ2YWwpIHsKKyAgICAgICAgcmV0dXJuIHdpdGhXaW5kb3dMZW5ndGgod2luZG93TGVuZ3RoKS53aXRoU2xpZGluZ0ludGVydmFsKHNsaWRpbmdJbnRlcnZhbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVHVwbGUgY291bnQgYW5kIHRpbWUgZHVyYXRpb24gYmFzZWQgc2xpZGluZyB3aW5kb3cgY29uZmlndXJhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3aW5kb3dMZW5ndGggICAgdGhlIG51bWJlciBvZiB0dXBsZXMgaW4gdGhlIHdpbmRvdworICAgICAqIEBwYXJhbSBzbGlkaW5nSW50ZXJ2YWwgdGhlIHRpbWUgZHVyYXRpb24gYWZ0ZXIgd2hpY2ggdGhlIHdpbmRvdyBzbGlkZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgQmFzZVdpbmRvd2VkQm9sdCB3aXRoV2luZG93KENvdW50IHdpbmRvd0xlbmd0aCwgRHVyYXRpb24gc2xpZGluZ0ludGVydmFsKSB7CisgICAgICAgIHJldHVybiB3aXRoV2luZG93TGVuZ3RoKHdpbmRvd0xlbmd0aCkud2l0aFNsaWRpbmdJbnRlcnZhbChzbGlkaW5nSW50ZXJ2YWwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRpbWUgZHVyYXRpb24gYW5kIGNvdW50IGJhc2VkIHNsaWRpbmcgd2luZG93IGNvbmZpZ3VyYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gd2luZG93TGVuZ3RoICAgIHRoZSB0aW1lIGR1cmF0aW9uIG9mIHRoZSB3aW5kb3cKKyAgICAgKiBAcGFyYW0gc2xpZGluZ0ludGVydmFsIHRoZSBudW1iZXIgb2YgdHVwbGVzIGFmdGVyIHdoaWNoIHRoZSB3aW5kb3cgc2xpZGVzCisgICAgICovCisgICAgcHVibGljIEJhc2VXaW5kb3dlZEJvbHQgd2l0aFdpbmRvdyhEdXJhdGlvbiB3aW5kb3dMZW5ndGgsIENvdW50IHNsaWRpbmdJbnRlcnZhbCkgeworICAgICAgICByZXR1cm4gd2l0aFdpbmRvd0xlbmd0aCh3aW5kb3dMZW5ndGgpLndpdGhTbGlkaW5nSW50ZXJ2YWwoc2xpZGluZ0ludGVydmFsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaW1lIGR1cmF0aW9uIGJhc2VkIHNsaWRpbmcgd2luZG93IGNvbmZpZ3VyYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gd2luZG93TGVuZ3RoICAgIHRoZSB0aW1lIGR1cmF0aW9uIG9mIHRoZSB3aW5kb3cKKyAgICAgKiBAcGFyYW0gc2xpZGluZ0ludGVydmFsIHRoZSB0aW1lIGR1cmF0aW9uIGFmdGVyIHdoaWNoIHRoZSB3aW5kb3cgc2xpZGVzCisgICAgICovCisgICAgcHVibGljIEJhc2VXaW5kb3dlZEJvbHQgd2l0aFdpbmRvdyhEdXJhdGlvbiB3aW5kb3dMZW5ndGgsIER1cmF0aW9uIHNsaWRpbmdJbnRlcnZhbCkgeworICAgICAgICByZXR1cm4gd2l0aFdpbmRvd0xlbmd0aCh3aW5kb3dMZW5ndGgpLndpdGhTbGlkaW5nSW50ZXJ2YWwoc2xpZGluZ0ludGVydmFsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIHR1cGxlIGNvdW50IGJhc2VkIHdpbmRvdyB0aGF0IHNsaWRlcyB3aXRoIGV2ZXJ5IGluY29taW5nIHR1cGxlLgorICAgICAqCisgICAgICogQHBhcmFtIHdpbmRvd0xlbmd0aCB0aGUgbnVtYmVyIG9mIHR1cGxlcyBpbiB0aGUgd2luZG93CisgICAgICovCisgICAgcHVibGljIEJhc2VXaW5kb3dlZEJvbHQgd2l0aFdpbmRvdyhDb3VudCB3aW5kb3dMZW5ndGgpIHsKKyAgICAgICAgcmV0dXJuIHdpdGhXaW5kb3dMZW5ndGgod2luZG93TGVuZ3RoKS53aXRoU2xpZGluZ0ludGVydmFsKG5ldyBDb3VudCgxKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSB0aW1lIGR1cmF0aW9uIGJhc2VkIHdpbmRvdyB0aGF0IHNsaWRlcyB3aXRoIGV2ZXJ5IGluY29taW5nIHR1cGxlLgorICAgICAqCisgICAgICogQHBhcmFtIHdpbmRvd0xlbmd0aCB0aGUgdGltZSBkdXJhdGlvbiBvZiB0aGUgd2luZG93CisgICAgICovCisgICAgcHVibGljIEJhc2VXaW5kb3dlZEJvbHQgd2l0aFdpbmRvdyhEdXJhdGlvbiB3aW5kb3dMZW5ndGgpIHsKKyAgICAgICAgcmV0dXJuIHdpdGhXaW5kb3dMZW5ndGgod2luZG93TGVuZ3RoKS53aXRoU2xpZGluZ0ludGVydmFsKG5ldyBDb3VudCgxKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBjb3VudCBiYXNlZCB0dW1ibGluZyB3aW5kb3cuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY291bnQgdGhlIG51bWJlciBvZiB0dXBsZXMgYWZ0ZXIgd2hpY2ggdGhlIHdpbmRvdyB0dW1ibGVzCisgICAgICovCisgICAgcHVibGljIEJhc2VXaW5kb3dlZEJvbHQgd2l0aFR1bWJsaW5nV2luZG93KENvdW50IGNvdW50KSB7CisgICAgICAgIHJldHVybiB3aXRoV2luZG93TGVuZ3RoKGNvdW50KS53aXRoU2xpZGluZ0ludGVydmFsKGNvdW50KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIHRpbWUgZHVyYXRpb24gYmFzZWQgdHVtYmxpbmcgd2luZG93LgorICAgICAqCisgICAgICogQHBhcmFtIGR1cmF0aW9uIHRoZSB0aW1lIGR1cmF0aW9uIGFmdGVyIHdoaWNoIHRoZSB3aW5kb3cgdHVtYmxlcworICAgICAqLworICAgIHB1YmxpYyBCYXNlV2luZG93ZWRCb2x0IHdpdGhUdW1ibGluZ1dpbmRvdyhEdXJhdGlvbiBkdXJhdGlvbikgeworICAgICAgICByZXR1cm4gd2l0aFdpbmRvd0xlbmd0aChkdXJhdGlvbikud2l0aFNsaWRpbmdJbnRlcnZhbChkdXJhdGlvbik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcHJlcGFyZShNYXAgc3Rvcm1Db25mLCBUb3BvbG9neUNvbnRleHQgY29udGV4dCwgT3V0cHV0Q29sbGVjdG9yIGNvbGxlY3RvcikgeworICAgICAgICAvLyBOT09QCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2xlYW51cCgpIHsKKyAgICAgICAgLy8gTk9PUAorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRlY2xhcmVPdXRwdXRGaWVsZHMoT3V0cHV0RmllbGRzRGVjbGFyZXIgZGVjbGFyZXIpIHsKKyAgICAgICAgLy8gTk9PUAorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldENvbXBvbmVudENvbmZpZ3VyYXRpb24oKSB7CisgICAgICAgIHJldHVybiB3aW5kb3dDb25maWd1cmF0aW9uOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS90cmFuc2FjdGlvbmFsL1RyYW5zYWN0aW9uYWxTcG91dEJhdGNoRXhlY3V0b3IuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS90cmFuc2FjdGlvbmFsL1RyYW5zYWN0aW9uYWxTcG91dEJhdGNoRXhlY3V0b3IuamF2YQppbmRleCA1M2FhY2FlLi4xMDFhYmU2IDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vdHJhbnNhY3Rpb25hbC9UcmFuc2FjdGlvbmFsU3BvdXRCYXRjaEV4ZWN1dG9yLmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3RyYW5zYWN0aW9uYWwvVHJhbnNhY3Rpb25hbFNwb3V0QmF0Y2hFeGVjdXRvci5qYXZhCkBAIC0zMSwxMyArMzEsMTMgQEAKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAogcHVibGljIGNsYXNzIFRyYW5zYWN0aW9uYWxTcG91dEJhdGNoRXhlY3V0b3IgaW1wbGVtZW50cyBJUmljaEJvbHQgewotICAgIHB1YmxpYyBzdGF0aWMgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFRyYW5zYWN0aW9uYWxTcG91dEJhdGNoRXhlY3V0b3IuY2xhc3MpOyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihUcmFuc2FjdGlvbmFsU3BvdXRCYXRjaEV4ZWN1dG9yLmNsYXNzKTsKIAogICAgIEJhdGNoT3V0cHV0Q29sbGVjdG9ySW1wbCBfY29sbGVjdG9yOwogICAgIElUcmFuc2FjdGlvbmFsU3BvdXQgX3Nwb3V0OwogICAgIElUcmFuc2FjdGlvbmFsU3BvdXQuRW1pdHRlciBfZW1pdHRlcjsKICAgICAKLSAgICBUcmVlTWFwPEJpZ0ludGVnZXIsIFRyYW5zYWN0aW9uQXR0ZW1wdD4gX2FjdGl2ZVRyYW5zYWN0aW9ucyA9IG5ldyBUcmVlTWFwPEJpZ0ludGVnZXIsIFRyYW5zYWN0aW9uQXR0ZW1wdD4oKTsKKyAgICBUcmVlTWFwPEJpZ0ludGVnZXIsIFRyYW5zYWN0aW9uQXR0ZW1wdD4gX2FjdGl2ZVRyYW5zYWN0aW9ucyA9IG5ldyBUcmVlTWFwPD4oKTsKIAogICAgIHB1YmxpYyBUcmFuc2FjdGlvbmFsU3BvdXRCYXRjaEV4ZWN1dG9yKElUcmFuc2FjdGlvbmFsU3BvdXQgc3BvdXQpIHsKICAgICAgICAgX3Nwb3V0ID0gc3BvdXQ7CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vdHJhbnNhY3Rpb25hbC9UcmFuc2FjdGlvbmFsU3BvdXRDb29yZGluYXRvci5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3RyYW5zYWN0aW9uYWwvVHJhbnNhY3Rpb25hbFNwb3V0Q29vcmRpbmF0b3IuamF2YQppbmRleCBmN2NlNTM0Li5mOGY3M2Y2IDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vdHJhbnNhY3Rpb25hbC9UcmFuc2FjdGlvbmFsU3BvdXRDb29yZGluYXRvci5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS90cmFuc2FjdGlvbmFsL1RyYW5zYWN0aW9uYWxTcG91dENvb3JkaW5hdG9yLmphdmEKQEAgLTUyLDcgKzUyLDcgQEAKICAgICBwcml2YXRlIFRyYW5zYWN0aW9uYWxTdGF0ZSBfc3RhdGU7CiAgICAgcHJpdmF0ZSBSb3RhdGluZ1RyYW5zYWN0aW9uYWxTdGF0ZSBfY29vcmRpbmF0b3JTdGF0ZTsKICAgICAKLSAgICBUcmVlTWFwPEJpZ0ludGVnZXIsIFRyYW5zYWN0aW9uU3RhdHVzPiBfYWN0aXZlVHggPSBuZXcgVHJlZU1hcDxCaWdJbnRlZ2VyLCBUcmFuc2FjdGlvblN0YXR1cz4oKTsKKyAgICBUcmVlTWFwPEJpZ0ludGVnZXIsIFRyYW5zYWN0aW9uU3RhdHVzPiBfYWN0aXZlVHggPSBuZXcgVHJlZU1hcDw+KCk7CiAgICAgCiAgICAgcHJpdmF0ZSBTcG91dE91dHB1dENvbGxlY3RvciBfY29sbGVjdG9yOwogICAgIHByaXZhdGUgUmFuZG9tIF9yYW5kOwpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3RyYW5zYWN0aW9uYWwvcGFydGl0aW9uZWQvT3BhcXVlUGFydGl0aW9uZWRUcmFuc2FjdGlvbmFsU3BvdXRFeGVjdXRvci5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3RyYW5zYWN0aW9uYWwvcGFydGl0aW9uZWQvT3BhcXVlUGFydGl0aW9uZWRUcmFuc2FjdGlvbmFsU3BvdXRFeGVjdXRvci5qYXZhCmluZGV4IGFhYmNiN2EuLjAyMTg1ZjQgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS90cmFuc2FjdGlvbmFsL3BhcnRpdGlvbmVkL09wYXF1ZVBhcnRpdGlvbmVkVHJhbnNhY3Rpb25hbFNwb3V0RXhlY3V0b3IuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vdHJhbnNhY3Rpb25hbC9wYXJ0aXRpb25lZC9PcGFxdWVQYXJ0aXRpb25lZFRyYW5zYWN0aW9uYWxTcG91dEV4ZWN1dG9yLmphdmEKQEAgLTYzLDggKzYzLDggQEAKICAgICBwdWJsaWMgY2xhc3MgRW1pdHRlciBpbXBsZW1lbnRzIElDb21taXR0ZXJUcmFuc2FjdGlvbmFsU3BvdXQuRW1pdHRlciB7CiAgICAgICAgIElPcGFxdWVQYXJ0aXRpb25lZFRyYW5zYWN0aW9uYWxTcG91dC5FbWl0dGVyIF9lbWl0dGVyOwogICAgICAgICBUcmFuc2FjdGlvbmFsU3RhdGUgX3N0YXRlOwotICAgICAgICBUcmVlTWFwPEJpZ0ludGVnZXIsIE1hcDxJbnRlZ2VyLCBPYmplY3Q+PiBfY2FjaGVkTWV0YXMgPSBuZXcgVHJlZU1hcDxCaWdJbnRlZ2VyLCBNYXA8SW50ZWdlciwgT2JqZWN0Pj4oKTsKLSAgICAgICAgTWFwPEludGVnZXIsIFJvdGF0aW5nVHJhbnNhY3Rpb25hbFN0YXRlPiBfcGFydGl0aW9uU3RhdGVzID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgUm90YXRpbmdUcmFuc2FjdGlvbmFsU3RhdGU+KCk7CisgICAgICAgIFRyZWVNYXA8QmlnSW50ZWdlciwgTWFwPEludGVnZXIsIE9iamVjdD4+IF9jYWNoZWRNZXRhcyA9IG5ldyBUcmVlTWFwPD4oKTsKKyAgICAgICAgTWFwPEludGVnZXIsIFJvdGF0aW5nVHJhbnNhY3Rpb25hbFN0YXRlPiBfcGFydGl0aW9uU3RhdGVzID0gbmV3IEhhc2hNYXA8PigpOwogICAgICAgICBpbnQgX2luZGV4OwogICAgICAgICBpbnQgX251bVRhc2tzOwogICAgICAgICAKQEAgLTg0LDcgKzg0LDcgQEAKICAgICAgICAgCiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBlbWl0QmF0Y2goVHJhbnNhY3Rpb25BdHRlbXB0IHR4LCBPYmplY3QgY29vcmRpbmF0b3JNZXRhLCBCYXRjaE91dHB1dENvbGxlY3RvciBjb2xsZWN0b3IpIHsKLSAgICAgICAgICAgIE1hcDxJbnRlZ2VyLCBPYmplY3Q+IG1ldGFzID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgT2JqZWN0PigpOworICAgICAgICAgICAgTWFwPEludGVnZXIsIE9iamVjdD4gbWV0YXMgPSBuZXcgSGFzaE1hcDw+KCk7CiAgICAgICAgICAgICBfY2FjaGVkTWV0YXMucHV0KHR4LmdldFRyYW5zYWN0aW9uSWQoKSwgbWV0YXMpOwogICAgICAgICAgICAgaW50IHBhcnRpdGlvbnMgPSBfZW1pdHRlci5udW1QYXJ0aXRpb25zKCk7CiAgICAgICAgICAgICBFbnRyeTxCaWdJbnRlZ2VyLCBNYXA8SW50ZWdlciwgT2JqZWN0Pj4gZW50cnkgPSBfY2FjaGVkTWV0YXMubG93ZXJFbnRyeSh0eC5nZXRUcmFuc2FjdGlvbklkKCkpOwpAQCAtOTIsNyArOTIsNyBAQAogICAgICAgICAgICAgaWYoZW50cnkhPW51bGwpIHsKICAgICAgICAgICAgICAgICBwcmV2Q2FjaGVkID0gZW50cnkuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcHJldkNhY2hlZCA9IG5ldyBIYXNoTWFwPEludGVnZXIsIE9iamVjdD4oKTsKKyAgICAgICAgICAgICAgICBwcmV2Q2FjaGVkID0gbmV3IEhhc2hNYXA8PigpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgCiAgICAgICAgICAgICBmb3IoaW50IGk9X2luZGV4OyBpIDwgcGFydGl0aW9uczsgaSs9X251bVRhc2tzKSB7CkBAIC0xMjAsOCArMTIwLDkgQEAKICAgICAgICAgcHVibGljIHZvaWQgY29tbWl0KFRyYW5zYWN0aW9uQXR0ZW1wdCBhdHRlbXB0KSB7CiAgICAgICAgICAgICBCaWdJbnRlZ2VyIHR4aWQgPSBhdHRlbXB0LmdldFRyYW5zYWN0aW9uSWQoKTsKICAgICAgICAgICAgIE1hcDxJbnRlZ2VyLCBPYmplY3Q+IG1ldGFzID0gX2NhY2hlZE1ldGFzLnJlbW92ZSh0eGlkKTsKLSAgICAgICAgICAgIGZvcihJbnRlZ2VyIHBhcnRpdGlvbjogbWV0YXMua2V5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgbWV0YSA9IG1ldGFzLmdldChwYXJ0aXRpb24pOworICAgICAgICAgICAgZm9yKEVudHJ5PEludGVnZXIsIE9iamVjdD4gZW50cnk6IG1ldGFzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBJbnRlZ2VyIHBhcnRpdGlvbiA9IGVudHJ5LmdldEtleSgpOworICAgICAgICAgICAgICAgIE9iamVjdCBtZXRhID0gZW50cnkuZ2V0VmFsdWUoKTsKICAgICAgICAgICAgICAgICBfcGFydGl0aW9uU3RhdGVzLmdldChwYXJ0aXRpb24pLm92ZXJyaWRlU3RhdGUodHhpZCwgbWV0YSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS90cmFuc2FjdGlvbmFsL3BhcnRpdGlvbmVkL1BhcnRpdGlvbmVkVHJhbnNhY3Rpb25hbFNwb3V0RXhlY3V0b3IuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS90cmFuc2FjdGlvbmFsL3BhcnRpdGlvbmVkL1BhcnRpdGlvbmVkVHJhbnNhY3Rpb25hbFNwb3V0RXhlY3V0b3IuamF2YQppbmRleCA0NzlkZGE0Li43Njg1OWNmIDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vdHJhbnNhY3Rpb25hbC9wYXJ0aXRpb25lZC9QYXJ0aXRpb25lZFRyYW5zYWN0aW9uYWxTcG91dEV4ZWN1dG9yLmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3RyYW5zYWN0aW9uYWwvcGFydGl0aW9uZWQvUGFydGl0aW9uZWRUcmFuc2FjdGlvbmFsU3BvdXRFeGVjdXRvci5qYXZhCkBAIC02Nyw3ICs2Nyw3IEBACiAgICAgY2xhc3MgRW1pdHRlciBpbXBsZW1lbnRzIElUcmFuc2FjdGlvbmFsU3BvdXQuRW1pdHRlcjxJbnRlZ2VyPiB7CiAgICAgICAgIHByaXZhdGUgSVBhcnRpdGlvbmVkVHJhbnNhY3Rpb25hbFNwb3V0LkVtaXR0ZXIgX2VtaXR0ZXI7CiAgICAgICAgIHByaXZhdGUgVHJhbnNhY3Rpb25hbFN0YXRlIF9zdGF0ZTsKLSAgICAgICAgcHJpdmF0ZSBNYXA8SW50ZWdlciwgUm90YXRpbmdUcmFuc2FjdGlvbmFsU3RhdGU+IF9wYXJ0aXRpb25TdGF0ZXMgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBSb3RhdGluZ1RyYW5zYWN0aW9uYWxTdGF0ZT4oKTsKKyAgICAgICAgcHJpdmF0ZSBNYXA8SW50ZWdlciwgUm90YXRpbmdUcmFuc2FjdGlvbmFsU3RhdGU+IF9wYXJ0aXRpb25TdGF0ZXMgPSBuZXcgSGFzaE1hcDw+KCk7CiAgICAgICAgIHByaXZhdGUgaW50IF9pbmRleDsKICAgICAgICAgcHJpdmF0ZSBpbnQgX251bVRhc2tzOwogICAgICAgICAKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS90dXBsZS9BZGRyZXNzZWRUdXBsZS5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3R1cGxlL0FkZHJlc3NlZFR1cGxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNhZWM3MgotLS0gL2Rldi9udWxsCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS90dXBsZS9BZGRyZXNzZWRUdXBsZS5qYXZhCkBAIC0wLDAgKzEsNDggQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGJhY2t0eXBlLnN0b3JtLnR1cGxlOworCisvKioKKyAqIEEgVHVwbGUgdGhhdCBpcyBhZGRyZXNzZWQgdG8gYSBkZXN0aW5hdGlvbi4KKyAqLworcHVibGljIGNsYXNzIEFkZHJlc3NlZFR1cGxlIHsKKyAgICAvKioKKyAgICAgKiBEZXN0aW5hdGlvbiB1c2VkIHdoZW4gYnJvYWRjYXN0aW5nIGEgdHVwbGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlJPQURDQVNUX0RFU1QgPSAtMjsKKyAgICBwdWJsaWMgZmluYWwgVHVwbGUgdHVwbGU7CisgICAgcHVibGljIGZpbmFsIGludCBkZXN0OworCisgICAgcHVibGljIEFkZHJlc3NlZFR1cGxlKGludCBkZXN0LCBUdXBsZSB0dXBsZSkgeworICAgICAgICB0aGlzLmRlc3QgPSBkZXN0OworICAgICAgICB0aGlzLnR1cGxlID0gdHVwbGU7CisgICAgfQorCisgICAgcHVibGljIFR1cGxlIGdldFR1cGxlKCkgeworICAgICAgICByZXR1cm4gdHVwbGU7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXREZXN0KCkgeworICAgICAgICByZXR1cm4gZGVzdDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIltkZXN0OiAiK2Rlc3QrIiB0dXBsZTogIit0dXBsZSsiXSI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3R1cGxlL0ZpZWxkcy5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3R1cGxlL0ZpZWxkcy5qYXZhCmluZGV4IDNlZWQ0MDkuLmI1MmI3OTggMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS90dXBsZS9GaWVsZHMuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vdHVwbGUvRmllbGRzLmphdmEKQEAgLTMwLDE0ICszMCwxNCBAQAogICovCiBwdWJsaWMgY2xhc3MgRmllbGRzIGltcGxlbWVudHMgSXRlcmFibGU8U3RyaW5nPiwgU2VyaWFsaXphYmxlIHsKICAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBfZmllbGRzOwotICAgIHByaXZhdGUgTWFwPFN0cmluZywgSW50ZWdlcj4gX2luZGV4ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOworICAgIHByaXZhdGUgTWFwPFN0cmluZywgSW50ZWdlcj4gX2luZGV4ID0gbmV3IEhhc2hNYXA8PigpOwogICAgIAogICAgIHB1YmxpYyBGaWVsZHMoU3RyaW5nLi4uIGZpZWxkcykgewogICAgICAgICB0aGlzKEFycmF5cy5hc0xpc3QoZmllbGRzKSk7CiAgICAgfQogICAgIAogICAgIHB1YmxpYyBGaWVsZHMoTGlzdDxTdHJpbmc+IGZpZWxkcykgewotICAgICAgICBfZmllbGRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KGZpZWxkcy5zaXplKCkpOworICAgICAgICBfZmllbGRzID0gbmV3IEFycmF5TGlzdDw+KGZpZWxkcy5zaXplKCkpOwogICAgICAgICBmb3IgKFN0cmluZyBmaWVsZCA6IGZpZWxkcykgewogICAgICAgICAgICAgaWYgKF9maWVsZHMuY29udGFpbnMoZmllbGQpKQogICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCkBAIC00OSw3ICs0OSw3IEBACiAgICAgfQogICAgIAogICAgIHB1YmxpYyBMaXN0PE9iamVjdD4gc2VsZWN0KEZpZWxkcyBzZWxlY3RvciwgTGlzdDxPYmplY3Q+IHR1cGxlKSB7Ci0gICAgICAgIExpc3Q8T2JqZWN0PiByZXQgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oc2VsZWN0b3Iuc2l6ZSgpKTsKKyAgICAgICAgTGlzdDxPYmplY3Q+IHJldCA9IG5ldyBBcnJheUxpc3Q8PihzZWxlY3Rvci5zaXplKCkpOwogICAgICAgICBmb3IoU3RyaW5nIHM6IHNlbGVjdG9yKSB7CiAgICAgICAgICAgICByZXQuYWRkKHR1cGxlLmdldChfaW5kZXguZ2V0KHMpKSk7CiAgICAgICAgIH0KQEAgLTU3LDcgKzU3LDcgQEAKICAgICB9CiAKICAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IHRvTGlzdCgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8U3RyaW5nPihfZmllbGRzKTsKKyAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8PihfZmllbGRzKTsKICAgICB9CiAgICAgCiAgICAgLyoqCkBAIC05OCw3ICs5OCw3IEBACiAgICAgfQogICAgIAogICAgIC8qKgotICAgICAqIEByZXR1cm5zIHRydWUgaWYgdGhpcyBjb250YWlucyB0aGUgc3BlY2lmaWVkIG5hbWUgb2YgdGhlIGZpZWxkLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgbmFtZSBvZiB0aGUgZmllbGQuCiAgICAgICovCiAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoU3RyaW5nIGZpZWxkKSB7CiAgICAgICAgIHJldHVybiBfaW5kZXguY29udGFpbnNLZXkoZmllbGQpOwpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3R1cGxlL01lc3NhZ2VJZC5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3R1cGxlL01lc3NhZ2VJZC5qYXZhCmluZGV4IDY4MGFmMzguLjU1NGJhYjYgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS90dXBsZS9NZXNzYWdlSWQuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vdHVwbGUvTWVzc2FnZUlkLmphdmEKQEAgLTQzLDcgKzQzLDcgQEAKICAgICB9CiAgICAgICAgIAogICAgIHB1YmxpYyBzdGF0aWMgTWVzc2FnZUlkIG1ha2VSb290SWQobG9uZyBpZCwgbG9uZyB2YWwpIHsKLSAgICAgICAgTWFwPExvbmcsIExvbmc+IGFuY2hvcnNUb0lkcyA9IG5ldyBIYXNoTWFwPExvbmcsIExvbmc+KCk7CisgICAgICAgIE1hcDxMb25nLCBMb25nPiBhbmNob3JzVG9JZHMgPSBuZXcgSGFzaE1hcDw+KCk7CiAgICAgICAgIGFuY2hvcnNUb0lkcy5wdXQoaWQsIHZhbCk7CiAgICAgICAgIHJldHVybiBuZXcgTWVzc2FnZUlkKGFuY2hvcnNUb0lkcyk7CiAgICAgfQpAQCAtNjcsMTEgKzY3LDcgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKLSAgICAgICAgaWYob3RoZXIgaW5zdGFuY2VvZiBNZXNzYWdlSWQpIHsKLSAgICAgICAgICAgIHJldHVybiBfYW5jaG9yc1RvSWRzLmVxdWFscygoKE1lc3NhZ2VJZCkgb3RoZXIpLl9hbmNob3JzVG9JZHMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9CisgICAgICAgIHJldHVybiBvdGhlciBpbnN0YW5jZW9mIE1lc3NhZ2VJZCAmJiBfYW5jaG9yc1RvSWRzLmVxdWFscygoKE1lc3NhZ2VJZCkgb3RoZXIpLl9hbmNob3JzVG9JZHMpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpAQCAtODksNyArODUsNyBAQAogCiAgICAgcHVibGljIHN0YXRpYyBNZXNzYWdlSWQgZGVzZXJpYWxpemUoSW5wdXQgaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CiAgICAgICAgIGludCBudW1BbmNob3JzID0gaW4ucmVhZEludCh0cnVlKTsKLSAgICAgICAgTWFwPExvbmcsIExvbmc+IGFuY2hvcnNUb0lkcyA9IG5ldyBIYXNoTWFwPExvbmcsIExvbmc+KCk7CisgICAgICAgIE1hcDxMb25nLCBMb25nPiBhbmNob3JzVG9JZHMgPSBuZXcgSGFzaE1hcDw+KCk7CiAgICAgICAgIGZvcihpbnQgaT0wOyBpPG51bUFuY2hvcnM7IGkrKykgewogICAgICAgICAgICAgYW5jaG9yc1RvSWRzLnB1dChpbi5yZWFkTG9uZygpLCBpbi5yZWFkTG9uZygpKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3R1cGxlL1R1cGxlLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vdHVwbGUvVHVwbGUuamF2YQppbmRleCA3OTliZjY4Li4xOWQwY2I0IDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vdHVwbGUvVHVwbGUuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vdHVwbGUvVHVwbGUuamF2YQpAQCAtMTgsNyArMTgsNiBAQAogcGFja2FnZSBiYWNrdHlwZS5zdG9ybS50dXBsZTsKIAogaW1wb3J0IGJhY2t0eXBlLnN0b3JtLmdlbmVyYXRlZC5HbG9iYWxTdHJlYW1JZDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogLyoqCiAgKiBUaGUgdHVwbGUgaXMgdGhlIG1haW4gZGF0YSBzdHJ1Y3R1cmUgaW4gU3Rvcm0uIEEgdHVwbGUgaXMgYSBuYW1lZCBsaXN0IG9mIHZhbHVlcywgCkBAIC0zNiwxMCArMzUsMTggQEAKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIGdsb2JhbCBzdHJlYW0gaWQgKGNvbXBvbmVudCArIHN0cmVhbSkgb2YgdGhpcyB0dXBsZS4KKyAgICAgKiAKKyAgICAgKiBAZGVwcmVjYXRlZCByZXBsYWNlZCBieSB7QGxpbmsgI2dldFNvdXJjZUdsb2JhbFN0cmVhbUlkKCl9IGR1ZSB0byBicm9rZW4gbmFtaW5nIGNvbnZlbnRpb24KICAgICAgKi8KKyAgICBARGVwcmVjYXRlZAogICAgIHB1YmxpYyBHbG9iYWxTdHJlYW1JZCBnZXRTb3VyY2VHbG9iYWxTdHJlYW1pZCgpOwogICAgIAogICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGdsb2JhbCBzdHJlYW0gaWQgKGNvbXBvbmVudCArIHN0cmVhbSkgb2YgdGhpcyB0dXBsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgR2xvYmFsU3RyZWFtSWQgZ2V0U291cmNlR2xvYmFsU3RyZWFtSWQoKTsKKworICAgIC8qKgogICAgICAqIEdldHMgdGhlIGlkIG9mIHRoZSBjb21wb25lbnQgdGhhdCBjcmVhdGVkIHRoaXMgdHVwbGUuCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBnZXRTb3VyY2VDb21wb25lbnQoKTsKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS90dXBsZS9UdXBsZUltcGwuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS90dXBsZS9UdXBsZUltcGwuamF2YQppbmRleCA4MThlZmYxLi5kZDMxYzk2IDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vdHVwbGUvVHVwbGVJbXBsLmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3R1cGxlL1R1cGxlSW1wbC5qYXZhCkBAIC00MCw3ICs0MCw3IEBACiAgICAgcHJpdmF0ZSBTdHJpbmcgc3RyZWFtSWQ7CiAgICAgcHJpdmF0ZSBHZW5lcmFsVG9wb2xvZ3lDb250ZXh0IGNvbnRleHQ7CiAgICAgcHJpdmF0ZSBNZXNzYWdlSWQgaWQ7Ci0gICAgcHJpdmF0ZSBJUGVyc2lzdGVudE1hcCBfbWV0YSA9IG51bGw7CisgICAgcHJpdmF0ZSBJUGVyc2lzdGVudE1hcCBfbWV0YTsKICAgICAKICAgICBwdWJsaWMgVHVwbGVJbXBsKEdlbmVyYWxUb3BvbG9neUNvbnRleHQgY29udGV4dCwgTGlzdDxPYmplY3Q+IHZhbHVlcywgaW50IHRhc2tJZCwgU3RyaW5nIHN0cmVhbUlkLCBNZXNzYWdlSWQgaWQpIHsKICAgICAgICAgdGhpcy52YWx1ZXMgPSB2YWx1ZXM7CkBAIC02Myw4ICs2Myw4IEBACiAgICAgICAgIHRoaXMoY29udGV4dCwgdmFsdWVzLCB0YXNrSWQsIHN0cmVhbUlkLCBNZXNzYWdlSWQubWFrZVVuYW5jaG9yZWQoKSk7CiAgICAgfSAgICAKICAgICAKLSAgICBMb25nIF9wcm9jZXNzU2FtcGxlU3RhcnRUaW1lID0gbnVsbDsKLSAgICBMb25nIF9leGVjdXRlU2FtcGxlU3RhcnRUaW1lID0gbnVsbDsKKyAgICBMb25nIF9wcm9jZXNzU2FtcGxlU3RhcnRUaW1lOworICAgIExvbmcgX2V4ZWN1dGVTYW1wbGVTdGFydFRpbWU7CiAgICAgCiAgICAgcHVibGljIHZvaWQgc2V0UHJvY2Vzc1NhbXBsZVN0YXJ0VGltZShsb25nIG1zKSB7CiAgICAgICAgIF9wcm9jZXNzU2FtcGxlU3RhcnRUaW1lID0gbXM7CkBAIC0xOTYsOCArMTk2LDEzIEBACiAgICAgcHVibGljIExpc3Q8T2JqZWN0PiBzZWxlY3QoRmllbGRzIHNlbGVjdG9yKSB7CiAgICAgICAgIHJldHVybiBnZXRGaWVsZHMoKS5zZWxlY3Qoc2VsZWN0b3IsIHZhbHVlcyk7CiAgICAgfQotICAgICAgCisgICAgCisgICAgQERlcHJlY2F0ZWQKICAgICBwdWJsaWMgR2xvYmFsU3RyZWFtSWQgZ2V0U291cmNlR2xvYmFsU3RyZWFtaWQoKSB7CisgICAgICAgIHJldHVybiBnZXRTb3VyY2VHbG9iYWxTdHJlYW1JZCgpOworICAgIH0KKyAgICAKKyAgICBwdWJsaWMgR2xvYmFsU3RyZWFtSWQgZ2V0U291cmNlR2xvYmFsU3RyZWFtSWQoKSB7CiAgICAgICAgIHJldHVybiBuZXcgR2xvYmFsU3RyZWFtSWQoZ2V0U291cmNlQ29tcG9uZW50KCksIHN0cmVhbUlkKTsKICAgICB9CiAgICAgCkBAIC0yMzIsNyArMjM3LDcgQEAKICAgICAgICAgcmV0dXJuIFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKHRoaXMpOwogICAgIH0KIAotICAgIHByaXZhdGUgZmluYWwgS2V5d29yZCBtYWtlS2V5d29yZChTdHJpbmcgbmFtZSkgeworICAgIHByaXZhdGUgS2V5d29yZCBtYWtlS2V5d29yZChTdHJpbmcgbmFtZSkgewogICAgICAgICByZXR1cm4gS2V5d29yZC5pbnRlcm4oU3ltYm9sLmNyZWF0ZShuYW1lKSk7CiAgICAgfSAgICAKIApAQCAtMjQ1LDcgKzI1MCw3IEBACiAgICAgICAgICAgICB9IGVsc2UgaWYobyBpbnN0YW5jZW9mIFN0cmluZykgewogICAgICAgICAgICAgICAgIHJldHVybiBnZXRWYWx1ZUJ5RmllbGQoKFN0cmluZykgbyk7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2goSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfSBjYXRjaChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWdub3JlZCkgewogICAgICAgICB9CiAgICAgICAgIHJldHVybiBudWxsOwogICAgIH0KZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS91dGlscy9EUlBDQ2xpZW50LmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vdXRpbHMvRFJQQ0NsaWVudC5qYXZhCmluZGV4IGIyYTJhN2QuLjIzZGViMjggMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS91dGlscy9EUlBDQ2xpZW50LmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3V0aWxzL0RSUENDbGllbnQuamF2YQpAQCAtMTcsNyArMTcsNiBAQAogICovCiBwYWNrYWdlIGJhY2t0eXBlLnN0b3JtLnV0aWxzOwogCi1pbXBvcnQgYmFja3R5cGUuc3Rvcm0uQ29uZmlnOwogaW1wb3J0IGJhY2t0eXBlLnN0b3JtLmdlbmVyYXRlZC5EUlBDRXhlY3V0aW9uRXhjZXB0aW9uOwogaW1wb3J0IGJhY2t0eXBlLnN0b3JtLmdlbmVyYXRlZC5EaXN0cmlidXRlZFJQQzsKIGltcG9ydCBiYWNrdHlwZS5zdG9ybS5nZW5lcmF0ZWQuQXV0aG9yaXphdGlvbkV4Y2VwdGlvbjsKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS91dGlscy9EaXNydXB0b3JRdWV1ZS5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3V0aWxzL0Rpc3J1cHRvclF1ZXVlLmphdmEKaW5kZXggZTAwNTNlOS4uNWQ2ODkwOSAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3V0aWxzL0Rpc3J1cHRvclF1ZXVlLmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3V0aWxzL0Rpc3J1cHRvclF1ZXVlLmphdmEKQEAgLTYsOSArNiw5IEBACiAgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCiAgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCiAgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiA8cC8+CisgKgogICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiA8cC8+CisgKgogICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgpAQCAtMTgsMTAyICsxOCw0MDMgQEAKIHBhY2thZ2UgYmFja3R5cGUuc3Rvcm0udXRpbHM7CiAKIGltcG9ydCBjb20ubG1heC5kaXNydXB0b3IuQWxlcnRFeGNlcHRpb247Ci1pbXBvcnQgY29tLmxtYXguZGlzcnVwdG9yLkNsYWltU3RyYXRlZ3k7CiBpbXBvcnQgY29tLmxtYXguZGlzcnVwdG9yLkV2ZW50RmFjdG9yeTsKIGltcG9ydCBjb20ubG1heC5kaXNydXB0b3IuRXZlbnRIYW5kbGVyOwogaW1wb3J0IGNvbS5sbWF4LmRpc3J1cHRvci5JbnN1ZmZpY2llbnRDYXBhY2l0eUV4Y2VwdGlvbjsKK2ltcG9ydCBjb20ubG1heC5kaXNydXB0b3IuTGl0ZUJsb2NraW5nV2FpdFN0cmF0ZWd5OwogaW1wb3J0IGNvbS5sbWF4LmRpc3J1cHRvci5SaW5nQnVmZmVyOwogaW1wb3J0IGNvbS5sbWF4LmRpc3J1cHRvci5TZXF1ZW5jZTsKIGltcG9ydCBjb20ubG1heC5kaXNydXB0b3IuU2VxdWVuY2VCYXJyaWVyOwotaW1wb3J0IGNvbS5sbWF4LmRpc3J1cHRvci5TaW5nbGVUaHJlYWRlZENsYWltU3RyYXRlZ3k7CitpbXBvcnQgY29tLmxtYXguZGlzcnVwdG9yLlRpbWVvdXRCbG9ja2luZ1dhaXRTdHJhdGVneTsKK2ltcG9ydCBjb20ubG1heC5kaXNydXB0b3IuVGltZW91dEV4Y2VwdGlvbjsKIGltcG9ydCBjb20ubG1heC5kaXNydXB0b3IuV2FpdFN0cmF0ZWd5OworaW1wb3J0IGNvbS5sbWF4LmRpc3J1cHRvci5kc2wuUHJvZHVjZXJUeXBlOwogCi1pbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TGlua2VkUXVldWU7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuTG9jazsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWVudHJhbnRSZWFkV3JpdGVMb2NrOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5UaW1lcjsKK2ltcG9ydCBqYXZhLnV0aWwuVGltZXJUYXNrOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkFycmF5QmxvY2tpbmdRdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TGlua2VkUXVldWU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNCb29sZWFuOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNMb25nOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50TG9jazsKKworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiAKIGltcG9ydCBiYWNrdHlwZS5zdG9ybS5tZXRyaWMuYXBpLklTdGF0ZWZ1bE9iamVjdDsKLQoraW1wb3J0IGJhY2t0eXBlLnN0b3JtLm1ldHJpYy5pbnRlcm5hbC5SYXRlVHJhY2tlcjsKIAogLyoqCiAgKiBBIHNpbmdsZSBjb25zdW1lciBxdWV1ZSB0aGF0IHVzZXMgdGhlIExNQVggRGlzcnVwdG9yLiBUaGV5IGtleSB0byB0aGUgcGVyZm9ybWFuY2UgaXMKICAqIHRoZSBhYmlsaXR5IHRvIGNhdGNoIHVwIHRvIHRoZSBwcm9kdWNlciBieSBwcm9jZXNzaW5nIHR1cGxlcyBpbiBiYXRjaGVzLgogICovCiBwdWJsaWMgY2xhc3MgRGlzcnVwdG9yUXVldWUgaW1wbGVtZW50cyBJU3RhdGVmdWxPYmplY3QgewotICAgIHN0YXRpYyBmaW5hbCBPYmplY3QgRkxVU0hfQ0FDSEUgPSBuZXcgT2JqZWN0KCk7Ci0gICAgc3RhdGljIGZpbmFsIE9iamVjdCBJTlRFUlJVUFQgPSBuZXcgT2JqZWN0KCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKERpc3J1cHRvclF1ZXVlLmNsYXNzKTsgICAgCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IElOVEVSUlVQVCA9IG5ldyBPYmplY3QoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYID0gImRpc3J1cHRvci0iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZsdXNoZXJQb29sIEZMVVNIRVIgPSBuZXcgRmx1c2hlclBvb2woKTsKIAotICAgIFJpbmdCdWZmZXI8TXV0YWJsZU9iamVjdD4gX2J1ZmZlcjsKLSAgICBTZXF1ZW5jZSBfY29uc3VtZXI7Ci0gICAgU2VxdWVuY2VCYXJyaWVyIF9iYXJyaWVyOworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEZsdXNoZXJQb29sIHsgCisgICAgICAgIHByaXZhdGUgVGltZXIgX3RpbWVyID0gbmV3IFRpbWVyKCJkaXNydXB0b3ItZmx1c2gtdHJpZ2dlciIsIHRydWUpOworICAgICAgICBwcml2YXRlIFRocmVhZFBvb2xFeGVjdXRvciBfZXhlYyA9IG5ldyBUaHJlYWRQb29sRXhlY3V0b3IoMSwgMTAwLCAxMCwgVGltZVVuaXQuU0VDT05EUywgbmV3IEFycmF5QmxvY2tpbmdRdWV1ZTxSdW5uYWJsZT4oMTAyNCksIG5ldyBUaHJlYWRQb29sRXhlY3V0b3IuRGlzY2FyZFBvbGljeSgpKTsKKyAgICAgICAgcHJpdmF0ZSBIYXNoTWFwPExvbmcsIEFycmF5TGlzdDxGbHVzaGVyPj4gX3BlbmRpbmdGbHVzaCA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgcHJpdmF0ZSBIYXNoTWFwPExvbmcsIFRpbWVyVGFzaz4gX3R0ID0gbmV3IEhhc2hNYXA8PigpOwogCi0gICAgLy8gVE9ETzogY29uc2lkZXIgaGF2aW5nIGEgdGhyZWFkbG9jYWwgY2FjaGUgb2YgdGhpcyB2YXJpYWJsZSB0byBzcGVlZCB1cCByZWFkcz8KLSAgICB2b2xhdGlsZSBib29sZWFuIGNvbnN1bWVyU3RhcnRlZEZsYWcgPSBmYWxzZTsKLSAgICBDb25jdXJyZW50TGlua2VkUXVldWU8T2JqZWN0PiBfY2FjaGUgPSBuZXcgQ29uY3VycmVudExpbmtlZFF1ZXVlKCk7CisgICAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdGFydChGbHVzaGVyIGZsdXNoZXIsIGZpbmFsIGxvbmcgZmx1c2hJbnRlcnZhbCkgeworICAgICAgICAgICAgQXJyYXlMaXN0PEZsdXNoZXI+IHBlbmRpbmcgPSBfcGVuZGluZ0ZsdXNoLmdldChmbHVzaEludGVydmFsKTsKKyAgICAgICAgICAgIGlmIChwZW5kaW5nID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBwZW5kaW5nID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgICAgICAgVGltZXJUYXNrIHQgPSBuZXcgVGltZXJUYXNrKCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW52b2tlQWxsKGZsdXNoSW50ZXJ2YWwpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICBfcGVuZGluZ0ZsdXNoLnB1dChmbHVzaEludGVydmFsLCBwZW5kaW5nKTsKKyAgICAgICAgICAgICAgICBfdGltZXIuc2NoZWR1bGUodCwgZmx1c2hJbnRlcnZhbCwgZmx1c2hJbnRlcnZhbCk7CisgICAgICAgICAgICAgICAgX3R0LnB1dChmbHVzaEludGVydmFsLCB0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBlbmRpbmcuYWRkKGZsdXNoZXIpOworICAgICAgICB9CiAKLSAgICBwcml2YXRlIGZpbmFsIFJlZW50cmFudFJlYWRXcml0ZUxvY2sgY2FjaGVMb2NrID0gbmV3IFJlZW50cmFudFJlYWRXcml0ZUxvY2soKTsKLSAgICBwcml2YXRlIGZpbmFsIExvY2sgcmVhZExvY2sgPSBjYWNoZUxvY2sucmVhZExvY2soKTsKLSAgICBwcml2YXRlIGZpbmFsIExvY2sgd3JpdGVMb2NrID0gY2FjaGVMb2NrLndyaXRlTG9jaygpOworICAgICAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGludm9rZUFsbChsb25nIGZsdXNoSW50ZXJ2YWwpIHsKKyAgICAgICAgICAgIEFycmF5TGlzdDxGbHVzaGVyPiB0YXNrcyA9IF9wZW5kaW5nRmx1c2guZ2V0KGZsdXNoSW50ZXJ2YWwpOworICAgICAgICAgICAgaWYgKHRhc2tzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKEZsdXNoZXIgZjogdGFza3MpIHsKKyAgICAgICAgICAgICAgICAgICAgX2V4ZWMuc3VibWl0KGYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFBSRUZJWCA9ICJkaXNydXB0b3ItIjsKLSAgICBwcml2YXRlIFN0cmluZyBfcXVldWVOYW1lID0gIiI7CisgICAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdG9wKEZsdXNoZXIgZmx1c2hlciwgbG9uZyBmbHVzaEludGVydmFsKSB7CisgICAgICAgICAgICBBcnJheUxpc3Q8Rmx1c2hlcj4gcGVuZGluZyA9IF9wZW5kaW5nRmx1c2guZ2V0KGZsdXNoSW50ZXJ2YWwpOworICAgICAgICAgICAgcGVuZGluZy5yZW1vdmUoZmx1c2hlcik7CisgICAgICAgICAgICBpZiAocGVuZGluZy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIF9wZW5kaW5nRmx1c2gucmVtb3ZlKGZsdXNoSW50ZXJ2YWwpOworICAgICAgICAgICAgICAgIF90dC5yZW1vdmUoZmx1c2hJbnRlcnZhbCkuY2FuY2VsKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLSAgICBwcml2YXRlIGxvbmcgX3dhaXRUaW1lb3V0OworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE9iamVjdEV2ZW50RmFjdG9yeSBpbXBsZW1lbnRzIEV2ZW50RmFjdG9yeTxBdG9taWNSZWZlcmVuY2U8T2JqZWN0Pj4geworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEF0b21pY1JlZmVyZW5jZTxPYmplY3Q+IG5ld0luc3RhbmNlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBBdG9taWNSZWZlcmVuY2U8T2JqZWN0PigpOworICAgICAgICB9CisgICAgfQogCisgICAgcHJpdmF0ZSBpbnRlcmZhY2UgVGhyZWFkTG9jYWxJbnNlcnRlciB7CisgICAgICAgIHB1YmxpYyB2b2lkIGFkZChPYmplY3Qgb2JqKTsKKyAgICAgICAgcHVibGljIHZvaWQgZm9yY2VCYXRjaCgpOworICAgICAgICBwdWJsaWMgdm9pZCBmbHVzaChib29sZWFuIGJsb2NrKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFRocmVhZExvY2FsSnVzdEluc2VydGVyIGltcGxlbWVudHMgVGhyZWFkTG9jYWxJbnNlcnRlciB7CisgICAgICAgIHByaXZhdGUgZmluYWwgUmVlbnRyYW50TG9jayBfZmx1c2hMb2NrOworICAgICAgICBwcml2YXRlIGZpbmFsIENvbmN1cnJlbnRMaW5rZWRRdWV1ZTxPYmplY3Q+IF9vdmVyZmxvdzsKKworICAgICAgICBwdWJsaWMgVGhyZWFkTG9jYWxKdXN0SW5zZXJ0ZXIoKSB7CisgICAgICAgICAgICBfZmx1c2hMb2NrID0gbmV3IFJlZW50cmFudExvY2soKTsKKyAgICAgICAgICAgIF9vdmVyZmxvdyA9IG5ldyBDb25jdXJyZW50TGlua2VkUXVldWU8PigpOworICAgICAgICB9CisKKyAgICAgICAgLy9jYWxsZWQgYnkgdGhlIG1haW4gdGhyZWFkIGFuZCBzaG91bGQgbm90IGJsb2NrIGZvciBhbiB1bmRlZmluZWQgcGVyaW9kIG9mIHRpbWUKKyAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZChPYmplY3Qgb2JqKSB7CisgICAgICAgICAgICBib29sZWFuIGluc2VydGVkID0gZmFsc2U7CisgICAgICAgICAgICBpZiAoX292ZXJmbG93LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHB1Ymxpc2hEaXJlY3RTaW5nbGUob2JqLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIGluc2VydGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnN1ZmZpY2llbnRDYXBhY2l0eUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vSWdub3JlZAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFpbnNlcnRlZCkgeworICAgICAgICAgICAgICAgIF9vdmVyZmxvd0NvdW50LmluY3JlbWVudEFuZEdldCgpOworICAgICAgICAgICAgICAgIF9vdmVyZmxvdy5hZGQob2JqKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKF9lbmFibGVCYWNrcHJlc3N1cmUgJiYgX2NiICE9IG51bGwgJiYgKF9tZXRyaWNzLnBvcHVsYXRpb24oKSArIF9vdmVyZmxvd0NvdW50LmdldCgpKSA+PSBfaGlnaFdhdGVyTWFyaykgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghX3Rocm90dGxlT24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9jYi5oaWdoV2F0ZXJNYXJrKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBfdGhyb3R0bGVPbiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRXhjZXB0aW9uIGR1cmluZyBjYWxsaW5nIGhpZ2hXYXRlck1hcmsgY2FsbGJhY2shIiwgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy9NYXkgYmUgY2FsbGVkIGJ5IGEgYmFja2dyb3VuZCB0aHJlYWQKKyAgICAgICAgcHVibGljIHZvaWQgZm9yY2VCYXRjaCgpIHsKKyAgICAgICAgICAgIC8vTk9PUAorICAgICAgICB9CisKKyAgICAgICAgLy9NYXkgYmUgY2FsbGVkIGJ5IGEgYmFja2dyb3VuZCB0aHJlYWQKKyAgICAgICAgcHVibGljIHZvaWQgZmx1c2goYm9vbGVhbiBibG9jaykgeworICAgICAgICAgICAgaWYgKGJsb2NrKSB7CisgICAgICAgICAgICAgICAgX2ZsdXNoTG9jay5sb2NrKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFfZmx1c2hMb2NrLnRyeUxvY2soKSkgeworICAgICAgICAgICAgICAgLy9Tb21lb25lIGVsc2UgaWYgZmx1c2hpbmcgc28gZG9uJ3QgZG8gYW55dGhpbmcKKyAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgd2hpbGUgKCFfb3ZlcmZsb3cuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHB1Ymxpc2hEaXJlY3RTaW5nbGUoX292ZXJmbG93LnBlZWsoKSwgYmxvY2spOworICAgICAgICAgICAgICAgICAgICBfb3ZlcmZsb3dDb3VudC5hZGRBbmRHZXQoLTEpOworICAgICAgICAgICAgICAgICAgICBfb3ZlcmZsb3cucG9sbCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEluc3VmZmljaWVudENhcGFjaXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvL0lnbm9yZWQgd2Ugc2hvdWxkIG5vdCBibG9jaworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBfZmx1c2hMb2NrLnVubG9jaygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBUaHJlYWRMb2NhbEJhdGNoZXIgaW1wbGVtZW50cyBUaHJlYWRMb2NhbEluc2VydGVyIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBSZWVudHJhbnRMb2NrIF9mbHVzaExvY2s7CisgICAgICAgIHByaXZhdGUgZmluYWwgQ29uY3VycmVudExpbmtlZFF1ZXVlPEFycmF5TGlzdDxPYmplY3Q+PiBfb3ZlcmZsb3c7CisgICAgICAgIHByaXZhdGUgQXJyYXlMaXN0PE9iamVjdD4gX2N1cnJlbnRCYXRjaDsKKworICAgICAgICBwdWJsaWMgVGhyZWFkTG9jYWxCYXRjaGVyKCkgeworICAgICAgICAgICAgX2ZsdXNoTG9jayA9IG5ldyBSZWVudHJhbnRMb2NrKCk7CisgICAgICAgICAgICBfb3ZlcmZsb3cgPSBuZXcgQ29uY3VycmVudExpbmtlZFF1ZXVlPEFycmF5TGlzdDxPYmplY3Q+PigpOworICAgICAgICAgICAgX2N1cnJlbnRCYXRjaCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PihfaW5wdXRCYXRjaFNpemUpOworICAgICAgICB9CisKKyAgICAgICAgLy9jYWxsZWQgYnkgdGhlIG1haW4gdGhyZWFkIGFuZCBzaG91bGQgbm90IGJsb2NrIGZvciBhbiB1bmRlZmluZWQgcGVyaW9kIG9mIHRpbWUKKyAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZChPYmplY3Qgb2JqKSB7CisgICAgICAgICAgICBfY3VycmVudEJhdGNoLmFkZChvYmopOworICAgICAgICAgICAgX292ZXJmbG93Q291bnQuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgICAgICAgICBpZiAoX2VuYWJsZUJhY2twcmVzc3VyZSAmJiBfY2IgIT0gbnVsbCAmJiAoX21ldHJpY3MucG9wdWxhdGlvbigpICsgX292ZXJmbG93Q291bnQuZ2V0KCkpID49IF9oaWdoV2F0ZXJNYXJrKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFfdGhyb3R0bGVPbikgeworICAgICAgICAgICAgICAgICAgICAgICAgX2NiLmhpZ2hXYXRlck1hcmsoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF90aHJvdHRsZU9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFeGNlcHRpb24gZHVyaW5nIGNhbGxpbmcgaGlnaFdhdGVyTWFyayBjYWxsYmFjayEiLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoX2N1cnJlbnRCYXRjaC5zaXplKCkgPj0gX2lucHV0QmF0Y2hTaXplKSB7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBmbHVzaGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaWYgKF9vdmVyZmxvdy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1Ymxpc2hEaXJlY3QoX2N1cnJlbnRCYXRjaCwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgX292ZXJmbG93Q291bnQuYWRkQW5kR2V0KDAgLSBfY3VycmVudEJhdGNoLnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBfY3VycmVudEJhdGNoLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmbHVzaGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW5zdWZmaWNpZW50Q2FwYWNpdHlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9JZ25vcmVkIHdlIHdpbGwgZmx1c2ggbGF0ZXIKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghZmx1c2hlZCkgeyAgICAgICAgCisgICAgICAgICAgICAgICAgICAgIF9vdmVyZmxvdy5hZGQoX2N1cnJlbnRCYXRjaCk7CisgICAgICAgICAgICAgICAgICAgIF9jdXJyZW50QmF0Y2ggPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oX2lucHV0QmF0Y2hTaXplKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvL01heSBiZSBjYWxsZWQgYnkgYSBiYWNrZ3JvdW5kIHRocmVhZAorICAgICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgZm9yY2VCYXRjaCgpIHsKKyAgICAgICAgICAgIGlmICghX2N1cnJlbnRCYXRjaC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBfb3ZlcmZsb3cuYWRkKF9jdXJyZW50QmF0Y2gpOworICAgICAgICAgICAgICAgIF9jdXJyZW50QmF0Y2ggPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oX2lucHV0QmF0Y2hTaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vTWF5IGJlIGNhbGxlZCBieSBhIGJhY2tncm91bmQgdGhyZWFkCisgICAgICAgIHB1YmxpYyB2b2lkIGZsdXNoKGJvb2xlYW4gYmxvY2spIHsKKyAgICAgICAgICAgIGlmIChibG9jaykgeworICAgICAgICAgICAgICAgIF9mbHVzaExvY2subG9jaygpOworICAgICAgICAgICAgfSBlbHNlIGlmICghX2ZsdXNoTG9jay50cnlMb2NrKCkpIHsKKyAgICAgICAgICAgICAgIC8vU29tZW9uZSBlbHNlIGlmIGZsdXNoaW5nIHNvIGRvbid0IGRvIGFueXRoaW5nCisgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHdoaWxlICghX292ZXJmbG93LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICBwdWJsaXNoRGlyZWN0KF9vdmVyZmxvdy5wZWVrKCksIGJsb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgX292ZXJmbG93Q291bnQuYWRkQW5kR2V0KDAgLSBfb3ZlcmZsb3cucG9sbCgpLnNpemUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoSW5zdWZmaWNpZW50Q2FwYWNpdHlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vSWdub3JlZCB3ZSBzaG91bGQgbm90IGJsb2NrCisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIF9mbHVzaExvY2sudW5sb2NrKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIEZsdXNoZXIgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisgICAgICAgIHByaXZhdGUgQXRvbWljQm9vbGVhbiBfaXNGbHVzaGluZyA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBsb25nIF9mbHVzaEludGVydmFsOworCisgICAgICAgIHB1YmxpYyBGbHVzaGVyKGxvbmcgZmx1c2hJbnRlcnZhbCwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgIF9mbHVzaEludGVydmFsID0gZmx1c2hJbnRlcnZhbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIGlmIChfaXNGbHVzaGluZy5jb21wYXJlQW5kU2V0KGZhbHNlLCB0cnVlKSkgeworICAgICAgICAgICAgICAgIGZvciAoVGhyZWFkTG9jYWxJbnNlcnRlciBiYXRjaGVyOiBfYmF0Y2hlcnMudmFsdWVzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYmF0Y2hlci5mb3JjZUJhdGNoKCk7CisgICAgICAgICAgICAgICAgICAgIGJhdGNoZXIuZmx1c2godHJ1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9pc0ZsdXNoaW5nLnNldChmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKKyAgICAgICAgICAgIEZMVVNIRVIuc3RhcnQodGhpcywgX2ZsdXNoSW50ZXJ2YWwpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgICAgICAgICBGTFVTSEVSLnN0b3AodGhpcywgX2ZsdXNoSW50ZXJ2YWwpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBpbm5lciBjbGFzcyBwcm92aWRlcyBtZXRob2RzIHRvIGFjY2VzcyB0aGUgbWV0cmljcyBvZiB0aGUgZGlzcnVwdG9yIHF1ZXVlLgorICAgICAqLworICAgIHB1YmxpYyBjbGFzcyBRdWV1ZU1ldHJpY3MgeworICAgICAgICBwcml2YXRlIGZpbmFsIFJhdGVUcmFja2VyIF9yYXRlVHJhY2tlciA9IG5ldyBSYXRlVHJhY2tlcigxMDAwMCwgMTApOworCisgICAgICAgIHB1YmxpYyBsb25nIHdyaXRlUG9zKCkgeworICAgICAgICAgICAgcmV0dXJuIF9idWZmZXIuZ2V0Q3Vyc29yKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgbG9uZyByZWFkUG9zKCkgeworICAgICAgICAgICAgcmV0dXJuIF9jb25zdW1lci5nZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBsb25nIG92ZXJmbG93KCkgeworICAgICAgICAgICAgcmV0dXJuIF9vdmVyZmxvd0NvdW50LmdldCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGxvbmcgcG9wdWxhdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiB3cml0ZVBvcygpIC0gcmVhZFBvcygpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGxvbmcgY2FwYWNpdHkoKSB7CisgICAgICAgICAgICByZXR1cm4gX2J1ZmZlci5nZXRCdWZmZXJTaXplKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZmxvYXQgcGN0RnVsbCgpIHsKKyAgICAgICAgICAgIHJldHVybiAoMS4wRiAqIHBvcHVsYXRpb24oKSAvIGNhcGFjaXR5KCkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdCBnZXRTdGF0ZSgpIHsKKyAgICAgICAgICAgIE1hcCBzdGF0ZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworCisgICAgICAgICAgICAvLyBnZXQgcmVhZFBvcyB0aGVuIHdyaXRlUG9zIHNvIGl0J3MgbmV2ZXIgYW4gdW5kZXItZXN0aW1hdGUKKyAgICAgICAgICAgIGxvbmcgcnAgPSByZWFkUG9zKCk7CisgICAgICAgICAgICBsb25nIHdwID0gd3JpdGVQb3MoKTsKKworICAgICAgICAgICAgZmluYWwgZG91YmxlIGFycml2YWxSYXRlSW5TZWNzID0gX3JhdGVUcmFja2VyLnJlcG9ydFJhdGUoKTsKKworICAgICAgICAgICAgLy9Bc3N1bWUgdGhlIHF1ZXVlIGlzIHN0YWJsZSwgaW4gd2hpY2ggdGhlIGFycml2YWwgcmF0ZSBpcyBlcXVhbCB0byB0aGUgY29uc3VtcHRpb24gcmF0ZS4KKyAgICAgICAgICAgIC8vIElmIHRoaXMgYXNzdW1wdGlvbiBkb2VzIG5vdCBob2xkLCB0aGUgY2FsY3VsYXRpb24gb2Ygc29qb3VybiB0aW1lIHNob3VsZCBhbHNvIGNvbnNpZGVyCisgICAgICAgICAgICAvLyBkZXBhcnR1cmUgcmF0ZSBhY2NvcmRpbmcgdG8gUXVldWluZyBUaGVvcnkuCisgICAgICAgICAgICBmaW5hbCBkb3VibGUgc29qb3VyblRpbWUgPSAod3AgLSBycCkgLyBNYXRoLm1heChhcnJpdmFsUmF0ZUluU2VjcywgMC4wMDAwMSkgKiAxMDAwLjA7CisKKyAgICAgICAgICAgIHN0YXRlLnB1dCgiY2FwYWNpdHkiLCBjYXBhY2l0eSgpKTsKKyAgICAgICAgICAgIHN0YXRlLnB1dCgicG9wdWxhdGlvbiIsIHdwIC0gcnApOworICAgICAgICAgICAgc3RhdGUucHV0KCJ3cml0ZV9wb3MiLCB3cCk7CisgICAgICAgICAgICBzdGF0ZS5wdXQoInJlYWRfcG9zIiwgcnApOworICAgICAgICAgICAgc3RhdGUucHV0KCJhcnJpdmFsX3JhdGVfc2VjcyIsIGFycml2YWxSYXRlSW5TZWNzKTsKKyAgICAgICAgICAgIHN0YXRlLnB1dCgic29qb3Vybl90aW1lX21zIiwgc29qb3VyblRpbWUpOyAvL2VsZW1lbnQgc29qb3VybiB0aW1lIGluIG1pbGxpc2Vjb25kcworICAgICAgICAgICAgc3RhdGUucHV0KCJvdmVyZmxvdyIsIF9vdmVyZmxvd0NvdW50LmdldCgpKTsKKworICAgICAgICAgICAgcmV0dXJuIHN0YXRlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgbm90aWZ5QXJyaXZhbHMobG9uZyBjb3VudHMpIHsKKyAgICAgICAgICAgIF9yYXRlVHJhY2tlci5ub3RpZnkoY291bnRzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgUmluZ0J1ZmZlcjxBdG9taWNSZWZlcmVuY2U8T2JqZWN0Pj4gX2J1ZmZlcjsKKyAgICBwcml2YXRlIGZpbmFsIFNlcXVlbmNlIF9jb25zdW1lcjsKKyAgICBwcml2YXRlIGZpbmFsIFNlcXVlbmNlQmFycmllciBfYmFycmllcjsKKyAgICBwcml2YXRlIGZpbmFsIGludCBfaW5wdXRCYXRjaFNpemU7CisgICAgcHJpdmF0ZSBmaW5hbCBDb25jdXJyZW50SGFzaE1hcDxMb25nLCBUaHJlYWRMb2NhbEluc2VydGVyPiBfYmF0Y2hlcnMgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8TG9uZywgVGhyZWFkTG9jYWxJbnNlcnRlcj4oKTsKKyAgICBwcml2YXRlIGZpbmFsIEZsdXNoZXIgX2ZsdXNoZXI7CiAgICAgcHJpdmF0ZSBmaW5hbCBRdWV1ZU1ldHJpY3MgX21ldHJpY3M7CisKKyAgICBwcml2YXRlIFN0cmluZyBfcXVldWVOYW1lID0gIiI7CiAgICAgcHJpdmF0ZSBEaXNydXB0b3JCYWNrcHJlc3N1cmVDYWxsYmFjayBfY2IgPSBudWxsOwogICAgIHByaXZhdGUgaW50IF9oaWdoV2F0ZXJNYXJrID0gMDsKICAgICBwcml2YXRlIGludCBfbG93V2F0ZXJNYXJrID0gMDsKICAgICBwcml2YXRlIGJvb2xlYW4gX2VuYWJsZUJhY2twcmVzc3VyZSA9IGZhbHNlOworICAgIHByaXZhdGUgZmluYWwgQXRvbWljTG9uZyBfb3ZlcmZsb3dDb3VudCA9IG5ldyBBdG9taWNMb25nKDApOworICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBfdGhyb3R0bGVPbiA9IGZhbHNlOwogCi0gICAgcHVibGljIERpc3J1cHRvclF1ZXVlKFN0cmluZyBxdWV1ZU5hbWUsIENsYWltU3RyYXRlZ3kgY2xhaW0sIFdhaXRTdHJhdGVneSB3YWl0LCBsb25nIHRpbWVvdXQpIHsKKyAgICBwdWJsaWMgRGlzcnVwdG9yUXVldWUoU3RyaW5nIHF1ZXVlTmFtZSwgUHJvZHVjZXJUeXBlIHR5cGUsIGludCBzaXplLCBsb25nIHJlYWRUaW1lb3V0LCBpbnQgaW5wdXRCYXRjaFNpemUsIGxvbmcgZmx1c2hJbnRlcnZhbCkgewogICAgICAgICB0aGlzLl9xdWV1ZU5hbWUgPSBQUkVGSVggKyBxdWV1ZU5hbWU7Ci0gICAgICAgIF9idWZmZXIgPSBuZXcgUmluZ0J1ZmZlcjxNdXRhYmxlT2JqZWN0PihuZXcgT2JqZWN0RXZlbnRGYWN0b3J5KCksIGNsYWltLCB3YWl0KTsKLSAgICAgICAgX2NvbnN1bWVyID0gbmV3IFNlcXVlbmNlKCk7Ci0gICAgICAgIF9iYXJyaWVyID0gX2J1ZmZlci5uZXdCYXJyaWVyKCk7Ci0gICAgICAgIF9idWZmZXIuc2V0R2F0aW5nU2VxdWVuY2VzKF9jb25zdW1lcik7Ci0gICAgICAgIF9tZXRyaWNzID0gbmV3IFF1ZXVlTWV0cmljcygoZmxvYXQpIDAuMDUpOwotCi0gICAgICAgIGlmIChjbGFpbSBpbnN0YW5jZW9mIFNpbmdsZVRocmVhZGVkQ2xhaW1TdHJhdGVneSkgewotICAgICAgICAgICAgY29uc3VtZXJTdGFydGVkRmxhZyA9IHRydWU7CisgICAgICAgIFdhaXRTdHJhdGVneSB3YWl0OworICAgICAgICBpZiAocmVhZFRpbWVvdXQgPD0gMCkgeworICAgICAgICAgICAgd2FpdCA9IG5ldyBMaXRlQmxvY2tpbmdXYWl0U3RyYXRlZ3koKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB3ZSBmbHVzaCB0aGUgcGVuZGluZyBtZXNzYWdlcyBpbiBjYWNoZSBmaXJzdAotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBwdWJsaXNoRGlyZWN0KEZMVVNIX0NBQ0hFLCB0cnVlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKEluc3VmZmljaWVudENhcGFjaXR5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhpcyBjb2RlIHNob3VsZCBiZSB1bnJlYWNoYWJsZSEiLCBlKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdhaXQgPSBuZXcgVGltZW91dEJsb2NraW5nV2FpdFN0cmF0ZWd5KHJlYWRUaW1lb3V0LCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOwogICAgICAgICB9CiAKLSAgICAgICAgX3dhaXRUaW1lb3V0ID0gdGltZW91dDsKKyAgICAgICAgX2J1ZmZlciA9IFJpbmdCdWZmZXIuY3JlYXRlKHR5cGUsIG5ldyBPYmplY3RFdmVudEZhY3RvcnkoKSwgc2l6ZSwgd2FpdCk7CisgICAgICAgIF9jb25zdW1lciA9IG5ldyBTZXF1ZW5jZSgpOworICAgICAgICBfYmFycmllciA9IF9idWZmZXIubmV3QmFycmllcigpOworICAgICAgICBfYnVmZmVyLmFkZEdhdGluZ1NlcXVlbmNlcyhfY29uc3VtZXIpOworICAgICAgICBfbWV0cmljcyA9IG5ldyBRdWV1ZU1ldHJpY3MoKTsKKyAgICAgICAgLy9UaGUgYmF0Y2ggc2l6ZSBjYW4gYmUgbm8gbGFyZ2VyIHRoYW4gaGFsZiB0aGUgZnVsbCBxdWV1ZSBzaXplLgorICAgICAgICAvL1RoaXMgaXMgbW9zdGx5IHRvIGF2b2lkIGNvbnRlbnRpb24gaXNzdWVzLgorICAgICAgICBfaW5wdXRCYXRjaFNpemUgPSBNYXRoLm1heCgxLCBNYXRoLm1pbihpbnB1dEJhdGNoU2l6ZSwgc2l6ZS8yKSk7CisKKyAgICAgICAgX2ZsdXNoZXIgPSBuZXcgRmx1c2hlcihNYXRoLm1heChmbHVzaEludGVydmFsLCAxKSwgX3F1ZXVlTmFtZSk7CisgICAgICAgIF9mbHVzaGVyLnN0YXJ0KCk7CiAgICAgfQogCiAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewogICAgICAgICByZXR1cm4gX3F1ZXVlTmFtZTsKICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBjb25zdW1lQmF0Y2goRXZlbnRIYW5kbGVyPE9iamVjdD4gaGFuZGxlcikgewotICAgICAgICBjb25zdW1lQmF0Y2hUb0N1cnNvcihfYmFycmllci5nZXRDdXJzb3IoKSwgaGFuZGxlcik7CisgICAgcHVibGljIGJvb2xlYW4gaXNGdWxsKCkgeworICAgICAgICByZXR1cm4gKF9tZXRyaWNzLnBvcHVsYXRpb24oKSArIF9vdmVyZmxvd0NvdW50LmdldCgpKSA+PSBfbWV0cmljcy5jYXBhY2l0eSgpOwogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGhhbHRXaXRoSW50ZXJydXB0KCkgewotICAgICAgICBwdWJsaXNoKElOVEVSUlVQVCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBwdWJsaXNoRGlyZWN0KG5ldyBBcnJheUxpc3Q8T2JqZWN0PihBcnJheXMuYXNMaXN0KElOVEVSUlVQVCkpLCB0cnVlKTsKKyAgICAgICAgICAgIF9mbHVzaGVyLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKEluc3VmZmljaWVudENhcGFjaXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vVGhpcyBzaG91bGQgYmUgaW1wb3NzaWJsZQorICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjb25zdW1lQmF0Y2goRXZlbnRIYW5kbGVyPE9iamVjdD4gaGFuZGxlcikgeworICAgICAgICBpZiAoX21ldHJpY3MucG9wdWxhdGlvbigpID4gMCkgeworICAgICAgICAgICAgY29uc3VtZUJhdGNoV2hlbkF2YWlsYWJsZShoYW5kbGVyKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHB1YmxpYyB2b2lkIGNvbnN1bWVCYXRjaFdoZW5BdmFpbGFibGUoRXZlbnRIYW5kbGVyPE9iamVjdD4gaGFuZGxlcikgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgZmluYWwgbG9uZyBuZXh0U2VxdWVuY2UgPSBfY29uc3VtZXIuZ2V0KCkgKyAxOwotICAgICAgICAgICAgZmluYWwgbG9uZyBhdmFpbGFibGVTZXF1ZW5jZSA9Ci0gICAgICAgICAgICAgICAgICAgIF93YWl0VGltZW91dCA9PSAwTCA/IF9iYXJyaWVyLndhaXRGb3IobmV4dFNlcXVlbmNlKSA6IF9iYXJyaWVyLndhaXRGb3IobmV4dFNlcXVlbmNlLCBfd2FpdFRpbWVvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgICAgIGxvbmcgYXZhaWxhYmxlU2VxdWVuY2UgPSBfYmFycmllci53YWl0Rm9yKG5leHRTZXF1ZW5jZSk7CiAKICAgICAgICAgICAgIGlmIChhdmFpbGFibGVTZXF1ZW5jZSA+PSBuZXh0U2VxdWVuY2UpIHsKICAgICAgICAgICAgICAgICBjb25zdW1lQmF0Y2hUb0N1cnNvcihhdmFpbGFibGVTZXF1ZW5jZSwgaGFuZGxlcik7CiAgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFRpbWVvdXRFeGNlcHRpb24gdGUpIHsKKyAgICAgICAgICAgIC8vSWdub3JlZAogICAgICAgICB9IGNhdGNoIChBbGVydEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgewpAQCAtMTIxLDI3ICs0MjIsMjMgQEAKICAgICAgICAgfQogICAgIH0KIAotCiAgICAgcHJpdmF0ZSB2b2lkIGNvbnN1bWVCYXRjaFRvQ3Vyc29yKGxvbmcgY3Vyc29yLCBFdmVudEhhbmRsZXI8T2JqZWN0PiBoYW5kbGVyKSB7CiAgICAgICAgIGZvciAobG9uZyBjdXJyID0gX2NvbnN1bWVyLmdldCgpICsgMTsgY3VyciA8PSBjdXJzb3I7IGN1cnIrKykgewogICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBNdXRhYmxlT2JqZWN0IG1vID0gX2J1ZmZlci5nZXQoY3Vycik7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG8gPSBtby5vOwotICAgICAgICAgICAgICAgIG1vLnNldE9iamVjdChudWxsKTsKLSAgICAgICAgICAgICAgICBpZiAobyA9PSBGTFVTSF9DQUNIRSkgewotICAgICAgICAgICAgICAgICAgICBPYmplY3QgYyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjID0gX2NhY2hlLnBvbGwoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjID09IG51bGwpIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBoYW5kbGVyLm9uRXZlbnQoYywgY3VyciwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG8gPT0gSU5URVJSVVBUKSB7CisgICAgICAgICAgICAgICAgQXRvbWljUmVmZXJlbmNlPE9iamVjdD4gbW8gPSBfYnVmZmVyLmdldChjdXJyKTsKKyAgICAgICAgICAgICAgICBPYmplY3QgbyA9IG1vLmdldEFuZFNldChudWxsKTsKKyAgICAgICAgICAgICAgICBpZiAobyA9PSBJTlRFUlJVUFQpIHsKICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVycnVwdGVkRXhjZXB0aW9uKCJEaXNydXB0b3IgcHJvY2Vzc2luZyBpbnRlcnJ1cHRlZCIpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIExPRy5lcnJvcigiTlVMTCBmb3VuZCBpbiB7fTp7fSIsIHRoaXMuZ2V0TmFtZSgpLCBjdXJzb3IpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIub25FdmVudChvLCBjdXJyLCBjdXJyID09IGN1cnNvcik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChfZW5hYmxlQmFja3ByZXNzdXJlICYmIF9jYiAhPSBudWxsICYmIF9tZXRyaWNzLndyaXRlUG9zKCkgLSBjdXJyIDw9IF9sb3dXYXRlck1hcmspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9lbmFibGVCYWNrcHJlc3N1cmUgJiYgX2NiICE9IG51bGwgJiYgKF9tZXRyaWNzLndyaXRlUG9zKCkgLSBjdXJyICsgX292ZXJmbG93Q291bnQuZ2V0KCkpIDw9IF9sb3dXYXRlck1hcmspIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NiLmxvd1dhdGVyTWFyaygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfdGhyb3R0bGVPbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhyb3R0bGVPbiA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY2IubG93V2F0ZXJNYXJrKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRXhjZXB0aW9uIGR1cmluZyBjYWxsaW5nIGxvd1dhdGVyTWFyayBjYWxsYmFjayEiKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTE1MSw3ICs0NDgsNiBAQAogICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIC8vVE9ETzogb25seSBzZXQgdGhpcyBpZiB0aGUgY29uc3VtZXIgY3Vyc29yIGhhcyBjaGFuZ2VkPwogICAgICAgICBfY29uc3VtZXIuc2V0KGN1cnNvcik7CiAgICAgfQogCkBAIC0xNTksNjkgKzQ1NSw1OCBAQAogICAgICAgICB0aGlzLl9jYiA9IGNiOwogICAgIH0KIAotICAgIC8qCi0gICAgICogQ2FjaGVzIHVudGlsIGNvbnN1bWVyU3RhcnRlZCBpcyBjYWxsZWQsIHVwb24gd2hpY2ggdGhlIGNhY2hlIGlzIGZsdXNoZWQgdG8gdGhlIGNvbnN1bWVyCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHVibGlzaChPYmplY3Qgb2JqKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBwdWJsaXNoKG9iaiwgdHJ1ZSk7Ci0gICAgICAgIH0gY2F0Y2ggKEluc3VmZmljaWVudENhcGFjaXR5RXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVGhpcyBjb2RlIHNob3VsZCBiZSB1bnJlYWNoYWJsZSEiKTsKLSAgICAgICAgfQorICAgIHByaXZhdGUgc3RhdGljIExvbmcgZ2V0SWQoKSB7CisgICAgICAgIHJldHVybiBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldElkKCk7CiAgICAgfQogCi0gICAgcHVibGljIHZvaWQgdHJ5UHVibGlzaChPYmplY3Qgb2JqKSB0aHJvd3MgSW5zdWZmaWNpZW50Q2FwYWNpdHlFeGNlcHRpb24gewotICAgICAgICBwdWJsaXNoKG9iaiwgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHB1Ymxpc2goT2JqZWN0IG9iaiwgYm9vbGVhbiBibG9jaykgdGhyb3dzIEluc3VmZmljaWVudENhcGFjaXR5RXhjZXB0aW9uIHsKLQotICAgICAgICBib29sZWFuIHB1Ymxpc2hOb3cgPSBjb25zdW1lclN0YXJ0ZWRGbGFnOwotCi0gICAgICAgIGlmICghcHVibGlzaE5vdykgewotICAgICAgICAgICAgcmVhZExvY2subG9jaygpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBwdWJsaXNoTm93ID0gY29uc3VtZXJTdGFydGVkRmxhZzsKLSAgICAgICAgICAgICAgICBpZiAoIXB1Ymxpc2hOb3cpIHsKLSAgICAgICAgICAgICAgICAgICAgX2NhY2hlLmFkZChvYmopOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgcmVhZExvY2sudW5sb2NrKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocHVibGlzaE5vdykgewotICAgICAgICAgICAgcHVibGlzaERpcmVjdChvYmosIGJsb2NrKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwdWJsaXNoRGlyZWN0KE9iamVjdCBvYmosIGJvb2xlYW4gYmxvY2spIHRocm93cyBJbnN1ZmZpY2llbnRDYXBhY2l0eUV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIGxvbmcgaWQ7CisgICAgcHJpdmF0ZSB2b2lkIHB1Ymxpc2hEaXJlY3RTaW5nbGUoT2JqZWN0IG9iaiwgYm9vbGVhbiBibG9jaykgdGhyb3dzIEluc3VmZmljaWVudENhcGFjaXR5RXhjZXB0aW9uIHsKKyAgICAgICAgbG9uZyBhdDsKICAgICAgICAgaWYgKGJsb2NrKSB7Ci0gICAgICAgICAgICBpZCA9IF9idWZmZXIubmV4dCgpOworICAgICAgICAgICAgYXQgPSBfYnVmZmVyLm5leHQoKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlkID0gX2J1ZmZlci50cnlOZXh0KDEpOworICAgICAgICAgICAgYXQgPSBfYnVmZmVyLnRyeU5leHQoKTsKICAgICAgICAgfQotICAgICAgICBmaW5hbCBNdXRhYmxlT2JqZWN0IG0gPSBfYnVmZmVyLmdldChpZCk7Ci0gICAgICAgIG0uc2V0T2JqZWN0KG9iaik7Ci0gICAgICAgIF9idWZmZXIucHVibGlzaChpZCk7CisgICAgICAgIEF0b21pY1JlZmVyZW5jZTxPYmplY3Q+IG0gPSBfYnVmZmVyLmdldChhdCk7CisgICAgICAgIG0uc2V0KG9iaik7CisgICAgICAgIF9idWZmZXIucHVibGlzaChhdCk7CiAgICAgICAgIF9tZXRyaWNzLm5vdGlmeUFycml2YWxzKDEpOwotICAgICAgICBpZiAoX2VuYWJsZUJhY2twcmVzc3VyZSAmJiBfY2IgIT0gbnVsbCAmJiBfbWV0cmljcy5wb3B1bGF0aW9uKCkgPj0gX2hpZ2hXYXRlck1hcmspIHsKLSAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgIF9jYi5oaWdoV2F0ZXJNYXJrKCk7Ci0gICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRXhjZXB0aW9uIGR1cmluZyBjYWxsaW5nIGhpZ2hXYXRlck1hcmsgY2FsbGJhY2shIik7Ci0gICAgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcHVibGlzaERpcmVjdChBcnJheUxpc3Q8T2JqZWN0PiBvYmpzLCBib29sZWFuIGJsb2NrKSB0aHJvd3MgSW5zdWZmaWNpZW50Q2FwYWNpdHlFeGNlcHRpb24geworICAgICAgICBpbnQgc2l6ZSA9IG9ianMuc2l6ZSgpOworICAgICAgICBpZiAoc2l6ZSA+IDApIHsKKyAgICAgICAgICAgIGxvbmcgZW5kOworICAgICAgICAgICAgaWYgKGJsb2NrKSB7CisgICAgICAgICAgICAgICAgZW5kID0gX2J1ZmZlci5uZXh0KHNpemUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBlbmQgPSBfYnVmZmVyLnRyeU5leHQoc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb25nIGJlZ2luID0gZW5kIC0gKHNpemUgLSAxKTsKKyAgICAgICAgICAgIGxvbmcgYXQgPSBiZWdpbjsKKyAgICAgICAgICAgIGZvciAoT2JqZWN0IG9iajogb2JqcykgeworICAgICAgICAgICAgICAgIEF0b21pY1JlZmVyZW5jZTxPYmplY3Q+IG0gPSBfYnVmZmVyLmdldChhdCk7CisgICAgICAgICAgICAgICAgbS5zZXQob2JqKTsKKyAgICAgICAgICAgICAgICBhdCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX2J1ZmZlci5wdWJsaXNoKGJlZ2luLCBlbmQpOworICAgICAgICAgICAgX21ldHJpY3Mubm90aWZ5QXJyaXZhbHMoc2l6ZSk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBwdWJsaWMgdm9pZCBjb25zdW1lclN0YXJ0ZWQoKSB7Ci0KLSAgICAgICAgY29uc3VtZXJTdGFydGVkRmxhZyA9IHRydWU7Ci0KLSAgICAgICAgLy8gVXNlIHdyaXRlTG9jayB0byBtYWtlIHN1cmUgYWxsIHBlbmRpbmcgY2FjaGUgYWRkIG9wZWFyYXRpb24gY29tcGxldGVkCi0gICAgICAgIHdyaXRlTG9jay5sb2NrKCk7Ci0gICAgICAgIHdyaXRlTG9jay51bmxvY2soKTsKKyAgICBwdWJsaWMgdm9pZCBwdWJsaXNoKE9iamVjdCBvYmopIHsKKyAgICAgICAgTG9uZyBpZCA9IGdldElkKCk7CisgICAgICAgIFRocmVhZExvY2FsSW5zZXJ0ZXIgYmF0Y2hlciA9IF9iYXRjaGVycy5nZXQoaWQpOworICAgICAgICBpZiAoYmF0Y2hlciA9PSBudWxsKSB7CisgICAgICAgICAgICAvL1RoaXMgdGhyZWFkIGlzIHRoZSBvbmx5IG9uZSBldmVyIGNyZWF0aW5nIHRoaXMsIHNvIHRoaXMgaXMgc2FmZQorICAgICAgICAgICAgaWYgKF9pbnB1dEJhdGNoU2l6ZSA+IDEpIHsKKyAgICAgICAgICAgICAgICBiYXRjaGVyID0gbmV3IFRocmVhZExvY2FsQmF0Y2hlcigpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBiYXRjaGVyID0gbmV3IFRocmVhZExvY2FsSnVzdEluc2VydGVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfYmF0Y2hlcnMucHV0KGlkLCBiYXRjaGVyKTsKKyAgICAgICAgfQorICAgICAgICBiYXRjaGVyLmFkZChvYmopOworICAgICAgICBiYXRjaGVyLmZsdXNoKGZhbHNlKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTI1MiwxMDMgKzUzNyw4IEBACiAgICAgICAgIHJldHVybiB0aGlzOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgT2JqZWN0RXZlbnRGYWN0b3J5IGltcGxlbWVudHMgRXZlbnRGYWN0b3J5PE11dGFibGVPYmplY3Q+IHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBNdXRhYmxlT2JqZWN0IG5ld0luc3RhbmNlKCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBNdXRhYmxlT2JqZWN0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICAvL1RoaXMgbWV0aG9kIGVuYWJsZXMgdGhlIG1ldHJpY3MgdG8gYmUgYWNjZXNzZWQgZnJvbSBvdXRzaWRlIG9mIHRoZSBEaXNydXB0b3JRdWV1ZSBjbGFzcwogICAgIHB1YmxpYyBRdWV1ZU1ldHJpY3MgZ2V0TWV0cmljcygpIHsKICAgICAgICAgcmV0dXJuIF9tZXRyaWNzOwogICAgIH0KLQotCi0gICAgLyoqCi0gICAgICogVGhpcyBpbm5lciBjbGFzcyBwcm92aWRlcyBtZXRob2RzIHRvIGFjY2VzcyB0aGUgbWV0cmljcyBvZiB0aGUgZGlzcnVwdG9yIHF1ZXVlLgotICAgICAqLwotICAgIHB1YmxpYyBjbGFzcyBRdWV1ZU1ldHJpY3MgewotCi0gICAgICAgIHByaXZhdGUgZmluYWwgUmF0ZVRyYWNrZXIgX3JhdGVUcmFja2VyID0gbmV3IFJhdGVUcmFja2VyKDEwMDAwLCAxMCk7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgZmxvYXQgX3NhbXBsZVJhdGU7Ci0gICAgICAgIHByaXZhdGUgUmFuZG9tIF9yYW5kb207Ci0KLSAgICAgICAgcHVibGljIFF1ZXVlTWV0cmljcygpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotICAgICAgICAgICAgdGhpcygxKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAcGFyYW0gc2FtcGxlUmF0ZSBhIG51bWJlciBiZXR3ZWVuIDAgYW5kIDEuIFRoZSBoaWdoZXIgaXQgaXMsIHRoZSBhY2N1cmF0ZSB0aGUgbWV0cmljcwotICAgICAgICAgKiAgICAgICAgICAgICAgICAgICB3aWxsIGJlLiBVc2luZyBhIHJlYXNvbmFibGUgc2FtcGxlUmF0ZSwgZS5nLiwgMC4xLCBjb3VsZCBlZmZlY3RpdmVseSByZWR1Y2UgdGhlCi0gICAgICAgICAqICAgICAgICAgICAgICAgICAgIG1ldHJpYyBtYWludGVuYW5jZSBjb3N0IHdoaWxlIHByb3ZpZGluZyBnb29kIGFjY3VyYWN5LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFF1ZXVlTWV0cmljcyhmbG9hdCBzYW1wbGVSYXRlKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLQotICAgICAgICAgICAgaWYgKHNhbXBsZVJhdGUgPD0gMCB8fCBzYW1wbGVSYXRlID4gMSkKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzYW1wbGVSYXRlIHNob3VsZCBiZSBhIHZhbHVlIGJldHdlZW4gKDAsMV0uIik7Ci0KLSAgICAgICAgICAgIF9zYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKLQotICAgICAgICAgICAgX3JhbmRvbSA9IG5ldyBSYW5kb20oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBsb25nIHdyaXRlUG9zKCkgewotICAgICAgICAgICAgcmV0dXJuIF9idWZmZXIuZ2V0Q3Vyc29yKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgbG9uZyByZWFkUG9zKCkgewotICAgICAgICAgICAgcmV0dXJuIF9jb25zdW1lci5nZXQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBsb25nIHBvcHVsYXRpb24oKSB7Ci0gICAgICAgICAgICByZXR1cm4gd3JpdGVQb3MoKSAtIHJlYWRQb3MoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBsb25nIGNhcGFjaXR5KCkgewotICAgICAgICAgICAgcmV0dXJuIF9idWZmZXIuZ2V0QnVmZmVyU2l6ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGZsb2F0IHBjdEZ1bGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gKDEuMEYgKiBwb3B1bGF0aW9uKCkgLyBjYXBhY2l0eSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0U3RhdGUoKSB7Ci0gICAgICAgICAgICBNYXAgc3RhdGUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLQotICAgICAgICAgICAgLy8gZ2V0IHJlYWRQb3MgdGhlbiB3cml0ZVBvcyBzbyBpdCdzIG5ldmVyIGFuIHVuZGVyLWVzdGltYXRlCi0gICAgICAgICAgICBsb25nIHJwID0gcmVhZFBvcygpOwotICAgICAgICAgICAgbG9uZyB3cCA9IHdyaXRlUG9zKCk7Ci0KLSAgICAgICAgICAgIGZpbmFsIGZsb2F0IGFycml2YWxSYXRlSW5NaWxzID0gX3JhdGVUcmFja2VyLnJlcG9ydFJhdGUoKSAvIF9zYW1wbGVSYXRlOwotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgQXNzdW1lIHRoZSBxdWV1ZSBpcyBzdGFibGUsIGluIHdoaWNoIHRoZSBhcnJpdmFsIHJhdGUgaXMgZXF1YWwgdG8gdGhlIGNvbnN1bXB0aW9uIHJhdGUuCi0gICAgICAgICAgICBJZiB0aGlzIGFzc3VtcHRpb24gZG9lcyBub3QgaG9sZCwgdGhlIGNhbGN1bGF0aW9uIG9mIHNvam91cm4gdGltZSBzaG91bGQgYWxzbyBjb25zaWRlcgotICAgICAgICAgICAgZGVwYXJ0dXJlIHJhdGUgYWNjb3JkaW5nIHRvIFF1ZXVpbmcgVGhlb3J5LgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBmaW5hbCBmbG9hdCBzb2pvdXJuVGltZSA9ICh3cCAtIHJwKSAvIChmbG9hdCkgTWF0aC5tYXgoYXJyaXZhbFJhdGVJbk1pbHMsIDAuMDAwMDEpOwotCi0gICAgICAgICAgICBzdGF0ZS5wdXQoImNhcGFjaXR5IiwgY2FwYWNpdHkoKSk7Ci0gICAgICAgICAgICBzdGF0ZS5wdXQoInBvcHVsYXRpb24iLCB3cCAtIHJwKTsKLSAgICAgICAgICAgIHN0YXRlLnB1dCgid3JpdGVfcG9zIiwgd3ApOwotICAgICAgICAgICAgc3RhdGUucHV0KCJyZWFkX3BvcyIsIHJwKTsKLSAgICAgICAgICAgIHN0YXRlLnB1dCgiYXJyaXZhbF9yYXRlIiwgYXJyaXZhbFJhdGVJbk1pbHMpOyAvL2Fycml2YWxzIHBlciBtaWxsaXNlY29uZAotICAgICAgICAgICAgc3RhdGUucHV0KCJzb2pvdXJuX3RpbWUiLCBzb2pvdXJuVGltZSk7IC8vZWxlbWVudCBzb2pvdXJuIHRpbWUgaW4gbWlsbGlzZWNvbmRzCi0KLSAgICAgICAgICAgIHJldHVybiBzdGF0ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG5vdGlmeUFycml2YWxzKGxvbmcgY291bnRzKSB7Ci0gICAgICAgICAgICBpZiAoc2FtcGxlKCkpCi0gICAgICAgICAgICAgICAgX3JhdGVUcmFja2VyLm5vdGlmeShjb3VudHMpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgcHJpdmF0ZSBib29sZWFuIHNhbXBsZSgpIHsKLSAgICAgICAgICAgIGlmIChfc2FtcGxlUmF0ZSA9PSAxIHx8IF9yYW5kb20ubmV4dEZsb2F0KCkgPCBfc2FtcGxlUmF0ZSkKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQogfQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3V0aWxzL0lucHJvY01lc3NhZ2luZy5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3V0aWxzL0lucHJvY01lc3NhZ2luZy5qYXZhCmluZGV4IGIyMGM3NzUuLjRhYmJjM2UgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS91dGlscy9JbnByb2NNZXNzYWdpbmcuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vdXRpbHMvSW5wcm9jTWVzc2FnaW5nLmphdmEKQEAgLTIyLDcgKzIyLDcgQEAKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5MaW5rZWRCbG9ja2luZ1F1ZXVlOwogCiBwdWJsaWMgY2xhc3MgSW5wcm9jTWVzc2FnaW5nIHsKLSAgICBwcml2YXRlIHN0YXRpYyBNYXA8SW50ZWdlciwgTGlua2VkQmxvY2tpbmdRdWV1ZTxPYmplY3Q+PiBfcXVldWVzID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgTGlua2VkQmxvY2tpbmdRdWV1ZTxPYmplY3Q+PigpOworICAgIHByaXZhdGUgc3RhdGljIE1hcDxJbnRlZ2VyLCBMaW5rZWRCbG9ja2luZ1F1ZXVlPE9iamVjdD4+IF9xdWV1ZXMgPSBuZXcgSGFzaE1hcDw+KCk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IF9sb2NrID0gbmV3IE9iamVjdCgpOwogICAgIHByaXZhdGUgc3RhdGljIGludCBwb3J0ID0gMTsKICAgICAKQEAgLTUwLDcgKzUwLDcgQEAKICAgICBwcml2YXRlIHN0YXRpYyBMaW5rZWRCbG9ja2luZ1F1ZXVlPE9iamVjdD4gZ2V0UXVldWUoaW50IHBvcnQpIHsKICAgICAgICAgc3luY2hyb25pemVkKF9sb2NrKSB7CiAgICAgICAgICAgICBpZighX3F1ZXVlcy5jb250YWluc0tleShwb3J0KSkgewotICAgICAgICAgICAgICBfcXVldWVzLnB1dChwb3J0LCBuZXcgTGlua2VkQmxvY2tpbmdRdWV1ZTxPYmplY3Q+KCkpOyAgIAorICAgICAgICAgICAgICBfcXVldWVzLnB1dChwb3J0LCBuZXcgTGlua2VkQmxvY2tpbmdRdWV1ZTw+KCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIF9xdWV1ZXMuZ2V0KHBvcnQpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vdXRpbHMvS2V5ZWRSb3VuZFJvYmluUXVldWUuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS91dGlscy9LZXllZFJvdW5kUm9iaW5RdWV1ZS5qYXZhCmluZGV4IDNjYjQ1NWQuLjRlY2RkYTYgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS91dGlscy9LZXllZFJvdW5kUm9iaW5RdWV1ZS5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS91dGlscy9LZXllZFJvdW5kUm9iaW5RdWV1ZS5qYXZhCkBAIC0yOCwxNSArMjgsMTUgQEAKIHB1YmxpYyBjbGFzcyBLZXllZFJvdW5kUm9iaW5RdWV1ZTxWPiB7CiAgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgX2xvY2sgPSBuZXcgT2JqZWN0KCk7CiAgICAgcHJpdmF0ZSBTZW1hcGhvcmUgX3NpemUgPSBuZXcgU2VtYXBob3JlKDApOwotICAgIHByaXZhdGUgTWFwPE9iamVjdCwgUXVldWU8Vj4+IF9xdWV1ZXMgPSBuZXcgSGFzaE1hcDxPYmplY3QsIFF1ZXVlPFY+PigpOwotICAgIHByaXZhdGUgTGlzdDxPYmplY3Q+IF9rZXlPcmRlciA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOworICAgIHByaXZhdGUgTWFwPE9iamVjdCwgUXVldWU8Vj4+IF9xdWV1ZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgcHJpdmF0ZSBMaXN0PE9iamVjdD4gX2tleU9yZGVyID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgcHJpdmF0ZSBpbnQgX2N1cnJJbmRleCA9IDA7CiAKICAgICBwdWJsaWMgdm9pZCBhZGQoT2JqZWN0IGtleSwgViB2YWwpIHsKICAgICAgICAgc3luY2hyb25pemVkKF9sb2NrKSB7CiAgICAgICAgICAgICBRdWV1ZTxWPiBxdWV1ZSA9IF9xdWV1ZXMuZ2V0KGtleSk7CiAgICAgICAgICAgICBpZihxdWV1ZT09bnVsbCkgewotICAgICAgICAgICAgICAgIHF1ZXVlID0gbmV3IExpbmtlZExpc3Q8Vj4oKTsKKyAgICAgICAgICAgICAgICBxdWV1ZSA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKICAgICAgICAgICAgICAgICBfcXVldWVzLnB1dChrZXksIHF1ZXVlKTsKICAgICAgICAgICAgICAgICBfa2V5T3JkZXIuYWRkKGtleSk7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vdXRpbHMvTGlzdERlbGVnYXRlLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vdXRpbHMvTGlzdERlbGVnYXRlLmphdmEKaW5kZXggMWUwOTFmMC4uZDE5OGE3MiAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3V0aWxzL0xpc3REZWxlZ2F0ZS5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS91dGlscy9MaXN0RGVsZWdhdGUuamF2YQpAQCAtMjcsNyArMjcsNyBAQAogICAgIHByaXZhdGUgTGlzdDxPYmplY3Q+IF9kZWxlZ2F0ZTsKICAgICAKICAgICBwdWJsaWMgTGlzdERlbGVnYXRlKCkgewotICAgIAlfZGVsZWdhdGUgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKKyAgICAJX2RlbGVnYXRlID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgfQogICAgIAogICAgIHB1YmxpYyB2b2lkIHNldERlbGVnYXRlKExpc3Q8T2JqZWN0PiBkZWxlZ2F0ZSkgewpAQCAtODQsMTIgKzg0LDEyIEBACiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb248PyBleHRlbmRzIE9iamVjdD4gY2xjdG4pIHsKKyAgICBwdWJsaWMgYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbjw/PiBjbGN0bikgewogICAgICAgICByZXR1cm4gX2RlbGVnYXRlLmFkZEFsbChjbGN0bik7CiAgICAgfQogCiAgICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gYWRkQWxsKGludCBpLCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBPYmplY3Q+IGNsY3RuKSB7CisgICAgcHVibGljIGJvb2xlYW4gYWRkQWxsKGludCBpLCBDb2xsZWN0aW9uPD8+IGNsY3RuKSB7CiAgICAgICAgIHJldHVybiBfZGVsZWdhdGUuYWRkQWxsKGksIGNsY3RuKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS91dGlscy9Mb2NhbFN0YXRlLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vdXRpbHMvTG9jYWxTdGF0ZS5qYXZhCmluZGV4IGI2ZWNiYTIuLjg0N2ZlYTQgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS91dGlscy9Mb2NhbFN0YXRlLmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3V0aWxzL0xvY2FsU3RhdGUuamF2YQpAQCAtNDIsNyArNDIsNyBAQAogICogRXZlcnkgcmVhZC93cml0ZSBoaXRzIGRpc2suCiAgKi8KIHB1YmxpYyBjbGFzcyBMb2NhbFN0YXRlIHsKLSAgICBwdWJsaWMgc3RhdGljIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihMb2NhbFN0YXRlLmNsYXNzKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihMb2NhbFN0YXRlLmNsYXNzKTsKICAgICBwcml2YXRlIFZlcnNpb25lZFN0b3JlIF92czsKICAgICAKICAgICBwdWJsaWMgTG9jYWxTdGF0ZShTdHJpbmcgYmFja2luZ0RpcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTY1LDcgKzY1LDcgQEAKICAgICB9CiAKICAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFRCYXNlPiBkZXNlcmlhbGl6ZUxhdGVzdFZlcnNpb24oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBNYXA8U3RyaW5nLCBUQmFzZT4gcmVzdWx0ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBUQmFzZT4oKTsKKyAgICAgICAgTWFwPFN0cmluZywgVEJhc2U+IHJlc3VsdCA9IG5ldyBIYXNoTWFwPD4oKTsKICAgICAgICAgVERlc2VyaWFsaXplciB0ZCA9IG5ldyBURGVzZXJpYWxpemVyKCk7CiAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgVGhyaWZ0U2VyaWFsaXplZE9iamVjdD4gZW50OiBwYXJ0aWFsRGVzZXJpYWxpemVMYXRlc3RWZXJzaW9uKHRkKS5lbnRyeVNldCgpKSB7CiAgICAgICAgICAgICByZXN1bHQucHV0KGVudC5nZXRLZXkoKSwgZGVzZXJpYWxpemUoZW50LmdldFZhbHVlKCksIHRkKSk7CkBAIC04Nyw3ICs4Nyw3IEBACiAgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBUaHJpZnRTZXJpYWxpemVkT2JqZWN0PiBwYXJ0aWFsRGVzZXJpYWxpemVMYXRlc3RWZXJzaW9uKFREZXNlcmlhbGl6ZXIgdGQpIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIFN0cmluZyBsYXRlc3RQYXRoID0gX3ZzLm1vc3RSZWNlbnRWZXJzaW9uUGF0aCgpOwotICAgICAgICAgICAgTWFwPFN0cmluZywgVGhyaWZ0U2VyaWFsaXplZE9iamVjdD4gcmVzdWx0ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBUaHJpZnRTZXJpYWxpemVkT2JqZWN0PigpOworICAgICAgICAgICAgTWFwPFN0cmluZywgVGhyaWZ0U2VyaWFsaXplZE9iamVjdD4gcmVzdWx0ID0gbmV3IEhhc2hNYXA8PigpOwogICAgICAgICAgICAgaWYgKGxhdGVzdFBhdGggIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGJ5dGVbXSBzZXJpYWxpemVkID0gRmlsZVV0aWxzLnJlYWRGaWxlVG9CeXRlQXJyYXkobmV3IEZpbGUobGF0ZXN0UGF0aCkpOwogICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVkLmxlbmd0aCA9PSAwKSB7CkBAIC0xODEsMjEgKzE4MSw3IEBACiAKICAgICBwcml2YXRlIFRocmlmdFNlcmlhbGl6ZWRPYmplY3Qgc2VyaWFsaXplKFRCYXNlIG8sIFRTZXJpYWxpemVyIHNlcikgewogICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBUaHJpZnRTZXJpYWxpemVkT2JqZWN0KG8uZ2V0Q2xhc3MoKS5nZXROYW1lKCksIEJ5dGVCdWZmZXIud3JhcChzZXIuc2VyaWFsaXplKChUQmFzZSlvKSkpOwotICAgICAgICB9IGNhdGNoKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwZXJzaXN0KE1hcDxTdHJpbmcsIFRCYXNlPiB2YWwsIGJvb2xlYW4gY2xlYW51cCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgVFNlcmlhbGl6ZXIgc2VyID0gbmV3IFRTZXJpYWxpemVyKCk7Ci0gICAgICAgICAgICBNYXA8U3RyaW5nLCBUaHJpZnRTZXJpYWxpemVkT2JqZWN0PiBzZXJpYWxpemVkID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBUaHJpZnRTZXJpYWxpemVkT2JqZWN0PigpOwotICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBUQmFzZT4gZW50OiB2YWwuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgICAgIE9iamVjdCBvID0gZW50LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgc2VyaWFsaXplZC5wdXQoZW50LmdldEtleSgpLCBzZXJpYWxpemUoZW50LmdldFZhbHVlKCksIHNlcikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcGVyc2lzdEludGVybmFsKHNlcmlhbGl6ZWQsIHNlciwgY2xlYW51cCk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFRocmlmdFNlcmlhbGl6ZWRPYmplY3Qoby5nZXRDbGFzcygpLmdldE5hbWUoKSwgQnl0ZUJ1ZmZlci53cmFwKHNlci5zZXJpYWxpemUobykpKTsKICAgICAgICAgfSBjYXRjaChFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS91dGlscy9Nb25pdG9yLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vdXRpbHMvTW9uaXRvci5qYXZhCmluZGV4IDM2ZmVkYzQuLjQxNzE3YTkgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS91dGlscy9Nb25pdG9yLmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3V0aWxzL01vbml0b3IuamF2YQpAQCAtMjAsNyArMjAsNiBAQAogaW1wb3J0IGJhY2t0eXBlLnN0b3JtLmdlbmVyYXRlZC4qOwogCiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIAogcHVibGljIGNsYXNzIE1vbml0b3IgewpAQCAtOTgsNyArOTcsNyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgSGFzaFNldDxTdHJpbmc+IGdldENvbXBvbmVudHMoTmltYnVzLkNsaWVudCBjbGllbnQsIFN0cmluZyB0b3BvbG9neSkgdGhyb3dzIEV4Y2VwdGlvbnsKLSAgICAgICAgSGFzaFNldDxTdHJpbmc+IGNvbXBvbmVudHMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgICAgIEhhc2hTZXQ8U3RyaW5nPiBjb21wb25lbnRzID0gbmV3IEhhc2hTZXQ8PigpOwogICAgICAgICBDbHVzdGVyU3VtbWFyeSBjbHVzdGVyU3VtbWFyeSA9IGNsaWVudC5nZXRDbHVzdGVySW5mbygpOwogICAgICAgICBUb3BvbG9neVN1bW1hcnkgdG9wb2xvZ3lTdW1tYXJ5ID0gbnVsbDsKICAgICAgICAgZm9yIChUb3BvbG9neVN1bW1hcnkgdHM6IGNsdXN0ZXJTdW1tYXJ5LmdldF90b3BvbG9naWVzKCkpIHsKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS91dGlscy9NdXRhYmxlT2JqZWN0LmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vdXRpbHMvTXV0YWJsZU9iamVjdC5qYXZhCmluZGV4IGQ1Y2I3ZGIuLjJiZDliYjEgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS91dGlscy9NdXRhYmxlT2JqZWN0LmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3V0aWxzL011dGFibGVPYmplY3QuamF2YQpAQCAtMTgsNyArMTgsNyBAQAogcGFja2FnZSBiYWNrdHlwZS5zdG9ybS51dGlsczsKIAogcHVibGljIGNsYXNzIE11dGFibGVPYmplY3QgewotICAgIE9iamVjdCBvID0gbnVsbDsKKyAgICBwcml2YXRlIE9iamVjdCBvID0gbnVsbDsKICAgICAKICAgICBwdWJsaWMgTXV0YWJsZU9iamVjdCgpIHsKICAgICAgICAgCkBAIC0yOCwxMSArMjgsMTEgQEAKICAgICAgICAgdGhpcy5vID0gbzsKICAgICB9CiAgICAgCi0gICAgcHVibGljIHZvaWQgc2V0T2JqZWN0KE9iamVjdCBvKSB7CisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldE9iamVjdChPYmplY3QgbykgewogICAgICAgICB0aGlzLm8gPSBvOwogICAgIH0KICAgICAKLSAgICBwdWJsaWMgT2JqZWN0IGdldE9iamVjdCgpIHsKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIE9iamVjdCBnZXRPYmplY3QoKSB7CiAgICAgICAgIHJldHVybiBvOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS91dGlscy9OaW1idXNDbGllbnQuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS91dGlscy9OaW1idXNDbGllbnQuamF2YQppbmRleCBhNzE1ZGUyLi5hOTMwNmY3IDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vdXRpbHMvTmltYnVzQ2xpZW50LmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3V0aWxzL05pbWJ1c0NsaWVudC5qYXZhCkBAIC0yMiwxMyArMjIsOCBAQAogaW1wb3J0IGJhY2t0eXBlLnN0b3JtLmdlbmVyYXRlZC5DbHVzdGVyU3VtbWFyeTsKIGltcG9ydCBiYWNrdHlwZS5zdG9ybS5nZW5lcmF0ZWQuTmltYnVzOwogaW1wb3J0IGJhY2t0eXBlLnN0b3JtLmdlbmVyYXRlZC5OaW1idXNTdW1tYXJ5OwotaW1wb3J0IGJhY2t0eXBlLnN0b3JtLm5pbWJ1cy5JTGVhZGVyRWxlY3RvcjsKLWltcG9ydCBiYWNrdHlwZS5zdG9ybS5uaW1idXMuTmltYnVzSW5mbzsKIGltcG9ydCBiYWNrdHlwZS5zdG9ybS5zZWN1cml0eS5hdXRoLlRocmlmdENsaWVudDsKIGltcG9ydCBiYWNrdHlwZS5zdG9ybS5zZWN1cml0eS5hdXRoLlRocmlmdENvbm5lY3Rpb25UeXBlOwotaW1wb3J0IGNsb2p1cmUubGFuZy5JRm47Ci1pbXBvcnQgY2xvanVyZS5sYW5nLlBlcnNpc3RlbnRBcnJheU1hcDsKLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLlNwbGl0dGVyOwogaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuTGlzdHM7CiBpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQudHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb247CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKQEAgLTM4LDcgKzMzLDYgQEAKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCiBwdWJsaWMgY2xhc3MgTmltYnVzQ2xpZW50IGV4dGVuZHMgVGhyaWZ0Q2xpZW50IHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUxJTUlURVIgPSAiOiI7CiAgICAgcHJpdmF0ZSBOaW1idXMuQ2xpZW50IF9jbGllbnQ7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKE5pbWJ1c0NsaWVudC5jbGFzcyk7CiAKQEAgLTU2LDcgKzUwLDcgQEAKICAgICAgICAgICAgIGFzVXNlciA9IChTdHJpbmcpIGNvbmYuZ2V0KENvbmZpZy5TVE9STV9ET19BU19VU0VSKTsKICAgICAgICAgfQogCi0gICAgICAgIExpc3Q8U3RyaW5nPiBzZWVkcyA9IG51bGw7CisgICAgICAgIExpc3Q8U3RyaW5nPiBzZWVkczsKICAgICAgICAgaWYoY29uZi5jb250YWluc0tleShDb25maWcuTklNQlVTX0hPU1QpKSB7CiAgICAgICAgICAgICBMT0cud2FybigiVXNpbmcgZGVwcmVjYXRlZCBjb25maWcge30gZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuIFBsZWFzZSB1cGRhdGUgeW91ciBzdG9ybS55YW1sIHNvIGl0IG9ubHkgaGFzIGNvbmZpZyB7fSIsCiAgICAgICAgICAgICAgICAgICAgIENvbmZpZy5OSU1CVVNfSE9TVCwgQ29uZmlnLk5JTUJVU19TRUVEUyk7CkBAIC02Nyw3ICs2MSw3IEBACiAKICAgICAgICAgZm9yIChTdHJpbmcgaG9zdCA6IHNlZWRzKSB7CiAgICAgICAgICAgICBpbnQgcG9ydCA9IEludGVnZXIucGFyc2VJbnQoY29uZi5nZXQoQ29uZmlnLk5JTUJVU19USFJJRlRfUE9SVCkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBDbHVzdGVyU3VtbWFyeSBjbHVzdGVySW5mbyA9IG51bGw7CisgICAgICAgICAgICBDbHVzdGVyU3VtbWFyeSBjbHVzdGVySW5mbzsKICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgTmltYnVzQ2xpZW50IGNsaWVudCA9IG5ldyBOaW1idXNDbGllbnQoY29uZiwgaG9zdCwgcG9ydCk7CiAgICAgICAgICAgICAgICAgY2x1c3RlckluZm8gPSBjbGllbnQuZ2V0Q2xpZW50KCkuZ2V0Q2x1c3RlckluZm8oKTsKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS91dGlscy9SYXRlVHJhY2tlci5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3V0aWxzL1JhdGVUcmFja2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MzdiMWYuLjAwMDAwMDAKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3V0aWxzL1JhdGVUcmFja2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiA8cC8+Ci0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIDxwLz4KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGJhY2t0eXBlLnN0b3JtLnV0aWxzOwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpcyBhIHV0aWxpdHkgdG8gdHJhY2sgdGhlIHJhdGUuCi0gKi8KLXB1YmxpYyBjbGFzcyBSYXRlVHJhY2tlcnsKLSAgICAvKiBudW1iZXIgb2Ygc2xpZGVzIHRvIGtlZXAgaW4gdGhlIGhpc3RvcnkuICovCi0gICAgcHVibGljIGZpbmFsIGludCBfbnVtT2ZTbGlkZXM7IC8vIG51bWJlciBvZiBzbGlkZXMgdG8ga2VlcCBpbiB0aGUgaGlzdG9yeQotCi0gICAgcHVibGljIGZpbmFsIGludCBfc2xpZGVTaXplSW5NaWxzOwotICAgIHByaXZhdGUgZmluYWwgbG9uZ1tdIF9oaXN0b2dyYW1zOy8vIGFuIGFycmF5IHN0b3JpbmcgdGhlIG51bWJlciBvZiBlbGVtZW50IGZvciBlYWNoIHRpbWUgc2xpZGUuCi0KLSAgICBwcml2YXRlIGludCBfY3VycmVudFZhbGlkU2xpZGVOdW07Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBUaW1lciBfdGltZXIgPSBuZXcgVGltZXIoKTsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSB2YWxpZFRpbWVXaW5kb3dJbk1pbHMgZXZlbnRzIHRoYXQgaGFwcGVuZWQgYmVmb3JlIHZhbGlkVGltZVdpbmRvd0luTWlscyBhcmUgbm90IGNvbnNpZGVyZWQKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gcmVwb3J0aW5nIHRoZSByYXRlLgotICAgICAqIEBwYXJhbSBudW1PZlNsaWRlcyB0aGUgbnVtYmVyIG9mIHRpbWUgc2lsZGVzIHRvIGRpdmlkZSB2YWxpZFRpbWVXaW5kb3dzLiBUaGUgbW9yZSBzbGlkZXMsCi0gICAgICogICAgICAgICAgICAgICAgICAgIHRoZSBzbW90aGVyIHRoZSByZXBvcnRlZCByZXN1bHRzIHdpbGwgYmUuCi0gICAgICovCi0gICAgcHVibGljIFJhdGVUcmFja2VyKGludCB2YWxpZFRpbWVXaW5kb3dJbk1pbHMsIGludCBudW1PZlNsaWRlcykgewotICAgICAgICB0aGlzKHZhbGlkVGltZVdpbmRvd0luTWlscywgbnVtT2ZTbGlkZXMsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RvcgotICAgICAqIEBwYXJhbSB2YWxpZFRpbWVXaW5kb3dJbk1pbHMgZXZlbnRzIHRoYXQgaGFwcGVuZWQgYmVmb3JlIHZhbGlkVGltZVdpbmRvdyBhcmUgbm90IGNvbnNpZGVyZWQKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gcmVwb3J0aW5nIHRoZSByYXRlLgotICAgICAqIEBwYXJhbSBudW1PZlNsaWRlcyB0aGUgbnVtYmVyIG9mIHRpbWUgc2lsZGVzIHRvIGRpdmlkZSB2YWxpZFRpbWVXaW5kb3dzLiBUaGUgbW9yZSBzbGlkZXMsCi0gICAgICogICAgICAgICAgICAgICAgICAgIHRoZSBzbW90aGVyIHRoZSByZXBvcnRlZCByZXN1bHRzIHdpbGwgYmUuCi0gICAgICogQHBhcmFtIHNpbXVsYXRlIHNldCB0cnVlIGlmIGl0IHVzZSBzaW11bGF0ZWQgdGltZSByYXRoZXIgdGhhbiBzeXN0ZW0gdGltZSBmb3IgdGVzdGluZyBwdXJwb3NlLgotICAgICAqLwotICAgIHB1YmxpYyBSYXRlVHJhY2tlcihpbnQgdmFsaWRUaW1lV2luZG93SW5NaWxzLCBpbnQgbnVtT2ZTbGlkZXMsIGJvb2xlYW4gc2ltdWxhdGUgKXsKLSAgICAgICAgX251bU9mU2xpZGVzID0gTWF0aC5tYXgobnVtT2ZTbGlkZXMsIDEpOwotICAgICAgICBfc2xpZGVTaXplSW5NaWxzID0gdmFsaWRUaW1lV2luZG93SW5NaWxzIC8gX251bU9mU2xpZGVzOwotICAgICAgICBpZiAoX3NsaWRlU2l6ZUluTWlscyA8IDEgKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2dhbCBhcmd1bWVudCBmb3IgUmF0ZVRyYWNrZXIiKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnQoX3NsaWRlU2l6ZUluTWlscyA+IDEpOwotICAgICAgICBfaGlzdG9ncmFtcyA9IG5ldyBsb25nW19udW1PZlNsaWRlc107Ci0gICAgICAgIEFycmF5cy5maWxsKF9oaXN0b2dyYW1zLDBMKTsKLSAgICAgICAgaWYoIXNpbXVsYXRlKSB7Ci0gICAgICAgICAgICBfdGltZXIuc2NoZWR1bGVBdEZpeGVkUmF0ZShuZXcgRnJlc2hlcigpLCBfc2xpZGVTaXplSW5NaWxzLCBfc2xpZGVTaXplSW5NaWxzKTsKLSAgICAgICAgfQotICAgICAgICBfY3VycmVudFZhbGlkU2xpZGVOdW0gPSAxOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE5vdGlmeSB0aGUgdHJhY2tlciB1cG9uIG5ldyBhcnJpdmFscwotICAgICAqCi0gICAgICogQHBhcmFtIGNvdW50IG51bWJlciBvZiBhcnJpdmFscwotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG5vdGlmeShsb25nIGNvdW50KSB7Ci0gICAgICAgIF9oaXN0b2dyYW1zW19oaXN0b2dyYW1zLmxlbmd0aC0xXSs9Y291bnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSBhdmVyYWdlIHJhdGUgaW4gc2xpZGVzLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgYXZlcmFnZSByYXRlCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGZsb2F0IHJlcG9ydFJhdGUoKSB7Ci0gICAgICAgIGxvbmcgc3VtID0gMDsKLSAgICAgICAgbG9uZyBkdXJhdGlvbiA9IF9jdXJyZW50VmFsaWRTbGlkZU51bSAqIF9zbGlkZVNpemVJbk1pbHM7Ci0gICAgICAgIGZvcihpbnQgaT1fbnVtT2ZTbGlkZXMgLSBfY3VycmVudFZhbGlkU2xpZGVOdW07IGkgPCBfbnVtT2ZTbGlkZXM7IGkrKyApewotICAgICAgICAgICAgc3VtICs9IF9oaXN0b2dyYW1zW2ldOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHN1bSAvIChmbG9hdCkgZHVyYXRpb24gKiAxMDAwOwotICAgIH0KLQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIGZvcmNlVXBkYXRlU2xpZGVzKGludCBudW1Ub0VjbGlwc2UpIHsKLQotICAgICAgICBmb3IoaW50IGk9MDsgaTwgbnVtVG9FY2xpcHNlOyBpKyspIHsKLSAgICAgICAgICAgIHVwZGF0ZVNsaWRlcygpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlU2xpZGVzKCl7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBfbnVtT2ZTbGlkZXMgLSAxOyBpKyspIHsKLSAgICAgICAgICAgIF9oaXN0b2dyYW1zW2ldID0gX2hpc3RvZ3JhbXNbaSArIDFdOwotICAgICAgICB9Ci0KLSAgICAgICAgX2hpc3RvZ3JhbXNbX2hpc3RvZ3JhbXMubGVuZ3RoIC0gMV0gPSAwOwotCi0gICAgICAgIF9jdXJyZW50VmFsaWRTbGlkZU51bSA9IE1hdGgubWluKF9jdXJyZW50VmFsaWRTbGlkZU51bSArIDEsIF9udW1PZlNsaWRlcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBGcmVzaGVyIGV4dGVuZHMgVGltZXJUYXNrIHsKLSAgICAgICAgcHVibGljIHZvaWQgcnVuICgpIHsKLSAgICAgICAgICAgIHVwZGF0ZVNsaWRlcygpOwotICAgICAgICB9Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS91dGlscy9SZWdpc3RlcmVkR2xvYmFsU3RhdGUuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS91dGlscy9SZWdpc3RlcmVkR2xvYmFsU3RhdGUuamF2YQppbmRleCA0ODA1M2ZjLi4xNTlhN2MxIDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vdXRpbHMvUmVnaXN0ZXJlZEdsb2JhbFN0YXRlLmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3V0aWxzL1JlZ2lzdGVyZWRHbG9iYWxTdGF0ZS5qYXZhCkBAIC0yNyw3ICsyNyw3IEBACiAgKiB0dXBsZXMuCiAgKi8KIHB1YmxpYyBjbGFzcyBSZWdpc3RlcmVkR2xvYmFsU3RhdGUgewotICAgIHByaXZhdGUgc3RhdGljIEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IF9zdGF0ZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKyAgICBwcml2YXRlIHN0YXRpYyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PiBfc3RhdGVzID0gbmV3IEhhc2hNYXA8PigpOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBfbG9jayA9IG5ldyBPYmplY3QoKTsKICAgICAKICAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnbG9iYWxMb2NrKCkgewpAQCAtNTAsOSArNTAsNyBAQAogICAgIAogICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldFN0YXRlKFN0cmluZyBpZCkgewogICAgICAgICBzeW5jaHJvbml6ZWQoX2xvY2spIHsKLSAgICAgICAgICAgIE9iamVjdCByZXQgPSBfc3RhdGVzLmdldChpZCk7Ci0gICAgICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiU3RhdGU6ICIgKyByZXQudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgcmV0dXJuIF9zdGF0ZXMuZ2V0KGlkKTsKICAgICAgICAgfSAgICAgICAgCiAgICAgfQogICAgIApkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3V0aWxzL1JvdGF0aW5nTWFwLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vdXRpbHMvUm90YXRpbmdNYXAuamF2YQppbmRleCAyYjhkNjZiLi4wM2QxYmY4IDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vdXRpbHMvUm90YXRpbmdNYXAuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vdXRpbHMvUm90YXRpbmdNYXAuamF2YQpAQCAtNTMsNyArNTMsNyBAQAogICAgICAgICBpZihudW1CdWNrZXRzPDIpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm51bUJ1Y2tldHMgbXVzdCBiZSA+PSAyIik7CiAgICAgICAgIH0KLSAgICAgICAgX2J1Y2tldHMgPSBuZXcgTGlua2VkTGlzdDxIYXNoTWFwPEssIFY+PigpOworICAgICAgICBfYnVja2V0cyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKICAgICAgICAgZm9yKGludCBpPTA7IGk8bnVtQnVja2V0czsgaSsrKSB7CiAgICAgICAgICAgICBfYnVja2V0cy5hZGQobmV3IEhhc2hNYXA8SywgVj4oKSk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS91dGlscy9TZXJ2aWNlUmVnaXN0cnkuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS91dGlscy9TZXJ2aWNlUmVnaXN0cnkuamF2YQppbmRleCA3MjRiYzNlLi5kNWMyZWNhIDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vdXRpbHMvU2VydmljZVJlZ2lzdHJ5LmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3V0aWxzL1NlcnZpY2VSZWdpc3RyeS5qYXZhCkBAIC0yMiw3ICsyMiw3IEBACiAKIC8vIHRoaXMgY2xhc3Mgc2hvdWxkIGJlIGNvbWJpbmVkIHdpdGggUmVnaXN0ZXJlZEdsb2JhbFN0YXRlCiBwdWJsaWMgY2xhc3MgU2VydmljZVJlZ2lzdHJ5IHsKLSAgICBwcml2YXRlIHN0YXRpYyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PiBfc2VydmljZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKyAgICBwcml2YXRlIHN0YXRpYyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PiBfc2VydmljZXMgPSBuZXcgSGFzaE1hcDw+KCk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IF9sb2NrID0gbmV3IE9iamVjdCgpOwogICAgIAogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlZ2lzdGVyU2VydmljZShPYmplY3Qgc2VydmljZSkgewpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3V0aWxzL1NoZWxsUHJvY2Vzcy5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3V0aWxzL1NoZWxsUHJvY2Vzcy5qYXZhCmluZGV4IGQxYjI4MDAuLjBiMmQzNGUgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS91dGlscy9TaGVsbFByb2Nlc3MuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vdXRpbHMvU2hlbGxQcm9jZXNzLmphdmEKQEAgLTM2LDEyICszNiwxMiBAQAogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OwogCiBwdWJsaWMgY2xhc3MgU2hlbGxQcm9jZXNzIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLSAgICBwdWJsaWMgc3RhdGljIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihTaGVsbFByb2Nlc3MuY2xhc3MpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFNoZWxsUHJvY2Vzcy5jbGFzcyk7CiAgICAgcHVibGljIHN0YXRpYyBMb2dnZXIgU2hlbGxMb2dnZXI7CiAgICAgcHJpdmF0ZSBQcm9jZXNzICAgICAgX3N1YnByb2Nlc3M7CiAgICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSAgcHJvY2Vzc0Vycm9yU3RyZWFtOwogICAgIHByaXZhdGUgU3RyaW5nW10gICAgIGNvbW1hbmQ7Ci0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IGVudiA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworICAgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBlbnYgPSBuZXcgSGFzaE1hcDw+KCk7CiAgICAgcHVibGljIElTZXJpYWxpemVyICAgc2VyaWFsaXplcjsKICAgICBwdWJsaWMgTnVtYmVyIHBpZDsKICAgICBwdWJsaWMgU3RyaW5nIGNvbXBvbmVudE5hbWU7CkBAIC05OCw3ICs5OCw3IEBACiAgICAgICAgIFN0cmluZyBzZXJpYWxpemVyX2NsYXNzTmFtZSA9IChTdHJpbmcpY29uZi5nZXQoQ29uZmlnLlRPUE9MT0dZX01VTFRJTEFOR19TRVJJQUxJWkVSKTsKICAgICAgICAgTE9HLmluZm8oIlN0b3JtIG11bHRpbGFuZyBzZXJpYWxpemVyOiAiICsgc2VyaWFsaXplcl9jbGFzc05hbWUpOwogCi0gICAgICAgIElTZXJpYWxpemVyIHNlcmlhbGl6ZXIgPSBudWxsOworICAgICAgICBJU2VyaWFsaXplciBzZXJpYWxpemVyOwogICAgICAgICB0cnkgewogICAgICAgICAgICAgLy9jcmVhdGUgYSBmYWN0b3J5IGNsYXNzCiAgICAgICAgICAgICBDbGFzcyBrbGFzcyA9IENsYXNzLmZvck5hbWUoc2VyaWFsaXplcl9jbGFzc05hbWUpOwpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3V0aWxzL1NoZWxsVXRpbHMuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS91dGlscy9TaGVsbFV0aWxzLmphdmEKaW5kZXggMTA2NWZmOS4uODU5NWI3MSAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3V0aWxzL1NoZWxsVXRpbHMuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vdXRpbHMvU2hlbGxVdGlscy5qYXZhCkBAIC0zNCw3ICszNCw3IEBACiAKIAogYWJzdHJhY3QgcHVibGljIGNsYXNzIFNoZWxsVXRpbHMgewotICAgIHB1YmxpYyBzdGF0aWMgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFNoZWxsVXRpbHMuY2xhc3MpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFNoZWxsVXRpbHMuY2xhc3MpOwogCiAgICAgLy8gT1NUeXBlIGRldGVjdGlvbgogICAgIHB1YmxpYyBlbnVtIE9TVHlwZSB7CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vdXRpbHMvU3Rvcm1Cb3VuZGVkRXhwb25lbnRpYWxCYWNrb2ZmUmV0cnkuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS91dGlscy9TdG9ybUJvdW5kZWRFeHBvbmVudGlhbEJhY2tvZmZSZXRyeS5qYXZhCmluZGV4IDU0MjJjMmUuLmJlNmYwZTkgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS91dGlscy9TdG9ybUJvdW5kZWRFeHBvbmVudGlhbEJhY2tvZmZSZXRyeS5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS91dGlscy9TdG9ybUJvdW5kZWRFeHBvbmVudGlhbEJhY2tvZmZSZXRyeS5qYXZhCkBAIC00Miw4ICs0Miw5IEBACiAgICAgcHVibGljIFN0b3JtQm91bmRlZEV4cG9uZW50aWFsQmFja29mZlJldHJ5KGludCBiYXNlU2xlZXBUaW1lTXMsIGludCBtYXhTbGVlcFRpbWVNcywgaW50IG1heFJldHJpZXMpIHsKICAgICAgICAgc3VwZXIoYmFzZVNsZWVwVGltZU1zLCBtYXhTbGVlcFRpbWVNcywgbWF4UmV0cmllcyk7CiAgICAgICAgIGV4cFJldHJpZXNUaHJlc2hvbGQgPSAxOwotICAgICAgICB3aGlsZSAoKDEgPDwgKGV4cFJldHJpZXNUaHJlc2hvbGQgKyAxKSkgPCAoKG1heFNsZWVwVGltZU1zIC0gYmFzZVNsZWVwVGltZU1zKSAvIDIpKQorICAgICAgICB3aGlsZSAoKDEgPDwgKGV4cFJldHJpZXNUaHJlc2hvbGQgKyAxKSkgPCAoKG1heFNsZWVwVGltZU1zIC0gYmFzZVNsZWVwVGltZU1zKSAvIDIpKSB7CiAgICAgICAgICAgICBleHBSZXRyaWVzVGhyZXNob2xkKys7CisgICAgICAgIH0KICAgICAgICAgTE9HLmRlYnVnKCJUaGUgYmFzZVNsZWVwVGltZU1zIFt7fV0gdGhlIG1heFNsZWVwVGltZU1zIFt7fV0gdGhlIG1heFJldHJpZXMgW3t9XSIsIAogCQkJCWJhc2VTbGVlcFRpbWVNcywgbWF4U2xlZXBUaW1lTXMsIG1heFJldHJpZXMpOwogICAgICAgICBpZiAoYmFzZVNsZWVwVGltZU1zID4gbWF4U2xlZXBUaW1lTXMpIHsKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS91dGlscy9UaHJpZnRUb3BvbG9neVV0aWxzLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vdXRpbHMvVGhyaWZ0VG9wb2xvZ3lVdGlscy5qYXZhCmluZGV4IDgzMDZkOWIuLmQ1YzQ2MGYgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS91dGlscy9UaHJpZnRUb3BvbG9neVV0aWxzLmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3V0aWxzL1RocmlmdFRvcG9sb2d5VXRpbHMuamF2YQpAQCAtMjcsMzAgKzI3LDM4IEBACiBpbXBvcnQgamF2YS51dGlsLlNldDsKIAogcHVibGljIGNsYXNzIFRocmlmdFRvcG9sb2d5VXRpbHMgeworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1dvcmtlckhvb2soU3Rvcm1Ub3BvbG9neS5fRmllbGRzIGYpIHsKKyAgICAgICAgcmV0dXJuIGYuZXF1YWxzKFN0b3JtVG9wb2xvZ3kuX0ZpZWxkcy5XT1JLRVJfSE9PS1MpOworICAgIH0KKwogICAgIHB1YmxpYyBzdGF0aWMgU2V0PFN0cmluZz4gZ2V0Q29tcG9uZW50SWRzKFN0b3JtVG9wb2xvZ3kgdG9wb2xvZ3kpIHsKICAgICAgICAgU2V0PFN0cmluZz4gcmV0ID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwogICAgICAgICBmb3IoU3Rvcm1Ub3BvbG9neS5fRmllbGRzIGY6IFN0b3JtVG9wb2xvZ3kubWV0YURhdGFNYXAua2V5U2V0KCkpIHsKLSAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gY29tcG9uZW50TWFwID0gKE1hcDxTdHJpbmcsIE9iamVjdD4pIHRvcG9sb2d5LmdldEZpZWxkVmFsdWUoZik7Ci0gICAgICAgICAgICByZXQuYWRkQWxsKGNvbXBvbmVudE1hcC5rZXlTZXQoKSk7CisgICAgICAgICAgICBpZihTdG9ybVRvcG9sb2d5Lm1ldGFEYXRhTWFwLmdldChmKS52YWx1ZU1ldGFEYXRhLnR5cGUgPT0gb3JnLmFwYWNoZS50aHJpZnQucHJvdG9jb2wuVFR5cGUuTUFQKSB7CisgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBjb21wb25lbnRNYXAgPSAoTWFwPFN0cmluZywgT2JqZWN0PikgdG9wb2xvZ3kuZ2V0RmllbGRWYWx1ZShmKTsKKyAgICAgICAgICAgICAgICByZXQuYWRkQWxsKGNvbXBvbmVudE1hcC5rZXlTZXQoKSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIENvbXBvbmVudENvbW1vbiBnZXRDb21wb25lbnRDb21tb24oU3Rvcm1Ub3BvbG9neSB0b3BvbG9neSwgU3RyaW5nIGNvbXBvbmVudElkKSB7CiAgICAgICAgIGZvcihTdG9ybVRvcG9sb2d5Ll9GaWVsZHMgZjogU3Rvcm1Ub3BvbG9neS5tZXRhRGF0YU1hcC5rZXlTZXQoKSkgewotICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBjb21wb25lbnRNYXAgPSAoTWFwPFN0cmluZywgT2JqZWN0PikgdG9wb2xvZ3kuZ2V0RmllbGRWYWx1ZShmKTsKLSAgICAgICAgICAgIGlmKGNvbXBvbmVudE1hcC5jb250YWluc0tleShjb21wb25lbnRJZCkpIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgY29tcG9uZW50ID0gY29tcG9uZW50TWFwLmdldChjb21wb25lbnRJZCk7Ci0gICAgICAgICAgICAgICAgaWYoY29tcG9uZW50IGluc3RhbmNlb2YgQm9sdCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKChCb2x0KSBjb21wb25lbnQpLmdldF9jb21tb24oKTsKKyAgICAgICAgICAgIGlmKFN0b3JtVG9wb2xvZ3kubWV0YURhdGFNYXAuZ2V0KGYpLnZhbHVlTWV0YURhdGEudHlwZSA9PSBvcmcuYXBhY2hlLnRocmlmdC5wcm90b2NvbC5UVHlwZS5NQVApIHsKKyAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbXBvbmVudE1hcCA9IChNYXA8U3RyaW5nLCBPYmplY3Q+KSB0b3BvbG9neS5nZXRGaWVsZFZhbHVlKGYpOworICAgICAgICAgICAgICAgIGlmKGNvbXBvbmVudE1hcC5jb250YWluc0tleShjb21wb25lbnRJZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGNvbXBvbmVudCA9IGNvbXBvbmVudE1hcC5nZXQoY29tcG9uZW50SWQpOworICAgICAgICAgICAgICAgICAgICBpZihjb21wb25lbnQgaW5zdGFuY2VvZiBCb2x0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKChCb2x0KSBjb21wb25lbnQpLmdldF9jb21tb24oKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZihjb21wb25lbnQgaW5zdGFuY2VvZiBTcG91dFNwZWMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoKFNwb3V0U3BlYykgY29tcG9uZW50KS5nZXRfY29tbW9uKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYoY29tcG9uZW50IGluc3RhbmNlb2YgU3RhdGVTcG91dFNwZWMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoKFN0YXRlU3BvdXRTcGVjKSBjb21wb25lbnQpLmdldF9jb21tb24oKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5yZWFjaGFibGUgY29kZSEgTm8gZ2V0X2NvbW1vbiBjb252ZXJzaW9uIGZvciBjb21wb25lbnQgIiArIGNvbXBvbmVudCk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmKGNvbXBvbmVudCBpbnN0YW5jZW9mIFNwb3V0U3BlYykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKChTcG91dFNwZWMpIGNvbXBvbmVudCkuZ2V0X2NvbW1vbigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZihjb21wb25lbnQgaW5zdGFuY2VvZiBTdGF0ZVNwb3V0U3BlYykgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKChTdGF0ZVNwb3V0U3BlYykgY29tcG9uZW50KS5nZXRfY29tbW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbnJlYWNoYWJsZSBjb2RlISBObyBnZXRfY29tbW9uIGNvbnZlcnNpb24gZm9yIGNvbXBvbmVudCAiICsgY29tcG9uZW50KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJDb3VsZCBub3QgZmluZCBjb21wb25lbnQgY29tbW9uIGZvciAiICsgY29tcG9uZW50SWQpOwpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3V0aWxzL1RpbWUuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS91dGlscy9UaW1lLmphdmEKaW5kZXggNTBhNzlmZC4uOGFhODcxYiAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3V0aWxzL1RpbWUuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vdXRpbHMvVGltZS5qYXZhCkBAIC0yNiw3ICsyNiw3IEBACiAKIAogcHVibGljIGNsYXNzIFRpbWUgewotICAgIHB1YmxpYyBzdGF0aWMgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFRpbWUuY2xhc3MpOyAgICAKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihUaW1lLmNsYXNzKTsKICAgICAKICAgICBwcml2YXRlIHN0YXRpYyBBdG9taWNCb29sZWFuIHNpbXVsYXRpbmcgPSBuZXcgQXRvbWljQm9vbGVhbihmYWxzZSk7CiAgICAgLy9UT0RPOiBzaG91bGQgcHJvYmFibHkgdXNlIHdlYWsgcmVmZXJlbmNlcyBoZXJlIG9yIHNvbWV0aGluZwpAQCAtMzksNyArMzksNyBAQAogICAgICAgICBzeW5jaHJvbml6ZWQoc2xlZXBUaW1lc0xvY2spIHsKICAgICAgICAgICAgIHNpbXVsYXRpbmcuc2V0KHRydWUpOwogICAgICAgICAgICAgc2ltdWxhdGVkQ3VyclRpbWVNcyA9IG5ldyBBdG9taWNMb25nKDApOwotICAgICAgICAgICAgdGhyZWFkU2xlZXBUaW1lcyA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDxUaHJlYWQsIEF0b21pY0xvbmc+KCk7CisgICAgICAgICAgICB0aHJlYWRTbGVlcFRpbWVzID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPD4oKTsKICAgICAgICAgfQogICAgIH0KICAgICAKQEAgLTU4LDE0ICs1OCwyNCBAQAogICAgICAgICBpZihzaW11bGF0aW5nLmdldCgpKSB7CiAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZChzbGVlcFRpbWVzTG9jaykgeworICAgICAgICAgICAgICAgICAgICBpZiAodGhyZWFkU2xlZXBUaW1lcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0cuZGVidWcoInt9IGlzIHN0aWxsIHNsZWVwaW5nIGFmdGVyIHNpbXVsYXRlZCB0aW1lIGRpc2FibGVkLiIsIFRocmVhZC5jdXJyZW50VGhyZWFkKCksIG5ldyBSdW50aW1lRXhjZXB0aW9uKCJTVEFDSyBUUkFDRSIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHRocmVhZFNsZWVwVGltZXMucHV0KFRocmVhZC5jdXJyZW50VGhyZWFkKCksIG5ldyBBdG9taWNMb25nKHRhcmdldFRpbWVNcykpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB3aGlsZShzaW11bGF0ZWRDdXJyVGltZU1zLmdldCgpIDwgdGFyZ2V0VGltZU1zKSB7CisgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZChzbGVlcFRpbWVzTG9jaykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRocmVhZFNsZWVwVGltZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPRy5kZWJ1Zygie30gaXMgc3RpbGwgc2xlZXBpbmcgYWZ0ZXIgc2ltdWxhdGVkIHRpbWUgZGlzYWJsZWQuIiwgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKSwgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlNUQUNLIFRSQUNFIikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQoc2xlZXBUaW1lc0xvY2spIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNpbXVsYXRpbmcuZ2V0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNpbXVsYXRpbmcuZ2V0KCkgJiYgdGhyZWFkU2xlZXBUaW1lcyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRTbGVlcFRpbWVzLnJlbW92ZShUaHJlYWQuY3VycmVudFRocmVhZCgpKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS91dGlscy9UcmFuc2ZlckRyYWluZXIuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS91dGlscy9UcmFuc2ZlckRyYWluZXIuamF2YQppbmRleCA1YTExMWNlLi5mZWIwMzI4IDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vdXRpbHMvVHJhbnNmZXJEcmFpbmVyLmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3V0aWxzL1RyYW5zZmVyRHJhaW5lci5qYXZhCkBAIC0yMCw2ICsyMCw3IEBACiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKIAogaW1wb3J0IGJhY2t0eXBlLnN0b3JtLm1lc3NhZ2luZy5JQ29ubmVjdGlvbjsKIGltcG9ydCBiYWNrdHlwZS5zdG9ybS5tZXNzYWdpbmcuVGFza01lc3NhZ2U7CkBAIC0zMCwxOCArMzEsMTkgQEAKICAgcHJpdmF0ZSBIYXNoTWFwPEludGVnZXIsIEFycmF5TGlzdDxBcnJheUxpc3Q8VGFza01lc3NhZ2U+Pj4gYnVuZGxlcyA9IG5ldyBIYXNoTWFwKCk7CiAgIAogICBwdWJsaWMgdm9pZCBhZGQoSGFzaE1hcDxJbnRlZ2VyLCBBcnJheUxpc3Q8VGFza01lc3NhZ2U+PiB0YXNrVHVwbGVTZXRNYXApIHsKLSAgICBmb3IgKEludGVnZXIgdGFzayA6IHRhc2tUdXBsZVNldE1hcC5rZXlTZXQoKSkgewotICAgICAgYWRkTGlzdFJlZlRvTWFwKHRoaXMuYnVuZGxlcywgdGFzaywgdGFza1R1cGxlU2V0TWFwLmdldCh0YXNrKSk7CisgICAgZm9yIChNYXAuRW50cnk8SW50ZWdlciwgQXJyYXlMaXN0PFRhc2tNZXNzYWdlPj4gZW50cnkgOiB0YXNrVHVwbGVTZXRNYXAuZW50cnlTZXQoKSkgeworICAgICAgYWRkTGlzdFJlZlRvTWFwKHRoaXMuYnVuZGxlcywgZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOwogICAgIH0KICAgfQogICAKICAgcHVibGljIHZvaWQgc2VuZChIYXNoTWFwPEludGVnZXIsIFN0cmluZz4gdGFza1RvTm9kZSwgSGFzaE1hcDxTdHJpbmcsIElDb25uZWN0aW9uPiBjb25uZWN0aW9ucykgewogICAgIEhhc2hNYXA8U3RyaW5nLCBBcnJheUxpc3Q8QXJyYXlMaXN0PFRhc2tNZXNzYWdlPj4+IGJ1bmRsZU1hcEJ5RGVzdGluYXRpb24gPSBncm91cEJ1bmRsZUJ5RGVzdGluYXRpb24odGFza1RvTm9kZSk7CiAKLSAgICBmb3IgKFN0cmluZyBob3N0UG9ydCA6IGJ1bmRsZU1hcEJ5RGVzdGluYXRpb24ua2V5U2V0KCkpIHsKKyAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIEFycmF5TGlzdDxBcnJheUxpc3Q8VGFza01lc3NhZ2U+Pj4gZW50cnkgOiBidW5kbGVNYXBCeURlc3RpbmF0aW9uLmVudHJ5U2V0KCkpIHsKKyAgICAgIFN0cmluZyBob3N0UG9ydCA9IGVudHJ5LmdldEtleSgpOwogICAgICAgSUNvbm5lY3Rpb24gY29ubmVjdGlvbiA9IGNvbm5lY3Rpb25zLmdldChob3N0UG9ydCk7CiAgICAgICBpZiAobnVsbCAhPSBjb25uZWN0aW9uKSB7Ci0gICAgICAgIEFycmF5TGlzdDxBcnJheUxpc3Q8VGFza01lc3NhZ2U+PiBidW5kbGUgPSBidW5kbGVNYXBCeURlc3RpbmF0aW9uLmdldChob3N0UG9ydCk7CisgICAgICAgIEFycmF5TGlzdDxBcnJheUxpc3Q8VGFza01lc3NhZ2U+PiBidW5kbGUgPSBlbnRyeS5nZXRWYWx1ZSgpOwogICAgICAgICBJdGVyYXRvcjxUYXNrTWVzc2FnZT4gaXRlciA9IGdldEJ1bmRsZUl0ZXJhdG9yKGJ1bmRsZSk7CiAgICAgICAgIGlmIChudWxsICE9IGl0ZXIgJiYgaXRlci5oYXNOZXh0KCkpIHsKICAgICAgICAgICBjb25uZWN0aW9uLnNlbmQoaXRlcik7CkBAIC05OCwxNSArMTAwLDEyIEBACiAgICAgICAKICAgICAgIEBPdmVycmlkZQogICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLSAgICAgICAgaWYgKG9mZnNldCA8IHNpemUpIHsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgcmV0dXJuIG9mZnNldCA8IHNpemU7CiAgICAgICB9CiAKICAgICAgIEBPdmVycmlkZQogICAgICAgcHVibGljIFRhc2tNZXNzYWdlIG5leHQoKSB7Ci0gICAgICAgIFRhc2tNZXNzYWdlIG1zZyA9IG51bGw7CisgICAgICAgIFRhc2tNZXNzYWdlIG1zZzsKICAgICAgICAgaWYgKGl0ZXIuaGFzTmV4dCgpKSB7CiAgICAgICAgICAgbXNnID0gaXRlci5uZXh0KCk7IAogICAgICAgICB9IGVsc2UgewpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3V0aWxzL1V0aWxzLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vdXRpbHMvVXRpbHMuamF2YQppbmRleCBiODBhYTExLi40N2QyMzMyIDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vdXRpbHMvVXRpbHMuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vdXRpbHMvVXRpbHMuamF2YQpAQCAtNDIsNyArNDIsNiBAQAogaW1wb3J0IG9yZy55YW1sLnNuYWtleWFtbC5ZYW1sOwogaW1wb3J0IG9yZy55YW1sLnNuYWtleWFtbC5jb25zdHJ1Y3Rvci5TYWZlQ29uc3RydWN0b3I7CiAKLWltcG9ydCBqYXZhLmlvLio7CiBpbXBvcnQgamF2YS5uZXQuVVJMOwogaW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7CiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKQEAgLTUwLDEzICs0OSw0NCBAQAogaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLldyaXRhYmxlQnl0ZUNoYW5uZWw7CiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC4qOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlOworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7CitpbXBvcnQgamF2YS51dGlsLlVVSUQ7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CiBpbXBvcnQgamF2YS51dGlsLnppcC5HWklQSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS51dGlsLnppcC5HWklQT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC56aXAuWmlwRW50cnk7CitpbXBvcnQgamF2YS51dGlsLnppcC5aaXBGaWxlOworCitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEJhc2U7CitpbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVERlc2VyaWFsaXplcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5UU2VyaWFsaXplcjsKIAogcHVibGljIGNsYXNzIFV0aWxzIHsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoVXRpbHMuY2xhc3MpOwogICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfU1RSRUFNX0lEID0gImRlZmF1bHQiOworICAgIHByaXZhdGUgc3RhdGljIFRocmVhZExvY2FsPFRTZXJpYWxpemVyPiB0aHJlYWRTZXIgPSBuZXcgVGhyZWFkTG9jYWw8VFNlcmlhbGl6ZXI+KCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgVGhyZWFkTG9jYWw8VERlc2VyaWFsaXplcj4gdGhyZWFkRGVzID0gbmV3IFRocmVhZExvY2FsPFREZXNlcmlhbGl6ZXI+KCk7CiAKICAgICBwcml2YXRlIHN0YXRpYyBTZXJpYWxpemF0aW9uRGVsZWdhdGUgc2VyaWFsaXphdGlvbkRlbGVnYXRlOwogICAgIHByaXZhdGUgc3RhdGljIENsYXNzTG9hZGVyIGNsID0gQ2xhc3NMb2FkZXIuZ2V0U3lzdGVtQ2xhc3NMb2FkZXIoKTsKQEAgLTgzLDYgKzExMyw1MSBAQAogICAgICAgICByZXR1cm4gc2VyaWFsaXphdGlvbkRlbGVnYXRlLmRlc2VyaWFsaXplKHNlcmlhbGl6ZWQsIGNsYXp6KTsKICAgICB9CiAKKyAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSB0aHJpZnRTZXJpYWxpemUoVEJhc2UgdCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgVFNlcmlhbGl6ZXIgc2VyID0gdGhyZWFkU2VyLmdldCgpOworICAgICAgICAgICAgaWYgKHNlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2VyID0gbmV3IFRTZXJpYWxpemVyKCk7CisgICAgICAgICAgICAgICAgdGhyZWFkU2VyLnNldChzZXIpOworICAgICAgICAgICAgfSAKKyAgICAgICAgICAgIHJldHVybiBzZXIuc2VyaWFsaXplKHQpOworICAgICAgICB9IGNhdGNoIChURXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgVERlc2VyaWFsaXplciBnZXREZXMoKSB7CisgICAgICAgIFREZXNlcmlhbGl6ZXIgZGVzID0gdGhyZWFkRGVzLmdldCgpOworICAgICAgICBpZihkZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgZGVzID0gbmV3IFREZXNlcmlhbGl6ZXIoKTsKKyAgICAgICAgICAgIHRocmVhZERlcy5zZXQoZGVzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZGVzOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFQgdGhyaWZ0RGVzZXJpYWxpemUoQ2xhc3MgYywgYnl0ZVtdIGIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFQgcmV0ID0gKFQpIGMubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIFREZXNlcmlhbGl6ZXIgZGVzID0gZ2V0RGVzKCk7CisgICAgICAgICAgICBkZXMuZGVzZXJpYWxpemUoKFRCYXNlKXJldCwgYiwgb2Zmc2V0LCBsZW5ndGgpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyA8VD4gVCB0aHJpZnREZXNlcmlhbGl6ZShDbGFzcyBjLCBieXRlW10gYikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgVCByZXQgPSAoVCkgYy5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgVERlc2VyaWFsaXplciBkZXMgPSBnZXREZXMoKTsKKyAgICAgICAgICAgIGRlcy5kZXNlcmlhbGl6ZSgoVEJhc2UpIHJldCwgYik7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKworICAgIH0KKyAgICAKICAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBqYXZhU2VyaWFsaXplKE9iamVjdCBvYmopIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CkBAIC0xMDIsOSArMTc3LDkgQEAKICAgICAgICAgICAgIE9iamVjdCByZXQgPSBvaXMucmVhZE9iamVjdCgpOwogICAgICAgICAgICAgb2lzLmNsb3NlKCk7CiAgICAgICAgICAgICByZXR1cm4gKFQpcmV0OwotICAgICAgICB9IGNhdGNoKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGlvZSk7Ci0gICAgICAgIH0gY2F0Y2goQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xNTgsMjMgKzIzMywyMyBAQAogICAgICAgICAgICAgT2JqZWN0IHJldCA9IEpTT05WYWx1ZS5wYXJzZVdpdGhFeGNlcHRpb24oaW4pOwogICAgICAgICAgICAgaW4uY2xvc2UoKTsKICAgICAgICAgICAgIHJldHVybiAoTWFwPFN0cmluZyxPYmplY3Q+KXJldDsKLSAgICAgICAgfSBjYXRjaChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihpb2UpOwotICAgICAgICB9IGNhdGNoKFBhcnNlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIDxUPiBTdHJpbmcgam9pbihJdGVyYWJsZTxUPiBjb2xsLCBTdHJpbmcgc2VwKSB7CiAgICAgICAgIEl0ZXJhdG9yPFQ+IGl0ID0gY29sbC5pdGVyYXRvcigpOwotICAgICAgICBTdHJpbmcgcmV0ID0gIiI7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgcmV0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKICAgICAgICAgd2hpbGUoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICByZXQgPSByZXQgKyBpdC5uZXh0KCk7CisgICAgICAgICAgICByZXQuYXBwZW5kKGl0Lm5leHQoKSk7CiAgICAgICAgICAgICBpZihpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICByZXQgPSByZXQgKyBzZXA7CisgICAgICAgICAgICAgICAgcmV0LmFwcGVuZChzZXApOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIHJldHVybiByZXQudG9TdHJpbmcoKTsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2xlZXAobG9uZyBtaWxsaXMpIHsKQEAgLTE4OSw3ICsyNjQsNyBAQAogICAgICAgICB0cnkgewogICAgICAgICAgICAgRW51bWVyYXRpb248VVJMPiByZXNvdXJjZXMgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpLmdldFJlc291cmNlcyhuYW1lKTsKICAgICAgICAgICAgIExpc3Q8VVJMPiByZXQgPSBuZXcgQXJyYXlMaXN0PFVSTD4oKTsKLSAgICAgICAgICAgIHdoaWxlKHJlc291cmNlcy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgd2hpbGUgKHJlc291cmNlcy5oYXNNb3JlRWxlbWVudHMoKSkgewogICAgICAgICAgICAgICAgIHJldC5hZGQocmVzb3VyY2VzLm5leHRFbGVtZW50KCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIHJldDsKQEAgLTI1Myw3ICszMjgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiByZXNvdXJjZXMuIFlvdSdyZSBwcm9iYWJseSBidW5kbGluZyB0aGUgU3Rvcm0gamFycyB3aXRoIHlvdXIgdG9wb2xvZ3kgamFyLiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyByZXNvdXJjZXMpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTE9HLmluZm8oIlVzaW5nICIrY29uZmlnRmlsZVBhdGgrIiBmcm9tIHJlc291cmNlcyIpOworICAgICAgICAgICAgTE9HLmRlYnVnKCJVc2luZyAiK2NvbmZpZ0ZpbGVQYXRoKyIgZnJvbSByZXNvdXJjZXMiKTsKICAgICAgICAgICAgIFVSTCByZXNvdXJjZSA9IHJlc291cmNlcy5pdGVyYXRvcigpLm5leHQoKTsKICAgICAgICAgICAgIHJldHVybiByZXNvdXJjZS5vcGVuU3RyZWFtKCk7CiAgICAgICAgIH0KQEAgLTI2Miw3ICszMzcsNyBAQAogCiAKICAgICBwdWJsaWMgc3RhdGljIE1hcCBmaW5kQW5kUmVhZENvbmZpZ0ZpbGUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICByZXR1cm4gZmluZEFuZFJlYWRDb25maWdGaWxlKG5hbWUsIHRydWUpOworICAgICAgICByZXR1cm4gZmluZEFuZFJlYWRDb25maWdGaWxlKG5hbWUsIHRydWUpOwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgTWFwIHJlYWREZWZhdWx0Q29uZmlnKCkgewpAQCAtMjcyLDcgKzM0Nyw3IEBACiAgICAgcHVibGljIHN0YXRpYyBNYXAgcmVhZENvbW1hbmRMaW5lT3B0cygpIHsKICAgICAgICAgTWFwIHJldCA9IG5ldyBIYXNoTWFwKCk7CiAgICAgICAgIFN0cmluZyBjb21tYW5kT3B0aW9ucyA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgic3Rvcm0ub3B0aW9ucyIpOwotICAgICAgICBpZihjb21tYW5kT3B0aW9ucyAhPSBudWxsKSB7CisgICAgICAgIGlmIChjb21tYW5kT3B0aW9ucyAhPSBudWxsKSB7CiAgICAgICAgICAgICBTdHJpbmdbXSBjb25maWdzID0gY29tbWFuZE9wdGlvbnMuc3BsaXQoIiwiKTsKICAgICAgICAgICAgIGZvciAoU3RyaW5nIGNvbmZpZyA6IGNvbmZpZ3MpIHsKICAgICAgICAgICAgICAgICBjb25maWcgPSBVUkxEZWNvZGVyLmRlY29kZShjb25maWcpOwpAQCAtMjk1LDcgKzM3MCw3IEBACiAgICAgICAgIE1hcCByZXQgPSByZWFkRGVmYXVsdENvbmZpZygpOwogICAgICAgICBTdHJpbmcgY29uZkZpbGUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInN0b3JtLmNvbmYuZmlsZSIpOwogICAgICAgICBNYXAgc3Rvcm07Ci0gICAgICAgIGlmIChjb25mRmlsZT09bnVsbCB8fCBjb25mRmlsZS5lcXVhbHMoIiIpKSB7CisgICAgICAgIGlmIChjb25mRmlsZSA9PSBudWxsIHx8IGNvbmZGaWxlLmVxdWFscygiIikpIHsKICAgICAgICAgICAgIHN0b3JtID0gZmluZEFuZFJlYWRDb25maWdGaWxlKCJzdG9ybS55YW1sIiwgZmFsc2UpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgc3Rvcm0gPSBmaW5kQW5kUmVhZENvbmZpZ0ZpbGUoY29uZkZpbGUsIHRydWUpOwpAQCAtMzA2LDI0ICszODEsMjMgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBPYmplY3Qgbm9ybWFsaXplQ29uZihPYmplY3QgY29uZikgewotICAgICAgICBpZihjb25mPT1udWxsKSByZXR1cm4gbmV3IEhhc2hNYXAoKTsKLSAgICAgICAgaWYoY29uZiBpbnN0YW5jZW9mIE1hcCkgewotICAgICAgICAgICAgTWFwIGNvbmZNYXAgPSBuZXcgSGFzaE1hcCgoTWFwKSBjb25mKTsKLSAgICAgICAgICAgIGZvcihPYmplY3Qga2V5OiBjb25mTWFwLmtleVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IHZhbCA9IGNvbmZNYXAuZ2V0KGtleSk7Ci0gICAgICAgICAgICAgICAgY29uZk1hcC5wdXQoa2V5LCBub3JtYWxpemVDb25mKHZhbCkpOworICAgICAgICBpZiAoY29uZiA9PSBudWxsKSByZXR1cm4gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgaWYgKGNvbmYgaW5zdGFuY2VvZiBNYXApIHsKKyAgICAgICAgICAgIE1hcDxPYmplY3QsIE9iamVjdD4gY29uZk1hcCA9IG5ldyBIYXNoTWFwKChNYXApIGNvbmYpOworICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8T2JqZWN0LCBPYmplY3Q+IGVudHJ5IDogY29uZk1hcC5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICAgICAgY29uZk1hcC5wdXQoZW50cnkuZ2V0S2V5KCksIG5vcm1hbGl6ZUNvbmYoZW50cnkuZ2V0VmFsdWUoKSkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIGNvbmZNYXA7Ci0gICAgICAgIH0gZWxzZSBpZihjb25mIGluc3RhbmNlb2YgTGlzdCkgeworICAgICAgICB9IGVsc2UgaWYgKGNvbmYgaW5zdGFuY2VvZiBMaXN0KSB7CiAgICAgICAgICAgICBMaXN0IGNvbmZMaXN0ID0gIG5ldyBBcnJheUxpc3QoKExpc3QpIGNvbmYpOwotICAgICAgICAgICAgZm9yKGludCBpPTA7IGk8Y29uZkxpc3Quc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29uZkxpc3Quc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgICAgICBPYmplY3QgdmFsID0gY29uZkxpc3QuZ2V0KGkpOwogICAgICAgICAgICAgICAgIGNvbmZMaXN0LnNldChpLCBub3JtYWxpemVDb25mKHZhbCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIGNvbmZMaXN0OwogICAgICAgICB9IGVsc2UgaWYgKGNvbmYgaW5zdGFuY2VvZiBJbnRlZ2VyKSB7CiAgICAgICAgICAgICByZXR1cm4gKChJbnRlZ2VyKSBjb25mKS5sb25nVmFsdWUoKTsKLSAgICAgICAgfSBlbHNlIGlmKGNvbmYgaW5zdGFuY2VvZiBGbG9hdCkgeworICAgICAgICB9IGVsc2UgaWYgKGNvbmYgaW5zdGFuY2VvZiBGbG9hdCkgewogICAgICAgICAgICAgcmV0dXJuICgoRmxvYXQpIGNvbmYpLmRvdWJsZVZhbHVlKCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICByZXR1cm4gY29uZjsKQEAgLTMzNSw5ICs0MDksOSBAQAogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldFNldENvbXBvbmVudE9iamVjdChDb21wb25lbnRPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGlmKG9iai5nZXRTZXRGaWVsZCgpPT1Db21wb25lbnRPYmplY3QuX0ZpZWxkcy5TRVJJQUxJWkVEX0pBVkEpIHsKKyAgICAgICAgaWYgKG9iai5nZXRTZXRGaWVsZCgpID09IENvbXBvbmVudE9iamVjdC5fRmllbGRzLlNFUklBTElaRURfSkFWQSkgewogICAgICAgICAgICAgcmV0dXJuIFV0aWxzLmphdmFEZXNlcmlhbGl6ZShvYmouZ2V0X3NlcmlhbGl6ZWRfamF2YSgpLCBTZXJpYWxpemFibGUuY2xhc3MpOwotICAgICAgICB9IGVsc2UgaWYob2JqLmdldFNldEZpZWxkKCk9PUNvbXBvbmVudE9iamVjdC5fRmllbGRzLkpBVkFfT0JKRUNUKSB7CisgICAgICAgIH0gZWxzZSBpZiAob2JqLmdldFNldEZpZWxkKCkgPT0gQ29tcG9uZW50T2JqZWN0Ll9GaWVsZHMuSkFWQV9PQkpFQ1QpIHsKICAgICAgICAgICAgIHJldHVybiBvYmouZ2V0X2phdmFfb2JqZWN0KCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICByZXR1cm4gb2JqLmdldF9zaGVsbCgpOwpAQCAtMzQ2LDcgKzQyMCw3IEBACiAKICAgICBwdWJsaWMgc3RhdGljIDxTLCBUPiBUIGdldChNYXA8UywgVD4gbSwgUyBrZXksIFQgZGVmKSB7CiAgICAgICAgIFQgcmV0ID0gbS5nZXQoa2V5KTsKLSAgICAgICAgaWYocmV0PT1udWxsKSB7CisgICAgICAgIGlmIChyZXQgPT0gbnVsbCkgewogICAgICAgICAgICAgcmV0ID0gZGVmOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXQ7CkBAIC0zNTQsNyArNDI4LDcgQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPYmplY3Q+IHR1cGxlKE9iamVjdC4uLiB2YWx1ZXMpIHsKICAgICAgICAgTGlzdDxPYmplY3Q+IHJldCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotICAgICAgICBmb3IoT2JqZWN0IHY6IHZhbHVlcykgeworICAgICAgICBmb3IgKE9iamVjdCB2IDogdmFsdWVzKSB7CiAgICAgICAgICAgICByZXQuYWRkKHYpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXQ7CkBAIC0zNjMsMTggKzQzNywxOCBAQAogICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkb3dubG9hZEZyb21NYXN0ZXIoTWFwIGNvbmYsIFN0cmluZyBmaWxlLCBTdHJpbmcgbG9jYWxGaWxlKSB0aHJvd3MgQXV0aG9yaXphdGlvbkV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFRFeGNlcHRpb24gewogICAgICAgICBOaW1idXNDbGllbnQgY2xpZW50ID0gTmltYnVzQ2xpZW50LmdldENvbmZpZ3VyZWRDbGllbnQoY29uZik7CiAgICAgICAgIHRyeSB7Ci0gICAgICAgIAlkb3dubG9hZChjbGllbnQsIGZpbGUsIGxvY2FsRmlsZSk7CisgICAgICAgICAgICBkb3dubG9hZChjbGllbnQsIGZpbGUsIGxvY2FsRmlsZSk7CiAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgIAljbGllbnQuY2xvc2UoKTsKKyAgICAgICAgICAgIGNsaWVudC5jbG9zZSgpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIGRvd25sb2FkRnJvbUhvc3QoTWFwIGNvbmYsIFN0cmluZyBmaWxlLCBTdHJpbmcgbG9jYWxGaWxlLCBTdHJpbmcgaG9zdCwgaW50IHBvcnQpIHRocm93cyBJT0V4Y2VwdGlvbiwgVEV4Y2VwdGlvbiwgQXV0aG9yaXphdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIE5pbWJ1c0NsaWVudCBjbGllbnQgPSBuZXcgTmltYnVzQ2xpZW50IChjb25mLCBob3N0LCBwb3J0LCBudWxsKTsKICAgICAgICAgdHJ5IHsKLSAgICAgICAgCWRvd25sb2FkKGNsaWVudCwgZmlsZSwgbG9jYWxGaWxlKTsKKyAgICAgICAgICAgIGRvd25sb2FkKGNsaWVudCwgZmlsZSwgbG9jYWxGaWxlKTsKICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgCWNsaWVudC5jbG9zZSgpOworICAgICAgICAgICAgY2xpZW50LmNsb3NlKCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTM4MiwyMSArNDU2LDIxIEBACiAgICAgICAgIFdyaXRhYmxlQnl0ZUNoYW5uZWwgb3V0ID0gQ2hhbm5lbHMubmV3Q2hhbm5lbChuZXcgRmlsZU91dHB1dFN0cmVhbShsb2NhbEZpbGUpKTsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIFN0cmluZyBpZCA9IGNsaWVudC5nZXRDbGllbnQoKS5iZWdpbkZpbGVEb3dubG9hZChmaWxlKTsKLQkgICAgICAgIHdoaWxlKHRydWUpIHsKLQkgICAgICAgICAgICBCeXRlQnVmZmVyIGNodW5rID0gY2xpZW50LmdldENsaWVudCgpLmRvd25sb2FkQ2h1bmsoaWQpOwotCSAgICAgICAgICAgIGludCB3cml0dGVuID0gb3V0LndyaXRlKGNodW5rKTsKLQkgICAgICAgICAgICBpZih3cml0dGVuPT0wKSBicmVhazsKLQkgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciBjaHVuayA9IGNsaWVudC5nZXRDbGllbnQoKS5kb3dubG9hZENodW5rKGlkKTsKKyAgICAgICAgICAgICAgICBpbnQgd3JpdHRlbiA9IG91dC53cml0ZShjaHVuayk7CisgICAgICAgICAgICAgICAgaWYgKHdyaXR0ZW4gPT0gMCkgYnJlYWs7CisgICAgICAgICAgICB9CiAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgIAlvdXQuY2xvc2UoKTsKKyAgICAgICAgICAgIG91dC5jbG9zZSgpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBJRm4gbG9hZENsb2p1cmVGbihTdHJpbmcgbmFtZXNwYWNlLCBTdHJpbmcgbmFtZSkgewogICAgICAgICB0cnkgewotICAgICAgICAgIGNsb2p1cmUubGFuZy5Db21waWxlci5ldmFsKFJULnJlYWRTdHJpbmcoIihyZXF1aXJlICciICsgbmFtZXNwYWNlICsgIikiKSk7CisgICAgICAgICAgICBjbG9qdXJlLmxhbmcuQ29tcGlsZXIuZXZhbChSVC5yZWFkU3RyaW5nKCIocmVxdWlyZSAnIiArIG5hbWVzcGFjZSArICIpIikpOwogICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgIC8vaWYgcGxheWluZyBmcm9tIHRoZSByZXBsIGFuZCBkZWZpbmluZyBmdW5jdGlvbnMsIGZpbGUgd29uJ3QgZXhpc3QKKyAgICAgICAgICAgIC8vaWYgcGxheWluZyBmcm9tIHRoZSByZXBsIGFuZCBkZWZpbmluZyBmdW5jdGlvbnMsIGZpbGUgd29uJ3QgZXhpc3QKICAgICAgICAgfQogICAgICAgICByZXR1cm4gKElGbikgUlQudmFyKG5hbWVzcGFjZSwgbmFtZSkuZGVyZWYoKTsKICAgICB9CkBAIC00MDcsNjQgKzQ4MSw5MyBAQAogCiAgICAgcHVibGljIHN0YXRpYyA8SywgVj4gTWFwPFYsIEs+IHJldmVyc2VNYXAoTWFwPEssIFY+IG1hcCkgewogICAgICAgICBNYXA8ViwgSz4gcmV0ID0gbmV3IEhhc2hNYXA8ViwgSz4oKTsKLSAgICAgICAgZm9yKEsga2V5OiBtYXAua2V5U2V0KCkpIHsKLSAgICAgICAgICAgIHJldC5wdXQobWFwLmdldChrZXkpLCBrZXkpOworICAgICAgICBmb3IgKE1hcC5FbnRyeTxLLCBWPiBlbnRyeSA6IG1hcC5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICByZXQucHV0KGVudHJ5LmdldFZhbHVlKCksIGVudHJ5LmdldEtleSgpKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgQ29tcG9uZW50Q29tbW9uIGdldENvbXBvbmVudENvbW1vbihTdG9ybVRvcG9sb2d5IHRvcG9sb2d5LCBTdHJpbmcgaWQpIHsKLSAgICAgICAgaWYodG9wb2xvZ3kuZ2V0X3Nwb3V0cygpLmNvbnRhaW5zS2V5KGlkKSkgeworICAgICAgICBpZiAodG9wb2xvZ3kuZ2V0X3Nwb3V0cygpLmNvbnRhaW5zS2V5KGlkKSkgewogICAgICAgICAgICAgcmV0dXJuIHRvcG9sb2d5LmdldF9zcG91dHMoKS5nZXQoaWQpLmdldF9jb21tb24oKTsKICAgICAgICAgfQotICAgICAgICBpZih0b3BvbG9neS5nZXRfYm9sdHMoKS5jb250YWluc0tleShpZCkpIHsKKyAgICAgICAgaWYgKHRvcG9sb2d5LmdldF9ib2x0cygpLmNvbnRhaW5zS2V5KGlkKSkgewogICAgICAgICAgICAgcmV0dXJuIHRvcG9sb2d5LmdldF9ib2x0cygpLmdldChpZCkuZ2V0X2NvbW1vbigpOwogICAgICAgICB9Ci0gICAgICAgIGlmKHRvcG9sb2d5LmdldF9zdGF0ZV9zcG91dHMoKS5jb250YWluc0tleShpZCkpIHsKKyAgICAgICAgaWYgKHRvcG9sb2d5LmdldF9zdGF0ZV9zcG91dHMoKS5jb250YWluc0tleShpZCkpIHsKICAgICAgICAgICAgIHJldHVybiB0b3BvbG9neS5nZXRfc3RhdGVfc3BvdXRzKCkuZ2V0KGlkKS5nZXRfY29tbW9uKCk7CiAgICAgICAgIH0KICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ291bGQgbm90IGZpbmQgY29tcG9uZW50IHdpdGggaWQgIiArIGlkKTsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIEludGVnZXIgZ2V0SW50KE9iamVjdCBvKSB7Ci0gICAgICBJbnRlZ2VyIHJlc3VsdCA9IGdldEludChvLCBudWxsKTsKLSAgICAgIGlmIChudWxsID09IHJlc3VsdCkgewotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJEb24ndCBrbm93IGhvdyB0byBjb252ZXJ0IG51bGwgdG8gaW50Iik7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICBJbnRlZ2VyIHJlc3VsdCA9IGdldEludChvLCBudWxsKTsKKyAgICAgICAgaWYgKG51bGwgPT0gcmVzdWx0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJEb24ndCBrbm93IGhvdyB0byBjb252ZXJ0IG51bGwgdG8gaW50Iik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIEludGVnZXIgZ2V0SW50KE9iamVjdCBvLCBJbnRlZ2VyIGRlZmF1bHRWYWx1ZSkgewotICAgICAgaWYgKG51bGwgPT0gbykgewotICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOwotICAgICAgfQorICAgICAgICBpZiAobnVsbCA9PSBvKSB7CisgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOworICAgICAgICB9CiAKLSAgICAgIGlmIChvIGluc3RhbmNlb2YgSW50ZWdlciB8fAotICAgICAgICAgIG8gaW5zdGFuY2VvZiBTaG9ydCB8fAotICAgICAgICAgIG8gaW5zdGFuY2VvZiBCeXRlKSB7Ci0gICAgICAgICAgcmV0dXJuICgoTnVtYmVyKSBvKS5pbnRWYWx1ZSgpOwotICAgICAgfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgTG9uZykgewotICAgICAgICAgIGZpbmFsIGxvbmcgbCA9IChMb25nKSBvOwotICAgICAgICAgIGlmIChsIDw9IEludGVnZXIuTUFYX1ZBTFVFICYmIGwgPj0gSW50ZWdlci5NSU5fVkFMVUUpIHsKLSAgICAgICAgICAgICAgcmV0dXJuIChpbnQpIGw7Ci0gICAgICAgICAgfQotICAgICAgfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQoKFN0cmluZykgbyk7Ci0gICAgICB9CisgICAgICAgIGlmIChvIGluc3RhbmNlb2YgSW50ZWdlciB8fAorICAgICAgICAgICAgICAgIG8gaW5zdGFuY2VvZiBTaG9ydCB8fAorICAgICAgICAgICAgICAgIG8gaW5zdGFuY2VvZiBCeXRlKSB7CisgICAgICAgICAgICByZXR1cm4gKChOdW1iZXIpIG8pLmludFZhbHVlKCk7CisgICAgICAgIH0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIExvbmcpIHsKKyAgICAgICAgICAgIGZpbmFsIGxvbmcgbCA9IChMb25nKSBvOworICAgICAgICAgICAgaWYgKGwgPD0gSW50ZWdlci5NQVhfVkFMVUUgJiYgbCA+PSBJbnRlZ2VyLk1JTl9WQUxVRSkgeworICAgICAgICAgICAgICAgIHJldHVybiAoaW50KSBsOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBTdHJpbmcpIHsKKyAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLnBhcnNlSW50KChTdHJpbmcpIG8pOworICAgICAgICB9CiAKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkRvbid0IGtub3cgaG93IHRvIGNvbnZlcnQgIiArIG8gKyAiIHRvIGludCIpOworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJEb24ndCBrbm93IGhvdyB0byBjb252ZXJ0ICIgKyBvICsgIiB0byBpbnQiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIERvdWJsZSBnZXREb3VibGUoT2JqZWN0IG8pIHsKKyAgICAgICAgRG91YmxlIHJlc3VsdCA9IGdldERvdWJsZShvLCBudWxsKTsKKyAgICAgICAgaWYgKG51bGwgPT0gcmVzdWx0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJEb24ndCBrbm93IGhvdyB0byBjb252ZXJ0IG51bGwgdG8gZG91YmxlIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIERvdWJsZSBnZXREb3VibGUoT2JqZWN0IG8sIERvdWJsZSBkZWZhdWx0VmFsdWUpIHsKKyAgICAgICAgaWYgKG51bGwgPT0gbykgeworICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobyBpbnN0YW5jZW9mIE51bWJlcikgeworICAgICAgICAgICAgcmV0dXJuICgoTnVtYmVyKSBvKS5kb3VibGVWYWx1ZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRG9uJ3Qga25vdyBob3cgdG8gY29udmVydCAiICsgbyArICIgKyB0byBkb3VibGUiKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBnZXRCb29sZWFuKE9iamVjdCBvLCBib29sZWFuIGRlZmF1bHRWYWx1ZSkgewotICAgICAgaWYgKG51bGwgPT0gbykgewotICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOwotICAgICAgfQorICAgICAgICBpZiAobnVsbCA9PSBvKSB7CisgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOworICAgICAgICB9CisgICAgICAgIGlmIChvIGluc3RhbmNlb2YgQm9vbGVhbikgeworICAgICAgICAgICAgcmV0dXJuIChCb29sZWFuKSBvOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRG9uJ3Qga25vdyBob3cgdG8gY29udmVydCAiICsgbyArICIgKyB0byBib29sZWFuIik7CisgICAgICAgIH0KKyAgICB9CiAKLSAgICAgIGlmKG8gaW5zdGFuY2VvZiBCb29sZWFuKSB7Ci0gICAgICAgICAgcmV0dXJuIChCb29sZWFuKSBvOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJEb24ndCBrbm93IGhvdyB0byBjb252ZXJ0ICIgKyBvICsgIiArIHRvIGJvb2xlYW4iKTsKLSAgICAgIH0KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTdHJpbmcoT2JqZWN0IG8sIFN0cmluZyBkZWZhdWx0VmFsdWUpIHsKKyAgICAgICAgaWYgKG51bGwgPT0gbykgeworICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFN0cmluZykgeworICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpIG87CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJEb24ndCBrbm93IGhvdyB0byBjb252ZXJ0ICIgKyBvICsgIiArIHRvIFN0cmluZyIpOworICAgICAgICB9CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBsb25nIHNlY3VyZVJhbmRvbUxvbmcoKSB7CkBAIC00NzcsNyArNTgwLDcgQEAKIAogICAgIHB1YmxpYyBzdGF0aWMgQ3VyYXRvckZyYW1ld29yayBuZXdDdXJhdG9yKE1hcCBjb25mLCBMaXN0PFN0cmluZz4gc2VydmVycywgT2JqZWN0IHBvcnQsIFN0cmluZyByb290LCBab29rZWVwZXJBdXRoSW5mbyBhdXRoKSB7CiAgICAgICAgIExpc3Q8U3RyaW5nPiBzZXJ2ZXJQb3J0cyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBmb3IoU3RyaW5nIHprU2VydmVyOiAoTGlzdDxTdHJpbmc+KSBzZXJ2ZXJzKSB7CisgICAgICAgIGZvciAoU3RyaW5nIHprU2VydmVyIDogKExpc3Q8U3RyaW5nPikgc2VydmVycykgewogICAgICAgICAgICAgc2VydmVyUG9ydHMuYWRkKHprU2VydmVyICsgIjoiICsgVXRpbHMuZ2V0SW50KHBvcnQpKTsKICAgICAgICAgfQogICAgICAgICBTdHJpbmcgemtTdHIgPSBTdHJpbmdVdGlscy5qb2luKHNlcnZlclBvcnRzLCAiLCIpICsgcm9vdDsKQEAgLTQ5MSwxNCArNTk0LDE0IEBACiAgICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHNldHVwQnVpbGRlcihDdXJhdG9yRnJhbWV3b3JrRmFjdG9yeS5CdWlsZGVyIGJ1aWxkZXIsIFN0cmluZyB6a1N0ciwgTWFwIGNvbmYsIFpvb2tlZXBlckF1dGhJbmZvIGF1dGgpCiAgICAgewogICAgICAgICBidWlsZGVyLmNvbm5lY3RTdHJpbmcoemtTdHIpCi0gICAgICAgICAgICAuY29ubmVjdGlvblRpbWVvdXRNcyhVdGlscy5nZXRJbnQoY29uZi5nZXQoQ29uZmlnLlNUT1JNX1pPT0tFRVBFUl9DT05ORUNUSU9OX1RJTUVPVVQpKSkKLSAgICAgICAgICAgIC5zZXNzaW9uVGltZW91dE1zKFV0aWxzLmdldEludChjb25mLmdldChDb25maWcuU1RPUk1fWk9PS0VFUEVSX1NFU1NJT05fVElNRU9VVCkpKQotICAgICAgICAgICAgLnJldHJ5UG9saWN5KG5ldyBTdG9ybUJvdW5kZWRFeHBvbmVudGlhbEJhY2tvZmZSZXRyeSgKKyAgICAgICAgICAgICAgICAuY29ubmVjdGlvblRpbWVvdXRNcyhVdGlscy5nZXRJbnQoY29uZi5nZXQoQ29uZmlnLlNUT1JNX1pPT0tFRVBFUl9DT05ORUNUSU9OX1RJTUVPVVQpKSkKKyAgICAgICAgICAgICAgICAuc2Vzc2lvblRpbWVvdXRNcyhVdGlscy5nZXRJbnQoY29uZi5nZXQoQ29uZmlnLlNUT1JNX1pPT0tFRVBFUl9TRVNTSU9OX1RJTUVPVVQpKSkKKyAgICAgICAgICAgICAgICAucmV0cnlQb2xpY3kobmV3IFN0b3JtQm91bmRlZEV4cG9uZW50aWFsQmFja29mZlJldHJ5KAogICAgICAgICAgICAgICAgICAgICAgICAgVXRpbHMuZ2V0SW50KGNvbmYuZ2V0KENvbmZpZy5TVE9STV9aT09LRUVQRVJfUkVUUllfSU5URVJWQUwpKSwKICAgICAgICAgICAgICAgICAgICAgICAgIFV0aWxzLmdldEludChjb25mLmdldChDb25maWcuU1RPUk1fWk9PS0VFUEVSX1JFVFJZX0lOVEVSVkFMX0NFSUxJTkcpKSwKICAgICAgICAgICAgICAgICAgICAgICAgIFV0aWxzLmdldEludChjb25mLmdldChDb25maWcuU1RPUk1fWk9PS0VFUEVSX1JFVFJZX1RJTUVTKSkpKTsKIAotICAgICAgICBpZihhdXRoIT1udWxsICYmIGF1dGguc2NoZW1lIT1udWxsICYmIGF1dGgucGF5bG9hZCE9bnVsbCkgeworICAgICAgICBpZiAoYXV0aCAhPSBudWxsICYmIGF1dGguc2NoZW1lICE9IG51bGwgJiYgYXV0aC5wYXlsb2FkICE9IG51bGwpIHsKICAgICAgICAgICAgIGJ1aWxkZXIgPSBidWlsZGVyLmF1dGhvcml6YXRpb24oYXV0aC5zY2hlbWUsIGF1dGgucGF5bG9hZCk7CiAgICAgICAgIH0KICAgICB9CkBAIC01MTksMjggKzYyMiwxMyBAQAogICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KIAotICAgIC8qKgotICAgICAqCi0oZGVmbiBpbnRlZ2VyLWRpdmlkZWQgW3N1bSBudW0tcGllY2VzXQotICAobGV0IFtiYXNlIChpbnQgKC8gc3VtIG51bS1waWVjZXMpKQotICAgICAgICBudW0taW5jIChtb2Qgc3VtIG51bS1waWVjZXMpCi0gICAgICAgIG51bS1iYXNlcyAoLSBudW0tcGllY2VzIG51bS1pbmMpXQotICAgIChpZiAoPSBudW0taW5jIDApCi0gICAgICB7YmFzZSBudW0tYmFzZXN9Ci0gICAgICB7YmFzZSBudW0tYmFzZXMgKGluYyBiYXNlKSBudW0taW5jfQotICAgICAgKSkpCi0gICAgICogQHBhcmFtIHN1bQotICAgICAqIEBwYXJhbSBudW1QaWVjZXMKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0KICAgICBwdWJsaWMgc3RhdGljIFRyZWVNYXA8SW50ZWdlciwgSW50ZWdlcj4gaW50ZWdlckRpdmlkZWQoaW50IHN1bSwgaW50IG51bVBpZWNlcykgewogICAgICAgICBpbnQgYmFzZSA9IHN1bSAvIG51bVBpZWNlczsKICAgICAgICAgaW50IG51bUluYyA9IHN1bSAlIG51bVBpZWNlczsKICAgICAgICAgaW50IG51bUJhc2VzID0gbnVtUGllY2VzIC0gbnVtSW5jOwogICAgICAgICBUcmVlTWFwPEludGVnZXIsIEludGVnZXI+IHJldCA9IG5ldyBUcmVlTWFwPEludGVnZXIsIEludGVnZXI+KCk7CiAgICAgICAgIHJldC5wdXQoYmFzZSwgbnVtQmFzZXMpOwotICAgICAgICBpZihudW1JbmMhPTApIHsKKyAgICAgICAgaWYgKG51bUluYyAhPSAwKSB7CiAgICAgICAgICAgICByZXQucHV0KGJhc2UrMSwgbnVtSW5jKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gcmV0OwpAQCAtNTU2LDcgKzY0NCw3IEBACiAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBCdWZmZXJlZFJlYWRlciByID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbikpOwogICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSBudWxsOwotICAgICAgICAgICAgd2hpbGUgKChsaW5lID0gci5yZWFkTGluZSgpKSE9IG51bGwpIHsKKyAgICAgICAgICAgIHdoaWxlICgobGluZSA9IHIucmVhZExpbmUoKSkgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIExPRy5pbmZvKCJ7fTp7fSIsIHByZWZpeCwgbGluZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKQEAgLTU2Niw4ICs2NTQsOCBAQAogCiAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGV4Y2VwdGlvbkNhdXNlSXNJbnN0YW5jZU9mKENsYXNzIGtsYXNzLCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7CiAgICAgICAgIFRocm93YWJsZSB0ID0gdGhyb3dhYmxlOwotICAgICAgICB3aGlsZSh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmKGtsYXNzLmlzSW5zdGFuY2UodCkpIHsKKyAgICAgICAgd2hpbGUgKHQgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGtsYXNzLmlzSW5zdGFuY2UodCkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHQgPSB0LmdldENhdXNlKCk7CkBAIC01ODMsOSArNjcxLDkgQEAKICAgICAgKi8KICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNaa0F1dGhlbnRpY2F0aW9uQ29uZmlndXJlZFN0b3JtU2VydmVyKE1hcCBjb25mKSB7CiAgICAgICAgIHJldHVybiBudWxsICE9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5zZWN1cml0eS5hdXRoLmxvZ2luLmNvbmZpZyIpCi0gICAgICAgICAgICB8fCAoY29uZiAhPSBudWxsCisgICAgICAgICAgICAgICAgfHwgKGNvbmYgIT0gbnVsbAogICAgICAgICAgICAgICAgICYmIGNvbmYuZ2V0KENvbmZpZy5TVE9STV9aT09LRUVQRVJfQVVUSF9TQ0hFTUUpICE9IG51bGwKLSAgICAgICAgICAgICAgICAmJiAhICgoU3RyaW5nKWNvbmYuZ2V0KENvbmZpZy5TVE9STV9aT09LRUVQRVJfQVVUSF9TQ0hFTUUpKS5pc0VtcHR5KCkpOworICAgICAgICAgICAgICAgICYmICEoKFN0cmluZyljb25mLmdldChDb25maWcuU1RPUk1fWk9PS0VFUEVSX0FVVEhfU0NIRU1FKSkuaXNFbXB0eSgpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTU5Niw3ICs2ODQsNyBAQAogICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1prQXV0aGVudGljYXRpb25Db25maWd1cmVkVG9wb2xvZ3koTWFwIGNvbmYpIHsKICAgICAgICAgcmV0dXJuIChjb25mICE9IG51bGwKICAgICAgICAgICAgICAgICAmJiBjb25mLmdldChDb25maWcuU1RPUk1fWk9PS0VFUEVSX1RPUE9MT0dZX0FVVEhfU0NIRU1FKSAhPSBudWxsCi0gICAgICAgICAgICAgICAgJiYgISAoKFN0cmluZyljb25mLmdldChDb25maWcuU1RPUk1fWk9PS0VFUEVSX1RPUE9MT0dZX0FVVEhfU0NIRU1FKSkuaXNFbXB0eSgpKTsKKyAgICAgICAgICAgICAgICAmJiAhKChTdHJpbmcpY29uZi5nZXQoQ29uZmlnLlNUT1JNX1pPT0tFRVBFUl9UT1BPTE9HWV9BVVRIX1NDSEVNRSkpLmlzRW1wdHkoKSk7CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBMaXN0PEFDTD4gZ2V0V29ya2VyQUNMKE1hcCBjb25mKSB7CkBAIC02MDYsMzcgKzY5NCwzNyBAQAogICAgICAgICB9CiAgICAgICAgIFN0cmluZyBzdG9ybVpLVXNlciA9IChTdHJpbmcpY29uZi5nZXQoQ29uZmlnLlNUT1JNX1pPT0tFRVBFUl9TVVBFUkFDTCk7CiAgICAgICAgIGlmIChzdG9ybVpLVXNlciA9PSBudWxsKSB7Ci0gICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkF1dGhlbnRpY2F0aW9uIGlzIGVuYWJsZWQgYnV0ICIrQ29uZmlnLlNUT1JNX1pPT0tFRVBFUl9TVVBFUkFDTCsiIGlzIG5vdCBzZXQiKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkF1dGhlbnRpY2F0aW9uIGlzIGVuYWJsZWQgYnV0ICIrQ29uZmlnLlNUT1JNX1pPT0tFRVBFUl9TVVBFUkFDTCsiIGlzIG5vdCBzZXQiKTsKICAgICAgICAgfQogICAgICAgICBTdHJpbmdbXSBzcGxpdCA9IHN0b3JtWktVc2VyLnNwbGl0KCI6IiwyKTsKICAgICAgICAgaWYgKHNwbGl0Lmxlbmd0aCAhPSAyKSB7Ci0gICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihDb25maWcuU1RPUk1fWk9PS0VFUEVSX1NVUEVSQUNMKyIgZG9lcyBub3QgYXBwZWFyIHRvIGJlIGluIHRoZSBmb3JtIHNjaGVtZTphY2wsIGkuZS4gc2FzbDpzdG9ybS11c2VyIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKENvbmZpZy5TVE9STV9aT09LRUVQRVJfU1VQRVJBQ0wrIiBkb2VzIG5vdCBhcHBlYXIgdG8gYmUgaW4gdGhlIGZvcm0gc2NoZW1lOmFjbCwgaS5lLiBzYXNsOnN0b3JtLXVzZXIiKTsKICAgICAgICAgfQogICAgICAgICBBcnJheUxpc3Q8QUNMPiByZXQgPSBuZXcgQXJyYXlMaXN0PEFDTD4oWm9vRGVmcy5JZHMuQ1JFQVRPUl9BTExfQUNMKTsKICAgICAgICAgcmV0LmFkZChuZXcgQUNMKFpvb0RlZnMuUGVybXMuQUxMLCBuZXcgSWQoc3BsaXRbMF0sIHNwbGl0WzFdKSkpOwogICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KIAotICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdGhyZWFkRHVtcCgpIHsKLSAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGR1bXAgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgIGZpbmFsIGphdmEubGFuZy5tYW5hZ2VtZW50LlRocmVhZE1YQmVhbiB0aHJlYWRNWEJlYW4gPSAgamF2YS5sYW5nLm1hbmFnZW1lbnQuTWFuYWdlbWVudEZhY3RvcnkuZ2V0VGhyZWFkTVhCZWFuKCk7Ci0gICAgICAgZmluYWwgamF2YS5sYW5nLm1hbmFnZW1lbnQuVGhyZWFkSW5mb1tdIHRocmVhZEluZm9zID0gdGhyZWFkTVhCZWFuLmdldFRocmVhZEluZm8odGhyZWFkTVhCZWFuLmdldEFsbFRocmVhZElkcygpLCAxMDApOwotICAgICAgIGZvciAoamF2YS5sYW5nLm1hbmFnZW1lbnQuVGhyZWFkSW5mbyB0aHJlYWRJbmZvIDogdGhyZWFkSW5mb3MpIHsKLSAgICAgICAgICAgZHVtcC5hcHBlbmQoJyInKTsKLSAgICAgICAgICAgZHVtcC5hcHBlbmQodGhyZWFkSW5mby5nZXRUaHJlYWROYW1lKCkpOwotICAgICAgICAgICBkdW1wLmFwcGVuZCgiXCIgIik7Ci0gICAgICAgICAgIGZpbmFsIFRocmVhZC5TdGF0ZSBzdGF0ZSA9IHRocmVhZEluZm8uZ2V0VGhyZWFkU3RhdGUoKTsKLSAgICAgICAgICAgZHVtcC5hcHBlbmQoIlxuICAgamF2YS5sYW5nLlRocmVhZC5TdGF0ZTogIik7Ci0gICAgICAgICAgIGR1bXAuYXBwZW5kKHN0YXRlKTsKLSAgICAgICAgICAgZmluYWwgU3RhY2tUcmFjZUVsZW1lbnRbXSBzdGFja1RyYWNlRWxlbWVudHMgPSB0aHJlYWRJbmZvLmdldFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgZm9yIChmaW5hbCBTdGFja1RyYWNlRWxlbWVudCBzdGFja1RyYWNlRWxlbWVudCA6IHN0YWNrVHJhY2VFbGVtZW50cykgewotICAgICAgICAgICAgICAgZHVtcC5hcHBlbmQoIlxuICAgICAgICBhdCAiKTsKLSAgICAgICAgICAgICAgIGR1bXAuYXBwZW5kKHN0YWNrVHJhY2VFbGVtZW50KTsKLSAgICAgICAgICAgfQotICAgICAgICAgICBkdW1wLmFwcGVuZCgiXG5cbiIpOwotICAgICAgIH0KLSAgICAgICByZXR1cm4gZHVtcC50b1N0cmluZygpOwotICAgfQorICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHRocmVhZER1bXAoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgZHVtcCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGZpbmFsIGphdmEubGFuZy5tYW5hZ2VtZW50LlRocmVhZE1YQmVhbiB0aHJlYWRNWEJlYW4gPSAgamF2YS5sYW5nLm1hbmFnZW1lbnQuTWFuYWdlbWVudEZhY3RvcnkuZ2V0VGhyZWFkTVhCZWFuKCk7CisgICAgICAgIGZpbmFsIGphdmEubGFuZy5tYW5hZ2VtZW50LlRocmVhZEluZm9bXSB0aHJlYWRJbmZvcyA9IHRocmVhZE1YQmVhbi5nZXRUaHJlYWRJbmZvKHRocmVhZE1YQmVhbi5nZXRBbGxUaHJlYWRJZHMoKSwgMTAwKTsKKyAgICAgICAgZm9yIChqYXZhLmxhbmcubWFuYWdlbWVudC5UaHJlYWRJbmZvIHRocmVhZEluZm8gOiB0aHJlYWRJbmZvcykgeworICAgICAgICAgICAgZHVtcC5hcHBlbmQoJyInKTsKKyAgICAgICAgICAgIGR1bXAuYXBwZW5kKHRocmVhZEluZm8uZ2V0VGhyZWFkTmFtZSgpKTsKKyAgICAgICAgICAgIGR1bXAuYXBwZW5kKCJcIiAiKTsKKyAgICAgICAgICAgIGZpbmFsIFRocmVhZC5TdGF0ZSBzdGF0ZSA9IHRocmVhZEluZm8uZ2V0VGhyZWFkU3RhdGUoKTsKKyAgICAgICAgICAgIGR1bXAuYXBwZW5kKCJcbiAgIGphdmEubGFuZy5UaHJlYWQuU3RhdGU6ICIpOworICAgICAgICAgICAgZHVtcC5hcHBlbmQoc3RhdGUpOworICAgICAgICAgICAgZmluYWwgU3RhY2tUcmFjZUVsZW1lbnRbXSBzdGFja1RyYWNlRWxlbWVudHMgPSB0aHJlYWRJbmZvLmdldFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIGZvciAoZmluYWwgU3RhY2tUcmFjZUVsZW1lbnQgc3RhY2tUcmFjZUVsZW1lbnQgOiBzdGFja1RyYWNlRWxlbWVudHMpIHsKKyAgICAgICAgICAgICAgICBkdW1wLmFwcGVuZCgiXG4gICAgICAgIGF0ICIpOworICAgICAgICAgICAgICAgIGR1bXAuYXBwZW5kKHN0YWNrVHJhY2VFbGVtZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGR1bXAuYXBwZW5kKCJcblxuIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGR1bXAudG9TdHJpbmcoKTsKKyAgICB9CiAKICAgICAvLyBBc3N1bWVzIGNhbGxlciBpcyBzeW5jaHJvbml6aW5nCiAgICAgcHJpdmF0ZSBzdGF0aWMgU2VyaWFsaXphdGlvbkRlbGVnYXRlIGdldFNlcmlhbGl6YXRpb25EZWxlZ2F0ZShNYXAgc3Rvcm1Db25mKSB7CkBAIC02NTksMzAgKzc0NywxMzMgQEAKICAgICAgICAgcmV0dXJuIGRlbGVnYXRlOwogICAgIH0KIAotICBwdWJsaWMgc3RhdGljIHZvaWQgaGFuZGxlVW5jYXVnaHRFeGNlcHRpb24oVGhyb3dhYmxlIHQpIHsKLSAgICBpZiAodCAhPSBudWxsICYmIHQgaW5zdGFuY2VvZiBFcnJvcikgewotICAgICAgaWYgKHQgaW5zdGFuY2VvZiBPdXRPZk1lbW9yeUVycm9yKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJIYWx0aW5nIGR1ZSB0byBPdXQgT2YgTWVtb3J5IEVycm9yLi4uIiArIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGVycikgewotICAgICAgICAgIC8vQWdhaW4gd2UgZG9uJ3Qgd2FudCB0byBleGl0IGJlY2F1c2Ugb2YgbG9nZ2luZyBpc3N1ZXMuCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGhhbmRsZVVuY2F1Z2h0RXhjZXB0aW9uKFRocm93YWJsZSB0KSB7CisgICAgICAgIGlmICh0ICE9IG51bGwgJiYgdCBpbnN0YW5jZW9mIEVycm9yKSB7CisgICAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIE91dE9mTWVtb3J5RXJyb3IpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkhhbHRpbmcgZHVlIHRvIE91dCBPZiBNZW1vcnkgRXJyb3IuLi4iICsgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlcnIpIHsKKyAgICAgICAgICAgICAgICAgICAgLy9BZ2FpbiB3ZSBkb24ndCB3YW50IHRvIGV4aXQgYmVjYXVzZSBvZiBsb2dnaW5nIGlzc3Vlcy4KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgUnVudGltZS5nZXRSdW50aW1lKCkuaGFsdCgtMSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vUnVubmluZyBpbiBkYWVtb24gbW9kZSwgd2Ugd291bGQgcGFzcyBFcnJvciB0byBjYWxsaW5nIHRocmVhZC4KKyAgICAgICAgICAgICAgICB0aHJvdyAoRXJyb3IpIHQ7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgUnVudGltZS5nZXRSdW50aW1lKCkuaGFsdCgtMSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvL1J1bm5pbmcgaW4gZGFlbW9uIG1vZGUsIHdlIHdvdWxkIHBhc3MgRXJyb3IgdG8gY2FsbGluZyB0aHJlYWQuCi0gICAgICAgIHRocm93IChFcnJvcikgdDsKLSAgICAgIH0KICAgICB9Ci0gIH0KIAotICBAVmlzaWJsZUZvclRlc3RpbmcKLSAgcHVibGljIHN0YXRpYyB2b2lkIHNldENsYXNzTG9hZGVyRm9ySmF2YURlU2VyaWFsaXplKENsYXNzTG9hZGVyIGNsKSB7Ci0gICAgVXRpbHMuY2wgPSBjbDsKLSAgfQorICAgIC8qKgorICAgICAqIEdpdmVuIGEgRmlsZSBpbnB1dCBpdCB3aWxsIHVuemlwIHRoZSBmaWxlIGluIGEgdGhlIHVuemlwIGRpcmVjdG9yeQorICAgICAqIHBhc3NlZCBhcyB0aGUgc2Vjb25kIHBhcmFtZXRlcgorICAgICAqIEBwYXJhbSBpbkZpbGUgVGhlIHppcCBmaWxlIGFzIGlucHV0CisgICAgICogQHBhcmFtIHVuemlwRGlyIFRoZSB1bnppcCBkaXJlY3Rvcnkgd2hlcmUgdG8gdW56aXAgdGhlIHppcCBmaWxlLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdW5aaXAoRmlsZSBpbkZpbGUsIEZpbGUgdW56aXBEaXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEVudW1lcmF0aW9uPD8gZXh0ZW5kcyBaaXBFbnRyeT4gZW50cmllczsKKyAgICAgICAgWmlwRmlsZSB6aXBGaWxlID0gbmV3IFppcEZpbGUoaW5GaWxlKTsKIAotICBAVmlzaWJsZUZvclRlc3RpbmcKLSAgcHVibGljIHN0YXRpYyB2b2lkIHJlc2V0Q2xhc3NMb2FkZXJGb3JKYXZhRGVTZXJpYWxpemUoKSB7Ci0gICAgVXRpbHMuY2wgPSBDbGFzc0xvYWRlci5nZXRTeXN0ZW1DbGFzc0xvYWRlcigpOwotICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlbnRyaWVzID0gemlwRmlsZS5lbnRyaWVzKCk7CisgICAgICAgICAgICB3aGlsZSAoZW50cmllcy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIFppcEVudHJ5IGVudHJ5ID0gZW50cmllcy5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgIGlmICghZW50cnkuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IHppcEZpbGUuZ2V0SW5wdXRTdHJlYW0oZW50cnkpOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUodW56aXBEaXIsIGVudHJ5LmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZpbGUuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWxlLmdldFBhcmVudEZpbGUoKS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiTWtkaXJzIGZhaWxlZCB0byBjcmVhdGUgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZS5nZXRQYXJlbnRGaWxlKCkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGZpbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbODE5Ml07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChpID0gaW4ucmVhZChidWZmZXIpKSAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoYnVmZmVyLCAwLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dC5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW4uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHppcEZpbGUuY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdpdmVuIGEgemlwIEZpbGUgaW5wdXQgaXQgd2lsbCByZXR1cm4gaXRzIHNpemUKKyAgICAgKiBPbmx5IHdvcmtzIGZvciB6aXAgZmlsZXMgd2hvc2UgdW5jb21wcmVzc2VkIHNpemUgaXMgbGVzcyB0aGFuIDQgR0IsCisgICAgICogb3RoZXJ3aXNlIHJldHVybnMgdGhlIHNpemUgbW9kdWxlIDJeMzIsIHBlciBnemlwIHNwZWNpZmljYXRpb25zCisgICAgICogQHBhcmFtIG15RmlsZSBUaGUgemlwIGZpbGUgYXMgaW5wdXQKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogQHJldHVybiB6aXAgZmlsZSBzaXplIGFzIGEgbG9uZworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgbG9uZyB6aXBGaWxlU2l6ZShGaWxlIG15RmlsZSkgdGhyb3dzIElPRXhjZXB0aW9ueworICAgICAgICBSYW5kb21BY2Nlc3NGaWxlIHJhZiA9IG5ldyBSYW5kb21BY2Nlc3NGaWxlKG15RmlsZSwgInIiKTsKKyAgICAgICAgcmFmLnNlZWsocmFmLmxlbmd0aCgpIC0gNCk7CisgICAgICAgIGxvbmcgYjQgPSByYWYucmVhZCgpOworICAgICAgICBsb25nIGIzID0gcmFmLnJlYWQoKTsKKyAgICAgICAgbG9uZyBiMiA9IHJhZi5yZWFkKCk7CisgICAgICAgIGxvbmcgYjEgPSByYWYucmVhZCgpOworICAgICAgICBsb25nIHZhbCA9IChiMSA8PCAyNCkgfCAoYjIgPDwgMTYpICsgKGIzIDw8IDgpICsgYjQ7CisgICAgICAgIHJhZi5jbG9zZSgpOworICAgICAgICByZXR1cm4gdmFsOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZG91YmxlIHplcm9JZk5hTk9ySW5mKGRvdWJsZSB4KSB7CisgICAgICAgIHJldHVybiAoRG91YmxlLmlzTmFOKHgpIHx8IERvdWJsZS5pc0luZmluaXRlKHgpKSA/IDAuMCA6IHg7CisgICAgfQorCisgICAgLyoqCisgICAgICogcGFyc2VzIHRoZSBhcmd1bWVudHMgdG8gZXh0cmFjdCBqdm0gaGVhcCBtZW1vcnkgc2l6ZSBpbiBNQi4KKyAgICAgKiBAcGFyYW0gaW5wdXQKKyAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIEpWTSBoZWFwIG1lbW9yeSBzZXR0aW5nIChpbiBNQikgaW4gYSBqYXZhIGNvbW1hbmQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBEb3VibGUgcGFyc2VKdm1IZWFwTWVtQnlDaGlsZE9wdHMoU3RyaW5nIGlucHV0LCBEb3VibGUgZGVmYXVsdFZhbHVlKSB7CisgICAgICAgIGlmIChpbnB1dCAhPSBudWxsKSB7CisgICAgICAgICAgICBQYXR0ZXJuIG9wdHNQYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKCJYbXhbMC05XStbbWtnTUtHXSIpOworICAgICAgICAgICAgTWF0Y2hlciBtID0gb3B0c1BhdHRlcm4ubWF0Y2hlcihpbnB1dCk7CisgICAgICAgICAgICBTdHJpbmcgbWVtb3J5T3B0cyA9IG51bGw7CisgICAgICAgICAgICB3aGlsZSAobS5maW5kKCkpIHsKKyAgICAgICAgICAgICAgICBtZW1vcnlPcHRzID0gbS5ncm91cCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1lbW9yeU9wdHMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGludCB1bml0ID0gMTsKKyAgICAgICAgICAgICAgICBpZiAobWVtb3J5T3B0cy50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCJrIikpIHsKKyAgICAgICAgICAgICAgICAgICAgdW5pdCA9IDEwMjQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtZW1vcnlPcHRzLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoIm0iKSkgeworICAgICAgICAgICAgICAgICAgICB1bml0ID0gMTAyNCAqIDEwMjQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtZW1vcnlPcHRzLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgoImciKSkgeworICAgICAgICAgICAgICAgICAgICB1bml0ID0gMTAyNCAqIDEwMjQgKiAxMDI0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtZW1vcnlPcHRzID0gbWVtb3J5T3B0cy5yZXBsYWNlQWxsKCJbYS16QS1aXSIsICIiKTsKKyAgICAgICAgICAgICAgICBEb3VibGUgcmVzdWx0ID0gIERvdWJsZS5wYXJzZURvdWJsZShtZW1vcnlPcHRzKSAqIHVuaXQgLyAxMDI0LjAgLyAxMDI0LjA7CisgICAgICAgICAgICAgICAgcmV0dXJuIChyZXN1bHQgPCAxLjApID8gMS4wIDogcmVzdWx0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDbGFzc0xvYWRlckZvckphdmFEZVNlcmlhbGl6ZShDbGFzc0xvYWRlciBjbCkgeworICAgICAgICBVdGlscy5jbCA9IGNsOworICAgIH0KKworICAgIEBWaXNpYmxlRm9yVGVzdGluZworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXNldENsYXNzTG9hZGVyRm9ySmF2YURlU2VyaWFsaXplKCkgeworICAgICAgICBVdGlscy5jbCA9IENsYXNzTG9hZGVyLmdldFN5c3RlbUNsYXNzTG9hZGVyKCk7CisgICAgfQogfQogCmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vdXRpbHMvVmVyc2lvbkluZm8uamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS91dGlscy9WZXJzaW9uSW5mby5qYXZhCmluZGV4IDE3NDBlMTguLmYzNTg2YmIgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS91dGlscy9WZXJzaW9uSW5mby5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS91dGlscy9WZXJzaW9uSW5mby5qYXZhCkBAIC04Niw3ICs4Niw3IEBACiAgIH0KIAogCi0gIHByaXZhdGUgc3RhdGljIFZlcnNpb25JbmZvIENPTU1PTl9WRVJTSU9OX0lORk8gPSBuZXcgVmVyc2lvbkluZm8oInN0b3JtLWNvcmUiKTsKKyAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVmVyc2lvbkluZm8gQ09NTU9OX1ZFUlNJT05fSU5GTyA9IG5ldyBWZXJzaW9uSW5mbygic3Rvcm0tY29yZSIpOwogCiAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldFZlcnNpb24oKSB7CiAgICAgcmV0dXJuIENPTU1PTl9WRVJTSU9OX0lORk8uX2dldFZlcnNpb24oKTsKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS92YWxpZGF0aW9uL0NvbmZpZ1ZhbGlkYXRpb24uamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS92YWxpZGF0aW9uL0NvbmZpZ1ZhbGlkYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGVjOTY3Ci0tLSAvZGV2L251bGwKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3ZhbGlkYXRpb24vQ29uZmlnVmFsaWRhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjQ2IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGJhY2t0eXBlLnN0b3JtLnZhbGlkYXRpb247CisKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogUHJvdmlkZXMgZnVuY3Rpb25hbGl0eSBmb3IgdmFsaWRhdGluZyBjb25maWd1cmF0aW9uIGZpZWxkcy4KKyAqLworcHVibGljIGNsYXNzIENvbmZpZ1ZhbGlkYXRpb24geworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3MgQ09ORklHX0NMQVNTID0gYmFja3R5cGUuc3Rvcm0uQ29uZmlnLmNsYXNzOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKENvbmZpZ1ZhbGlkYXRpb24uY2xhc3MpOworCisgICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBWYWxpZGF0b3IgeworICAgICAgICBwdWJsaWMgVmFsaWRhdG9yKE1hcDxTdHJpbmcsIE9iamVjdD4gcGFyYW1zKSB7fQorICAgICAgICBwdWJsaWMgVmFsaWRhdG9yKCkge30KKyAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgdmFsaWRhdGVGaWVsZChTdHJpbmcgbmFtZSwgT2JqZWN0IG8pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZhbGlkYXRvciBkZWZpbml0aW9ucworICAgICAqLworCisgICAgLyoqCisgICAgICogVmFsaWRhdGVzIGlmIGFuIG9iamVjdCBpcyBub3QgbnVsbAorICAgICAqLworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBOb3ROdWxsVmFsaWRhdG9yIGV4dGVuZHMgVmFsaWRhdG9yIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdmFsaWRhdGVGaWVsZChTdHJpbmcgbmFtZSwgT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIGlmIChvID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJGaWVsZCAiICsgbmFtZSArICJjYW5ub3QgYmUgbnVsbCEgQWN0dWFsIHZhbHVlOiAiICsgbyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWYWxpZGF0ZXMgYmFzaWMgdHlwZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNpbXBsZVR5cGVWYWxpZGF0b3IgZXh0ZW5kcyBWYWxpZGF0b3IgeworCisgICAgICAgIHByaXZhdGUgQ2xhc3MgdHlwZTsKKworICAgICAgICBwdWJsaWMgU2ltcGxlVHlwZVZhbGlkYXRvcihNYXA8U3RyaW5nLCBPYmplY3Q+IHBhcmFtcykgeworICAgICAgICAgICAgdGhpcy50eXBlID0gKENsYXNzKSBwYXJhbXMuZ2V0KENvbmZpZ1ZhbGlkYXRpb25Bbm5vdGF0aW9ucy5WYWxpZGF0b3JQYXJhbXMuVFlQRSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdmFsaWRhdGVGaWVsZChTdHJpbmcgbmFtZSwgT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIHZhbGlkYXRlRmllbGQobmFtZSwgdGhpcy50eXBlLCBvKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZUZpZWxkKFN0cmluZyBuYW1lLCBDbGFzcyB0eXBlLCBPYmplY3QgbykgeworICAgICAgICAgICAgaWYgKG8gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0eXBlLmlzSW5zdGFuY2UobykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJGaWVsZCAiICsgbmFtZSArICIgbXVzdCBiZSBvZiB0eXBlICIgKyB0eXBlICsgIi4gT2JqZWN0OiAiICsgbyArICIgYWN0dWFsIHR5cGU6ICIgKyBvLmdldENsYXNzKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdHJpbmdWYWxpZGF0b3IgZXh0ZW5kcyBWYWxpZGF0b3IgeworCisgICAgICAgIHByaXZhdGUgSGFzaFNldDxTdHJpbmc+IGFjY2VwdGVkVmFsdWVzID0gbnVsbDsKKworICAgICAgICBwdWJsaWMgU3RyaW5nVmFsaWRhdG9yKCl7fQorCisgICAgICAgIHB1YmxpYyBTdHJpbmdWYWxpZGF0b3IoTWFwPFN0cmluZywgT2JqZWN0PiBwYXJhbXMpIHsKKworICAgICAgICAgICAgdGhpcy5hY2NlcHRlZFZhbHVlcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oQXJyYXlzLmFzTGlzdCgoU3RyaW5nW10pcGFyYW1zLmdldChDb25maWdWYWxpZGF0aW9uQW5ub3RhdGlvbnMuVmFsaWRhdG9yUGFyYW1zLkFDQ0VQVEVEX1ZBTFVFUykpKTsKKworICAgICAgICAgICAgaWYodGhpcy5hY2NlcHRlZFZhbHVlcy5pc0VtcHR5KCkgfHwgKHRoaXMuYWNjZXB0ZWRWYWx1ZXMuc2l6ZSgpID09IDEgJiYgdGhpcy5hY2NlcHRlZFZhbHVlcy5jb250YWlucygiIikpKSB7CisgICAgICAgICAgICAgICAgdGhpcy5hY2NlcHRlZFZhbHVlcyA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdmFsaWRhdGVGaWVsZChTdHJpbmcgbmFtZSwgT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIFNpbXBsZVR5cGVWYWxpZGF0b3IudmFsaWRhdGVGaWVsZChuYW1lLCBTdHJpbmcuY2xhc3MsIG8pOworICAgICAgICAgICAgaWYodGhpcy5hY2NlcHRlZFZhbHVlcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmFjY2VwdGVkVmFsdWVzLmNvbnRhaW5zKChTdHJpbmcpIG8pKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkZpZWxkICIgKyBuYW1lICsgIiBpcyBub3QgYW4gYWNjZXB0ZWQgdmFsdWUuIFZhbHVlOiAiICsgbyArICIgQWNjZXB0ZWQgdmFsdWVzOiAiICsgdGhpcy5hY2NlcHRlZFZhbHVlcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCb29sZWFuVmFsaWRhdG9yIGV4dGVuZHMgVmFsaWRhdG9yIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdmFsaWRhdGVGaWVsZChTdHJpbmcgbmFtZSwgT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIFNpbXBsZVR5cGVWYWxpZGF0b3IudmFsaWRhdGVGaWVsZChuYW1lLCBCb29sZWFuLmNsYXNzLCBvKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTnVtYmVyVmFsaWRhdG9yIGV4dGVuZHMgVmFsaWRhdG9yIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdmFsaWRhdGVGaWVsZChTdHJpbmcgbmFtZSwgT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIFNpbXBsZVR5cGVWYWxpZGF0b3IudmFsaWRhdGVGaWVsZChuYW1lLCBOdW1iZXIuY2xhc3MsIG8pOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBEb3VibGVWYWxpZGF0b3IgZXh0ZW5kcyBWYWxpZGF0b3IgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZUZpZWxkKFN0cmluZyBuYW1lLCBPYmplY3QgbykgeworICAgICAgICAgICAgU2ltcGxlVHlwZVZhbGlkYXRvci52YWxpZGF0ZUZpZWxkKG5hbWUsIERvdWJsZS5jbGFzcywgbyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWYWxpZGF0ZXMgYSBJbnRlZ2VyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW50ZWdlclZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRvciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlRmllbGQoU3RyaW5nIG5hbWUsIE9iamVjdCBvKSB7CisgICAgICAgICAgICB2YWxpZGF0ZUludGVnZXIobmFtZSwgbyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZUludGVnZXIoU3RyaW5nIG5hbWUsIE9iamVjdCBvKSB7CisgICAgICAgICAgICBpZiAobyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgbG9uZyBpOworICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBOdW1iZXIgJiYKKyAgICAgICAgICAgICAgICAgICAgKGkgPSAoKE51bWJlcikgbykubG9uZ1ZhbHVlKCkpID09ICgoTnVtYmVyKSBvKS5kb3VibGVWYWx1ZSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGkgPD0gSW50ZWdlci5NQVhfVkFMVUUgJiYgaSA+PSBJbnRlZ2VyLk1JTl9WQUxVRSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRmllbGQgIiArIG5hbWUgKyAiIG11c3QgYmUgYW4gSW50ZWdlciB3aXRoaW4gdHlwZSByYW5nZS4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFZhbGlkYXRlcyBhbiBlbnRyeSBmb3IgSW1wZXJzb25hdGlvbkFjbFVzZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEltcGVyc29uYXRpb25BY2xVc2VyRW50cnlWYWxpZGF0b3IgZXh0ZW5kcyBWYWxpZGF0b3IgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZUZpZWxkKFN0cmluZyBuYW1lLCBPYmplY3QgbykgeworICAgICAgICAgICAgaWYgKG8gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENvbmZpZ1ZhbGlkYXRpb25VdGlscy5OZXN0YWJsZUZpZWxkVmFsaWRhdG9yIHZhbGlkYXRvciA9IENvbmZpZ1ZhbGlkYXRpb25VdGlscy5tYXBGdihDb25maWdWYWxpZGF0aW9uVXRpbHMuZnYoU3RyaW5nLmNsYXNzLCBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgIENvbmZpZ1ZhbGlkYXRpb25VdGlscy5saXN0RnYoU3RyaW5nLmNsYXNzLCBmYWxzZSksIGZhbHNlKTsKKyAgICAgICAgICAgIHZhbGlkYXRvci52YWxpZGF0ZUZpZWxkKG5hbWUsIG8pOworICAgICAgICAgICAgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBtYXBPYmplY3QgPSAoTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PikgbzsKKyAgICAgICAgICAgIGlmICghbWFwT2JqZWN0LmNvbnRhaW5zS2V5KCJob3N0cyIpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihuYW1lICsgIiBzaG91bGQgY29udGFpbiBNYXAgZW50cnkgd2l0aCBrZXk6IGhvc3RzIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIW1hcE9iamVjdC5jb250YWluc0tleSgiZ3JvdXBzIikpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKG5hbWUgKyAiIHNob3VsZCBjb250YWluIE1hcCBlbnRyeSB3aXRoIGtleTogZ3JvdXBzIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB2YWxpZGF0ZXMgYSBsaXN0IG9mIGhhcyBubyBkdXBsaWNhdGVzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBOb0R1cGxpY2F0ZUluTGlzdFZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRvciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlRmllbGQoU3RyaW5nIG5hbWUsIE9iamVjdCBmaWVsZCkgeworICAgICAgICAgICAgaWYgKGZpZWxkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvL2NoZWNrIGlmIGl0ZXJhYmxlCisgICAgICAgICAgICBTaW1wbGVUeXBlVmFsaWRhdG9yLnZhbGlkYXRlRmllbGQobmFtZSwgSXRlcmFibGUuY2xhc3MsIGZpZWxkKTsKKyAgICAgICAgICAgIEhhc2hTZXQ8T2JqZWN0PiBvYmplY3RTZXQgPSBuZXcgSGFzaFNldDxPYmplY3Q+KCk7CisgICAgICAgICAgICBmb3IgKE9iamVjdCBvIDogKEl0ZXJhYmxlKSBmaWVsZCkgeworICAgICAgICAgICAgICAgIGlmIChvYmplY3RTZXQuY29udGFpbnMobykpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihuYW1lICsgIiBzaG91bGQgY29udGFpbiBubyBkdXBsaWNhdGUgZWxlbWVudHMuIER1cGxpY2F0ZWQgZWxlbWVudDogIiArIG8pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvYmplY3RTZXQuYWRkKG8pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVmFsaWRhdGVzIGEgU3RyaW5nIG9yIGEgbGlzdCBvZiBTdHJpbmdzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdHJpbmdPclN0cmluZ0xpc3RWYWxpZGF0b3IgZXh0ZW5kcyBWYWxpZGF0b3IgeworCisgICAgICAgIHByaXZhdGUgQ29uZmlnVmFsaWRhdGlvblV0aWxzLkZpZWxkVmFsaWRhdG9yIGZ2ID0gQ29uZmlnVmFsaWRhdGlvblV0aWxzLmxpc3RGdihTdHJpbmcuY2xhc3MsIGZhbHNlKTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdmFsaWRhdGVGaWVsZChTdHJpbmcgbmFtZSwgT2JqZWN0IG8pIHsKKworICAgICAgICAgICAgaWYgKG8gPT0gbnVsbCB8fCBvIGluc3RhbmNlb2YgU3RyaW5nKSB7CisgICAgICAgICAgICAgICAgLy8gQSBudWxsIHZhbHVlIG9yIGEgU3RyaW5nIHZhbHVlIGlzIGFjY2VwdGFibGUKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aGlzLmZ2LnZhbGlkYXRlRmllbGQobmFtZSwgbyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWYWxpZGF0ZXMgS3J5byBSZWdpc3RyYXRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEtyeW9SZWdWYWxpZGF0b3IgZXh0ZW5kcyBWYWxpZGF0b3IgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZUZpZWxkKFN0cmluZyBuYW1lLCBPYmplY3QgbykgeworICAgICAgICAgICAgaWYgKG8gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgSXRlcmFibGUpIHsKKyAgICAgICAgICAgICAgICBmb3IgKE9iamVjdCBlIDogKEl0ZXJhYmxlKSBvKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgTWFwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxPYmplY3QsIE9iamVjdD4gZW50cnkgOiAoKE1hcDxPYmplY3QsIE9iamVjdD4pIGUpLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIShlbnRyeS5nZXRLZXkoKSBpbnN0YW5jZW9mIFN0cmluZykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICEoZW50cnkuZ2V0VmFsdWUoKSBpbnN0YW5jZW9mIFN0cmluZykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRWFjaCBlbGVtZW50IG9mIHRoZSBsaXN0ICIgKyBuYW1lICsgIiBtdXN0IGJlIGEgU3RyaW5nIG9yIGEgTWFwIG9mIFN0cmluZ3MiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIShlIGluc3RhbmNlb2YgU3RyaW5nKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVhY2ggZWxlbWVudCBvZiB0aGUgbGlzdCAiICsgbmFtZSArICIgbXVzdCBiZSBhIFN0cmluZyBvciBhIE1hcCBvZiBTdHJpbmdzIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIkZpZWxkICIgKyBuYW1lICsgIiBtdXN0IGJlIGFuIEl0ZXJhYmxlIGNvbnRhaW5pbmcgb25seSBTdHJpbmdzIG9yIE1hcHMgb2YgU3RyaW5ncyIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVmFsaWRhdGVzIGlmIGEgbnVtYmVyIGlzIGEgcG93ZXIgb2YgMgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUG93ZXJPZjJWYWxpZGF0b3IgZXh0ZW5kcyBWYWxpZGF0b3IgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZUZpZWxkKFN0cmluZyBuYW1lLCBPYmplY3QgbykgeworICAgICAgICAgICAgaWYgKG8gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIGxvbmcgaTsKKyAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgTnVtYmVyICYmCisgICAgICAgICAgICAgICAgICAgIChpID0gKChOdW1iZXIpIG8pLmxvbmdWYWx1ZSgpKSA9PSAoKE51bWJlcikgbykuZG91YmxlVmFsdWUoKSkgeworICAgICAgICAgICAgICAgIC8vIFRlc3Qgd2hldGhlciB0aGUgaW50ZWdlciBpcyBhIHBvd2VyIG9mIDIuCisgICAgICAgICAgICAgICAgaWYgKGkgPiAwICYmIChpICYgKGkgLSAxKSkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRmllbGQgIiArIG5hbWUgKyAiIG11c3QgYmUgYSBwb3dlciBvZiAyLiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVmFsaWRhdGVzIGVhY2ggZW50cnkgaW4gYSBsaXN0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBMaXN0RW50cnlUeXBlVmFsaWRhdG9yIGV4dGVuZHMgVmFsaWRhdG9yIHsKKworICAgICAgICBwcml2YXRlIENsYXNzIHR5cGU7CisKKyAgICAgICAgcHVibGljIExpc3RFbnRyeVR5cGVWYWxpZGF0b3IoTWFwPFN0cmluZywgT2JqZWN0PiBwYXJhbXMpIHsKKyAgICAgICAgICAgIHRoaXMudHlwZSA9IChDbGFzcykgcGFyYW1zLmdldChDb25maWdWYWxpZGF0aW9uQW5ub3RhdGlvbnMuVmFsaWRhdG9yUGFyYW1zLlRZUEUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlRmllbGQoU3RyaW5nIG5hbWUsIE9iamVjdCBvKSB7CisgICAgICAgICAgICB2YWxpZGF0ZUZpZWxkKG5hbWUsIHRoaXMudHlwZSwgbyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVGaWVsZChTdHJpbmcgbmFtZSwgQ2xhc3MgdHlwZSwgT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIENvbmZpZ1ZhbGlkYXRpb25VdGlscy5OZXN0YWJsZUZpZWxkVmFsaWRhdG9yIHZhbGlkYXRvciA9IENvbmZpZ1ZhbGlkYXRpb25VdGlscy5saXN0RnYodHlwZSwgZmFsc2UpOworICAgICAgICAgICAgdmFsaWRhdG9yLnZhbGlkYXRlRmllbGQobmFtZSwgbyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWYWxpZGF0ZXMgZWFjaCBlbnRyeSBpbiBhIGxpc3QgYWdhaW5zdCBhIGxpc3Qgb2YgY3VzdG9tIFZhbGlkYXRvcnMKKyAgICAgKiBFYWNoIHZhbGlkYXRvciBpbiB0aGUgbGlzdCBvZiB2YWxpZGF0b3JzIG11c3QgaW5oZXJpdCBvciBiZSBhbiBpbnN0YW5jZSBvZiBWYWxpZGF0b3IgY2xhc3MKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIExpc3RFbnRyeUN1c3RvbVZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRvcnsKKworICAgICAgICBwcml2YXRlIENsYXNzW10gZW50cnlWYWxpZGF0b3JzOworCisgICAgICAgIHB1YmxpYyBMaXN0RW50cnlDdXN0b21WYWxpZGF0b3IoTWFwPFN0cmluZywgT2JqZWN0PiBwYXJhbXMpIHsKKyAgICAgICAgICAgIHRoaXMuZW50cnlWYWxpZGF0b3JzID0gKENsYXNzW10pIHBhcmFtcy5nZXQoQ29uZmlnVmFsaWRhdGlvbkFubm90YXRpb25zLlZhbGlkYXRvclBhcmFtcy5FTlRSWV9WQUxJREFUT1JfQ0xBU1NFUyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdmFsaWRhdGVGaWVsZChTdHJpbmcgbmFtZSwgT2JqZWN0IG8pICB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHZhbGlkYXRlRmllbGQobmFtZSwgdGhpcy5lbnRyeVZhbGlkYXRvcnMsIG8pOworICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB8IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gfCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZUZpZWxkKFN0cmluZyBuYW1lLCBDbGFzc1tdIHZhbGlkYXRvcnMsIE9iamVjdCBvKSB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChvID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvL2NoZWNrIGlmIGl0ZXJhYmxlCisgICAgICAgICAgICBTaW1wbGVUeXBlVmFsaWRhdG9yLnZhbGlkYXRlRmllbGQobmFtZSwgSXRlcmFibGUuY2xhc3MsIG8pOworICAgICAgICAgICAgZm9yIChPYmplY3QgZW50cnkgOiAoSXRlcmFibGUpIG8pIHsKKyAgICAgICAgICAgICAgICBmb3IgKENsYXNzIHZhbGlkYXRvciA6IHZhbGlkYXRvcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHYgPSB2YWxpZGF0b3IuZ2V0Q29uc3RydWN0b3IoKS5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAodiBpbnN0YW5jZW9mIFZhbGlkYXRvcikgeworICAgICAgICAgICAgICAgICAgICAgICAgKChWYWxpZGF0b3IpIHYpLnZhbGlkYXRlRmllbGQobmFtZSArICIgbGlzdCBlbnRyeSIsIGVudHJ5KTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPRy53YXJuKCJ2YWxpZGF0b3I6IHt9IGNhbm5vdCBiZSB1c2VkIGluIExpc3RFbnRyeUN1c3RvbVZhbGlkYXRvci4gIEluZGl2aWR1YWwgZW50cnkgdmFsaWRhdG9ycyBtdXN0IGEgaW5zdGFuY2Ugb2YgVmFsaWRhdG9yIGNsYXNzIiwgdmFsaWRhdG9yLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB2YWxpZGF0ZXMgZWFjaCBrZXkgYW5kIHZhbHVlIGluIGEgbWFwIG9mIGEgY2VydGFpbiB0eXBlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNYXBFbnRyeVR5cGVWYWxpZGF0b3IgZXh0ZW5kcyBWYWxpZGF0b3J7CisKKyAgICAgICAgcHJpdmF0ZSBDbGFzcyBrZXlUeXBlOworICAgICAgICBwcml2YXRlIENsYXNzIHZhbHVlVHlwZTsKKworICAgICAgICBwdWJsaWMgTWFwRW50cnlUeXBlVmFsaWRhdG9yKE1hcDxTdHJpbmcsIE9iamVjdD4gcGFyYW1zKSB7CisgICAgICAgICAgICB0aGlzLmtleVR5cGUgPSAoQ2xhc3MpIHBhcmFtcy5nZXQoQ29uZmlnVmFsaWRhdGlvbkFubm90YXRpb25zLlZhbGlkYXRvclBhcmFtcy5LRVlfVFlQRSk7CisgICAgICAgICAgICB0aGlzLnZhbHVlVHlwZSA9IChDbGFzcykgcGFyYW1zLmdldChDb25maWdWYWxpZGF0aW9uQW5ub3RhdGlvbnMuVmFsaWRhdG9yUGFyYW1zLlZBTFVFX1RZUEUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlRmllbGQoU3RyaW5nIG5hbWUsIE9iamVjdCBvKSB7CisgICAgICAgICAgICB2YWxpZGF0ZUZpZWxkKG5hbWUsIHRoaXMua2V5VHlwZSwgdGhpcy52YWx1ZVR5cGUsIG8pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlRmllbGQoU3RyaW5nIG5hbWUsIENsYXNzIGtleVR5cGUsIENsYXNzIHZhbHVlVHlwZSwgT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIENvbmZpZ1ZhbGlkYXRpb25VdGlscy5OZXN0YWJsZUZpZWxkVmFsaWRhdG9yIHZhbGlkYXRvciA9IENvbmZpZ1ZhbGlkYXRpb25VdGlscy5tYXBGdihrZXlUeXBlLCB2YWx1ZVR5cGUsIGZhbHNlKTsKKyAgICAgICAgICAgIHZhbGlkYXRvci52YWxpZGF0ZUZpZWxkKG5hbWUsIG8pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogdmFsaWRhdGVzIGVhY2gga2V5IGFuZCBlYWNoIHZhbHVlIGFnYWluc3QgdGhlIHJlc3BlY3RpdmUgYXJyYXlzIG9mIHZhbGlkYXRvcnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1hcEVudHJ5Q3VzdG9tVmFsaWRhdG9yIGV4dGVuZHMgVmFsaWRhdG9yeworCisgICAgICAgIHByaXZhdGUgQ2xhc3NbXSBrZXlWYWxpZGF0b3JzOworICAgICAgICBwcml2YXRlIENsYXNzW10gdmFsdWVWYWxpZGF0b3JzOworCisgICAgICAgIHB1YmxpYyBNYXBFbnRyeUN1c3RvbVZhbGlkYXRvcihNYXA8U3RyaW5nLCBPYmplY3Q+IHBhcmFtcykgeworICAgICAgICAgICAgdGhpcy5rZXlWYWxpZGF0b3JzID0gKENsYXNzIFtdKSBwYXJhbXMuZ2V0KENvbmZpZ1ZhbGlkYXRpb25Bbm5vdGF0aW9ucy5WYWxpZGF0b3JQYXJhbXMuS0VZX1ZBTElEQVRPUl9DTEFTU0VTKTsKKyAgICAgICAgICAgIHRoaXMudmFsdWVWYWxpZGF0b3JzID0gKENsYXNzIFtdKSBwYXJhbXMuZ2V0KENvbmZpZ1ZhbGlkYXRpb25Bbm5vdGF0aW9ucy5WYWxpZGF0b3JQYXJhbXMuVkFMVUVfVkFMSURBVE9SX0NMQVNTRVMpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlRmllbGQoU3RyaW5nIG5hbWUsIE9iamVjdCBvKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHZhbGlkYXRlRmllbGQobmFtZSwgdGhpcy5rZXlWYWxpZGF0b3JzLCB0aGlzLnZhbHVlVmFsaWRhdG9ycywgbyk7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB8IE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB8IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlRmllbGQoU3RyaW5nIG5hbWUsIENsYXNzW10ga2V5VmFsaWRhdG9ycywgQ2xhc3NbXSB2YWx1ZVZhbGlkYXRvcnMsIE9iamVjdCBvKSB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChvID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvL2NoZWNrIGlmIE1hcAorICAgICAgICAgICAgU2ltcGxlVHlwZVZhbGlkYXRvci52YWxpZGF0ZUZpZWxkKG5hbWUsIE1hcC5jbGFzcywgbyk7CisgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxPYmplY3QsIE9iamVjdD4gZW50cnkgOiAoKE1hcDxPYmplY3QsIE9iamVjdD4pIG8pLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBmb3IgKENsYXNzIGt2IDoga2V5VmFsaWRhdG9ycykgeworICAgICAgICAgICAgICAgICAgICBPYmplY3Qga2V5VmFsaWRhdG9yID0ga3YuZ2V0Q29uc3RydWN0b3IoKS5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoa2V5VmFsaWRhdG9yIGluc3RhbmNlb2YgVmFsaWRhdG9yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAoKFZhbGlkYXRvcikga2V5VmFsaWRhdG9yKS52YWxpZGF0ZUZpZWxkKG5hbWUgKyAiIE1hcCBrZXkiLCBlbnRyeS5nZXRLZXkoKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0cud2FybigidmFsaWRhdG9yOiB7fSBjYW5ub3QgYmUgdXNlZCBpbiBNYXBFbnRyeUN1c3RvbVZhbGlkYXRvciB0byB2YWxpZGF0ZSBrZXlzLiAgSW5kaXZpZHVhbCBlbnRyeSB2YWxpZGF0b3JzIG11c3QgYSBpbnN0YW5jZSBvZiBWYWxpZGF0b3IgY2xhc3MiLCBrdi5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoQ2xhc3MgdnYgOiB2YWx1ZVZhbGlkYXRvcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlVmFsaWRhdG9yID0gdnYuZ2V0Q29uc3RydWN0b3IoKS5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVWYWxpZGF0b3IgaW5zdGFuY2VvZiBWYWxpZGF0b3IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICgoVmFsaWRhdG9yKSB2YWx1ZVZhbGlkYXRvcikudmFsaWRhdGVGaWVsZChuYW1lICsgIiBNYXAgdmFsdWUiLCBlbnRyeS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPRy53YXJuKCJ2YWxpZGF0b3I6IHt9IGNhbm5vdCBiZSB1c2VkIGluIE1hcEVudHJ5Q3VzdG9tVmFsaWRhdG9yIHRvIHZhbGlkYXRlIHZhbHVlcy4gIEluZGl2aWR1YWwgZW50cnkgdmFsaWRhdG9ycyBtdXN0IGEgaW5zdGFuY2Ugb2YgVmFsaWRhdG9yIGNsYXNzIiwgdnYuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFZhbGlkYXRlcyBhIHBvc2l0aXZlIG51bWJlcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUG9zaXRpdmVOdW1iZXJWYWxpZGF0b3IgZXh0ZW5kcyBWYWxpZGF0b3J7CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGluY2x1ZGVaZXJvOworCisgICAgICAgIHB1YmxpYyBQb3NpdGl2ZU51bWJlclZhbGlkYXRvcigpIHsKKyAgICAgICAgICAgIHRoaXMuaW5jbHVkZVplcm8gPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBQb3NpdGl2ZU51bWJlclZhbGlkYXRvcihNYXA8U3RyaW5nLCBPYmplY3Q+IHBhcmFtcykgeworICAgICAgICAgICAgdGhpcy5pbmNsdWRlWmVybyA9IChib29sZWFuKSBwYXJhbXMuZ2V0KENvbmZpZ1ZhbGlkYXRpb25Bbm5vdGF0aW9ucy5WYWxpZGF0b3JQYXJhbXMuSU5DTFVERV9aRVJPKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZUZpZWxkKFN0cmluZyBuYW1lLCBPYmplY3QgbykgeworICAgICAgICAgICAgdmFsaWRhdGVGaWVsZChuYW1lLCB0aGlzLmluY2x1ZGVaZXJvLCBvKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZUZpZWxkKFN0cmluZyBuYW1lLCBib29sZWFuIGluY2x1ZGVaZXJvLCBPYmplY3QgbykgeworICAgICAgICAgICAgaWYgKG8gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgTnVtYmVyKSB7CisgICAgICAgICAgICAgICAgaWYoaW5jbHVkZVplcm8pIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCgoTnVtYmVyKSBvKS5kb3VibGVWYWx1ZSgpID49IDAuMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCgoTnVtYmVyKSBvKS5kb3VibGVWYWx1ZSgpID4gMC4wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJGaWVsZCAiICsgbmFtZSArICIgbXVzdCBiZSBhIFBvc2l0aXZlIE51bWJlciIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNZXRyaWNSZWdpc3RyeVZhbGlkYXRvciBleHRlbmRzIFZhbGlkYXRvciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlRmllbGQoU3RyaW5nIG5hbWUsIE9iamVjdCBvKSB7CisgICAgICAgICAgICBpZihvID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTaW1wbGVUeXBlVmFsaWRhdG9yLnZhbGlkYXRlRmllbGQobmFtZSwgTWFwLmNsYXNzLCBvKTsKKyAgICAgICAgICAgIGlmKCEoKE1hcCkgbykuY29udGFpbnNLZXkoImNsYXNzIikgKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIkZpZWxkICIgKyBuYW1lICsgIiBtdXN0IGhhdmUgbWFwIGVudHJ5IHdpdGgga2V5OiBjbGFzcyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoISgoTWFwKSBvKS5jb250YWluc0tleSgicGFyYWxsZWxpc20uaGludCIpICkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkZpZWxkICIgKyBuYW1lICsgIiBtdXN0IGhhdmUgbWFwIGVudHJ5IHdpdGgga2V5OiBwYXJhbGxlbGlzbS5oaW50Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNpbXBsZVR5cGVWYWxpZGF0b3IudmFsaWRhdGVGaWVsZChuYW1lLCBTdHJpbmcuY2xhc3MsICgoTWFwKSBvKS5nZXQoImNsYXNzIikpOworICAgICAgICAgICAgU2ltcGxlVHlwZVZhbGlkYXRvci52YWxpZGF0ZUZpZWxkKG5hbWUsIExvbmcuY2xhc3MsICgoTWFwKSBvKS5nZXQoInBhcmFsbGVsaXNtLmhpbnQiKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBhY2VtYWtlckF1dGhUeXBlVmFsaWRhdG9yIGV4dGVuZHMgVmFsaWRhdG9yIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdmFsaWRhdGVGaWVsZChTdHJpbmcgbmFtZSwgT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIGlmKG8gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJGaWVsZCAiICsgbmFtZSArICIgbXVzdCBiZSBzZXQuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKG8gaW5zdGFuY2VvZiBTdHJpbmcgJiYKKyAgICAgICAgICAgICAgICgoKFN0cmluZylvKS5lcXVhbHMoIk5PTkUiKSB8fAorICAgICAgICAgICAgICAgICgoU3RyaW5nKW8pLmVxdWFscygiRElHRVNUIikgfHwKKyAgICAgICAgICAgICAgICAoKFN0cmluZylvKS5lcXVhbHMoIktFUkJFUk9TIikpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIkZpZWxkICIgKyBuYW1lICsgIiBtdXN0IGJlIG9uZSBvZiBcIk5PTkVcIiwgXCJESUdFU1RcIiwgb3IgXCJLRVJCRVJPU1wiIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNZXRob2RzIGZvciB2YWxpZGF0aW5nIGNvbmZzCisgICAgICovCisKKyAgICAvKioKKyAgICAgKiBWYWxpZGF0ZXMgYSBmaWVsZCBnaXZlbiBmaWVsZCBuYW1lIGFzIHN0cmluZyB1c2VzIENvbmZpZy5qYXZhIGFzIHRoZSBkZWZhdWx0IGNvbmZpZyBjbGFzcworICAgICAqCisgICAgICogQHBhcmFtIGZpZWxkTmFtZSBwcm92aWRlZCBhcyBhIHN0cmluZworICAgICAqIEBwYXJhbSBjb25mICAgICAgbWFwIG9mIGNvbmZzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlRmllbGQoU3RyaW5nIGZpZWxkTmFtZSwgTWFwIGNvbmYpIHsKKyAgICAgICAgdmFsaWRhdGVGaWVsZChmaWVsZE5hbWUsIGNvbmYsIENPTkZJR19DTEFTUyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVmFsaWRhdGVzIGEgZmllbGQgZ2l2ZW4gZmllbGQgbmFtZSBhcyBzdHJpbmcKKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWVsZE5hbWUgICBwcm92aWRlZCBhcyBhIHN0cmluZworICAgICAqIEBwYXJhbSBjb25mICAgICAgICBtYXAgb2YgY29uZnMKKyAgICAgKiBAcGFyYW0gY29uZmlnQ2xhc3MgY29uZmlnIGNsYXNzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlRmllbGQoU3RyaW5nIGZpZWxkTmFtZSwgTWFwIGNvbmYsIENsYXNzIGNvbmZpZ0NsYXNzKSB7CisgICAgICAgIEZpZWxkIGZpZWxkID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpZWxkID0gY29uZmlnQ2xhc3MuZ2V0RmllbGQoZmllbGROYW1lKTsKKyAgICAgICAgfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICAgICAgdmFsaWRhdGVGaWVsZChmaWVsZCwgY29uZik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVmFsaWRhdGVzIGEgZmllbGQgZ2l2ZW4gZmllbGQuICBDYWxscyBjb3JyZWN0IFZhbGlkYXRvckZpZWxkIG1ldGhvZCBiYXNlZCBvbiB3aGljaCBmaWVsZHMgYXJlCisgICAgICogZGVjbGFyZWQgZm9yIHRoZSBjb3JyZXNwb25kaW5nIGFubm90YXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmllbGQgZmllbGQgdGhhdCBuZWVkcyB0byBiZSB2YWxpZGF0ZWQKKyAgICAgKiBAcGFyYW0gY29uZiAgbWFwIG9mIGNvbmZzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHZhbGlkYXRlRmllbGQoRmllbGQgZmllbGQsIE1hcCBjb25mKSB7CisgICAgICAgIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucyA9IGZpZWxkLmdldEFubm90YXRpb25zKCk7CisgICAgICAgIGlmIChhbm5vdGF0aW9ucy5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgTE9HLndhcm4oIkZpZWxkIHt9IGRvZXMgbm90IGhhdmUgdmFsaWRhdG9yIGFubm90YXRpb24iLCBmaWVsZCk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZvciAoQW5ub3RhdGlvbiBhbm5vdGF0aW9uIDogYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdHlwZSA9IGFubm90YXRpb24uYW5ub3RhdGlvblR5cGUoKS5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgQ2xhc3MgdmFsaWRhdG9yQ2xhc3MgPSBudWxsOworICAgICAgICAgICAgICAgIENsYXNzPD8+W10gY2xhc3NlcyA9IENvbmZpZ1ZhbGlkYXRpb25Bbm5vdGF0aW9ucy5jbGFzcy5nZXREZWNsYXJlZENsYXNzZXMoKTsKKyAgICAgICAgICAgICAgICAvL2NoZWNrIGlmIGFubm90YXRpb24gaXMgb25lIG9mIG91cgorICAgICAgICAgICAgICAgIGZvciAoQ2xhc3MgY2xhenogOiBjbGFzc2VzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGF6ei5nZXROYW1lKCkuZXF1YWxzKHR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3JDbGFzcyA9IGNsYXp6OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRvckNsYXNzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHYgPSB2YWxpZGF0b3JDbGFzcy5jYXN0KGFubm90YXRpb24pOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcga2V5ID0gKFN0cmluZykgZmllbGQuZ2V0KG51bGwpOworICAgICAgICAgICAgICAgICAgICBDbGFzcyBjbGF6eiA9IChDbGFzcykgdmFsaWRhdG9yQ2xhc3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TWV0aG9kKENvbmZpZ1ZhbGlkYXRpb25Bbm5vdGF0aW9ucy5WYWxpZGF0b3JQYXJhbXMuVkFMSURBVE9SX0NMQVNTKS5pbnZva2Uodik7CisgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRvciBvID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwYXJhbXMgPSBnZXRQYXJhbXNGcm9tQW5ub3RhdGlvbih2YWxpZGF0b3JDbGFzcywgdik7CisgICAgICAgICAgICAgICAgICAgIC8vdHdvIGNvbnN0cnVjdG9yIHNpZ25hdHVyZXMgdXNlZCB0byBpbml0aWFsaXplIHZhbGlkYXRvcnMuCisgICAgICAgICAgICAgICAgICAgIC8vT25lIGNvbnN0cnVjdG9yIHRha2VzIGlucHV0IGEgTWFwIG9mIGFyZ3VtZW50cywgdGhlIG90aGVyIGRvZXNuJ3QgdGFrZSBhbnkgYXJndW1lbnRzIChkZWZhdWx0IGNvbnN0cnVjdG9yKQorICAgICAgICAgICAgICAgICAgICAvL0lmIHZhbGlkYXRvciBoYXMgYSBjb25zdHJ1Y3RvciB0aGF0IHRha2VzIGEgTWFwIGFzIGFuIGFyZ3VtZW50IGNhbGwgdGhhdCBjb25zdHJ1Y3RvcgorICAgICAgICAgICAgICAgICAgICBpZiAoaGFzQ29uc3RydWN0b3IoY2xhenosIE1hcC5jbGFzcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG8gPSAoVmFsaWRhdG9yKSBjbGF6ei5nZXRDb25zdHJ1Y3RvcihNYXAuY2xhc3MpLm5ld0luc3RhbmNlKHBhcmFtcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy9JZiBub3QgY2FsbCBkZWZhdWx0IGNvbnN0cnVjdG9yCisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbyA9ICgoKENsYXNzPFZhbGlkYXRvcj4pIGNsYXp6KS5uZXdJbnN0YW5jZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBvLnZhbGlkYXRlRmllbGQoZmllbGQuZ2V0TmFtZSgpLCBjb25mLmdldChrZXkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gIGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gfCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB8IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWYWxpZGF0ZSBhbGwgY29uZnMgaW4gbWFwCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29uZiBtYXAgb2YgY29uZmlncworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZUZpZWxkcyhNYXAgY29uZikgeworICAgICAgICB2YWxpZGF0ZUZpZWxkcyhjb25mLCBDT05GSUdfQ0xBU1MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZhbGlkYXRlIGFsbCBjb25mcyBpbiBtYXAKKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25mICAgICAgICBtYXAgb2YgY29uZmlncworICAgICAqIEBwYXJhbSBjb25maWdDbGFzcyBjb25maWcgY2xhc3MKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVGaWVsZHMoTWFwIGNvbmYsIENsYXNzIGNvbmZpZ0NsYXNzKSB7CisgICAgICAgIGZvciAoRmllbGQgZmllbGQgOiBjb25maWdDbGFzcy5nZXRGaWVsZHMoKSkgeworICAgICAgICAgICAgT2JqZWN0IGtleU9iaiA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGtleU9iaiA9IGZpZWxkLmdldChudWxsKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy9tYWtlIHN1cmUgdGhhdCBkZWZpbmVkIGtleSBpcyBzdHJpbmcgaW4gY2FzZSB3cm9uZyBzdHVmZiBnb3QgcHV0IGludG8gQ29uZmlnLmphdmEKKyAgICAgICAgICAgIGlmIChrZXlPYmogaW5zdGFuY2VvZiBTdHJpbmcpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgY29uZktleSA9IChTdHJpbmcpIGtleU9iajsKKyAgICAgICAgICAgICAgICBpZiAoY29uZi5jb250YWluc0tleShjb25mS2V5KSkgeworICAgICAgICAgICAgICAgICAgICB2YWxpZGF0ZUZpZWxkKGZpZWxkLCBjb25mKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLE9iamVjdD4gZ2V0UGFyYW1zRnJvbUFubm90YXRpb24oQ2xhc3MgdmFsaWRhdG9yQ2xhc3MsIE9iamVjdCB2KSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7CisgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcGFyYW1zID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisgICAgICAgIGZvcihNZXRob2QgbWV0aG9kIDogdmFsaWRhdG9yQ2xhc3MuZ2V0RGVjbGFyZWRNZXRob2RzKCkpIHsKKworICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSAoT2JqZWN0KSBtZXRob2QuaW52b2tlKHYpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHBhcmFtcy5wdXQobWV0aG9kLmdldE5hbWUoKSwgdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBwYXJhbXM7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBoYXNDb25zdHJ1Y3RvcihDbGFzcyBjbGF6eiwgQ2xhc3MgcGFyYW1DbGFzcykgeworICAgICAgICBDbGFzc1tdIGNsYXNzZXMgPSB7cGFyYW1DbGFzc307CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjbGF6ei5nZXRDb25zdHJ1Y3RvcihjbGFzc2VzKTsKKyAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGhhc01ldGhvZChDbGFzcyBjbGF6eiwgU3RyaW5nIG1ldGhvZCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2xhenouZ2V0TWV0aG9kKG1ldGhvZCk7CisgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS92YWxpZGF0aW9uL0NvbmZpZ1ZhbGlkYXRpb25Bbm5vdGF0aW9ucy5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3ZhbGlkYXRpb24vQ29uZmlnVmFsaWRhdGlvbkFubm90YXRpb25zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ5MzM3MAotLS0gL2Rldi9udWxsCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS92YWxpZGF0aW9uL0NvbmZpZ1ZhbGlkYXRpb25Bbm5vdGF0aW9ucy5qYXZhCkBAIC0wLDAgKzEsMjE0IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGJhY2t0eXBlLnN0b3JtLnZhbGlkYXRpb247CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworCisvKioKKyAqIE5vdGU6IGV2ZXJ5IGFubm90YXRpb24gaW50ZXJmYWNlIG11c3QgaGF2ZSBtZXRob2QgdmFsaWRhdG9yQ2xhc3MoKQorICogRm9yIGV2ZXJ5IGFubm90YXRpb24gdGhlcmUgbXVzdCB2YWxpZGF0b3IgY2xhc3MgdG8gZG8gdGhlIHZhbGlkYXRpb24KKyAqIFRvIGFkZCBhbm90aGVyIGFubm90YXRpb24gZm9yIGNvbmZpZyB2YWxpZGF0aW9uLCBhZGQgYW5vdGhlciBhbm5vdGF0aW9uIEBpbnRlcmZhY2UgY2xhc3MuICBJbXBsZW1lbnQgdGhlIGNvcnJlc3BvbmRpbmcKKyAqIHZhbGlkYXRvciBsb2dpYyBpbiBhIGNsYXNzIGluIENvbmZpZ1ZhbGlkYXRpb24uICBNYWtlIHN1cmUgdmFsaWRhdGVGaWVsZCBtZXRob2QgaW4gQ29uZmlnVmFsaWRhdGlvbiBrbm93cyBob3cgdG8gdXNlIHRoZSB2YWxpZGF0b3IKKyAqIGFuZCB3aGljaCBtZXRob2QgZGVmaW5pdGlvbi9wYXJhbWV0ZXJzIHRvIHBhc3MgaW4gYmFzZWQgb24gd2hhdCBmaWVsZHMgYXJlIGluIHRoZSBhbm5vdGF0aW9uLiAgQnkgZGVmYXVsdCwgcGFyYW1zIG9mIGFubm90YXRpb25zCisgKiB3aWxsIGJlIHBhc3NlZCBpbnRvIGEgY29uc3RydWN0b3IgdGhhdCB0YWtlcyBhIE1hcCBhcyBhIHBhcmFtZXRlci4KKyAqLworcHVibGljIGNsYXNzIENvbmZpZ1ZhbGlkYXRpb25Bbm5vdGF0aW9ucyB7CisgICAgLyoqCisgICAgICogRmllbGQgbmFtZXMgZm9yIGFubm90YXRpb25zCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBWYWxpZGF0b3JQYXJhbXMgeworICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRPUl9DTEFTUyA9ICJ2YWxpZGF0b3JDbGFzcyI7CisgICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFlQRSA9ICJ0eXBlIjsKKyAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRSWV9WQUxJREFUT1JfQ0xBU1NFUyA9ICJlbnRyeVZhbGlkYXRvckNsYXNzZXMiOworICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9WQUxJREFUT1JfQ0xBU1NFUyA9ICJrZXlWYWxpZGF0b3JDbGFzc2VzIjsKKyAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRV9WQUxJREFUT1JfQ0xBU1NFUyA9ICJ2YWx1ZVZhbGlkYXRvckNsYXNzZXMiOworICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9UWVBFID0gImtleVR5cGUiOworICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX1RZUEUgPSAidmFsdWVUeXBlIjsKKyAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBJTkNMVURFX1pFUk8gPSAiaW5jbHVkZVplcm8iOworICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEFDQ0VQVEVEX1ZBTFVFUyA9ICJhY2NlcHRlZFZhbHVlcyI7CisgICAgfQorCisgICAgLyoqCisgICAgICogVmFsaWRhdG9ycyB3aXRoIGZpZWxkczogdmFsaWRhdG9yQ2xhc3MgYW5kIHR5cGUKKyAgICAgKi8KKworICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCisgICAgQFRhcmdldChFbGVtZW50VHlwZS5GSUVMRCkKKyAgICBwdWJsaWMgQGludGVyZmFjZSBpc1R5cGUgeworICAgICAgICBDbGFzcyB2YWxpZGF0b3JDbGFzcygpIGRlZmF1bHQgQ29uZmlnVmFsaWRhdGlvbi5TaW1wbGVUeXBlVmFsaWRhdG9yLmNsYXNzOworCisgICAgICAgIENsYXNzIHR5cGUoKTsKKyAgICB9CisKKyAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorICAgIEBUYXJnZXQoRWxlbWVudFR5cGUuRklFTEQpCisgICAgcHVibGljIEBpbnRlcmZhY2UgaXNTdHJpbmdMaXN0IHsKKyAgICAgICAgQ2xhc3MgdmFsaWRhdG9yQ2xhc3MoKSBkZWZhdWx0IENvbmZpZ1ZhbGlkYXRpb24uTGlzdEVudHJ5VHlwZVZhbGlkYXRvci5jbGFzczsKKworICAgICAgICBDbGFzcyB0eXBlKCkgZGVmYXVsdCBTdHJpbmcuY2xhc3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogdmFsaWRhdGVzIGVhY2ggZW50cnkgaW4gYSBsaXN0IGlzIG9mIGEgY2VydGFpbiB0eXBlCisgICAgICovCisgICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKKyAgICBAVGFyZ2V0KEVsZW1lbnRUeXBlLkZJRUxEKQorICAgIHB1YmxpYyBAaW50ZXJmYWNlIGlzTGlzdEVudHJ5VHlwZSB7CisgICAgICAgIENsYXNzIHZhbGlkYXRvckNsYXNzKCkgZGVmYXVsdCBDb25maWdWYWxpZGF0aW9uLkxpc3RFbnRyeVR5cGVWYWxpZGF0b3IuY2xhc3M7CisKKyAgICAgICAgQ2xhc3MgdHlwZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZhbGlkYXRvcnMgd2l0aCBmaWVsZHM6IHZhbGlkYXRvckNsYXNzCisgICAgICovCisKKyAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorICAgIEBUYXJnZXQoRWxlbWVudFR5cGUuRklFTEQpCisgICAgcHVibGljIEBpbnRlcmZhY2UgaXNTdHJpbmcgeworICAgICAgICBDbGFzcyB2YWxpZGF0b3JDbGFzcygpIGRlZmF1bHQgQ29uZmlnVmFsaWRhdGlvbi5TdHJpbmdWYWxpZGF0b3IuY2xhc3M7CisgICAgICAgIFN0cmluZ1tdIGFjY2VwdGVkVmFsdWVzKCkgZGVmYXVsdCAiIjsKKyAgICB9CisKKyAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorICAgIEBUYXJnZXQoRWxlbWVudFR5cGUuRklFTEQpCisgICAgcHVibGljIEBpbnRlcmZhY2UgaXNOdW1iZXIgeworICAgICAgICBDbGFzcyB2YWxpZGF0b3JDbGFzcygpIGRlZmF1bHQgQ29uZmlnVmFsaWRhdGlvbi5OdW1iZXJWYWxpZGF0b3IuY2xhc3M7CisgICAgfQorCisgICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKKyAgICBAVGFyZ2V0KEVsZW1lbnRUeXBlLkZJRUxEKQorICAgIHB1YmxpYyBAaW50ZXJmYWNlIGlzQm9vbGVhbiB7CisgICAgICAgIENsYXNzIHZhbGlkYXRvckNsYXNzKCkgZGVmYXVsdCBDb25maWdWYWxpZGF0aW9uLkJvb2xlYW5WYWxpZGF0b3IuY2xhc3M7CisgICAgfQorCisgICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKKyAgICBAVGFyZ2V0KEVsZW1lbnRUeXBlLkZJRUxEKQorICAgIHB1YmxpYyBAaW50ZXJmYWNlIGlzSW50ZWdlciB7CisgICAgICAgIENsYXNzIHZhbGlkYXRvckNsYXNzKCkgZGVmYXVsdCBDb25maWdWYWxpZGF0aW9uLkludGVnZXJWYWxpZGF0b3IuY2xhc3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogdmFsaWRhdGVzIG9uIG9iamVjdCBpcyBub3QgbnVsbAorICAgICAqLworICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCisgICAgQFRhcmdldChFbGVtZW50VHlwZS5GSUVMRCkKKyAgICBwdWJsaWMgQGludGVyZmFjZSBOb3ROdWxsIHsKKyAgICAgICAgQ2xhc3MgdmFsaWRhdG9yQ2xhc3MoKSBkZWZhdWx0IENvbmZpZ1ZhbGlkYXRpb24uTm90TnVsbFZhbGlkYXRvci5jbGFzczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB2YWxpZGF0ZXMgdGhhdCB0aGVyZSBhcmUgbm8gZHVwbGljYXRlcyBpbiBhIGxpc3QKKyAgICAgKi8KKyAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorICAgIEBUYXJnZXQoRWxlbWVudFR5cGUuRklFTEQpCisgICAgcHVibGljIEBpbnRlcmZhY2UgaXNOb0R1cGxpY2F0ZUluTGlzdCB7CisgICAgICAgIENsYXNzIHZhbGlkYXRvckNsYXNzKCkgZGVmYXVsdCBDb25maWdWYWxpZGF0aW9uLk5vRHVwbGljYXRlSW5MaXN0VmFsaWRhdG9yLmNsYXNzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZhbGlkYXRlcyBlYWNoIGVudHJ5IGluIGEgbGlzdCB3aXRoIGEgbGlzdCBvZiB2YWxpZGF0b3JzCisgICAgICogVmFsaWRhdG9ycyB3aXRoIGZpZWxkczogdmFsaWRhdG9yQ2xhc3MgYW5kIGVudHJ5VmFsaWRhdG9yQ2xhc3MKKyAgICAgKi8KKyAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorICAgIEBUYXJnZXQoRWxlbWVudFR5cGUuRklFTEQpCisgICAgcHVibGljIEBpbnRlcmZhY2UgaXNMaXN0RW50cnlDdXN0b20geworICAgICAgICBDbGFzcyB2YWxpZGF0b3JDbGFzcygpIGRlZmF1bHQgQ29uZmlnVmFsaWRhdGlvbi5MaXN0RW50cnlDdXN0b21WYWxpZGF0b3IuY2xhc3M7CisKKyAgICAgICAgQ2xhc3NbXSBlbnRyeVZhbGlkYXRvckNsYXNzZXMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWYWxpZGF0ZXMgdGhlIHR5cGUgb2YgZWFjaCBrZXkgYW5kIHZhbHVlIGluIGEgbWFwCisgICAgICogVmFsaWRhdG9yIHdpdGggZmllbGRzOiB2YWxpZGF0b3JDbGFzcywga2V5VmFsaWRhdG9yQ2xhc3MsIHZhbHVlVmFsaWRhdG9yQ2xhc3MKKyAgICAgKi8KKworICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCisgICAgQFRhcmdldChFbGVtZW50VHlwZS5GSUVMRCkKKyAgICBwdWJsaWMgQGludGVyZmFjZSBpc01hcEVudHJ5VHlwZSB7CisgICAgICAgIENsYXNzIHZhbGlkYXRvckNsYXNzKCkgZGVmYXVsdCBDb25maWdWYWxpZGF0aW9uLk1hcEVudHJ5VHlwZVZhbGlkYXRvci5jbGFzczsKKworICAgICAgICBDbGFzcyBrZXlUeXBlKCk7CisKKyAgICAgICAgQ2xhc3MgdmFsdWVUeXBlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVmFsaWRhdGVzIGEgZWFjaCBrZXkgYW5kIHZhbHVlIGluIGEgTWFwIHdpdGggYSBsaXN0IG9mIHZhbGlkYXRvcnMKKyAgICAgKiBWYWxpZGF0b3Igd2l0aCBmaWVsZHM6IHZhbGlkYXRvckNsYXNzLCBrZXlWYWxpZGF0b3JDbGFzc2VzLCB2YWx1ZVZhbGlkYXRvckNsYXNzZXMKKyAgICAgKi8KKyAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorICAgIEBUYXJnZXQoRWxlbWVudFR5cGUuRklFTEQpCisgICAgcHVibGljIEBpbnRlcmZhY2UgaXNNYXBFbnRyeUN1c3RvbSB7CisgICAgICAgIENsYXNzIHZhbGlkYXRvckNsYXNzKCkgZGVmYXVsdCBDb25maWdWYWxpZGF0aW9uLk1hcEVudHJ5Q3VzdG9tVmFsaWRhdG9yLmNsYXNzOworCisgICAgICAgIENsYXNzW10ga2V5VmFsaWRhdG9yQ2xhc3NlcygpOworCisgICAgICAgIENsYXNzW10gdmFsdWVWYWxpZGF0b3JDbGFzc2VzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogY2hlY2tzIGlmIGEgbnVtYmVyIGlzIHBvc2l0aXZlIGFuZCB3aGV0aGVyIHplcm8gaW5jbHVzaXZlCisgICAgICogVmFsaWRhdG9yIHdpdGggZmllbGRzOiB2YWxpZGF0b3JDbGFzcywgaW5jbHVkZVplcm8KKyAgICAgKi8KKyAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorICAgIEBUYXJnZXQoRWxlbWVudFR5cGUuRklFTEQpCisgICAgcHVibGljIEBpbnRlcmZhY2UgaXNQb3NpdGl2ZU51bWJlciB7CisgICAgICAgIENsYXNzIHZhbGlkYXRvckNsYXNzKCkgZGVmYXVsdCBDb25maWdWYWxpZGF0aW9uLlBvc2l0aXZlTnVtYmVyVmFsaWRhdG9yLmNsYXNzOworCisgICAgICAgIGJvb2xlYW4gaW5jbHVkZVplcm8oKSBkZWZhdWx0IGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbXBsZXgvY3VzdG9tIHR5cGUgdmFsaWRhdG9ycworICAgICAqLworCisgICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKKyAgICBAVGFyZ2V0KEVsZW1lbnRUeXBlLkZJRUxEKQorICAgIHB1YmxpYyBAaW50ZXJmYWNlIGlzU3RyaW5nT3JTdHJpbmdMaXN0IHsKKyAgICAgICAgQ2xhc3MgdmFsaWRhdG9yQ2xhc3MoKSBkZWZhdWx0IENvbmZpZ1ZhbGlkYXRpb24uU3RyaW5nT3JTdHJpbmdMaXN0VmFsaWRhdG9yLmNsYXNzOworICAgIH0KKworICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCisgICAgQFRhcmdldChFbGVtZW50VHlwZS5GSUVMRCkKKyAgICBwdWJsaWMgQGludGVyZmFjZSBpc0tyeW9SZWcgeworICAgICAgICBDbGFzcyB2YWxpZGF0b3JDbGFzcygpIGRlZmF1bHQgQ29uZmlnVmFsaWRhdGlvbi5LcnlvUmVnVmFsaWRhdG9yLmNsYXNzOworICAgIH0KKworICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCisgICAgQFRhcmdldChFbGVtZW50VHlwZS5GSUVMRCkKKyAgICBwdWJsaWMgQGludGVyZmFjZSBpc1Bvd2VyT2YyIHsKKyAgICAgICAgQ2xhc3MgdmFsaWRhdG9yQ2xhc3MoKSBkZWZhdWx0IENvbmZpZ1ZhbGlkYXRpb24uUG93ZXJPZjJWYWxpZGF0b3IuY2xhc3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogRm9yIGN1c3RvbSB2YWxpZGF0b3JzCisgICAgICovCisKKyAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorICAgIEBUYXJnZXQoRWxlbWVudFR5cGUuRklFTEQpCisgICAgcHVibGljIEBpbnRlcmZhY2UgQ3VzdG9tVmFsaWRhdG9yIHsKKyAgICAgICAgQ2xhc3MgdmFsaWRhdG9yQ2xhc3MoKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS92YWxpZGF0aW9uL0NvbmZpZ1ZhbGlkYXRpb25VdGlscy5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3ZhbGlkYXRpb24vQ29uZmlnVmFsaWRhdGlvblV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU1ZGQ1ZAotLS0gL2Rldi9udWxsCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS92YWxpZGF0aW9uL0NvbmZpZ1ZhbGlkYXRpb25VdGlscy5qYXZhCkBAIC0wLDAgKzEsMTc1IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGJhY2t0eXBlLnN0b3JtLnZhbGlkYXRpb247CisKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworcHVibGljIGNsYXNzIENvbmZpZ1ZhbGlkYXRpb25VdGlscyB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKENvbmZpZ1ZhbGlkYXRpb25VdGlscy5jbGFzcyk7CisKKyAgICAvKioKKyAgICAgKiBEZWNsYXJlcyBtZXRob2RzIGZvciB2YWxpZGF0aW5nIGNvbmZpZ3VyYXRpb24gdmFsdWVzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIEZpZWxkVmFsaWRhdG9yIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFZhbGlkYXRlcyB0aGUgZ2l2ZW4gZmllbGQuCisgICAgICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWVsZC4KKyAgICAgICAgICogQHBhcmFtIGZpZWxkIFRoZSBmaWVsZCB0byBiZSB2YWxpZGF0ZWQuCisgICAgICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBmaWVsZCBmYWlscyB2YWxpZGF0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgdmFsaWRhdGVGaWVsZChTdHJpbmcgbmFtZSwgT2JqZWN0IGZpZWxkKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlY2xhcmVzIGEgbWV0aG9kIGZvciB2YWxpZGF0aW5nIGNvbmZpZ3VyYXRpb24gdmFsdWVzIHRoYXQgaXMgbmVzdGFibGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBOZXN0YWJsZUZpZWxkVmFsaWRhdG9yIGltcGxlbWVudHMgRmllbGRWYWxpZGF0b3IgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdmFsaWRhdGVGaWVsZChTdHJpbmcgbmFtZSwgT2JqZWN0IGZpZWxkKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHZhbGlkYXRlRmllbGQobnVsbCwgbmFtZSwgZmllbGQpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFZhbGlkYXRlcyB0aGUgZ2l2ZW4gZmllbGQuCisgICAgICAgICAqIEBwYXJhbSBwZCBkZXNjcmliZXMgdGhlIHBhcmVudCB3cmFwcGluZyB0aGlzIHZhbGlkYXRvci4KKyAgICAgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpZWxkLgorICAgICAgICAgKiBAcGFyYW0gZmllbGQgVGhlIGZpZWxkIHRvIGJlIHZhbGlkYXRlZC4KKyAgICAgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGZpZWxkIGZhaWxzIHZhbGlkYXRpb24uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB2YWxpZGF0ZUZpZWxkKFN0cmluZyBwZCwgU3RyaW5nIG5hbWUsIE9iamVjdCBmaWVsZCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbmV3IE5lc3RhYmxlRmllbGRWYWxpZGF0b3IgZm9yIGEgZ2l2ZW4gY2xhc3MuCisgICAgICogQHBhcmFtIGNscyB0aGUgQ2xhc3MgdGhlIGZpZWxkIHNob3VsZCBiZSBhIHR5cGUgb2YKKyAgICAgKiBAcGFyYW0gbm90TnVsbCB3aGV0aGVyIG9yIG5vdCBhIHZhbHVlIG9mIG51bGwgaXMgdmFsaWQKKyAgICAgKiBAcmV0dXJuIGEgTmVzdGFibGVGaWVsZFZhbGlkYXRvciBmb3IgdGhhdCBjbGFzcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTmVzdGFibGVGaWVsZFZhbGlkYXRvciBmdihmaW5hbCBDbGFzcyBjbHMsIGZpbmFsIGJvb2xlYW4gbm90TnVsbCkgeworICAgICAgICByZXR1cm4gbmV3IE5lc3RhYmxlRmllbGRWYWxpZGF0b3IoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlRmllbGQoU3RyaW5nIHBkLCBTdHJpbmcgbmFtZSwgT2JqZWN0IGZpZWxkKQorICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBpZiAoZmllbGQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAobm90TnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRmllbGQgIiArIG5hbWUgKyAiIG11c3Qgbm90IGJlIG51bGwiKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIWNscy5pc0luc3RhbmNlKGZpZWxkKSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBkICsgbmFtZSArICIgbXVzdCBiZSBhICIgKyBjbHMuZ2V0TmFtZSgpICsgIi4gKCIgKyBmaWVsZCArICIpIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBuZXcgTmVzdGFibGVGaWVsZFZhbGlkYXRvciBmb3IgYSBMaXN0IG9mIHRoZSBnaXZlbiBDbGFzcy4KKyAgICAgKiBAcGFyYW0gY2xzIHRoZSBDbGFzcyBvZiBlbGVtZW50cyBjb21wb3NpbmcgdGhlIGxpc3QKKyAgICAgKiBAcGFyYW0gbm90TnVsbCB3aGV0aGVyIG9yIG5vdCBhIHZhbHVlIG9mIG51bGwgaXMgdmFsaWQKKyAgICAgKiBAcmV0dXJuIGEgTmVzdGFibGVGaWVsZFZhbGlkYXRvciBmb3IgYSBsaXN0IG9mIHRoZSBnaXZlbiBjbGFzcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTmVzdGFibGVGaWVsZFZhbGlkYXRvciBsaXN0RnYoQ2xhc3MgY2xzLCBib29sZWFuIG5vdE51bGwpIHsKKyAgICAgICAgcmV0dXJuIGxpc3RGdihmdihjbHMsIG5vdE51bGwpLCBub3ROdWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbmV3IE5lc3RhYmxlRmllbGRWYWxpZGF0b3IgZm9yIGEgTGlzdCB3aGVyZSBlYWNoIGl0ZW0gaXMgdmFsaWRhdGVkIGJ5IHZhbGlkYXRvci4KKyAgICAgKiBAcGFyYW0gdmFsaWRhdG9yIHVzZWQgdG8gdmFsaWRhdGUgZWFjaCBpdGVtIGluIHRoZSBsaXN0CisgICAgICogQHBhcmFtIG5vdE51bGwgd2hldGhlciBvciBub3QgYSB2YWx1ZSBvZiBudWxsIGlzIHZhbGlkCisgICAgICogQHJldHVybiBhIE5lc3RhYmxlRmllbGRWYWxpZGF0b3IgZm9yIGEgbGlzdCB3aXRoIGVhY2ggaXRlbSB2YWxpZGF0ZWQgYnkgYSBkaWZmZXJlbnQgdmFsaWRhdG9yLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTmVzdGFibGVGaWVsZFZhbGlkYXRvciBsaXN0RnYoZmluYWwgTmVzdGFibGVGaWVsZFZhbGlkYXRvciB2YWxpZGF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIG5vdE51bGwpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBOZXN0YWJsZUZpZWxkVmFsaWRhdG9yKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZUZpZWxkKFN0cmluZyBwZCwgU3RyaW5nIG5hbWUsIE9iamVjdCBmaWVsZCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgICAgICBpZiAoZmllbGQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAobm90TnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRmllbGQgIiArIG5hbWUgKyAiIG11c3Qgbm90IGJlIG51bGwiKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZmllbGQgaW5zdGFuY2VvZiBJdGVyYWJsZSkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKE9iamVjdCBlIDogKEl0ZXJhYmxlKSBmaWVsZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yLnZhbGlkYXRlRmllbGQocGQgKyAiRWFjaCBlbGVtZW50IG9mIHRoZSBsaXN0ICIsIG5hbWUsIGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJGaWVsZCAiICsgbmFtZSArICIgbXVzdCBiZSBhbiBJdGVyYWJsZSBidXQgd2FzICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGZpZWxkID09IG51bGwpID8gIm51bGwiIDogKCJhICIgKyBmaWVsZC5nZXRDbGFzcygpKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBuZXcgTmVzdGFibGVGaWVsZFZhbGlkYXRvciBmb3IgYSBNYXAgb2Yga2V5IHRvIHZhbC4KKyAgICAgKiBAcGFyYW0ga2V5IHRoZSBDbGFzcyBvZiBrZXlzIGluIHRoZSBtYXAKKyAgICAgKiBAcGFyYW0gdmFsIHRoZSBDbGFzcyBvZiB2YWx1ZXMgaW4gdGhlIG1hcAorICAgICAqIEBwYXJhbSBub3ROdWxsIHdoZXRoZXIgb3Igbm90IGEgdmFsdWUgb2YgbnVsbCBpcyB2YWxpZAorICAgICAqIEByZXR1cm4gYSBOZXN0YWJsZUZpZWxkVmFsaWRhdG9yIGZvciBhIE1hcCBvZiBrZXkgdG8gdmFsCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBOZXN0YWJsZUZpZWxkVmFsaWRhdG9yIG1hcEZ2KENsYXNzIGtleSwgQ2xhc3MgdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG5vdE51bGwpIHsKKyAgICAgICAgcmV0dXJuIG1hcEZ2KGZ2KGtleSwgZmFsc2UpLCBmdih2YWwsIGZhbHNlKSwgbm90TnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIG5ldyBOZXN0YWJsZUZpZWxkVmFsaWRhdG9yIGZvciBhIE1hcC4KKyAgICAgKiBAcGFyYW0ga2V5IGEgdmFsaWRhdG9yIGZvciB0aGUga2V5cyBpbiB0aGUgbWFwCisgICAgICogQHBhcmFtIHZhbCBhIHZhbGlkYXRvciBmb3IgdGhlIHZhbHVlcyBpbiB0aGUgbWFwCisgICAgICogQHBhcmFtIG5vdE51bGwgd2hldGhlciBvciBub3QgYSB2YWx1ZSBvZiBudWxsIGlzIHZhbGlkCisgICAgICogQHJldHVybiBhIE5lc3RhYmxlRmllbGRWYWxpZGF0b3IgZm9yIGEgTWFwCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBOZXN0YWJsZUZpZWxkVmFsaWRhdG9yIG1hcEZ2KGZpbmFsIE5lc3RhYmxlRmllbGRWYWxpZGF0b3Iga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBOZXN0YWJsZUZpZWxkVmFsaWRhdG9yIHZhbCwgZmluYWwgYm9vbGVhbiBub3ROdWxsKSB7CisgICAgICAgIHJldHVybiBuZXcgTmVzdGFibGVGaWVsZFZhbGlkYXRvcigpIHsKKyAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZUZpZWxkKFN0cmluZyBwZCwgU3RyaW5nIG5hbWUsIE9iamVjdCBmaWVsZCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgaWYgKGZpZWxkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5vdE51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkZpZWxkICIgKyBuYW1lICsgIiBtdXN0IG5vdCBiZSBudWxsIik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGZpZWxkIGluc3RhbmNlb2YgTWFwKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PE9iamVjdCwgT2JqZWN0PiBlbnRyeSA6ICgoTWFwPE9iamVjdCwgT2JqZWN0PikgZmllbGQpLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGtleS52YWxpZGF0ZUZpZWxkKCJFYWNoIGtleSBvZiB0aGUgbWFwICIsIG5hbWUsIGVudHJ5LmdldEtleSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbC52YWxpZGF0ZUZpZWxkKCJFYWNoIHZhbHVlIGluIHRoZSBtYXAgIiwgbmFtZSwgZW50cnkuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIkZpZWxkICIgKyBuYW1lICsgIiBtdXN0IGJlIGEgTWFwIik7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3dpbmRvd2luZy9Db3VudEV2aWN0aW9uUG9saWN5LmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vd2luZG93aW5nL0NvdW50RXZpY3Rpb25Qb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjc3OWE4Ci0tLSAvZGV2L251bGwKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3dpbmRvd2luZy9Db3VudEV2aWN0aW9uUG9saWN5LmphdmEKQEAgLTAsMCArMSw2OCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYmFja3R5cGUuc3Rvcm0ud2luZG93aW5nOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CisKKy8qKgorICogQW4gZXZpY3Rpb24gcG9saWN5IHRoYXQgdHJhY2tzIGV2ZW50IGNvdW50cyBhbmQgY2FuCisgKiBldmljdCBiYXNlZCBvbiBhIHRocmVzaG9sZCBjb3VudC4KKyAqCisgKiBAcGFyYW0gPFQ+IHRoZSB0eXBlIG9mIGV2ZW50IHRyYWNrZWQgYnkgdGhpcyBwb2xpY3kuCisgKi8KK3B1YmxpYyBjbGFzcyBDb3VudEV2aWN0aW9uUG9saWN5PFQ+IGltcGxlbWVudHMgRXZpY3Rpb25Qb2xpY3k8VD4geworICAgIHByaXZhdGUgZmluYWwgaW50IHRocmVzaG9sZDsKKyAgICBwcml2YXRlIGZpbmFsIEF0b21pY0ludGVnZXIgY3VycmVudENvdW50OworCisgICAgcHVibGljIENvdW50RXZpY3Rpb25Qb2xpY3koaW50IGNvdW50KSB7CisgICAgICAgIHRoaXMudGhyZXNob2xkID0gY291bnQ7CisgICAgICAgIHRoaXMuY3VycmVudENvdW50ID0gbmV3IEF0b21pY0ludGVnZXIoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBldmljdChFdmVudDxUPiBldmVudCkgeworICAgICAgICAvKgorICAgICAgICAgKiBhdG9taWNhbGx5IGRlY3JlbWVudCB0aGUgY291bnQgaWYgaXRzIGdyZWF0ZXIgdGhhbiB0aHJlc2hvbGQgYW5kCisgICAgICAgICAqIHJldHVybiBpZiB0aGUgZXZlbnQgc2hvdWxkIGJlIGV2aWN0ZWQKKyAgICAgICAgICovCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBpbnQgY3VyVmFsID0gY3VycmVudENvdW50LmdldCgpOworICAgICAgICAgICAgaWYgKGN1clZhbCA+IHRocmVzaG9sZCkgeworICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Q291bnQuY29tcGFyZUFuZFNldChjdXJWYWwsIGN1clZhbCAtIDEpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRyYWNrKEV2ZW50PFQ+IGV2ZW50KSB7CisgICAgICAgIGN1cnJlbnRDb3VudC5pbmNyZW1lbnRBbmRHZXQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIkNvdW50RXZpY3Rpb25Qb2xpY3l7IiArCisgICAgICAgICAgICAgICAgInRocmVzaG9sZD0iICsgdGhyZXNob2xkICsKKyAgICAgICAgICAgICAgICAiLCBjdXJyZW50Q291bnQ9IiArIGN1cnJlbnRDb3VudCArCisgICAgICAgICAgICAgICAgJ30nOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS93aW5kb3dpbmcvQ291bnRUcmlnZ2VyUG9saWN5LmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vd2luZG93aW5nL0NvdW50VHJpZ2dlclBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMWJmOWYKLS0tIC9kZXYvbnVsbAorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vd2luZG93aW5nL0NvdW50VHJpZ2dlclBvbGljeS5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGJhY2t0eXBlLnN0b3JtLndpbmRvd2luZzsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOworCisvKioKKyAqIEEgdHJpZ2dlciB0aGF0IHRyYWNrcyBldmVudCBjb3VudHMgYW5kIGNhbGxzIGJhY2sge0BsaW5rIFRyaWdnZXJIYW5kbGVyI29uVHJpZ2dlcigpfQorICogd2hlbiB0aGUgY291bnQgdGhyZXNob2xkIGlzIGhpdC4KKyAqCisgKiBAcGFyYW0gPFQ+IHRoZSB0eXBlIG9mIGV2ZW50IHRyYWNrZWQgYnkgdGhpcyBwb2xpY3kuCisgKi8KK3B1YmxpYyBjbGFzcyBDb3VudFRyaWdnZXJQb2xpY3k8VD4gaW1wbGVtZW50cyBUcmlnZ2VyUG9saWN5PFQ+IHsKKyAgICBwcml2YXRlIGZpbmFsIGludCBjb3VudDsKKyAgICBwcml2YXRlIGZpbmFsIEF0b21pY0ludGVnZXIgY3VycmVudENvdW50OworICAgIHByaXZhdGUgZmluYWwgVHJpZ2dlckhhbmRsZXIgaGFuZGxlcjsKKworICAgIHB1YmxpYyBDb3VudFRyaWdnZXJQb2xpY3koaW50IGNvdW50LCBUcmlnZ2VySGFuZGxlciBoYW5kbGVyKSB7CisgICAgICAgIHRoaXMuY291bnQgPSBjb3VudDsKKyAgICAgICAgdGhpcy5jdXJyZW50Q291bnQgPSBuZXcgQXRvbWljSW50ZWdlcigpOworICAgICAgICB0aGlzLmhhbmRsZXIgPSBoYW5kbGVyOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRyYWNrKEV2ZW50PFQ+IGV2ZW50KSB7CisgICAgICAgIGlmIChjdXJyZW50Q291bnQuaW5jcmVtZW50QW5kR2V0KCkgPj0gY291bnQpIHsKKyAgICAgICAgICAgIGhhbmRsZXIub25UcmlnZ2VyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKKyAgICAgICAgY3VycmVudENvdW50LnNldCgwKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzaHV0ZG93bigpIHsKKyAgICAgICAgLy8gTk9PUAorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiQ291bnRUcmlnZ2VyUG9saWN5eyIgKworICAgICAgICAgICAgICAgICJjb3VudD0iICsgY291bnQgKworICAgICAgICAgICAgICAgICIsIGN1cnJlbnRDb3VudD0iICsgY3VycmVudENvdW50ICsKKyAgICAgICAgICAgICAgICAnfSc7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3dpbmRvd2luZy9FdmVudC5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3dpbmRvd2luZy9FdmVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NTU3MDEKLS0tIC9kZXYvbnVsbAorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vd2luZG93aW5nL0V2ZW50LmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYmFja3R5cGUuc3Rvcm0ud2luZG93aW5nOworCisvKioKKyAqIEFuIGV2ZW50IGlzIGEgd3JhcHBlciBvYmplY3QgdGhhdCBnZXRzIHN0b3JlZCBpbiB0aGUgd2luZG93LgorICoKKyAqIEBwYXJhbSA8VD4gdGhlIHR5cGUgb2YgdGhlIG9iamVjdCB0aGF0cyB3cmFwcGVkLiBFLmcgVHVwbGUKKyAqLworaW50ZXJmYWNlIEV2ZW50PFQ+IHsKKyAgICAvKioKKyAgICAgKiBUaGUgZXZlbnQgdGltZXN0YW1wIGluIG1pbGxpcy4gVGhpcyBjb3VsZCBiZSB0aGUgdGltZQorICAgICAqIHdoZW4gdGhlIHNvdXJjZSBnZW5lcmF0ZWQgdGhlIHR1cGxlIG9yIHRoZSB0aW1lCisgICAgICogd2hlbiB0aGUgdHVwbGUgd2FzIHJlY2VpdmVkIGJ5IGEgYm9sdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGV2ZW50IHRpbWVzdGFtcCBpbiBtaWxsaXNlY29uZHMuCisgICAgICovCisgICAgbG9uZyBnZXRUaW1lc3RhbXAoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHdyYXBwZWQgb2JqZWN0LCBFLmcuIGEgdHVwbGUKKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHdyYXBwZWQgb2JqZWN0LgorICAgICAqLworICAgIFQgZ2V0KCk7Cit9CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vd2luZG93aW5nL0V2ZW50SW1wbC5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3dpbmRvd2luZy9FdmVudEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWM5NzRjCi0tLSAvZGV2L251bGwKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3dpbmRvd2luZy9FdmVudEltcGwuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBiYWNrdHlwZS5zdG9ybS53aW5kb3dpbmc7CisKK2NsYXNzIEV2ZW50SW1wbDxUPiBpbXBsZW1lbnRzIEV2ZW50PFQ+IHsKKyAgICBwcml2YXRlIGZpbmFsIFQgZXZlbnQ7CisgICAgcHJpdmF0ZSBsb25nIHRzOworCisgICAgRXZlbnRJbXBsKFQgZXZlbnQsIGxvbmcgdHMpIHsKKyAgICAgICAgdGhpcy5ldmVudCA9IGV2ZW50OworICAgICAgICB0aGlzLnRzID0gdHM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgZ2V0VGltZXN0YW1wKCkgeworICAgICAgICByZXR1cm4gdHM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFQgZ2V0KCkgeworICAgICAgICByZXR1cm4gZXZlbnQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3dpbmRvd2luZy9FdmljdGlvblBvbGljeS5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3dpbmRvd2luZy9FdmljdGlvblBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MjBlOTIKLS0tIC9kZXYvbnVsbAorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vd2luZG93aW5nL0V2aWN0aW9uUG9saWN5LmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYmFja3R5cGUuc3Rvcm0ud2luZG93aW5nOworCisvKioKKyAqIEV2aWN0aW9uIHBvbGljeSB0cmFja3MgZXZlbnRzIGFuZCBkZWNpZGVzIHdoZXRoZXIKKyAqIGFuIGV2ZW50IHNob3VsZCBiZSBldmljdGVkIGZyb20gdGhlIHdpbmRvdyBvciBub3QuCisgKgorICogQHBhcmFtIDxUPiB0aGUgdHlwZSBvZiBldmVudCB0aGF0IGlzIHRyYWNrZWQuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRXZpY3Rpb25Qb2xpY3k8VD4geworICAgIC8qKgorICAgICAqIERlY2lkZXMgaWYgYW4gZXZlbnQgc2hvdWxkIGJlIGV2aWN0ZWQgZnJvbSB0aGUgd2luZG93IG9yIG5vdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCB0aGUgaW5wdXQgZXZlbnQKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGV2ZW50IHNob3VsZCBiZSBldmljdGVkLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBib29sZWFuIGV2aWN0KEV2ZW50PFQ+IGV2ZW50KTsKKworICAgIC8qKgorICAgICAqIFRyYWNrcyB0aGUgZXZlbnQgdG8gbGF0ZXIgZGVjaWRlIHdoZXRoZXIKKyAgICAgKiB7QGxpbmsgRXZpY3Rpb25Qb2xpY3kjZXZpY3QoRXZlbnQpfSBzaG91bGQgZXZpY3QgaXQgb3Igbm90LgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50IHRoZSBpbnB1dCBldmVudCB0byBiZSB0cmFja2VkCisgICAgICovCisgICAgdm9pZCB0cmFjayhFdmVudDxUPiBldmVudCk7Cit9CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vd2luZG93aW5nL1RpbWVFdmljdGlvblBvbGljeS5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3dpbmRvd2luZy9UaW1lRXZpY3Rpb25Qb2xpY3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjQwOGYzCi0tLSAvZGV2L251bGwKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3dpbmRvd2luZy9UaW1lRXZpY3Rpb25Qb2xpY3kuamF2YQpAQCAtMCwwICsxLDUyIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBiYWNrdHlwZS5zdG9ybS53aW5kb3dpbmc7CisKKy8qKgorICogRXZpY3Rpb24gcG9saWN5IHRoYXQgZXZpY3RzIGV2ZW50cyBiYXNlZCBvbiB0aW1lIGR1cmF0aW9uLgorICovCitwdWJsaWMgY2xhc3MgVGltZUV2aWN0aW9uUG9saWN5PFQ+IGltcGxlbWVudHMgRXZpY3Rpb25Qb2xpY3k8VD4geworICAgIHByaXZhdGUgZmluYWwgbG9uZyBkdXJhdGlvbjsKKworICAgIHB1YmxpYyBUaW1lRXZpY3Rpb25Qb2xpY3kobG9uZyBtaWxsaXMpIHsKKyAgICAgICAgdGhpcy5kdXJhdGlvbiA9IG1pbGxpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGV2ZW50IGZhbGxzIG91dCBvZiB0aGUgd2luZG93IGJhc2VkIG9uIHRoZSB3aW5kb3cgZHVyYXRpb24KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudAorICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBldmljdChFdmVudDxUPiBldmVudCkgeworICAgICAgICByZXR1cm4gKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gZXZlbnQuZ2V0VGltZXN0YW1wKCkpID49IGR1cmF0aW9uOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRyYWNrKEV2ZW50PFQ+IGV2ZW50KSB7CisgICAgICAgIC8vIE5PT1AKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIlRpbWVFdmljdGlvblBvbGljeXsiICsKKyAgICAgICAgICAgICAgICAiZHVyYXRpb249IiArIGR1cmF0aW9uICsKKyAgICAgICAgICAgICAgICAnfSc7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3dpbmRvd2luZy9UaW1lVHJpZ2dlclBvbGljeS5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3dpbmRvd2luZy9UaW1lVHJpZ2dlclBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMWZiZWIKLS0tIC9kZXYvbnVsbAorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vd2luZG93aW5nL1RpbWVUcmlnZ2VyUG9saWN5LmphdmEKQEAgLTAsMCArMSwxMTUgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGJhY2t0eXBlLnN0b3JtLndpbmRvd2luZzsKKworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnRvcG9sb2d5LkZhaWxlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TY2hlZHVsZWRFeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2NoZWR1bGVkRnV0dXJlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCisvKioKKyAqIEludm9rZXMge0BsaW5rIFRyaWdnZXJIYW5kbGVyI29uVHJpZ2dlcigpfSBhZnRlciB0aGUgZHVyYXRpb24uCisgKi8KK3B1YmxpYyBjbGFzcyBUaW1lVHJpZ2dlclBvbGljeTxUPiBpbXBsZW1lbnRzIFRyaWdnZXJQb2xpY3k8VD4geworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihUaW1lVHJpZ2dlclBvbGljeS5jbGFzcyk7CisKKyAgICBwcml2YXRlIGxvbmcgZHVyYXRpb247CisgICAgcHJpdmF0ZSBmaW5hbCBUcmlnZ2VySGFuZGxlciBoYW5kbGVyOworICAgIHByaXZhdGUgZmluYWwgU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yOworICAgIHByaXZhdGUgZmluYWwgU2NoZWR1bGVkRnV0dXJlPD8+IGV4ZWN1dG9yRnV0dXJlOworCisgICAgcHVibGljIFRpbWVUcmlnZ2VyUG9saWN5KGxvbmcgbWlsbGlzLCBUcmlnZ2VySGFuZGxlciBoYW5kbGVyKSB7CisgICAgICAgIHRoaXMuZHVyYXRpb24gPSBtaWxsaXM7CisgICAgICAgIHRoaXMuaGFuZGxlciA9IGhhbmRsZXI7CisgICAgICAgIHRoaXMuZXhlY3V0b3IgPSBFeGVjdXRvcnMubmV3U2luZ2xlVGhyZWFkU2NoZWR1bGVkRXhlY3V0b3IoKTsKKyAgICAgICAgdGhpcy5leGVjdXRvckZ1dHVyZSA9IGV4ZWN1dG9yLnNjaGVkdWxlQXRGaXhlZFJhdGUobmV3VHJpZ2dlclRhc2soKSwgZHVyYXRpb24sIGR1cmF0aW9uLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRyYWNrKEV2ZW50PFQ+IGV2ZW50KSB7CisgICAgICAgIGNoZWNrRmFpbHVyZXMoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKKyAgICAgICAgY2hlY2tGYWlsdXJlcygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNodXRkb3duKCkgeworICAgICAgICBleGVjdXRvci5zaHV0ZG93bigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKCFleGVjdXRvci5hd2FpdFRlcm1pbmF0aW9uKDIsIFRpbWVVbml0LlNFQ09ORFMpKSB7CisgICAgICAgICAgICAgICAgZXhlY3V0b3Iuc2h1dGRvd25Ob3coKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWUpIHsKKyAgICAgICAgICAgIGV4ZWN1dG9yLnNodXRkb3duTm93KCk7CisgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmludGVycnVwdCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJUaW1lVHJpZ2dlclBvbGljeXsiICsKKyAgICAgICAgICAgICAgICAiZHVyYXRpb249IiArIGR1cmF0aW9uICsKKyAgICAgICAgICAgICAgICAnfSc7CisgICAgfQorCisgICAgLyoKKyAgICAqIENoZWNrIGZvciB1bmNhdWdodCBleGNlcHRpb25zIGR1cmluZyB0aGUgZXhlY3V0aW9uCisgICAgKiBvZiB0aGUgdHJpZ2dlciBhbmQgZmFpbCBmYXN0LgorICAgICogVGhlIHVuY2F1Z2h0IGV4Y2VwdGlvbnMgd2lsbCBiZSB3cmFwcGVkIGluCisgICAgKiBFeGVjdXRpb25FeGNlcHRpb24gYW5kIHRocm93biB3aGVuIGZ1dHVyZS5nZXQoKSBpcyBpbnZva2VkLgorICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrRmFpbHVyZXMoKSB7CisgICAgICAgIGlmIChleGVjdXRvckZ1dHVyZS5pc0RvbmUoKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBleGVjdXRvckZ1dHVyZS5nZXQoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgTE9HLmVycm9yKCJHb3QgZXhjZXB0aW9uICIsIGV4KTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRmFpbGVkRXhjZXB0aW9uKGV4KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIExPRy5lcnJvcigiR290IGV4Y2VwdGlvbiAiLCBleCk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEZhaWxlZEV4Y2VwdGlvbihleC5nZXRDYXVzZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgUnVubmFibGUgbmV3VHJpZ2dlclRhc2soKSB7CisgICAgICAgIHJldHVybiBuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBoYW5kbGVyLm9uVHJpZ2dlcigpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0aCkgeworICAgICAgICAgICAgICAgICAgICBMT0cuZXJyb3IoImhhbmRsZXIub25UcmlnZ2VyIGZhaWxlZCAiLCB0aCk7CisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAqIHByb3BhZ2F0ZSBpdCBzbyB0aGF0IHRhc2sgZ2V0cyBjYW5jZWxlZCBhbmQgdGhlIGV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgKiBjYW4gYmUgcmV0cmlldmVkIGZyb20gZXhlY3V0b3JGdXR1cmUuZ2V0KCkKKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIHRocm93IHRoOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vd2luZG93aW5nL1RyaWdnZXJIYW5kbGVyLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vd2luZG93aW5nL1RyaWdnZXJIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk0Nzk1MQotLS0gL2Rldi9udWxsCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS93aW5kb3dpbmcvVHJpZ2dlckhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDI5IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBiYWNrdHlwZS5zdG9ybS53aW5kb3dpbmc7CisKKy8qKgorICogVGhlIGNhbGxiYWNrIGZpcmVkIGJ5IHtAbGluayBUcmlnZ2VyUG9saWN5fSB3aGVuIHRoZSB0cmlnZ2VyCisgKiBjb25kaXRpb24gaXMgc2F0aXNmaWVkLgorICovCitpbnRlcmZhY2UgVHJpZ2dlckhhbmRsZXIgeworICAgIC8qKgorICAgICAqIHRoZSBjb2RlIHRvIGV4ZWN1dGUgd2hlbiB0aGUge0BsaW5rIFRyaWdnZXJQb2xpY3l9IGNvbmRpdGlvbiBpcyBzYXRpc2ZpZWQuCisgICAgICovCisgICAgdm9pZCBvblRyaWdnZXIoKTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vd2luZG93aW5nL1RyaWdnZXJQb2xpY3kuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS93aW5kb3dpbmcvVHJpZ2dlclBvbGljeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyN2FmNzYKLS0tIC9kZXYvbnVsbAorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vd2luZG93aW5nL1RyaWdnZXJQb2xpY3kuamF2YQpAQCAtMCwwICsxLDQyIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBiYWNrdHlwZS5zdG9ybS53aW5kb3dpbmc7CisKKy8qKgorICogVHJpZ2dlcnMgdGhlIHdpbmRvdyBjYWxjdWxhdGlvbnMgYmFzZWQgb24gdGhlIHBvbGljeS4KKyAqCisgKiBAcGFyYW0gPFQ+IHRoZSB0eXBlIG9mIHRoZSBldmVudCB0aGF0IGlzIHRyYWNrZWQKKyAqLworcHVibGljIGludGVyZmFjZSBUcmlnZ2VyUG9saWN5PFQ+IHsKKyAgICAvKioKKyAgICAgKiBUcmFja3MgdGhlIGV2ZW50IGFuZCBjb3VsZCB1c2UgdGhpcyB0byBpbnZva2UgdGhlIHRyaWdnZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgdGhlIGlucHV0IGV2ZW50CisgICAgICovCisgICAgdm9pZCB0cmFjayhFdmVudDxUPiBldmVudCk7CisKKyAgICAvKioKKyAgICAgKiByZXNldHMgdGhlIHRyaWdnZXIgcG9saWN5CisgICAgICovCisgICAgdm9pZCByZXNldCgpOworCisgICAgLyoqCisgICAgICogQW55IGNsZWFuIHVwIGNvdWxkIGJlIGhhbmRsZWQgaGVyZS4KKyAgICAgKi8KKyAgICB2b2lkIHNodXRkb3duKCk7Cit9CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vd2luZG93aW5nL1R1cGxlV2luZG93LmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vd2luZG93aW5nL1R1cGxlV2luZG93LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y3NDA4YgotLS0gL2Rldi9udWxsCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS93aW5kb3dpbmcvVHVwbGVXaW5kb3cuamF2YQpAQCAtMCwwICsxLDI2IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBiYWNrdHlwZS5zdG9ybS53aW5kb3dpbmc7CisKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS50dXBsZS5UdXBsZTsKKworLyoqCisgKiBBIHtAbGluayBXaW5kb3d9IHRoYXQgY29udGFpbnMge0BsaW5rIFR1cGxlfSBvYmplY3RzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIFR1cGxlV2luZG93IGV4dGVuZHMgV2luZG93PFR1cGxlPiB7Cit9CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vd2luZG93aW5nL1R1cGxlV2luZG93SW1wbC5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3dpbmRvd2luZy9UdXBsZVdpbmRvd0ltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmEzOTVmCi0tLSAvZGV2L251bGwKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3dpbmRvd2luZy9UdXBsZVdpbmRvd0ltcGwuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBiYWNrdHlwZS5zdG9ybS53aW5kb3dpbmc7CisKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS50dXBsZS5UdXBsZTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEhvbGRzIHRoZSBleHBpcmVkLCBuZXcgYW5kIGN1cnJlbnQgdHVwbGVzIGluIGEgd2luZG93LgorICovCitwdWJsaWMgY2xhc3MgVHVwbGVXaW5kb3dJbXBsIGltcGxlbWVudHMgVHVwbGVXaW5kb3cgeworICAgIHByaXZhdGUgZmluYWwgTGlzdDxUdXBsZT4gdHVwbGVzOworICAgIHByaXZhdGUgZmluYWwgTGlzdDxUdXBsZT4gbmV3VHVwbGVzOworICAgIHByaXZhdGUgZmluYWwgTGlzdDxUdXBsZT4gZXhwaXJlZFR1cGxlczsKKworICAgIHB1YmxpYyBUdXBsZVdpbmRvd0ltcGwoTGlzdDxUdXBsZT4gdHVwbGVzLCBMaXN0PFR1cGxlPiBuZXdUdXBsZXMsIExpc3Q8VHVwbGU+IGV4cGlyZWRUdXBsZXMpIHsKKyAgICAgICAgdGhpcy50dXBsZXMgPSB0dXBsZXM7CisgICAgICAgIHRoaXMubmV3VHVwbGVzID0gbmV3VHVwbGVzOworICAgICAgICB0aGlzLmV4cGlyZWRUdXBsZXMgPSBleHBpcmVkVHVwbGVzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PFR1cGxlPiBnZXQoKSB7CisgICAgICAgIHJldHVybiB0dXBsZXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8VHVwbGU+IGdldE5ldygpIHsKKyAgICAgICAgcmV0dXJuIG5ld1R1cGxlczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxUdXBsZT4gZ2V0RXhwaXJlZCgpIHsKKyAgICAgICAgcmV0dXJuIGV4cGlyZWRUdXBsZXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJUdXBsZVdpbmRvd0ltcGx7IiArCisgICAgICAgICAgICAgICAgInR1cGxlcz0iICsgdHVwbGVzICsKKyAgICAgICAgICAgICAgICAiLCBuZXdUdXBsZXM9IiArIG5ld1R1cGxlcyArCisgICAgICAgICAgICAgICAgIiwgZXhwaXJlZFR1cGxlcz0iICsgZXhwaXJlZFR1cGxlcyArCisgICAgICAgICAgICAgICAgJ30nOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS93aW5kb3dpbmcvV2luZG93LmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vd2luZG93aW5nL1dpbmRvdy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MDVlMzMKLS0tIC9kZXYvbnVsbAorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vd2luZG93aW5nL1dpbmRvdy5qYXZhCkBAIC0wLDAgKzEsNDggQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGJhY2t0eXBlLnN0b3JtLndpbmRvd2luZzsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEEgdmlldyBvZiBldmVudHMgaW4gYSBzbGlkaW5nIHdpbmRvdy4KKyAqCisgKiBAcGFyYW0gPFQ+IHRoZSB0eXBlIG9mIGV2ZW50IHRoYXQgdGhpcyB3aW5kb3cgY29udGFpbnMuIEUuZy4ge0BsaW5rIGJhY2t0eXBlLnN0b3JtLnR1cGxlLlR1cGxlfQorICovCitwdWJsaWMgaW50ZXJmYWNlIFdpbmRvdzxUPiB7CisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbGlzdCBvZiBldmVudHMgaW4gdGhlIHdpbmRvdy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgZXZlbnRzIGluIHRoZSB3aW5kb3cuCisgICAgICovCisgICAgTGlzdDxUPiBnZXQoKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbGlzdCBvZiBuZXdseSBhZGRlZCBldmVudHMgaW4gdGhlIHdpbmRvdyBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoZSB3aW5kb3cgd2FzIGdlbmVyYXRlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgbmV3bHkgYWRkZWQgZXZlbnRzIGluIHRoZSB3aW5kb3cuCisgICAgICovCisgICAgTGlzdDxUPiBnZXROZXcoKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbGlzdCBvZiBldmVudHMgZXhwaXJlZCBmcm9tIHRoZSB3aW5kb3cgc2luY2UgdGhlIGxhc3QgdGltZSB0aGUgd2luZG93IHdhcyBnZW5lcmF0ZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGV2ZW50cyBleHBpcmVkIGZyb20gdGhlIHdpbmRvdy4KKyAgICAgKi8KKyAgICBMaXN0PFQ+IGdldEV4cGlyZWQoKTsKK30KZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS93aW5kb3dpbmcvV2luZG93TGlmZWN5Y2xlTGlzdGVuZXIuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9iYWNrdHlwZS9zdG9ybS93aW5kb3dpbmcvV2luZG93TGlmZWN5Y2xlTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTU0MDAzCi0tLSAvZGV2L251bGwKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3dpbmRvd2luZy9XaW5kb3dMaWZlY3ljbGVMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGJhY2t0eXBlLnN0b3JtLndpbmRvd2luZzsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEEgY2FsbGJhY2sgZm9yIGV4cGlyeSwgYWN0aXZhdGlvbiBvZiBldmVudHMgdHJhY2tlZCBieSB0aGUge0BsaW5rIFdpbmRvd01hbmFnZXJ9CisgKgorICogQHBhcmFtIDxUPiBUaGUgdHlwZSBvZiBFdmVudCBpbiB0aGUgd2luZG93IChlLmcuIFR1cGxlKS4KKyAqLworcHVibGljIGludGVyZmFjZSBXaW5kb3dMaWZlY3ljbGVMaXN0ZW5lcjxUPiB7CisgICAgLyoqCisgICAgICogQ2FsbGVkIG9uIGV4cGlyeSBvZiBldmVudHMgZnJvbSB0aGUgd2luZG93IGR1ZSB0byB7QGxpbmsgRXZpY3Rpb25Qb2xpY3l9CisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnRzIHRoZSBleHBpcmVkIGV2ZW50cworICAgICAqLworICAgIHZvaWQgb25FeHBpcnkoTGlzdDxUPiBldmVudHMpOworCisgICAgLyoqCisgICAgICogQ2FsbGVkIG9uIGFjdGl2YXRpb24gb2YgdGhlIHdpbmRvdyBkdWUgdG8gdGhlIHtAbGluayBUcmlnZ2VyUG9saWN5fQorICAgICAqIEBwYXJhbSBldmVudHMgdGhlIGxpc3Qgb2YgY3VycmVudCBldmVudHMgaW4gdGhlIHdpbmRvdy4KKyAgICAgKiBAcGFyYW0gbmV3RXZlbnRzIHRoZSBuZXdseSBhZGRlZCBldmVudHMgc2luY2UgbGFzdCBhY3RpdmF0aW9uLgorICAgICAqIEBwYXJhbSBleHBpcmVkIHRoZSBleHBpcmVkIGV2ZW50cyBzaW5jZSBsYXN0IGFjdGl2YXRpb24uCisgICAgICovCisgICAgdm9pZCBvbkFjdGl2YXRpb24oTGlzdDxUPiBldmVudHMsIExpc3Q8VD4gbmV3RXZlbnRzLCBMaXN0PFQ+IGV4cGlyZWQpOworfQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3dpbmRvd2luZy9XaW5kb3dNYW5hZ2VyLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vYmFja3R5cGUvc3Rvcm0vd2luZG93aW5nL1dpbmRvd01hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjAzYWJmCi0tLSAvZGV2L251bGwKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL2JhY2t0eXBlL3N0b3JtL3dpbmRvd2luZy9XaW5kb3dNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSwyMTIgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGJhY2t0eXBlLnN0b3JtLndpbmRvd2luZzsKKworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TGlua2VkUXVldWU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50TG9jazsKKworaW1wb3J0IHN0YXRpYyBiYWNrdHlwZS5zdG9ybS50b3BvbG9neS5iYXNlLkJhc2VXaW5kb3dlZEJvbHQuQ291bnQ7CitpbXBvcnQgc3RhdGljIGJhY2t0eXBlLnN0b3JtLnRvcG9sb2d5LmJhc2UuQmFzZVdpbmRvd2VkQm9sdC5EdXJhdGlvbjsKKworLyoqCisgKiBUcmFja3MgYSB3aW5kb3cgb2YgZXZlbnRzIGFuZCBmaXJlcyB7QGxpbmsgV2luZG93TGlmZWN5Y2xlTGlzdGVuZXJ9IGNhbGxiYWNrcworICogb24gZXhwaXJ5IG9mIGV2ZW50cyBvciBhY3RpdmF0aW9uIG9mIHRoZSB3aW5kb3cgZHVlIHRvIHtAbGluayBUcmlnZ2VyUG9saWN5fS4KKyAqCisgKiBAcGFyYW0gPFQ+IHRoZSB0eXBlIG9mIGV2ZW50IGluIHRoZSB3aW5kb3cuCisgKi8KK3B1YmxpYyBjbGFzcyBXaW5kb3dNYW5hZ2VyPFQ+IGltcGxlbWVudHMgVHJpZ2dlckhhbmRsZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihXaW5kb3dNYW5hZ2VyLmNsYXNzKTsKKworICAgIC8qKgorICAgICAqIEV4cGlyZSBvbGQgZXZlbnRzIGV2ZXJ5IEVYUElSRV9FVkVOVFNfVEhSRVNIT0xEIHRvCisgICAgICoga2VlcCB0aGUgd2luZG93IHNpemUgaW4gY2hlY2suCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVhQSVJFX0VWRU5UU19USFJFU0hPTEQgPSAxMDA7CisKKyAgICBwcml2YXRlIGZpbmFsIFdpbmRvd0xpZmVjeWNsZUxpc3RlbmVyPFQ+IHdpbmRvd0xpZmVjeWNsZUxpc3RlbmVyOworICAgIHByaXZhdGUgZmluYWwgQ29uY3VycmVudExpbmtlZFF1ZXVlPEV2ZW50PFQ+PiB3aW5kb3c7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFQ+IGV4cGlyZWRFdmVudHM7CisgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8RXZlbnQ8VD4+IHByZXZXaW5kb3dFdmVudHM7CisgICAgcHJpdmF0ZSBmaW5hbCBBdG9taWNJbnRlZ2VyIGV2ZW50c1NpbmNlTGFzdEV4cGlyeTsKKyAgICBwcml2YXRlIGZpbmFsIFJlZW50cmFudExvY2sgbG9jazsKKyAgICBwcml2YXRlIEV2aWN0aW9uUG9saWN5PFQ+IGV2aWN0aW9uUG9saWN5OworICAgIHByaXZhdGUgVHJpZ2dlclBvbGljeTxUPiB0cmlnZ2VyUG9saWN5OworCisgICAgcHVibGljIFdpbmRvd01hbmFnZXIoV2luZG93TGlmZWN5Y2xlTGlzdGVuZXI8VD4gbGlmZWN5Y2xlTGlzdGVuZXIpIHsKKyAgICAgICAgd2luZG93TGlmZWN5Y2xlTGlzdGVuZXIgPSBsaWZlY3ljbGVMaXN0ZW5lcjsKKyAgICAgICAgd2luZG93ID0gbmV3IENvbmN1cnJlbnRMaW5rZWRRdWV1ZTw+KCk7CisgICAgICAgIGV4cGlyZWRFdmVudHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgcHJldldpbmRvd0V2ZW50cyA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgZXZlbnRzU2luY2VMYXN0RXhwaXJ5ID0gbmV3IEF0b21pY0ludGVnZXIoKTsKKyAgICAgICAgbG9jayA9IG5ldyBSZWVudHJhbnRMb2NrKHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFdpbmRvd0xlbmd0aChDb3VudCBjb3VudCkgeworICAgICAgICB0aGlzLmV2aWN0aW9uUG9saWN5ID0gbmV3IENvdW50RXZpY3Rpb25Qb2xpY3k8Pihjb3VudC52YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0V2luZG93TGVuZ3RoKER1cmF0aW9uIGR1cmF0aW9uKSB7CisgICAgICAgIHRoaXMuZXZpY3Rpb25Qb2xpY3kgPSBuZXcgVGltZUV2aWN0aW9uUG9saWN5PD4oZHVyYXRpb24udmFsdWUpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFNsaWRpbmdJbnRlcnZhbChDb3VudCBjb3VudCkgeworICAgICAgICB0aGlzLnRyaWdnZXJQb2xpY3kgPSBuZXcgQ291bnRUcmlnZ2VyUG9saWN5PD4oY291bnQudmFsdWUsIHRoaXMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFNsaWRpbmdJbnRlcnZhbChEdXJhdGlvbiBkdXJhdGlvbikgeworICAgICAgICB0aGlzLnRyaWdnZXJQb2xpY3kgPSBuZXcgVGltZVRyaWdnZXJQb2xpY3k8PihkdXJhdGlvbi52YWx1ZSwgdGhpcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGFuIGV2ZW50IGludG8gdGhlIHdpbmRvdywgd2l0aCB7QGxpbmsgU3lzdGVtI2N1cnJlbnRUaW1lTWlsbGlzKCl9IGFzCisgICAgICogdGhlIHRyYWNraW5nIHRzLgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50IHRoZSBldmVudCB0byBhZGQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGQoVCBldmVudCkgeworICAgICAgICBhZGQoZXZlbnQsIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYW4gZXZlbnQgaW50byB0aGUgd2luZG93LCB3aXRoIHRoZSBnaXZlbiB0cyBhcyB0aGUgdHJhY2tpbmcgdHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgdGhlIGV2ZW50IHRvIHRyYWNrCisgICAgICogQHBhcmFtIHRzICAgIHRoZSB0aW1lc3RhbXAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGQoVCBldmVudCwgbG9uZyB0cykgeworICAgICAgICBFdmVudDxUPiB3aW5kb3dFdmVudCA9IG5ldyBFdmVudEltcGw8VD4oZXZlbnQsIHRzKTsKKyAgICAgICAgd2luZG93LmFkZCh3aW5kb3dFdmVudCk7CisgICAgICAgIHRyYWNrKHdpbmRvd0V2ZW50KTsKKyAgICAgICAgY29tcGFjdFdpbmRvdygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBjYWxsYmFjayBpbnZva2VkIGJ5IHRoZSB0cmlnZ2VyIHBvbGljeS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblRyaWdnZXIoKSB7CisgICAgICAgIExpc3Q8RXZlbnQ8VD4+IHdpbmRvd0V2ZW50cyA9IG51bGw7CisgICAgICAgIExpc3Q8VD4gZXhwaXJlZCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsb2NrLmxvY2soKTsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBzY2FuIHRoZSBlbnRpcmUgd2luZG93IHRvIGhhbmRsZSBvdXQgb2Ygb3JkZXIgZXZlbnRzIGluCisgICAgICAgICAgICAgKiB0aGUgY2FzZSBvZiB0aW1lIGJhc2VkIHdpbmRvd3MuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHdpbmRvd0V2ZW50cyA9IGV4cGlyZUV2ZW50cyh0cnVlKTsKKyAgICAgICAgICAgIGV4cGlyZWQgPSBuZXcgQXJyYXlMaXN0PD4oZXhwaXJlZEV2ZW50cyk7CisgICAgICAgICAgICBleHBpcmVkRXZlbnRzLmNsZWFyKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICB9CisgICAgICAgIExpc3Q8VD4gZXZlbnRzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIExpc3Q8VD4gbmV3RXZlbnRzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGZvciAoRXZlbnQ8VD4gZXZlbnQgOiB3aW5kb3dFdmVudHMpIHsKKyAgICAgICAgICAgIGV2ZW50cy5hZGQoZXZlbnQuZ2V0KCkpOworICAgICAgICAgICAgaWYgKCFwcmV2V2luZG93RXZlbnRzLmNvbnRhaW5zKGV2ZW50KSkgeworICAgICAgICAgICAgICAgIG5ld0V2ZW50cy5hZGQoZXZlbnQuZ2V0KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHByZXZXaW5kb3dFdmVudHMuY2xlYXIoKTsKKyAgICAgICAgcHJldldpbmRvd0V2ZW50cy5hZGRBbGwod2luZG93RXZlbnRzKTsKKyAgICAgICAgTE9HLmRlYnVnKCJpbnZva2luZyB3aW5kb3dMaWZlY3ljbGVMaXN0ZW5lciBvbkFjdGl2YXRpb24sIFt7fV0gZXZlbnRzIGluIHdpbmRvdy4iLCB3aW5kb3dFdmVudHMuc2l6ZSgpKTsKKyAgICAgICAgd2luZG93TGlmZWN5Y2xlTGlzdGVuZXIub25BY3RpdmF0aW9uKGV2ZW50cywgbmV3RXZlbnRzLCBleHBpcmVkKTsKKyAgICAgICAgdHJpZ2dlclBvbGljeS5yZXNldCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNodXRkb3duKCkgeworICAgICAgICBMT0cuZGVidWcoIlNodXR0aW5nIGRvd24gV2luZG93TWFuYWdlciIpOworICAgICAgICBpZiAodHJpZ2dlclBvbGljeSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cmlnZ2VyUG9saWN5LnNodXRkb3duKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBleHBpcmVzIGV2ZW50cyB0aGF0IGZhbGwgb3V0IG9mIHRoZSB3aW5kb3cgZXZlcnkKKyAgICAgKiBFWFBJUkVfRVZFTlRTX1RIUkVTSE9MRCBzbyB0aGF0IHRoZSB3aW5kb3cgZG9lcyBub3QgZ3JvdworICAgICAqIHRvbyBiaWcuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGNvbXBhY3RXaW5kb3coKSB7CisgICAgICAgIGlmIChldmVudHNTaW5jZUxhc3RFeHBpcnkuaW5jcmVtZW50QW5kR2V0KCkgPj0gRVhQSVJFX0VWRU5UU19USFJFU0hPTEQpIHsKKyAgICAgICAgICAgIGV4cGlyZUV2ZW50cyhmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBmZWVkIHRoZSBldmVudCB0byB0aGUgZXZpY3Rpb24gYW5kIHRyaWdnZXIgcG9saWNpZXMKKyAgICAgKiBmb3IgYm9va2tlZXBpbmcgYW5kIG9wdGlvbmFsbHkgZmlyaW5nIHRoZSB0cmlnZ2VyLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB0cmFjayhFdmVudDxUPiB3aW5kb3dFdmVudCkgeworICAgICAgICBldmljdGlvblBvbGljeS50cmFjayh3aW5kb3dFdmVudCk7CisgICAgICAgIHRyaWdnZXJQb2xpY3kudHJhY2sod2luZG93RXZlbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4cGlyZSBldmVudHMgZnJvbSB0aGUgd2luZG93LCB1c2luZyB0aGUgZXhwaXJhdGlvbiBwb2xpY3kgdG8gY2hlY2sKKyAgICAgKiBpZiB0aGUgZXZlbnQgc2hvdWxkIGJlIGV2aWN0ZWQgb3Igbm90LgorICAgICAqCisgICAgICogQHBhcmFtIGZ1bGxTY2FuIGlmIHNldCwgd2lsbCBzY2FuIHRoZSBlbnRpcmUgd2luZG93OyBpZiBub3Qgc2V0LCB3aWxsIHN0b3AKKyAgICAgKiAgICAgICAgICAgICAgICAgYXMgc29vbiBhcyBhbiBldmVudCBub3Qgc2F0aXNmeWluZyB0aGUgZXhwaXJhdGlvbiBwb2xpY3kgaXMgZm91bmQKKyAgICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIHJlbWFpbmluZyBldmVudHMgaW4gdGhlIHdpbmRvdyBhZnRlciBleHBpcnkKKyAgICAgKi8KKyAgICBwcml2YXRlIExpc3Q8RXZlbnQ8VD4+IGV4cGlyZUV2ZW50cyhib29sZWFuIGZ1bGxTY2FuKSB7CisgICAgICAgIExPRy5kZWJ1ZygiRXhwaXJlIGV2ZW50cywgZXZpY3Rpb24gcG9saWN5IHt9IiwgZXZpY3Rpb25Qb2xpY3kpOworICAgICAgICBMaXN0PFQ+IGV2ZW50c1RvRXhwaXJlID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIExpc3Q8RXZlbnQ8VD4+IHJlbWFpbmluZyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbG9jay5sb2NrKCk7CisgICAgICAgICAgICBJdGVyYXRvcjxFdmVudDxUPj4gaXQgPSB3aW5kb3cuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBFdmVudDxUPiB3aW5kb3dFdmVudCA9IGl0Lm5leHQoKTsKKyAgICAgICAgICAgICAgICBpZiAoZXZpY3Rpb25Qb2xpY3kuZXZpY3Qod2luZG93RXZlbnQpKSB7CisgICAgICAgICAgICAgICAgICAgIGV2ZW50c1RvRXhwaXJlLmFkZCh3aW5kb3dFdmVudC5nZXQoKSk7CisgICAgICAgICAgICAgICAgICAgIGl0LnJlbW92ZSgpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWZ1bGxTY2FuKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZy5hZGQod2luZG93RXZlbnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGV4cGlyZWRFdmVudHMuYWRkQWxsKGV2ZW50c1RvRXhwaXJlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgIH0KKyAgICAgICAgZXZlbnRzU2luY2VMYXN0RXhwaXJ5LnNldCgwKTsKKyAgICAgICAgTE9HLmRlYnVnKCJbe31dIGV2ZW50cyBleHBpcmVkIGZyb20gd2luZG93LiIsIGV2ZW50c1RvRXhwaXJlLnNpemUoKSk7CisgICAgICAgIHdpbmRvd0xpZmVjeWNsZUxpc3RlbmVyLm9uRXhwaXJ5KGV2ZW50c1RvRXhwaXJlKTsKKyAgICAgICAgcmV0dXJuIHJlbWFpbmluZzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIldpbmRvd01hbmFnZXJ7IiArCisgICAgICAgICAgICAgICAgImV2aWN0aW9uUG9saWN5PSIgKyBldmljdGlvblBvbGljeSArCisgICAgICAgICAgICAgICAgIiwgdHJpZ2dlclBvbGljeT0iICsgdHJpZ2dlclBvbGljeSArCisgICAgICAgICAgICAgICAgJ30nOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9vcmcvYXBhY2hlL3N0b3JtL3BhY2VtYWtlci9JU2VydmVyTWVzc2FnZUhhbmRsZXIuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9vcmcvYXBhY2hlL3N0b3JtL3BhY2VtYWtlci9JU2VydmVyTWVzc2FnZUhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGRkNGFkCi0tLSAvZGV2L251bGwKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL29yZy9hcGFjaGUvc3Rvcm0vcGFjZW1ha2VyL0lTZXJ2ZXJNZXNzYWdlSGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuc3Rvcm0ucGFjZW1ha2VyOworCitpbXBvcnQgYmFja3R5cGUuc3Rvcm0uZ2VuZXJhdGVkLkhCTWVzc2FnZTsKKworcHVibGljIGludGVyZmFjZSBJU2VydmVyTWVzc2FnZUhhbmRsZXIgeworCisgICAgcHVibGljIEhCTWVzc2FnZSBoYW5kbGVNZXNzYWdlKEhCTWVzc2FnZSBtLCBib29sZWFuIGF1dGhlbnRpY2F0ZWQpOworfQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL29yZy9hcGFjaGUvc3Rvcm0vcGFjZW1ha2VyL1BhY2VtYWtlckNsaWVudC5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL29yZy9hcGFjaGUvc3Rvcm0vcGFjZW1ha2VyL1BhY2VtYWtlckNsaWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmNGE3MzcKLS0tIC9kZXYvbnVsbAorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vb3JnL2FwYWNoZS9zdG9ybS9wYWNlbWFrZXIvUGFjZW1ha2VyQ2xpZW50LmphdmEKQEAgLTAsMCArMSwyNTUgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuc3Rvcm0ucGFjZW1ha2VyOworCitpbXBvcnQgYmFja3R5cGUuc3Rvcm0uQ29uZmlnOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLmdlbmVyYXRlZC5IQk1lc3NhZ2U7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0ubWVzc2FnaW5nLm5ldHR5LklTYXNsQ2xpZW50OworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLm1lc3NhZ2luZy5uZXR0eS5OZXR0eVJlbmFtZVRocmVhZEZhY3Rvcnk7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0uc2VjdXJpdHkuYXV0aC5BdXRoVXRpbHM7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0udXRpbHMuU3Rvcm1Cb3VuZGVkRXhwb25lbnRpYWxCYWNrb2ZmUmV0cnk7CitpbXBvcnQgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3M7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuVGltZXI7CitpbXBvcnQgamF2YS51dGlsLlRpbWVyVGFzazsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuTGlua2VkQmxvY2tpbmdRdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRGYWN0b3J5OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNCb29sZWFuOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2U7CitpbXBvcnQgamF2YXguc2VjdXJpdHkuYXV0aC5sb2dpbi5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUuc3Rvcm0ucGFjZW1ha2VyLmNvZGVjLlRocmlmdE5ldHR5Q2xpZW50Q29kZWM7CitpbXBvcnQgb3JnLmpib3NzLm5ldHR5LmJvb3RzdHJhcC5DbGllbnRCb290c3RyYXA7CitpbXBvcnQgb3JnLmpib3NzLm5ldHR5LmNoYW5uZWwuQ2hhbm5lbDsKK2ltcG9ydCBvcmcuamJvc3MubmV0dHkuY2hhbm5lbC5DaGFubmVsUGlwZWxpbmVGYWN0b3J5OworaW1wb3J0IG9yZy5qYm9zcy5uZXR0eS5jaGFubmVsLnNvY2tldC5uaW8uTmlvQ2xpZW50U29ja2V0Q2hhbm5lbEZhY3Rvcnk7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworcHVibGljIGNsYXNzIFBhY2VtYWtlckNsaWVudCBpbXBsZW1lbnRzIElTYXNsQ2xpZW50IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihQYWNlbWFrZXJDbGllbnQuY2xhc3MpOworCisgICAgcHJpdmF0ZSBTdHJpbmcgdG9wb19uYW1lOworICAgIHByaXZhdGUgU3RyaW5nIHNlY3JldDsKKyAgICBwcml2YXRlIGJvb2xlYW4gcmVhZHkgPSBmYWxzZTsKKyAgICBwcml2YXRlIGZpbmFsIENsaWVudEJvb3RzdHJhcCBib290c3RyYXA7CisgICAgcHJpdmF0ZSBBdG9taWNSZWZlcmVuY2U8Q2hhbm5lbD4gY2hhbm5lbFJlZjsKKyAgICBwcml2YXRlIEF0b21pY0Jvb2xlYW4gY2xvc2luZzsKKyAgICBwcml2YXRlIEluZXRTb2NrZXRBZGRyZXNzIHJlbW90ZV9hZGRyOworICAgIHByaXZhdGUgaW50IG1heFBlbmRpbmcgPSAxMDA7CisgICAgcHJpdmF0ZSBIQk1lc3NhZ2UgbWVzc2FnZXNbXTsKKyAgICBwcml2YXRlIExpbmtlZEJsb2NraW5nUXVldWU8SW50ZWdlcj4gYXZhaWxhYmxlTWVzc2FnZVNsb3RzOworICAgIHByaXZhdGUgVGhyaWZ0TmV0dHlDbGllbnRDb2RlYy5BdXRoTWV0aG9kIGF1dGhNZXRob2Q7CisKKyAgICBwcml2YXRlIFN0b3JtQm91bmRlZEV4cG9uZW50aWFsQmFja29mZlJldHJ5IGJhY2tvZmYgPSBuZXcgU3Rvcm1Cb3VuZGVkRXhwb25lbnRpYWxCYWNrb2ZmUmV0cnkoMTAwLCA1MDAwLCAyMCk7CisgICAgcHJpdmF0ZSBpbnQgcmV0cnlUaW1lcyA9IDA7CisKKyAgICBwdWJsaWMgUGFjZW1ha2VyQ2xpZW50KE1hcCBjb25maWcpIHsKKworICAgICAgICBTdHJpbmcgaG9zdCA9IChTdHJpbmcpY29uZmlnLmdldChDb25maWcuUEFDRU1BS0VSX0hPU1QpOworICAgICAgICBpbnQgcG9ydCA9IChpbnQpY29uZmlnLmdldChDb25maWcuUEFDRU1BS0VSX1BPUlQpOworICAgICAgICB0b3BvX25hbWUgPSAoU3RyaW5nKWNvbmZpZy5nZXQoQ29uZmlnLlRPUE9MT0dZX05BTUUpOworICAgICAgICBpZih0b3BvX25hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgdG9wb19uYW1lID0gInBhY2VtYWtlci1jbGllbnQiOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGF1dGggPSAoU3RyaW5nKWNvbmZpZy5nZXQoQ29uZmlnLlBBQ0VNQUtFUl9BVVRIX01FVEhPRCk7CisgICAgICAgIFRocmlmdE5ldHR5Q2xpZW50Q29kZWMuQXV0aE1ldGhvZCBhdXRoTWV0aG9kOworCisgICAgICAgIHN3aXRjaChhdXRoKSB7CisKKyAgICAgICAgY2FzZSAiRElHRVNUIjoKKyAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gbG9naW5fY29uZiA9IEF1dGhVdGlscy5HZXRDb25maWd1cmF0aW9uKGNvbmZpZyk7CisgICAgICAgICAgICBhdXRoTWV0aG9kID0gVGhyaWZ0TmV0dHlDbGllbnRDb2RlYy5BdXRoTWV0aG9kLkRJR0VTVDsKKyAgICAgICAgICAgIHNlY3JldCA9IEF1dGhVdGlscy5tYWtlRGlnZXN0UGF5bG9hZChsb2dpbl9jb25mLCBBdXRoVXRpbHMuTE9HSU5fQ09OVEVYVF9QQUNFTUFLRVJfRElHRVNUKTsKKyAgICAgICAgICAgIGlmKHNlY3JldCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgTE9HLmVycm9yKCJDYW4ndCBzdGFydCBwYWNlbWFrZXIgc2VydmVyIHdpdGhvdXQgZGlnZXN0IHNlY3JldC4iKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ2FuJ3Qgc3RhcnQgcGFjZW1ha2VyIHNlcnZlciB3aXRob3V0IGRpZ2VzdCBzZWNyZXQuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICJLRVJCRVJPUyI6CisgICAgICAgICAgICBhdXRoTWV0aG9kID0gVGhyaWZ0TmV0dHlDbGllbnRDb2RlYy5BdXRoTWV0aG9kLktFUkJFUk9TOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAiTk9ORSI6CisgICAgICAgICAgICBhdXRoTWV0aG9kID0gVGhyaWZ0TmV0dHlDbGllbnRDb2RlYy5BdXRoTWV0aG9kLk5PTkU7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYXV0aE1ldGhvZCA9IFRocmlmdE5ldHR5Q2xpZW50Q29kZWMuQXV0aE1ldGhvZC5OT05FOworICAgICAgICAgICAgTE9HLndhcm4oIkludmFsaWQgYXV0aCBzY2hlbWU6ICd7fScuIEZhbGxpbmcgYmFjayB0byAnTk9ORSciLCBhdXRoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2xvc2luZyA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKKyAgICAgICAgY2hhbm5lbFJlZiA9IG5ldyBBdG9taWNSZWZlcmVuY2U8Q2hhbm5lbD4obnVsbCk7CisgICAgICAgIHNldHVwTWVzc2FnaW5nKCk7CisKKyAgICAgICAgVGhyZWFkRmFjdG9yeSBib3NzRmFjdG9yeSA9IG5ldyBOZXR0eVJlbmFtZVRocmVhZEZhY3RvcnkoImNsaWVudC1ib3NzIik7CisgICAgICAgIFRocmVhZEZhY3Rvcnkgd29ya2VyRmFjdG9yeSA9IG5ldyBOZXR0eVJlbmFtZVRocmVhZEZhY3RvcnkoImNsaWVudC13b3JrZXIiKTsKKyAgICAgICAgTmlvQ2xpZW50U29ja2V0Q2hhbm5lbEZhY3RvcnkgZmFjdG9yeSA9CisgICAgICAgICAgICBuZXcgTmlvQ2xpZW50U29ja2V0Q2hhbm5lbEZhY3RvcnkoRXhlY3V0b3JzLm5ld0NhY2hlZFRocmVhZFBvb2woYm9zc0ZhY3RvcnkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4ZWN1dG9ycy5uZXdDYWNoZWRUaHJlYWRQb29sKHdvcmtlckZhY3RvcnkpKTsKKyAgICAgICAgYm9vdHN0cmFwID0gbmV3IENsaWVudEJvb3RzdHJhcChmYWN0b3J5KTsKKyAgICAgICAgYm9vdHN0cmFwLnNldE9wdGlvbigidGNwTm9EZWxheSIsIHRydWUpOworICAgICAgICBib290c3RyYXAuc2V0T3B0aW9uKCJzZW5kQnVmZmVyU2l6ZSIsIDUyNDI4ODApOworICAgICAgICBib290c3RyYXAuc2V0T3B0aW9uKCJrZWVwQWxpdmUiLCB0cnVlKTsKKworICAgICAgICByZW1vdGVfYWRkciA9IG5ldyBJbmV0U29ja2V0QWRkcmVzcyhob3N0LCBwb3J0KTsKKyAgICAgICAgQ2hhbm5lbFBpcGVsaW5lRmFjdG9yeSBwaXBlbGluZUZhY3RvcnkgPSBuZXcgVGhyaWZ0TmV0dHlDbGllbnRDb2RlYyh0aGlzLCBjb25maWcsIGF1dGhNZXRob2QpLnBpcGVsaW5lRmFjdG9yeSgpOworICAgICAgICBib290c3RyYXAuc2V0UGlwZWxpbmVGYWN0b3J5KHBpcGVsaW5lRmFjdG9yeSk7CisgICAgICAgIGJvb3RzdHJhcC5jb25uZWN0KHJlbW90ZV9hZGRyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0dXBNZXNzYWdpbmcoKSB7CisgICAgICAgIG1lc3NhZ2VzID0gbmV3IEhCTWVzc2FnZVttYXhQZW5kaW5nXTsKKyAgICAgICAgYXZhaWxhYmxlTWVzc2FnZVNsb3RzID0gbmV3IExpbmtlZEJsb2NraW5nUXVldWU8SW50ZWdlcj4oKTsKKyAgICAgICAgZm9yKGludCBpID0gMDsgaSA8IG1heFBlbmRpbmc7IGkrKykgeworICAgICAgICAgICAgYXZhaWxhYmxlTWVzc2FnZVNsb3RzLmFkZChpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjaGFubmVsQ29ubmVjdGVkKENoYW5uZWwgY2hhbm5lbCkgeworICAgICAgICBMT0cuZGVidWcoIkNoYW5uZWwgaXMgY29ubmVjdGVkOiB7fSIsIGNoYW5uZWwudG9TdHJpbmcoKSk7CisgICAgICAgIGNoYW5uZWxSZWYuc2V0KGNoYW5uZWwpOworCisgICAgICAgIC8vSWYgd2UncmUgbm90IGdvaW5nIHRvIGF1dGhlbnRpY2F0ZSwgd2UgY2FuIGJlZ2luIHNlbmRpbmcuCisgICAgICAgIGlmKGF1dGhNZXRob2QgPT0gVGhyaWZ0TmV0dHlDbGllbnRDb2RlYy5BdXRoTWV0aG9kLk5PTkUpIHsKKyAgICAgICAgICAgIHJlYWR5ID0gdHJ1ZTsKKyAgICAgICAgICAgIHRoaXMubm90aWZ5QWxsKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0cnlUaW1lcyA9IDA7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGNoYW5uZWxSZWFkeSgpIHsKKyAgICAgICAgTE9HLmRlYnVnKCJDaGFubmVsIGlzIHJlYWR5LiIpOworICAgICAgICByZWFkeSA9IHRydWU7CisgICAgICAgIHRoaXMubm90aWZ5QWxsKCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBuYW1lKCkgeworICAgICAgICByZXR1cm4gdG9wb19uYW1lOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgc2VjcmV0S2V5KCkgeworICAgICAgICByZXR1cm4gc2VjcmV0OworICAgIH0KKworICAgIHB1YmxpYyBIQk1lc3NhZ2Ugc2VuZChIQk1lc3NhZ2UgbSkgeworICAgICAgICAvLyBXYWl0IGZvciAncmVhZHknIChjaGFubmVsIGNvbm5lY3RlZCBhbmQgbWF5YmUgYXV0aGVudGljYXRpb24pCisgICAgICAgIGlmKCFyZWFkeSkgeworICAgICAgICAgICAgc3luY2hyb25pemVkKHRoaXMpIHsKKyAgICAgICAgICAgICAgICBpZighcmVhZHkpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HLmRlYnVnKCJXYWl0aW5nIGZvciBuZXR0eSBjaGFubmVsIHRvIGJlIHJlYWR5LiIpOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53YWl0KDEwMDApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXJlYWR5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRpbWVkIG91dCB3YWl0aW5nIGZvciBjaGFubmVsIHJlYWR5LiIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChqYXZhLmxhbmcuSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBMT0cuZGVidWcoIlNlbmRpbmcgbWVzc2FnZToge30iLCBtLnRvU3RyaW5nKCkpOworICAgICAgICB0cnkgeworCisgICAgICAgICAgICBpbnQgbmV4dCA9IGF2YWlsYWJsZU1lc3NhZ2VTbG90cy50YWtlKCk7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG0pIHsKKyAgICAgICAgICAgICAgICBtLnNldF9tZXNzYWdlX2lkKG5leHQpOworICAgICAgICAgICAgICAgIG1lc3NhZ2VzW25leHRdID0gbTsKKyAgICAgICAgICAgICAgICBMT0cuZGVidWcoIlB1dCBtZXNzYWdlIGluIHNsb3Q6IHt9IiwgSW50ZWdlci50b1N0cmluZyhuZXh0KSk7CisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICBjaGFubmVsUmVmLmdldCgpLndyaXRlKG0pOworICAgICAgICAgICAgICAgICAgICBtLndhaXQoMTAwMCk7CisgICAgICAgICAgICAgICAgfSB3aGlsZSAobWVzc2FnZXNbbmV4dF0gPT0gbSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEhCTWVzc2FnZSByZXQgPSBtZXNzYWdlc1tuZXh0XTsKKyAgICAgICAgICAgIGlmKHJldCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBjYW4gaGFwcGVuIGlmIHdlIGxvc3QgdGhlIGNvbm5lY3Rpb24gYW5kIHN1YnNlcXVlbnRseSByZWNvbm5lY3RlZCBvciB0aW1lZCBvdXQuCisgICAgICAgICAgICAgICAgc2VuZChtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lc3NhZ2VzW25leHRdID0gbnVsbDsKKyAgICAgICAgICAgIExPRy5kZWJ1ZygiR290IFJlc3BvbnNlOiB7fSIsIHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0cuZXJyb3IoIlBhY2VtYWtlckNsaWVudCBzZW5kIGludGVycnVwdGVkOiAiLCBlKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZ290TWVzc2FnZShIQk1lc3NhZ2UgbSkgeworICAgICAgICBpbnQgbWVzc2FnZV9pZCA9IG0uZ2V0X21lc3NhZ2VfaWQoKTsKKyAgICAgICAgaWYobWVzc2FnZV9pZCA+PTAgJiYgbWVzc2FnZV9pZCA8IG1heFBlbmRpbmcpIHsKKworICAgICAgICAgICAgTE9HLmRlYnVnKCJQYWNlbWFrZXIgY2xpZW50IGdvdCBtZXNzYWdlOiB7fSIsIG0udG9TdHJpbmcoKSk7CisgICAgICAgICAgICBIQk1lc3NhZ2UgcmVxdWVzdCA9IG1lc3NhZ2VzW21lc3NhZ2VfaWRdOworCisgICAgICAgICAgICBpZihyZXF1ZXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBMT0cuZGVidWcoIk5vIG1lc3NhZ2UgZm9yIHNsb3Q6IHt9IiwgSW50ZWdlci50b1N0cmluZyhtZXNzYWdlX2lkKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQocmVxdWVzdCkgeworICAgICAgICAgICAgICAgICAgICBtZXNzYWdlc1ttZXNzYWdlX2lkXSA9IG07CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3Qubm90aWZ5QWxsKCk7CisgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZU1lc3NhZ2VTbG90cy5hZGQobWVzc2FnZV9pZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgTE9HLmVycm9yKCJHb3QgTWVzc2FnZSB3aXRoIGJhZCBpZDoge30iLCBtLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVjb25uZWN0KCkgeworICAgICAgICBmaW5hbCBQYWNlbWFrZXJDbGllbnQgY2xpZW50ID0gdGhpczsKKyAgICAgICAgVGltZXIgdCA9IG5ldyBUaW1lcih0cnVlKTsKKyAgICAgICAgdC5zY2hlZHVsZShuZXcgVGltZXJUYXNrKCkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50LmRvUmVjb25uZWN0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIGJhY2tvZmYuZ2V0U2xlZXBUaW1lTXMocmV0cnlUaW1lcysrLCAwKSk7CisgICAgICAgIHJlYWR5ID0gZmFsc2U7CisgICAgICAgIHNldHVwTWVzc2FnaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGRvUmVjb25uZWN0KCkgeworICAgICAgICBjbG9zZV9jaGFubmVsKCk7CisgICAgICAgIGlmKGNsb3NpbmcuZ2V0KCkpIHJldHVybjsKKyAgICAgICAgYm9vdHN0cmFwLmNvbm5lY3QocmVtb3RlX2FkZHIpOworICAgIH0KKworICAgIHN5bmNocm9uaXplZCB2b2lkIGNsb3NlX2NoYW5uZWwoKSB7CisgICAgICAgIGlmIChjaGFubmVsUmVmLmdldCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNoYW5uZWxSZWYuZ2V0KCkuY2xvc2UoKTsKKyAgICAgICAgICAgIExPRy5kZWJ1ZygiY2hhbm5lbCB7fSBjbG9zZWQiLCByZW1vdGVfYWRkcik7CisgICAgICAgICAgICBjaGFubmVsUmVmLnNldChudWxsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgICAgICBjbG9zZV9jaGFubmVsKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL29yZy9hcGFjaGUvc3Rvcm0vcGFjZW1ha2VyL1BhY2VtYWtlckNsaWVudEhhbmRsZXIuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9vcmcvYXBhY2hlL3N0b3JtL3BhY2VtYWtlci9QYWNlbWFrZXJDbGllbnRIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJjZmRlNgotLS0gL2Rldi9udWxsCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9vcmcvYXBhY2hlL3N0b3JtL3BhY2VtYWtlci9QYWNlbWFrZXJDbGllbnRIYW5kbGVyLmphdmEKQEAgLTAsMCArMSw3NSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5zdG9ybS5wYWNlbWFrZXI7CisKK2ltcG9ydCBvcmcuamJvc3MubmV0dHkuY2hhbm5lbC5TaW1wbGVDaGFubmVsVXBzdHJlYW1IYW5kbGVyOworaW1wb3J0IG9yZy5qYm9zcy5uZXR0eS5jaGFubmVsLkNoYW5uZWxIYW5kbGVyQ29udGV4dDsKK2ltcG9ydCBvcmcuamJvc3MubmV0dHkuY2hhbm5lbC5DaGFubmVsU3RhdGVFdmVudDsKK2ltcG9ydCBvcmcuamJvc3MubmV0dHkuY2hhbm5lbC5FeGNlcHRpb25FdmVudDsKK2ltcG9ydCBvcmcuamJvc3MubmV0dHkuY2hhbm5lbC5NZXNzYWdlRXZlbnQ7CitpbXBvcnQgb3JnLmpib3NzLm5ldHR5LmNoYW5uZWwuQ2hhbm5lbDsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5nZW5lcmF0ZWQuSEJNZXNzYWdlOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0ubWVzc2FnaW5nLm5ldHR5LkNvbnRyb2xNZXNzYWdlOworCitwdWJsaWMgY2xhc3MgUGFjZW1ha2VyQ2xpZW50SGFuZGxlciBleHRlbmRzIFNpbXBsZUNoYW5uZWxVcHN0cmVhbUhhbmRsZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihQYWNlbWFrZXJDbGllbnRIYW5kbGVyLmNsYXNzKTsKKworICAgIHByaXZhdGUgUGFjZW1ha2VyQ2xpZW50IGNsaWVudDsKKworCisKKyAgICBwdWJsaWMgUGFjZW1ha2VyQ2xpZW50SGFuZGxlcihQYWNlbWFrZXJDbGllbnQgY2xpZW50KSB7CisgICAgICAgIHRoaXMuY2xpZW50ID0gY2xpZW50OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNoYW5uZWxDb25uZWN0ZWQoQ2hhbm5lbEhhbmRsZXJDb250ZXh0IGN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5uZWxTdGF0ZUV2ZW50IGV2ZW50KSB7CisgICAgICAgIC8vIHJlZ2lzdGVyIHRoZSBuZXdseSBlc3RhYmxpc2hlZCBjaGFubmVsCisgICAgICAgIENoYW5uZWwgY2hhbm5lbCA9IGN0eC5nZXRDaGFubmVsKCk7CisgICAgICAgIGNsaWVudC5jaGFubmVsQ29ubmVjdGVkKGNoYW5uZWwpOworCisgICAgICAgIExPRy5pbmZvKCJDb25uZWN0aW9uIGVzdGFibGlzaGVkIGZyb20ge30gdG8ge30iLAorICAgICAgICAgICAgICAgICBjaGFubmVsLmdldExvY2FsQWRkcmVzcygpLCBjaGFubmVsLmdldFJlbW90ZUFkZHJlc3MoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgbWVzc2FnZVJlY2VpdmVkKENoYW5uZWxIYW5kbGVyQ29udGV4dCBjdHgsIE1lc3NhZ2VFdmVudCBldmVudCkgeworICAgICAgICBMT0cuZGVidWcoIkdvdCBNZXNzYWdlOiB7fSIsIGV2ZW50LmdldE1lc3NhZ2UoKS50b1N0cmluZygpKTsKKyAgICAgICAgT2JqZWN0IGV2bSA9IGV2ZW50LmdldE1lc3NhZ2UoKTsKKworICAgICAgICBpZihldm0gaW5zdGFuY2VvZiBDb250cm9sTWVzc2FnZSkgeworICAgICAgICAgICAgTE9HLmRlYnVnKCJHb3QgY29udHJvbCBtZXNzYWdlOiB7fSIsIGV2bS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKGV2bSBpbnN0YW5jZW9mIEhCTWVzc2FnZSkgeworICAgICAgICAgICAgY2xpZW50LmdvdE1lc3NhZ2UoKEhCTWVzc2FnZSlldm0pOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgTE9HLndhcm4oIkdvdCB1bmV4cGVjdGVkIG1lc3NhZ2U6IHt9IGZyb20gc2VydmVyLiIsIGV2bSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBleGNlcHRpb25DYXVnaHQoQ2hhbm5lbEhhbmRsZXJDb250ZXh0IGN0eCwgRXhjZXB0aW9uRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgTE9HLmVycm9yKCJDb25uZWN0aW9uIHRvIHBhY2VtYWtlciBmYWlsZWQiLCBldmVudC5nZXRDYXVzZSgpKTsKKyAgICAgICAgY2xpZW50LnJlY29ubmVjdCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9vcmcvYXBhY2hlL3N0b3JtL3BhY2VtYWtlci9QYWNlbWFrZXJTZXJ2ZXIuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9vcmcvYXBhY2hlL3N0b3JtL3BhY2VtYWtlci9QYWNlbWFrZXJTZXJ2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDIyZGJhCi0tLSAvZGV2L251bGwKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL29yZy9hcGFjaGUvc3Rvcm0vcGFjZW1ha2VyL1BhY2VtYWtlclNlcnZlci5qYXZhCkBAIC0wLDAgKzEsMTYzIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnN0b3JtLnBhY2VtYWtlcjsKKworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLkNvbmZpZzsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5nZW5lcmF0ZWQuSEJNZXNzYWdlOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLm1lc3NhZ2luZy5uZXR0eS5JU2FzbFNlcnZlcjsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5tZXNzYWdpbmcubmV0dHkuTmV0dHlSZW5hbWVUaHJlYWRGYWN0b3J5OworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnNlY3VyaXR5LmF1dGguQXV0aFV0aWxzOworaW1wb3J0IGphdmEubGFuZy5JbnRlcnJ1cHRlZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0U29ja2V0QWRkcmVzczsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRTa2lwTGlzdFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkRmFjdG9yeTsKK2ltcG9ydCBqYXZheC5zZWN1cml0eS5hdXRoLmxvZ2luLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5zdG9ybS5wYWNlbWFrZXIuY29kZWMuVGhyaWZ0TmV0dHlTZXJ2ZXJDb2RlYzsKK2ltcG9ydCBvcmcuamJvc3MubmV0dHkuYm9vdHN0cmFwLlNlcnZlckJvb3RzdHJhcDsKK2ltcG9ydCBvcmcuamJvc3MubmV0dHkuY2hhbm5lbC5DaGFubmVsOworaW1wb3J0IG9yZy5qYm9zcy5uZXR0eS5jaGFubmVsLkNoYW5uZWxQaXBlbGluZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmpib3NzLm5ldHR5LmNoYW5uZWwuZ3JvdXAuQ2hhbm5lbEdyb3VwOworaW1wb3J0IG9yZy5qYm9zcy5uZXR0eS5jaGFubmVsLmdyb3VwLkRlZmF1bHRDaGFubmVsR3JvdXA7CitpbXBvcnQgb3JnLmpib3NzLm5ldHR5LmNoYW5uZWwuc29ja2V0Lm5pby5OaW9TZXJ2ZXJTb2NrZXRDaGFubmVsRmFjdG9yeTsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitjbGFzcyBQYWNlbWFrZXJTZXJ2ZXIgaW1wbGVtZW50cyBJU2FzbFNlcnZlciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEZJVkVfTUJfSU5fQllURVMgPSA1ICogMTAyNCAqIDEwMjQ7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoUGFjZW1ha2VyU2VydmVyLmNsYXNzKTsKKworICAgIHByaXZhdGUgZmluYWwgU2VydmVyQm9vdHN0cmFwIGJvb3RzdHJhcDsKKyAgICBwcml2YXRlIGludCBwb3J0OworICAgIHByaXZhdGUgSVNlcnZlck1lc3NhZ2VIYW5kbGVyIGhhbmRsZXI7CisgICAgcHJpdmF0ZSBTdHJpbmcgc2VjcmV0OworICAgIHByaXZhdGUgU3RyaW5nIHRvcG9fbmFtZTsKKyAgICBwcml2YXRlIHZvbGF0aWxlIENoYW5uZWxHcm91cCBhbGxDaGFubmVscyA9IG5ldyBEZWZhdWx0Q2hhbm5lbEdyb3VwKCJzdG9ybS1zZXJ2ZXIiKTsKKyAgICBwcml2YXRlIENvbmN1cnJlbnRTa2lwTGlzdFNldDxDaGFubmVsPiBhdXRoZW50aWNhdGVkX2NoYW5uZWxzID0gbmV3IENvbmN1cnJlbnRTa2lwTGlzdFNldDxDaGFubmVsPigpOworICAgIHByaXZhdGUgVGhyaWZ0TmV0dHlTZXJ2ZXJDb2RlYy5BdXRoTWV0aG9kIGF1dGhNZXRob2Q7CisKKyAgICBwdWJsaWMgUGFjZW1ha2VyU2VydmVyKElTZXJ2ZXJNZXNzYWdlSGFuZGxlciBoYW5kbGVyLCBNYXAgY29uZmlnKXsKKyAgICAgICAgaW50IG1heFdvcmtlcnMgPSAoaW50KWNvbmZpZy5nZXQoQ29uZmlnLlBBQ0VNQUtFUl9NQVhfVEhSRUFEUyk7CisgICAgICAgIHRoaXMucG9ydCA9IChpbnQpY29uZmlnLmdldChDb25maWcuUEFDRU1BS0VSX1BPUlQpOworICAgICAgICB0aGlzLmhhbmRsZXIgPSBoYW5kbGVyOworICAgICAgICB0aGlzLnRvcG9fbmFtZSA9ICJwYWNlbWFrZXJfc2VydmVyIjsKKworICAgICAgICBTdHJpbmcgYXV0aCA9IChTdHJpbmcpY29uZmlnLmdldChDb25maWcuUEFDRU1BS0VSX0FVVEhfTUVUSE9EKTsKKyAgICAgICAgc3dpdGNoKGF1dGgpIHsKKworICAgICAgICBjYXNlICJESUdFU1QiOgorICAgICAgICAgICAgQ29uZmlndXJhdGlvbiBsb2dpbl9jb25mID0gQXV0aFV0aWxzLkdldENvbmZpZ3VyYXRpb24oY29uZmlnKTsKKyAgICAgICAgICAgIGF1dGhNZXRob2QgPSBUaHJpZnROZXR0eVNlcnZlckNvZGVjLkF1dGhNZXRob2QuRElHRVNUOworICAgICAgICAgICAgdGhpcy5zZWNyZXQgPSBBdXRoVXRpbHMubWFrZURpZ2VzdFBheWxvYWQobG9naW5fY29uZiwgQXV0aFV0aWxzLkxPR0lOX0NPTlRFWFRfUEFDRU1BS0VSX0RJR0VTVCk7CisgICAgICAgICAgICBpZih0aGlzLnNlY3JldCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgTE9HLmVycm9yKCJDYW4ndCBzdGFydCBwYWNlbWFrZXIgc2VydmVyIHdpdGhvdXQgZGlnZXN0IHNlY3JldC4iKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ2FuJ3Qgc3RhcnQgcGFjZW1ha2VyIHNlcnZlciB3aXRob3V0IGRpZ2VzdCBzZWNyZXQuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICJLRVJCRVJPUyI6CisgICAgICAgICAgICBhdXRoTWV0aG9kID0gVGhyaWZ0TmV0dHlTZXJ2ZXJDb2RlYy5BdXRoTWV0aG9kLktFUkJFUk9TOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAiTk9ORSI6CisgICAgICAgICAgICBhdXRoTWV0aG9kID0gVGhyaWZ0TmV0dHlTZXJ2ZXJDb2RlYy5BdXRoTWV0aG9kLk5PTkU7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HLmVycm9yKCJDYW4ndCBzdGFydCBwYWNlbWFrZXIgc2VydmVyIHdpdGhvdXQgcHJvcGVyIFBBQ0VNQUtFUl9BVVRIX01FVEhPRC4iKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDYW4ndCBzdGFydCBwYWNlbWFrZXIgc2VydmVyIHdpdGhvdXQgcHJvcGVyIFBBQ0VNQUtFUl9BVVRIX01FVEhPRC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIFRocmVhZEZhY3RvcnkgYm9zc0ZhY3RvcnkgPSBuZXcgTmV0dHlSZW5hbWVUaHJlYWRGYWN0b3J5KCJzZXJ2ZXItYm9zcyIpOworICAgICAgICBUaHJlYWRGYWN0b3J5IHdvcmtlckZhY3RvcnkgPSBuZXcgTmV0dHlSZW5hbWVUaHJlYWRGYWN0b3J5KCJzZXJ2ZXItd29ya2VyIik7CisgICAgICAgIE5pb1NlcnZlclNvY2tldENoYW5uZWxGYWN0b3J5IGZhY3Rvcnk7CisgICAgICAgIGlmKG1heFdvcmtlcnMgPiAwKSB7CisgICAgICAgICAgICBmYWN0b3J5ID0KKyAgICAgICAgICAgICAgICBuZXcgTmlvU2VydmVyU29ja2V0Q2hhbm5lbEZhY3RvcnkoRXhlY3V0b3JzLm5ld0NhY2hlZFRocmVhZFBvb2woYm9zc0ZhY3RvcnkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGVjdXRvcnMubmV3Q2FjaGVkVGhyZWFkUG9vbCh3b3JrZXJGYWN0b3J5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4V29ya2Vycyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBmYWN0b3J5ID0KKyAgICAgICAgICAgICAgICBuZXcgTmlvU2VydmVyU29ja2V0Q2hhbm5lbEZhY3RvcnkoRXhlY3V0b3JzLm5ld0NhY2hlZFRocmVhZFBvb2woYm9zc0ZhY3RvcnkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGVjdXRvcnMubmV3Q2FjaGVkVGhyZWFkUG9vbCh3b3JrZXJGYWN0b3J5KSk7CisgICAgICAgIH0KKworICAgICAgICBib290c3RyYXAgPSBuZXcgU2VydmVyQm9vdHN0cmFwKGZhY3RvcnkpOworICAgICAgICBib290c3RyYXAuc2V0T3B0aW9uKCJ0Y3BOb0RlbGF5IiwgdHJ1ZSk7CisgICAgICAgIGJvb3RzdHJhcC5zZXRPcHRpb24oInNlbmRCdWZmZXJTaXplIiwgRklWRV9NQl9JTl9CWVRFUyk7CisgICAgICAgIGJvb3RzdHJhcC5zZXRPcHRpb24oImtlZXBBbGl2ZSIsIHRydWUpOworCisgICAgICAgIENoYW5uZWxQaXBlbGluZUZhY3RvcnkgcGlwZWxpbmVGYWN0b3J5ID0gbmV3IFRocmlmdE5ldHR5U2VydmVyQ29kZWModGhpcywgY29uZmlnLCBhdXRoTWV0aG9kKS5waXBlbGluZUZhY3RvcnkoKTsKKyAgICAgICAgYm9vdHN0cmFwLnNldFBpcGVsaW5lRmFjdG9yeShwaXBlbGluZUZhY3RvcnkpOworICAgICAgICBDaGFubmVsIGNoYW5uZWwgPSBib290c3RyYXAuYmluZChuZXcgSW5ldFNvY2tldEFkZHJlc3MocG9ydCkpOworICAgICAgICBhbGxDaGFubmVscy5hZGQoY2hhbm5lbCk7CisgICAgICAgIExPRy5pbmZvKCJCb3VuZCBzZXJ2ZXIgdG8gcG9ydDoge30iLCBJbnRlZ2VyLnRvU3RyaW5nKHBvcnQpKTsKKyAgICB9CisKKyAgICAvKiogSW1wbGVtZW50aW5nIElTZXJ2ZXIuICoqLworICAgIHB1YmxpYyB2b2lkIGNoYW5uZWxDb25uZWN0ZWQoQ2hhbm5lbCBjKSB7CisgICAgICAgIGFsbENoYW5uZWxzLmFkZChjKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbGVhblBpcGVsaW5lKENoYW5uZWwgY2hhbm5lbCkgeworICAgICAgICBib29sZWFuIGF1dGhlbnRpY2F0ZWQgPSBhdXRoZW50aWNhdGVkX2NoYW5uZWxzLmNvbnRhaW5zKGNoYW5uZWwpOworICAgICAgICBpZighYXV0aGVudGljYXRlZCkgeworICAgICAgICAgICAgaWYoY2hhbm5lbC5nZXRQaXBlbGluZSgpLmdldChUaHJpZnROZXR0eVNlcnZlckNvZGVjLlNBU0xfSEFORExFUikgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNoYW5uZWwuZ2V0UGlwZWxpbmUoKS5yZW1vdmUoVGhyaWZ0TmV0dHlTZXJ2ZXJDb2RlYy5TQVNMX0hBTkRMRVIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZihjaGFubmVsLmdldFBpcGVsaW5lKCkuZ2V0KFRocmlmdE5ldHR5U2VydmVyQ29kZWMuS0VSQkVST1NfSEFORExFUikgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNoYW5uZWwuZ2V0UGlwZWxpbmUoKS5yZW1vdmUoVGhyaWZ0TmV0dHlTZXJ2ZXJDb2RlYy5LRVJCRVJPU19IQU5ETEVSKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlY2VpdmVkKE9iamVjdCBtZXNnLCBTdHJpbmcgcmVtb3RlLCBDaGFubmVsIGNoYW5uZWwpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGNsZWFuUGlwZWxpbmUoY2hhbm5lbCk7CisKKyAgICAgICAgYm9vbGVhbiBhdXRoZW50aWNhdGVkID0gKGF1dGhNZXRob2QgPT0gVGhyaWZ0TmV0dHlTZXJ2ZXJDb2RlYy5BdXRoTWV0aG9kLk5PTkUpIHx8IGF1dGhlbnRpY2F0ZWRfY2hhbm5lbHMuY29udGFpbnMoY2hhbm5lbCk7CisgICAgICAgIEhCTWVzc2FnZSBtID0gKEhCTWVzc2FnZSltZXNnOworICAgICAgICBMT0cuZGVidWcoInJlY2VpdmVkIG1lc3NhZ2UuIFBhc3NpbmcgdG8gaGFuZGxlci4ge30gOiB7fSA6IHt9IiwKKyAgICAgICAgICAgICAgICAgIGhhbmRsZXIudG9TdHJpbmcoKSwgbS50b1N0cmluZygpLCBjaGFubmVsLnRvU3RyaW5nKCkpOworICAgICAgICBIQk1lc3NhZ2UgcmVzcG9uc2UgPSBoYW5kbGVyLmhhbmRsZU1lc3NhZ2UobSwgYXV0aGVudGljYXRlZCk7CisgICAgICAgIExPRy5kZWJ1ZygiR290IFJlc3BvbnNlIGZyb20gaGFuZGxlcjoge30iLCByZXNwb25zZS50b1N0cmluZygpKTsKKyAgICAgICAgY2hhbm5lbC53cml0ZShyZXNwb25zZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xvc2VDaGFubmVsKENoYW5uZWwgYykgeworICAgICAgICBjLmNsb3NlKCkuYXdhaXRVbmludGVycnVwdGlibHkoKTsKKyAgICAgICAgYWxsQ2hhbm5lbHMucmVtb3ZlKGMpOworICAgICAgICBhdXRoZW50aWNhdGVkX2NoYW5uZWxzLnJlbW92ZShjKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIG5hbWUoKSB7CisgICAgICAgIHJldHVybiB0b3BvX25hbWU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBzZWNyZXRLZXkoKSB7CisgICAgICAgIHJldHVybiBzZWNyZXQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYXV0aGVudGljYXRlZChDaGFubmVsIGMpIHsKKyAgICAgICAgTE9HLmRlYnVnKCJQYWNlbWFrZXIgc2VydmVyIGF1dGhlbnRpY2F0ZWQgY2hhbm5lbDoge30iLCBjLnRvU3RyaW5nKCkpOworICAgICAgICBhdXRoZW50aWNhdGVkX2NoYW5uZWxzLmFkZChjKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vb3JnL2FwYWNoZS9zdG9ybS9wYWNlbWFrZXIvY29kZWMvVGhyaWZ0RGVjb2Rlci5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL29yZy9hcGFjaGUvc3Rvcm0vcGFjZW1ha2VyL2NvZGVjL1RocmlmdERlY29kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTM1OTRhCi0tLSAvZGV2L251bGwKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL29yZy9hcGFjaGUvc3Rvcm0vcGFjZW1ha2VyL2NvZGVjL1RocmlmdERlY29kZXIuamF2YQpAQCAtMCwwICsxLDc2IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnN0b3JtLnBhY2VtYWtlci5jb2RlYzsKKworaW1wb3J0IG9yZy5qYm9zcy5uZXR0eS5oYW5kbGVyLmNvZGVjLmZyYW1lLkZyYW1lRGVjb2RlcjsKK2ltcG9ydCBvcmcuamJvc3MubmV0dHkuY2hhbm5lbC5DaGFubmVsSGFuZGxlckNvbnRleHQ7CitpbXBvcnQgb3JnLmpib3NzLm5ldHR5LmNoYW5uZWwuQ2hhbm5lbDsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5nZW5lcmF0ZWQuSEJNZXNzYWdlOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLmdlbmVyYXRlZC5IQlNlcnZlck1lc3NhZ2VUeXBlOworaW1wb3J0IG9yZy5qYm9zcy5uZXR0eS5idWZmZXIuQ2hhbm5lbEJ1ZmZlcjsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS51dGlscy5VdGlsczsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5tZXNzYWdpbmcubmV0dHkuQ29udHJvbE1lc3NhZ2U7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0ubWVzc2FnaW5nLm5ldHR5LlNhc2xNZXNzYWdlVG9rZW47CisKK3B1YmxpYyBjbGFzcyBUaHJpZnREZWNvZGVyIGV4dGVuZHMgRnJhbWVEZWNvZGVyIHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBPYmplY3QgZGVjb2RlKENoYW5uZWxIYW5kbGVyQ29udGV4dCBjdHgsIENoYW5uZWwgY2hhbm5lbCwgQ2hhbm5lbEJ1ZmZlciBidWYpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIGxvbmcgYXZhaWxhYmxlID0gYnVmLnJlYWRhYmxlQnl0ZXMoKTsKKyAgICAgICAgaWYoYXZhaWxhYmxlIDwgMikgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBidWYubWFya1JlYWRlckluZGV4KCk7CisKKyAgICAgICAgaW50IHRocmlmdExlbiA9IGJ1Zi5yZWFkSW50KCk7CisgICAgICAgIGF2YWlsYWJsZSAtPSA0OworCisgICAgICAgIGlmKGF2YWlsYWJsZSA8IHRocmlmdExlbikgeworICAgICAgICAgICAgLy8gV2UgaGF2ZW4ndCByZWNlaXZlZCB0aGUgZW50aXJlIG9iamVjdCB5ZXQsIHJldHVybiBhbmQgd2FpdCBmb3IgbW9yZSBieXRlcy4KKyAgICAgICAgICAgIGJ1Zi5yZXNldFJlYWRlckluZGV4KCk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIGJ1Zi5kaXNjYXJkUmVhZEJ5dGVzKCk7CisKKyAgICAgICAgSEJNZXNzYWdlIG07CisgICAgICAgIGlmKGJ1Zi5oYXNBcnJheSgpKSB7CisgICAgICAgICAgICBtID0gVXRpbHMudGhyaWZ0RGVzZXJpYWxpemUoSEJNZXNzYWdlLmNsYXNzLCBidWYuYXJyYXkoKSwgMCwgdGhyaWZ0TGVuKTsKKyAgICAgICAgICAgIGJ1Zi5yZWFkZXJJbmRleChidWYucmVhZGVySW5kZXgoKSArIHRocmlmdExlbik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBieXRlIHNlcmlhbGl6ZWRbXSA9IG5ldyBieXRlW3RocmlmdExlbl07CisgICAgICAgICAgICBidWYucmVhZEJ5dGVzKHNlcmlhbGl6ZWQsIDAsIHRocmlmdExlbik7CisgICAgICAgICAgICBtID0gVXRpbHMudGhyaWZ0RGVzZXJpYWxpemUoSEJNZXNzYWdlLmNsYXNzLCBzZXJpYWxpemVkKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKG0uZ2V0X3R5cGUoKSA9PSBIQlNlcnZlck1lc3NhZ2VUeXBlLkNPTlRST0xfTUVTU0FHRSkgeworICAgICAgICAgICAgQ29udHJvbE1lc3NhZ2UgY20gPSBDb250cm9sTWVzc2FnZS5yZWFkKG0uZ2V0X2RhdGEoKS5nZXRfbWVzc2FnZV9ibG9iKCkpOworICAgICAgICAgICAgcmV0dXJuIGNtOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYobS5nZXRfdHlwZSgpID09IEhCU2VydmVyTWVzc2FnZVR5cGUuU0FTTF9NRVNTQUdFX1RPS0VOKSB7CisgICAgICAgICAgICBTYXNsTWVzc2FnZVRva2VuIHNtID0gU2FzbE1lc3NhZ2VUb2tlbi5yZWFkKG0uZ2V0X2RhdGEoKS5nZXRfbWVzc2FnZV9ibG9iKCkpOworICAgICAgICAgICAgcmV0dXJuIHNtOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG07CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vb3JnL2FwYWNoZS9zdG9ybS9wYWNlbWFrZXIvY29kZWMvVGhyaWZ0RW5jb2Rlci5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL29yZy9hcGFjaGUvc3Rvcm0vcGFjZW1ha2VyL2NvZGVjL1RocmlmdEVuY29kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjkxMmYyCi0tLSAvZGV2L251bGwKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL29yZy9hcGFjaGUvc3Rvcm0vcGFjZW1ha2VyL2NvZGVjL1RocmlmdEVuY29kZXIuamF2YQpAQCAtMCwwICsxLDExMCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5zdG9ybS5wYWNlbWFrZXIuY29kZWM7CisKK2ltcG9ydCBvcmcuamJvc3MubmV0dHkuaGFuZGxlci5jb2RlYy5vbmVvbmUuT25lVG9PbmVFbmNvZGVyOworaW1wb3J0IG9yZy5qYm9zcy5uZXR0eS5jaGFubmVsLkNoYW5uZWxIYW5kbGVyQ29udGV4dDsKK2ltcG9ydCBvcmcuamJvc3MubmV0dHkuY2hhbm5lbC5DaGFubmVsOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLmdlbmVyYXRlZC5IQk1lc3NhZ2U7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0uZ2VuZXJhdGVkLkhCTWVzc2FnZURhdGE7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0uZ2VuZXJhdGVkLkhCU2VydmVyTWVzc2FnZVR5cGU7CitpbXBvcnQgb3JnLmpib3NzLm5ldHR5LmJ1ZmZlci5DaGFubmVsQnVmZmVyczsKK2ltcG9ydCBvcmcuamJvc3MubmV0dHkuYnVmZmVyLkNoYW5uZWxCdWZmZXI7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0udXRpbHMuVXRpbHM7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0ubWVzc2FnaW5nLm5ldHR5LkNvbnRyb2xNZXNzYWdlOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLm1lc3NhZ2luZy5uZXR0eS5TYXNsTWVzc2FnZVRva2VuOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLm1lc3NhZ2luZy5uZXR0eS5JTmV0dHlTZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlOworCitwdWJsaWMgY2xhc3MgVGhyaWZ0RW5jb2RlciBleHRlbmRzIE9uZVRvT25lRW5jb2RlciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyRmFjdG9yeQorICAgICAgICAuZ2V0TG9nZ2VyKFRocmlmdEVuY29kZXIuY2xhc3MpOworCisgICAgcHJpdmF0ZSBIQk1lc3NhZ2UgZW5jb2RlTmV0dHlTZXJpYWxpemFibGUoSU5ldHR5U2VyaWFsaXphYmxlIG5ldHR5X21lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEJTZXJ2ZXJNZXNzYWdlVHlwZSBtVHlwZSkgeworICAgICAgICAKKyAgICAgICAgSEJNZXNzYWdlRGF0YSBtZXNzYWdlX2RhdGEgPSBuZXcgSEJNZXNzYWdlRGF0YSgpOworICAgICAgICBIQk1lc3NhZ2UgbSA9IG5ldyBIQk1lc3NhZ2UoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENoYW5uZWxCdWZmZXIgY2J1ZmZlciA9IG5ldHR5X21lc3NhZ2UuYnVmZmVyKCk7CisgICAgICAgICAgICBpZihjYnVmZmVyLmhhc0FycmF5KCkpIHsKKyAgICAgICAgICAgICAgICBtZXNzYWdlX2RhdGEuc2V0X21lc3NhZ2VfYmxvYihjYnVmZmVyLmFycmF5KCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgYnl0ZSBidWZmW10gPSBuZXcgYnl0ZVtuZXR0eV9tZXNzYWdlLmVuY29kZUxlbmd0aCgpXTsKKyAgICAgICAgICAgICAgICBjYnVmZmVyLnJlYWRCeXRlcyhidWZmLCAwLCBuZXR0eV9tZXNzYWdlLmVuY29kZUxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICBtZXNzYWdlX2RhdGEuc2V0X21lc3NhZ2VfYmxvYihidWZmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG0uc2V0X3R5cGUobVR5cGUpOworICAgICAgICAgICAgbS5zZXRfZGF0YShtZXNzYWdlX2RhdGEpOworICAgICAgICAgICAgcmV0dXJuIG07CisgICAgICAgIH0KKyAgICAgICAgY2F0Y2goIElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExPRy5lcnJvcigiRmFpbGVkIHRvIGVuY29kZSBOZXR0eVNlcmlhbGl6YWJsZTogIiwgZSk7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBPYmplY3QgZW5jb2RlKENoYW5uZWxIYW5kbGVyQ29udGV4dCBjdHgsIENoYW5uZWwgY2hhbm5lbCwgT2JqZWN0IG1zZykgeworICAgICAgICBpZihtc2cgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBMT0cuZGVidWcoIlRyeWluZyB0byBlbmNvZGU6ICIgKyBtc2cuZ2V0Q2xhc3MoKS50b1N0cmluZygpICsgIiA6ICIgKyBtc2cudG9TdHJpbmcoKSk7CisKKyAgICAgICAgSEJNZXNzYWdlIG07CisgICAgICAgIGlmKG1zZyBpbnN0YW5jZW9mIElOZXR0eVNlcmlhbGl6YWJsZSkgeworICAgICAgICAgICAgSU5ldHR5U2VyaWFsaXphYmxlIG5ldHR5TXNnID0gKElOZXR0eVNlcmlhbGl6YWJsZSltc2c7CisKKyAgICAgICAgICAgIEhCU2VydmVyTWVzc2FnZVR5cGUgdHlwZTsKKyAgICAgICAgICAgIGlmKG1zZyBpbnN0YW5jZW9mIENvbnRyb2xNZXNzYWdlKSB7CisgICAgICAgICAgICAgICAgdHlwZSA9IEhCU2VydmVyTWVzc2FnZVR5cGUuQ09OVFJPTF9NRVNTQUdFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZihtc2cgaW5zdGFuY2VvZiBTYXNsTWVzc2FnZVRva2VuKSB7CisgICAgICAgICAgICAgICAgdHlwZSA9IEhCU2VydmVyTWVzc2FnZVR5cGUuU0FTTF9NRVNTQUdFX1RPS0VOOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HLmVycm9yKCJEaWRuJ3QgcmVjb2duaXNlIElOZXR0eVNlcmlhbGl6YWJsZTogIiArIG5ldHR5TXNnLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbnJlY29nbml6ZWQgSU5ldHR5U2VyaWFsaXphYmxlLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbSA9IGVuY29kZU5ldHR5U2VyaWFsaXphYmxlKG5ldHR5TXNnLCB0eXBlKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG0gPSAoSEJNZXNzYWdlKW1zZzsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBieXRlIHNlcmlhbGl6ZWRbXSA9IFV0aWxzLnRocmlmdFNlcmlhbGl6ZShtKTsKKyAgICAgICAgICAgIENoYW5uZWxCdWZmZXIgcmV0ID0gQ2hhbm5lbEJ1ZmZlcnMuZGlyZWN0QnVmZmVyKHNlcmlhbGl6ZWQubGVuZ3RoICsgNCk7CisKKyAgICAgICAgICAgIHJldC53cml0ZUludChzZXJpYWxpemVkLmxlbmd0aCk7CisgICAgICAgICAgICByZXQud3JpdGVCeXRlcyhzZXJpYWxpemVkKTsKKworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0cuZXJyb3IoIkZhaWxlZCB0byBzZXJpYWxpemUuIiwgZSk7CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL29yZy9hcGFjaGUvc3Rvcm0vcGFjZW1ha2VyL2NvZGVjL1RocmlmdE5ldHR5Q2xpZW50Q29kZWMuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9vcmcvYXBhY2hlL3N0b3JtL3BhY2VtYWtlci9jb2RlYy9UaHJpZnROZXR0eUNsaWVudENvZGVjLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJhOTBmZAotLS0gL2Rldi9udWxsCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9vcmcvYXBhY2hlL3N0b3JtL3BhY2VtYWtlci9jb2RlYy9UaHJpZnROZXR0eUNsaWVudENvZGVjLmphdmEKQEAgLTAsMCArMSw5NCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS5zdG9ybS5wYWNlbWFrZXIuY29kZWM7CisKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5tZXNzYWdpbmcubmV0dHkuS2VyYmVyb3NTYXNsQ2xpZW50SGFuZGxlcjsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5tZXNzYWdpbmcubmV0dHkuU2FzbFN0b3JtQ2xpZW50SGFuZGxlcjsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5zZWN1cml0eS5hdXRoLkF1dGhVdGlsczsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgb3JnLmFwYWNoZS5zdG9ybS5wYWNlbWFrZXIuUGFjZW1ha2VyQ2xpZW50OworaW1wb3J0IG9yZy5hcGFjaGUuc3Rvcm0ucGFjZW1ha2VyLlBhY2VtYWtlckNsaWVudEhhbmRsZXI7CitpbXBvcnQgb3JnLmpib3NzLm5ldHR5LmNoYW5uZWwuQ2hhbm5lbFBpcGVsaW5lOworaW1wb3J0IG9yZy5qYm9zcy5uZXR0eS5jaGFubmVsLkNoYW5uZWxQaXBlbGluZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmpib3NzLm5ldHR5LmNoYW5uZWwuQ2hhbm5lbHM7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKKworcHVibGljIGNsYXNzIFRocmlmdE5ldHR5Q2xpZW50Q29kZWMgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0FTTF9IQU5ETEVSID0gInNhc2wtaGFuZGxlciI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VSQkVST1NfSEFORExFUiA9ICJrZXJiZXJvcy1oYW5kbGVyIjsKKyAgICAKKyAgICBwdWJsaWMgZW51bSBBdXRoTWV0aG9kIHsKKyAgICAgICAgRElHRVNULAorICAgICAgICBLRVJCRVJPUywKKyAgICAgICAgTk9ORQorICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyRmFjdG9yeQorICAgICAgICAuZ2V0TG9nZ2VyKFRocmlmdE5ldHR5Q2xpZW50Q29kZWMuY2xhc3MpOworCisgICAgcHJpdmF0ZSBQYWNlbWFrZXJDbGllbnQgY2xpZW50OworICAgIHByaXZhdGUgQXV0aE1ldGhvZCBhdXRoTWV0aG9kOworICAgIHByaXZhdGUgTWFwIHN0b3JtX2NvbmY7CisKKyAgICBwdWJsaWMgVGhyaWZ0TmV0dHlDbGllbnRDb2RlYyhQYWNlbWFrZXJDbGllbnQgcGFjZW1ha2VyX2NsaWVudCwgTWFwIHN0b3JtX2NvbmYsIEF1dGhNZXRob2QgYXV0aE1ldGhvZCkgeworICAgICAgICBjbGllbnQgPSBwYWNlbWFrZXJfY2xpZW50OworICAgICAgICB0aGlzLmF1dGhNZXRob2QgPSBhdXRoTWV0aG9kOworICAgICAgICB0aGlzLnN0b3JtX2NvbmYgPSBzdG9ybV9jb25mOworICAgIH0KKworICAgIHB1YmxpYyBDaGFubmVsUGlwZWxpbmVGYWN0b3J5IHBpcGVsaW5lRmFjdG9yeSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDaGFubmVsUGlwZWxpbmVGYWN0b3J5KCkgeworICAgICAgICAgICAgcHVibGljIENoYW5uZWxQaXBlbGluZSBnZXRQaXBlbGluZSgpIHsKKyAgICAgICAgICAgICAgICBDaGFubmVsUGlwZWxpbmUgcGlwZWxpbmUgPSBDaGFubmVscy5waXBlbGluZSgpOworICAgICAgICAgICAgICAgIHBpcGVsaW5lLmFkZExhc3QoImVuY29kZXIiLCBuZXcgVGhyaWZ0RW5jb2RlcigpKTsKKyAgICAgICAgICAgICAgICBwaXBlbGluZS5hZGRMYXN0KCJkZWNvZGVyIiwgbmV3IFRocmlmdERlY29kZXIoKSk7CisKKyAgICAgICAgICAgICAgICBpZiAoYXV0aE1ldGhvZCA9PSBBdXRoTWV0aG9kLktFUkJFUk9TKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0cuZGVidWcoIkFkZGluZyBLZXJiZXJvc1Nhc2xDbGllbnRIYW5kbGVyIHRvIHBhY2VtYWtlciBjbGllbnQgcGlwZWxpbmUuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBwaXBlbGluZS5hZGRMYXN0KEtFUkJFUk9TX0hBTkRMRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBLZXJiZXJvc1Nhc2xDbGllbnRIYW5kbGVyKGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rvcm1fY29uZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXV0aFV0aWxzLkxPR0lOX0NPTlRFWFRfUEFDRU1BS0VSX0NMSUVOVCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKGF1dGhNZXRob2QgPT0gQXV0aE1ldGhvZC5ESUdFU1QpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPRy5kZWJ1ZygiQWRkaW5nIFNhc2xTdG9ybUNsaWVudEhhbmRsZXIgdG8gcGFjZW1ha2VyIGNsaWVudCBwaXBlbGluZS4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lLmFkZExhc3QoU0FTTF9IQU5ETEVSLCBuZXcgU2FzbFN0b3JtQ2xpZW50SGFuZGxlcihjbGllbnQpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNsaWVudC5jaGFubmVsUmVhZHkoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwaXBlbGluZS5hZGRMYXN0KCJQYWNlbWFrZXJDbGllbnRIYW5kbGVyIiwgbmV3IFBhY2VtYWtlckNsaWVudEhhbmRsZXIoY2xpZW50KSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHBpcGVsaW5lOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9vcmcvYXBhY2hlL3N0b3JtL3BhY2VtYWtlci9jb2RlYy9UaHJpZnROZXR0eVNlcnZlckNvZGVjLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vb3JnL2FwYWNoZS9zdG9ybS9wYWNlbWFrZXIvY29kZWMvVGhyaWZ0TmV0dHlTZXJ2ZXJDb2RlYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxY2EwMGUKLS0tIC9kZXYvbnVsbAorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vb3JnL2FwYWNoZS9zdG9ybS9wYWNlbWFrZXIvY29kZWMvVGhyaWZ0TmV0dHlTZXJ2ZXJDb2RlYy5qYXZhCkBAIC0wLDAgKzEsOTkgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUuc3Rvcm0ucGFjZW1ha2VyLmNvZGVjOworCitpbXBvcnQgYmFja3R5cGUuc3Rvcm0uQ29uZmlnOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLm1lc3NhZ2luZy5uZXR0eS5JU2FzbFNlcnZlcjsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5tZXNzYWdpbmcubmV0dHkuSVNlcnZlcjsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5tZXNzYWdpbmcubmV0dHkuS2VyYmVyb3NTYXNsU2VydmVySGFuZGxlcjsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5tZXNzYWdpbmcubmV0dHkuU2FzbFN0b3JtU2VydmVySGFuZGxlcjsKK2ltcG9ydCBiYWNrdHlwZS5zdG9ybS5tZXNzYWdpbmcubmV0dHkuU3Rvcm1TZXJ2ZXJIYW5kbGVyOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnNlY3VyaXR5LmF1dGguQXV0aFV0aWxzOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IG9yZy5qYm9zcy5uZXR0eS5jaGFubmVsLkNoYW5uZWxQaXBlbGluZTsKK2ltcG9ydCBvcmcuamJvc3MubmV0dHkuY2hhbm5lbC5DaGFubmVsUGlwZWxpbmVGYWN0b3J5OworaW1wb3J0IG9yZy5qYm9zcy5uZXR0eS5jaGFubmVsLkNoYW5uZWxzOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CitpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CisKK3B1YmxpYyBjbGFzcyBUaHJpZnROZXR0eVNlcnZlckNvZGVjIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNBU0xfSEFORExFUiA9ICJzYXNsLWhhbmRsZXIiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFUkJFUk9TX0hBTkRMRVIgPSAia2VyYmVyb3MtaGFuZGxlciI7CisgICAgCisgICAgcHVibGljIGVudW0gQXV0aE1ldGhvZCB7CisgICAgICAgIERJR0VTVCwKKyAgICAgICAgS0VSQkVST1MsCisgICAgICAgIE5PTkUKKyAgICB9OworICAgIAorICAgIHByaXZhdGUgSVNlcnZlciBzZXJ2ZXI7CisgICAgcHJpdmF0ZSBBdXRoTWV0aG9kIGF1dGhNZXRob2Q7CisgICAgcHJpdmF0ZSBNYXAgc3Rvcm1fY29uZjsKKyAgICAKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyRmFjdG9yeQorICAgICAgICAuZ2V0TG9nZ2VyKFRocmlmdE5ldHR5U2VydmVyQ29kZWMuY2xhc3MpOworCisgICAgcHVibGljIFRocmlmdE5ldHR5U2VydmVyQ29kZWMoSVNlcnZlciBzZXJ2ZXIsIE1hcCBzdG9ybV9jb25mLCBBdXRoTWV0aG9kIGF1dGhNZXRob2QpIHsKKyAgICAgICAgdGhpcy5zZXJ2ZXIgPSBzZXJ2ZXI7CisgICAgICAgIHRoaXMuYXV0aE1ldGhvZCA9IGF1dGhNZXRob2Q7CisgICAgICAgIHRoaXMuc3Rvcm1fY29uZiA9IHN0b3JtX2NvbmY7CisgICAgfQorCisgICAgcHVibGljIENoYW5uZWxQaXBlbGluZUZhY3RvcnkgcGlwZWxpbmVGYWN0b3J5KCkgeworICAgICAgICByZXR1cm4gbmV3IENoYW5uZWxQaXBlbGluZUZhY3RvcnkoKSB7CisgICAgICAgICAgICBwdWJsaWMgQ2hhbm5lbFBpcGVsaW5lIGdldFBpcGVsaW5lKCkgeworCisgICAgICAgICAgICAgICAgQ2hhbm5lbFBpcGVsaW5lIHBpcGVsaW5lID0gQ2hhbm5lbHMucGlwZWxpbmUoKTsKKyAgICAgICAgICAgICAgICBwaXBlbGluZS5hZGRMYXN0KCJlbmNvZGVyIiwgbmV3IFRocmlmdEVuY29kZXIoKSk7CisgICAgICAgICAgICAgICAgcGlwZWxpbmUuYWRkTGFzdCgiZGVjb2RlciIsIG5ldyBUaHJpZnREZWNvZGVyKCkpOworICAgICAgICAgICAgICAgIGlmKGF1dGhNZXRob2QgPT0gQXV0aE1ldGhvZC5ESUdFU1QpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPRy5kZWJ1ZygiQWRkaW5nIFNhc2xTdG9ybVNlcnZlckhhbmRsZXIgdG8gcGFjZW1ha2VyIHNlcnZlciBwaXBlbGluZS4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lLmFkZExhc3QoU0FTTF9IQU5ETEVSLCBuZXcgU2FzbFN0b3JtU2VydmVySGFuZGxlcigoSVNhc2xTZXJ2ZXIpc2VydmVyKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYoYXV0aE1ldGhvZCA9PSBBdXRoTWV0aG9kLktFUkJFUk9TKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0cuZGVidWcoIkFkZGluZyBLZXJiZXJvc1Nhc2xTZXJ2ZXJIYW5kbGVyIHRvIHBhY2VtYWtlciBzZXJ2ZXIgcGlwZWxpbmUuIik7CisgICAgICAgICAgICAgICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBhdXRob3JpemVkVXNlcnMgPSBuZXcgQXJyYXlMaXN0KDEpOworICAgICAgICAgICAgICAgICAgICAgICAgYXV0aG9yaXplZFVzZXJzLmFkZCgoU3RyaW5nKXN0b3JtX2NvbmYuZ2V0KENvbmZpZy5OSU1CVVNfREFFTU9OX1VTRVIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVsaW5lLmFkZExhc3QoS0VSQkVST1NfSEFORExFUiwgbmV3IEtlcmJlcm9zU2FzbFNlcnZlckhhbmRsZXIoKElTYXNsU2VydmVyKXNlcnZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rvcm1fY29uZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXV0aFV0aWxzLkxPR0lOX0NPTlRFWFRfUEFDRU1BS0VSX1NFUlZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0aG9yaXplZFVzZXJzKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYoYXV0aE1ldGhvZCA9PSBBdXRoTWV0aG9kLk5PTkUpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HLmRlYnVnKCJOb3QgYXV0aGVudGljYXRpbmcgYW55IGNsaWVudHMuIEF1dGhNZXRob2QgaXMgTk9ORSIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHBpcGVsaW5lLmFkZExhc3QoImhhbmRsZXIiLCBuZXcgU3Rvcm1TZXJ2ZXJIYW5kbGVyKHNlcnZlcikpOworICAgICAgICAgICAgICAgIHJldHVybiBwaXBlbGluZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vc3Rvcm0vdHJpZGVudC9UcmlkZW50VG9wb2xvZ3kuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9zdG9ybS90cmlkZW50L1RyaWRlbnRUb3BvbG9neS5qYXZhCmluZGV4IGFmMjQ2NjQuLjVkZmFjMWMgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9zdG9ybS90cmlkZW50L1RyaWRlbnRUb3BvbG9neS5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9zdG9ybS90cmlkZW50L1RyaWRlbnRUb3BvbG9neS5qYXZhCkBAIC0zMCwxNSArMzAsOCBAQAogaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnV0aWxzLlV0aWxzOwogCiBpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKwogaW1wb3J0IG9yZy5qZ3JhcGh0LkRpcmVjdGVkR3JhcGg7CiBpbXBvcnQgb3JnLmpncmFwaHQuVW5kaXJlY3RlZEdyYXBoOwogaW1wb3J0IG9yZy5qZ3JhcGh0LmFsZy5Db25uZWN0aXZpdHlJbnNwZWN0b3I7CkBAIC04OCwxNiArODEsMTcgQEAKIC8vIGFsbCBvcGVyYXRpb25zIGhhdmUgZmluaXNoQmF0Y2ggYW5kIGNhbiBvcHRpb25hbGx5IGJlIGNvbW1pdHRlcnMKIHB1YmxpYyBjbGFzcyBUcmlkZW50VG9wb2xvZ3kgewogICAgIAotICAgIC8vVE9ETzogYWRkIGEgbWV0aG9kIGZvciBkcnBjIHN0cmVhbSwgbmVlZHMgdG8ga25vdyBob3cgdG8gYXV0b21hdGljYWxseSBkbyByZXR1cm5yZXN1bHRzLCBldGMKKyAgICAvL1RPRE86IGFkZCBhIG1ldGhvZCBmb3IgZHJwYyBzdHJlYW0sIG5lZWRzIHRvIGtub3cgaG93IHRvIGF1dG9tYXRpY2FsbHkgZG8gcmV0dXJuIHJlc3VsdHMsIGV0YwogICAgIC8vIGlzIGl0IHRvbyBleHBlbnNpdmUgdG8gZG8gYSBiYXRjaCBwZXIgZHJwYyByZXF1ZXN0PwogICAgIAotICAgIERlZmF1bHREaXJlY3RlZEdyYXBoPE5vZGUsIEluZGV4ZWRFZGdlPiBfZ3JhcGg7Ci0gICAgTWFwPFN0cmluZywgTGlzdDxOb2RlPj4gX2NvbG9jYXRlID0gbmV3IEhhc2hNYXAoKTsKLSAgICBVbmlxdWVJZEdlbiBfZ2VuOwotICAgIAorICAgIGZpbmFsIERlZmF1bHREaXJlY3RlZEdyYXBoPE5vZGUsIEluZGV4ZWRFZGdlPiBfZ3JhcGg7CisgICAgZmluYWwgTWFwPFN0cmluZywgTGlzdDxOb2RlPj4gX2NvbG9jYXRlOworICAgIGZpbmFsIFVuaXF1ZUlkR2VuIF9nZW47CisKICAgICBwdWJsaWMgVHJpZGVudFRvcG9sb2d5KCkgewotICAgICAgICBfZ3JhcGggPSBuZXcgRGVmYXVsdERpcmVjdGVkR3JhcGgobmV3IEVycm9yRWRnZUZhY3RvcnkoKSk7Ci0gICAgICAgIF9nZW4gPSBuZXcgVW5pcXVlSWRHZW4oKTsKKyAgICAgICAgdGhpcyhuZXcgRGVmYXVsdERpcmVjdGVkR3JhcGg8Tm9kZSwgSW5kZXhlZEVkZ2U+KG5ldyBFcnJvckVkZ2VGYWN0b3J5KCkpLAorICAgICAgICAgICAgICAgIG5ldyBMaW5rZWRIYXNoTWFwPFN0cmluZywgTGlzdDxOb2RlPj4oKSwKKyAgICAgICAgICAgICAgICBuZXcgVW5pcXVlSWRHZW4oKSk7CiAgICAgfQogICAgIAogICAgIHByaXZhdGUgVHJpZGVudFRvcG9sb2d5KERlZmF1bHREaXJlY3RlZEdyYXBoPE5vZGUsIEluZGV4ZWRFZGdlPiBncmFwaCwgTWFwPFN0cmluZywgTGlzdDxOb2RlPj4gY29sb2NhdGUsIFVuaXF1ZUlkR2VuIGdlbikgewpAQCAtMjEwLDcgKzIwNCw3IEBACiAgICAgfSAgICAKICAgICAKICAgICBwdWJsaWMgU3RyZWFtIG11bHRpUmVkdWNlKExpc3Q8RmllbGRzPiBpbnB1dEZpZWxkcywgTGlzdDxTdHJlYW0+IHN0cmVhbXMsIE11bHRpUmVkdWNlciBmdW5jdGlvbiwgRmllbGRzIG91dHB1dEZpZWxkcykgewotICAgICAgICBMaXN0PFN0cmluZz4gbmFtZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IG5hbWVzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgICAgIGZvcihTdHJlYW0gczogc3RyZWFtcykgewogICAgICAgICAgICAgaWYocy5fbmFtZSE9bnVsbCkgewogICAgICAgICAgICAgICAgIG5hbWVzLmFkZChzLl9uYW1lKTsKQEAgLTIyMSw5ICsyMTUsOSBAQAogICAgIH0KICAgICAKICAgICBwdWJsaWMgU3RyZWFtIG11bHRpUmVkdWNlKExpc3Q8RmllbGRzPiBpbnB1dEZpZWxkcywgTGlzdDxHcm91cGVkU3RyZWFtPiBncm91cGVkU3RyZWFtcywgR3JvdXBlZE11bHRpUmVkdWNlciBmdW5jdGlvbiwgRmllbGRzIG91dHB1dEZpZWxkcykgewotICAgICAgICBMaXN0PEZpZWxkcz4gZnVsbElucHV0RmllbGRzID0gbmV3IEFycmF5TGlzdDxGaWVsZHM+KCk7Ci0gICAgICAgIExpc3Q8U3RyZWFtPiBzdHJlYW1zID0gbmV3IEFycmF5TGlzdDxTdHJlYW0+KCk7Ci0gICAgICAgIExpc3Q8RmllbGRzPiBmdWxsR3JvdXBGaWVsZHMgPSBuZXcgQXJyYXlMaXN0PEZpZWxkcz4oKTsKKyAgICAgICAgTGlzdDxGaWVsZHM+IGZ1bGxJbnB1dEZpZWxkcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBMaXN0PFN0cmVhbT4gc3RyZWFtcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBMaXN0PEZpZWxkcz4gZnVsbEdyb3VwRmllbGRzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgICAgIGZvcihpbnQgaT0wOyBpPGdyb3VwZWRTdHJlYW1zLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICBHcm91cGVkU3RyZWFtIGdzID0gZ3JvdXBlZFN0cmVhbXMuZ2V0KGkpOwogICAgICAgICAgICAgRmllbGRzIGdyb3VwRmllbGRzID0gZ3MuZ2V0R3JvdXBGaWVsZHMoKTsKQEAgLTI4NSwxMCArMjc5LDEwIEBACiAgICAgICAgIAogICAgICAgICBjb21wbGV0ZURSUEMoZ3JhcGgsIF9jb2xvY2F0ZSwgX2dlbik7CiAgICAgICAgIAotICAgICAgICBMaXN0PFNwb3V0Tm9kZT4gc3BvdXROb2RlcyA9IG5ldyBBcnJheUxpc3Q8U3BvdXROb2RlPigpOworICAgICAgICBMaXN0PFNwb3V0Tm9kZT4gc3BvdXROb2RlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgICAKICAgICAgICAgLy8gY2FuIGJlIHJlZ3VsYXIgbm9kZXMgKHN0YXRpYyBzdGF0ZSkgb3IgcHJvY2Vzc29yIG5vZGVzCi0gICAgICAgIFNldDxOb2RlPiBib2x0Tm9kZXMgPSBuZXcgSGFzaFNldDxOb2RlPigpOworICAgICAgICBTZXQ8Tm9kZT4gYm9sdE5vZGVzID0gbmV3IExpbmtlZEhhc2hTZXQ8PigpOwogICAgICAgICBmb3IoTm9kZSBuOiBncmFwaC52ZXJ0ZXhTZXQoKSkgewogICAgICAgICAgICAgaWYobiBpbnN0YW5jZW9mIFNwb3V0Tm9kZSkgewogICAgICAgICAgICAgICAgIHNwb3V0Tm9kZXMuYWRkKChTcG91dE5vZGUpIG4pOwpAQCAtMjk4LDcgKzI5Miw3IEBACiAgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIAotICAgICAgICBTZXQ8R3JvdXA+IGluaXRpYWxHcm91cHMgPSBuZXcgSGFzaFNldDxHcm91cD4oKTsKKyAgICAgICAgU2V0PEdyb3VwPiBpbml0aWFsR3JvdXBzID0gbmV3IExpbmtlZEhhc2hTZXQ8PigpOwogICAgICAgICBmb3IoTGlzdDxOb2RlPiBjb2xvY2F0ZTogX2NvbG9jYXRlLnZhbHVlcygpKSB7CiAgICAgICAgICAgICBHcm91cCBnID0gbmV3IEdyb3VwKGdyYXBoLCBjb2xvY2F0ZSk7CiAgICAgICAgICAgICBib2x0Tm9kZXMucmVtb3ZlQWxsKGNvbG9jYXRlKTsKQEAgLTMxNiw3ICszMTAsNyBAQAogICAgICAgICAKICAgICAgICAgCiAgICAgICAgIC8vIGFkZCBpZGVudGl0eSBwYXJ0aXRpb25zIGJldHdlZW4gZ3JvdXBzCi0gICAgICAgIGZvcihJbmRleGVkRWRnZTxOb2RlPiBlOiBuZXcgSGFzaFNldDxJbmRleGVkRWRnZT4oZ3JhcGguZWRnZVNldCgpKSkgeworICAgICAgICBmb3IoSW5kZXhlZEVkZ2U8Tm9kZT4gZTogbmV3IEhhc2hTZXQ8PihncmFwaC5lZGdlU2V0KCkpKSB7CiAgICAgICAgICAgICBpZighKGUuc291cmNlIGluc3RhbmNlb2YgUGFydGl0aW9uTm9kZSkgJiYgIShlLnRhcmdldCBpbnN0YW5jZW9mIFBhcnRpdGlvbk5vZGUpKSB7ICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIEdyb3VwIGcxID0gZ3JvdXBlci5ub2RlR3JvdXAoZS5zb3VyY2UpOwogICAgICAgICAgICAgICAgIEdyb3VwIGcyID0gZ3JvdXBlci5ub2RlR3JvdXAoZS50YXJnZXQpOwpAQCAtMzQwLDcgKzMzNCw3IEBACiAgICAgICAgIC8vIHRoaXMgaXMgYmVjYXVzZSBjYW4ndCBjdXJyZW50bHkgbWVyZ2Ugc3BsaXR0aW5nIGxvZ2ljIGludG8gYSBzcG91dAogICAgICAgICAvLyBub3QgdGhlIG1vc3Qga29zaGVyIGFsZ29yaXRobSBoZXJlLCBzaW5jZSB0aGUgZ3JvdXBlciBpbmRleGVzIGFyZSBiZWluZyB0cm91bmNlZCB2aWEgdGhlIGFkZGluZyBvZiBub2RlcyB0byByYW5kb20gZ3JvdXBzLCBidXQgaXQgCiAgICAgICAgIC8vIHdvcmtzIG91dAotICAgICAgICBMaXN0PE5vZGU+IGZvck5ld0dyb3VwcyA9IG5ldyBBcnJheUxpc3Q8Tm9kZT4oKTsKKyAgICAgICAgTGlzdDxOb2RlPiBmb3JOZXdHcm91cHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgICAgZm9yKEdyb3VwIGc6IG1lcmdlZEdyb3VwcykgewogICAgICAgICAgICAgZm9yKFBhcnRpdGlvbk5vZGUgbjogZXh0cmFQYXJ0aXRpb25JbnB1dHMoZykpIHsKICAgICAgICAgICAgICAgICBOb2RlIGlkTm9kZSA9IG1ha2VJZGVudGl0eU5vZGUobi5hbGxPdXRwdXRGaWVsZHMpOwpAQCAtMzY1LDcgKzM1OSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgLy8gVE9ETzogaW4gdGhlIGZ1dHVyZSwgd2FudCBhIHdheSB0byBpbmNsdWRlIHRoaXMgbG9naWMgaW4gdGhlIHNwb3V0IGl0c2VsZiwKLSAgICAgICAgLy8gb3IgbWFrZSBpdCB1bmVjZXNzYXJ5IGJ5IGhhdmluZyBzdG9ybSBpbmNsdWRlIG1ldGFkYXRhIGFib3V0IHdoaWNoIGdyb3VwaW5nIGEgdHVwbGUKKyAgICAgICAgLy8gb3IgbWFrZSBpdCB1bm5lY2Vzc2FyeSBieSBoYXZpbmcgc3Rvcm0gaW5jbHVkZSBtZXRhZGF0YSBhYm91dCB3aGljaCBncm91cGluZyBhIHR1cGxlCiAgICAgICAgIC8vIGNhbWUgZnJvbQogICAgICAgICAKICAgICAgICAgZm9yKE5vZGUgbjogZm9yTmV3R3JvdXBzKSB7CkBAIC0zODEsOCArMzc1LDggQEAKICAgICAgICAgbWVyZ2VkR3JvdXBzID0gZ3JvdXBlci5nZXRBbGxHcm91cHMoKTsKICAgICAgICAgICAgICAgICAKICAgICAgICAgCi0gICAgICAgIE1hcDxOb2RlLCBTdHJpbmc+IGJhdGNoR3JvdXBNYXAgPSBuZXcgSGFzaE1hcCgpOwotICAgICAgICBMaXN0PFNldDxOb2RlPj4gY29ubmVjdGVkQ29tcG9uZW50cyA9IG5ldyBDb25uZWN0aXZpdHlJbnNwZWN0b3I8Tm9kZSwgSW5kZXhlZEVkZ2U+KGdyYXBoKS5jb25uZWN0ZWRTZXRzKCk7CisgICAgICAgIE1hcDxOb2RlLCBTdHJpbmc+IGJhdGNoR3JvdXBNYXAgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIExpc3Q8U2V0PE5vZGU+PiBjb25uZWN0ZWRDb21wb25lbnRzID0gbmV3IENvbm5lY3Rpdml0eUluc3BlY3Rvcjw+KGdyYXBoKS5jb25uZWN0ZWRTZXRzKCk7CiAgICAgICAgIGZvcihpbnQgaT0wOyBpPGNvbm5lY3RlZENvbXBvbmVudHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgIFN0cmluZyBncm91cElkID0gImJnIiArIGk7CiAgICAgICAgICAgICBmb3IoTm9kZSBuOiBjb25uZWN0ZWRDb21wb25lbnRzLmdldChpKSkgewpAQCAtNDI4LDE0ICs0MjIsMTAgQEAKICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPFBhcnRpdGlvbk5vZGU+IGlucHV0cyA9IHVuaXF1ZWRTdWJzY3JpcHRpb25zKGV4dGVybmFsR3JvdXBJbnB1dHMoZykpOwogICAgICAgICAgICAgICAgIGZvcihQYXJ0aXRpb25Ob2RlIG46IGlucHV0cykgewogICAgICAgICAgICAgICAgICAgICBOb2RlIHBhcmVudCA9IFRyaWRlbnRVdGlscy5nZXRQYXJlbnQoZ3JhcGgsIG4pOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY29tcG9uZW50SWQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmKHBhcmVudCBpbnN0YW5jZW9mIFNwb3V0Tm9kZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50SWQgPSBzcG91dElkcy5nZXQocGFyZW50KTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudElkID0gYm9sdElkcy5nZXQoZ3JvdXBlci5ub2RlR3JvdXAocGFyZW50KSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNvbXBvbmVudElkID0gcGFyZW50IGluc3RhbmNlb2YgU3BvdXROb2RlID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcG91dElkcy5nZXQocGFyZW50KSA6IGJvbHRJZHMuZ2V0KGdyb3VwZXIubm9kZUdyb3VwKHBhcmVudCkpOwogICAgICAgICAgICAgICAgICAgICBkLmdyb3VwaW5nKG5ldyBHbG9iYWxTdHJlYW1JZChjb21wb25lbnRJZCwgbi5zdHJlYW1JZCksIG4udGhyaWZ0R3JvdXBpbmcpOwotICAgICAgICAgICAgICAgIH0gCisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIApAQCAtNDQzLDcgKzQzMyw3IEBACiAgICAgfQogICAgIAogICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY29tcGxldGVEUlBDKERlZmF1bHREaXJlY3RlZEdyYXBoPE5vZGUsIEluZGV4ZWRFZGdlPiBncmFwaCwgTWFwPFN0cmluZywgTGlzdDxOb2RlPj4gY29sb2NhdGUsIFVuaXF1ZUlkR2VuIGdlbikgewotICAgICAgICBMaXN0PFNldDxOb2RlPj4gY29ubmVjdGVkQ29tcG9uZW50cyA9IG5ldyBDb25uZWN0aXZpdHlJbnNwZWN0b3I8Tm9kZSwgSW5kZXhlZEVkZ2U+KGdyYXBoKS5jb25uZWN0ZWRTZXRzKCk7CisgICAgICAgIExpc3Q8U2V0PE5vZGU+PiBjb25uZWN0ZWRDb21wb25lbnRzID0gbmV3IENvbm5lY3Rpdml0eUluc3BlY3Rvcjw+KGdyYXBoKS5jb25uZWN0ZWRTZXRzKCk7CiAgICAgICAgIAogICAgICAgICBmb3IoU2V0PE5vZGU+IGc6IGNvbm5lY3RlZENvbXBvbmVudHMpIHsKICAgICAgICAgICAgIGNoZWNrVmFsaWRKb2lucyhnKTsKQEAgLTUxMSw3ICs1MDEsNyBAQAogICAgIH0KICAgICAKICAgICBwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uPFBhcnRpdGlvbk5vZGU+IHVuaXF1ZWRTdWJzY3JpcHRpb25zKFNldDxQYXJ0aXRpb25Ob2RlPiBzdWJzY3JpcHRpb25zKSB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIFBhcnRpdGlvbk5vZGU+IHJldCA9IG5ldyBIYXNoTWFwKCk7CisgICAgICAgIE1hcDxTdHJpbmcsIFBhcnRpdGlvbk5vZGU+IHJldCA9IG5ldyBIYXNoTWFwPD4oKTsKICAgICAgICAgZm9yKFBhcnRpdGlvbk5vZGUgbjogc3Vic2NyaXB0aW9ucykgewogICAgICAgICAgICAgUGFydGl0aW9uTm9kZSBjdXJyID0gcmV0LmdldChuLnN0cmVhbUlkKTsKICAgICAgICAgICAgIGlmKGN1cnIhPW51bGwgJiYgIWN1cnIudGhyaWZ0R3JvdXBpbmcuZXF1YWxzKG4udGhyaWZ0R3JvdXBpbmcpKSB7CkBAIC01MjMsNyArNTEzLDcgQEAKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBNYXA8Tm9kZSwgU3RyaW5nPiBnZW5TcG91dElkcyhDb2xsZWN0aW9uPFNwb3V0Tm9kZT4gc3BvdXROb2RlcykgewotICAgICAgICBNYXA8Tm9kZSwgU3RyaW5nPiByZXQgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICBNYXA8Tm9kZSwgU3RyaW5nPiByZXQgPSBuZXcgSGFzaE1hcDw+KCk7CiAgICAgICAgIGludCBjdHIgPSAwOwogICAgICAgICBmb3IoU3BvdXROb2RlIG46IHNwb3V0Tm9kZXMpIHsKICAgICAgICAgICAgIGlmIChuLnR5cGUgPT0gU3BvdXROb2RlLlNwb3V0VHlwZS5CQVRDSCkgeyAvLyBpZiBCYXRjaCBzcG91dCB0aGVuIGlkIGNvbnRhaW5zIHR4SWQKQEAgLTU0MCwxMSArNTMwLDExIEBACiAgICAgfQogCiAgICAgcHJpdmF0ZSBzdGF0aWMgTWFwPEdyb3VwLCBTdHJpbmc+IGdlbkJvbHRJZHMoQ29sbGVjdGlvbjxHcm91cD4gZ3JvdXBzKSB7Ci0gICAgICAgIE1hcDxHcm91cCwgU3RyaW5nPiByZXQgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICBNYXA8R3JvdXAsIFN0cmluZz4gcmV0ID0gbmV3IEhhc2hNYXA8PigpOwogICAgICAgICBpbnQgY3RyID0gMDsKICAgICAgICAgZm9yKEdyb3VwIGc6IGdyb3VwcykgewogICAgICAgICAgICAgaWYoIWlzU3BvdXRHcm91cChnKSkgewotICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBuYW1lID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBuYW1lID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgICAgICAgICAgICAgbmFtZS5hZGQoImIiKTsKICAgICAgICAgICAgICAgICBuYW1lLmFkZCgiIiArIGN0cik7CiAgICAgICAgICAgICAgICAgU3RyaW5nIGdyb3VwTmFtZSA9IGdldEdyb3VwTmFtZShnKTsKQEAgLTU1OSwxMyArNTQ5LDEzIEBACiAgICAgfQogICAgIAogICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRHcm91cE5hbWUoR3JvdXAgZykgewotICAgICAgICBUcmVlTWFwPEludGVnZXIsIFN0cmluZz4gc29ydGVkTmFtZXMgPSBuZXcgVHJlZU1hcCgpOworICAgICAgICBUcmVlTWFwPEludGVnZXIsIFN0cmluZz4gc29ydGVkTmFtZXMgPSBuZXcgVHJlZU1hcDw+KCk7CiAgICAgICAgIGZvcihOb2RlIG46IGcubm9kZXMpIHsKICAgICAgICAgICAgIGlmKG4ubmFtZSE9bnVsbCkgewogICAgICAgICAgICAgICAgIHNvcnRlZE5hbWVzLnB1dChuLmNyZWF0aW9uSW5kZXgsIG4ubmFtZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgTGlzdDxTdHJpbmc+IG5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgICAgIExpc3Q8U3RyaW5nPiBuYW1lcyA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgICBTdHJpbmcgcHJldk5hbWUgPSBudWxsOwogICAgICAgICBmb3IoU3RyaW5nIG46IHNvcnRlZE5hbWVzLnZhbHVlcygpKSB7CiAgICAgICAgICAgICBpZihwcmV2TmFtZT09bnVsbCB8fCAhbi5lcXVhbHMocHJldk5hbWUpKSB7CkBAIC01NzcsNyArNTY3LDcgQEAKICAgICB9CiAgICAgCiAgICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRPdXRwdXRTdHJlYW1CYXRjaEdyb3VwcyhHcm91cCBnLCBNYXA8Tm9kZSwgU3RyaW5nPiBiYXRjaEdyb3VwTWFwKSB7Ci0gICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcmV0ID0gbmV3IEhhc2hNYXAoKTsKKyAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiByZXQgPSBuZXcgSGFzaE1hcDw+KCk7CiAgICAgICAgIFNldDxQYXJ0aXRpb25Ob2RlPiBleHRlcm5hbEdyb3VwT3V0cHV0cyA9IGV4dGVybmFsR3JvdXBPdXRwdXRzKGcpOwogICAgICAgICBmb3IoUGFydGl0aW9uTm9kZSBuOiBleHRlcm5hbEdyb3VwT3V0cHV0cykgewogICAgICAgICAgICAgcmV0LnB1dChuLnN0cmVhbUlkLCBiYXRjaEdyb3VwTWFwLmdldChuKSk7CkBAIC01ODYsNyArNTc2LDcgQEAKICAgICB9CiAgICAgCiAgICAgcHJpdmF0ZSBzdGF0aWMgU2V0PFN0cmluZz4gY29tbWl0dGVyQmF0Y2hlcyhHcm91cCBnLCBNYXA8Tm9kZSwgU3RyaW5nPiBiYXRjaEdyb3VwTWFwKSB7Ci0gICAgICAgIFNldDxTdHJpbmc+IHJldCA9IG5ldyBIYXNoU2V0KCk7CisgICAgICAgIFNldDxTdHJpbmc+IHJldCA9IG5ldyBIYXNoU2V0PD4oKTsKICAgICAgICAgZm9yKE5vZGUgbjogZy5ub2RlcykgewogICAgICAgICAgICBpZihuIGluc3RhbmNlb2YgUHJvY2Vzc29yTm9kZSkgewogICAgICAgICAgICAgICAgaWYoKChQcm9jZXNzb3JOb2RlKSBuKS5jb21taXR0ZXIpIHsKQEAgLTU5OCw3ICs1ODgsNyBAQAogICAgIH0KICAgICAKICAgICBwcml2YXRlIHN0YXRpYyBNYXA8R3JvdXAsIEludGVnZXI+IGdldEdyb3VwUGFyYWxsZWxpc21zKERpcmVjdGVkR3JhcGg8Tm9kZSwgSW5kZXhlZEVkZ2U+IGdyYXBoLCBHcmFwaEdyb3VwZXIgZ3JvdXBlciwgQ29sbGVjdGlvbjxHcm91cD4gZ3JvdXBzKSB7Ci0gICAgICAgIFVuZGlyZWN0ZWRHcmFwaDxHcm91cCwgT2JqZWN0PiBlcXVpdnMgPSBuZXcgUHNldWRvZ3JhcGg8R3JvdXAsIE9iamVjdD4oT2JqZWN0LmNsYXNzKTsKKyAgICAgICAgVW5kaXJlY3RlZEdyYXBoPEdyb3VwLCBPYmplY3Q+IGVxdWl2cyA9IG5ldyBQc2V1ZG9ncmFwaDw+KE9iamVjdC5jbGFzcyk7CiAgICAgICAgIGZvcihHcm91cCBnOiBncm91cHMpIHsKICAgICAgICAgICAgIGVxdWl2cy5hZGRWZXJ0ZXgoZyk7CiAgICAgICAgIH0KQEAgLTYxNCw4ICs2MDQsOCBAQAogICAgICAgICAgICAgfSAgICAgICAgICAgIAogICAgICAgICB9CiAgICAgICAgIAotICAgICAgICBNYXA8R3JvdXAsIEludGVnZXI+IHJldCA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgICAgIExpc3Q8U2V0PEdyb3VwPj4gZXF1aXZHcm91cHMgPSBuZXcgQ29ubmVjdGl2aXR5SW5zcGVjdG9yPEdyb3VwLCBPYmplY3Q+KGVxdWl2cykuY29ubmVjdGVkU2V0cygpOworICAgICAgICBNYXA8R3JvdXAsIEludGVnZXI+IHJldCA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgTGlzdDxTZXQ8R3JvdXA+PiBlcXVpdkdyb3VwcyA9IG5ldyBDb25uZWN0aXZpdHlJbnNwZWN0b3I8PihlcXVpdnMpLmNvbm5lY3RlZFNldHMoKTsKICAgICAgICAgZm9yKFNldDxHcm91cD4gZXF1aXZHcm91cDogZXF1aXZHcm91cHMpIHsKICAgICAgICAgICAgIEludGVnZXIgZml4ZWRQID0gZ2V0Rml4ZWRQYXJhbGxlbGlzbShlcXVpdkdyb3VwKTsKICAgICAgICAgICAgIEludGVnZXIgbWF4UCA9IGdldE1heFBhcmFsbGVsaXNtKGVxdWl2R3JvdXApOwpAQCAtNzA0LDkgKzY5NCw5IEBACiAgICAgfQogICAgIAogICAgIHByaXZhdGUgc3RhdGljIExpc3Q8UGFydGl0aW9uTm9kZT4gZXh0cmFQYXJ0aXRpb25JbnB1dHMoR3JvdXAgZykgewotICAgICAgICBMaXN0PFBhcnRpdGlvbk5vZGU+IHJldCA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgTGlzdDxQYXJ0aXRpb25Ob2RlPiByZXQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgICAgU2V0PFBhcnRpdGlvbk5vZGU+IGlucHV0cyA9IGV4dGVybmFsR3JvdXBJbnB1dHMoZyk7Ci0gICAgICAgIE1hcDxTdHJpbmcsIExpc3Q8UGFydGl0aW9uTm9kZT4+IGdyb3VwZWQgPSBuZXcgSGFzaE1hcCgpOworICAgICAgICBNYXA8U3RyaW5nLCBMaXN0PFBhcnRpdGlvbk5vZGU+PiBncm91cGVkID0gbmV3IEhhc2hNYXA8PigpOwogICAgICAgICBmb3IoUGFydGl0aW9uTm9kZSBuOiBpbnB1dHMpIHsKICAgICAgICAgICAgIGlmKCFncm91cGVkLmNvbnRhaW5zS2V5KG4uc3RyZWFtSWQpKSB7CiAgICAgICAgICAgICAgICAgZ3JvdXBlZC5wdXQobi5zdHJlYW1JZCwgbmV3IEFycmF5TGlzdCgpKTsKQEAgLTcyNiw3ICs3MTYsNyBAQAogICAgIH0KICAgICAKICAgICBwcml2YXRlIHN0YXRpYyBTZXQ8UGFydGl0aW9uTm9kZT4gZXh0ZXJuYWxHcm91cElucHV0cyhHcm91cCBnKSB7Ci0gICAgICAgIFNldDxQYXJ0aXRpb25Ob2RlPiByZXQgPSBuZXcgSGFzaFNldCgpOworICAgICAgICBTZXQ8UGFydGl0aW9uTm9kZT4gcmV0ID0gbmV3IEhhc2hTZXQ8PigpOwogICAgICAgICBmb3IoTm9kZSBuOiBnLmluY29taW5nTm9kZXMoKSkgewogICAgICAgICAgICAgaWYobiBpbnN0YW5jZW9mIFBhcnRpdGlvbk5vZGUpIHsKICAgICAgICAgICAgICAgICByZXQuYWRkKChQYXJ0aXRpb25Ob2RlKSBuKTsKQEAgLTczNiw3ICs3MjYsNyBAQAogICAgIH0KICAgICAKICAgICBwcml2YXRlIHN0YXRpYyBTZXQ8UGFydGl0aW9uTm9kZT4gZXh0ZXJuYWxHcm91cE91dHB1dHMoR3JvdXAgZykgewotICAgICAgICBTZXQ8UGFydGl0aW9uTm9kZT4gcmV0ID0gbmV3IEhhc2hTZXQoKTsKKyAgICAgICAgU2V0PFBhcnRpdGlvbk5vZGU+IHJldCA9IG5ldyBIYXNoU2V0PD4oKTsKICAgICAgICAgZm9yKE5vZGUgbjogZy5vdXRnb2luZ05vZGVzKCkpIHsKICAgICAgICAgICAgIGlmKG4gaW5zdGFuY2VvZiBQYXJ0aXRpb25Ob2RlKSB7CiAgICAgICAgICAgICAgICAgcmV0LmFkZCgoUGFydGl0aW9uTm9kZSkgbik7CkBAIC04MDMsNyArNzkzLDcgQEAKICAgICB9ICAgICAgIAogICAgIAogICAgIHByaXZhdGUgc3RhdGljIExpc3Q8RmllbGRzPiBnZXRBbGxPdXRwdXRGaWVsZHMoTGlzdCBzdHJlYW1zKSB7Ci0gICAgICAgIExpc3Q8RmllbGRzPiByZXQgPSBuZXcgQXJyYXlMaXN0PEZpZWxkcz4oKTsKKyAgICAgICAgTGlzdDxGaWVsZHM+IHJldCA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgICBmb3IoT2JqZWN0IG86IHN0cmVhbXMpIHsKICAgICAgICAgICAgIHJldC5hZGQoKChJQWdncmVnYXRhYmxlU3RyZWFtKSBvKS5nZXRPdXRwdXRGaWVsZHMoKSk7CiAgICAgICAgIH0KQEAgLTgxMiw3ICs4MDIsNyBAQAogICAgIAogICAgIAogICAgIHByaXZhdGUgc3RhdGljIExpc3Q8R3JvdXBlZFN0cmVhbT4gZ3JvdXBlZFN0cmVhbXMoTGlzdDxTdHJlYW0+IHN0cmVhbXMsIExpc3Q8RmllbGRzPiBqb2luRmllbGRzKSB7Ci0gICAgICAgIExpc3Q8R3JvdXBlZFN0cmVhbT4gcmV0ID0gbmV3IEFycmF5TGlzdDxHcm91cGVkU3RyZWFtPigpOworICAgICAgICBMaXN0PEdyb3VwZWRTdHJlYW0+IHJldCA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgICBmb3IoaW50IGk9MDsgaTxzdHJlYW1zLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICByZXQuYWRkKHN0cmVhbXMuZ2V0KGkpLmdyb3VwQnkoam9pbkZpZWxkcy5nZXQoaSkpKTsKICAgICAgICAgfQpAQCAtODIwLDcgKzgxMCw3IEBACiAgICAgfQogICAgIAogICAgIHByaXZhdGUgc3RhdGljIExpc3Q8RmllbGRzPiBzdHJpcHBlZElucHV0RmllbGRzKExpc3Q8U3RyZWFtPiBzdHJlYW1zLCBMaXN0PEZpZWxkcz4gam9pbkZpZWxkcykgewotICAgICAgICBMaXN0PEZpZWxkcz4gcmV0ID0gbmV3IEFycmF5TGlzdDxGaWVsZHM+KCk7CisgICAgICAgIExpc3Q8RmllbGRzPiByZXQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgICAgZm9yKGludCBpPTA7IGk8c3RyZWFtcy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgcmV0LmFkZChUcmlkZW50VXRpbHMuZmllbGRzU3VidHJhY3Qoc3RyZWFtcy5nZXQoaSkuZ2V0T3V0cHV0RmllbGRzKCksIGpvaW5GaWVsZHMuZ2V0KGkpKSk7CiAgICAgICAgIH0KQEAgLTgyOCw3ICs4MTgsNyBAQAogICAgIH0KICAgICAKICAgICBwcml2YXRlIHN0YXRpYyBMaXN0PEpvaW5UeXBlPiByZXBlYXQoaW50IG4sIEpvaW5UeXBlIHR5cGUpIHsKLSAgICAgICAgTGlzdDxKb2luVHlwZT4gcmV0ID0gbmV3IEFycmF5TGlzdDxKb2luVHlwZT4oKTsKKyAgICAgICAgTGlzdDxKb2luVHlwZT4gcmV0ID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgICAgIGZvcihpbnQgaT0wOyBpPG47IGkrKykgewogICAgICAgICAgICAgcmV0LmFkZCh0eXBlKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL3N0b3JtL3RyaWRlbnQvZHJwYy9SZXR1cm5SZXN1bHRzUmVkdWNlci5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL3N0b3JtL3RyaWRlbnQvZHJwYy9SZXR1cm5SZXN1bHRzUmVkdWNlci5qYXZhCmluZGV4IDg0OWZiMTAuLjUxNWQzYTIgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9zdG9ybS90cmlkZW50L2RycGMvUmV0dXJuUmVzdWx0c1JlZHVjZXIuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vc3Rvcm0vdHJpZGVudC9kcnBjL1JldHVyblJlc3VsdHNSZWR1Y2VyLmphdmEKQEAgLTQwLDcgKzQwLDcgQEAKIAogcHVibGljIGNsYXNzIFJldHVyblJlc3VsdHNSZWR1Y2VyIGltcGxlbWVudHMgTXVsdGlSZWR1Y2VyPFJldHVyblJlc3VsdHNTdGF0ZT4gewogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmV0dXJuUmVzdWx0c1N0YXRlIHsKLSAgICAgICAgTGlzdDxUcmlkZW50VHVwbGU+IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0PFRyaWRlbnRUdXBsZT4oKTsKKyAgICAgICAgTGlzdDxUcmlkZW50VHVwbGU+IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgICAgU3RyaW5nIHJldHVybkluZm87CiAKICAgICAgICAgQE92ZXJyaWRlCkBAIC01MCw3ICs1MCw3IEBACiAgICAgfQogICAgIGJvb2xlYW4gbG9jYWw7CiAgICAgTWFwIGNvbmY7Ci0gICAgTWFwPExpc3QsIERSUENJbnZvY2F0aW9uc0NsaWVudD4gX2NsaWVudHMgPSBuZXcgSGFzaE1hcDxMaXN0LCBEUlBDSW52b2NhdGlvbnNDbGllbnQ+KCk7CisgICAgTWFwPExpc3QsIERSUENJbnZvY2F0aW9uc0NsaWVudD4gX2NsaWVudHMgPSBuZXcgSGFzaE1hcDw+KCk7CiAgICAgCiAgICAgCiAgICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vc3Rvcm0vdHJpZGVudC9mbHVlbnQvQ2hhaW5lZEFnZ3JlZ2F0b3JEZWNsYXJlci5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL3N0b3JtL3RyaWRlbnQvZmx1ZW50L0NoYWluZWRBZ2dyZWdhdG9yRGVjbGFyZXIuamF2YQppbmRleCA4MDQwZThiLi45NzZmOTgzIDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vc3Rvcm0vdHJpZGVudC9mbHVlbnQvQ2hhaW5lZEFnZ3JlZ2F0b3JEZWNsYXJlci5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9zdG9ybS90cmlkZW50L2ZsdWVudC9DaGFpbmVkQWdncmVnYXRvckRlY2xhcmVyLmphdmEKQEAgLTU5LDcgKzU5LDcgQEAKICAgICAgICAgfQogICAgIH0KICAgICAKLSAgICBMaXN0PEFnZ1NwZWM+IF9hZ2dzID0gbmV3IEFycmF5TGlzdDxBZ2dTcGVjPigpOworICAgIExpc3Q8QWdnU3BlYz4gX2FnZ3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICBJQWdncmVnYXRhYmxlU3RyZWFtIF9zdHJlYW07CiAgICAgQWdnVHlwZSBfdHlwZSA9IG51bGw7CiAgICAgR2xvYmFsQWdncmVnYXRpb25TY2hlbWUgX2dsb2JhbFNjaGVtZTsKQEAgLTczLDggKzczLDggQEAKICAgICAgICAgRmllbGRzW10gaW5wdXRGaWVsZHMgPSBuZXcgRmllbGRzW19hZ2dzLnNpemUoKV07CiAgICAgICAgIEFnZ3JlZ2F0b3JbXSBhZ2dzID0gbmV3IEFnZ3JlZ2F0b3JbX2FnZ3Muc2l6ZSgpXTsKICAgICAgICAgaW50W10gb3V0U2l6ZXMgPSBuZXcgaW50W19hZ2dzLnNpemUoKV07Ci0gICAgICAgIExpc3Q8U3RyaW5nPiBhbGxPdXRGaWVsZHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgU2V0PFN0cmluZz4gYWxsSW5GaWVsZHMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgICAgIExpc3Q8U3RyaW5nPiBhbGxPdXRGaWVsZHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgU2V0PFN0cmluZz4gYWxsSW5GaWVsZHMgPSBuZXcgSGFzaFNldDw+KCk7CiAgICAgICAgIGZvcihpbnQgaT0wOyBpPF9hZ2dzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICBBZ2dTcGVjIHNwZWMgPSBfYWdncy5nZXQoaSk7CiAgICAgICAgICAgICBGaWVsZHMgaW5maWVsZHMgPSBzcGVjLmluRmllbGRzOwpAQCAtOTIsNyArOTIsNyBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiT3V0cHV0IGZpZWxkcyBmb3IgY2hhaW5lZCBhZ2dyZWdhdG9ycyBtdXN0IGJlIGRpc3RpbmN0OiAiICsgYWxsT3V0RmllbGRzLnRvU3RyaW5nKCkpOwogICAgICAgICB9CiAgICAgICAgIAotICAgICAgICBGaWVsZHMgaW5GaWVsZHMgPSBuZXcgRmllbGRzKG5ldyBBcnJheUxpc3Q8U3RyaW5nPihhbGxJbkZpZWxkcykpOworICAgICAgICBGaWVsZHMgaW5GaWVsZHMgPSBuZXcgRmllbGRzKG5ldyBBcnJheUxpc3Q8PihhbGxJbkZpZWxkcykpOwogICAgICAgICBGaWVsZHMgb3V0RmllbGRzID0gbmV3IEZpZWxkcyhhbGxPdXRGaWVsZHMpOwogICAgICAgICBBZ2dyZWdhdG9yIGNvbWJpbmVkID0gbmV3IENoYWluZWRBZ2dyZWdhdG9ySW1wbChhZ2dzLCBpbnB1dEZpZWxkcywgbmV3IENvbWJvTGlzdC5GYWN0b3J5KG91dFNpemVzKSk7CiAgICAgICAgIApkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL3N0b3JtL3RyaWRlbnQvZ3JhcGgvR3JhcGhHcm91cGVyLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vc3Rvcm0vdHJpZGVudC9ncmFwaC9HcmFwaEdyb3VwZXIuamF2YQppbmRleCA5NGRiMDc3Li42NzE0OThlIDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vc3Rvcm0vdHJpZGVudC9ncmFwaC9HcmFwaEdyb3VwZXIuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vc3Rvcm0vdHJpZGVudC9ncmFwaC9HcmFwaEdyb3VwZXIuamF2YQpAQCAtMTcsMjYgKzE3LDIyIEBACiAgKi8KIHBhY2thZ2Ugc3Rvcm0udHJpZGVudC5ncmFwaDsKIAotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuKjsKKwogaW1wb3J0IG9yZy5qZ3JhcGh0LkRpcmVjdGVkR3JhcGg7CiBpbXBvcnQgc3Rvcm0udHJpZGVudC5wbGFubmVyLk5vZGU7CiBpbXBvcnQgc3Rvcm0udHJpZGVudC51dGlsLkluZGV4ZWRFZGdlOwogCiAKIHB1YmxpYyBjbGFzcyBHcmFwaEdyb3VwZXIgewotICAgIAotICAgIERpcmVjdGVkR3JhcGg8Tm9kZSwgSW5kZXhlZEVkZ2U+IGdyYXBoOwotICAgIFNldDxHcm91cD4gY3Vyckdyb3VwczsKLSAgICBNYXA8Tm9kZSwgR3JvdXA+IGdyb3VwSW5kZXggPSBuZXcgSGFzaE1hcCgpOworICAgIGZpbmFsIERpcmVjdGVkR3JhcGg8Tm9kZSwgSW5kZXhlZEVkZ2U+IGdyYXBoOworICAgIGZpbmFsIFNldDxHcm91cD4gY3Vyckdyb3VwczsKKyAgICBmaW5hbCBNYXA8Tm9kZSwgR3JvdXA+IGdyb3VwSW5kZXggPSBuZXcgSGFzaE1hcDw+KCk7CiAgICAgCiAgICAgcHVibGljIEdyYXBoR3JvdXBlcihEaXJlY3RlZEdyYXBoPE5vZGUsIEluZGV4ZWRFZGdlPiBncmFwaCwgQ29sbGVjdGlvbjxHcm91cD4gaW5pdGlhbEdyb3VwcykgewogICAgICAgICB0aGlzLmdyYXBoID0gZ3JhcGg7Ci0gICAgICAgIHRoaXMuY3Vyckdyb3VwcyA9IG5ldyBIYXNoU2V0KGluaXRpYWxHcm91cHMpOwotICAgICAgICByZWluZGV4KCk7ICAgICAgCisgICAgICAgIHRoaXMuY3Vyckdyb3VwcyA9IG5ldyBMaW5rZWRIYXNoU2V0PD4oaW5pdGlhbEdyb3Vwcyk7CisgICAgICAgIHJlaW5kZXgoKTsKICAgICB9CiAgICAgCiAgICAgcHVibGljIENvbGxlY3Rpb248R3JvdXA+IGdldEFsbEdyb3VwcygpIHsKQEAgLTk1LDcgKzkxLDcgQEAKICAgICB9CiAgICAgCiAgICAgcHVibGljIENvbGxlY3Rpb248R3JvdXA+IG91dGdvaW5nR3JvdXBzKEdyb3VwIGcpIHsKLSAgICAgICAgU2V0PEdyb3VwPiByZXQgPSBuZXcgSGFzaFNldCgpOworICAgICAgICBTZXQ8R3JvdXA+IHJldCA9IG5ldyBIYXNoU2V0PD4oKTsKICAgICAgICAgZm9yKE5vZGUgbjogZy5vdXRnb2luZ05vZGVzKCkpIHsKICAgICAgICAgICAgIEdyb3VwIG90aGVyID0gbm9kZUdyb3VwKG4pOwogICAgICAgICAgICAgaWYob3RoZXI9PW51bGwgfHwgIW90aGVyLmVxdWFscyhnKSkgewpAQCAtMTA2LDcgKzEwMiw3IEBACiAgICAgfQogICAgIAogICAgIHB1YmxpYyBDb2xsZWN0aW9uPEdyb3VwPiBpbmNvbWluZ0dyb3VwcyhHcm91cCBnKSB7Ci0gICAgICAgIFNldDxHcm91cD4gcmV0ID0gbmV3IEhhc2hTZXQoKTsKKyAgICAgICAgU2V0PEdyb3VwPiByZXQgPSBuZXcgSGFzaFNldDw+KCk7CiAgICAgICAgIGZvcihOb2RlIG46IGcuaW5jb21pbmdOb2RlcygpKSB7CiAgICAgICAgICAgICBHcm91cCBvdGhlciA9IG5vZGVHcm91cChuKTsKICAgICAgICAgICAgIGlmKG90aGVyPT1udWxsIHx8ICFvdGhlci5lcXVhbHMoZykpIHsKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9zdG9ybS90cmlkZW50L2dyYXBoL0dyb3VwLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vc3Rvcm0vdHJpZGVudC9ncmFwaC9Hcm91cC5qYXZhCmluZGV4IDhlZDAwMjMuLjY0YmRlYzYgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9zdG9ybS90cmlkZW50L2dyYXBoL0dyb3VwLmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL3N0b3JtL3RyaWRlbnQvZ3JhcGgvR3JvdXAuamF2YQpAQCAtMjksMTQgKzI5LDEzIEBACiAKIAogcHVibGljIGNsYXNzIEdyb3VwIHsKLSAgICBwdWJsaWMgU2V0PE5vZGU+IG5vZGVzID0gbmV3IEhhc2hTZXQ8Tm9kZT4oKTsKLSAgICBwcml2YXRlIERpcmVjdGVkR3JhcGg8Tm9kZSwgSW5kZXhlZEVkZ2U+IGdyYXBoOwotICAgIHByaXZhdGUgU3RyaW5nIGlkOworICAgIHB1YmxpYyBmaW5hbCBTZXQ8Tm9kZT4gbm9kZXMgPSBuZXcgSGFzaFNldDw+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBEaXJlY3RlZEdyYXBoPE5vZGUsIEluZGV4ZWRFZGdlPiBncmFwaDsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBpZCA9IFVVSUQucmFuZG9tVVVJRCgpLnRvU3RyaW5nKCk7CiAgICAgCiAgICAgcHVibGljIEdyb3VwKERpcmVjdGVkR3JhcGggZ3JhcGgsIExpc3Q8Tm9kZT4gbm9kZXMpIHsKLSAgICAgICAgaW5pdChncmFwaCk7Ci0gICAgICAgIHRoaXMubm9kZXMuYWRkQWxsKG5vZGVzKTsKICAgICAgICAgdGhpcy5ncmFwaCA9IGdyYXBoOworICAgICAgICB0aGlzLm5vZGVzLmFkZEFsbChub2Rlcyk7CiAgICAgfQogICAgIAogICAgIHB1YmxpYyBHcm91cChEaXJlY3RlZEdyYXBoIGdyYXBoLCBOb2RlIG4pIHsKQEAgLTQ0LDE4ICs0MywxMyBAQAogICAgIH0KICAgICAKICAgICBwdWJsaWMgR3JvdXAoR3JvdXAgZzEsIEdyb3VwIGcyKSB7Ci0gICAgICAgIGluaXQoZzEuZ3JhcGgpOworICAgICAgICB0aGlzLmdyYXBoID0gZzEuZ3JhcGg7CiAgICAgICAgIG5vZGVzLmFkZEFsbChnMS5ub2Rlcyk7CiAgICAgICAgIG5vZGVzLmFkZEFsbChnMi5ub2Rlcyk7CiAgICAgfQogICAgIAotICAgIHByaXZhdGUgdm9pZCBpbml0KERpcmVjdGVkR3JhcGggZ3JhcGgpIHsKLSAgICAgICAgdGhpcy5ncmFwaCA9IGdyYXBoOwotICAgICAgICB0aGlzLmlkID0gVVVJRC5yYW5kb21VVUlEKCkudG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgCiAgICAgcHVibGljIFNldDxOb2RlPiBvdXRnb2luZ05vZGVzKCkgewotICAgICAgICBTZXQ8Tm9kZT4gcmV0ID0gbmV3IEhhc2hTZXQ8Tm9kZT4oKTsKKyAgICAgICAgU2V0PE5vZGU+IHJldCA9IG5ldyBIYXNoU2V0PD4oKTsKICAgICAgICAgZm9yKE5vZGUgbjogbm9kZXMpIHsKICAgICAgICAgICAgIHJldC5hZGRBbGwoVHJpZGVudFV0aWxzLmdldENoaWxkcmVuKGdyYXBoLCBuKSk7CiAgICAgICAgIH0KQEAgLTYzLDcgKzU3LDcgQEAKICAgICB9CiAgICAgCiAgICAgcHVibGljIFNldDxOb2RlPiBpbmNvbWluZ05vZGVzKCkgewotICAgICAgICBTZXQ8Tm9kZT4gcmV0ID0gbmV3IEhhc2hTZXQ8Tm9kZT4oKTsKKyAgICAgICAgU2V0PE5vZGU+IHJldCA9IG5ldyBIYXNoU2V0PD4oKTsKICAgICAgICAgZm9yKE5vZGUgbjogbm9kZXMpIHsKICAgICAgICAgICAgIHJldC5hZGRBbGwoVHJpZGVudFV0aWxzLmdldFBhcmVudHMoZ3JhcGgsIG4pKTsKICAgICAgICAgfSAgICAgICAgCkBAIC03Nyw2ICs3MSw5IEBACiAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgICAgaWYgKHRoaXMgPT0gbykgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGlkLmVxdWFscygoKEdyb3VwKSBvKS5pZCk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vc3Rvcm0vdHJpZGVudC9vcGVyYXRpb24vYnVpbHRpbi9TbmFwc2hvdEdldC5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL3N0b3JtL3RyaWRlbnQvb3BlcmF0aW9uL2J1aWx0aW4vU25hcHNob3RHZXQuamF2YQppbmRleCA2ZDI0YWU2Li4yYTQ0ZWFiIDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vc3Rvcm0vdHJpZGVudC9vcGVyYXRpb24vYnVpbHRpbi9TbmFwc2hvdEdldC5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9zdG9ybS90cmlkZW50L29wZXJhdGlvbi9idWlsdGluL1NuYXBzaG90R2V0LmphdmEKQEAgLTI5LDkgKzI5LDkgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBMaXN0PE9iamVjdD4gYmF0Y2hSZXRyaWV2ZShSZWFkT25seVNuYXBzaG90dGFibGUgc3RhdGUsIExpc3Q8VHJpZGVudFR1cGxlPiBhcmdzKSB7Ci0gICAgICAgIExpc3Q8T2JqZWN0PiByZXQgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oYXJncy5zaXplKCkpOworICAgICAgICBMaXN0PE9iamVjdD4gcmV0ID0gbmV3IEFycmF5TGlzdDw+KGFyZ3Muc2l6ZSgpKTsKICAgICAgICAgT2JqZWN0IHNuYXBzaG90ID0gc3RhdGUuZ2V0KCk7Ci0gICAgICAgIGZvcihpbnQgaT0wOyBpPGFyZ3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgZm9yIChUcmlkZW50VHVwbGUgYXJnIDogYXJncykgewogICAgICAgICAgICAgcmV0LmFkZChzbmFwc2hvdCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9zdG9ybS90cmlkZW50L29wZXJhdGlvbi9idWlsdGluL1R1cGxlQ29sbGVjdGlvbkdldC5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL3N0b3JtL3RyaWRlbnQvb3BlcmF0aW9uL2J1aWx0aW4vVHVwbGVDb2xsZWN0aW9uR2V0LmphdmEKaW5kZXggNTJkZDYzMy4uNDI2YjU2ZiAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL3N0b3JtL3RyaWRlbnQvb3BlcmF0aW9uL2J1aWx0aW4vVHVwbGVDb2xsZWN0aW9uR2V0LmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL3N0b3JtL3RyaWRlbnQvb3BlcmF0aW9uL2J1aWx0aW4vVHVwbGVDb2xsZWN0aW9uR2V0LmphdmEKQEAgLTMwLDkgKzMwLDkgQEAKIAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBMaXN0PEl0ZXJhdG9yPExpc3Q8T2JqZWN0Pj4+IGJhdGNoUmV0cmlldmUoU3RhdGUgc3RhdGUsIExpc3Q8VHJpZGVudFR1cGxlPiBhcmdzKSB7Ci0gICAgICAgIExpc3Q8SXRlcmF0b3I8TGlzdDxPYmplY3Q+Pj4gcmV0ID0gbmV3IEFycmF5TGlzdChhcmdzLnNpemUoKSk7Ci0gICAgICAgIGZvcihpbnQgaT0wOyBpPGFyZ3Muc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHJldC5hZGQoKChJVHVwbGVDb2xsZWN0aW9uKXN0YXRlKS5nZXRUdXBsZXMoKSk7CisgICAgICAgIExpc3Q8SXRlcmF0b3I8TGlzdDxPYmplY3Q+Pj4gcmV0ID0gbmV3IEFycmF5TGlzdDw+KGFyZ3Muc2l6ZSgpKTsKKyAgICAgICAgZm9yIChUcmlkZW50VHVwbGUgYXJnIDogYXJncykgeworICAgICAgICAgICAgcmV0LmFkZCgoKElUdXBsZUNvbGxlY3Rpb24pIHN0YXRlKS5nZXRUdXBsZXMoKSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vc3Rvcm0vdHJpZGVudC9wYXJ0aXRpb24vR2xvYmFsR3JvdXBpbmcuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9zdG9ybS90cmlkZW50L3BhcnRpdGlvbi9HbG9iYWxHcm91cGluZy5qYXZhCmluZGV4IDU0ZmE4NDQuLmE1MzVlYjIgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9zdG9ybS90cmlkZW50L3BhcnRpdGlvbi9HbG9iYWxHcm91cGluZy5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9zdG9ybS90cmlkZW50L3BhcnRpdGlvbi9HbG9iYWxHcm91cGluZy5qYXZhCkBAIC0yNiwxMyArMjYsMTEgQEAKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogcHVibGljIGNsYXNzIEdsb2JhbEdyb3VwaW5nIGltcGxlbWVudHMgQ3VzdG9tU3RyZWFtR3JvdXBpbmcgewotCiAgICAgTGlzdDxJbnRlZ2VyPiB0YXJnZXQ7CiAgICAgCi0gICAgCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgcHJlcGFyZShXb3JrZXJUb3BvbG9neUNvbnRleHQgY29udGV4dCwgR2xvYmFsU3RyZWFtSWQgc3RyZWFtLCBMaXN0PEludGVnZXI+IHRhcmdldHMpIHsKLSAgICAgICAgTGlzdDxJbnRlZ2VyPiBzb3J0ZWQgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KHRhcmdldHMpOworICAgICAgICBMaXN0PEludGVnZXI+IHNvcnRlZCA9IG5ldyBBcnJheUxpc3Q8Pih0YXJnZXRzKTsKICAgICAgICAgQ29sbGVjdGlvbnMuc29ydChzb3J0ZWQpOwogICAgICAgICB0YXJnZXQgPSBBcnJheXMuYXNMaXN0KHNvcnRlZC5nZXQoMCkpOwogICAgIH0KQEAgLTQxLDUgKzM5LDQgQEAKICAgICBwdWJsaWMgTGlzdDxJbnRlZ2VyPiBjaG9vc2VUYXNrcyhpbnQgaSwgTGlzdDxPYmplY3Q+IGxpc3QpIHsKICAgICAgICAgcmV0dXJuIHRhcmdldDsKICAgICB9Ci0gICAgCiB9CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vc3Rvcm0vdHJpZGVudC9wYXJ0aXRpb24vSWRlbnRpdHlHcm91cGluZy5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL3N0b3JtL3RyaWRlbnQvcGFydGl0aW9uL0lkZW50aXR5R3JvdXBpbmcuamF2YQppbmRleCAzMGY0OGFkLi44OGMyOTIyIDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vc3Rvcm0vdHJpZGVudC9wYXJ0aXRpb24vSWRlbnRpdHlHcm91cGluZy5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9zdG9ybS90cmlkZW50L3BhcnRpdGlvbi9JZGVudGl0eUdyb3VwaW5nLmphdmEKQEAgLTI5LDE4ICsyOSwxNiBAQAogCiAKIHB1YmxpYyBjbGFzcyBJZGVudGl0eUdyb3VwaW5nIGltcGxlbWVudHMgQ3VzdG9tU3RyZWFtR3JvdXBpbmcgewotCi0gICAgTGlzdDxJbnRlZ2VyPiByZXQgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7Ci0gICAgTWFwPEludGVnZXIsIExpc3Q8SW50ZWdlcj4+IF9wcmVjb21wdXRlZCA9IG5ldyBIYXNoTWFwKCk7CisgICAgZmluYWwgTWFwPEludGVnZXIsIExpc3Q8SW50ZWdlcj4+IF9wcmVjb21wdXRlZCA9IG5ldyBIYXNoTWFwPD4oKTsKICAgICAKICAgICBAT3ZlcnJpZGUKICAgICBwdWJsaWMgdm9pZCBwcmVwYXJlKFdvcmtlclRvcG9sb2d5Q29udGV4dCBjb250ZXh0LCBHbG9iYWxTdHJlYW1JZCBzdHJlYW0sIExpc3Q8SW50ZWdlcj4gdGFza3MpIHsKLSAgICAgICAgTGlzdDxJbnRlZ2VyPiBzb3VyY2VUYXNrcyA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oY29udGV4dC5nZXRDb21wb25lbnRUYXNrcyhzdHJlYW0uZ2V0X2NvbXBvbmVudElkKCkpKTsKKyAgICAgICAgTGlzdDxJbnRlZ2VyPiBzb3VyY2VUYXNrcyA9IG5ldyBBcnJheUxpc3Q8Pihjb250ZXh0LmdldENvbXBvbmVudFRhc2tzKHN0cmVhbS5nZXRfY29tcG9uZW50SWQoKSkpOwogICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHNvdXJjZVRhc2tzKTsKICAgICAgICAgaWYoc291cmNlVGFza3Muc2l6ZSgpIT10YXNrcy5zaXplKCkpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDYW4gb25seSBkbyBhbiBpZGVudGl0eSBncm91cGluZyB3aGVuIHNvdXJjZSBhbmQgdGFyZ2V0IGhhdmUgc2FtZSBudW1iZXIgb2YgdGFza3MiKTsKICAgICAgICAgfQotICAgICAgICB0YXNrcyA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4odGFza3MpOworICAgICAgICB0YXNrcyA9IG5ldyBBcnJheUxpc3Q8Pih0YXNrcyk7CiAgICAgICAgIENvbGxlY3Rpb25zLnNvcnQodGFza3MpOwogICAgICAgICBmb3IoaW50IGk9MDsgaTxzb3VyY2VUYXNrcy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgaW50IHMgPSBzb3VyY2VUYXNrcy5nZXQoaSk7CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vc3Rvcm0vdHJpZGVudC9wbGFubmVyL05vZGUuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9zdG9ybS90cmlkZW50L3BsYW5uZXIvTm9kZS5qYXZhCmluZGV4IDYyODRjYjkuLmQzNWU3ZGEgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9zdG9ybS90cmlkZW50L3BsYW5uZXIvTm9kZS5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9zdG9ybS90cmlkZW50L3BsYW5uZXIvTm9kZS5qYXZhCkBAIC0yNiw3ICsyNiw3IEBACiAKIAogcHVibGljIGNsYXNzIE5vZGUgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotICAgIHByaXZhdGUgc3RhdGljIEF0b21pY0ludGVnZXIgSU5ERVggPSBuZXcgQXRvbWljSW50ZWdlcigwKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBdG9taWNJbnRlZ2VyIElOREVYID0gbmV3IEF0b21pY0ludGVnZXIoMCk7CiAgICAgCiAgICAgcHJpdmF0ZSBTdHJpbmcgbm9kZUlkOwogICAgIApAQCAtNDcsNiArNDcsOSBAQAogCiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgIGlmICh0aGlzID09IG8pIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CiAgICAgICAgIHJldHVybiBub2RlSWQuZXF1YWxzKCgoTm9kZSkgbykubm9kZUlkKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9zdG9ybS90cmlkZW50L3BsYW5uZXIvUGFydGl0aW9uTm9kZS5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL3N0b3JtL3RyaWRlbnQvcGxhbm5lci9QYXJ0aXRpb25Ob2RlLmphdmEKaW5kZXggNGYxMGMyNS4uNDQ4NTc2NSAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL3N0b3JtL3RyaWRlbnQvcGxhbm5lci9QYXJ0aXRpb25Ob2RlLmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL3N0b3JtL3RyaWRlbnQvcGxhbm5lci9QYXJ0aXRpb25Ob2RlLmphdmEKQEAgLTIyLDggKzIyLDYgQEAKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBzdG9ybS50cmlkZW50LnV0aWwuVHJpZGVudFV0aWxzOwogCiAKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9zdG9ybS90cmlkZW50L3BsYW5uZXIvU3VidG9wb2xvZ3lCb2x0LmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vc3Rvcm0vdHJpZGVudC9wbGFubmVyL1N1YnRvcG9sb2d5Qm9sdC5qYXZhCmluZGV4IGNkY2VhZjkuLjYzMjBhMjEgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9zdG9ybS90cmlkZW50L3BsYW5uZXIvU3VidG9wb2xvZ3lCb2x0LmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL3N0b3JtL3RyaWRlbnQvcGxhbm5lci9TdWJ0b3BvbG9neUJvbHQuamF2YQpAQCAtMjMsNyArMjMsNiBAQAogaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnRvcG9sb2d5Lk91dHB1dEZpZWxkc0RlY2xhcmVyOwogaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnR1cGxlLkZpZWxkczsKIGltcG9ydCBiYWNrdHlwZS5zdG9ybS50dXBsZS5UdXBsZTsKLWltcG9ydCBiYWNrdHlwZS5zdG9ybS51dGlscy5VdGlsczsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwogaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwpAQCAtNDksOSArNDgsOSBAQAogcHVibGljIGNsYXNzIFN1YnRvcG9sb2d5Qm9sdCBpbXBsZW1lbnRzIElUcmlkZW50QmF0Y2hCb2x0IHsKICAgICBEaXJlY3RlZEdyYXBoIF9ncmFwaDsKICAgICBTZXQ8Tm9kZT4gX25vZGVzOwotICAgIE1hcDxTdHJpbmcsIEluaXRpYWxSZWNlaXZlcj4gX3Jvb3RzID0gbmV3IEhhc2hNYXAoKTsKLSAgICBNYXA8Tm9kZSwgRmFjdG9yeT4gX291dHB1dEZhY3RvcmllcyA9IG5ldyBIYXNoTWFwKCk7Ci0gICAgTWFwPFN0cmluZywgTGlzdDxUcmlkZW50UHJvY2Vzc29yPj4gX215VG9wb2xvZ2ljYWxseU9yZGVyZWQgPSBuZXcgSGFzaE1hcCgpOworICAgIE1hcDxTdHJpbmcsIEluaXRpYWxSZWNlaXZlcj4gX3Jvb3RzID0gbmV3IEhhc2hNYXA8PigpOworICAgIE1hcDxOb2RlLCBGYWN0b3J5PiBfb3V0cHV0RmFjdG9yaWVzID0gbmV3IEhhc2hNYXA8PigpOworICAgIE1hcDxTdHJpbmcsIExpc3Q8VHJpZGVudFByb2Nlc3Nvcj4+IF9teVRvcG9sb2dpY2FsbHlPcmRlcmVkID0gbmV3IEhhc2hNYXA8PigpOwogICAgIE1hcDxOb2RlLCBTdHJpbmc+IF9iYXRjaEdyb3VwczsKICAgICAKICAgICAvL2dpdmVuIHByb2Nlc3Nvcm5vZGVzIGFuZCBzdGF0aWMgc3RhdGUgbm9kZXMKQEAgLTcxLDcgKzcwLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBEaXJlY3RlZFN1YmdyYXBoPE5vZGUsIE9iamVjdD4gc3ViZ3JhcGggPSBuZXcgRGlyZWN0ZWRTdWJncmFwaChfZ3JhcGgsIF9ub2RlcywgbnVsbCk7Ci0gICAgICAgIFRvcG9sb2dpY2FsT3JkZXJJdGVyYXRvciBpdCA9IG5ldyBUb3BvbG9naWNhbE9yZGVySXRlcmF0b3I8Tm9kZSwgT2JqZWN0PihzdWJncmFwaCk7CisgICAgICAgIFRvcG9sb2dpY2FsT3JkZXJJdGVyYXRvciBpdCA9IG5ldyBUb3BvbG9naWNhbE9yZGVySXRlcmF0b3I8PihzdWJncmFwaCk7CiAgICAgICAgIGludCBzdGF0ZUluZGV4ID0gMDsKICAgICAgICAgd2hpbGUoaXQuaGFzTmV4dCgpKSB7CiAgICAgICAgICAgICBOb2RlIG4gPSAoTm9kZSkgaXQubmV4dCgpOwpAQCAtODIsOCArODEsOCBAQAogICAgICAgICAgICAgICAgICAgICBfbXlUb3BvbG9naWNhbGx5T3JkZXJlZC5wdXQoYmF0Y2hHcm91cCwgbmV3IEFycmF5TGlzdCgpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgX215VG9wb2xvZ2ljYWxseU9yZGVyZWQuZ2V0KGJhdGNoR3JvdXApLmFkZChwbi5wcm9jZXNzb3IpOwotICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBwYXJlbnRTdHJlYW1zID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgIExpc3Q8RmFjdG9yeT4gcGFyZW50RmFjdG9yaWVzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBwYXJlbnRTdHJlYW1zID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgICAgICAgTGlzdDxGYWN0b3J5PiBwYXJlbnRGYWN0b3JpZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgICAgICAgICAgICBmb3IoTm9kZSBwOiBUcmlkZW50VXRpbHMuZ2V0UGFyZW50cyhfZ3JhcGgsIG4pKSB7CiAgICAgICAgICAgICAgICAgICAgIHBhcmVudFN0cmVhbXMuYWRkKHAuc3RyZWFtSWQpOwogICAgICAgICAgICAgICAgICAgICBpZihfbm9kZXMuY29udGFpbnMocCkpIHsKQEAgLTk2LDcgKzk1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudEZhY3Rvcmllcy5hZGQoX3Jvb3RzLmdldChwLnN0cmVhbUlkKS5nZXRPdXRwdXRGYWN0b3J5KCkpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIExpc3Q8VHVwbGVSZWNlaXZlcj4gdGFyZ2V0cyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgICAgICAgICBMaXN0PFR1cGxlUmVjZWl2ZXI+IHRhcmdldHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgICAgICAgICAgICBib29sZWFuIG91dGdvaW5nTm9kZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgIGZvcihOb2RlIGNuOiBUcmlkZW50VXRpbHMuZ2V0Q2hpbGRyZW4oX2dyYXBoLCBuKSkgewogICAgICAgICAgICAgICAgICAgICBpZihfbm9kZXMuY29udGFpbnMoY24pKSB7CkBAIC0xODUsNyArMTg0LDcgQEAKICAgICAKICAgICAKICAgICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIEluaXRpYWxSZWNlaXZlciB7Ci0gICAgICAgIExpc3Q8VHJpZGVudFByb2Nlc3Nvcj4gX3JlY2VpdmVycyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgTGlzdDxUcmlkZW50UHJvY2Vzc29yPiBfcmVjZWl2ZXJzID0gbmV3IEFycmF5TGlzdDw+KCk7CiAgICAgICAgIFJvb3RGYWN0b3J5IF9mYWN0b3J5OwogICAgICAgICBQcm9qZWN0aW9uRmFjdG9yeSBfcHJvamVjdDsKICAgICAgICAgU3RyaW5nIF9zdHJlYW07CkBAIC0xOTUsNyArMTk0LDcgQEAKICAgICAgICAgICAgIC8vIGhvdyB0byBkaXN0aW5ndWlzaCAiYmF0Y2giIHN0cmVhbXMgZnJvbSBub24tYmF0Y2ggc3RyZWFtcz8KICAgICAgICAgICAgIF9zdHJlYW0gPSBzdHJlYW07CiAgICAgICAgICAgICBfZmFjdG9yeSA9IG5ldyBSb290RmFjdG9yeShhbGxGaWVsZHMpOwotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHByb2plY3RlZCA9IG5ldyBBcnJheUxpc3QoYWxsRmllbGRzLnRvTGlzdCgpKTsKKyAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBwcm9qZWN0ZWQgPSBuZXcgQXJyYXlMaXN0PD4oYWxsRmllbGRzLnRvTGlzdCgpKTsKICAgICAgICAgICAgIHByb2plY3RlZC5yZW1vdmUoMCk7CiAgICAgICAgICAgICBfcHJvamVjdCA9IG5ldyBQcm9qZWN0aW9uRmFjdG9yeShfZmFjdG9yeSwgbmV3IEZpZWxkcyhwcm9qZWN0ZWQpKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL3N0b3JtL3RyaWRlbnQvcGxhbm5lci9wcm9jZXNzb3IvTXVsdGlSZWR1Y2VyUHJvY2Vzc29yLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vc3Rvcm0vdHJpZGVudC9wbGFubmVyL3Byb2Nlc3Nvci9NdWx0aVJlZHVjZXJQcm9jZXNzb3IuamF2YQppbmRleCA2Nzc3ZDJmLi40MDg2OTk2IDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vc3Rvcm0vdHJpZGVudC9wbGFubmVyL3Byb2Nlc3Nvci9NdWx0aVJlZHVjZXJQcm9jZXNzb3IuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vc3Rvcm0vdHJpZGVudC9wbGFubmVyL3Byb2Nlc3Nvci9NdWx0aVJlZHVjZXJQcm9jZXNzb3IuamF2YQpAQCAtNDksNyArNDksNyBAQAogICAgIHB1YmxpYyB2b2lkIHByZXBhcmUoTWFwIGNvbmYsIFRvcG9sb2d5Q29udGV4dCBjb250ZXh0LCBUcmlkZW50Q29udGV4dCB0cmlkZW50Q29udGV4dCkgewogICAgICAgICBMaXN0PEZhY3Rvcnk+IHBhcmVudHMgPSB0cmlkZW50Q29udGV4dC5nZXRQYXJlbnRUdXBsZUZhY3RvcmllcygpOwogICAgICAgICBfY29udGV4dCA9IHRyaWRlbnRDb250ZXh0OwotICAgICAgICBfc3RyZWFtVG9JbmRleCA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsKKyAgICAgICAgX3N0cmVhbVRvSW5kZXggPSBuZXcgSGFzaE1hcDw+KCk7CiAgICAgICAgIExpc3Q8U3RyaW5nPiBwYXJlbnRTdHJlYW1zID0gdHJpZGVudENvbnRleHQuZ2V0UGFyZW50U3RyZWFtcygpOwogICAgICAgICBmb3IoaW50IGk9MDsgaTxwYXJlbnRTdHJlYW1zLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICBfc3RyZWFtVG9JbmRleC5wdXQocGFyZW50U3RyZWFtcy5nZXQoaSksIGkpOwpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL3N0b3JtL3RyaWRlbnQvc3BvdXQvSVRyaWRlbnRTcG91dC5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL3N0b3JtL3RyaWRlbnQvc3BvdXQvSVRyaWRlbnRTcG91dC5qYXZhCmluZGV4IGU0M2QxNDQuLjMwMzcyOTggMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9zdG9ybS90cmlkZW50L3Nwb3V0L0lUcmlkZW50U3BvdXQuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vc3Rvcm0vdHJpZGVudC9zcG91dC9JVHJpZGVudFNwb3V0LmphdmEKQEAgLTM0LDggKzM0LDggQEAKICAgICAgICAgICogCiAgICAgICAgICAqIFRoZSBtZXRhZGF0YSBpcyBzdG9yZWQgaW4gWm9va2VlcGVyLgogICAgICAgICAgKiAKLSAgICAgICAgICogU3Rvcm0gdXNlcyB0aGUgS3J5byBzZXJpYWxpemF0aW9ucyBjb25maWd1cmVkIGluIHRoZSBjb21wb25lbnQgY29uZmlndXJhdGlvbiAKLSAgICAgICAgICogZm9yIHRoaXMgc3BvdXQgdG8gc2VyaWFsaXplIGFuZCBkZXNlcmlhbGl6ZSB0aGUgbWV0YWRhdGEuCisgICAgICAgICAqIFN0b3JtIHVzZXMgSlNPTiBlbmNvZGluZyB0byBzdG9yZSB0aGUgbWV0YWRhdGEuICBPbmx5IHNpbXBsZSB0eXBlcworICAgICAgICAgKiBzdWNoIGFzIG51bWJlcnMsIGJvb2xlYW5zLCBzdHJpbmdzLCBsaXN0cywgYW5kIG1hcHMgc2hvdWxkIGJlIHVzZWQuCiAgICAgICAgICAqIAogICAgICAgICAgKiBAcGFyYW0gdHhpZCBUaGUgaWQgb2YgdGhlIHRyYW5zYWN0aW9uLgogICAgICAgICAgKiBAcGFyYW0gcHJldk1ldGFkYXRhIFRoZSBtZXRhZGF0YSBvZiB0aGUgcHJldmlvdXMgdHJhbnNhY3Rpb24KQEAgLTQ0LDkgKzQ0LDIwIEBACiAgICAgICAgICAqIEByZXR1cm4gdGhlIG1ldGFkYXRhIGZvciB0aGlzIG5ldyB0cmFuc2FjdGlvbgogICAgICAgICAgKi8KICAgICAgICAgWCBpbml0aWFsaXplVHJhbnNhY3Rpb24obG9uZyB0eGlkLCBYIHByZXZNZXRhZGF0YSwgWCBjdXJyTWV0YWRhdGEpOwotICAgICAgICAKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBhdHRlbXB0IGNvbW1pdHRlZCBzdWNjZXNzZnVsbHksIHNvIGFsbCBzdGF0ZSBmb3IgdGhpcyBjb21taXQgYW5kIGJlZm9yZSBjYW4gYmUgc2FmZWx5IGNsZWFuZWQgdXAuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB0eGlkIHRyYW5zYWN0aW9uIGlkIHRoYXQgY29tcGxldGVkCisgICAgICAgICAqLwogICAgICAgICB2b2lkIHN1Y2Nlc3MobG9uZyB0eGlkKTsKLSAgICAgICAgCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIGhpbnQgdG8gU3Rvcm0gaWYgdGhlIHNwb3V0IGlzIHJlYWR5IGZvciB0aGUgdHJhbnNhY3Rpb24gaWQKKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHR4aWQgdGhlIGlkIG9mIHRoZSB0cmFuc2FjdGlvbgorICAgICAgICAgKiBAcmV0dXJuIHRydWUsIGlmIHRoZSBzcG91dCBpcyByZWFkeSBmb3IgdGhlIGdpdmVuIHRyYW5zYWN0aW9uIGlkCisgICAgICAgICAqLwogICAgICAgICBib29sZWFuIGlzUmVhZHkobG9uZyB0eGlkKTsKICAgICAgICAgCiAgICAgICAgIC8qKgpAQCAtNTgsMTQgKzY5LDE3IEBACiAgICAgaW50ZXJmYWNlIEVtaXR0ZXI8WD4gewogICAgICAgICAvKioKICAgICAgICAgICogRW1pdCBhIGJhdGNoIGZvciB0aGUgc3BlY2lmaWVkIHRyYW5zYWN0aW9uIGF0dGVtcHQgYW5kIG1ldGFkYXRhIGZvciB0aGUgdHJhbnNhY3Rpb24uIFRoZSBtZXRhZGF0YQotICAgICAgICAgKiB3YXMgY3JlYXRlZCBieSB0aGUgQ29vcmRpbmF0b3IgaW4gdGhlIGluaXRpYWxpemVUcmFuYWN0aW9uIG1ldGhvZC4gVGhpcyBtZXRob2QgbXVzdCBhbHdheXMgZW1pdAorICAgICAgICAgKiB3YXMgY3JlYXRlZCBieSB0aGUgQ29vcmRpbmF0b3IgaW4gdGhlIGluaXRpYWxpemVUcmFuc2FjdGlvbiBtZXRob2QuIFRoaXMgbWV0aG9kIG11c3QgYWx3YXlzIGVtaXQKICAgICAgICAgICogdGhlIHNhbWUgYmF0Y2ggb2YgdHVwbGVzIGFjcm9zcyBhbGwgdGFza3MgZm9yIHRoZSBzYW1lIHRyYW5zYWN0aW9uIGlkLgotICAgICAgICAgKiAKKyAgICAgICAgICogQHBhcmFtIHR4IHRyYW5zYWN0aW9uIGlkCisgICAgICAgICAqIEBwYXJhbSBjb29yZGluYXRvck1ldGEgbWV0YWRhdGEgZnJvbSB0aGUgY29vcmRpbmF0b3IgZGVmaW5pbmcgdGhpcyB0cmFuc2FjdGlvbgorICAgICAgICAgKiBAcGFyYW0gY29sbGVjdG9yIG91dHB1dCB0dXBsZSBjb2xsZWN0b3IKICAgICAgICAgICovCiAgICAgICAgIHZvaWQgZW1pdEJhdGNoKFRyYW5zYWN0aW9uQXR0ZW1wdCB0eCwgWCBjb29yZGluYXRvck1ldGEsIFRyaWRlbnRDb2xsZWN0b3IgY29sbGVjdG9yKTsKICAgICAgICAgCiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGlzIGF0dGVtcHQgY29tbWl0dGVkIHN1Y2Nlc3NmdWxseSwgc28gYWxsIHN0YXRlIGZvciB0aGlzIGNvbW1pdCBhbmQgYmVmb3JlIGNhbiBiZSBzYWZlbHkgY2xlYW5lZCB1cC4KKyAgICAgICAgICogQHBhcmFtIHR4IGF0dGVtcHQgb2JqZWN0IGNvbnRhaW5pbmcgdHJhbnNhY3Rpb24gaWQgYW5kIGF0dGVtcHQgbnVtYmVyCiAgICAgICAgICAqLwogICAgICAgICB2b2lkIHN1Y2Nlc3MoVHJhbnNhY3Rpb25BdHRlbXB0IHR4KTsKICAgICAgICAgCkBAIC03Niw5ICs5MCwxOCBAQAogICAgIH0KICAgICAKICAgICAvKioKLSAgICAgKiBUaGUgY29vcmRpbmF0b3IgZm9yIGEgVHJhbnNhY3Rpb25hbFNwb3V0IHJ1bnMgaW4gYSBzaW5nbGUgdGhyZWFkIGFuZCBpbmRpY2F0ZXMgd2hlbiBiYXRjaGVzCi0gICAgICogb2YgdHVwbGVzIHNob3VsZCBiZSBlbWl0dGVkIGFuZCB3aGVuIHRyYW5zYWN0aW9ucyBzaG91bGQgY29tbWl0LiBUaGUgQ29vcmRpbmF0b3IgdGhhdCB5b3UgcHJvdmlkZSAKLSAgICAgKiBpbiBhIFRyYW5zYWN0aW9uYWxTcG91dCBwcm92aWRlcyBtZXRhZGF0YSBmb3IgZWFjaCB0cmFuc2FjdGlvbiBzbyB0aGF0IHRoZSB0cmFuc2FjdGlvbnMgY2FuIGJlIHJlcGxheWVkLgorICAgICAqIFRoZSBjb29yZGluYXRvciBmb3IgYSBUcmFuc2FjdGlvbmFsU3BvdXQgcnVucyBpbiBhIHNpbmdsZSB0aHJlYWQgYW5kIGluZGljYXRlcyB3aGVuIGJhdGNoZXMgb2YgdHVwbGVzCisgICAgICogc2hvdWxkIGJlIGVtaXR0ZWQuIFRoZSBDb29yZGluYXRvciB0aGF0IHlvdSBwcm92aWRlIGluIGEgVHJhbnNhY3Rpb25hbFNwb3V0IHByb3ZpZGVzIG1ldGFkYXRhIGZvciBlYWNoCisgICAgICogdHJhbnNhY3Rpb24gc28gdGhhdCB0aGUgdHJhbnNhY3Rpb25zIGNhbiBiZSByZXBsYXllZCBpbiBjYXNlIG9mIGZhaWx1cmUuCisgICAgICoKKyAgICAgKiBUd28gaW5zdGFuY2VzIGFyZSByZXF1ZXN0ZWQsIG9uZSBvbiB0aGUgbWFzdGVyIGJhdGNoIGNvb3JkaW5hdG9yIHdoZXJlIGlzUmVhZHkoKSBpcyBjYWxsZWQsIGFuZCBhbiBpbnN0YW5jZQorICAgICAqIGluIHRoZSBjb29yZGluYXRvciBib2x0IHdoaWNoIGlzIHVzZWQgZm9yIGFsbCBvdGhlciBvcGVyYXRpb25zLiBUaGUgdHdvIGluc3RhbmNlcyBkbyBub3QgbmVjZXNzYXJpbHkgc2hhcmUgYQorICAgICAqIHdvcmtlciBKVk0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHhTdGF0ZUlkIHN0cmVhbSBpZAorICAgICAqIEBwYXJhbSBjb25mIFN0b3JtIGNvbmZpZyBtYXAKKyAgICAgKiBAcGFyYW0gY29udGV4dCB0b3BvbG9neSBjb250ZXh0CisgICAgICogQHJldHVybiBzcG91dCBjb29yZGluYXRvciBpbnN0YW5jZQogICAgICAqLwogICAgIEJhdGNoQ29vcmRpbmF0b3I8VD4gZ2V0Q29vcmRpbmF0b3IoU3RyaW5nIHR4U3RhdGVJZCwgTWFwIGNvbmYsIFRvcG9sb2d5Q29udGV4dCBjb250ZXh0KTsKIApAQCAtODYsNyArMTA5LDE1IEBACiAgICAgICogVGhlIGVtaXR0ZXIgZm9yIGEgVHJhbnNhY3Rpb25hbFNwb3V0IHJ1bnMgYXMgbWFueSB0YXNrcyBhY3Jvc3MgdGhlIGNsdXN0ZXIuIEVtaXR0ZXJzIGFyZSByZXNwb25zaWJsZSBmb3IKICAgICAgKiBlbWl0dGluZyBiYXRjaGVzIG9mIHR1cGxlcyBmb3IgYSB0cmFuc2FjdGlvbiBhbmQgbXVzdCBlbnN1cmUgdGhhdCB0aGUgc2FtZSBiYXRjaCBvZiB0dXBsZXMgaXMgYWx3YXlzCiAgICAgICogZW1pdHRlZCBmb3IgdGhlIHNhbWUgdHJhbnNhY3Rpb24gaWQuCi0gICAgICovICAgIAorICAgICAqCisgICAgICogQWxsIGVtaXR0ZXIgdGFza3MgZ2V0IHRoZSBzYW1lIHRyYW5zYWN0aW9uIG1ldGFkYXRhLiBUaGUgdG9wb2xvZ3kgY29udGV4dCBwYXJhbWV0ZXIgY29udGFpbnMgdGhlIGluc3RhbmNlCisgICAgICogdGFzayBpZCB0aGF0IGNhbiBiZSB1c2VkIHRvIGRpc3RyaWJ1dGUgdGhlIHdvcmsgYWNyb3NzIHRoZSB0YXNrcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eFN0YXRlSWQgc3RyZWFtIGlkCisgICAgICogQHBhcmFtIGNvbmYgU3Rvcm0gY29uZmlnIG1hcAorICAgICAqIEBwYXJhbSBjb250ZXh0IHRvcG9sb2d5IGNvbnRleHQKKyAgICAgKiBAcmV0dXJuIHNwb3V0IGVtaXR0ZXIKKyAgICAgKi8KICAgICBFbWl0dGVyPFQ+IGdldEVtaXR0ZXIoU3RyaW5nIHR4U3RhdGVJZCwgTWFwIGNvbmYsIFRvcG9sb2d5Q29udGV4dCBjb250ZXh0KTsgCiAgICAgCiAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRDb21wb25lbnRDb25maWd1cmF0aW9uKCk7CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vc3Rvcm0vdHJpZGVudC9zcG91dC9PcGFxdWVQYXJ0aXRpb25lZFRyaWRlbnRTcG91dEV4ZWN1dG9yLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vc3Rvcm0vdHJpZGVudC9zcG91dC9PcGFxdWVQYXJ0aXRpb25lZFRyaWRlbnRTcG91dEV4ZWN1dG9yLmphdmEKaW5kZXggOWNkOThlZS4uY2IxOWI3YyAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL3N0b3JtL3RyaWRlbnQvc3BvdXQvT3BhcXVlUGFydGl0aW9uZWRUcmlkZW50U3BvdXRFeGVjdXRvci5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9zdG9ybS90cmlkZW50L3Nwb3V0L09wYXF1ZVBhcnRpdGlvbmVkVHJpZGVudFNwb3V0RXhlY3V0b3IuamF2YQpAQCAtMTE5LDggKzExOSw5IEBACiAgICAgICAgICAgICAgICAgcHJldkNhY2hlZCA9IG5ldyBIYXNoTWFwPD4oKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIAotICAgICAgICAgICAgZm9yKFN0cmluZyBpZDogX3BhcnRpdGlvblN0YXRlcy5rZXlTZXQoKSkgewotICAgICAgICAgICAgICAgIEVtaXR0ZXJQYXJ0aXRpb25TdGF0ZSBzID0gX3BhcnRpdGlvblN0YXRlcy5nZXQoaWQpOworICAgICAgICAgICAgZm9yKEVudHJ5PFN0cmluZywgRW1pdHRlclBhcnRpdGlvblN0YXRlPiBlOiBfcGFydGl0aW9uU3RhdGVzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgaWQgPSBlLmdldEtleSgpOworICAgICAgICAgICAgICAgIEVtaXR0ZXJQYXJ0aXRpb25TdGF0ZSBzID0gZS5nZXRWYWx1ZSgpOwogICAgICAgICAgICAgICAgIHMucm90YXRpbmdTdGF0ZS5yZW1vdmVTdGF0ZSh0eC5nZXRUcmFuc2FjdGlvbklkKCkpOwogICAgICAgICAgICAgICAgIE9iamVjdCBsYXN0TWV0YSA9IHByZXZDYWNoZWQuZ2V0KGlkKTsKICAgICAgICAgICAgICAgICBpZihsYXN0TWV0YT09bnVsbCkgbGFzdE1ldGEgPSBzLnJvdGF0aW5nU3RhdGUuZ2V0TGFzdFN0YXRlKCk7CkBAIC0xNjIsOSArMTYzLDggQEAKICAgICAgICAgICAgIAogICAgICAgICAgICAgTG9uZyB0eGlkID0gYXR0ZW1wdC5nZXRUcmFuc2FjdGlvbklkKCk7CiAgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1ldGFzID0gX2NhY2hlZE1ldGFzLnJlbW92ZSh0eGlkKTsKLSAgICAgICAgICAgIGZvcihTdHJpbmcgcGFydGl0aW9uSWQ6IG1ldGFzLmtleVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IG1ldGEgPSBtZXRhcy5nZXQocGFydGl0aW9uSWQpOwotICAgICAgICAgICAgICAgIF9wYXJ0aXRpb25TdGF0ZXMuZ2V0KHBhcnRpdGlvbklkKS5yb3RhdGluZ1N0YXRlLm92ZXJyaWRlU3RhdGUodHhpZCwgbWV0YSk7CisgICAgICAgICAgICBmb3IoRW50cnk8U3RyaW5nLCBPYmplY3Q+IGVudHJ5OiBtZXRhcy5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICAgICAgX3BhcnRpdGlvblN0YXRlcy5nZXQoZW50cnkuZ2V0S2V5KCkpLnJvdGF0aW5nU3RhdGUub3ZlcnJpZGVTdGF0ZSh0eGlkLCBlbnRyeS5nZXRWYWx1ZSgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vc3Rvcm0vdHJpZGVudC9zcG91dC9UcmlkZW50U3BvdXRFeGVjdXRvci5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL3N0b3JtL3RyaWRlbnQvc3BvdXQvVHJpZGVudFNwb3V0RXhlY3V0b3IuamF2YQppbmRleCA2NDMxNDI2Li5kNDNkNGU0IDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vc3Rvcm0vdHJpZGVudC9zcG91dC9UcmlkZW50U3BvdXRFeGVjdXRvci5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9zdG9ybS90cmlkZW50L3Nwb3V0L1RyaWRlbnRTcG91dEV4ZWN1dG9yLmphdmEKQEAgLTM3LDkgKzM3LDkgQEAKIGltcG9ydCBzdG9ybS50cmlkZW50LnR1cGxlLkNvbnNMaXN0OwogCiBwdWJsaWMgY2xhc3MgVHJpZGVudFNwb3V0RXhlY3V0b3IgaW1wbGVtZW50cyBJVHJpZGVudEJhdGNoQm9sdCB7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgSURfRklFTEQgPSAiJHR4IjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBJRF9GSUVMRCA9ICIkdHgiOwogICAgIAotICAgIHB1YmxpYyBzdGF0aWMgTG9nZ2VyIExPRyA9IExvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKFRyaWRlbnRTcG91dEV4ZWN1dG9yLmNsYXNzKTsgICAgCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoVHJpZGVudFNwb3V0RXhlY3V0b3IuY2xhc3MpOwogCiAgICAgQWRkSWRDb2xsZWN0b3IgX2NvbGxlY3RvcjsKICAgICBJVHJpZGVudFNwb3V0PE9iamVjdD4gX3Nwb3V0OwpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvanZtL3N0b3JtL3RyaWRlbnQvdG9wb2xvZ3kvVHJpZGVudEJvbHRFeGVjdXRvci5qYXZhIGIvc3Rvcm0tY29yZS9zcmMvanZtL3N0b3JtL3RyaWRlbnQvdG9wb2xvZ3kvVHJpZGVudEJvbHRFeGVjdXRvci5qYXZhCmluZGV4IGZhNjhhZTIuLjcyMTA1NDEgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9zdG9ybS90cmlkZW50L3RvcG9sb2d5L1RyaWRlbnRCb2x0RXhlY3V0b3IuamF2YQorKysgYi9zdG9ybS1jb3JlL3NyYy9qdm0vc3Rvcm0vdHJpZGVudC90b3BvbG9neS9UcmlkZW50Qm9sdEV4ZWN1dG9yLmphdmEKQEAgLTQ3LDcgKzQ3LDcgQEAKIGltcG9ydCBzdG9ybS50cmlkZW50LnNwb3V0LklCYXRjaElEOwogCiBwdWJsaWMgY2xhc3MgVHJpZGVudEJvbHRFeGVjdXRvciBpbXBsZW1lbnRzIElSaWNoQm9sdCB7Ci0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgQ09PUkRfU1RSRUFNX1BSRUZJWCA9ICIkY29vcmQtIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT09SRF9TVFJFQU1fUFJFRklYID0gIiRjb29yZC0iOwogICAgIAogICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIENPT1JEX1NUUkVBTShTdHJpbmcgYmF0Y2gpIHsKICAgICAgICAgcmV0dXJuIENPT1JEX1NUUkVBTV9QUkVGSVggKyBiYXRjaDsKQEAgLTgxLDcgKzgxLDcgQEAKICAgICAKICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENvb3JkU3BlYyBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CiAgICAgICAgIHB1YmxpYyBHbG9iYWxTdHJlYW1JZCBjb21taXRTdHJlYW0gPSBudWxsOwotICAgICAgICBwdWJsaWMgTWFwPFN0cmluZywgQ29vcmRUeXBlPiBjb29yZHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIENvb3JkVHlwZT4oKTsKKyAgICAgICAgcHVibGljIE1hcDxTdHJpbmcsIENvb3JkVHlwZT4gY29vcmRzID0gbmV3IEhhc2hNYXA8PigpOwogICAgICAgICAKICAgICAgICAgcHVibGljIENvb3JkU3BlYygpIHsKICAgICAgICAgfQpAQCAtMzA3LDcgKzMwNyw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgU3RyaW5nIGJhdGNoR3JvdXAgPSBfYmF0Y2hHcm91cElkcy5nZXQodHVwbGUuZ2V0U291cmNlR2xvYmFsU3RyZWFtaWQoKSk7CisgICAgICAgIFN0cmluZyBiYXRjaEdyb3VwID0gX2JhdGNoR3JvdXBJZHMuZ2V0KHR1cGxlLmdldFNvdXJjZUdsb2JhbFN0cmVhbUlkKCkpOwogICAgICAgICBpZihiYXRjaEdyb3VwPT1udWxsKSB7CiAgICAgICAgICAgICAvLyB0aGlzIGlzIHNvIHdlIGNhbiBkbyB0aGluZ3MgbGlrZSBoYXZlIHNpbXBsZSBEUlBDIHRoYXQgZG9lc24ndCBuZWVkIHRvIHVzZSBiYXRjaCBwcm9jZXNzaW5nCiAgICAgICAgICAgICBfY29vcmRDb2xsZWN0b3Iuc2V0Q3VyckJhdGNoKG51bGwpOwpAQCAtMzE3LDcgKzMxNyw3IEBACiAgICAgICAgIH0KICAgICAgICAgSUJhdGNoSUQgaWQgPSAoSUJhdGNoSUQpIHR1cGxlLmdldFZhbHVlKDApOwogICAgICAgICAvL2dldCB0cmFuc2FjdGlvbiBpZAotICAgICAgICAvL2lmIGl0IGFscmVhZHkgZXhpc3N0cyBhbmQgYXR0ZW1wdCBpZCBpcyBncmVhdGVyIHRoYW4gdGhlIGF0dGVtcHQgdGhlcmUKKyAgICAgICAgLy9pZiBpdCBhbHJlYWR5IGV4aXN0cyBhbmQgYXR0ZW1wdCBpZCBpcyBncmVhdGVyIHRoYW4gdGhlIGF0dGVtcHQgdGhlcmUKICAgICAgICAgCiAgICAgICAgIAogICAgICAgICBUcmFja2VkQmF0Y2ggdHJhY2tlZCA9IChUcmFja2VkQmF0Y2gpIF9iYXRjaGVzLmdldChpZC5nZXRJZCgpKTsKQEAgLTQwNyw3ICs0MDcsNyBAQAogICAgIHByaXZhdGUgVHVwbGVUeXBlIGdldFR1cGxlVHlwZShUdXBsZSB0dXBsZSwgVHJhY2tlZEJhdGNoIGJhdGNoKSB7CiAgICAgICAgIENvb3JkQ29uZGl0aW9uIGNvbmQgPSBiYXRjaC5jb25kaXRpb247CiAgICAgICAgIGlmKGNvbmQuY29tbWl0U3RyZWFtIT1udWxsCi0gICAgICAgICAgICAgICAgJiYgdHVwbGUuZ2V0U291cmNlR2xvYmFsU3RyZWFtaWQoKS5lcXVhbHMoY29uZC5jb21taXRTdHJlYW0pKSB7CisgICAgICAgICAgICAgICAgJiYgdHVwbGUuZ2V0U291cmNlR2xvYmFsU3RyZWFtSWQoKS5lcXVhbHMoY29uZC5jb21taXRTdHJlYW0pKSB7CiAgICAgICAgICAgICByZXR1cm4gVHVwbGVUeXBlLkNPTU1JVDsKICAgICAgICAgfSBlbHNlIGlmKGNvbmQuZXhwZWN0ZWRUYXNrUmVwb3J0cyA+IDAKICAgICAgICAgICAgICAgICAmJiB0dXBsZS5nZXRTb3VyY2VTdHJlYW1JZCgpLnN0YXJ0c1dpdGgoQ09PUkRfU1RSRUFNX1BSRUZJWCkpIHsKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9zdG9ybS90cmlkZW50L3RvcG9sb2d5L1RyaWRlbnRUb3BvbG9neUJ1aWxkZXIuamF2YSBiL3N0b3JtLWNvcmUvc3JjL2p2bS9zdG9ybS90cmlkZW50L3RvcG9sb2d5L1RyaWRlbnRUb3BvbG9neUJ1aWxkZXIuamF2YQppbmRleCAyMjZhMTFhLi4xNWI1Mjk2IDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9qdm0vc3Rvcm0vdHJpZGVudC90b3BvbG9neS9UcmlkZW50VG9wb2xvZ3lCdWlsZGVyLmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL3N0b3JtL3RyaWRlbnQvdG9wb2xvZ3kvVHJpZGVudFRvcG9sb2d5QnVpbGRlci5qYXZhCkBAIC0xMDIsNyArMTAyLDcgQEAKICAgICB9CiAgICAgCiAgICAgTWFwPEdsb2JhbFN0cmVhbUlkLCBTdHJpbmc+IGZsZXNoT3V0U3RyZWFtQmF0Y2hJZHMoYm9vbGVhbiBpbmNsdWRlQ29tbWl0U3RyZWFtKSB7Ci0gICAgICAgIE1hcDxHbG9iYWxTdHJlYW1JZCwgU3RyaW5nPiByZXQgPSBuZXcgSGFzaE1hcDxHbG9iYWxTdHJlYW1JZCwgU3RyaW5nPihfYmF0Y2hJZHMpOworICAgICAgICBNYXA8R2xvYmFsU3RyZWFtSWQsIFN0cmluZz4gcmV0ID0gbmV3IEhhc2hNYXA8PihfYmF0Y2hJZHMpOwogICAgICAgICBTZXQ8U3RyaW5nPiBhbGxCYXRjaGVzID0gbmV3IEhhc2hTZXQoX2JhdGNoSWRzLnZhbHVlcygpKTsKICAgICAgICAgZm9yKFN0cmluZyBiOiBhbGxCYXRjaGVzKSB7CiAgICAgICAgICAgICByZXQucHV0KG5ldyBHbG9iYWxTdHJlYW1JZChtYXN0ZXJDb29yZGluYXRvcihiKSwgTWFzdGVyQmF0Y2hDb29yZGluYXRvci5CQVRDSF9TVFJFQU1fSUQpLCBiKTsKQEAgLTEzNCw4ICsxMzQsOCBAQAogICAgICAgICBNYXA8R2xvYmFsU3RyZWFtSWQsIFN0cmluZz4gYmF0Y2hJZHNGb3JTcG91dHMgPSBmbGVzaE91dFN0cmVhbUJhdGNoSWRzKGZhbHNlKTsKICAgICAgICAgTWFwPEdsb2JhbFN0cmVhbUlkLCBTdHJpbmc+IGJhdGNoSWRzRm9yQm9sdHMgPSBmbGVzaE91dFN0cmVhbUJhdGNoSWRzKHRydWUpOwogCi0gICAgICAgIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gYmF0Y2hlc1RvQ29tbWl0SWRzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+KCk7Ci0gICAgICAgIE1hcDxTdHJpbmcsIExpc3Q8SVRyaWRlbnRTcG91dD4+IGJhdGNoZXNUb1Nwb3V0cyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdDxJVHJpZGVudFNwb3V0Pj4oKTsKKyAgICAgICAgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBiYXRjaGVzVG9Db21taXRJZHMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIE1hcDxTdHJpbmcsIExpc3Q8SVRyaWRlbnRTcG91dD4+IGJhdGNoZXNUb1Nwb3V0cyA9IG5ldyBIYXNoTWFwPD4oKTsKICAgICAgICAgCiAgICAgICAgIGZvcihTdHJpbmcgaWQ6IF9zcG91dHMua2V5U2V0KCkpIHsKICAgICAgICAgICAgIFRyYW5zYWN0aW9uYWxTcG91dENvbXBvbmVudCBjID0gX3Nwb3V0cy5nZXQoaWQpOwpAQCAtMTk2LDggKzE5Niw5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgCi0gICAgICAgIGZvcihTdHJpbmcgYmF0Y2g6IGJhdGNoZXNUb0NvbW1pdElkcy5rZXlTZXQoKSkgewotICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGNvbW1pdElkcyA9IGJhdGNoZXNUb0NvbW1pdElkcy5nZXQoYmF0Y2gpOworICAgICAgICBmb3IoTWFwLkVudHJ5PFN0cmluZywgTGlzdDxTdHJpbmc+PiBlbnRyeTogYmF0Y2hlc1RvQ29tbWl0SWRzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBiYXRjaCA9IGVudHJ5LmdldEtleSgpOworICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGNvbW1pdElkcyA9IGVudHJ5LmdldFZhbHVlKCk7CiAgICAgICAgICAgICBidWlsZGVyLnNldFNwb3V0KG1hc3RlckNvb3JkaW5hdG9yKGJhdGNoKSwgbmV3IE1hc3RlckJhdGNoQ29vcmRpbmF0b3IoY29tbWl0SWRzLCBiYXRjaGVzVG9TcG91dHMuZ2V0KGJhdGNoKSkpOwogICAgICAgICB9CiAgICAgICAgICAgICAgICAgCkBAIC0yMzMsOSArMjM0LDkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIAogICAgICAgICAgICAgTWFwPFN0cmluZywgU2V0PFN0cmluZz4+IGJhdGNoVG9Db21wb25lbnRzID0gZ2V0Qm9sdEJhdGNoVG9Db21wb25lbnRTdWJzY3JpcHRpb25zKGlkKTsKLSAgICAgICAgICAgIGZvcihTdHJpbmcgYjogYmF0Y2hUb0NvbXBvbmVudHMua2V5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICBmb3IoU3RyaW5nIGNvbXA6IGJhdGNoVG9Db21wb25lbnRzLmdldChiKSkgewotICAgICAgICAgICAgICAgICAgICBkLmRpcmVjdEdyb3VwaW5nKGNvbXAsIFRyaWRlbnRCb2x0RXhlY3V0b3IuQ09PUkRfU1RSRUFNKGIpKTsKKyAgICAgICAgICAgIGZvcihNYXAuRW50cnk8U3RyaW5nLCBTZXQ8U3RyaW5nPj4gZW50cnk6IGJhdGNoVG9Db21wb25lbnRzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBmb3IoU3RyaW5nIGNvbXA6IGVudHJ5LmdldFZhbHVlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZC5kaXJlY3RHcm91cGluZyhjb21wLCBUcmlkZW50Qm9sdEV4ZWN1dG9yLkNPT1JEX1NUUkVBTShlbnRyeS5nZXRLZXkoKSkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIApAQCAtMjQ4LDggKzI0OSw4IEBACiAgICAgfQogICAgIAogICAgIHByaXZhdGUgdm9pZCBtYXJrQmF0Y2hHcm91cHMoU3RyaW5nIGNvbXBvbmVudCwgTWFwPFN0cmluZywgU3RyaW5nPiBiYXRjaEdyb3VwcykgewotICAgICAgICBmb3IoU3RyaW5nIHN0cmVhbTogYmF0Y2hHcm91cHMua2V5U2V0KCkpIHsKLSAgICAgICAgICAgIF9iYXRjaElkcy5wdXQobmV3IEdsb2JhbFN0cmVhbUlkKGNvbXBvbmVudCwgc3RyZWFtKSwgYmF0Y2hHcm91cHMuZ2V0KHN0cmVhbSkpOworICAgICAgICBmb3IoTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBlbnRyeTogYmF0Y2hHcm91cHMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgX2JhdGNoSWRzLnB1dChuZXcgR2xvYmFsU3RyZWFtSWQoY29tcG9uZW50LCBlbnRyeS5nZXRLZXkoKSksIGVudHJ5LmdldFZhbHVlKCkpOwogICAgICAgICB9CiAgICAgfQogICAgIApAQCAtMjkxLDcgKzI5Miw3IEBACiAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ29tcG9uZW50IHsKICAgICAgICAgcHVibGljIElUcmlkZW50QmF0Y2hCb2x0IGJvbHQ7CiAgICAgICAgIHB1YmxpYyBJbnRlZ2VyIHBhcmFsbGVsaXNtOwotICAgICAgICBwdWJsaWMgTGlzdDxJbnB1dERlY2xhcmF0aW9uPiBkZWNsYXJhdGlvbnMgPSBuZXcgQXJyYXlMaXN0PElucHV0RGVjbGFyYXRpb24+KCk7CisgICAgICAgIHB1YmxpYyBMaXN0PElucHV0RGVjbGFyYXRpb24+IGRlY2xhcmF0aW9ucyA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgICBwdWJsaWMgTGlzdDxNYXA8U3RyaW5nLCBPYmplY3Q+PiBjb21wb25lbnRDb25mcyA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgICBwdWJsaWMgU2V0PFN0cmluZz4gY29tbWl0dGVyQmF0Y2hlczsKICAgICAgICAgCmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy9qdm0vc3Rvcm0vdHJpZGVudC90dXBsZS9UcmlkZW50VHVwbGVWaWV3LmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vc3Rvcm0vdHJpZGVudC90dXBsZS9UcmlkZW50VHVwbGVWaWV3LmphdmEKaW5kZXggMGJlMGMzZi4uNzYxYjIyMSAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvanZtL3N0b3JtL3RyaWRlbnQvdHVwbGUvVHJpZGVudFR1cGxlVmlldy5qYXZhCisrKyBiL3N0b3JtLWNvcmUvc3JjL2p2bS9zdG9ybS90cmlkZW50L3R1cGxlL1RyaWRlbnRUdXBsZVZpZXcuamF2YQpAQCAtMzEsNyArMzEsOSBAQAogaW1wb3J0IGphdmEudXRpbC5TZXQ7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKIAotLy9leHRlbmRzIGFic3RyYWN0bGlzdCBzbyB0aGF0IGl0IGNhbiBiZSBlbWl0dGVkIGRpcmVjdGx5IGFzIFN0b3JtIHR1cGxlcworLyoqCisgKiBFeHRlbmRzIEFic3RyYWN0TGlzdCBzbyB0aGF0IGl0IGNhbiBiZSBlbWl0dGVkIGRpcmVjdGx5IGFzIFN0b3JtIHR1cGxlcworICovCiBwdWJsaWMgY2xhc3MgVHJpZGVudFR1cGxlVmlldyBleHRlbmRzIEFic3RyYWN0TGlzdDxPYmplY3Q+IGltcGxlbWVudHMgVHJpZGVudFR1cGxlIHsKICAgICBWYWx1ZVBvaW50ZXJbXSBfaW5kZXg7CiAgICAgTWFwPFN0cmluZywgVmFsdWVQb2ludGVyPiBfZmllbGRJbmRleDsKQEAgLTQ2LDcgKzQ4LDcgQEAKICAgICAgICAgICAgIF9wYXJlbnQgPSBwYXJlbnQ7CiAgICAgICAgICAgICBpZihwcm9qZWN0RmllbGRzPT1udWxsKSBwcm9qZWN0RmllbGRzID0gbmV3IEZpZWxkcygpOwogICAgICAgICAgICAgTWFwPFN0cmluZywgVmFsdWVQb2ludGVyPiBwYXJlbnRGaWVsZEluZGV4ID0gcGFyZW50LmdldEZpZWxkSW5kZXgoKTsKLSAgICAgICAgICAgIF9maWVsZEluZGV4ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBWYWx1ZVBvaW50ZXI+KCk7CisgICAgICAgICAgICBfZmllbGRJbmRleCA9IG5ldyBIYXNoTWFwPD4oKTsKICAgICAgICAgICAgIGZvcihTdHJpbmcgZjogcHJvamVjdEZpZWxkcykgewogICAgICAgICAgICAgICAgIF9maWVsZEluZGV4LnB1dChmLCBwYXJlbnRGaWVsZEluZGV4LmdldChmKSk7CiAgICAgICAgICAgICB9ICAgICAgICAgICAgCkBAIC03OSw3ICs4MSw3IEBACiAgICAgICAgIFZhbHVlUG9pbnRlcltdIF9pbmRleDsKIAogICAgICAgICBwdWJsaWMgRnJlc2hPdXRwdXRGYWN0b3J5KEZpZWxkcyBzZWxmRmllbGRzKSB7Ci0gICAgICAgICAgICBfZmllbGRJbmRleCA9IG5ldyBIYXNoTWFwPFN0cmluZywgVmFsdWVQb2ludGVyPigpOworICAgICAgICAgICAgX2ZpZWxkSW5kZXggPSBuZXcgSGFzaE1hcDw+KCk7CiAgICAgICAgICAgICBmb3IoaW50IGk9MDsgaTxzZWxmRmllbGRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgU3RyaW5nIGZpZWxkID0gc2VsZkZpZWxkcy5nZXQoaSk7CiAgICAgICAgICAgICAgICAgX2ZpZWxkSW5kZXgucHV0KGZpZWxkLCBuZXcgVmFsdWVQb2ludGVyKDAsIGksIGZpZWxkKSk7CkBAIC0xMTQsMTUgKzExNiwxNSBAQAogCiAgICAgICAgIHB1YmxpYyBPcGVyYXRpb25PdXRwdXRGYWN0b3J5KEZhY3RvcnkgcGFyZW50LCBGaWVsZHMgc2VsZkZpZWxkcykgewogICAgICAgICAgICAgX3BhcmVudCA9IHBhcmVudDsKLSAgICAgICAgICAgIF9maWVsZEluZGV4ID0gbmV3IEhhc2hNYXAocGFyZW50LmdldEZpZWxkSW5kZXgoKSk7CisgICAgICAgICAgICBfZmllbGRJbmRleCA9IG5ldyBIYXNoTWFwPD4ocGFyZW50LmdldEZpZWxkSW5kZXgoKSk7CiAgICAgICAgICAgICBpbnQgbXlJbmRleCA9IHBhcmVudC5udW1EZWxlZ2F0ZXMoKTsKICAgICAgICAgICAgIGZvcihpbnQgaT0wOyBpPHNlbGZGaWVsZHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgICAgICBTdHJpbmcgZmllbGQgPSBzZWxmRmllbGRzLmdldChpKTsKICAgICAgICAgICAgICAgICBfZmllbGRJbmRleC5wdXQoZmllbGQsIG5ldyBWYWx1ZVBvaW50ZXIobXlJbmRleCwgaSwgZmllbGQpKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBteU9yZGVyID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KHBhcmVudC5nZXRPdXRwdXRGaWVsZHMoKSk7CisgICAgICAgICAgICBMaXN0PFN0cmluZz4gbXlPcmRlciA9IG5ldyBBcnJheUxpc3Q8PihwYXJlbnQuZ2V0T3V0cHV0RmllbGRzKCkpOwogICAgICAgICAgICAgCi0gICAgICAgICAgICBTZXQ8U3RyaW5nPiBwYXJlbnRGaWVsZHNTZXQgPSBuZXcgSGFzaFNldDxTdHJpbmc+KG15T3JkZXIpOworICAgICAgICAgICAgU2V0PFN0cmluZz4gcGFyZW50RmllbGRzU2V0ID0gbmV3IEhhc2hTZXQ8PihteU9yZGVyKTsKICAgICAgICAgICAgIGZvcihTdHJpbmcgZjogc2VsZkZpZWxkcykgewogICAgICAgICAgICAgICAgIGlmKHBhcmVudEZpZWxkc1NldC5jb250YWlucyhmKSkgewogICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKApAQCAtMTkyLDE0ICsxOTQsMTQgQEAKICAgICB9CiAgICAgCiAgICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxTdHJpbmc+IGluZGV4VG9GaWVsZHNMaXN0KFZhbHVlUG9pbnRlcltdIGluZGV4KSB7Ci0gICAgICAgIExpc3Q8U3RyaW5nPiByZXQgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IHJldCA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgICBmb3IoVmFsdWVQb2ludGVyIHA6IGluZGV4KSB7CiAgICAgICAgICAgICByZXQuYWRkKHAuZmllbGQpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogICAgIAotICAgIHB1YmxpYyBzdGF0aWMgVHJpZGVudFR1cGxlVmlldyBFTVBUWV9UVVBMRSA9IG5ldyBUcmlkZW50VHVwbGVWaWV3KG51bGwsIG5ldyBWYWx1ZVBvaW50ZXJbMF0sIG5ldyBIYXNoTWFwKCkpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVHJpZGVudFR1cGxlVmlldyBFTVBUWV9UVVBMRSA9IG5ldyBUcmlkZW50VHVwbGVWaWV3KG51bGwsIG5ldyBWYWx1ZVBvaW50ZXJbMF0sIG5ldyBIYXNoTWFwKCkpOwogCiAgICAgLy8gaW5kZXggYW5kIGZpZWxkSW5kZXggYXJlIHByZWNvbXB1dGVkLCBkZWxlZ2F0ZXMgYnVpbHQgdXAgb3ZlciBtYW55IG9wZXJhdGlvbnMgdXNpbmcgcGVyc2lzdGVudCBkYXRhIHN0cnVjdHVyZXMKICAgICBwdWJsaWMgVHJpZGVudFR1cGxlVmlldyhJUGVyc2lzdGVudFZlY3RvciBkZWxlZ2F0ZXMsIFZhbHVlUG9pbnRlcltdIGluZGV4LCBNYXA8U3RyaW5nLCBWYWx1ZVBvaW50ZXI+IGZpZWxkSW5kZXgpIHsKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL2p2bS9zdG9ybS90cmlkZW50L3V0aWwvVHJpZGVudFV0aWxzLmphdmEgYi9zdG9ybS1jb3JlL3NyYy9qdm0vc3Rvcm0vdHJpZGVudC91dGlsL1RyaWRlbnRVdGlscy5qYXZhCmluZGV4IDBjZGVjMGEuLjIxNGJjZjIgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL2p2bS9zdG9ybS90cmlkZW50L3V0aWwvVHJpZGVudFV0aWxzLmphdmEKKysrIGIvc3Rvcm0tY29yZS9zcmMvanZtL3N0b3JtL3RyaWRlbnQvdXRpbC9UcmlkZW50VXRpbHMuamF2YQpAQCAtMzAsMTEgKzMwLDEwIEBACiBpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CiBpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOwogaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlRCYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUudGhyaWZ0LlREZXNlcmlhbGl6ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS50aHJpZnQuVEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnRocmlmdC5UU2VyaWFsaXplcjsKIGltcG9ydCBvcmcuamdyYXBodC5EaXJlY3RlZEdyYXBoOwogCitpbXBvcnQgYmFja3R5cGUuc3Rvcm0udXRpbHMuVXRpbHM7CisKIHB1YmxpYyBjbGFzcyBUcmlkZW50VXRpbHMgewogICAgIHB1YmxpYyBzdGF0aWMgRmllbGRzIGZpZWxkc1VuaW9uKEZpZWxkcy4uLiBmaWVsZHMpIHsKICAgICAgICAgU2V0PFN0cmluZz4gcmV0ID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwpAQCAtMTA4LDM1ICsxMDcsMTEgQEAKICAgICAgICAgcmV0dXJuIHBhcmVudHMuZ2V0KDApOwogICAgIH0KICAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBUaHJlYWRMb2NhbDxUU2VyaWFsaXplcj4gdGhyZWFkU2VyID0gbmV3IFRocmVhZExvY2FsPFRTZXJpYWxpemVyPigpOwotICAgIHByaXZhdGUgc3RhdGljIFRocmVhZExvY2FsPFREZXNlcmlhbGl6ZXI+IHRocmVhZERlcyA9IG5ldyBUaHJlYWRMb2NhbDxURGVzZXJpYWxpemVyPigpOwotICAgIAogICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIHRocmlmdFNlcmlhbGl6ZShUQmFzZSB0KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBUU2VyaWFsaXplciBzZXIgPSB0aHJlYWRTZXIuZ2V0KCk7Ci0gICAgICAgICAgICBpZiAoc2VyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzZXIgPSBuZXcgVFNlcmlhbGl6ZXIoKTsKLSAgICAgICAgICAgICAgICB0aHJlYWRTZXIuc2V0KHNlcik7Ci0gICAgICAgICAgICB9IAotICAgICAgICAgICAgcmV0dXJuIHNlci5zZXJpYWxpemUodCk7Ci0gICAgICAgIH0gY2F0Y2ggKFRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFV0aWxzLnRocmlmdFNlcmlhbGl6ZSh0KTsKICAgICB9CiAKICAgICBwdWJsaWMgc3RhdGljIDxUPiBUIHRocmlmdERlc2VyaWFsaXplKENsYXNzIGMsIGJ5dGVbXSBiKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBUIHJldCA9IChUKSBjLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICBURGVzZXJpYWxpemVyIGRlcyA9IHRocmVhZERlcy5nZXQoKTsKLSAgICAgICAgICAgIGlmIChkZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGRlcyA9IG5ldyBURGVzZXJpYWxpemVyKCk7Ci0gICAgICAgICAgICAgICAgdGhyZWFkRGVzLnNldChkZXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVzLmRlc2VyaWFsaXplKChUQmFzZSkgcmV0LCBiKTsKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgICAKKyAgICAgICAgcmV0dXJuIFV0aWxzLnRocmlmdERlc2VyaWFsaXplKGMsYik7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvbmF0aXZlL3dvcmtlci1sYXVuY2hlci9pbXBsL21haW4uYyBiL3N0b3JtLWNvcmUvc3JjL25hdGl2ZS93b3JrZXItbGF1bmNoZXIvaW1wbC9tYWluLmMKaW5kZXggNzA2N2NmOS4uYTUxZjlmOSAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvbmF0aXZlL3dvcmtlci1sYXVuY2hlci9pbXBsL21haW4uYworKysgYi9zdG9ybS1jb3JlL3NyYy9uYXRpdmUvd29ya2VyLWxhdW5jaGVyL2ltcGwvbWFpbi5jCkBAIC00Nyw2ICs0Nyw3IEBACiAgIGZwcmludGYoc3RyZWFtLCAiICAgaW5pdGlhbGl6ZSBzdG9ybWRpc3QgZGlyOiBjb2RlLWRpciA8Y29kZS1kaXJlY3Rvcnk+XG4iKTsKICAgZnByaW50ZihzdHJlYW0sICIgICByZW1vdmUgYSBmaWxlL2RpcmVjdG9yeTogcm1yIDxkaXJlY3Rvcnk+XG4iKTsKICAgZnByaW50ZihzdHJlYW0sICIgICBsYXVuY2ggYSB3b3JrZXI6IHdvcmtlciA8d29ya2luZy1kaXJlY3Rvcnk+IDxzY3JpcHQtdG8tcnVuPlxuIik7CisgIGZwcmludGYoc3RyZWFtLCAiICAgbGF1bmNoIGEgcHJvZmlsZXI6IHByb2ZpbGVyIDx3b3JraW5nLWRpcmVjdG9yeT4gPHNjcmlwdC10by1ydW4+XG4iKTsKICAgZnByaW50ZihzdHJlYW0sICIgICBzaWduYWwgYSB3b3JrZXI6IHNpZ25hbCA8cGlkPiA8c2lnbmFsPlxuIik7CiB9CiAKQEAgLTE3Niw2ICsxNzcsMTUgQEAKICAgICBpZiAoZXhpdF9jb2RlID09IDApIHsKICAgICAgIGV4aXRfY29kZSA9IGV4ZWNfYXNfdXNlcih3b3JraW5nX2RpciwgYXJndltvcHRpbmRdKTsKICAgICB9CisgICB9IGVsc2UgaWYgKHN0cmNhc2VjbXAoInByb2ZpbGVyIiwgY29tbWFuZCkgPT0gMCkgeworICAgIGlmIChhcmdjICE9IDUpIHsKKyAgICAgIGZwcmludGYoRVJST1JGSUxFLCAiSW5jb3JyZWN0IG51bWJlciBvZiBhcmd1bWVudHMgKCVkIHZzIDUpIGZvciBwcm9maWxlclxuIiwKKwkgICAgICBhcmdjKTsKKyAgICAgIGZmbHVzaChFUlJPUkZJTEUpOworICAgICAgcmV0dXJuIElOVkFMSURfQVJHVU1FTlRfTlVNQkVSOworICAgIH0KKyAgICB3b3JraW5nX2RpciA9IGFyZ3Zbb3B0aW5kKytdOworICAgIGV4aXRfY29kZSA9IGV4ZWNfYXNfdXNlcih3b3JraW5nX2RpciwgYXJndltvcHRpbmRdKTsKICAgfSBlbHNlIGlmIChzdHJjYXNlY21wKCJzaWduYWwiLCBjb21tYW5kKSA9PSAwKSB7CiAgICAgaWYgKGFyZ2MgIT0gNSkgewogICAgICAgZnByaW50ZihFUlJPUkZJTEUsICJJbmNvcnJlY3QgbnVtYmVyIG9mIGFyZ3VtZW50cyAoJWQgdnMgNSkgZm9yIHNpZ25hbFxuIiwKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL25hdGl2ZS93b3JrZXItbGF1bmNoZXIvaW1wbC93b3JrZXItbGF1bmNoZXIuYyBiL3N0b3JtLWNvcmUvc3JjL25hdGl2ZS93b3JrZXItbGF1bmNoZXIvaW1wbC93b3JrZXItbGF1bmNoZXIuYwppbmRleCAzYTZjNGI4Li41ZGM5MGQzIDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9uYXRpdmUvd29ya2VyLWxhdW5jaGVyL2ltcGwvd29ya2VyLWxhdW5jaGVyLmMKKysrIGIvc3Rvcm0tY29yZS9zcmMvbmF0aXZlL3dvcmtlci1sYXVuY2hlci9pbXBsL3dvcmtlci1sYXVuY2hlci5jCkBAIC00OTEsOCArNDkxLDYgQEAKICAgICAgIGNhc2UgRlRTX0Y6ICAgICAgICAgLy8gQSByZWd1bGFyIGZpbGUKICAgICAgIGNhc2UgRlRTX1NMOiAgICAgICAgLy8gQSBzeW1ib2xpYyBsaW5rCiAgICAgICBjYXNlIEZUU19TTE5PTkU6ICAgIC8vIEEgYnJva2VuIHN5bWJvbGljIGxpbmsKLSAgICAgICAgLy9UT0RPIGl0IHdvdWxkIGJlIGdvb2QgdG8gdmFsaWRhdGUgdGhhdCB0aGUgZmlsZSBpcyBvd25lZCBieSB0aGUgY29ycmVjdCB1c2VyIGZpcnN0LgotICAgICAgICBmcHJpbnRmKExPR0ZJTEUsICJ2aXNpdGluZzogJXNcbiIsIGVudHJ5LT5mdHNfcGF0aCk7CiAgICAgICAgIGlmIChzZXR1cF9zdG9ybWRpc3QoZW50cnksIGV1c2VyKSAhPSAwKSB7CiAgICAgICAgICAgZXhpdF9jb2RlID0gLTE7CiAgICAgICAgIH0KQEAgLTc0Myw2ICs3NDEsNTMgQEAKICAgcmV0dXJuIC0xOwogfQogCitpbnQgZm9ya19hc191c2VyKGNvbnN0IGNoYXIgKiB3b3JraW5nX2RpciwgY29uc3QgY2hhciAqIHNjcmlwdF9maWxlKSB7CisgIGNoYXIgKnNjcmlwdF9maWxlX2Rlc3QgPSBOVUxMOworICBzY3JpcHRfZmlsZV9kZXN0ID0gZ2V0X2NvbnRhaW5lcl9sYXVuY2hlcl9maWxlKHdvcmtpbmdfZGlyKTsKKyAgaWYgKHNjcmlwdF9maWxlX2Rlc3QgPT0gTlVMTCkgeworICAgIHJldHVybiBPVVRfT0ZfTUVNT1JZOworICB9CisKKyAgLy8gb3BlbiBsYXVuY2ggc2NyaXB0CisgIGludCBzY3JpcHRfZmlsZV9zb3VyY2UgPSBvcGVuX2ZpbGVfYXNfbm0oc2NyaXB0X2ZpbGUpOworICBpZiAoc2NyaXB0X2ZpbGVfc291cmNlID09IC0xKSB7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgc2V0c2lkKCk7CisKKyAgLy8gZ2l2ZSB1cCByb290IHByaXZzCisgIGlmIChjaGFuZ2VfdXNlcih1c2VyX2RldGFpbC0+cHdfdWlkLCB1c2VyX2RldGFpbC0+cHdfZ2lkKSAhPSAwKSB7CisgICAgcmV0dXJuIFNFVFVJRF9PUEVSX0ZBSUxFRDsKKyAgfQorCisgIGlmIChjb3B5X2ZpbGUoc2NyaXB0X2ZpbGVfc291cmNlLCBzY3JpcHRfZmlsZSwgc2NyaXB0X2ZpbGVfZGVzdCwgU19JUldYVSkgIT0gMCkgeworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGZjbG9zZWFsbCgpOworICB1bWFzaygwMDI3KTsKKyAgaWYgKGNoZGlyKHdvcmtpbmdfZGlyKSAhPSAwKSB7CisgICAgZnByaW50ZihMT0dGSUxFLCAiQ2FuJ3QgY2hhbmdlIGRpcmVjdG9yeSB0byAlcyAtJXNcbiIsIHdvcmtpbmdfZGlyLAorCSAgICBzdHJlcnJvcihlcnJubykpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGludCBwaWQgPSBmb3JrKCk7CisgIGlmIChwaWQgPT0gMCAmJiBleGVjbHAoc2NyaXB0X2ZpbGVfZGVzdCwgc2NyaXB0X2ZpbGVfZGVzdCwgTlVMTCkgIT0gMCkgeworICAgIGZwcmludGYoTE9HRklMRSwgIkNvdWxkbid0IGV4ZWN1dGUgdGhlIGNvbnRhaW5lciBsYXVuY2ggZmlsZSAlcyAtICVzIiwKKyAgICAgICAgICAgIHNjcmlwdF9maWxlX2Rlc3QsIHN0cmVycm9yKGVycm5vKSk7CisgICAgcmV0dXJuIFVOQUJMRV9UT19FWEVDVVRFX0NPTlRBSU5FUl9TQ1JJUFQ7CisgIH0gZWxzZSB7CisgICAgZnByaW50ZihMT0dGSUxFLCAiTGF1bmNoZWQgdGhlIHByb2Nlc3MgZnJvbSB0aGUgY29udGFpbmVyIGxhdW5jaCBmaWxlICVzIC0gd2l0aCBwaWQgJWQiLAorICAgICAgICAgICAgc2NyaXB0X2ZpbGVfZGVzdCwgcGlkKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vVW5yZWFjaGFibGUKKyAgcmV0dXJuIC0xOworfQorCiAvKioKICAqIERlbGV0ZSB0aGUgZ2l2ZW4gZGlyZWN0b3J5IGFzIHRoZSB1c2VyIGZyb20gZWFjaCBvZiB0aGUgZGlyZWN0b3JpZXMKICAqIHVzZXI6IHRoZSB1c2VyIGRvaW5nIHRoZSBkZWxldGUKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL25hdGl2ZS93b3JrZXItbGF1bmNoZXIvaW1wbC93b3JrZXItbGF1bmNoZXIuaCBiL3N0b3JtLWNvcmUvc3JjL25hdGl2ZS93b3JrZXItbGF1bmNoZXIvaW1wbC93b3JrZXItbGF1bmNoZXIuaAppbmRleCA1OWFiOTk4Li4zYjFlYzI0IDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9uYXRpdmUvd29ya2VyLWxhdW5jaGVyL2ltcGwvd29ya2VyLWxhdW5jaGVyLmgKKysrIGIvc3Rvcm0tY29yZS9zcmMvbmF0aXZlL3dvcmtlci1sYXVuY2hlci9pbXBsL3dvcmtlci1sYXVuY2hlci5oCkBAIC03MCw2ICs3MCw4IEBACiAKIGludCBleGVjX2FzX3VzZXIoY29uc3QgY2hhciAqIHdvcmtpbmdfZGlyLCBjb25zdCBjaGFyICogYXJncyk7CiAKK2ludCBmb3JrX2FzX3VzZXIoY29uc3QgY2hhciAqIHdvcmtpbmdfZGlyLCBjb25zdCBjaGFyICogYXJncyk7CisKIC8vIGRlbGV0ZSBhIGRpcmVjdG9yeSAob3IgZmlsZSkgcmVjdXJzaXZlbHkgYXMgdGhlIHVzZXIuIFRoZSBkaXJlY3RvcnkKIC8vIGNvdWxkIG9wdGlvbmFsbHkgYmUgcmVsYXRpdmUgdG8gdGhlIGJhc2VEaXIgc2V0IG9mIGRpcmVjdG9yaWVzIChpZiB0aGUgc2FtZQogLy8gZGlyZWN0b3J5IGFwcGVhcnMgb24gbXVsdGlwbGUgZGlzayB2b2x1bWVzLCB0aGUgZGlzayB2b2x1bWVzIHNob3VsZCBiZSBwYXNzZWQKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL3B5L3N0b3JtL0Rpc3RyaWJ1dGVkUlBDLXJlbW90ZSBiL3N0b3JtLWNvcmUvc3JjL3B5L3N0b3JtL0Rpc3RyaWJ1dGVkUlBDLXJlbW90ZQppbmRleCAzZDA2ZDA3Li45MGY4OTRhIDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9weS9zdG9ybS9EaXN0cmlidXRlZFJQQy1yZW1vdGUKKysrIGIvc3Rvcm0tY29yZS9zcmMvcHkvc3Rvcm0vRGlzdHJpYnV0ZWRSUEMtcmVtb3RlCkBAIC0xOCw3ICsxOCw3IEBACiAKICMhL3Vzci9iaW4vZW52IHB5dGhvbgogIwotIyBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjIpCisjIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMykKICMKICMgRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lORwogIwpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvcHkvc3Rvcm0vRGlzdHJpYnV0ZWRSUEMucHkgYi9zdG9ybS1jb3JlL3NyYy9weS9zdG9ybS9EaXN0cmlidXRlZFJQQy5weQppbmRleCAzMzA0OTljLi4yMjVjNTdlIDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9weS9zdG9ybS9EaXN0cmlidXRlZFJQQy5weQorKysgYi9zdG9ybS1jb3JlL3NyYy9weS9zdG9ybS9EaXN0cmlidXRlZFJQQy5weQpAQCAtMTcsNyArMTcsNyBAQAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogIwotIyBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjIpCisjIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMykKICMKICMgRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lORwogIwpAQCAtMjUsNiArMjUsNyBAQAogIwogCiBmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRUeXBlLCBUTWVzc2FnZVR5cGUsIFRFeGNlcHRpb24sIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbgoraW1wb3J0IGxvZ2dpbmcKIGZyb20gdHR5cGVzIGltcG9ydCAqCiBmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRQcm9jZXNzb3IKIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydApAQCAtODcsNyArODgsNyBAQAogICAgICAgcmFpc2UgcmVzdWx0LmUKICAgICBpZiByZXN1bHQuYXplIGlzIG5vdCBOb25lOgogICAgICAgcmFpc2UgcmVzdWx0LmF6ZQotICAgIHJhaXNlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uTUlTU0lOR19SRVNVTFQsICJleGVjdXRlIGZhaWxlZDogdW5rbm93biByZXN1bHQiKTsKKyAgICByYWlzZSBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLk1JU1NJTkdfUkVTVUxULCAiZXhlY3V0ZSBmYWlsZWQ6IHVua25vd24gcmVzdWx0IikKIAogCiBjbGFzcyBQcm9jZXNzb3IoSWZhY2UsIFRQcm9jZXNzb3IpOgpAQCAtMTE4LDExICsxMTksMjAgQEAKICAgICByZXN1bHQgPSBleGVjdXRlX3Jlc3VsdCgpCiAgICAgdHJ5OgogICAgICAgcmVzdWx0LnN1Y2Nlc3MgPSBzZWxmLl9oYW5kbGVyLmV4ZWN1dGUoYXJncy5mdW5jdGlvbk5hbWUsIGFyZ3MuZnVuY0FyZ3MpCi0gICAgZXhjZXB0IERSUENFeGVjdXRpb25FeGNlcHRpb24sIGU6CisgICAgICBtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5SRVBMWQorICAgIGV4Y2VwdCAoVFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uLCBLZXlib2FyZEludGVycnVwdCwgU3lzdGVtRXhpdCk6CisgICAgICByYWlzZQorICAgIGV4Y2VwdCBEUlBDRXhlY3V0aW9uRXhjZXB0aW9uIGFzIGU6CisgICAgICBtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5SRVBMWQogICAgICAgcmVzdWx0LmUgPSBlCi0gICAgZXhjZXB0IEF1dGhvcml6YXRpb25FeGNlcHRpb24sIGF6ZToKKyAgICBleGNlcHQgQXV0aG9yaXphdGlvbkV4Y2VwdGlvbiBhcyBhemU6CisgICAgICBtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5SRVBMWQogICAgICAgcmVzdWx0LmF6ZSA9IGF6ZQotICAgIG9wcm90LndyaXRlTWVzc2FnZUJlZ2luKCJleGVjdXRlIiwgVE1lc3NhZ2VUeXBlLlJFUExZLCBzZXFpZCkKKyAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4OgorICAgICAgbXNnX3R5cGUgPSBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OCisgICAgICBsb2dnaW5nLmV4Y2VwdGlvbihleCkKKyAgICAgIHJlc3VsdCA9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uSU5URVJOQUxfRVJST1IsICdJbnRlcm5hbCBlcnJvcicpCisgICAgb3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4oImV4ZWN1dGUiLCBtc2dfdHlwZSwgc2VxaWQpCiAgICAgcmVzdWx0LndyaXRlKG9wcm90KQogICAgIG9wcm90LndyaXRlTWVzc2FnZUVuZCgpCiAgICAgb3Byb3QudHJhbnMuZmx1c2goKQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvcHkvc3Rvcm0vRGlzdHJpYnV0ZWRSUENJbnZvY2F0aW9ucy1yZW1vdGUgYi9zdG9ybS1jb3JlL3NyYy9weS9zdG9ybS9EaXN0cmlidXRlZFJQQ0ludm9jYXRpb25zLXJlbW90ZQppbmRleCA5ZGQ1MGNkLi4wMTQzNWI2IDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9weS9zdG9ybS9EaXN0cmlidXRlZFJQQ0ludm9jYXRpb25zLXJlbW90ZQorKysgYi9zdG9ybS1jb3JlL3NyYy9weS9zdG9ybS9EaXN0cmlidXRlZFJQQ0ludm9jYXRpb25zLXJlbW90ZQpAQCAtMTgsNyArMTgsNyBAQAogCiAjIS91c3IvYmluL2VudiBweXRob24KICMKLSMgQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4yKQorIyBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjMpCiAjCiAjIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkcKICMKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL3B5L3N0b3JtL0Rpc3RyaWJ1dGVkUlBDSW52b2NhdGlvbnMucHkgYi9zdG9ybS1jb3JlL3NyYy9weS9zdG9ybS9EaXN0cmlidXRlZFJQQ0ludm9jYXRpb25zLnB5CmluZGV4IDQ5M2ZjYzcuLjIwN2ZhOWQgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL3B5L3N0b3JtL0Rpc3RyaWJ1dGVkUlBDSW52b2NhdGlvbnMucHkKKysrIGIvc3Rvcm0tY29yZS9zcmMvcHkvc3Rvcm0vRGlzdHJpYnV0ZWRSUENJbnZvY2F0aW9ucy5weQpAQCAtMTcsNyArMTcsNyBAQAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogIwotIyBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjIpCisjIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMykKICMKICMgRE8gTk9UIEVESVQgVU5MRVNTIFlPVSBBUkUgU1VSRSBUSEFUIFlPVSBLTk9XIFdIQVQgWU9VIEFSRSBET0lORwogIwpAQCAtMjUsNiArMjUsNyBAQAogIwogCiBmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRUeXBlLCBUTWVzc2FnZVR5cGUsIFRFeGNlcHRpb24sIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbgoraW1wb3J0IGxvZ2dpbmcKIGZyb20gdHR5cGVzIGltcG9ydCAqCiBmcm9tIHRocmlmdC5UaHJpZnQgaW1wb3J0IFRQcm9jZXNzb3IKIGZyb20gdGhyaWZ0LnRyYW5zcG9ydCBpbXBvcnQgVFRyYW5zcG9ydApAQCAtMTMwLDcgKzEzMSw3IEBACiAgICAgICByZXR1cm4gcmVzdWx0LnN1Y2Nlc3MKICAgICBpZiByZXN1bHQuYXplIGlzIG5vdCBOb25lOgogICAgICAgcmFpc2UgcmVzdWx0LmF6ZQotICAgIHJhaXNlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uTUlTU0lOR19SRVNVTFQsICJmZXRjaFJlcXVlc3QgZmFpbGVkOiB1bmtub3duIHJlc3VsdCIpOworICAgIHJhaXNlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uTUlTU0lOR19SRVNVTFQsICJmZXRjaFJlcXVlc3QgZmFpbGVkOiB1bmtub3duIHJlc3VsdCIpCiAKICAgZGVmIGZhaWxSZXF1ZXN0KHNlbGYsIGlkKToKICAgICAiIiIKQEAgLTE5NCw5ICsxOTUsMTcgQEAKICAgICByZXN1bHQgPSByZXN1bHRfcmVzdWx0KCkKICAgICB0cnk6CiAgICAgICBzZWxmLl9oYW5kbGVyLnJlc3VsdChhcmdzLmlkLCBhcmdzLnJlc3VsdCkKLSAgICBleGNlcHQgQXV0aG9yaXphdGlvbkV4Y2VwdGlvbiwgYXplOgorICAgICAgbXNnX3R5cGUgPSBUTWVzc2FnZVR5cGUuUkVQTFkKKyAgICBleGNlcHQgKFRUcmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbiwgS2V5Ym9hcmRJbnRlcnJ1cHQsIFN5c3RlbUV4aXQpOgorICAgICAgcmFpc2UKKyAgICBleGNlcHQgQXV0aG9yaXphdGlvbkV4Y2VwdGlvbiBhcyBhemU6CisgICAgICBtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5SRVBMWQogICAgICAgcmVzdWx0LmF6ZSA9IGF6ZQotICAgIG9wcm90LndyaXRlTWVzc2FnZUJlZ2luKCJyZXN1bHQiLCBUTWVzc2FnZVR5cGUuUkVQTFksIHNlcWlkKQorICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXg6CisgICAgICBtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5FWENFUFRJT04KKyAgICAgIGxvZ2dpbmcuZXhjZXB0aW9uKGV4KQorICAgICAgcmVzdWx0ID0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5JTlRFUk5BTF9FUlJPUiwgJ0ludGVybmFsIGVycm9yJykKKyAgICBvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbigicmVzdWx0IiwgbXNnX3R5cGUsIHNlcWlkKQogICAgIHJlc3VsdC53cml0ZShvcHJvdCkKICAgICBvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKQogICAgIG9wcm90LnRyYW5zLmZsdXNoKCkKQEAgLTIwOCw5ICsyMTcsMTcgQEAKICAgICByZXN1bHQgPSBmZXRjaFJlcXVlc3RfcmVzdWx0KCkKICAgICB0cnk6CiAgICAgICByZXN1bHQuc3VjY2VzcyA9IHNlbGYuX2hhbmRsZXIuZmV0Y2hSZXF1ZXN0KGFyZ3MuZnVuY3Rpb25OYW1lKQotICAgIGV4Y2VwdCBBdXRob3JpemF0aW9uRXhjZXB0aW9uLCBhemU6CisgICAgICBtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5SRVBMWQorICAgIGV4Y2VwdCAoVFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uLCBLZXlib2FyZEludGVycnVwdCwgU3lzdGVtRXhpdCk6CisgICAgICByYWlzZQorICAgIGV4Y2VwdCBBdXRob3JpemF0aW9uRXhjZXB0aW9uIGFzIGF6ZToKKyAgICAgIG1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLlJFUExZCiAgICAgICByZXN1bHQuYXplID0gYXplCi0gICAgb3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4oImZldGNoUmVxdWVzdCIsIFRNZXNzYWdlVHlwZS5SRVBMWSwgc2VxaWQpCisgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleDoKKyAgICAgIG1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTgorICAgICAgbG9nZ2luZy5leGNlcHRpb24oZXgpCisgICAgICByZXN1bHQgPSBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLklOVEVSTkFMX0VSUk9SLCAnSW50ZXJuYWwgZXJyb3InKQorICAgIG9wcm90LndyaXRlTWVzc2FnZUJlZ2luKCJmZXRjaFJlcXVlc3QiLCBtc2dfdHlwZSwgc2VxaWQpCiAgICAgcmVzdWx0LndyaXRlKG9wcm90KQogICAgIG9wcm90LndyaXRlTWVzc2FnZUVuZCgpCiAgICAgb3Byb3QudHJhbnMuZmx1c2goKQpAQCAtMjIyLDkgKzIzOSwxNyBAQAogICAgIHJlc3VsdCA9IGZhaWxSZXF1ZXN0X3Jlc3VsdCgpCiAgICAgdHJ5OgogICAgICAgc2VsZi5faGFuZGxlci5mYWlsUmVxdWVzdChhcmdzLmlkKQotICAgIGV4Y2VwdCBBdXRob3JpemF0aW9uRXhjZXB0aW9uLCBhemU6CisgICAgICBtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5SRVBMWQorICAgIGV4Y2VwdCAoVFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uLCBLZXlib2FyZEludGVycnVwdCwgU3lzdGVtRXhpdCk6CisgICAgICByYWlzZQorICAgIGV4Y2VwdCBBdXRob3JpemF0aW9uRXhjZXB0aW9uIGFzIGF6ZToKKyAgICAgIG1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLlJFUExZCiAgICAgICByZXN1bHQuYXplID0gYXplCi0gICAgb3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4oImZhaWxSZXF1ZXN0IiwgVE1lc3NhZ2VUeXBlLlJFUExZLCBzZXFpZCkKKyAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4OgorICAgICAgbXNnX3R5cGUgPSBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OCisgICAgICBsb2dnaW5nLmV4Y2VwdGlvbihleCkKKyAgICAgIHJlc3VsdCA9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uSU5URVJOQUxfRVJST1IsICdJbnRlcm5hbCBlcnJvcicpCisgICAgb3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4oImZhaWxSZXF1ZXN0IiwgbXNnX3R5cGUsIHNlcWlkKQogICAgIHJlc3VsdC53cml0ZShvcHJvdCkKICAgICBvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKQogICAgIG9wcm90LnRyYW5zLmZsdXNoKCkKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL3B5L3N0b3JtL05pbWJ1cy1yZW1vdGUgYi9zdG9ybS1jb3JlL3NyYy9weS9zdG9ybS9OaW1idXMtcmVtb3RlCmluZGV4IGZmZjYzZjkuLjYzZTdkY2UgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL3B5L3N0b3JtL05pbWJ1cy1yZW1vdGUKKysrIGIvc3Rvcm0tY29yZS9zcmMvcHkvc3Rvcm0vTmltYnVzLXJlbW90ZQpAQCAtMTgsNyArMTgsNyBAQAogCiAjIS91c3IvYmluL2VudiBweXRob24KICMKLSMgQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4yKQorIyBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjMpCiAjCiAjIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkcKICMKQEAgLTQ5LDcgKzQ5LDExIEBACiAgIHByaW50KCcgIHZvaWQgYWN0aXZhdGUoc3RyaW5nIG5hbWUpJykKICAgcHJpbnQoJyAgdm9pZCBkZWFjdGl2YXRlKHN0cmluZyBuYW1lKScpCiAgIHByaW50KCcgIHZvaWQgcmViYWxhbmNlKHN0cmluZyBuYW1lLCBSZWJhbGFuY2VPcHRpb25zIG9wdGlvbnMpJykKKyAgcHJpbnQoJyAgdm9pZCBzZXRMb2dDb25maWcoc3RyaW5nIG5hbWUsIExvZ0NvbmZpZyBjb25maWcpJykKKyAgcHJpbnQoJyAgTG9nQ29uZmlnIGdldExvZ0NvbmZpZyhzdHJpbmcgbmFtZSknKQogICBwcmludCgnICB2b2lkIGRlYnVnKHN0cmluZyBuYW1lLCBzdHJpbmcgY29tcG9uZW50LCBib29sIGVuYWJsZSwgZG91YmxlIHNhbXBsaW5nUGVyY2VudGFnZSknKQorICBwcmludCgnICB2b2lkIHNldFdvcmtlclByb2ZpbGVyKHN0cmluZyBpZCwgUHJvZmlsZVJlcXVlc3QgcHJvZmlsZVJlcXVlc3QpJykKKyAgcHJpbnQoJyAgIGdldENvbXBvbmVudFBlbmRpbmdQcm9maWxlQWN0aW9ucyhzdHJpbmcgaWQsIHN0cmluZyBjb21wb25lbnRfaWQsIFByb2ZpbGVBY3Rpb24gYWN0aW9uKScpCiAgIHByaW50KCcgIHZvaWQgdXBsb2FkTmV3Q3JlZGVudGlhbHMoc3RyaW5nIG5hbWUsIENyZWRlbnRpYWxzIGNyZWRzKScpCiAgIHByaW50KCcgIHN0cmluZyBiZWdpbkZpbGVVcGxvYWQoKScpCiAgIHByaW50KCcgIHZvaWQgdXBsb2FkQ2h1bmsoc3RyaW5nIGxvY2F0aW9uLCBzdHJpbmcgY2h1bmspJykKQEAgLTYwLDkgKzY0LDEyIEBACiAgIHByaW50KCcgIENsdXN0ZXJTdW1tYXJ5IGdldENsdXN0ZXJJbmZvKCknKQogICBwcmludCgnICBUb3BvbG9neUluZm8gZ2V0VG9wb2xvZ3lJbmZvKHN0cmluZyBpZCknKQogICBwcmludCgnICBUb3BvbG9neUluZm8gZ2V0VG9wb2xvZ3lJbmZvV2l0aE9wdHMoc3RyaW5nIGlkLCBHZXRJbmZvT3B0aW9ucyBvcHRpb25zKScpCisgIHByaW50KCcgIFRvcG9sb2d5UGFnZUluZm8gZ2V0VG9wb2xvZ3lQYWdlSW5mbyhzdHJpbmcgaWQsIHN0cmluZyB3aW5kb3csIGJvb2wgaXNfaW5jbHVkZV9zeXMpJykKKyAgcHJpbnQoJyAgQ29tcG9uZW50UGFnZUluZm8gZ2V0Q29tcG9uZW50UGFnZUluZm8oc3RyaW5nIHRvcG9sb2d5X2lkLCBzdHJpbmcgY29tcG9uZW50X2lkLCBzdHJpbmcgd2luZG93LCBib29sIGlzX2luY2x1ZGVfc3lzKScpCiAgIHByaW50KCcgIHN0cmluZyBnZXRUb3BvbG9neUNvbmYoc3RyaW5nIGlkKScpCiAgIHByaW50KCcgIFN0b3JtVG9wb2xvZ3kgZ2V0VG9wb2xvZ3koc3RyaW5nIGlkKScpCiAgIHByaW50KCcgIFN0b3JtVG9wb2xvZ3kgZ2V0VXNlclRvcG9sb2d5KHN0cmluZyBpZCknKQorICBwcmludCgnICBUb3BvbG9neUhpc3RvcnlJbmZvIGdldFRvcG9sb2d5SGlzdG9yeShzdHJpbmcgdXNlciknKQogICBwcmludCgnJykKICAgc3lzLmV4aXQoMCkKIApAQCAtMTYxLDEyICsxNjgsMzYgQEAKICAgICBzeXMuZXhpdCgxKQogICBwcC5wcHJpbnQoY2xpZW50LnJlYmFsYW5jZShhcmdzWzBdLGV2YWwoYXJnc1sxXSksKSkKIAorZWxpZiBjbWQgPT0gJ3NldExvZ0NvbmZpZyc6CisgIGlmIGxlbihhcmdzKSAhPSAyOgorICAgIHByaW50KCdzZXRMb2dDb25maWcgcmVxdWlyZXMgMiBhcmdzJykKKyAgICBzeXMuZXhpdCgxKQorICBwcC5wcHJpbnQoY2xpZW50LnNldExvZ0NvbmZpZyhhcmdzWzBdLGV2YWwoYXJnc1sxXSksKSkKKworZWxpZiBjbWQgPT0gJ2dldExvZ0NvbmZpZyc6CisgIGlmIGxlbihhcmdzKSAhPSAxOgorICAgIHByaW50KCdnZXRMb2dDb25maWcgcmVxdWlyZXMgMSBhcmdzJykKKyAgICBzeXMuZXhpdCgxKQorICBwcC5wcHJpbnQoY2xpZW50LmdldExvZ0NvbmZpZyhhcmdzWzBdLCkpCisKIGVsaWYgY21kID09ICdkZWJ1Zyc6CiAgIGlmIGxlbihhcmdzKSAhPSA0OgogICAgIHByaW50KCdkZWJ1ZyByZXF1aXJlcyA0IGFyZ3MnKQogICAgIHN5cy5leGl0KDEpCiAgIHBwLnBwcmludChjbGllbnQuZGVidWcoYXJnc1swXSxhcmdzWzFdLGV2YWwoYXJnc1syXSksZXZhbChhcmdzWzNdKSwpKQogCitlbGlmIGNtZCA9PSAnc2V0V29ya2VyUHJvZmlsZXInOgorICBpZiBsZW4oYXJncykgIT0gMjoKKyAgICBwcmludCgnc2V0V29ya2VyUHJvZmlsZXIgcmVxdWlyZXMgMiBhcmdzJykKKyAgICBzeXMuZXhpdCgxKQorICBwcC5wcHJpbnQoY2xpZW50LnNldFdvcmtlclByb2ZpbGVyKGFyZ3NbMF0sZXZhbChhcmdzWzFdKSwpKQorCitlbGlmIGNtZCA9PSAnZ2V0Q29tcG9uZW50UGVuZGluZ1Byb2ZpbGVBY3Rpb25zJzoKKyAgaWYgbGVuKGFyZ3MpICE9IDM6CisgICAgcHJpbnQoJ2dldENvbXBvbmVudFBlbmRpbmdQcm9maWxlQWN0aW9ucyByZXF1aXJlcyAzIGFyZ3MnKQorICAgIHN5cy5leGl0KDEpCisgIHBwLnBwcmludChjbGllbnQuZ2V0Q29tcG9uZW50UGVuZGluZ1Byb2ZpbGVBY3Rpb25zKGFyZ3NbMF0sYXJnc1sxXSxldmFsKGFyZ3NbMl0pLCkpCisKIGVsaWYgY21kID09ICd1cGxvYWROZXdDcmVkZW50aWFscyc6CiAgIGlmIGxlbihhcmdzKSAhPSAyOgogICAgIHByaW50KCd1cGxvYWROZXdDcmVkZW50aWFscyByZXF1aXJlcyAyIGFyZ3MnKQpAQCAtMjI3LDYgKzI1OCwxOCBAQAogICAgIHN5cy5leGl0KDEpCiAgIHBwLnBwcmludChjbGllbnQuZ2V0VG9wb2xvZ3lJbmZvV2l0aE9wdHMoYXJnc1swXSxldmFsKGFyZ3NbMV0pLCkpCiAKK2VsaWYgY21kID09ICdnZXRUb3BvbG9neVBhZ2VJbmZvJzoKKyAgaWYgbGVuKGFyZ3MpICE9IDM6CisgICAgcHJpbnQoJ2dldFRvcG9sb2d5UGFnZUluZm8gcmVxdWlyZXMgMyBhcmdzJykKKyAgICBzeXMuZXhpdCgxKQorICBwcC5wcHJpbnQoY2xpZW50LmdldFRvcG9sb2d5UGFnZUluZm8oYXJnc1swXSxhcmdzWzFdLGV2YWwoYXJnc1syXSksKSkKKworZWxpZiBjbWQgPT0gJ2dldENvbXBvbmVudFBhZ2VJbmZvJzoKKyAgaWYgbGVuKGFyZ3MpICE9IDQ6CisgICAgcHJpbnQoJ2dldENvbXBvbmVudFBhZ2VJbmZvIHJlcXVpcmVzIDQgYXJncycpCisgICAgc3lzLmV4aXQoMSkKKyAgcHAucHByaW50KGNsaWVudC5nZXRDb21wb25lbnRQYWdlSW5mbyhhcmdzWzBdLGFyZ3NbMV0sYXJnc1syXSxldmFsKGFyZ3NbM10pLCkpCisKIGVsaWYgY21kID09ICdnZXRUb3BvbG9neUNvbmYnOgogICBpZiBsZW4oYXJncykgIT0gMToKICAgICBwcmludCgnZ2V0VG9wb2xvZ3lDb25mIHJlcXVpcmVzIDEgYXJncycpCkBAIC0yNDUsNiArMjg4LDEyIEBACiAgICAgc3lzLmV4aXQoMSkKICAgcHAucHByaW50KGNsaWVudC5nZXRVc2VyVG9wb2xvZ3koYXJnc1swXSwpKQogCitlbGlmIGNtZCA9PSAnZ2V0VG9wb2xvZ3lIaXN0b3J5JzoKKyAgaWYgbGVuKGFyZ3MpICE9IDE6CisgICAgcHJpbnQoJ2dldFRvcG9sb2d5SGlzdG9yeSByZXF1aXJlcyAxIGFyZ3MnKQorICAgIHN5cy5leGl0KDEpCisgIHBwLnBwcmludChjbGllbnQuZ2V0VG9wb2xvZ3lIaXN0b3J5KGFyZ3NbMF0sKSkKKwogZWxzZToKICAgcHJpbnQoJ1VucmVjb2duaXplZCBtZXRob2QgJXMnICUgY21kKQogICBzeXMuZXhpdCgxKQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvcHkvc3Rvcm0vTmltYnVzLnB5IGIvc3Rvcm0tY29yZS9zcmMvcHkvc3Rvcm0vTmltYnVzLnB5CmluZGV4IDBjYWVlZDAuLmMyYmI5YWMgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL3B5L3N0b3JtL05pbWJ1cy5weQorKysgYi9zdG9ybS1jb3JlL3NyYy9weS9zdG9ybS9OaW1idXMucHkKQEAgLTE3LDcgKzE3LDcgQEAKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICMKLSMgQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4yKQorIyBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjMpCiAjCiAjIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkcKICMKQEAgLTI1LDYgKzI1LDcgQEAKICMKIAogZnJvbSB0aHJpZnQuVGhyaWZ0IGltcG9ydCBUVHlwZSwgVE1lc3NhZ2VUeXBlLCBURXhjZXB0aW9uLCBUQXBwbGljYXRpb25FeGNlcHRpb24KK2ltcG9ydCBsb2dnaW5nCiBmcm9tIHR0eXBlcyBpbXBvcnQgKgogZnJvbSB0aHJpZnQuVGhyaWZ0IGltcG9ydCBUUHJvY2Vzc29yCiBmcm9tIHRocmlmdC50cmFuc3BvcnQgaW1wb3J0IFRUcmFuc3BvcnQKQEAgLTk0LDYgKzk1LDIxIEBACiAgICAgIiIiCiAgICAgcGFzcwogCisgIGRlZiBzZXRMb2dDb25maWcoc2VsZiwgbmFtZSwgY29uZmlnKToKKyAgICAiIiIKKyAgICBQYXJhbWV0ZXJzOgorICAgICAtIG5hbWUKKyAgICAgLSBjb25maWcKKyAgICAiIiIKKyAgICBwYXNzCisKKyAgZGVmIGdldExvZ0NvbmZpZyhzZWxmLCBuYW1lKToKKyAgICAiIiIKKyAgICBQYXJhbWV0ZXJzOgorICAgICAtIG5hbWUKKyAgICAiIiIKKyAgICBwYXNzCisKICAgZGVmIGRlYnVnKHNlbGYsIG5hbWUsIGNvbXBvbmVudCwgZW5hYmxlLCBzYW1wbGluZ1BlcmNlbnRhZ2UpOgogICAgICIiIgogICAgIEVuYWJsZS9kaXNhYmxlIGxvZ2dpbmcgdGhlIHR1cGxlcyBnZW5lcmF0ZWQgaW4gdG9wb2xvZ3kgdmlhIGFuIGludGVybmFsIEV2ZW50TG9nZ2VyIGJvbHQuIFRoZSBjb21wb25lbnQgbmFtZSBpcyBvcHRpb25hbApAQCAtMTAyLDcgKzExOCw2IEBACiAgICAgVGhlICdzYW1wbGluZ1BlcmNlbnRhZ2UnIHdpbGwgbGltaXQgbG9nZ2dpbmcgdG8gYSBwZXJjZW50YWdlIG9mIGdlbmVyYXRlZCB0dXBsZXMuCiAKIAotCiAgICAgUGFyYW1ldGVyczoKICAgICAgLSBuYW1lCiAgICAgIC0gY29tcG9uZW50CkBAIC0xMTEsNiArMTI2LDIzIEBACiAgICAgIiIiCiAgICAgcGFzcwogCisgIGRlZiBzZXRXb3JrZXJQcm9maWxlcihzZWxmLCBpZCwgcHJvZmlsZVJlcXVlc3QpOgorICAgICIiIgorICAgIFBhcmFtZXRlcnM6CisgICAgIC0gaWQKKyAgICAgLSBwcm9maWxlUmVxdWVzdAorICAgICIiIgorICAgIHBhc3MKKworICBkZWYgZ2V0Q29tcG9uZW50UGVuZGluZ1Byb2ZpbGVBY3Rpb25zKHNlbGYsIGlkLCBjb21wb25lbnRfaWQsIGFjdGlvbik6CisgICAgIiIiCisgICAgUGFyYW1ldGVyczoKKyAgICAgLSBpZAorICAgICAtIGNvbXBvbmVudF9pZAorICAgICAtIGFjdGlvbgorICAgICIiIgorICAgIHBhc3MKKwogICBkZWYgdXBsb2FkTmV3Q3JlZGVudGlhbHMoc2VsZiwgbmFtZSwgY3JlZHMpOgogICAgICIiIgogICAgIFBhcmFtZXRlcnM6CkBAIC0xNzIsNiArMjA0LDI1IEBACiAgICAgIiIiCiAgICAgcGFzcwogCisgIGRlZiBnZXRUb3BvbG9neVBhZ2VJbmZvKHNlbGYsIGlkLCB3aW5kb3csIGlzX2luY2x1ZGVfc3lzKToKKyAgICAiIiIKKyAgICBQYXJhbWV0ZXJzOgorICAgICAtIGlkCisgICAgIC0gd2luZG93CisgICAgIC0gaXNfaW5jbHVkZV9zeXMKKyAgICAiIiIKKyAgICBwYXNzCisKKyAgZGVmIGdldENvbXBvbmVudFBhZ2VJbmZvKHNlbGYsIHRvcG9sb2d5X2lkLCBjb21wb25lbnRfaWQsIHdpbmRvdywgaXNfaW5jbHVkZV9zeXMpOgorICAgICIiIgorICAgIFBhcmFtZXRlcnM6CisgICAgIC0gdG9wb2xvZ3lfaWQKKyAgICAgLSBjb21wb25lbnRfaWQKKyAgICAgLSB3aW5kb3cKKyAgICAgLSBpc19pbmNsdWRlX3N5cworICAgICIiIgorICAgIHBhc3MKKwogICBkZWYgZ2V0VG9wb2xvZ3lDb25mKHNlbGYsIGlkKToKICAgICAiIiIKICAgICBQYXJhbWV0ZXJzOgpAQCAtMTk3LDYgKzI0OCwxMyBAQAogICAgICIiIgogICAgIHBhc3MKIAorICBkZWYgZ2V0VG9wb2xvZ3lIaXN0b3J5KHNlbGYsIHVzZXIpOgorICAgICIiIgorICAgIFBhcmFtZXRlcnM6CisgICAgIC0gdXNlcgorICAgICIiIgorICAgIHBhc3MKKwogCiBjbGFzcyBDbGllbnQoSWZhY2UpOgogICBkZWYgX19pbml0X18oc2VsZiwgaXByb3QsIG9wcm90PU5vbmUpOgpAQCAtNDYwLDEyICs1MTgsNzQgQEAKICAgICAgIHJhaXNlIHJlc3VsdC5hemUKICAgICByZXR1cm4KIAorICBkZWYgc2V0TG9nQ29uZmlnKHNlbGYsIG5hbWUsIGNvbmZpZyk6CisgICAgIiIiCisgICAgUGFyYW1ldGVyczoKKyAgICAgLSBuYW1lCisgICAgIC0gY29uZmlnCisgICAgIiIiCisgICAgc2VsZi5zZW5kX3NldExvZ0NvbmZpZyhuYW1lLCBjb25maWcpCisgICAgc2VsZi5yZWN2X3NldExvZ0NvbmZpZygpCisKKyAgZGVmIHNlbmRfc2V0TG9nQ29uZmlnKHNlbGYsIG5hbWUsIGNvbmZpZyk6CisgICAgc2VsZi5fb3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4oJ3NldExvZ0NvbmZpZycsIFRNZXNzYWdlVHlwZS5DQUxMLCBzZWxmLl9zZXFpZCkKKyAgICBhcmdzID0gc2V0TG9nQ29uZmlnX2FyZ3MoKQorICAgIGFyZ3MubmFtZSA9IG5hbWUKKyAgICBhcmdzLmNvbmZpZyA9IGNvbmZpZworICAgIGFyZ3Mud3JpdGUoc2VsZi5fb3Byb3QpCisgICAgc2VsZi5fb3Byb3Qud3JpdGVNZXNzYWdlRW5kKCkKKyAgICBzZWxmLl9vcHJvdC50cmFucy5mbHVzaCgpCisKKyAgZGVmIHJlY3Zfc2V0TG9nQ29uZmlnKHNlbGYpOgorICAgIGlwcm90ID0gc2VsZi5faXByb3QKKyAgICAoZm5hbWUsIG10eXBlLCByc2VxaWQpID0gaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpCisgICAgaWYgbXR5cGUgPT0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTjoKKyAgICAgIHggPSBUQXBwbGljYXRpb25FeGNlcHRpb24oKQorICAgICAgeC5yZWFkKGlwcm90KQorICAgICAgaXByb3QucmVhZE1lc3NhZ2VFbmQoKQorICAgICAgcmFpc2UgeAorICAgIHJlc3VsdCA9IHNldExvZ0NvbmZpZ19yZXN1bHQoKQorICAgIHJlc3VsdC5yZWFkKGlwcm90KQorICAgIGlwcm90LnJlYWRNZXNzYWdlRW5kKCkKKyAgICByZXR1cm4KKworICBkZWYgZ2V0TG9nQ29uZmlnKHNlbGYsIG5hbWUpOgorICAgICIiIgorICAgIFBhcmFtZXRlcnM6CisgICAgIC0gbmFtZQorICAgICIiIgorICAgIHNlbGYuc2VuZF9nZXRMb2dDb25maWcobmFtZSkKKyAgICByZXR1cm4gc2VsZi5yZWN2X2dldExvZ0NvbmZpZygpCisKKyAgZGVmIHNlbmRfZ2V0TG9nQ29uZmlnKHNlbGYsIG5hbWUpOgorICAgIHNlbGYuX29wcm90LndyaXRlTWVzc2FnZUJlZ2luKCdnZXRMb2dDb25maWcnLCBUTWVzc2FnZVR5cGUuQ0FMTCwgc2VsZi5fc2VxaWQpCisgICAgYXJncyA9IGdldExvZ0NvbmZpZ19hcmdzKCkKKyAgICBhcmdzLm5hbWUgPSBuYW1lCisgICAgYXJncy53cml0ZShzZWxmLl9vcHJvdCkKKyAgICBzZWxmLl9vcHJvdC53cml0ZU1lc3NhZ2VFbmQoKQorICAgIHNlbGYuX29wcm90LnRyYW5zLmZsdXNoKCkKKworICBkZWYgcmVjdl9nZXRMb2dDb25maWcoc2VsZik6CisgICAgaXByb3QgPSBzZWxmLl9pcHJvdAorICAgIChmbmFtZSwgbXR5cGUsIHJzZXFpZCkgPSBpcHJvdC5yZWFkTWVzc2FnZUJlZ2luKCkKKyAgICBpZiBtdHlwZSA9PSBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OOgorICAgICAgeCA9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbigpCisgICAgICB4LnJlYWQoaXByb3QpCisgICAgICBpcHJvdC5yZWFkTWVzc2FnZUVuZCgpCisgICAgICByYWlzZSB4CisgICAgcmVzdWx0ID0gZ2V0TG9nQ29uZmlnX3Jlc3VsdCgpCisgICAgcmVzdWx0LnJlYWQoaXByb3QpCisgICAgaXByb3QucmVhZE1lc3NhZ2VFbmQoKQorICAgIGlmIHJlc3VsdC5zdWNjZXNzIGlzIG5vdCBOb25lOgorICAgICAgcmV0dXJuIHJlc3VsdC5zdWNjZXNzCisgICAgcmFpc2UgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5NSVNTSU5HX1JFU1VMVCwgImdldExvZ0NvbmZpZyBmYWlsZWQ6IHVua25vd24gcmVzdWx0IikKKwogICBkZWYgZGVidWcoc2VsZiwgbmFtZSwgY29tcG9uZW50LCBlbmFibGUsIHNhbXBsaW5nUGVyY2VudGFnZSk6CiAgICAgIiIiCiAgICAgRW5hYmxlL2Rpc2FibGUgbG9nZ2luZyB0aGUgdHVwbGVzIGdlbmVyYXRlZCBpbiB0b3BvbG9neSB2aWEgYW4gaW50ZXJuYWwgRXZlbnRMb2dnZXIgYm9sdC4gVGhlIGNvbXBvbmVudCBuYW1lIGlzIG9wdGlvbmFsCiAgICAgYW5kIGlmIG51bGwgb3IgZW1wdHksIHRoZSBkZWJ1ZyBmbGFnIHdpbGwgYXBwbHkgdG8gdGhlIGVudGlyZSB0b3BvbG9neS4KIAotICAgIElmICdzYW1wbGluZ1BlcmNlbnRhZ2UnIGlzIHNwZWNpZmllZCwgaXQgd2lsbCBsaW1pdCBsb2dnZ2luZyB0byBhIHBlcmNlbnRhZ2Ugb2YgZ2VuZXJhdGVkIHR1cGxlcy4gVGhlIGRlZmF1bHQgaXMgdG8gbG9nIGFsbCAoMTAwIHBjdCkuCisgICAgVGhlICdzYW1wbGluZ1BlcmNlbnRhZ2UnIHdpbGwgbGltaXQgbG9nZ2dpbmcgdG8gYSBwZXJjZW50YWdlIG9mIGdlbmVyYXRlZCB0dXBsZXMuCiAKIAogICAgIFBhcmFtZXRlcnM6CkBAIC01MDUsNiArNjI1LDcyIEBACiAgICAgICByYWlzZSByZXN1bHQuYXplCiAgICAgcmV0dXJuCiAKKyAgZGVmIHNldFdvcmtlclByb2ZpbGVyKHNlbGYsIGlkLCBwcm9maWxlUmVxdWVzdCk6CisgICAgIiIiCisgICAgUGFyYW1ldGVyczoKKyAgICAgLSBpZAorICAgICAtIHByb2ZpbGVSZXF1ZXN0CisgICAgIiIiCisgICAgc2VsZi5zZW5kX3NldFdvcmtlclByb2ZpbGVyKGlkLCBwcm9maWxlUmVxdWVzdCkKKyAgICBzZWxmLnJlY3Zfc2V0V29ya2VyUHJvZmlsZXIoKQorCisgIGRlZiBzZW5kX3NldFdvcmtlclByb2ZpbGVyKHNlbGYsIGlkLCBwcm9maWxlUmVxdWVzdCk6CisgICAgc2VsZi5fb3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4oJ3NldFdvcmtlclByb2ZpbGVyJywgVE1lc3NhZ2VUeXBlLkNBTEwsIHNlbGYuX3NlcWlkKQorICAgIGFyZ3MgPSBzZXRXb3JrZXJQcm9maWxlcl9hcmdzKCkKKyAgICBhcmdzLmlkID0gaWQKKyAgICBhcmdzLnByb2ZpbGVSZXF1ZXN0ID0gcHJvZmlsZVJlcXVlc3QKKyAgICBhcmdzLndyaXRlKHNlbGYuX29wcm90KQorICAgIHNlbGYuX29wcm90LndyaXRlTWVzc2FnZUVuZCgpCisgICAgc2VsZi5fb3Byb3QudHJhbnMuZmx1c2goKQorCisgIGRlZiByZWN2X3NldFdvcmtlclByb2ZpbGVyKHNlbGYpOgorICAgIGlwcm90ID0gc2VsZi5faXByb3QKKyAgICAoZm5hbWUsIG10eXBlLCByc2VxaWQpID0gaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpCisgICAgaWYgbXR5cGUgPT0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTjoKKyAgICAgIHggPSBUQXBwbGljYXRpb25FeGNlcHRpb24oKQorICAgICAgeC5yZWFkKGlwcm90KQorICAgICAgaXByb3QucmVhZE1lc3NhZ2VFbmQoKQorICAgICAgcmFpc2UgeAorICAgIHJlc3VsdCA9IHNldFdvcmtlclByb2ZpbGVyX3Jlc3VsdCgpCisgICAgcmVzdWx0LnJlYWQoaXByb3QpCisgICAgaXByb3QucmVhZE1lc3NhZ2VFbmQoKQorICAgIHJldHVybgorCisgIGRlZiBnZXRDb21wb25lbnRQZW5kaW5nUHJvZmlsZUFjdGlvbnMoc2VsZiwgaWQsIGNvbXBvbmVudF9pZCwgYWN0aW9uKToKKyAgICAiIiIKKyAgICBQYXJhbWV0ZXJzOgorICAgICAtIGlkCisgICAgIC0gY29tcG9uZW50X2lkCisgICAgIC0gYWN0aW9uCisgICAgIiIiCisgICAgc2VsZi5zZW5kX2dldENvbXBvbmVudFBlbmRpbmdQcm9maWxlQWN0aW9ucyhpZCwgY29tcG9uZW50X2lkLCBhY3Rpb24pCisgICAgcmV0dXJuIHNlbGYucmVjdl9nZXRDb21wb25lbnRQZW5kaW5nUHJvZmlsZUFjdGlvbnMoKQorCisgIGRlZiBzZW5kX2dldENvbXBvbmVudFBlbmRpbmdQcm9maWxlQWN0aW9ucyhzZWxmLCBpZCwgY29tcG9uZW50X2lkLCBhY3Rpb24pOgorICAgIHNlbGYuX29wcm90LndyaXRlTWVzc2FnZUJlZ2luKCdnZXRDb21wb25lbnRQZW5kaW5nUHJvZmlsZUFjdGlvbnMnLCBUTWVzc2FnZVR5cGUuQ0FMTCwgc2VsZi5fc2VxaWQpCisgICAgYXJncyA9IGdldENvbXBvbmVudFBlbmRpbmdQcm9maWxlQWN0aW9uc19hcmdzKCkKKyAgICBhcmdzLmlkID0gaWQKKyAgICBhcmdzLmNvbXBvbmVudF9pZCA9IGNvbXBvbmVudF9pZAorICAgIGFyZ3MuYWN0aW9uID0gYWN0aW9uCisgICAgYXJncy53cml0ZShzZWxmLl9vcHJvdCkKKyAgICBzZWxmLl9vcHJvdC53cml0ZU1lc3NhZ2VFbmQoKQorICAgIHNlbGYuX29wcm90LnRyYW5zLmZsdXNoKCkKKworICBkZWYgcmVjdl9nZXRDb21wb25lbnRQZW5kaW5nUHJvZmlsZUFjdGlvbnMoc2VsZik6CisgICAgaXByb3QgPSBzZWxmLl9pcHJvdAorICAgIChmbmFtZSwgbXR5cGUsIHJzZXFpZCkgPSBpcHJvdC5yZWFkTWVzc2FnZUJlZ2luKCkKKyAgICBpZiBtdHlwZSA9PSBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OOgorICAgICAgeCA9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbigpCisgICAgICB4LnJlYWQoaXByb3QpCisgICAgICBpcHJvdC5yZWFkTWVzc2FnZUVuZCgpCisgICAgICByYWlzZSB4CisgICAgcmVzdWx0ID0gZ2V0Q29tcG9uZW50UGVuZGluZ1Byb2ZpbGVBY3Rpb25zX3Jlc3VsdCgpCisgICAgcmVzdWx0LnJlYWQoaXByb3QpCisgICAgaXByb3QucmVhZE1lc3NhZ2VFbmQoKQorICAgIGlmIHJlc3VsdC5zdWNjZXNzIGlzIG5vdCBOb25lOgorICAgICAgcmV0dXJuIHJlc3VsdC5zdWNjZXNzCisgICAgcmFpc2UgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5NSVNTSU5HX1JFU1VMVCwgImdldENvbXBvbmVudFBlbmRpbmdQcm9maWxlQWN0aW9ucyBmYWlsZWQ6IHVua25vd24gcmVzdWx0IikKKwogICBkZWYgdXBsb2FkTmV3Q3JlZGVudGlhbHMoc2VsZiwgbmFtZSwgY3JlZHMpOgogICAgICIiIgogICAgIFBhcmFtZXRlcnM6CkBAIC01NjgsNyArNzU0LDcgQEAKICAgICAgIHJldHVybiByZXN1bHQuc3VjY2VzcwogICAgIGlmIHJlc3VsdC5hemUgaXMgbm90IE5vbmU6CiAgICAgICByYWlzZSByZXN1bHQuYXplCi0gICAgcmFpc2UgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5NSVNTSU5HX1JFU1VMVCwgImJlZ2luRmlsZVVwbG9hZCBmYWlsZWQ6IHVua25vd24gcmVzdWx0Iik7CisgICAgcmFpc2UgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5NSVNTSU5HX1JFU1VMVCwgImJlZ2luRmlsZVVwbG9hZCBmYWlsZWQ6IHVua25vd24gcmVzdWx0IikKIAogICBkZWYgdXBsb2FkQ2h1bmsoc2VsZiwgbG9jYXRpb24sIGNodW5rKToKICAgICAiIiIKQEAgLTY2NSw3ICs4NTEsNyBAQAogICAgICAgcmV0dXJuIHJlc3VsdC5zdWNjZXNzCiAgICAgaWYgcmVzdWx0LmF6ZSBpcyBub3QgTm9uZToKICAgICAgIHJhaXNlIHJlc3VsdC5hemUKLSAgICByYWlzZSBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLk1JU1NJTkdfUkVTVUxULCAiYmVnaW5GaWxlRG93bmxvYWQgZmFpbGVkOiB1bmtub3duIHJlc3VsdCIpOworICAgIHJhaXNlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uTUlTU0lOR19SRVNVTFQsICJiZWdpbkZpbGVEb3dubG9hZCBmYWlsZWQ6IHVua25vd24gcmVzdWx0IikKIAogICBkZWYgZG93bmxvYWRDaHVuayhzZWxmLCBpZCk6CiAgICAgIiIiCkBAIC02OTgsNyArODg0LDcgQEAKICAgICAgIHJldHVybiByZXN1bHQuc3VjY2VzcwogICAgIGlmIHJlc3VsdC5hemUgaXMgbm90IE5vbmU6CiAgICAgICByYWlzZSByZXN1bHQuYXplCi0gICAgcmFpc2UgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5NSVNTSU5HX1JFU1VMVCwgImRvd25sb2FkQ2h1bmsgZmFpbGVkOiB1bmtub3duIHJlc3VsdCIpOworICAgIHJhaXNlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uTUlTU0lOR19SRVNVTFQsICJkb3dubG9hZENodW5rIGZhaWxlZDogdW5rbm93biByZXN1bHQiKQogCiAgIGRlZiBnZXROaW1idXNDb25mKHNlbGYpOgogICAgIHNlbGYuc2VuZF9nZXROaW1idXNDb25mKCkKQEAgLTcyNiw3ICs5MTIsNyBAQAogICAgICAgcmV0dXJuIHJlc3VsdC5zdWNjZXNzCiAgICAgaWYgcmVzdWx0LmF6ZSBpcyBub3QgTm9uZToKICAgICAgIHJhaXNlIHJlc3VsdC5hemUKLSAgICByYWlzZSBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLk1JU1NJTkdfUkVTVUxULCAiZ2V0TmltYnVzQ29uZiBmYWlsZWQ6IHVua25vd24gcmVzdWx0Iik7CisgICAgcmFpc2UgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5NSVNTSU5HX1JFU1VMVCwgImdldE5pbWJ1c0NvbmYgZmFpbGVkOiB1bmtub3duIHJlc3VsdCIpCiAKICAgZGVmIGdldENsdXN0ZXJJbmZvKHNlbGYpOgogICAgIHNlbGYuc2VuZF9nZXRDbHVzdGVySW5mbygpCkBAIC03NTQsNyArOTQwLDcgQEAKICAgICAgIHJldHVybiByZXN1bHQuc3VjY2VzcwogICAgIGlmIHJlc3VsdC5hemUgaXMgbm90IE5vbmU6CiAgICAgICByYWlzZSByZXN1bHQuYXplCi0gICAgcmFpc2UgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5NSVNTSU5HX1JFU1VMVCwgImdldENsdXN0ZXJJbmZvIGZhaWxlZDogdW5rbm93biByZXN1bHQiKTsKKyAgICByYWlzZSBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLk1JU1NJTkdfUkVTVUxULCAiZ2V0Q2x1c3RlckluZm8gZmFpbGVkOiB1bmtub3duIHJlc3VsdCIpCiAKICAgZGVmIGdldFRvcG9sb2d5SW5mbyhzZWxmLCBpZCk6CiAgICAgIiIiCkBAIC03ODksNyArOTc1LDcgQEAKICAgICAgIHJhaXNlIHJlc3VsdC5lCiAgICAgaWYgcmVzdWx0LmF6ZSBpcyBub3QgTm9uZToKICAgICAgIHJhaXNlIHJlc3VsdC5hemUKLSAgICByYWlzZSBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLk1JU1NJTkdfUkVTVUxULCAiZ2V0VG9wb2xvZ3lJbmZvIGZhaWxlZDogdW5rbm93biByZXN1bHQiKTsKKyAgICByYWlzZSBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLk1JU1NJTkdfUkVTVUxULCAiZ2V0VG9wb2xvZ3lJbmZvIGZhaWxlZDogdW5rbm93biByZXN1bHQiKQogCiAgIGRlZiBnZXRUb3BvbG9neUluZm9XaXRoT3B0cyhzZWxmLCBpZCwgb3B0aW9ucyk6CiAgICAgIiIiCkBAIC04MjYsNyArMTAxMiw4NyBAQAogICAgICAgcmFpc2UgcmVzdWx0LmUKICAgICBpZiByZXN1bHQuYXplIGlzIG5vdCBOb25lOgogICAgICAgcmFpc2UgcmVzdWx0LmF6ZQotICAgIHJhaXNlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uTUlTU0lOR19SRVNVTFQsICJnZXRUb3BvbG9neUluZm9XaXRoT3B0cyBmYWlsZWQ6IHVua25vd24gcmVzdWx0Iik7CisgICAgcmFpc2UgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5NSVNTSU5HX1JFU1VMVCwgImdldFRvcG9sb2d5SW5mb1dpdGhPcHRzIGZhaWxlZDogdW5rbm93biByZXN1bHQiKQorCisgIGRlZiBnZXRUb3BvbG9neVBhZ2VJbmZvKHNlbGYsIGlkLCB3aW5kb3csIGlzX2luY2x1ZGVfc3lzKToKKyAgICAiIiIKKyAgICBQYXJhbWV0ZXJzOgorICAgICAtIGlkCisgICAgIC0gd2luZG93CisgICAgIC0gaXNfaW5jbHVkZV9zeXMKKyAgICAiIiIKKyAgICBzZWxmLnNlbmRfZ2V0VG9wb2xvZ3lQYWdlSW5mbyhpZCwgd2luZG93LCBpc19pbmNsdWRlX3N5cykKKyAgICByZXR1cm4gc2VsZi5yZWN2X2dldFRvcG9sb2d5UGFnZUluZm8oKQorCisgIGRlZiBzZW5kX2dldFRvcG9sb2d5UGFnZUluZm8oc2VsZiwgaWQsIHdpbmRvdywgaXNfaW5jbHVkZV9zeXMpOgorICAgIHNlbGYuX29wcm90LndyaXRlTWVzc2FnZUJlZ2luKCdnZXRUb3BvbG9neVBhZ2VJbmZvJywgVE1lc3NhZ2VUeXBlLkNBTEwsIHNlbGYuX3NlcWlkKQorICAgIGFyZ3MgPSBnZXRUb3BvbG9neVBhZ2VJbmZvX2FyZ3MoKQorICAgIGFyZ3MuaWQgPSBpZAorICAgIGFyZ3Mud2luZG93ID0gd2luZG93CisgICAgYXJncy5pc19pbmNsdWRlX3N5cyA9IGlzX2luY2x1ZGVfc3lzCisgICAgYXJncy53cml0ZShzZWxmLl9vcHJvdCkKKyAgICBzZWxmLl9vcHJvdC53cml0ZU1lc3NhZ2VFbmQoKQorICAgIHNlbGYuX29wcm90LnRyYW5zLmZsdXNoKCkKKworICBkZWYgcmVjdl9nZXRUb3BvbG9neVBhZ2VJbmZvKHNlbGYpOgorICAgIGlwcm90ID0gc2VsZi5faXByb3QKKyAgICAoZm5hbWUsIG10eXBlLCByc2VxaWQpID0gaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpCisgICAgaWYgbXR5cGUgPT0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTjoKKyAgICAgIHggPSBUQXBwbGljYXRpb25FeGNlcHRpb24oKQorICAgICAgeC5yZWFkKGlwcm90KQorICAgICAgaXByb3QucmVhZE1lc3NhZ2VFbmQoKQorICAgICAgcmFpc2UgeAorICAgIHJlc3VsdCA9IGdldFRvcG9sb2d5UGFnZUluZm9fcmVzdWx0KCkKKyAgICByZXN1bHQucmVhZChpcHJvdCkKKyAgICBpcHJvdC5yZWFkTWVzc2FnZUVuZCgpCisgICAgaWYgcmVzdWx0LnN1Y2Nlc3MgaXMgbm90IE5vbmU6CisgICAgICByZXR1cm4gcmVzdWx0LnN1Y2Nlc3MKKyAgICBpZiByZXN1bHQuZSBpcyBub3QgTm9uZToKKyAgICAgIHJhaXNlIHJlc3VsdC5lCisgICAgaWYgcmVzdWx0LmF6ZSBpcyBub3QgTm9uZToKKyAgICAgIHJhaXNlIHJlc3VsdC5hemUKKyAgICByYWlzZSBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLk1JU1NJTkdfUkVTVUxULCAiZ2V0VG9wb2xvZ3lQYWdlSW5mbyBmYWlsZWQ6IHVua25vd24gcmVzdWx0IikKKworICBkZWYgZ2V0Q29tcG9uZW50UGFnZUluZm8oc2VsZiwgdG9wb2xvZ3lfaWQsIGNvbXBvbmVudF9pZCwgd2luZG93LCBpc19pbmNsdWRlX3N5cyk6CisgICAgIiIiCisgICAgUGFyYW1ldGVyczoKKyAgICAgLSB0b3BvbG9neV9pZAorICAgICAtIGNvbXBvbmVudF9pZAorICAgICAtIHdpbmRvdworICAgICAtIGlzX2luY2x1ZGVfc3lzCisgICAgIiIiCisgICAgc2VsZi5zZW5kX2dldENvbXBvbmVudFBhZ2VJbmZvKHRvcG9sb2d5X2lkLCBjb21wb25lbnRfaWQsIHdpbmRvdywgaXNfaW5jbHVkZV9zeXMpCisgICAgcmV0dXJuIHNlbGYucmVjdl9nZXRDb21wb25lbnRQYWdlSW5mbygpCisKKyAgZGVmIHNlbmRfZ2V0Q29tcG9uZW50UGFnZUluZm8oc2VsZiwgdG9wb2xvZ3lfaWQsIGNvbXBvbmVudF9pZCwgd2luZG93LCBpc19pbmNsdWRlX3N5cyk6CisgICAgc2VsZi5fb3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4oJ2dldENvbXBvbmVudFBhZ2VJbmZvJywgVE1lc3NhZ2VUeXBlLkNBTEwsIHNlbGYuX3NlcWlkKQorICAgIGFyZ3MgPSBnZXRDb21wb25lbnRQYWdlSW5mb19hcmdzKCkKKyAgICBhcmdzLnRvcG9sb2d5X2lkID0gdG9wb2xvZ3lfaWQKKyAgICBhcmdzLmNvbXBvbmVudF9pZCA9IGNvbXBvbmVudF9pZAorICAgIGFyZ3Mud2luZG93ID0gd2luZG93CisgICAgYXJncy5pc19pbmNsdWRlX3N5cyA9IGlzX2luY2x1ZGVfc3lzCisgICAgYXJncy53cml0ZShzZWxmLl9vcHJvdCkKKyAgICBzZWxmLl9vcHJvdC53cml0ZU1lc3NhZ2VFbmQoKQorICAgIHNlbGYuX29wcm90LnRyYW5zLmZsdXNoKCkKKworICBkZWYgcmVjdl9nZXRDb21wb25lbnRQYWdlSW5mbyhzZWxmKToKKyAgICBpcHJvdCA9IHNlbGYuX2lwcm90CisgICAgKGZuYW1lLCBtdHlwZSwgcnNlcWlkKSA9IGlwcm90LnJlYWRNZXNzYWdlQmVnaW4oKQorICAgIGlmIG10eXBlID09IFRNZXNzYWdlVHlwZS5FWENFUFRJT046CisgICAgICB4ID0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uKCkKKyAgICAgIHgucmVhZChpcHJvdCkKKyAgICAgIGlwcm90LnJlYWRNZXNzYWdlRW5kKCkKKyAgICAgIHJhaXNlIHgKKyAgICByZXN1bHQgPSBnZXRDb21wb25lbnRQYWdlSW5mb19yZXN1bHQoKQorICAgIHJlc3VsdC5yZWFkKGlwcm90KQorICAgIGlwcm90LnJlYWRNZXNzYWdlRW5kKCkKKyAgICBpZiByZXN1bHQuc3VjY2VzcyBpcyBub3QgTm9uZToKKyAgICAgIHJldHVybiByZXN1bHQuc3VjY2VzcworICAgIGlmIHJlc3VsdC5lIGlzIG5vdCBOb25lOgorICAgICAgcmFpc2UgcmVzdWx0LmUKKyAgICBpZiByZXN1bHQuYXplIGlzIG5vdCBOb25lOgorICAgICAgcmFpc2UgcmVzdWx0LmF6ZQorICAgIHJhaXNlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uTUlTU0lOR19SRVNVTFQsICJnZXRDb21wb25lbnRQYWdlSW5mbyBmYWlsZWQ6IHVua25vd24gcmVzdWx0IikKIAogICBkZWYgZ2V0VG9wb2xvZ3lDb25mKHNlbGYsIGlkKToKICAgICAiIiIKQEAgLTg2MSw3ICsxMTI3LDcgQEAKICAgICAgIHJhaXNlIHJlc3VsdC5lCiAgICAgaWYgcmVzdWx0LmF6ZSBpcyBub3QgTm9uZToKICAgICAgIHJhaXNlIHJlc3VsdC5hemUKLSAgICByYWlzZSBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLk1JU1NJTkdfUkVTVUxULCAiZ2V0VG9wb2xvZ3lDb25mIGZhaWxlZDogdW5rbm93biByZXN1bHQiKTsKKyAgICByYWlzZSBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLk1JU1NJTkdfUkVTVUxULCAiZ2V0VG9wb2xvZ3lDb25mIGZhaWxlZDogdW5rbm93biByZXN1bHQiKQogCiAgIGRlZiBnZXRUb3BvbG9neShzZWxmLCBpZCk6CiAgICAgIiIiCkBAIC04OTgsNyArMTE2NCw3IEBACiAgICAgICByYWlzZSByZXN1bHQuZQogICAgIGlmIHJlc3VsdC5hemUgaXMgbm90IE5vbmU6CiAgICAgICByYWlzZSByZXN1bHQuYXplCi0gICAgcmFpc2UgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5NSVNTSU5HX1JFU1VMVCwgImdldFRvcG9sb2d5IGZhaWxlZDogdW5rbm93biByZXN1bHQiKTsKKyAgICByYWlzZSBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLk1JU1NJTkdfUkVTVUxULCAiZ2V0VG9wb2xvZ3kgZmFpbGVkOiB1bmtub3duIHJlc3VsdCIpCiAKICAgZGVmIGdldFVzZXJUb3BvbG9neShzZWxmLCBpZCk6CiAgICAgIiIiCkBAIC05MzUsNyArMTIwMSw0MCBAQAogICAgICAgcmFpc2UgcmVzdWx0LmUKICAgICBpZiByZXN1bHQuYXplIGlzIG5vdCBOb25lOgogICAgICAgcmFpc2UgcmVzdWx0LmF6ZQotICAgIHJhaXNlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uTUlTU0lOR19SRVNVTFQsICJnZXRVc2VyVG9wb2xvZ3kgZmFpbGVkOiB1bmtub3duIHJlc3VsdCIpOworICAgIHJhaXNlIFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uTUlTU0lOR19SRVNVTFQsICJnZXRVc2VyVG9wb2xvZ3kgZmFpbGVkOiB1bmtub3duIHJlc3VsdCIpCisKKyAgZGVmIGdldFRvcG9sb2d5SGlzdG9yeShzZWxmLCB1c2VyKToKKyAgICAiIiIKKyAgICBQYXJhbWV0ZXJzOgorICAgICAtIHVzZXIKKyAgICAiIiIKKyAgICBzZWxmLnNlbmRfZ2V0VG9wb2xvZ3lIaXN0b3J5KHVzZXIpCisgICAgcmV0dXJuIHNlbGYucmVjdl9nZXRUb3BvbG9neUhpc3RvcnkoKQorCisgIGRlZiBzZW5kX2dldFRvcG9sb2d5SGlzdG9yeShzZWxmLCB1c2VyKToKKyAgICBzZWxmLl9vcHJvdC53cml0ZU1lc3NhZ2VCZWdpbignZ2V0VG9wb2xvZ3lIaXN0b3J5JywgVE1lc3NhZ2VUeXBlLkNBTEwsIHNlbGYuX3NlcWlkKQorICAgIGFyZ3MgPSBnZXRUb3BvbG9neUhpc3RvcnlfYXJncygpCisgICAgYXJncy51c2VyID0gdXNlcgorICAgIGFyZ3Mud3JpdGUoc2VsZi5fb3Byb3QpCisgICAgc2VsZi5fb3Byb3Qud3JpdGVNZXNzYWdlRW5kKCkKKyAgICBzZWxmLl9vcHJvdC50cmFucy5mbHVzaCgpCisKKyAgZGVmIHJlY3ZfZ2V0VG9wb2xvZ3lIaXN0b3J5KHNlbGYpOgorICAgIGlwcm90ID0gc2VsZi5faXByb3QKKyAgICAoZm5hbWUsIG10eXBlLCByc2VxaWQpID0gaXByb3QucmVhZE1lc3NhZ2VCZWdpbigpCisgICAgaWYgbXR5cGUgPT0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTjoKKyAgICAgIHggPSBUQXBwbGljYXRpb25FeGNlcHRpb24oKQorICAgICAgeC5yZWFkKGlwcm90KQorICAgICAgaXByb3QucmVhZE1lc3NhZ2VFbmQoKQorICAgICAgcmFpc2UgeAorICAgIHJlc3VsdCA9IGdldFRvcG9sb2d5SGlzdG9yeV9yZXN1bHQoKQorICAgIHJlc3VsdC5yZWFkKGlwcm90KQorICAgIGlwcm90LnJlYWRNZXNzYWdlRW5kKCkKKyAgICBpZiByZXN1bHQuc3VjY2VzcyBpcyBub3QgTm9uZToKKyAgICAgIHJldHVybiByZXN1bHQuc3VjY2VzcworICAgIGlmIHJlc3VsdC5hemUgaXMgbm90IE5vbmU6CisgICAgICByYWlzZSByZXN1bHQuYXplCisgICAgcmFpc2UgVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5NSVNTSU5HX1JFU1VMVCwgImdldFRvcG9sb2d5SGlzdG9yeSBmYWlsZWQ6IHVua25vd24gcmVzdWx0IikKIAogCiBjbGFzcyBQcm9jZXNzb3IoSWZhY2UsIFRQcm9jZXNzb3IpOgpAQCAtOTQ5LDcgKzEyNDgsMTEgQEAKICAgICBzZWxmLl9wcm9jZXNzTWFwWyJhY3RpdmF0ZSJdID0gUHJvY2Vzc29yLnByb2Nlc3NfYWN0aXZhdGUKICAgICBzZWxmLl9wcm9jZXNzTWFwWyJkZWFjdGl2YXRlIl0gPSBQcm9jZXNzb3IucHJvY2Vzc19kZWFjdGl2YXRlCiAgICAgc2VsZi5fcHJvY2Vzc01hcFsicmViYWxhbmNlIl0gPSBQcm9jZXNzb3IucHJvY2Vzc19yZWJhbGFuY2UKKyAgICBzZWxmLl9wcm9jZXNzTWFwWyJzZXRMb2dDb25maWciXSA9IFByb2Nlc3Nvci5wcm9jZXNzX3NldExvZ0NvbmZpZworICAgIHNlbGYuX3Byb2Nlc3NNYXBbImdldExvZ0NvbmZpZyJdID0gUHJvY2Vzc29yLnByb2Nlc3NfZ2V0TG9nQ29uZmlnCiAgICAgc2VsZi5fcHJvY2Vzc01hcFsiZGVidWciXSA9IFByb2Nlc3Nvci5wcm9jZXNzX2RlYnVnCisgICAgc2VsZi5fcHJvY2Vzc01hcFsic2V0V29ya2VyUHJvZmlsZXIiXSA9IFByb2Nlc3Nvci5wcm9jZXNzX3NldFdvcmtlclByb2ZpbGVyCisgICAgc2VsZi5fcHJvY2Vzc01hcFsiZ2V0Q29tcG9uZW50UGVuZGluZ1Byb2ZpbGVBY3Rpb25zIl0gPSBQcm9jZXNzb3IucHJvY2Vzc19nZXRDb21wb25lbnRQZW5kaW5nUHJvZmlsZUFjdGlvbnMKICAgICBzZWxmLl9wcm9jZXNzTWFwWyJ1cGxvYWROZXdDcmVkZW50aWFscyJdID0gUHJvY2Vzc29yLnByb2Nlc3NfdXBsb2FkTmV3Q3JlZGVudGlhbHMKICAgICBzZWxmLl9wcm9jZXNzTWFwWyJiZWdpbkZpbGVVcGxvYWQiXSA9IFByb2Nlc3Nvci5wcm9jZXNzX2JlZ2luRmlsZVVwbG9hZAogICAgIHNlbGYuX3Byb2Nlc3NNYXBbInVwbG9hZENodW5rIl0gPSBQcm9jZXNzb3IucHJvY2Vzc191cGxvYWRDaHVuawpAQCAtOTYwLDkgKzEyNjMsMTIgQEAKICAgICBzZWxmLl9wcm9jZXNzTWFwWyJnZXRDbHVzdGVySW5mbyJdID0gUHJvY2Vzc29yLnByb2Nlc3NfZ2V0Q2x1c3RlckluZm8KICAgICBzZWxmLl9wcm9jZXNzTWFwWyJnZXRUb3BvbG9neUluZm8iXSA9IFByb2Nlc3Nvci5wcm9jZXNzX2dldFRvcG9sb2d5SW5mbwogICAgIHNlbGYuX3Byb2Nlc3NNYXBbImdldFRvcG9sb2d5SW5mb1dpdGhPcHRzIl0gPSBQcm9jZXNzb3IucHJvY2Vzc19nZXRUb3BvbG9neUluZm9XaXRoT3B0cworICAgIHNlbGYuX3Byb2Nlc3NNYXBbImdldFRvcG9sb2d5UGFnZUluZm8iXSA9IFByb2Nlc3Nvci5wcm9jZXNzX2dldFRvcG9sb2d5UGFnZUluZm8KKyAgICBzZWxmLl9wcm9jZXNzTWFwWyJnZXRDb21wb25lbnRQYWdlSW5mbyJdID0gUHJvY2Vzc29yLnByb2Nlc3NfZ2V0Q29tcG9uZW50UGFnZUluZm8KICAgICBzZWxmLl9wcm9jZXNzTWFwWyJnZXRUb3BvbG9neUNvbmYiXSA9IFByb2Nlc3Nvci5wcm9jZXNzX2dldFRvcG9sb2d5Q29uZgogICAgIHNlbGYuX3Byb2Nlc3NNYXBbImdldFRvcG9sb2d5Il0gPSBQcm9jZXNzb3IucHJvY2Vzc19nZXRUb3BvbG9neQogICAgIHNlbGYuX3Byb2Nlc3NNYXBbImdldFVzZXJUb3BvbG9neSJdID0gUHJvY2Vzc29yLnByb2Nlc3NfZ2V0VXNlclRvcG9sb2d5CisgICAgc2VsZi5fcHJvY2Vzc01hcFsiZ2V0VG9wb2xvZ3lIaXN0b3J5Il0gPSBQcm9jZXNzb3IucHJvY2Vzc19nZXRUb3BvbG9neUhpc3RvcnkKIAogICBkZWYgcHJvY2VzcyhzZWxmLCBpcHJvdCwgb3Byb3QpOgogICAgIChuYW1lLCB0eXBlLCBzZXFpZCkgPSBpcHJvdC5yZWFkTWVzc2FnZUJlZ2luKCkKQEAgLTk4NiwxMyArMTI5MiwyMyBAQAogICAgIHJlc3VsdCA9IHN1Ym1pdFRvcG9sb2d5X3Jlc3VsdCgpCiAgICAgdHJ5OgogICAgICAgc2VsZi5faGFuZGxlci5zdWJtaXRUb3BvbG9neShhcmdzLm5hbWUsIGFyZ3MudXBsb2FkZWRKYXJMb2NhdGlvbiwgYXJncy5qc29uQ29uZiwgYXJncy50b3BvbG9neSkKLSAgICBleGNlcHQgQWxyZWFkeUFsaXZlRXhjZXB0aW9uLCBlOgorICAgICAgbXNnX3R5cGUgPSBUTWVzc2FnZVR5cGUuUkVQTFkKKyAgICBleGNlcHQgKFRUcmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbiwgS2V5Ym9hcmRJbnRlcnJ1cHQsIFN5c3RlbUV4aXQpOgorICAgICAgcmFpc2UKKyAgICBleGNlcHQgQWxyZWFkeUFsaXZlRXhjZXB0aW9uIGFzIGU6CisgICAgICBtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5SRVBMWQogICAgICAgcmVzdWx0LmUgPSBlCi0gICAgZXhjZXB0IEludmFsaWRUb3BvbG9neUV4Y2VwdGlvbiwgaXRlOgorICAgIGV4Y2VwdCBJbnZhbGlkVG9wb2xvZ3lFeGNlcHRpb24gYXMgaXRlOgorICAgICAgbXNnX3R5cGUgPSBUTWVzc2FnZVR5cGUuUkVQTFkKICAgICAgIHJlc3VsdC5pdGUgPSBpdGUKLSAgICBleGNlcHQgQXV0aG9yaXphdGlvbkV4Y2VwdGlvbiwgYXplOgorICAgIGV4Y2VwdCBBdXRob3JpemF0aW9uRXhjZXB0aW9uIGFzIGF6ZToKKyAgICAgIG1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLlJFUExZCiAgICAgICByZXN1bHQuYXplID0gYXplCi0gICAgb3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4oInN1Ym1pdFRvcG9sb2d5IiwgVE1lc3NhZ2VUeXBlLlJFUExZLCBzZXFpZCkKKyAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4OgorICAgICAgbXNnX3R5cGUgPSBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OCisgICAgICBsb2dnaW5nLmV4Y2VwdGlvbihleCkKKyAgICAgIHJlc3VsdCA9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uSU5URVJOQUxfRVJST1IsICdJbnRlcm5hbCBlcnJvcicpCisgICAgb3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4oInN1Ym1pdFRvcG9sb2d5IiwgbXNnX3R5cGUsIHNlcWlkKQogICAgIHJlc3VsdC53cml0ZShvcHJvdCkKICAgICBvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKQogICAgIG9wcm90LnRyYW5zLmZsdXNoKCkKQEAgLTEwMDQsMTMgKzEzMjAsMjMgQEAKICAgICByZXN1bHQgPSBzdWJtaXRUb3BvbG9neVdpdGhPcHRzX3Jlc3VsdCgpCiAgICAgdHJ5OgogICAgICAgc2VsZi5faGFuZGxlci5zdWJtaXRUb3BvbG9neVdpdGhPcHRzKGFyZ3MubmFtZSwgYXJncy51cGxvYWRlZEphckxvY2F0aW9uLCBhcmdzLmpzb25Db25mLCBhcmdzLnRvcG9sb2d5LCBhcmdzLm9wdGlvbnMpCi0gICAgZXhjZXB0IEFscmVhZHlBbGl2ZUV4Y2VwdGlvbiwgZToKKyAgICAgIG1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLlJFUExZCisgICAgZXhjZXB0IChUVHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb24sIEtleWJvYXJkSW50ZXJydXB0LCBTeXN0ZW1FeGl0KToKKyAgICAgIHJhaXNlCisgICAgZXhjZXB0IEFscmVhZHlBbGl2ZUV4Y2VwdGlvbiBhcyBlOgorICAgICAgbXNnX3R5cGUgPSBUTWVzc2FnZVR5cGUuUkVQTFkKICAgICAgIHJlc3VsdC5lID0gZQotICAgIGV4Y2VwdCBJbnZhbGlkVG9wb2xvZ3lFeGNlcHRpb24sIGl0ZToKKyAgICBleGNlcHQgSW52YWxpZFRvcG9sb2d5RXhjZXB0aW9uIGFzIGl0ZToKKyAgICAgIG1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLlJFUExZCiAgICAgICByZXN1bHQuaXRlID0gaXRlCi0gICAgZXhjZXB0IEF1dGhvcml6YXRpb25FeGNlcHRpb24sIGF6ZToKKyAgICBleGNlcHQgQXV0aG9yaXphdGlvbkV4Y2VwdGlvbiBhcyBhemU6CisgICAgICBtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5SRVBMWQogICAgICAgcmVzdWx0LmF6ZSA9IGF6ZQotICAgIG9wcm90LndyaXRlTWVzc2FnZUJlZ2luKCJzdWJtaXRUb3BvbG9neVdpdGhPcHRzIiwgVE1lc3NhZ2VUeXBlLlJFUExZLCBzZXFpZCkKKyAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4OgorICAgICAgbXNnX3R5cGUgPSBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OCisgICAgICBsb2dnaW5nLmV4Y2VwdGlvbihleCkKKyAgICAgIHJlc3VsdCA9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uSU5URVJOQUxfRVJST1IsICdJbnRlcm5hbCBlcnJvcicpCisgICAgb3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4oInN1Ym1pdFRvcG9sb2d5V2l0aE9wdHMiLCBtc2dfdHlwZSwgc2VxaWQpCiAgICAgcmVzdWx0LndyaXRlKG9wcm90KQogICAgIG9wcm90LndyaXRlTWVzc2FnZUVuZCgpCiAgICAgb3Byb3QudHJhbnMuZmx1c2goKQpAQCAtMTAyMiwxMSArMTM0OCwyMCBAQAogICAgIHJlc3VsdCA9IGtpbGxUb3BvbG9neV9yZXN1bHQoKQogICAgIHRyeToKICAgICAgIHNlbGYuX2hhbmRsZXIua2lsbFRvcG9sb2d5KGFyZ3MubmFtZSkKLSAgICBleGNlcHQgTm90QWxpdmVFeGNlcHRpb24sIGU6CisgICAgICBtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5SRVBMWQorICAgIGV4Y2VwdCAoVFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uLCBLZXlib2FyZEludGVycnVwdCwgU3lzdGVtRXhpdCk6CisgICAgICByYWlzZQorICAgIGV4Y2VwdCBOb3RBbGl2ZUV4Y2VwdGlvbiBhcyBlOgorICAgICAgbXNnX3R5cGUgPSBUTWVzc2FnZVR5cGUuUkVQTFkKICAgICAgIHJlc3VsdC5lID0gZQotICAgIGV4Y2VwdCBBdXRob3JpemF0aW9uRXhjZXB0aW9uLCBhemU6CisgICAgZXhjZXB0IEF1dGhvcml6YXRpb25FeGNlcHRpb24gYXMgYXplOgorICAgICAgbXNnX3R5cGUgPSBUTWVzc2FnZVR5cGUuUkVQTFkKICAgICAgIHJlc3VsdC5hemUgPSBhemUKLSAgICBvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbigia2lsbFRvcG9sb2d5IiwgVE1lc3NhZ2VUeXBlLlJFUExZLCBzZXFpZCkKKyAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4OgorICAgICAgbXNnX3R5cGUgPSBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OCisgICAgICBsb2dnaW5nLmV4Y2VwdGlvbihleCkKKyAgICAgIHJlc3VsdCA9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uSU5URVJOQUxfRVJST1IsICdJbnRlcm5hbCBlcnJvcicpCisgICAgb3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4oImtpbGxUb3BvbG9neSIsIG1zZ190eXBlLCBzZXFpZCkKICAgICByZXN1bHQud3JpdGUob3Byb3QpCiAgICAgb3Byb3Qud3JpdGVNZXNzYWdlRW5kKCkKICAgICBvcHJvdC50cmFucy5mbHVzaCgpCkBAIC0xMDM4LDExICsxMzczLDIwIEBACiAgICAgcmVzdWx0ID0ga2lsbFRvcG9sb2d5V2l0aE9wdHNfcmVzdWx0KCkKICAgICB0cnk6CiAgICAgICBzZWxmLl9oYW5kbGVyLmtpbGxUb3BvbG9neVdpdGhPcHRzKGFyZ3MubmFtZSwgYXJncy5vcHRpb25zKQotICAgIGV4Y2VwdCBOb3RBbGl2ZUV4Y2VwdGlvbiwgZToKKyAgICAgIG1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLlJFUExZCisgICAgZXhjZXB0IChUVHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb24sIEtleWJvYXJkSW50ZXJydXB0LCBTeXN0ZW1FeGl0KToKKyAgICAgIHJhaXNlCisgICAgZXhjZXB0IE5vdEFsaXZlRXhjZXB0aW9uIGFzIGU6CisgICAgICBtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5SRVBMWQogICAgICAgcmVzdWx0LmUgPSBlCi0gICAgZXhjZXB0IEF1dGhvcml6YXRpb25FeGNlcHRpb24sIGF6ZToKKyAgICBleGNlcHQgQXV0aG9yaXphdGlvbkV4Y2VwdGlvbiBhcyBhemU6CisgICAgICBtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5SRVBMWQogICAgICAgcmVzdWx0LmF6ZSA9IGF6ZQotICAgIG9wcm90LndyaXRlTWVzc2FnZUJlZ2luKCJraWxsVG9wb2xvZ3lXaXRoT3B0cyIsIFRNZXNzYWdlVHlwZS5SRVBMWSwgc2VxaWQpCisgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleDoKKyAgICAgIG1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTgorICAgICAgbG9nZ2luZy5leGNlcHRpb24oZXgpCisgICAgICByZXN1bHQgPSBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLklOVEVSTkFMX0VSUk9SLCAnSW50ZXJuYWwgZXJyb3InKQorICAgIG9wcm90LndyaXRlTWVzc2FnZUJlZ2luKCJraWxsVG9wb2xvZ3lXaXRoT3B0cyIsIG1zZ190eXBlLCBzZXFpZCkKICAgICByZXN1bHQud3JpdGUob3Byb3QpCiAgICAgb3Byb3Qud3JpdGVNZXNzYWdlRW5kKCkKICAgICBvcHJvdC50cmFucy5mbHVzaCgpCkBAIC0xMDU0LDExICsxMzk4LDIwIEBACiAgICAgcmVzdWx0ID0gYWN0aXZhdGVfcmVzdWx0KCkKICAgICB0cnk6CiAgICAgICBzZWxmLl9oYW5kbGVyLmFjdGl2YXRlKGFyZ3MubmFtZSkKLSAgICBleGNlcHQgTm90QWxpdmVFeGNlcHRpb24sIGU6CisgICAgICBtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5SRVBMWQorICAgIGV4Y2VwdCAoVFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uLCBLZXlib2FyZEludGVycnVwdCwgU3lzdGVtRXhpdCk6CisgICAgICByYWlzZQorICAgIGV4Y2VwdCBOb3RBbGl2ZUV4Y2VwdGlvbiBhcyBlOgorICAgICAgbXNnX3R5cGUgPSBUTWVzc2FnZVR5cGUuUkVQTFkKICAgICAgIHJlc3VsdC5lID0gZQotICAgIGV4Y2VwdCBBdXRob3JpemF0aW9uRXhjZXB0aW9uLCBhemU6CisgICAgZXhjZXB0IEF1dGhvcml6YXRpb25FeGNlcHRpb24gYXMgYXplOgorICAgICAgbXNnX3R5cGUgPSBUTWVzc2FnZVR5cGUuUkVQTFkKICAgICAgIHJlc3VsdC5hemUgPSBhemUKLSAgICBvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbigiYWN0aXZhdGUiLCBUTWVzc2FnZVR5cGUuUkVQTFksIHNlcWlkKQorICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXg6CisgICAgICBtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5FWENFUFRJT04KKyAgICAgIGxvZ2dpbmcuZXhjZXB0aW9uKGV4KQorICAgICAgcmVzdWx0ID0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5JTlRFUk5BTF9FUlJPUiwgJ0ludGVybmFsIGVycm9yJykKKyAgICBvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbigiYWN0aXZhdGUiLCBtc2dfdHlwZSwgc2VxaWQpCiAgICAgcmVzdWx0LndyaXRlKG9wcm90KQogICAgIG9wcm90LndyaXRlTWVzc2FnZUVuZCgpCiAgICAgb3Byb3QudHJhbnMuZmx1c2goKQpAQCAtMTA3MCwxMSArMTQyMywyMCBAQAogICAgIHJlc3VsdCA9IGRlYWN0aXZhdGVfcmVzdWx0KCkKICAgICB0cnk6CiAgICAgICBzZWxmLl9oYW5kbGVyLmRlYWN0aXZhdGUoYXJncy5uYW1lKQotICAgIGV4Y2VwdCBOb3RBbGl2ZUV4Y2VwdGlvbiwgZToKKyAgICAgIG1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLlJFUExZCisgICAgZXhjZXB0IChUVHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb24sIEtleWJvYXJkSW50ZXJydXB0LCBTeXN0ZW1FeGl0KToKKyAgICAgIHJhaXNlCisgICAgZXhjZXB0IE5vdEFsaXZlRXhjZXB0aW9uIGFzIGU6CisgICAgICBtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5SRVBMWQogICAgICAgcmVzdWx0LmUgPSBlCi0gICAgZXhjZXB0IEF1dGhvcml6YXRpb25FeGNlcHRpb24sIGF6ZToKKyAgICBleGNlcHQgQXV0aG9yaXphdGlvbkV4Y2VwdGlvbiBhcyBhemU6CisgICAgICBtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5SRVBMWQogICAgICAgcmVzdWx0LmF6ZSA9IGF6ZQotICAgIG9wcm90LndyaXRlTWVzc2FnZUJlZ2luKCJkZWFjdGl2YXRlIiwgVE1lc3NhZ2VUeXBlLlJFUExZLCBzZXFpZCkKKyAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4OgorICAgICAgbXNnX3R5cGUgPSBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OCisgICAgICBsb2dnaW5nLmV4Y2VwdGlvbihleCkKKyAgICAgIHJlc3VsdCA9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uSU5URVJOQUxfRVJST1IsICdJbnRlcm5hbCBlcnJvcicpCisgICAgb3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4oImRlYWN0aXZhdGUiLCBtc2dfdHlwZSwgc2VxaWQpCiAgICAgcmVzdWx0LndyaXRlKG9wcm90KQogICAgIG9wcm90LndyaXRlTWVzc2FnZUVuZCgpCiAgICAgb3Byb3QudHJhbnMuZmx1c2goKQpAQCAtMTA4NiwxMyArMTQ0OCw2MSBAQAogICAgIHJlc3VsdCA9IHJlYmFsYW5jZV9yZXN1bHQoKQogICAgIHRyeToKICAgICAgIHNlbGYuX2hhbmRsZXIucmViYWxhbmNlKGFyZ3MubmFtZSwgYXJncy5vcHRpb25zKQotICAgIGV4Y2VwdCBOb3RBbGl2ZUV4Y2VwdGlvbiwgZToKKyAgICAgIG1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLlJFUExZCisgICAgZXhjZXB0IChUVHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb24sIEtleWJvYXJkSW50ZXJydXB0LCBTeXN0ZW1FeGl0KToKKyAgICAgIHJhaXNlCisgICAgZXhjZXB0IE5vdEFsaXZlRXhjZXB0aW9uIGFzIGU6CisgICAgICBtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5SRVBMWQogICAgICAgcmVzdWx0LmUgPSBlCi0gICAgZXhjZXB0IEludmFsaWRUb3BvbG9neUV4Y2VwdGlvbiwgaXRlOgorICAgIGV4Y2VwdCBJbnZhbGlkVG9wb2xvZ3lFeGNlcHRpb24gYXMgaXRlOgorICAgICAgbXNnX3R5cGUgPSBUTWVzc2FnZVR5cGUuUkVQTFkKICAgICAgIHJlc3VsdC5pdGUgPSBpdGUKLSAgICBleGNlcHQgQXV0aG9yaXphdGlvbkV4Y2VwdGlvbiwgYXplOgorICAgIGV4Y2VwdCBBdXRob3JpemF0aW9uRXhjZXB0aW9uIGFzIGF6ZToKKyAgICAgIG1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLlJFUExZCiAgICAgICByZXN1bHQuYXplID0gYXplCi0gICAgb3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4oInJlYmFsYW5jZSIsIFRNZXNzYWdlVHlwZS5SRVBMWSwgc2VxaWQpCisgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleDoKKyAgICAgIG1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTgorICAgICAgbG9nZ2luZy5leGNlcHRpb24oZXgpCisgICAgICByZXN1bHQgPSBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLklOVEVSTkFMX0VSUk9SLCAnSW50ZXJuYWwgZXJyb3InKQorICAgIG9wcm90LndyaXRlTWVzc2FnZUJlZ2luKCJyZWJhbGFuY2UiLCBtc2dfdHlwZSwgc2VxaWQpCisgICAgcmVzdWx0LndyaXRlKG9wcm90KQorICAgIG9wcm90LndyaXRlTWVzc2FnZUVuZCgpCisgICAgb3Byb3QudHJhbnMuZmx1c2goKQorCisgIGRlZiBwcm9jZXNzX3NldExvZ0NvbmZpZyhzZWxmLCBzZXFpZCwgaXByb3QsIG9wcm90KToKKyAgICBhcmdzID0gc2V0TG9nQ29uZmlnX2FyZ3MoKQorICAgIGFyZ3MucmVhZChpcHJvdCkKKyAgICBpcHJvdC5yZWFkTWVzc2FnZUVuZCgpCisgICAgcmVzdWx0ID0gc2V0TG9nQ29uZmlnX3Jlc3VsdCgpCisgICAgdHJ5OgorICAgICAgc2VsZi5faGFuZGxlci5zZXRMb2dDb25maWcoYXJncy5uYW1lLCBhcmdzLmNvbmZpZykKKyAgICAgIG1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLlJFUExZCisgICAgZXhjZXB0IChUVHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb24sIEtleWJvYXJkSW50ZXJydXB0LCBTeXN0ZW1FeGl0KToKKyAgICAgIHJhaXNlCisgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleDoKKyAgICAgIG1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTgorICAgICAgbG9nZ2luZy5leGNlcHRpb24oZXgpCisgICAgICByZXN1bHQgPSBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLklOVEVSTkFMX0VSUk9SLCAnSW50ZXJuYWwgZXJyb3InKQorICAgIG9wcm90LndyaXRlTWVzc2FnZUJlZ2luKCJzZXRMb2dDb25maWciLCBtc2dfdHlwZSwgc2VxaWQpCisgICAgcmVzdWx0LndyaXRlKG9wcm90KQorICAgIG9wcm90LndyaXRlTWVzc2FnZUVuZCgpCisgICAgb3Byb3QudHJhbnMuZmx1c2goKQorCisgIGRlZiBwcm9jZXNzX2dldExvZ0NvbmZpZyhzZWxmLCBzZXFpZCwgaXByb3QsIG9wcm90KToKKyAgICBhcmdzID0gZ2V0TG9nQ29uZmlnX2FyZ3MoKQorICAgIGFyZ3MucmVhZChpcHJvdCkKKyAgICBpcHJvdC5yZWFkTWVzc2FnZUVuZCgpCisgICAgcmVzdWx0ID0gZ2V0TG9nQ29uZmlnX3Jlc3VsdCgpCisgICAgdHJ5OgorICAgICAgcmVzdWx0LnN1Y2Nlc3MgPSBzZWxmLl9oYW5kbGVyLmdldExvZ0NvbmZpZyhhcmdzLm5hbWUpCisgICAgICBtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5SRVBMWQorICAgIGV4Y2VwdCAoVFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uLCBLZXlib2FyZEludGVycnVwdCwgU3lzdGVtRXhpdCk6CisgICAgICByYWlzZQorICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXg6CisgICAgICBtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5FWENFUFRJT04KKyAgICAgIGxvZ2dpbmcuZXhjZXB0aW9uKGV4KQorICAgICAgcmVzdWx0ID0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5JTlRFUk5BTF9FUlJPUiwgJ0ludGVybmFsIGVycm9yJykKKyAgICBvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbigiZ2V0TG9nQ29uZmlnIiwgbXNnX3R5cGUsIHNlcWlkKQogICAgIHJlc3VsdC53cml0ZShvcHJvdCkKICAgICBvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKQogICAgIG9wcm90LnRyYW5zLmZsdXNoKCkKQEAgLTExMDQsMTEgKzE1MTQsNTggQEAKICAgICByZXN1bHQgPSBkZWJ1Z19yZXN1bHQoKQogICAgIHRyeToKICAgICAgIHNlbGYuX2hhbmRsZXIuZGVidWcoYXJncy5uYW1lLCBhcmdzLmNvbXBvbmVudCwgYXJncy5lbmFibGUsIGFyZ3Muc2FtcGxpbmdQZXJjZW50YWdlKQotICAgIGV4Y2VwdCBOb3RBbGl2ZUV4Y2VwdGlvbiwgZToKKyAgICAgIG1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLlJFUExZCisgICAgZXhjZXB0IChUVHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb24sIEtleWJvYXJkSW50ZXJydXB0LCBTeXN0ZW1FeGl0KToKKyAgICAgIHJhaXNlCisgICAgZXhjZXB0IE5vdEFsaXZlRXhjZXB0aW9uIGFzIGU6CisgICAgICBtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5SRVBMWQogICAgICAgcmVzdWx0LmUgPSBlCi0gICAgZXhjZXB0IEF1dGhvcml6YXRpb25FeGNlcHRpb24sIGF6ZToKKyAgICBleGNlcHQgQXV0aG9yaXphdGlvbkV4Y2VwdGlvbiBhcyBhemU6CisgICAgICBtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5SRVBMWQogICAgICAgcmVzdWx0LmF6ZSA9IGF6ZQotICAgIG9wcm90LndyaXRlTWVzc2FnZUJlZ2luKCJkZWJ1ZyIsIFRNZXNzYWdlVHlwZS5SRVBMWSwgc2VxaWQpCisgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleDoKKyAgICAgIG1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTgorICAgICAgbG9nZ2luZy5leGNlcHRpb24oZXgpCisgICAgICByZXN1bHQgPSBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLklOVEVSTkFMX0VSUk9SLCAnSW50ZXJuYWwgZXJyb3InKQorICAgIG9wcm90LndyaXRlTWVzc2FnZUJlZ2luKCJkZWJ1ZyIsIG1zZ190eXBlLCBzZXFpZCkKKyAgICByZXN1bHQud3JpdGUob3Byb3QpCisgICAgb3Byb3Qud3JpdGVNZXNzYWdlRW5kKCkKKyAgICBvcHJvdC50cmFucy5mbHVzaCgpCisKKyAgZGVmIHByb2Nlc3Nfc2V0V29ya2VyUHJvZmlsZXIoc2VsZiwgc2VxaWQsIGlwcm90LCBvcHJvdCk6CisgICAgYXJncyA9IHNldFdvcmtlclByb2ZpbGVyX2FyZ3MoKQorICAgIGFyZ3MucmVhZChpcHJvdCkKKyAgICBpcHJvdC5yZWFkTWVzc2FnZUVuZCgpCisgICAgcmVzdWx0ID0gc2V0V29ya2VyUHJvZmlsZXJfcmVzdWx0KCkKKyAgICB0cnk6CisgICAgICBzZWxmLl9oYW5kbGVyLnNldFdvcmtlclByb2ZpbGVyKGFyZ3MuaWQsIGFyZ3MucHJvZmlsZVJlcXVlc3QpCisgICAgICBtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5SRVBMWQorICAgIGV4Y2VwdCAoVFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uLCBLZXlib2FyZEludGVycnVwdCwgU3lzdGVtRXhpdCk6CisgICAgICByYWlzZQorICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXg6CisgICAgICBtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5FWENFUFRJT04KKyAgICAgIGxvZ2dpbmcuZXhjZXB0aW9uKGV4KQorICAgICAgcmVzdWx0ID0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5JTlRFUk5BTF9FUlJPUiwgJ0ludGVybmFsIGVycm9yJykKKyAgICBvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbigic2V0V29ya2VyUHJvZmlsZXIiLCBtc2dfdHlwZSwgc2VxaWQpCisgICAgcmVzdWx0LndyaXRlKG9wcm90KQorICAgIG9wcm90LndyaXRlTWVzc2FnZUVuZCgpCisgICAgb3Byb3QudHJhbnMuZmx1c2goKQorCisgIGRlZiBwcm9jZXNzX2dldENvbXBvbmVudFBlbmRpbmdQcm9maWxlQWN0aW9ucyhzZWxmLCBzZXFpZCwgaXByb3QsIG9wcm90KToKKyAgICBhcmdzID0gZ2V0Q29tcG9uZW50UGVuZGluZ1Byb2ZpbGVBY3Rpb25zX2FyZ3MoKQorICAgIGFyZ3MucmVhZChpcHJvdCkKKyAgICBpcHJvdC5yZWFkTWVzc2FnZUVuZCgpCisgICAgcmVzdWx0ID0gZ2V0Q29tcG9uZW50UGVuZGluZ1Byb2ZpbGVBY3Rpb25zX3Jlc3VsdCgpCisgICAgdHJ5OgorICAgICAgcmVzdWx0LnN1Y2Nlc3MgPSBzZWxmLl9oYW5kbGVyLmdldENvbXBvbmVudFBlbmRpbmdQcm9maWxlQWN0aW9ucyhhcmdzLmlkLCBhcmdzLmNvbXBvbmVudF9pZCwgYXJncy5hY3Rpb24pCisgICAgICBtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5SRVBMWQorICAgIGV4Y2VwdCAoVFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uLCBLZXlib2FyZEludGVycnVwdCwgU3lzdGVtRXhpdCk6CisgICAgICByYWlzZQorICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXg6CisgICAgICBtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5FWENFUFRJT04KKyAgICAgIGxvZ2dpbmcuZXhjZXB0aW9uKGV4KQorICAgICAgcmVzdWx0ID0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5JTlRFUk5BTF9FUlJPUiwgJ0ludGVybmFsIGVycm9yJykKKyAgICBvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbigiZ2V0Q29tcG9uZW50UGVuZGluZ1Byb2ZpbGVBY3Rpb25zIiwgbXNnX3R5cGUsIHNlcWlkKQogICAgIHJlc3VsdC53cml0ZShvcHJvdCkKICAgICBvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKQogICAgIG9wcm90LnRyYW5zLmZsdXNoKCkKQEAgLTExMjAsMTMgKzE1NzcsMjMgQEAKICAgICByZXN1bHQgPSB1cGxvYWROZXdDcmVkZW50aWFsc19yZXN1bHQoKQogICAgIHRyeToKICAgICAgIHNlbGYuX2hhbmRsZXIudXBsb2FkTmV3Q3JlZGVudGlhbHMoYXJncy5uYW1lLCBhcmdzLmNyZWRzKQotICAgIGV4Y2VwdCBOb3RBbGl2ZUV4Y2VwdGlvbiwgZToKKyAgICAgIG1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLlJFUExZCisgICAgZXhjZXB0IChUVHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb24sIEtleWJvYXJkSW50ZXJydXB0LCBTeXN0ZW1FeGl0KToKKyAgICAgIHJhaXNlCisgICAgZXhjZXB0IE5vdEFsaXZlRXhjZXB0aW9uIGFzIGU6CisgICAgICBtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5SRVBMWQogICAgICAgcmVzdWx0LmUgPSBlCi0gICAgZXhjZXB0IEludmFsaWRUb3BvbG9neUV4Y2VwdGlvbiwgaXRlOgorICAgIGV4Y2VwdCBJbnZhbGlkVG9wb2xvZ3lFeGNlcHRpb24gYXMgaXRlOgorICAgICAgbXNnX3R5cGUgPSBUTWVzc2FnZVR5cGUuUkVQTFkKICAgICAgIHJlc3VsdC5pdGUgPSBpdGUKLSAgICBleGNlcHQgQXV0aG9yaXphdGlvbkV4Y2VwdGlvbiwgYXplOgorICAgIGV4Y2VwdCBBdXRob3JpemF0aW9uRXhjZXB0aW9uIGFzIGF6ZToKKyAgICAgIG1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLlJFUExZCiAgICAgICByZXN1bHQuYXplID0gYXplCi0gICAgb3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4oInVwbG9hZE5ld0NyZWRlbnRpYWxzIiwgVE1lc3NhZ2VUeXBlLlJFUExZLCBzZXFpZCkKKyAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4OgorICAgICAgbXNnX3R5cGUgPSBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OCisgICAgICBsb2dnaW5nLmV4Y2VwdGlvbihleCkKKyAgICAgIHJlc3VsdCA9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uSU5URVJOQUxfRVJST1IsICdJbnRlcm5hbCBlcnJvcicpCisgICAgb3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4oInVwbG9hZE5ld0NyZWRlbnRpYWxzIiwgbXNnX3R5cGUsIHNlcWlkKQogICAgIHJlc3VsdC53cml0ZShvcHJvdCkKICAgICBvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKQogICAgIG9wcm90LnRyYW5zLmZsdXNoKCkKQEAgLTExMzgsOSArMTYwNSwxNyBAQAogICAgIHJlc3VsdCA9IGJlZ2luRmlsZVVwbG9hZF9yZXN1bHQoKQogICAgIHRyeToKICAgICAgIHJlc3VsdC5zdWNjZXNzID0gc2VsZi5faGFuZGxlci5iZWdpbkZpbGVVcGxvYWQoKQotICAgIGV4Y2VwdCBBdXRob3JpemF0aW9uRXhjZXB0aW9uLCBhemU6CisgICAgICBtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5SRVBMWQorICAgIGV4Y2VwdCAoVFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uLCBLZXlib2FyZEludGVycnVwdCwgU3lzdGVtRXhpdCk6CisgICAgICByYWlzZQorICAgIGV4Y2VwdCBBdXRob3JpemF0aW9uRXhjZXB0aW9uIGFzIGF6ZToKKyAgICAgIG1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLlJFUExZCiAgICAgICByZXN1bHQuYXplID0gYXplCi0gICAgb3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4oImJlZ2luRmlsZVVwbG9hZCIsIFRNZXNzYWdlVHlwZS5SRVBMWSwgc2VxaWQpCisgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleDoKKyAgICAgIG1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTgorICAgICAgbG9nZ2luZy5leGNlcHRpb24oZXgpCisgICAgICByZXN1bHQgPSBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLklOVEVSTkFMX0VSUk9SLCAnSW50ZXJuYWwgZXJyb3InKQorICAgIG9wcm90LndyaXRlTWVzc2FnZUJlZ2luKCJiZWdpbkZpbGVVcGxvYWQiLCBtc2dfdHlwZSwgc2VxaWQpCiAgICAgcmVzdWx0LndyaXRlKG9wcm90KQogICAgIG9wcm90LndyaXRlTWVzc2FnZUVuZCgpCiAgICAgb3Byb3QudHJhbnMuZmx1c2goKQpAQCAtMTE1Miw5ICsxNjI3LDE3IEBACiAgICAgcmVzdWx0ID0gdXBsb2FkQ2h1bmtfcmVzdWx0KCkKICAgICB0cnk6CiAgICAgICBzZWxmLl9oYW5kbGVyLnVwbG9hZENodW5rKGFyZ3MubG9jYXRpb24sIGFyZ3MuY2h1bmspCi0gICAgZXhjZXB0IEF1dGhvcml6YXRpb25FeGNlcHRpb24sIGF6ZToKKyAgICAgIG1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLlJFUExZCisgICAgZXhjZXB0IChUVHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb24sIEtleWJvYXJkSW50ZXJydXB0LCBTeXN0ZW1FeGl0KToKKyAgICAgIHJhaXNlCisgICAgZXhjZXB0IEF1dGhvcml6YXRpb25FeGNlcHRpb24gYXMgYXplOgorICAgICAgbXNnX3R5cGUgPSBUTWVzc2FnZVR5cGUuUkVQTFkKICAgICAgIHJlc3VsdC5hemUgPSBhemUKLSAgICBvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbigidXBsb2FkQ2h1bmsiLCBUTWVzc2FnZVR5cGUuUkVQTFksIHNlcWlkKQorICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXg6CisgICAgICBtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5FWENFUFRJT04KKyAgICAgIGxvZ2dpbmcuZXhjZXB0aW9uKGV4KQorICAgICAgcmVzdWx0ID0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5JTlRFUk5BTF9FUlJPUiwgJ0ludGVybmFsIGVycm9yJykKKyAgICBvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbigidXBsb2FkQ2h1bmsiLCBtc2dfdHlwZSwgc2VxaWQpCiAgICAgcmVzdWx0LndyaXRlKG9wcm90KQogICAgIG9wcm90LndyaXRlTWVzc2FnZUVuZCgpCiAgICAgb3Byb3QudHJhbnMuZmx1c2goKQpAQCAtMTE2Niw5ICsxNjQ5LDE3IEBACiAgICAgcmVzdWx0ID0gZmluaXNoRmlsZVVwbG9hZF9yZXN1bHQoKQogICAgIHRyeToKICAgICAgIHNlbGYuX2hhbmRsZXIuZmluaXNoRmlsZVVwbG9hZChhcmdzLmxvY2F0aW9uKQotICAgIGV4Y2VwdCBBdXRob3JpemF0aW9uRXhjZXB0aW9uLCBhemU6CisgICAgICBtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5SRVBMWQorICAgIGV4Y2VwdCAoVFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uLCBLZXlib2FyZEludGVycnVwdCwgU3lzdGVtRXhpdCk6CisgICAgICByYWlzZQorICAgIGV4Y2VwdCBBdXRob3JpemF0aW9uRXhjZXB0aW9uIGFzIGF6ZToKKyAgICAgIG1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLlJFUExZCiAgICAgICByZXN1bHQuYXplID0gYXplCi0gICAgb3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4oImZpbmlzaEZpbGVVcGxvYWQiLCBUTWVzc2FnZVR5cGUuUkVQTFksIHNlcWlkKQorICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXg6CisgICAgICBtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5FWENFUFRJT04KKyAgICAgIGxvZ2dpbmcuZXhjZXB0aW9uKGV4KQorICAgICAgcmVzdWx0ID0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5JTlRFUk5BTF9FUlJPUiwgJ0ludGVybmFsIGVycm9yJykKKyAgICBvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbigiZmluaXNoRmlsZVVwbG9hZCIsIG1zZ190eXBlLCBzZXFpZCkKICAgICByZXN1bHQud3JpdGUob3Byb3QpCiAgICAgb3Byb3Qud3JpdGVNZXNzYWdlRW5kKCkKICAgICBvcHJvdC50cmFucy5mbHVzaCgpCkBAIC0xMTgwLDkgKzE2NzEsMTcgQEAKICAgICByZXN1bHQgPSBiZWdpbkZpbGVEb3dubG9hZF9yZXN1bHQoKQogICAgIHRyeToKICAgICAgIHJlc3VsdC5zdWNjZXNzID0gc2VsZi5faGFuZGxlci5iZWdpbkZpbGVEb3dubG9hZChhcmdzLmZpbGUpCi0gICAgZXhjZXB0IEF1dGhvcml6YXRpb25FeGNlcHRpb24sIGF6ZToKKyAgICAgIG1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLlJFUExZCisgICAgZXhjZXB0IChUVHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb24sIEtleWJvYXJkSW50ZXJydXB0LCBTeXN0ZW1FeGl0KToKKyAgICAgIHJhaXNlCisgICAgZXhjZXB0IEF1dGhvcml6YXRpb25FeGNlcHRpb24gYXMgYXplOgorICAgICAgbXNnX3R5cGUgPSBUTWVzc2FnZVR5cGUuUkVQTFkKICAgICAgIHJlc3VsdC5hemUgPSBhemUKLSAgICBvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbigiYmVnaW5GaWxlRG93bmxvYWQiLCBUTWVzc2FnZVR5cGUuUkVQTFksIHNlcWlkKQorICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXg6CisgICAgICBtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5FWENFUFRJT04KKyAgICAgIGxvZ2dpbmcuZXhjZXB0aW9uKGV4KQorICAgICAgcmVzdWx0ID0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5JTlRFUk5BTF9FUlJPUiwgJ0ludGVybmFsIGVycm9yJykKKyAgICBvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbigiYmVnaW5GaWxlRG93bmxvYWQiLCBtc2dfdHlwZSwgc2VxaWQpCiAgICAgcmVzdWx0LndyaXRlKG9wcm90KQogICAgIG9wcm90LndyaXRlTWVzc2FnZUVuZCgpCiAgICAgb3Byb3QudHJhbnMuZmx1c2goKQpAQCAtMTE5NCw5ICsxNjkzLDE3IEBACiAgICAgcmVzdWx0ID0gZG93bmxvYWRDaHVua19yZXN1bHQoKQogICAgIHRyeToKICAgICAgIHJlc3VsdC5zdWNjZXNzID0gc2VsZi5faGFuZGxlci5kb3dubG9hZENodW5rKGFyZ3MuaWQpCi0gICAgZXhjZXB0IEF1dGhvcml6YXRpb25FeGNlcHRpb24sIGF6ZToKKyAgICAgIG1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLlJFUExZCisgICAgZXhjZXB0IChUVHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb24sIEtleWJvYXJkSW50ZXJydXB0LCBTeXN0ZW1FeGl0KToKKyAgICAgIHJhaXNlCisgICAgZXhjZXB0IEF1dGhvcml6YXRpb25FeGNlcHRpb24gYXMgYXplOgorICAgICAgbXNnX3R5cGUgPSBUTWVzc2FnZVR5cGUuUkVQTFkKICAgICAgIHJlc3VsdC5hemUgPSBhemUKLSAgICBvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbigiZG93bmxvYWRDaHVuayIsIFRNZXNzYWdlVHlwZS5SRVBMWSwgc2VxaWQpCisgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleDoKKyAgICAgIG1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTgorICAgICAgbG9nZ2luZy5leGNlcHRpb24oZXgpCisgICAgICByZXN1bHQgPSBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLklOVEVSTkFMX0VSUk9SLCAnSW50ZXJuYWwgZXJyb3InKQorICAgIG9wcm90LndyaXRlTWVzc2FnZUJlZ2luKCJkb3dubG9hZENodW5rIiwgbXNnX3R5cGUsIHNlcWlkKQogICAgIHJlc3VsdC53cml0ZShvcHJvdCkKICAgICBvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKQogICAgIG9wcm90LnRyYW5zLmZsdXNoKCkKQEAgLTEyMDgsOSArMTcxNSwxNyBAQAogICAgIHJlc3VsdCA9IGdldE5pbWJ1c0NvbmZfcmVzdWx0KCkKICAgICB0cnk6CiAgICAgICByZXN1bHQuc3VjY2VzcyA9IHNlbGYuX2hhbmRsZXIuZ2V0TmltYnVzQ29uZigpCi0gICAgZXhjZXB0IEF1dGhvcml6YXRpb25FeGNlcHRpb24sIGF6ZToKKyAgICAgIG1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLlJFUExZCisgICAgZXhjZXB0IChUVHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb24sIEtleWJvYXJkSW50ZXJydXB0LCBTeXN0ZW1FeGl0KToKKyAgICAgIHJhaXNlCisgICAgZXhjZXB0IEF1dGhvcml6YXRpb25FeGNlcHRpb24gYXMgYXplOgorICAgICAgbXNnX3R5cGUgPSBUTWVzc2FnZVR5cGUuUkVQTFkKICAgICAgIHJlc3VsdC5hemUgPSBhemUKLSAgICBvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbigiZ2V0TmltYnVzQ29uZiIsIFRNZXNzYWdlVHlwZS5SRVBMWSwgc2VxaWQpCisgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleDoKKyAgICAgIG1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTgorICAgICAgbG9nZ2luZy5leGNlcHRpb24oZXgpCisgICAgICByZXN1bHQgPSBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLklOVEVSTkFMX0VSUk9SLCAnSW50ZXJuYWwgZXJyb3InKQorICAgIG9wcm90LndyaXRlTWVzc2FnZUJlZ2luKCJnZXROaW1idXNDb25mIiwgbXNnX3R5cGUsIHNlcWlkKQogICAgIHJlc3VsdC53cml0ZShvcHJvdCkKICAgICBvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKQogICAgIG9wcm90LnRyYW5zLmZsdXNoKCkKQEAgLTEyMjIsOSArMTczNywxNyBAQAogICAgIHJlc3VsdCA9IGdldENsdXN0ZXJJbmZvX3Jlc3VsdCgpCiAgICAgdHJ5OgogICAgICAgcmVzdWx0LnN1Y2Nlc3MgPSBzZWxmLl9oYW5kbGVyLmdldENsdXN0ZXJJbmZvKCkKLSAgICBleGNlcHQgQXV0aG9yaXphdGlvbkV4Y2VwdGlvbiwgYXplOgorICAgICAgbXNnX3R5cGUgPSBUTWVzc2FnZVR5cGUuUkVQTFkKKyAgICBleGNlcHQgKFRUcmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbiwgS2V5Ym9hcmRJbnRlcnJ1cHQsIFN5c3RlbUV4aXQpOgorICAgICAgcmFpc2UKKyAgICBleGNlcHQgQXV0aG9yaXphdGlvbkV4Y2VwdGlvbiBhcyBhemU6CisgICAgICBtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5SRVBMWQogICAgICAgcmVzdWx0LmF6ZSA9IGF6ZQotICAgIG9wcm90LndyaXRlTWVzc2FnZUJlZ2luKCJnZXRDbHVzdGVySW5mbyIsIFRNZXNzYWdlVHlwZS5SRVBMWSwgc2VxaWQpCisgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBleDoKKyAgICAgIG1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLkVYQ0VQVElPTgorICAgICAgbG9nZ2luZy5leGNlcHRpb24oZXgpCisgICAgICByZXN1bHQgPSBUQXBwbGljYXRpb25FeGNlcHRpb24oVEFwcGxpY2F0aW9uRXhjZXB0aW9uLklOVEVSTkFMX0VSUk9SLCAnSW50ZXJuYWwgZXJyb3InKQorICAgIG9wcm90LndyaXRlTWVzc2FnZUJlZ2luKCJnZXRDbHVzdGVySW5mbyIsIG1zZ190eXBlLCBzZXFpZCkKICAgICByZXN1bHQud3JpdGUob3Byb3QpCiAgICAgb3Byb3Qud3JpdGVNZXNzYWdlRW5kKCkKICAgICBvcHJvdC50cmFucy5mbHVzaCgpCkBAIC0xMjM2LDExICsxNzU5LDIwIEBACiAgICAgcmVzdWx0ID0gZ2V0VG9wb2xvZ3lJbmZvX3Jlc3VsdCgpCiAgICAgdHJ5OgogICAgICAgcmVzdWx0LnN1Y2Nlc3MgPSBzZWxmLl9oYW5kbGVyLmdldFRvcG9sb2d5SW5mbyhhcmdzLmlkKQotICAgIGV4Y2VwdCBOb3RBbGl2ZUV4Y2VwdGlvbiwgZToKKyAgICAgIG1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLlJFUExZCisgICAgZXhjZXB0IChUVHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb24sIEtleWJvYXJkSW50ZXJydXB0LCBTeXN0ZW1FeGl0KToKKyAgICAgIHJhaXNlCisgICAgZXhjZXB0IE5vdEFsaXZlRXhjZXB0aW9uIGFzIGU6CisgICAgICBtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5SRVBMWQogICAgICAgcmVzdWx0LmUgPSBlCi0gICAgZXhjZXB0IEF1dGhvcml6YXRpb25FeGNlcHRpb24sIGF6ZToKKyAgICBleGNlcHQgQXV0aG9yaXphdGlvbkV4Y2VwdGlvbiBhcyBhemU6CisgICAgICBtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5SRVBMWQogICAgICAgcmVzdWx0LmF6ZSA9IGF6ZQotICAgIG9wcm90LndyaXRlTWVzc2FnZUJlZ2luKCJnZXRUb3BvbG9neUluZm8iLCBUTWVzc2FnZVR5cGUuUkVQTFksIHNlcWlkKQorICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXg6CisgICAgICBtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5FWENFUFRJT04KKyAgICAgIGxvZ2dpbmcuZXhjZXB0aW9uKGV4KQorICAgICAgcmVzdWx0ID0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5JTlRFUk5BTF9FUlJPUiwgJ0ludGVybmFsIGVycm9yJykKKyAgICBvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbigiZ2V0VG9wb2xvZ3lJbmZvIiwgbXNnX3R5cGUsIHNlcWlkKQogICAgIHJlc3VsdC53cml0ZShvcHJvdCkKICAgICBvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKQogICAgIG9wcm90LnRyYW5zLmZsdXNoKCkKQEAgLTEyNTIsMTEgKzE3ODQsNzAgQEAKICAgICByZXN1bHQgPSBnZXRUb3BvbG9neUluZm9XaXRoT3B0c19yZXN1bHQoKQogICAgIHRyeToKICAgICAgIHJlc3VsdC5zdWNjZXNzID0gc2VsZi5faGFuZGxlci5nZXRUb3BvbG9neUluZm9XaXRoT3B0cyhhcmdzLmlkLCBhcmdzLm9wdGlvbnMpCi0gICAgZXhjZXB0IE5vdEFsaXZlRXhjZXB0aW9uLCBlOgorICAgICAgbXNnX3R5cGUgPSBUTWVzc2FnZVR5cGUuUkVQTFkKKyAgICBleGNlcHQgKFRUcmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbiwgS2V5Ym9hcmRJbnRlcnJ1cHQsIFN5c3RlbUV4aXQpOgorICAgICAgcmFpc2UKKyAgICBleGNlcHQgTm90QWxpdmVFeGNlcHRpb24gYXMgZToKKyAgICAgIG1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLlJFUExZCiAgICAgICByZXN1bHQuZSA9IGUKLSAgICBleGNlcHQgQXV0aG9yaXphdGlvbkV4Y2VwdGlvbiwgYXplOgorICAgIGV4Y2VwdCBBdXRob3JpemF0aW9uRXhjZXB0aW9uIGFzIGF6ZToKKyAgICAgIG1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLlJFUExZCiAgICAgICByZXN1bHQuYXplID0gYXplCi0gICAgb3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4oImdldFRvcG9sb2d5SW5mb1dpdGhPcHRzIiwgVE1lc3NhZ2VUeXBlLlJFUExZLCBzZXFpZCkKKyAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4OgorICAgICAgbXNnX3R5cGUgPSBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OCisgICAgICBsb2dnaW5nLmV4Y2VwdGlvbihleCkKKyAgICAgIHJlc3VsdCA9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uSU5URVJOQUxfRVJST1IsICdJbnRlcm5hbCBlcnJvcicpCisgICAgb3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4oImdldFRvcG9sb2d5SW5mb1dpdGhPcHRzIiwgbXNnX3R5cGUsIHNlcWlkKQorICAgIHJlc3VsdC53cml0ZShvcHJvdCkKKyAgICBvcHJvdC53cml0ZU1lc3NhZ2VFbmQoKQorICAgIG9wcm90LnRyYW5zLmZsdXNoKCkKKworICBkZWYgcHJvY2Vzc19nZXRUb3BvbG9neVBhZ2VJbmZvKHNlbGYsIHNlcWlkLCBpcHJvdCwgb3Byb3QpOgorICAgIGFyZ3MgPSBnZXRUb3BvbG9neVBhZ2VJbmZvX2FyZ3MoKQorICAgIGFyZ3MucmVhZChpcHJvdCkKKyAgICBpcHJvdC5yZWFkTWVzc2FnZUVuZCgpCisgICAgcmVzdWx0ID0gZ2V0VG9wb2xvZ3lQYWdlSW5mb19yZXN1bHQoKQorICAgIHRyeToKKyAgICAgIHJlc3VsdC5zdWNjZXNzID0gc2VsZi5faGFuZGxlci5nZXRUb3BvbG9neVBhZ2VJbmZvKGFyZ3MuaWQsIGFyZ3Mud2luZG93LCBhcmdzLmlzX2luY2x1ZGVfc3lzKQorICAgICAgbXNnX3R5cGUgPSBUTWVzc2FnZVR5cGUuUkVQTFkKKyAgICBleGNlcHQgKFRUcmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbiwgS2V5Ym9hcmRJbnRlcnJ1cHQsIFN5c3RlbUV4aXQpOgorICAgICAgcmFpc2UKKyAgICBleGNlcHQgTm90QWxpdmVFeGNlcHRpb24gYXMgZToKKyAgICAgIG1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLlJFUExZCisgICAgICByZXN1bHQuZSA9IGUKKyAgICBleGNlcHQgQXV0aG9yaXphdGlvbkV4Y2VwdGlvbiBhcyBhemU6CisgICAgICBtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5SRVBMWQorICAgICAgcmVzdWx0LmF6ZSA9IGF6ZQorICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXg6CisgICAgICBtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5FWENFUFRJT04KKyAgICAgIGxvZ2dpbmcuZXhjZXB0aW9uKGV4KQorICAgICAgcmVzdWx0ID0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5JTlRFUk5BTF9FUlJPUiwgJ0ludGVybmFsIGVycm9yJykKKyAgICBvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbigiZ2V0VG9wb2xvZ3lQYWdlSW5mbyIsIG1zZ190eXBlLCBzZXFpZCkKKyAgICByZXN1bHQud3JpdGUob3Byb3QpCisgICAgb3Byb3Qud3JpdGVNZXNzYWdlRW5kKCkKKyAgICBvcHJvdC50cmFucy5mbHVzaCgpCisKKyAgZGVmIHByb2Nlc3NfZ2V0Q29tcG9uZW50UGFnZUluZm8oc2VsZiwgc2VxaWQsIGlwcm90LCBvcHJvdCk6CisgICAgYXJncyA9IGdldENvbXBvbmVudFBhZ2VJbmZvX2FyZ3MoKQorICAgIGFyZ3MucmVhZChpcHJvdCkKKyAgICBpcHJvdC5yZWFkTWVzc2FnZUVuZCgpCisgICAgcmVzdWx0ID0gZ2V0Q29tcG9uZW50UGFnZUluZm9fcmVzdWx0KCkKKyAgICB0cnk6CisgICAgICByZXN1bHQuc3VjY2VzcyA9IHNlbGYuX2hhbmRsZXIuZ2V0Q29tcG9uZW50UGFnZUluZm8oYXJncy50b3BvbG9neV9pZCwgYXJncy5jb21wb25lbnRfaWQsIGFyZ3Mud2luZG93LCBhcmdzLmlzX2luY2x1ZGVfc3lzKQorICAgICAgbXNnX3R5cGUgPSBUTWVzc2FnZVR5cGUuUkVQTFkKKyAgICBleGNlcHQgKFRUcmFuc3BvcnQuVFRyYW5zcG9ydEV4Y2VwdGlvbiwgS2V5Ym9hcmRJbnRlcnJ1cHQsIFN5c3RlbUV4aXQpOgorICAgICAgcmFpc2UKKyAgICBleGNlcHQgTm90QWxpdmVFeGNlcHRpb24gYXMgZToKKyAgICAgIG1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLlJFUExZCisgICAgICByZXN1bHQuZSA9IGUKKyAgICBleGNlcHQgQXV0aG9yaXphdGlvbkV4Y2VwdGlvbiBhcyBhemU6CisgICAgICBtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5SRVBMWQorICAgICAgcmVzdWx0LmF6ZSA9IGF6ZQorICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXg6CisgICAgICBtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5FWENFUFRJT04KKyAgICAgIGxvZ2dpbmcuZXhjZXB0aW9uKGV4KQorICAgICAgcmVzdWx0ID0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5JTlRFUk5BTF9FUlJPUiwgJ0ludGVybmFsIGVycm9yJykKKyAgICBvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbigiZ2V0Q29tcG9uZW50UGFnZUluZm8iLCBtc2dfdHlwZSwgc2VxaWQpCiAgICAgcmVzdWx0LndyaXRlKG9wcm90KQogICAgIG9wcm90LndyaXRlTWVzc2FnZUVuZCgpCiAgICAgb3Byb3QudHJhbnMuZmx1c2goKQpAQCAtMTI2OCwxMSArMTg1OSwyMCBAQAogICAgIHJlc3VsdCA9IGdldFRvcG9sb2d5Q29uZl9yZXN1bHQoKQogICAgIHRyeToKICAgICAgIHJlc3VsdC5zdWNjZXNzID0gc2VsZi5faGFuZGxlci5nZXRUb3BvbG9neUNvbmYoYXJncy5pZCkKLSAgICBleGNlcHQgTm90QWxpdmVFeGNlcHRpb24sIGU6CisgICAgICBtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5SRVBMWQorICAgIGV4Y2VwdCAoVFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uLCBLZXlib2FyZEludGVycnVwdCwgU3lzdGVtRXhpdCk6CisgICAgICByYWlzZQorICAgIGV4Y2VwdCBOb3RBbGl2ZUV4Y2VwdGlvbiBhcyBlOgorICAgICAgbXNnX3R5cGUgPSBUTWVzc2FnZVR5cGUuUkVQTFkKICAgICAgIHJlc3VsdC5lID0gZQotICAgIGV4Y2VwdCBBdXRob3JpemF0aW9uRXhjZXB0aW9uLCBhemU6CisgICAgZXhjZXB0IEF1dGhvcml6YXRpb25FeGNlcHRpb24gYXMgYXplOgorICAgICAgbXNnX3R5cGUgPSBUTWVzc2FnZVR5cGUuUkVQTFkKICAgICAgIHJlc3VsdC5hemUgPSBhemUKLSAgICBvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbigiZ2V0VG9wb2xvZ3lDb25mIiwgVE1lc3NhZ2VUeXBlLlJFUExZLCBzZXFpZCkKKyAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4OgorICAgICAgbXNnX3R5cGUgPSBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OCisgICAgICBsb2dnaW5nLmV4Y2VwdGlvbihleCkKKyAgICAgIHJlc3VsdCA9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uSU5URVJOQUxfRVJST1IsICdJbnRlcm5hbCBlcnJvcicpCisgICAgb3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4oImdldFRvcG9sb2d5Q29uZiIsIG1zZ190eXBlLCBzZXFpZCkKICAgICByZXN1bHQud3JpdGUob3Byb3QpCiAgICAgb3Byb3Qud3JpdGVNZXNzYWdlRW5kKCkKICAgICBvcHJvdC50cmFucy5mbHVzaCgpCkBAIC0xMjg0LDExICsxODg0LDIwIEBACiAgICAgcmVzdWx0ID0gZ2V0VG9wb2xvZ3lfcmVzdWx0KCkKICAgICB0cnk6CiAgICAgICByZXN1bHQuc3VjY2VzcyA9IHNlbGYuX2hhbmRsZXIuZ2V0VG9wb2xvZ3koYXJncy5pZCkKLSAgICBleGNlcHQgTm90QWxpdmVFeGNlcHRpb24sIGU6CisgICAgICBtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5SRVBMWQorICAgIGV4Y2VwdCAoVFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uLCBLZXlib2FyZEludGVycnVwdCwgU3lzdGVtRXhpdCk6CisgICAgICByYWlzZQorICAgIGV4Y2VwdCBOb3RBbGl2ZUV4Y2VwdGlvbiBhcyBlOgorICAgICAgbXNnX3R5cGUgPSBUTWVzc2FnZVR5cGUuUkVQTFkKICAgICAgIHJlc3VsdC5lID0gZQotICAgIGV4Y2VwdCBBdXRob3JpemF0aW9uRXhjZXB0aW9uLCBhemU6CisgICAgZXhjZXB0IEF1dGhvcml6YXRpb25FeGNlcHRpb24gYXMgYXplOgorICAgICAgbXNnX3R5cGUgPSBUTWVzc2FnZVR5cGUuUkVQTFkKICAgICAgIHJlc3VsdC5hemUgPSBhemUKLSAgICBvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbigiZ2V0VG9wb2xvZ3kiLCBUTWVzc2FnZVR5cGUuUkVQTFksIHNlcWlkKQorICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZXg6CisgICAgICBtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5FWENFUFRJT04KKyAgICAgIGxvZ2dpbmcuZXhjZXB0aW9uKGV4KQorICAgICAgcmVzdWx0ID0gVEFwcGxpY2F0aW9uRXhjZXB0aW9uKFRBcHBsaWNhdGlvbkV4Y2VwdGlvbi5JTlRFUk5BTF9FUlJPUiwgJ0ludGVybmFsIGVycm9yJykKKyAgICBvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbigiZ2V0VG9wb2xvZ3kiLCBtc2dfdHlwZSwgc2VxaWQpCiAgICAgcmVzdWx0LndyaXRlKG9wcm90KQogICAgIG9wcm90LndyaXRlTWVzc2FnZUVuZCgpCiAgICAgb3Byb3QudHJhbnMuZmx1c2goKQpAQCAtMTMwMCwxMSArMTkwOSw0MiBAQAogICAgIHJlc3VsdCA9IGdldFVzZXJUb3BvbG9neV9yZXN1bHQoKQogICAgIHRyeToKICAgICAgIHJlc3VsdC5zdWNjZXNzID0gc2VsZi5faGFuZGxlci5nZXRVc2VyVG9wb2xvZ3koYXJncy5pZCkKLSAgICBleGNlcHQgTm90QWxpdmVFeGNlcHRpb24sIGU6CisgICAgICBtc2dfdHlwZSA9IFRNZXNzYWdlVHlwZS5SRVBMWQorICAgIGV4Y2VwdCAoVFRyYW5zcG9ydC5UVHJhbnNwb3J0RXhjZXB0aW9uLCBLZXlib2FyZEludGVycnVwdCwgU3lzdGVtRXhpdCk6CisgICAgICByYWlzZQorICAgIGV4Y2VwdCBOb3RBbGl2ZUV4Y2VwdGlvbiBhcyBlOgorICAgICAgbXNnX3R5cGUgPSBUTWVzc2FnZVR5cGUuUkVQTFkKICAgICAgIHJlc3VsdC5lID0gZQotICAgIGV4Y2VwdCBBdXRob3JpemF0aW9uRXhjZXB0aW9uLCBhemU6CisgICAgZXhjZXB0IEF1dGhvcml6YXRpb25FeGNlcHRpb24gYXMgYXplOgorICAgICAgbXNnX3R5cGUgPSBUTWVzc2FnZVR5cGUuUkVQTFkKICAgICAgIHJlc3VsdC5hemUgPSBhemUKLSAgICBvcHJvdC53cml0ZU1lc3NhZ2VCZWdpbigiZ2V0VXNlclRvcG9sb2d5IiwgVE1lc3NhZ2VUeXBlLlJFUExZLCBzZXFpZCkKKyAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4OgorICAgICAgbXNnX3R5cGUgPSBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OCisgICAgICBsb2dnaW5nLmV4Y2VwdGlvbihleCkKKyAgICAgIHJlc3VsdCA9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uSU5URVJOQUxfRVJST1IsICdJbnRlcm5hbCBlcnJvcicpCisgICAgb3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4oImdldFVzZXJUb3BvbG9neSIsIG1zZ190eXBlLCBzZXFpZCkKKyAgICByZXN1bHQud3JpdGUob3Byb3QpCisgICAgb3Byb3Qud3JpdGVNZXNzYWdlRW5kKCkKKyAgICBvcHJvdC50cmFucy5mbHVzaCgpCisKKyAgZGVmIHByb2Nlc3NfZ2V0VG9wb2xvZ3lIaXN0b3J5KHNlbGYsIHNlcWlkLCBpcHJvdCwgb3Byb3QpOgorICAgIGFyZ3MgPSBnZXRUb3BvbG9neUhpc3RvcnlfYXJncygpCisgICAgYXJncy5yZWFkKGlwcm90KQorICAgIGlwcm90LnJlYWRNZXNzYWdlRW5kKCkKKyAgICByZXN1bHQgPSBnZXRUb3BvbG9neUhpc3RvcnlfcmVzdWx0KCkKKyAgICB0cnk6CisgICAgICByZXN1bHQuc3VjY2VzcyA9IHNlbGYuX2hhbmRsZXIuZ2V0VG9wb2xvZ3lIaXN0b3J5KGFyZ3MudXNlcikKKyAgICAgIG1zZ190eXBlID0gVE1lc3NhZ2VUeXBlLlJFUExZCisgICAgZXhjZXB0IChUVHJhbnNwb3J0LlRUcmFuc3BvcnRFeGNlcHRpb24sIEtleWJvYXJkSW50ZXJydXB0LCBTeXN0ZW1FeGl0KToKKyAgICAgIHJhaXNlCisgICAgZXhjZXB0IEF1dGhvcml6YXRpb25FeGNlcHRpb24gYXMgYXplOgorICAgICAgbXNnX3R5cGUgPSBUTWVzc2FnZVR5cGUuUkVQTFkKKyAgICAgIHJlc3VsdC5hemUgPSBhemUKKyAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGV4OgorICAgICAgbXNnX3R5cGUgPSBUTWVzc2FnZVR5cGUuRVhDRVBUSU9OCisgICAgICBsb2dnaW5nLmV4Y2VwdGlvbihleCkKKyAgICAgIHJlc3VsdCA9IFRBcHBsaWNhdGlvbkV4Y2VwdGlvbihUQXBwbGljYXRpb25FeGNlcHRpb24uSU5URVJOQUxfRVJST1IsICdJbnRlcm5hbCBlcnJvcicpCisgICAgb3Byb3Qud3JpdGVNZXNzYWdlQmVnaW4oImdldFRvcG9sb2d5SGlzdG9yeSIsIG1zZ190eXBlLCBzZXFpZCkKICAgICByZXN1bHQud3JpdGUob3Byb3QpCiAgICAgb3Byb3Qud3JpdGVNZXNzYWdlRW5kKCkKICAgICBvcHJvdC50cmFucy5mbHVzaCgpCkBAIC0yNDkxLDYgKzMxMzEsMjYxIEBACiAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgIHJldHVybiBub3QgKHNlbGYgPT0gb3RoZXIpCiAKK2NsYXNzIHNldExvZ0NvbmZpZ19hcmdzOgorICAiIiIKKyAgQXR0cmlidXRlczoKKyAgIC0gbmFtZQorICAgLSBjb25maWcKKyAgIiIiCisKKyAgdGhyaWZ0X3NwZWMgPSAoCisgICAgTm9uZSwgIyAwCisgICAgKDEsIFRUeXBlLlNUUklORywgJ25hbWUnLCBOb25lLCBOb25lLCApLCAjIDEKKyAgICAoMiwgVFR5cGUuU1RSVUNULCAnY29uZmlnJywgKExvZ0NvbmZpZywgTG9nQ29uZmlnLnRocmlmdF9zcGVjKSwgTm9uZSwgKSwgIyAyCisgICkKKworICBkZWYgX19pbml0X18oc2VsZiwgbmFtZT1Ob25lLCBjb25maWc9Tm9uZSwpOgorICAgIHNlbGYubmFtZSA9IG5hbWUKKyAgICBzZWxmLmNvbmZpZyA9IGNvbmZpZworCisgIGRlZiByZWFkKHNlbGYsIGlwcm90KToKKyAgICBpZiBpcHJvdC5fX2NsYXNzX18gPT0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIGFuZCBpc2luc3RhbmNlKGlwcm90LnRyYW5zLCBUVHJhbnNwb3J0LkNSZWFkYWJsZVRyYW5zcG9ydCkgYW5kIHNlbGYudGhyaWZ0X3NwZWMgaXMgbm90IE5vbmUgYW5kIGZhc3RiaW5hcnkgaXMgbm90IE5vbmU6CisgICAgICBmYXN0YmluYXJ5LmRlY29kZV9iaW5hcnkoc2VsZiwgaXByb3QudHJhbnMsIChzZWxmLl9fY2xhc3NfXywgc2VsZi50aHJpZnRfc3BlYykpCisgICAgICByZXR1cm4KKyAgICBpcHJvdC5yZWFkU3RydWN0QmVnaW4oKQorICAgIHdoaWxlIFRydWU6CisgICAgICAoZm5hbWUsIGZ0eXBlLCBmaWQpID0gaXByb3QucmVhZEZpZWxkQmVnaW4oKQorICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuU1RPUDoKKyAgICAgICAgYnJlYWsKKyAgICAgIGlmIGZpZCA9PSAxOgorICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5TVFJJTkc6CisgICAgICAgICAgc2VsZi5uYW1lID0gaXByb3QucmVhZFN0cmluZygpLmRlY29kZSgndXRmLTgnKQorICAgICAgICBlbHNlOgorICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBlbGlmIGZpZCA9PSAyOgorICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5TVFJVQ1Q6CisgICAgICAgICAgc2VsZi5jb25maWcgPSBMb2dDb25maWcoKQorICAgICAgICAgIHNlbGYuY29uZmlnLnJlYWQoaXByb3QpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgIGVsc2U6CisgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBpcHJvdC5yZWFkRmllbGRFbmQoKQorICAgIGlwcm90LnJlYWRTdHJ1Y3RFbmQoKQorCisgIGRlZiB3cml0ZShzZWxmLCBvcHJvdCk6CisgICAgaWYgb3Byb3QuX19jbGFzc19fID09IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCBhbmQgc2VsZi50aHJpZnRfc3BlYyBpcyBub3QgTm9uZSBhbmQgZmFzdGJpbmFyeSBpcyBub3QgTm9uZToKKyAgICAgIG9wcm90LnRyYW5zLndyaXRlKGZhc3RiaW5hcnkuZW5jb2RlX2JpbmFyeShzZWxmLCAoc2VsZi5fX2NsYXNzX18sIHNlbGYudGhyaWZ0X3NwZWMpKSkKKyAgICAgIHJldHVybgorICAgIG9wcm90LndyaXRlU3RydWN0QmVnaW4oJ3NldExvZ0NvbmZpZ19hcmdzJykKKyAgICBpZiBzZWxmLm5hbWUgaXMgbm90IE5vbmU6CisgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ25hbWUnLCBUVHlwZS5TVFJJTkcsIDEpCisgICAgICBvcHJvdC53cml0ZVN0cmluZyhzZWxmLm5hbWUuZW5jb2RlKCd1dGYtOCcpKQorICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCisgICAgaWYgc2VsZi5jb25maWcgaXMgbm90IE5vbmU6CisgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ2NvbmZpZycsIFRUeXBlLlNUUlVDVCwgMikKKyAgICAgIHNlbGYuY29uZmlnLndyaXRlKG9wcm90KQorICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCisgICAgb3Byb3Qud3JpdGVGaWVsZFN0b3AoKQorICAgIG9wcm90LndyaXRlU3RydWN0RW5kKCkKKworICBkZWYgdmFsaWRhdGUoc2VsZik6CisgICAgcmV0dXJuCisKKworICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgdmFsdWUgPSAxNworICAgIHZhbHVlID0gKHZhbHVlICogMzEpIF4gaGFzaChzZWxmLm5hbWUpCisgICAgdmFsdWUgPSAodmFsdWUgKiAzMSkgXiBoYXNoKHNlbGYuY29uZmlnKQorICAgIHJldHVybiB2YWx1ZQorCisgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICBMID0gWyclcz0lcicgJSAoa2V5LCB2YWx1ZSkKKyAgICAgIGZvciBrZXksIHZhbHVlIGluIHNlbGYuX19kaWN0X18uaXRlcml0ZW1zKCldCisgICAgcmV0dXJuICclcyglcyknICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCAnLCAnLmpvaW4oTCkpCisKKyAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgcmV0dXJuIGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKSBhbmQgc2VsZi5fX2RpY3RfXyA9PSBvdGhlci5fX2RpY3RfXworCisgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgorICAgIHJldHVybiBub3QgKHNlbGYgPT0gb3RoZXIpCisKK2NsYXNzIHNldExvZ0NvbmZpZ19yZXN1bHQ6CisKKyAgdGhyaWZ0X3NwZWMgPSAoCisgICkKKworICBkZWYgcmVhZChzZWxmLCBpcHJvdCk6CisgICAgaWYgaXByb3QuX19jbGFzc19fID09IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCBhbmQgaXNpbnN0YW5jZShpcHJvdC50cmFucywgVFRyYW5zcG9ydC5DUmVhZGFibGVUcmFuc3BvcnQpIGFuZCBzZWxmLnRocmlmdF9zcGVjIGlzIG5vdCBOb25lIGFuZCBmYXN0YmluYXJ5IGlzIG5vdCBOb25lOgorICAgICAgZmFzdGJpbmFyeS5kZWNvZGVfYmluYXJ5KHNlbGYsIGlwcm90LnRyYW5zLCAoc2VsZi5fX2NsYXNzX18sIHNlbGYudGhyaWZ0X3NwZWMpKQorICAgICAgcmV0dXJuCisgICAgaXByb3QucmVhZFN0cnVjdEJlZ2luKCkKKyAgICB3aGlsZSBUcnVlOgorICAgICAgKGZuYW1lLCBmdHlwZSwgZmlkKSA9IGlwcm90LnJlYWRGaWVsZEJlZ2luKCkKKyAgICAgIGlmIGZ0eXBlID09IFRUeXBlLlNUT1A6CisgICAgICAgIGJyZWFrCisgICAgICBlbHNlOgorICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgaXByb3QucmVhZEZpZWxkRW5kKCkKKyAgICBpcHJvdC5yZWFkU3RydWN0RW5kKCkKKworICBkZWYgd3JpdGUoc2VsZiwgb3Byb3QpOgorICAgIGlmIG9wcm90Ll9fY2xhc3NfXyA9PSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgYW5kIHNlbGYudGhyaWZ0X3NwZWMgaXMgbm90IE5vbmUgYW5kIGZhc3RiaW5hcnkgaXMgbm90IE5vbmU6CisgICAgICBvcHJvdC50cmFucy53cml0ZShmYXN0YmluYXJ5LmVuY29kZV9iaW5hcnkoc2VsZiwgKHNlbGYuX19jbGFzc19fLCBzZWxmLnRocmlmdF9zcGVjKSkpCisgICAgICByZXR1cm4KKyAgICBvcHJvdC53cml0ZVN0cnVjdEJlZ2luKCdzZXRMb2dDb25maWdfcmVzdWx0JykKKyAgICBvcHJvdC53cml0ZUZpZWxkU3RvcCgpCisgICAgb3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKQorCisgIGRlZiB2YWxpZGF0ZShzZWxmKToKKyAgICByZXR1cm4KKworCisgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICB2YWx1ZSA9IDE3CisgICAgcmV0dXJuIHZhbHVlCisKKyAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgIEwgPSBbJyVzPSVyJyAlIChrZXksIHZhbHVlKQorICAgICAgZm9yIGtleSwgdmFsdWUgaW4gc2VsZi5fX2RpY3RfXy5pdGVyaXRlbXMoKV0KKyAgICByZXR1cm4gJyVzKCVzKScgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sICcsICcuam9pbihMKSkKKworICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICByZXR1cm4gaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pIGFuZCBzZWxmLl9fZGljdF9fID09IG90aGVyLl9fZGljdF9fCisKKyAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CisgICAgcmV0dXJuIG5vdCAoc2VsZiA9PSBvdGhlcikKKworY2xhc3MgZ2V0TG9nQ29uZmlnX2FyZ3M6CisgICIiIgorICBBdHRyaWJ1dGVzOgorICAgLSBuYW1lCisgICIiIgorCisgIHRocmlmdF9zcGVjID0gKAorICAgIE5vbmUsICMgMAorICAgICgxLCBUVHlwZS5TVFJJTkcsICduYW1lJywgTm9uZSwgTm9uZSwgKSwgIyAxCisgICkKKworICBkZWYgX19pbml0X18oc2VsZiwgbmFtZT1Ob25lLCk6CisgICAgc2VsZi5uYW1lID0gbmFtZQorCisgIGRlZiByZWFkKHNlbGYsIGlwcm90KToKKyAgICBpZiBpcHJvdC5fX2NsYXNzX18gPT0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIGFuZCBpc2luc3RhbmNlKGlwcm90LnRyYW5zLCBUVHJhbnNwb3J0LkNSZWFkYWJsZVRyYW5zcG9ydCkgYW5kIHNlbGYudGhyaWZ0X3NwZWMgaXMgbm90IE5vbmUgYW5kIGZhc3RiaW5hcnkgaXMgbm90IE5vbmU6CisgICAgICBmYXN0YmluYXJ5LmRlY29kZV9iaW5hcnkoc2VsZiwgaXByb3QudHJhbnMsIChzZWxmLl9fY2xhc3NfXywgc2VsZi50aHJpZnRfc3BlYykpCisgICAgICByZXR1cm4KKyAgICBpcHJvdC5yZWFkU3RydWN0QmVnaW4oKQorICAgIHdoaWxlIFRydWU6CisgICAgICAoZm5hbWUsIGZ0eXBlLCBmaWQpID0gaXByb3QucmVhZEZpZWxkQmVnaW4oKQorICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuU1RPUDoKKyAgICAgICAgYnJlYWsKKyAgICAgIGlmIGZpZCA9PSAxOgorICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5TVFJJTkc6CisgICAgICAgICAgc2VsZi5uYW1lID0gaXByb3QucmVhZFN0cmluZygpLmRlY29kZSgndXRmLTgnKQorICAgICAgICBlbHNlOgorICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBlbHNlOgorICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgaXByb3QucmVhZEZpZWxkRW5kKCkKKyAgICBpcHJvdC5yZWFkU3RydWN0RW5kKCkKKworICBkZWYgd3JpdGUoc2VsZiwgb3Byb3QpOgorICAgIGlmIG9wcm90Ll9fY2xhc3NfXyA9PSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgYW5kIHNlbGYudGhyaWZ0X3NwZWMgaXMgbm90IE5vbmUgYW5kIGZhc3RiaW5hcnkgaXMgbm90IE5vbmU6CisgICAgICBvcHJvdC50cmFucy53cml0ZShmYXN0YmluYXJ5LmVuY29kZV9iaW5hcnkoc2VsZiwgKHNlbGYuX19jbGFzc19fLCBzZWxmLnRocmlmdF9zcGVjKSkpCisgICAgICByZXR1cm4KKyAgICBvcHJvdC53cml0ZVN0cnVjdEJlZ2luKCdnZXRMb2dDb25maWdfYXJncycpCisgICAgaWYgc2VsZi5uYW1lIGlzIG5vdCBOb25lOgorICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCduYW1lJywgVFR5cGUuU1RSSU5HLCAxKQorICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoc2VsZi5uYW1lLmVuY29kZSgndXRmLTgnKSkKKyAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKQorICAgIG9wcm90LndyaXRlRmllbGRTdG9wKCkKKyAgICBvcHJvdC53cml0ZVN0cnVjdEVuZCgpCisKKyAgZGVmIHZhbGlkYXRlKHNlbGYpOgorICAgIHJldHVybgorCisKKyAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgIHZhbHVlID0gMTcKKyAgICB2YWx1ZSA9ICh2YWx1ZSAqIDMxKSBeIGhhc2goc2VsZi5uYW1lKQorICAgIHJldHVybiB2YWx1ZQorCisgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICBMID0gWyclcz0lcicgJSAoa2V5LCB2YWx1ZSkKKyAgICAgIGZvciBrZXksIHZhbHVlIGluIHNlbGYuX19kaWN0X18uaXRlcml0ZW1zKCldCisgICAgcmV0dXJuICclcyglcyknICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCAnLCAnLmpvaW4oTCkpCisKKyAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgcmV0dXJuIGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKSBhbmQgc2VsZi5fX2RpY3RfXyA9PSBvdGhlci5fX2RpY3RfXworCisgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgorICAgIHJldHVybiBub3QgKHNlbGYgPT0gb3RoZXIpCisKK2NsYXNzIGdldExvZ0NvbmZpZ19yZXN1bHQ6CisgICIiIgorICBBdHRyaWJ1dGVzOgorICAgLSBzdWNjZXNzCisgICIiIgorCisgIHRocmlmdF9zcGVjID0gKAorICAgICgwLCBUVHlwZS5TVFJVQ1QsICdzdWNjZXNzJywgKExvZ0NvbmZpZywgTG9nQ29uZmlnLnRocmlmdF9zcGVjKSwgTm9uZSwgKSwgIyAwCisgICkKKworICBkZWYgX19pbml0X18oc2VsZiwgc3VjY2Vzcz1Ob25lLCk6CisgICAgc2VsZi5zdWNjZXNzID0gc3VjY2VzcworCisgIGRlZiByZWFkKHNlbGYsIGlwcm90KToKKyAgICBpZiBpcHJvdC5fX2NsYXNzX18gPT0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIGFuZCBpc2luc3RhbmNlKGlwcm90LnRyYW5zLCBUVHJhbnNwb3J0LkNSZWFkYWJsZVRyYW5zcG9ydCkgYW5kIHNlbGYudGhyaWZ0X3NwZWMgaXMgbm90IE5vbmUgYW5kIGZhc3RiaW5hcnkgaXMgbm90IE5vbmU6CisgICAgICBmYXN0YmluYXJ5LmRlY29kZV9iaW5hcnkoc2VsZiwgaXByb3QudHJhbnMsIChzZWxmLl9fY2xhc3NfXywgc2VsZi50aHJpZnRfc3BlYykpCisgICAgICByZXR1cm4KKyAgICBpcHJvdC5yZWFkU3RydWN0QmVnaW4oKQorICAgIHdoaWxlIFRydWU6CisgICAgICAoZm5hbWUsIGZ0eXBlLCBmaWQpID0gaXByb3QucmVhZEZpZWxkQmVnaW4oKQorICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuU1RPUDoKKyAgICAgICAgYnJlYWsKKyAgICAgIGlmIGZpZCA9PSAwOgorICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5TVFJVQ1Q6CisgICAgICAgICAgc2VsZi5zdWNjZXNzID0gTG9nQ29uZmlnKCkKKyAgICAgICAgICBzZWxmLnN1Y2Nlc3MucmVhZChpcHJvdCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgZWxzZToKKyAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgIGlwcm90LnJlYWRGaWVsZEVuZCgpCisgICAgaXByb3QucmVhZFN0cnVjdEVuZCgpCisKKyAgZGVmIHdyaXRlKHNlbGYsIG9wcm90KToKKyAgICBpZiBvcHJvdC5fX2NsYXNzX18gPT0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIGFuZCBzZWxmLnRocmlmdF9zcGVjIGlzIG5vdCBOb25lIGFuZCBmYXN0YmluYXJ5IGlzIG5vdCBOb25lOgorICAgICAgb3Byb3QudHJhbnMud3JpdGUoZmFzdGJpbmFyeS5lbmNvZGVfYmluYXJ5KHNlbGYsIChzZWxmLl9fY2xhc3NfXywgc2VsZi50aHJpZnRfc3BlYykpKQorICAgICAgcmV0dXJuCisgICAgb3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbignZ2V0TG9nQ29uZmlnX3Jlc3VsdCcpCisgICAgaWYgc2VsZi5zdWNjZXNzIGlzIG5vdCBOb25lOgorICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCdzdWNjZXNzJywgVFR5cGUuU1RSVUNULCAwKQorICAgICAgc2VsZi5zdWNjZXNzLndyaXRlKG9wcm90KQorICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCisgICAgb3Byb3Qud3JpdGVGaWVsZFN0b3AoKQorICAgIG9wcm90LndyaXRlU3RydWN0RW5kKCkKKworICBkZWYgdmFsaWRhdGUoc2VsZik6CisgICAgcmV0dXJuCisKKworICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgdmFsdWUgPSAxNworICAgIHZhbHVlID0gKHZhbHVlICogMzEpIF4gaGFzaChzZWxmLnN1Y2Nlc3MpCisgICAgcmV0dXJuIHZhbHVlCisKKyAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgIEwgPSBbJyVzPSVyJyAlIChrZXksIHZhbHVlKQorICAgICAgZm9yIGtleSwgdmFsdWUgaW4gc2VsZi5fX2RpY3RfXy5pdGVyaXRlbXMoKV0KKyAgICByZXR1cm4gJyVzKCVzKScgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sICcsICcuam9pbihMKSkKKworICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICByZXR1cm4gaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pIGFuZCBzZWxmLl9fZGljdF9fID09IG90aGVyLl9fZGljdF9fCisKKyAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CisgICAgcmV0dXJuIG5vdCAoc2VsZiA9PSBvdGhlcikKKwogY2xhc3MgZGVidWdfYXJnczoKICAgIiIiCiAgIEF0dHJpYnV0ZXM6CkBAIC0yNTM1LDEyICszNDMwLDEyIEBACiAgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKICAgICAgIGVsaWYgZmlkID09IDM6CiAgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLkJPT0w6Ci0gICAgICAgICAgc2VsZi5lbmFibGUgPSBpcHJvdC5yZWFkQm9vbCgpOworICAgICAgICAgIHNlbGYuZW5hYmxlID0gaXByb3QucmVhZEJvb2woKQogICAgICAgICBlbHNlOgogICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCiAgICAgICBlbGlmIGZpZCA9PSA0OgogICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5ET1VCTEU6Ci0gICAgICAgICAgc2VsZi5zYW1wbGluZ1BlcmNlbnRhZ2UgPSBpcHJvdC5yZWFkRG91YmxlKCk7CisgICAgICAgICAgc2VsZi5zYW1wbGluZ1BlcmNlbnRhZ2UgPSBpcHJvdC5yZWFkRG91YmxlKCkKICAgICAgICAgZWxzZToKICAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQogICAgICAgZWxzZToKQEAgLTI2NzUsNiArMzU3MCwyOTUgQEAKICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgcmV0dXJuIG5vdCAoc2VsZiA9PSBvdGhlcikKIAorY2xhc3Mgc2V0V29ya2VyUHJvZmlsZXJfYXJnczoKKyAgIiIiCisgIEF0dHJpYnV0ZXM6CisgICAtIGlkCisgICAtIHByb2ZpbGVSZXF1ZXN0CisgICIiIgorCisgIHRocmlmdF9zcGVjID0gKAorICAgIE5vbmUsICMgMAorICAgICgxLCBUVHlwZS5TVFJJTkcsICdpZCcsIE5vbmUsIE5vbmUsICksICMgMQorICAgICgyLCBUVHlwZS5TVFJVQ1QsICdwcm9maWxlUmVxdWVzdCcsIChQcm9maWxlUmVxdWVzdCwgUHJvZmlsZVJlcXVlc3QudGhyaWZ0X3NwZWMpLCBOb25lLCApLCAjIDIKKyAgKQorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBpZD1Ob25lLCBwcm9maWxlUmVxdWVzdD1Ob25lLCk6CisgICAgc2VsZi5pZCA9IGlkCisgICAgc2VsZi5wcm9maWxlUmVxdWVzdCA9IHByb2ZpbGVSZXF1ZXN0CisKKyAgZGVmIHJlYWQoc2VsZiwgaXByb3QpOgorICAgIGlmIGlwcm90Ll9fY2xhc3NfXyA9PSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgYW5kIGlzaW5zdGFuY2UoaXByb3QudHJhbnMsIFRUcmFuc3BvcnQuQ1JlYWRhYmxlVHJhbnNwb3J0KSBhbmQgc2VsZi50aHJpZnRfc3BlYyBpcyBub3QgTm9uZSBhbmQgZmFzdGJpbmFyeSBpcyBub3QgTm9uZToKKyAgICAgIGZhc3RiaW5hcnkuZGVjb2RlX2JpbmFyeShzZWxmLCBpcHJvdC50cmFucywgKHNlbGYuX19jbGFzc19fLCBzZWxmLnRocmlmdF9zcGVjKSkKKyAgICAgIHJldHVybgorICAgIGlwcm90LnJlYWRTdHJ1Y3RCZWdpbigpCisgICAgd2hpbGUgVHJ1ZToKKyAgICAgIChmbmFtZSwgZnR5cGUsIGZpZCkgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpCisgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5TVE9QOgorICAgICAgICBicmVhaworICAgICAgaWYgZmlkID09IDE6CisgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLlNUUklORzoKKyAgICAgICAgICBzZWxmLmlkID0gaXByb3QucmVhZFN0cmluZygpLmRlY29kZSgndXRmLTgnKQorICAgICAgICBlbHNlOgorICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBlbGlmIGZpZCA9PSAyOgorICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5TVFJVQ1Q6CisgICAgICAgICAgc2VsZi5wcm9maWxlUmVxdWVzdCA9IFByb2ZpbGVSZXF1ZXN0KCkKKyAgICAgICAgICBzZWxmLnByb2ZpbGVSZXF1ZXN0LnJlYWQoaXByb3QpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgIGVsc2U6CisgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBpcHJvdC5yZWFkRmllbGRFbmQoKQorICAgIGlwcm90LnJlYWRTdHJ1Y3RFbmQoKQorCisgIGRlZiB3cml0ZShzZWxmLCBvcHJvdCk6CisgICAgaWYgb3Byb3QuX19jbGFzc19fID09IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCBhbmQgc2VsZi50aHJpZnRfc3BlYyBpcyBub3QgTm9uZSBhbmQgZmFzdGJpbmFyeSBpcyBub3QgTm9uZToKKyAgICAgIG9wcm90LnRyYW5zLndyaXRlKGZhc3RiaW5hcnkuZW5jb2RlX2JpbmFyeShzZWxmLCAoc2VsZi5fX2NsYXNzX18sIHNlbGYudGhyaWZ0X3NwZWMpKSkKKyAgICAgIHJldHVybgorICAgIG9wcm90LndyaXRlU3RydWN0QmVnaW4oJ3NldFdvcmtlclByb2ZpbGVyX2FyZ3MnKQorICAgIGlmIHNlbGYuaWQgaXMgbm90IE5vbmU6CisgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ2lkJywgVFR5cGUuU1RSSU5HLCAxKQorICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoc2VsZi5pZC5lbmNvZGUoJ3V0Zi04JykpCisgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKKyAgICBpZiBzZWxmLnByb2ZpbGVSZXF1ZXN0IGlzIG5vdCBOb25lOgorICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCdwcm9maWxlUmVxdWVzdCcsIFRUeXBlLlNUUlVDVCwgMikKKyAgICAgIHNlbGYucHJvZmlsZVJlcXVlc3Qud3JpdGUob3Byb3QpCisgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKKyAgICBvcHJvdC53cml0ZUZpZWxkU3RvcCgpCisgICAgb3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKQorCisgIGRlZiB2YWxpZGF0ZShzZWxmKToKKyAgICByZXR1cm4KKworCisgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICB2YWx1ZSA9IDE3CisgICAgdmFsdWUgPSAodmFsdWUgKiAzMSkgXiBoYXNoKHNlbGYuaWQpCisgICAgdmFsdWUgPSAodmFsdWUgKiAzMSkgXiBoYXNoKHNlbGYucHJvZmlsZVJlcXVlc3QpCisgICAgcmV0dXJuIHZhbHVlCisKKyAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgIEwgPSBbJyVzPSVyJyAlIChrZXksIHZhbHVlKQorICAgICAgZm9yIGtleSwgdmFsdWUgaW4gc2VsZi5fX2RpY3RfXy5pdGVyaXRlbXMoKV0KKyAgICByZXR1cm4gJyVzKCVzKScgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sICcsICcuam9pbihMKSkKKworICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICByZXR1cm4gaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pIGFuZCBzZWxmLl9fZGljdF9fID09IG90aGVyLl9fZGljdF9fCisKKyAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CisgICAgcmV0dXJuIG5vdCAoc2VsZiA9PSBvdGhlcikKKworY2xhc3Mgc2V0V29ya2VyUHJvZmlsZXJfcmVzdWx0OgorCisgIHRocmlmdF9zcGVjID0gKAorICApCisKKyAgZGVmIHJlYWQoc2VsZiwgaXByb3QpOgorICAgIGlmIGlwcm90Ll9fY2xhc3NfXyA9PSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgYW5kIGlzaW5zdGFuY2UoaXByb3QudHJhbnMsIFRUcmFuc3BvcnQuQ1JlYWRhYmxlVHJhbnNwb3J0KSBhbmQgc2VsZi50aHJpZnRfc3BlYyBpcyBub3QgTm9uZSBhbmQgZmFzdGJpbmFyeSBpcyBub3QgTm9uZToKKyAgICAgIGZhc3RiaW5hcnkuZGVjb2RlX2JpbmFyeShzZWxmLCBpcHJvdC50cmFucywgKHNlbGYuX19jbGFzc19fLCBzZWxmLnRocmlmdF9zcGVjKSkKKyAgICAgIHJldHVybgorICAgIGlwcm90LnJlYWRTdHJ1Y3RCZWdpbigpCisgICAgd2hpbGUgVHJ1ZToKKyAgICAgIChmbmFtZSwgZnR5cGUsIGZpZCkgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpCisgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5TVE9QOgorICAgICAgICBicmVhaworICAgICAgZWxzZToKKyAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgIGlwcm90LnJlYWRGaWVsZEVuZCgpCisgICAgaXByb3QucmVhZFN0cnVjdEVuZCgpCisKKyAgZGVmIHdyaXRlKHNlbGYsIG9wcm90KToKKyAgICBpZiBvcHJvdC5fX2NsYXNzX18gPT0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIGFuZCBzZWxmLnRocmlmdF9zcGVjIGlzIG5vdCBOb25lIGFuZCBmYXN0YmluYXJ5IGlzIG5vdCBOb25lOgorICAgICAgb3Byb3QudHJhbnMud3JpdGUoZmFzdGJpbmFyeS5lbmNvZGVfYmluYXJ5KHNlbGYsIChzZWxmLl9fY2xhc3NfXywgc2VsZi50aHJpZnRfc3BlYykpKQorICAgICAgcmV0dXJuCisgICAgb3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbignc2V0V29ya2VyUHJvZmlsZXJfcmVzdWx0JykKKyAgICBvcHJvdC53cml0ZUZpZWxkU3RvcCgpCisgICAgb3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKQorCisgIGRlZiB2YWxpZGF0ZShzZWxmKToKKyAgICByZXR1cm4KKworCisgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICB2YWx1ZSA9IDE3CisgICAgcmV0dXJuIHZhbHVlCisKKyAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgIEwgPSBbJyVzPSVyJyAlIChrZXksIHZhbHVlKQorICAgICAgZm9yIGtleSwgdmFsdWUgaW4gc2VsZi5fX2RpY3RfXy5pdGVyaXRlbXMoKV0KKyAgICByZXR1cm4gJyVzKCVzKScgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sICcsICcuam9pbihMKSkKKworICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICByZXR1cm4gaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pIGFuZCBzZWxmLl9fZGljdF9fID09IG90aGVyLl9fZGljdF9fCisKKyAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CisgICAgcmV0dXJuIG5vdCAoc2VsZiA9PSBvdGhlcikKKworY2xhc3MgZ2V0Q29tcG9uZW50UGVuZGluZ1Byb2ZpbGVBY3Rpb25zX2FyZ3M6CisgICIiIgorICBBdHRyaWJ1dGVzOgorICAgLSBpZAorICAgLSBjb21wb25lbnRfaWQKKyAgIC0gYWN0aW9uCisgICIiIgorCisgIHRocmlmdF9zcGVjID0gKAorICAgIE5vbmUsICMgMAorICAgICgxLCBUVHlwZS5TVFJJTkcsICdpZCcsIE5vbmUsIE5vbmUsICksICMgMQorICAgICgyLCBUVHlwZS5TVFJJTkcsICdjb21wb25lbnRfaWQnLCBOb25lLCBOb25lLCApLCAjIDIKKyAgICAoMywgVFR5cGUuSTMyLCAnYWN0aW9uJywgTm9uZSwgTm9uZSwgKSwgIyAzCisgICkKKworICBkZWYgX19pbml0X18oc2VsZiwgaWQ9Tm9uZSwgY29tcG9uZW50X2lkPU5vbmUsIGFjdGlvbj1Ob25lLCk6CisgICAgc2VsZi5pZCA9IGlkCisgICAgc2VsZi5jb21wb25lbnRfaWQgPSBjb21wb25lbnRfaWQKKyAgICBzZWxmLmFjdGlvbiA9IGFjdGlvbgorCisgIGRlZiByZWFkKHNlbGYsIGlwcm90KToKKyAgICBpZiBpcHJvdC5fX2NsYXNzX18gPT0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIGFuZCBpc2luc3RhbmNlKGlwcm90LnRyYW5zLCBUVHJhbnNwb3J0LkNSZWFkYWJsZVRyYW5zcG9ydCkgYW5kIHNlbGYudGhyaWZ0X3NwZWMgaXMgbm90IE5vbmUgYW5kIGZhc3RiaW5hcnkgaXMgbm90IE5vbmU6CisgICAgICBmYXN0YmluYXJ5LmRlY29kZV9iaW5hcnkoc2VsZiwgaXByb3QudHJhbnMsIChzZWxmLl9fY2xhc3NfXywgc2VsZi50aHJpZnRfc3BlYykpCisgICAgICByZXR1cm4KKyAgICBpcHJvdC5yZWFkU3RydWN0QmVnaW4oKQorICAgIHdoaWxlIFRydWU6CisgICAgICAoZm5hbWUsIGZ0eXBlLCBmaWQpID0gaXByb3QucmVhZEZpZWxkQmVnaW4oKQorICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuU1RPUDoKKyAgICAgICAgYnJlYWsKKyAgICAgIGlmIGZpZCA9PSAxOgorICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5TVFJJTkc6CisgICAgICAgICAgc2VsZi5pZCA9IGlwcm90LnJlYWRTdHJpbmcoKS5kZWNvZGUoJ3V0Zi04JykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgZWxpZiBmaWQgPT0gMjoKKyAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuU1RSSU5HOgorICAgICAgICAgIHNlbGYuY29tcG9uZW50X2lkID0gaXByb3QucmVhZFN0cmluZygpLmRlY29kZSgndXRmLTgnKQorICAgICAgICBlbHNlOgorICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBlbGlmIGZpZCA9PSAzOgorICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5JMzI6CisgICAgICAgICAgc2VsZi5hY3Rpb24gPSBpcHJvdC5yZWFkSTMyKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgZWxzZToKKyAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgIGlwcm90LnJlYWRGaWVsZEVuZCgpCisgICAgaXByb3QucmVhZFN0cnVjdEVuZCgpCisKKyAgZGVmIHdyaXRlKHNlbGYsIG9wcm90KToKKyAgICBpZiBvcHJvdC5fX2NsYXNzX18gPT0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIGFuZCBzZWxmLnRocmlmdF9zcGVjIGlzIG5vdCBOb25lIGFuZCBmYXN0YmluYXJ5IGlzIG5vdCBOb25lOgorICAgICAgb3Byb3QudHJhbnMud3JpdGUoZmFzdGJpbmFyeS5lbmNvZGVfYmluYXJ5KHNlbGYsIChzZWxmLl9fY2xhc3NfXywgc2VsZi50aHJpZnRfc3BlYykpKQorICAgICAgcmV0dXJuCisgICAgb3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbignZ2V0Q29tcG9uZW50UGVuZGluZ1Byb2ZpbGVBY3Rpb25zX2FyZ3MnKQorICAgIGlmIHNlbGYuaWQgaXMgbm90IE5vbmU6CisgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ2lkJywgVFR5cGUuU1RSSU5HLCAxKQorICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoc2VsZi5pZC5lbmNvZGUoJ3V0Zi04JykpCisgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKKyAgICBpZiBzZWxmLmNvbXBvbmVudF9pZCBpcyBub3QgTm9uZToKKyAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbignY29tcG9uZW50X2lkJywgVFR5cGUuU1RSSU5HLCAyKQorICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoc2VsZi5jb21wb25lbnRfaWQuZW5jb2RlKCd1dGYtOCcpKQorICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCisgICAgaWYgc2VsZi5hY3Rpb24gaXMgbm90IE5vbmU6CisgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ2FjdGlvbicsIFRUeXBlLkkzMiwgMykKKyAgICAgIG9wcm90LndyaXRlSTMyKHNlbGYuYWN0aW9uKQorICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCisgICAgb3Byb3Qud3JpdGVGaWVsZFN0b3AoKQorICAgIG9wcm90LndyaXRlU3RydWN0RW5kKCkKKworICBkZWYgdmFsaWRhdGUoc2VsZik6CisgICAgcmV0dXJuCisKKworICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgdmFsdWUgPSAxNworICAgIHZhbHVlID0gKHZhbHVlICogMzEpIF4gaGFzaChzZWxmLmlkKQorICAgIHZhbHVlID0gKHZhbHVlICogMzEpIF4gaGFzaChzZWxmLmNvbXBvbmVudF9pZCkKKyAgICB2YWx1ZSA9ICh2YWx1ZSAqIDMxKSBeIGhhc2goc2VsZi5hY3Rpb24pCisgICAgcmV0dXJuIHZhbHVlCisKKyAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgIEwgPSBbJyVzPSVyJyAlIChrZXksIHZhbHVlKQorICAgICAgZm9yIGtleSwgdmFsdWUgaW4gc2VsZi5fX2RpY3RfXy5pdGVyaXRlbXMoKV0KKyAgICByZXR1cm4gJyVzKCVzKScgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sICcsICcuam9pbihMKSkKKworICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICByZXR1cm4gaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pIGFuZCBzZWxmLl9fZGljdF9fID09IG90aGVyLl9fZGljdF9fCisKKyAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CisgICAgcmV0dXJuIG5vdCAoc2VsZiA9PSBvdGhlcikKKworY2xhc3MgZ2V0Q29tcG9uZW50UGVuZGluZ1Byb2ZpbGVBY3Rpb25zX3Jlc3VsdDoKKyAgIiIiCisgIEF0dHJpYnV0ZXM6CisgICAtIHN1Y2Nlc3MKKyAgIiIiCisKKyAgdGhyaWZ0X3NwZWMgPSAoCisgICAgKDAsIFRUeXBlLkxJU1QsICdzdWNjZXNzJywgKFRUeXBlLlNUUlVDVCwoUHJvZmlsZVJlcXVlc3QsIFByb2ZpbGVSZXF1ZXN0LnRocmlmdF9zcGVjKSksIE5vbmUsICksICMgMAorICApCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIHN1Y2Nlc3M9Tm9uZSwpOgorICAgIHNlbGYuc3VjY2VzcyA9IHN1Y2Nlc3MKKworICBkZWYgcmVhZChzZWxmLCBpcHJvdCk6CisgICAgaWYgaXByb3QuX19jbGFzc19fID09IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCBhbmQgaXNpbnN0YW5jZShpcHJvdC50cmFucywgVFRyYW5zcG9ydC5DUmVhZGFibGVUcmFuc3BvcnQpIGFuZCBzZWxmLnRocmlmdF9zcGVjIGlzIG5vdCBOb25lIGFuZCBmYXN0YmluYXJ5IGlzIG5vdCBOb25lOgorICAgICAgZmFzdGJpbmFyeS5kZWNvZGVfYmluYXJ5KHNlbGYsIGlwcm90LnRyYW5zLCAoc2VsZi5fX2NsYXNzX18sIHNlbGYudGhyaWZ0X3NwZWMpKQorICAgICAgcmV0dXJuCisgICAgaXByb3QucmVhZFN0cnVjdEJlZ2luKCkKKyAgICB3aGlsZSBUcnVlOgorICAgICAgKGZuYW1lLCBmdHlwZSwgZmlkKSA9IGlwcm90LnJlYWRGaWVsZEJlZ2luKCkKKyAgICAgIGlmIGZ0eXBlID09IFRUeXBlLlNUT1A6CisgICAgICAgIGJyZWFrCisgICAgICBpZiBmaWQgPT0gMDoKKyAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuTElTVDoKKyAgICAgICAgICBzZWxmLnN1Y2Nlc3MgPSBbXQorICAgICAgICAgIChfZXR5cGU2NDgsIF9zaXplNjQ1KSA9IGlwcm90LnJlYWRMaXN0QmVnaW4oKQorICAgICAgICAgIGZvciBfaTY0OSBpbiB4cmFuZ2UoX3NpemU2NDUpOgorICAgICAgICAgICAgX2VsZW02NTAgPSBQcm9maWxlUmVxdWVzdCgpCisgICAgICAgICAgICBfZWxlbTY1MC5yZWFkKGlwcm90KQorICAgICAgICAgICAgc2VsZi5zdWNjZXNzLmFwcGVuZChfZWxlbTY1MCkKKyAgICAgICAgICBpcHJvdC5yZWFkTGlzdEVuZCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgIGVsc2U6CisgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBpcHJvdC5yZWFkRmllbGRFbmQoKQorICAgIGlwcm90LnJlYWRTdHJ1Y3RFbmQoKQorCisgIGRlZiB3cml0ZShzZWxmLCBvcHJvdCk6CisgICAgaWYgb3Byb3QuX19jbGFzc19fID09IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCBhbmQgc2VsZi50aHJpZnRfc3BlYyBpcyBub3QgTm9uZSBhbmQgZmFzdGJpbmFyeSBpcyBub3QgTm9uZToKKyAgICAgIG9wcm90LnRyYW5zLndyaXRlKGZhc3RiaW5hcnkuZW5jb2RlX2JpbmFyeShzZWxmLCAoc2VsZi5fX2NsYXNzX18sIHNlbGYudGhyaWZ0X3NwZWMpKSkKKyAgICAgIHJldHVybgorICAgIG9wcm90LndyaXRlU3RydWN0QmVnaW4oJ2dldENvbXBvbmVudFBlbmRpbmdQcm9maWxlQWN0aW9uc19yZXN1bHQnKQorICAgIGlmIHNlbGYuc3VjY2VzcyBpcyBub3QgTm9uZToKKyAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbignc3VjY2VzcycsIFRUeXBlLkxJU1QsIDApCisgICAgICBvcHJvdC53cml0ZUxpc3RCZWdpbihUVHlwZS5TVFJVQ1QsIGxlbihzZWxmLnN1Y2Nlc3MpKQorICAgICAgZm9yIGl0ZXI2NTEgaW4gc2VsZi5zdWNjZXNzOgorICAgICAgICBpdGVyNjUxLndyaXRlKG9wcm90KQorICAgICAgb3Byb3Qud3JpdGVMaXN0RW5kKCkKKyAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKQorICAgIG9wcm90LndyaXRlRmllbGRTdG9wKCkKKyAgICBvcHJvdC53cml0ZVN0cnVjdEVuZCgpCisKKyAgZGVmIHZhbGlkYXRlKHNlbGYpOgorICAgIHJldHVybgorCisKKyAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgIHZhbHVlID0gMTcKKyAgICB2YWx1ZSA9ICh2YWx1ZSAqIDMxKSBeIGhhc2goc2VsZi5zdWNjZXNzKQorICAgIHJldHVybiB2YWx1ZQorCisgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICBMID0gWyclcz0lcicgJSAoa2V5LCB2YWx1ZSkKKyAgICAgIGZvciBrZXksIHZhbHVlIGluIHNlbGYuX19kaWN0X18uaXRlcml0ZW1zKCldCisgICAgcmV0dXJuICclcyglcyknICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCAnLCAnLmpvaW4oTCkpCisKKyAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgcmV0dXJuIGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKSBhbmQgc2VsZi5fX2RpY3RfXyA9PSBvdGhlci5fX2RpY3RfXworCisgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgorICAgIHJldHVybiBub3QgKHNlbGYgPT0gb3RoZXIpCisKIGNsYXNzIHVwbG9hZE5ld0NyZWRlbnRpYWxzX2FyZ3M6CiAgICIiIgogICBBdHRyaWJ1dGVzOgpAQCAtMzAwNSw3ICs0MTg5LDcgQEAKICAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQogICAgICAgZWxpZiBmaWQgPT0gMjoKICAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuU1RSSU5HOgotICAgICAgICAgIHNlbGYuY2h1bmsgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgc2VsZi5jaHVuayA9IGlwcm90LnJlYWRTdHJpbmcoKQogICAgICAgICBlbHNlOgogICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCiAgICAgICBlbHNlOgpAQCAtMzQ4Miw3ICs0NjY2LDcgQEAKICAgICAgICAgYnJlYWsKICAgICAgIGlmIGZpZCA9PSAwOgogICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5TVFJJTkc6Ci0gICAgICAgICAgc2VsZi5zdWNjZXNzID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICAgIHNlbGYuc3VjY2VzcyA9IGlwcm90LnJlYWRTdHJpbmcoKQogICAgICAgICBlbHNlOgogICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCiAgICAgICBlbGlmIGZpZCA9PSAxOgpAQCAtNDExMiw2ICs1Mjk2LDM4NyBAQAogICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKICAgICByZXR1cm4gbm90IChzZWxmID09IG90aGVyKQogCitjbGFzcyBnZXRUb3BvbG9neVBhZ2VJbmZvX2FyZ3M6CisgICIiIgorICBBdHRyaWJ1dGVzOgorICAgLSBpZAorICAgLSB3aW5kb3cKKyAgIC0gaXNfaW5jbHVkZV9zeXMKKyAgIiIiCisKKyAgdGhyaWZ0X3NwZWMgPSAoCisgICAgTm9uZSwgIyAwCisgICAgKDEsIFRUeXBlLlNUUklORywgJ2lkJywgTm9uZSwgTm9uZSwgKSwgIyAxCisgICAgKDIsIFRUeXBlLlNUUklORywgJ3dpbmRvdycsIE5vbmUsIE5vbmUsICksICMgMgorICAgICgzLCBUVHlwZS5CT09MLCAnaXNfaW5jbHVkZV9zeXMnLCBOb25lLCBOb25lLCApLCAjIDMKKyAgKQorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBpZD1Ob25lLCB3aW5kb3c9Tm9uZSwgaXNfaW5jbHVkZV9zeXM9Tm9uZSwpOgorICAgIHNlbGYuaWQgPSBpZAorICAgIHNlbGYud2luZG93ID0gd2luZG93CisgICAgc2VsZi5pc19pbmNsdWRlX3N5cyA9IGlzX2luY2x1ZGVfc3lzCisKKyAgZGVmIHJlYWQoc2VsZiwgaXByb3QpOgorICAgIGlmIGlwcm90Ll9fY2xhc3NfXyA9PSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgYW5kIGlzaW5zdGFuY2UoaXByb3QudHJhbnMsIFRUcmFuc3BvcnQuQ1JlYWRhYmxlVHJhbnNwb3J0KSBhbmQgc2VsZi50aHJpZnRfc3BlYyBpcyBub3QgTm9uZSBhbmQgZmFzdGJpbmFyeSBpcyBub3QgTm9uZToKKyAgICAgIGZhc3RiaW5hcnkuZGVjb2RlX2JpbmFyeShzZWxmLCBpcHJvdC50cmFucywgKHNlbGYuX19jbGFzc19fLCBzZWxmLnRocmlmdF9zcGVjKSkKKyAgICAgIHJldHVybgorICAgIGlwcm90LnJlYWRTdHJ1Y3RCZWdpbigpCisgICAgd2hpbGUgVHJ1ZToKKyAgICAgIChmbmFtZSwgZnR5cGUsIGZpZCkgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpCisgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5TVE9QOgorICAgICAgICBicmVhaworICAgICAgaWYgZmlkID09IDE6CisgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLlNUUklORzoKKyAgICAgICAgICBzZWxmLmlkID0gaXByb3QucmVhZFN0cmluZygpLmRlY29kZSgndXRmLTgnKQorICAgICAgICBlbHNlOgorICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBlbGlmIGZpZCA9PSAyOgorICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5TVFJJTkc6CisgICAgICAgICAgc2VsZi53aW5kb3cgPSBpcHJvdC5yZWFkU3RyaW5nKCkuZGVjb2RlKCd1dGYtOCcpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgIGVsaWYgZmlkID09IDM6CisgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLkJPT0w6CisgICAgICAgICAgc2VsZi5pc19pbmNsdWRlX3N5cyA9IGlwcm90LnJlYWRCb29sKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgZWxzZToKKyAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgIGlwcm90LnJlYWRGaWVsZEVuZCgpCisgICAgaXByb3QucmVhZFN0cnVjdEVuZCgpCisKKyAgZGVmIHdyaXRlKHNlbGYsIG9wcm90KToKKyAgICBpZiBvcHJvdC5fX2NsYXNzX18gPT0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIGFuZCBzZWxmLnRocmlmdF9zcGVjIGlzIG5vdCBOb25lIGFuZCBmYXN0YmluYXJ5IGlzIG5vdCBOb25lOgorICAgICAgb3Byb3QudHJhbnMud3JpdGUoZmFzdGJpbmFyeS5lbmNvZGVfYmluYXJ5KHNlbGYsIChzZWxmLl9fY2xhc3NfXywgc2VsZi50aHJpZnRfc3BlYykpKQorICAgICAgcmV0dXJuCisgICAgb3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbignZ2V0VG9wb2xvZ3lQYWdlSW5mb19hcmdzJykKKyAgICBpZiBzZWxmLmlkIGlzIG5vdCBOb25lOgorICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCdpZCcsIFRUeXBlLlNUUklORywgMSkKKyAgICAgIG9wcm90LndyaXRlU3RyaW5nKHNlbGYuaWQuZW5jb2RlKCd1dGYtOCcpKQorICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCisgICAgaWYgc2VsZi53aW5kb3cgaXMgbm90IE5vbmU6CisgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ3dpbmRvdycsIFRUeXBlLlNUUklORywgMikKKyAgICAgIG9wcm90LndyaXRlU3RyaW5nKHNlbGYud2luZG93LmVuY29kZSgndXRmLTgnKSkKKyAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKQorICAgIGlmIHNlbGYuaXNfaW5jbHVkZV9zeXMgaXMgbm90IE5vbmU6CisgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ2lzX2luY2x1ZGVfc3lzJywgVFR5cGUuQk9PTCwgMykKKyAgICAgIG9wcm90LndyaXRlQm9vbChzZWxmLmlzX2luY2x1ZGVfc3lzKQorICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCisgICAgb3Byb3Qud3JpdGVGaWVsZFN0b3AoKQorICAgIG9wcm90LndyaXRlU3RydWN0RW5kKCkKKworICBkZWYgdmFsaWRhdGUoc2VsZik6CisgICAgcmV0dXJuCisKKworICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgdmFsdWUgPSAxNworICAgIHZhbHVlID0gKHZhbHVlICogMzEpIF4gaGFzaChzZWxmLmlkKQorICAgIHZhbHVlID0gKHZhbHVlICogMzEpIF4gaGFzaChzZWxmLndpbmRvdykKKyAgICB2YWx1ZSA9ICh2YWx1ZSAqIDMxKSBeIGhhc2goc2VsZi5pc19pbmNsdWRlX3N5cykKKyAgICByZXR1cm4gdmFsdWUKKworICBkZWYgX19yZXByX18oc2VsZik6CisgICAgTCA9IFsnJXM9JXInICUgKGtleSwgdmFsdWUpCisgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzZWxmLl9fZGljdF9fLml0ZXJpdGVtcygpXQorICAgIHJldHVybiAnJXMoJXMpJyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgJywgJy5qb2luKEwpKQorCisgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgIHJldHVybiBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXykgYW5kIHNlbGYuX19kaWN0X18gPT0gb3RoZXIuX19kaWN0X18KKworICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKKyAgICByZXR1cm4gbm90IChzZWxmID09IG90aGVyKQorCitjbGFzcyBnZXRUb3BvbG9neVBhZ2VJbmZvX3Jlc3VsdDoKKyAgIiIiCisgIEF0dHJpYnV0ZXM6CisgICAtIHN1Y2Nlc3MKKyAgIC0gZQorICAgLSBhemUKKyAgIiIiCisKKyAgdGhyaWZ0X3NwZWMgPSAoCisgICAgKDAsIFRUeXBlLlNUUlVDVCwgJ3N1Y2Nlc3MnLCAoVG9wb2xvZ3lQYWdlSW5mbywgVG9wb2xvZ3lQYWdlSW5mby50aHJpZnRfc3BlYyksIE5vbmUsICksICMgMAorICAgICgxLCBUVHlwZS5TVFJVQ1QsICdlJywgKE5vdEFsaXZlRXhjZXB0aW9uLCBOb3RBbGl2ZUV4Y2VwdGlvbi50aHJpZnRfc3BlYyksIE5vbmUsICksICMgMQorICAgICgyLCBUVHlwZS5TVFJVQ1QsICdhemUnLCAoQXV0aG9yaXphdGlvbkV4Y2VwdGlvbiwgQXV0aG9yaXphdGlvbkV4Y2VwdGlvbi50aHJpZnRfc3BlYyksIE5vbmUsICksICMgMgorICApCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIHN1Y2Nlc3M9Tm9uZSwgZT1Ob25lLCBhemU9Tm9uZSwpOgorICAgIHNlbGYuc3VjY2VzcyA9IHN1Y2Nlc3MKKyAgICBzZWxmLmUgPSBlCisgICAgc2VsZi5hemUgPSBhemUKKworICBkZWYgcmVhZChzZWxmLCBpcHJvdCk6CisgICAgaWYgaXByb3QuX19jbGFzc19fID09IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCBhbmQgaXNpbnN0YW5jZShpcHJvdC50cmFucywgVFRyYW5zcG9ydC5DUmVhZGFibGVUcmFuc3BvcnQpIGFuZCBzZWxmLnRocmlmdF9zcGVjIGlzIG5vdCBOb25lIGFuZCBmYXN0YmluYXJ5IGlzIG5vdCBOb25lOgorICAgICAgZmFzdGJpbmFyeS5kZWNvZGVfYmluYXJ5KHNlbGYsIGlwcm90LnRyYW5zLCAoc2VsZi5fX2NsYXNzX18sIHNlbGYudGhyaWZ0X3NwZWMpKQorICAgICAgcmV0dXJuCisgICAgaXByb3QucmVhZFN0cnVjdEJlZ2luKCkKKyAgICB3aGlsZSBUcnVlOgorICAgICAgKGZuYW1lLCBmdHlwZSwgZmlkKSA9IGlwcm90LnJlYWRGaWVsZEJlZ2luKCkKKyAgICAgIGlmIGZ0eXBlID09IFRUeXBlLlNUT1A6CisgICAgICAgIGJyZWFrCisgICAgICBpZiBmaWQgPT0gMDoKKyAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuU1RSVUNUOgorICAgICAgICAgIHNlbGYuc3VjY2VzcyA9IFRvcG9sb2d5UGFnZUluZm8oKQorICAgICAgICAgIHNlbGYuc3VjY2Vzcy5yZWFkKGlwcm90KQorICAgICAgICBlbHNlOgorICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBlbGlmIGZpZCA9PSAxOgorICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5TVFJVQ1Q6CisgICAgICAgICAgc2VsZi5lID0gTm90QWxpdmVFeGNlcHRpb24oKQorICAgICAgICAgIHNlbGYuZS5yZWFkKGlwcm90KQorICAgICAgICBlbHNlOgorICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBlbGlmIGZpZCA9PSAyOgorICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5TVFJVQ1Q6CisgICAgICAgICAgc2VsZi5hemUgPSBBdXRob3JpemF0aW9uRXhjZXB0aW9uKCkKKyAgICAgICAgICBzZWxmLmF6ZS5yZWFkKGlwcm90KQorICAgICAgICBlbHNlOgorICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBlbHNlOgorICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgaXByb3QucmVhZEZpZWxkRW5kKCkKKyAgICBpcHJvdC5yZWFkU3RydWN0RW5kKCkKKworICBkZWYgd3JpdGUoc2VsZiwgb3Byb3QpOgorICAgIGlmIG9wcm90Ll9fY2xhc3NfXyA9PSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgYW5kIHNlbGYudGhyaWZ0X3NwZWMgaXMgbm90IE5vbmUgYW5kIGZhc3RiaW5hcnkgaXMgbm90IE5vbmU6CisgICAgICBvcHJvdC50cmFucy53cml0ZShmYXN0YmluYXJ5LmVuY29kZV9iaW5hcnkoc2VsZiwgKHNlbGYuX19jbGFzc19fLCBzZWxmLnRocmlmdF9zcGVjKSkpCisgICAgICByZXR1cm4KKyAgICBvcHJvdC53cml0ZVN0cnVjdEJlZ2luKCdnZXRUb3BvbG9neVBhZ2VJbmZvX3Jlc3VsdCcpCisgICAgaWYgc2VsZi5zdWNjZXNzIGlzIG5vdCBOb25lOgorICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCdzdWNjZXNzJywgVFR5cGUuU1RSVUNULCAwKQorICAgICAgc2VsZi5zdWNjZXNzLndyaXRlKG9wcm90KQorICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCisgICAgaWYgc2VsZi5lIGlzIG5vdCBOb25lOgorICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCdlJywgVFR5cGUuU1RSVUNULCAxKQorICAgICAgc2VsZi5lLndyaXRlKG9wcm90KQorICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCisgICAgaWYgc2VsZi5hemUgaXMgbm90IE5vbmU6CisgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ2F6ZScsIFRUeXBlLlNUUlVDVCwgMikKKyAgICAgIHNlbGYuYXplLndyaXRlKG9wcm90KQorICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCisgICAgb3Byb3Qud3JpdGVGaWVsZFN0b3AoKQorICAgIG9wcm90LndyaXRlU3RydWN0RW5kKCkKKworICBkZWYgdmFsaWRhdGUoc2VsZik6CisgICAgcmV0dXJuCisKKworICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgdmFsdWUgPSAxNworICAgIHZhbHVlID0gKHZhbHVlICogMzEpIF4gaGFzaChzZWxmLnN1Y2Nlc3MpCisgICAgdmFsdWUgPSAodmFsdWUgKiAzMSkgXiBoYXNoKHNlbGYuZSkKKyAgICB2YWx1ZSA9ICh2YWx1ZSAqIDMxKSBeIGhhc2goc2VsZi5hemUpCisgICAgcmV0dXJuIHZhbHVlCisKKyAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgIEwgPSBbJyVzPSVyJyAlIChrZXksIHZhbHVlKQorICAgICAgZm9yIGtleSwgdmFsdWUgaW4gc2VsZi5fX2RpY3RfXy5pdGVyaXRlbXMoKV0KKyAgICByZXR1cm4gJyVzKCVzKScgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sICcsICcuam9pbihMKSkKKworICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICByZXR1cm4gaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pIGFuZCBzZWxmLl9fZGljdF9fID09IG90aGVyLl9fZGljdF9fCisKKyAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CisgICAgcmV0dXJuIG5vdCAoc2VsZiA9PSBvdGhlcikKKworY2xhc3MgZ2V0Q29tcG9uZW50UGFnZUluZm9fYXJnczoKKyAgIiIiCisgIEF0dHJpYnV0ZXM6CisgICAtIHRvcG9sb2d5X2lkCisgICAtIGNvbXBvbmVudF9pZAorICAgLSB3aW5kb3cKKyAgIC0gaXNfaW5jbHVkZV9zeXMKKyAgIiIiCisKKyAgdGhyaWZ0X3NwZWMgPSAoCisgICAgTm9uZSwgIyAwCisgICAgKDEsIFRUeXBlLlNUUklORywgJ3RvcG9sb2d5X2lkJywgTm9uZSwgTm9uZSwgKSwgIyAxCisgICAgKDIsIFRUeXBlLlNUUklORywgJ2NvbXBvbmVudF9pZCcsIE5vbmUsIE5vbmUsICksICMgMgorICAgICgzLCBUVHlwZS5TVFJJTkcsICd3aW5kb3cnLCBOb25lLCBOb25lLCApLCAjIDMKKyAgICAoNCwgVFR5cGUuQk9PTCwgJ2lzX2luY2x1ZGVfc3lzJywgTm9uZSwgTm9uZSwgKSwgIyA0CisgICkKKworICBkZWYgX19pbml0X18oc2VsZiwgdG9wb2xvZ3lfaWQ9Tm9uZSwgY29tcG9uZW50X2lkPU5vbmUsIHdpbmRvdz1Ob25lLCBpc19pbmNsdWRlX3N5cz1Ob25lLCk6CisgICAgc2VsZi50b3BvbG9neV9pZCA9IHRvcG9sb2d5X2lkCisgICAgc2VsZi5jb21wb25lbnRfaWQgPSBjb21wb25lbnRfaWQKKyAgICBzZWxmLndpbmRvdyA9IHdpbmRvdworICAgIHNlbGYuaXNfaW5jbHVkZV9zeXMgPSBpc19pbmNsdWRlX3N5cworCisgIGRlZiByZWFkKHNlbGYsIGlwcm90KToKKyAgICBpZiBpcHJvdC5fX2NsYXNzX18gPT0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIGFuZCBpc2luc3RhbmNlKGlwcm90LnRyYW5zLCBUVHJhbnNwb3J0LkNSZWFkYWJsZVRyYW5zcG9ydCkgYW5kIHNlbGYudGhyaWZ0X3NwZWMgaXMgbm90IE5vbmUgYW5kIGZhc3RiaW5hcnkgaXMgbm90IE5vbmU6CisgICAgICBmYXN0YmluYXJ5LmRlY29kZV9iaW5hcnkoc2VsZiwgaXByb3QudHJhbnMsIChzZWxmLl9fY2xhc3NfXywgc2VsZi50aHJpZnRfc3BlYykpCisgICAgICByZXR1cm4KKyAgICBpcHJvdC5yZWFkU3RydWN0QmVnaW4oKQorICAgIHdoaWxlIFRydWU6CisgICAgICAoZm5hbWUsIGZ0eXBlLCBmaWQpID0gaXByb3QucmVhZEZpZWxkQmVnaW4oKQorICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuU1RPUDoKKyAgICAgICAgYnJlYWsKKyAgICAgIGlmIGZpZCA9PSAxOgorICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5TVFJJTkc6CisgICAgICAgICAgc2VsZi50b3BvbG9neV9pZCA9IGlwcm90LnJlYWRTdHJpbmcoKS5kZWNvZGUoJ3V0Zi04JykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgZWxpZiBmaWQgPT0gMjoKKyAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuU1RSSU5HOgorICAgICAgICAgIHNlbGYuY29tcG9uZW50X2lkID0gaXByb3QucmVhZFN0cmluZygpLmRlY29kZSgndXRmLTgnKQorICAgICAgICBlbHNlOgorICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBlbGlmIGZpZCA9PSAzOgorICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5TVFJJTkc6CisgICAgICAgICAgc2VsZi53aW5kb3cgPSBpcHJvdC5yZWFkU3RyaW5nKCkuZGVjb2RlKCd1dGYtOCcpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgIGVsaWYgZmlkID09IDQ6CisgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLkJPT0w6CisgICAgICAgICAgc2VsZi5pc19pbmNsdWRlX3N5cyA9IGlwcm90LnJlYWRCb29sKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgZWxzZToKKyAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgIGlwcm90LnJlYWRGaWVsZEVuZCgpCisgICAgaXByb3QucmVhZFN0cnVjdEVuZCgpCisKKyAgZGVmIHdyaXRlKHNlbGYsIG9wcm90KToKKyAgICBpZiBvcHJvdC5fX2NsYXNzX18gPT0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIGFuZCBzZWxmLnRocmlmdF9zcGVjIGlzIG5vdCBOb25lIGFuZCBmYXN0YmluYXJ5IGlzIG5vdCBOb25lOgorICAgICAgb3Byb3QudHJhbnMud3JpdGUoZmFzdGJpbmFyeS5lbmNvZGVfYmluYXJ5KHNlbGYsIChzZWxmLl9fY2xhc3NfXywgc2VsZi50aHJpZnRfc3BlYykpKQorICAgICAgcmV0dXJuCisgICAgb3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbignZ2V0Q29tcG9uZW50UGFnZUluZm9fYXJncycpCisgICAgaWYgc2VsZi50b3BvbG9neV9pZCBpcyBub3QgTm9uZToKKyAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbigndG9wb2xvZ3lfaWQnLCBUVHlwZS5TVFJJTkcsIDEpCisgICAgICBvcHJvdC53cml0ZVN0cmluZyhzZWxmLnRvcG9sb2d5X2lkLmVuY29kZSgndXRmLTgnKSkKKyAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKQorICAgIGlmIHNlbGYuY29tcG9uZW50X2lkIGlzIG5vdCBOb25lOgorICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCdjb21wb25lbnRfaWQnLCBUVHlwZS5TVFJJTkcsIDIpCisgICAgICBvcHJvdC53cml0ZVN0cmluZyhzZWxmLmNvbXBvbmVudF9pZC5lbmNvZGUoJ3V0Zi04JykpCisgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKKyAgICBpZiBzZWxmLndpbmRvdyBpcyBub3QgTm9uZToKKyAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbignd2luZG93JywgVFR5cGUuU1RSSU5HLCAzKQorICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoc2VsZi53aW5kb3cuZW5jb2RlKCd1dGYtOCcpKQorICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCisgICAgaWYgc2VsZi5pc19pbmNsdWRlX3N5cyBpcyBub3QgTm9uZToKKyAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbignaXNfaW5jbHVkZV9zeXMnLCBUVHlwZS5CT09MLCA0KQorICAgICAgb3Byb3Qud3JpdGVCb29sKHNlbGYuaXNfaW5jbHVkZV9zeXMpCisgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKKyAgICBvcHJvdC53cml0ZUZpZWxkU3RvcCgpCisgICAgb3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKQorCisgIGRlZiB2YWxpZGF0ZShzZWxmKToKKyAgICByZXR1cm4KKworCisgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICB2YWx1ZSA9IDE3CisgICAgdmFsdWUgPSAodmFsdWUgKiAzMSkgXiBoYXNoKHNlbGYudG9wb2xvZ3lfaWQpCisgICAgdmFsdWUgPSAodmFsdWUgKiAzMSkgXiBoYXNoKHNlbGYuY29tcG9uZW50X2lkKQorICAgIHZhbHVlID0gKHZhbHVlICogMzEpIF4gaGFzaChzZWxmLndpbmRvdykKKyAgICB2YWx1ZSA9ICh2YWx1ZSAqIDMxKSBeIGhhc2goc2VsZi5pc19pbmNsdWRlX3N5cykKKyAgICByZXR1cm4gdmFsdWUKKworICBkZWYgX19yZXByX18oc2VsZik6CisgICAgTCA9IFsnJXM9JXInICUgKGtleSwgdmFsdWUpCisgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzZWxmLl9fZGljdF9fLml0ZXJpdGVtcygpXQorICAgIHJldHVybiAnJXMoJXMpJyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgJywgJy5qb2luKEwpKQorCisgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgIHJldHVybiBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXykgYW5kIHNlbGYuX19kaWN0X18gPT0gb3RoZXIuX19kaWN0X18KKworICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKKyAgICByZXR1cm4gbm90IChzZWxmID09IG90aGVyKQorCitjbGFzcyBnZXRDb21wb25lbnRQYWdlSW5mb19yZXN1bHQ6CisgICIiIgorICBBdHRyaWJ1dGVzOgorICAgLSBzdWNjZXNzCisgICAtIGUKKyAgIC0gYXplCisgICIiIgorCisgIHRocmlmdF9zcGVjID0gKAorICAgICgwLCBUVHlwZS5TVFJVQ1QsICdzdWNjZXNzJywgKENvbXBvbmVudFBhZ2VJbmZvLCBDb21wb25lbnRQYWdlSW5mby50aHJpZnRfc3BlYyksIE5vbmUsICksICMgMAorICAgICgxLCBUVHlwZS5TVFJVQ1QsICdlJywgKE5vdEFsaXZlRXhjZXB0aW9uLCBOb3RBbGl2ZUV4Y2VwdGlvbi50aHJpZnRfc3BlYyksIE5vbmUsICksICMgMQorICAgICgyLCBUVHlwZS5TVFJVQ1QsICdhemUnLCAoQXV0aG9yaXphdGlvbkV4Y2VwdGlvbiwgQXV0aG9yaXphdGlvbkV4Y2VwdGlvbi50aHJpZnRfc3BlYyksIE5vbmUsICksICMgMgorICApCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIHN1Y2Nlc3M9Tm9uZSwgZT1Ob25lLCBhemU9Tm9uZSwpOgorICAgIHNlbGYuc3VjY2VzcyA9IHN1Y2Nlc3MKKyAgICBzZWxmLmUgPSBlCisgICAgc2VsZi5hemUgPSBhemUKKworICBkZWYgcmVhZChzZWxmLCBpcHJvdCk6CisgICAgaWYgaXByb3QuX19jbGFzc19fID09IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCBhbmQgaXNpbnN0YW5jZShpcHJvdC50cmFucywgVFRyYW5zcG9ydC5DUmVhZGFibGVUcmFuc3BvcnQpIGFuZCBzZWxmLnRocmlmdF9zcGVjIGlzIG5vdCBOb25lIGFuZCBmYXN0YmluYXJ5IGlzIG5vdCBOb25lOgorICAgICAgZmFzdGJpbmFyeS5kZWNvZGVfYmluYXJ5KHNlbGYsIGlwcm90LnRyYW5zLCAoc2VsZi5fX2NsYXNzX18sIHNlbGYudGhyaWZ0X3NwZWMpKQorICAgICAgcmV0dXJuCisgICAgaXByb3QucmVhZFN0cnVjdEJlZ2luKCkKKyAgICB3aGlsZSBUcnVlOgorICAgICAgKGZuYW1lLCBmdHlwZSwgZmlkKSA9IGlwcm90LnJlYWRGaWVsZEJlZ2luKCkKKyAgICAgIGlmIGZ0eXBlID09IFRUeXBlLlNUT1A6CisgICAgICAgIGJyZWFrCisgICAgICBpZiBmaWQgPT0gMDoKKyAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuU1RSVUNUOgorICAgICAgICAgIHNlbGYuc3VjY2VzcyA9IENvbXBvbmVudFBhZ2VJbmZvKCkKKyAgICAgICAgICBzZWxmLnN1Y2Nlc3MucmVhZChpcHJvdCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgZWxpZiBmaWQgPT0gMToKKyAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuU1RSVUNUOgorICAgICAgICAgIHNlbGYuZSA9IE5vdEFsaXZlRXhjZXB0aW9uKCkKKyAgICAgICAgICBzZWxmLmUucmVhZChpcHJvdCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgZWxpZiBmaWQgPT0gMjoKKyAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuU1RSVUNUOgorICAgICAgICAgIHNlbGYuYXplID0gQXV0aG9yaXphdGlvbkV4Y2VwdGlvbigpCisgICAgICAgICAgc2VsZi5hemUucmVhZChpcHJvdCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgZWxzZToKKyAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgIGlwcm90LnJlYWRGaWVsZEVuZCgpCisgICAgaXByb3QucmVhZFN0cnVjdEVuZCgpCisKKyAgZGVmIHdyaXRlKHNlbGYsIG9wcm90KToKKyAgICBpZiBvcHJvdC5fX2NsYXNzX18gPT0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIGFuZCBzZWxmLnRocmlmdF9zcGVjIGlzIG5vdCBOb25lIGFuZCBmYXN0YmluYXJ5IGlzIG5vdCBOb25lOgorICAgICAgb3Byb3QudHJhbnMud3JpdGUoZmFzdGJpbmFyeS5lbmNvZGVfYmluYXJ5KHNlbGYsIChzZWxmLl9fY2xhc3NfXywgc2VsZi50aHJpZnRfc3BlYykpKQorICAgICAgcmV0dXJuCisgICAgb3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbignZ2V0Q29tcG9uZW50UGFnZUluZm9fcmVzdWx0JykKKyAgICBpZiBzZWxmLnN1Y2Nlc3MgaXMgbm90IE5vbmU6CisgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ3N1Y2Nlc3MnLCBUVHlwZS5TVFJVQ1QsIDApCisgICAgICBzZWxmLnN1Y2Nlc3Mud3JpdGUob3Byb3QpCisgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKKyAgICBpZiBzZWxmLmUgaXMgbm90IE5vbmU6CisgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ2UnLCBUVHlwZS5TVFJVQ1QsIDEpCisgICAgICBzZWxmLmUud3JpdGUob3Byb3QpCisgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKKyAgICBpZiBzZWxmLmF6ZSBpcyBub3QgTm9uZToKKyAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbignYXplJywgVFR5cGUuU1RSVUNULCAyKQorICAgICAgc2VsZi5hemUud3JpdGUob3Byb3QpCisgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKKyAgICBvcHJvdC53cml0ZUZpZWxkU3RvcCgpCisgICAgb3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKQorCisgIGRlZiB2YWxpZGF0ZShzZWxmKToKKyAgICByZXR1cm4KKworCisgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICB2YWx1ZSA9IDE3CisgICAgdmFsdWUgPSAodmFsdWUgKiAzMSkgXiBoYXNoKHNlbGYuc3VjY2VzcykKKyAgICB2YWx1ZSA9ICh2YWx1ZSAqIDMxKSBeIGhhc2goc2VsZi5lKQorICAgIHZhbHVlID0gKHZhbHVlICogMzEpIF4gaGFzaChzZWxmLmF6ZSkKKyAgICByZXR1cm4gdmFsdWUKKworICBkZWYgX19yZXByX18oc2VsZik6CisgICAgTCA9IFsnJXM9JXInICUgKGtleSwgdmFsdWUpCisgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzZWxmLl9fZGljdF9fLml0ZXJpdGVtcygpXQorICAgIHJldHVybiAnJXMoJXMpJyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgJywgJy5qb2luKEwpKQorCisgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgIHJldHVybiBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXykgYW5kIHNlbGYuX19kaWN0X18gPT0gb3RoZXIuX19kaWN0X18KKworICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKKyAgICByZXR1cm4gbm90IChzZWxmID09IG90aGVyKQorCiBjbGFzcyBnZXRUb3BvbG9neUNvbmZfYXJnczoKICAgIiIiCiAgIEF0dHJpYnV0ZXM6CkBAIC00NTg0LDMgKzYxNDksMTQ3IEBACiAKICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgcmV0dXJuIG5vdCAoc2VsZiA9PSBvdGhlcikKKworY2xhc3MgZ2V0VG9wb2xvZ3lIaXN0b3J5X2FyZ3M6CisgICIiIgorICBBdHRyaWJ1dGVzOgorICAgLSB1c2VyCisgICIiIgorCisgIHRocmlmdF9zcGVjID0gKAorICAgIE5vbmUsICMgMAorICAgICgxLCBUVHlwZS5TVFJJTkcsICd1c2VyJywgTm9uZSwgTm9uZSwgKSwgIyAxCisgICkKKworICBkZWYgX19pbml0X18oc2VsZiwgdXNlcj1Ob25lLCk6CisgICAgc2VsZi51c2VyID0gdXNlcgorCisgIGRlZiByZWFkKHNlbGYsIGlwcm90KToKKyAgICBpZiBpcHJvdC5fX2NsYXNzX18gPT0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIGFuZCBpc2luc3RhbmNlKGlwcm90LnRyYW5zLCBUVHJhbnNwb3J0LkNSZWFkYWJsZVRyYW5zcG9ydCkgYW5kIHNlbGYudGhyaWZ0X3NwZWMgaXMgbm90IE5vbmUgYW5kIGZhc3RiaW5hcnkgaXMgbm90IE5vbmU6CisgICAgICBmYXN0YmluYXJ5LmRlY29kZV9iaW5hcnkoc2VsZiwgaXByb3QudHJhbnMsIChzZWxmLl9fY2xhc3NfXywgc2VsZi50aHJpZnRfc3BlYykpCisgICAgICByZXR1cm4KKyAgICBpcHJvdC5yZWFkU3RydWN0QmVnaW4oKQorICAgIHdoaWxlIFRydWU6CisgICAgICAoZm5hbWUsIGZ0eXBlLCBmaWQpID0gaXByb3QucmVhZEZpZWxkQmVnaW4oKQorICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuU1RPUDoKKyAgICAgICAgYnJlYWsKKyAgICAgIGlmIGZpZCA9PSAxOgorICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5TVFJJTkc6CisgICAgICAgICAgc2VsZi51c2VyID0gaXByb3QucmVhZFN0cmluZygpLmRlY29kZSgndXRmLTgnKQorICAgICAgICBlbHNlOgorICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBlbHNlOgorICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgaXByb3QucmVhZEZpZWxkRW5kKCkKKyAgICBpcHJvdC5yZWFkU3RydWN0RW5kKCkKKworICBkZWYgd3JpdGUoc2VsZiwgb3Byb3QpOgorICAgIGlmIG9wcm90Ll9fY2xhc3NfXyA9PSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgYW5kIHNlbGYudGhyaWZ0X3NwZWMgaXMgbm90IE5vbmUgYW5kIGZhc3RiaW5hcnkgaXMgbm90IE5vbmU6CisgICAgICBvcHJvdC50cmFucy53cml0ZShmYXN0YmluYXJ5LmVuY29kZV9iaW5hcnkoc2VsZiwgKHNlbGYuX19jbGFzc19fLCBzZWxmLnRocmlmdF9zcGVjKSkpCisgICAgICByZXR1cm4KKyAgICBvcHJvdC53cml0ZVN0cnVjdEJlZ2luKCdnZXRUb3BvbG9neUhpc3RvcnlfYXJncycpCisgICAgaWYgc2VsZi51c2VyIGlzIG5vdCBOb25lOgorICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCd1c2VyJywgVFR5cGUuU1RSSU5HLCAxKQorICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoc2VsZi51c2VyLmVuY29kZSgndXRmLTgnKSkKKyAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKQorICAgIG9wcm90LndyaXRlRmllbGRTdG9wKCkKKyAgICBvcHJvdC53cml0ZVN0cnVjdEVuZCgpCisKKyAgZGVmIHZhbGlkYXRlKHNlbGYpOgorICAgIHJldHVybgorCisKKyAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgIHZhbHVlID0gMTcKKyAgICB2YWx1ZSA9ICh2YWx1ZSAqIDMxKSBeIGhhc2goc2VsZi51c2VyKQorICAgIHJldHVybiB2YWx1ZQorCisgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICBMID0gWyclcz0lcicgJSAoa2V5LCB2YWx1ZSkKKyAgICAgIGZvciBrZXksIHZhbHVlIGluIHNlbGYuX19kaWN0X18uaXRlcml0ZW1zKCldCisgICAgcmV0dXJuICclcyglcyknICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCAnLCAnLmpvaW4oTCkpCisKKyAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgcmV0dXJuIGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKSBhbmQgc2VsZi5fX2RpY3RfXyA9PSBvdGhlci5fX2RpY3RfXworCisgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgorICAgIHJldHVybiBub3QgKHNlbGYgPT0gb3RoZXIpCisKK2NsYXNzIGdldFRvcG9sb2d5SGlzdG9yeV9yZXN1bHQ6CisgICIiIgorICBBdHRyaWJ1dGVzOgorICAgLSBzdWNjZXNzCisgICAtIGF6ZQorICAiIiIKKworICB0aHJpZnRfc3BlYyA9ICgKKyAgICAoMCwgVFR5cGUuU1RSVUNULCAnc3VjY2VzcycsIChUb3BvbG9neUhpc3RvcnlJbmZvLCBUb3BvbG9neUhpc3RvcnlJbmZvLnRocmlmdF9zcGVjKSwgTm9uZSwgKSwgIyAwCisgICAgKDEsIFRUeXBlLlNUUlVDVCwgJ2F6ZScsIChBdXRob3JpemF0aW9uRXhjZXB0aW9uLCBBdXRob3JpemF0aW9uRXhjZXB0aW9uLnRocmlmdF9zcGVjKSwgTm9uZSwgKSwgIyAxCisgICkKKworICBkZWYgX19pbml0X18oc2VsZiwgc3VjY2Vzcz1Ob25lLCBhemU9Tm9uZSwpOgorICAgIHNlbGYuc3VjY2VzcyA9IHN1Y2Nlc3MKKyAgICBzZWxmLmF6ZSA9IGF6ZQorCisgIGRlZiByZWFkKHNlbGYsIGlwcm90KToKKyAgICBpZiBpcHJvdC5fX2NsYXNzX18gPT0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIGFuZCBpc2luc3RhbmNlKGlwcm90LnRyYW5zLCBUVHJhbnNwb3J0LkNSZWFkYWJsZVRyYW5zcG9ydCkgYW5kIHNlbGYudGhyaWZ0X3NwZWMgaXMgbm90IE5vbmUgYW5kIGZhc3RiaW5hcnkgaXMgbm90IE5vbmU6CisgICAgICBmYXN0YmluYXJ5LmRlY29kZV9iaW5hcnkoc2VsZiwgaXByb3QudHJhbnMsIChzZWxmLl9fY2xhc3NfXywgc2VsZi50aHJpZnRfc3BlYykpCisgICAgICByZXR1cm4KKyAgICBpcHJvdC5yZWFkU3RydWN0QmVnaW4oKQorICAgIHdoaWxlIFRydWU6CisgICAgICAoZm5hbWUsIGZ0eXBlLCBmaWQpID0gaXByb3QucmVhZEZpZWxkQmVnaW4oKQorICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuU1RPUDoKKyAgICAgICAgYnJlYWsKKyAgICAgIGlmIGZpZCA9PSAwOgorICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5TVFJVQ1Q6CisgICAgICAgICAgc2VsZi5zdWNjZXNzID0gVG9wb2xvZ3lIaXN0b3J5SW5mbygpCisgICAgICAgICAgc2VsZi5zdWNjZXNzLnJlYWQoaXByb3QpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgIGVsaWYgZmlkID09IDE6CisgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLlNUUlVDVDoKKyAgICAgICAgICBzZWxmLmF6ZSA9IEF1dGhvcml6YXRpb25FeGNlcHRpb24oKQorICAgICAgICAgIHNlbGYuYXplLnJlYWQoaXByb3QpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgIGVsc2U6CisgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBpcHJvdC5yZWFkRmllbGRFbmQoKQorICAgIGlwcm90LnJlYWRTdHJ1Y3RFbmQoKQorCisgIGRlZiB3cml0ZShzZWxmLCBvcHJvdCk6CisgICAgaWYgb3Byb3QuX19jbGFzc19fID09IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCBhbmQgc2VsZi50aHJpZnRfc3BlYyBpcyBub3QgTm9uZSBhbmQgZmFzdGJpbmFyeSBpcyBub3QgTm9uZToKKyAgICAgIG9wcm90LnRyYW5zLndyaXRlKGZhc3RiaW5hcnkuZW5jb2RlX2JpbmFyeShzZWxmLCAoc2VsZi5fX2NsYXNzX18sIHNlbGYudGhyaWZ0X3NwZWMpKSkKKyAgICAgIHJldHVybgorICAgIG9wcm90LndyaXRlU3RydWN0QmVnaW4oJ2dldFRvcG9sb2d5SGlzdG9yeV9yZXN1bHQnKQorICAgIGlmIHNlbGYuc3VjY2VzcyBpcyBub3QgTm9uZToKKyAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbignc3VjY2VzcycsIFRUeXBlLlNUUlVDVCwgMCkKKyAgICAgIHNlbGYuc3VjY2Vzcy53cml0ZShvcHJvdCkKKyAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKQorICAgIGlmIHNlbGYuYXplIGlzIG5vdCBOb25lOgorICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCdhemUnLCBUVHlwZS5TVFJVQ1QsIDEpCisgICAgICBzZWxmLmF6ZS53cml0ZShvcHJvdCkKKyAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKQorICAgIG9wcm90LndyaXRlRmllbGRTdG9wKCkKKyAgICBvcHJvdC53cml0ZVN0cnVjdEVuZCgpCisKKyAgZGVmIHZhbGlkYXRlKHNlbGYpOgorICAgIHJldHVybgorCisKKyAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgIHZhbHVlID0gMTcKKyAgICB2YWx1ZSA9ICh2YWx1ZSAqIDMxKSBeIGhhc2goc2VsZi5zdWNjZXNzKQorICAgIHZhbHVlID0gKHZhbHVlICogMzEpIF4gaGFzaChzZWxmLmF6ZSkKKyAgICByZXR1cm4gdmFsdWUKKworICBkZWYgX19yZXByX18oc2VsZik6CisgICAgTCA9IFsnJXM9JXInICUgKGtleSwgdmFsdWUpCisgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzZWxmLl9fZGljdF9fLml0ZXJpdGVtcygpXQorICAgIHJldHVybiAnJXMoJXMpJyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgJywgJy5qb2luKEwpKQorCisgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgIHJldHVybiBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXykgYW5kIHNlbGYuX19kaWN0X18gPT0gb3RoZXIuX19kaWN0X18KKworICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKKyAgICByZXR1cm4gbm90IChzZWxmID09IG90aGVyKQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvcHkvc3Rvcm0vY29uc3RhbnRzLnB5IGIvc3Rvcm0tY29yZS9zcmMvcHkvc3Rvcm0vY29uc3RhbnRzLnB5CmluZGV4IDNmMGM2NGEuLmI0MDNmOTcgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL3B5L3N0b3JtL2NvbnN0YW50cy5weQorKysgYi9zdG9ybS1jb3JlL3NyYy9weS9zdG9ybS9jb25zdGFudHMucHkKQEAgLTE3LDcgKzE3LDcgQEAKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICMKLSMgQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4yKQorIyBBdXRvZ2VuZXJhdGVkIGJ5IFRocmlmdCBDb21waWxlciAoMC45LjMpCiAjCiAjIERPIE5PVCBFRElUIFVOTEVTUyBZT1UgQVJFIFNVUkUgVEhBVCBZT1UgS05PVyBXSEFUIFlPVSBBUkUgRE9JTkcKICMKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL3B5L3N0b3JtL3R0eXBlcy5weSBiL3N0b3JtLWNvcmUvc3JjL3B5L3N0b3JtL3R0eXBlcy5weQppbmRleCA0ZjQ4NDQ5Li5hNzMwYzEzIDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy9weS9zdG9ybS90dHlwZXMucHkKKysrIGIvc3Rvcm0tY29yZS9zcmMvcHkvc3Rvcm0vdHR5cGVzLnB5CkBAIC0xNyw3ICsxNyw3IEBACiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjCi0jIEF1dG9nZW5lcmF0ZWQgYnkgVGhyaWZ0IENvbXBpbGVyICgwLjkuMikKKyMgQXV0b2dlbmVyYXRlZCBieSBUaHJpZnQgQ29tcGlsZXIgKDAuOS4zKQogIwogIyBETyBOT1QgRURJVCBVTkxFU1MgWU9VIEFSRSBTVVJFIFRIQVQgWU9VIEtOT1cgV0hBVCBZT1UgQVJFIERPSU5HCiAjCkBAIC0zNCw2ICszNCwyMCBAQAogICBmYXN0YmluYXJ5ID0gTm9uZQogCiAKK2NsYXNzIENvbXBvbmVudFR5cGU6CisgIEJPTFQgPSAxCisgIFNQT1VUID0gMgorCisgIF9WQUxVRVNfVE9fTkFNRVMgPSB7CisgICAgMTogIkJPTFQiLAorICAgIDI6ICJTUE9VVCIsCisgIH0KKworICBfTkFNRVNfVE9fVkFMVUVTID0geworICAgICJCT0xUIjogMSwKKyAgICAiU1BPVVQiOiAyLAorICB9CisKIGNsYXNzIFRvcG9sb2d5SW5pdGlhbFN0YXR1czoKICAgQUNUSVZFID0gMQogICBJTkFDVElWRSA9IDIKQEAgLTg1LDYgKzk5LDExNCBAQAogICAgICJPTkUiOiAyLAogICB9CiAKK2NsYXNzIFByb2ZpbGVBY3Rpb246CisgIEpQUk9GSUxFX1NUT1AgPSAwCisgIEpQUk9GSUxFX1NUQVJUID0gMQorICBKUFJPRklMRV9EVU1QID0gMgorICBKTUFQX0RVTVAgPSAzCisgIEpTVEFDS19EVU1QID0gNAorICBKVk1fUkVTVEFSVCA9IDUKKworICBfVkFMVUVTX1RPX05BTUVTID0geworICAgIDA6ICJKUFJPRklMRV9TVE9QIiwKKyAgICAxOiAiSlBST0ZJTEVfU1RBUlQiLAorICAgIDI6ICJKUFJPRklMRV9EVU1QIiwKKyAgICAzOiAiSk1BUF9EVU1QIiwKKyAgICA0OiAiSlNUQUNLX0RVTVAiLAorICAgIDU6ICJKVk1fUkVTVEFSVCIsCisgIH0KKworICBfTkFNRVNfVE9fVkFMVUVTID0geworICAgICJKUFJPRklMRV9TVE9QIjogMCwKKyAgICAiSlBST0ZJTEVfU1RBUlQiOiAxLAorICAgICJKUFJPRklMRV9EVU1QIjogMiwKKyAgICAiSk1BUF9EVU1QIjogMywKKyAgICAiSlNUQUNLX0RVTVAiOiA0LAorICAgICJKVk1fUkVTVEFSVCI6IDUsCisgIH0KKworY2xhc3MgTG9nTGV2ZWxBY3Rpb246CisgIFVOQ0hBTkdFRCA9IDEKKyAgVVBEQVRFID0gMgorICBSRU1PVkUgPSAzCisKKyAgX1ZBTFVFU19UT19OQU1FUyA9IHsKKyAgICAxOiAiVU5DSEFOR0VEIiwKKyAgICAyOiAiVVBEQVRFIiwKKyAgICAzOiAiUkVNT1ZFIiwKKyAgfQorCisgIF9OQU1FU19UT19WQUxVRVMgPSB7CisgICAgIlVOQ0hBTkdFRCI6IDEsCisgICAgIlVQREFURSI6IDIsCisgICAgIlJFTU9WRSI6IDMsCisgIH0KKworY2xhc3MgSEJTZXJ2ZXJNZXNzYWdlVHlwZToKKyAgQ1JFQVRFX1BBVEggPSAwCisgIENSRUFURV9QQVRIX1JFU1BPTlNFID0gMQorICBFWElTVFMgPSAyCisgIEVYSVNUU19SRVNQT05TRSA9IDMKKyAgU0VORF9QVUxTRSA9IDQKKyAgU0VORF9QVUxTRV9SRVNQT05TRSA9IDUKKyAgR0VUX0FMTF9QVUxTRV9GT1JfUEFUSCA9IDYKKyAgR0VUX0FMTF9QVUxTRV9GT1JfUEFUSF9SRVNQT05TRSA9IDcKKyAgR0VUX0FMTF9OT0RFU19GT1JfUEFUSCA9IDgKKyAgR0VUX0FMTF9OT0RFU19GT1JfUEFUSF9SRVNQT05TRSA9IDkKKyAgR0VUX1BVTFNFID0gMTAKKyAgR0VUX1BVTFNFX1JFU1BPTlNFID0gMTEKKyAgREVMRVRFX1BBVEggPSAxMgorICBERUxFVEVfUEFUSF9SRVNQT05TRSA9IDEzCisgIERFTEVURV9QVUxTRV9JRCA9IDE0CisgIERFTEVURV9QVUxTRV9JRF9SRVNQT05TRSA9IDE1CisgIENPTlRST0xfTUVTU0FHRSA9IDE2CisgIFNBU0xfTUVTU0FHRV9UT0tFTiA9IDE3CisgIE5PVF9BVVRIT1JJWkVEID0gMTgKKworICBfVkFMVUVTX1RPX05BTUVTID0geworICAgIDA6ICJDUkVBVEVfUEFUSCIsCisgICAgMTogIkNSRUFURV9QQVRIX1JFU1BPTlNFIiwKKyAgICAyOiAiRVhJU1RTIiwKKyAgICAzOiAiRVhJU1RTX1JFU1BPTlNFIiwKKyAgICA0OiAiU0VORF9QVUxTRSIsCisgICAgNTogIlNFTkRfUFVMU0VfUkVTUE9OU0UiLAorICAgIDY6ICJHRVRfQUxMX1BVTFNFX0ZPUl9QQVRIIiwKKyAgICA3OiAiR0VUX0FMTF9QVUxTRV9GT1JfUEFUSF9SRVNQT05TRSIsCisgICAgODogIkdFVF9BTExfTk9ERVNfRk9SX1BBVEgiLAorICAgIDk6ICJHRVRfQUxMX05PREVTX0ZPUl9QQVRIX1JFU1BPTlNFIiwKKyAgICAxMDogIkdFVF9QVUxTRSIsCisgICAgMTE6ICJHRVRfUFVMU0VfUkVTUE9OU0UiLAorICAgIDEyOiAiREVMRVRFX1BBVEgiLAorICAgIDEzOiAiREVMRVRFX1BBVEhfUkVTUE9OU0UiLAorICAgIDE0OiAiREVMRVRFX1BVTFNFX0lEIiwKKyAgICAxNTogIkRFTEVURV9QVUxTRV9JRF9SRVNQT05TRSIsCisgICAgMTY6ICJDT05UUk9MX01FU1NBR0UiLAorICAgIDE3OiAiU0FTTF9NRVNTQUdFX1RPS0VOIiwKKyAgICAxODogIk5PVF9BVVRIT1JJWkVEIiwKKyAgfQorCisgIF9OQU1FU19UT19WQUxVRVMgPSB7CisgICAgIkNSRUFURV9QQVRIIjogMCwKKyAgICAiQ1JFQVRFX1BBVEhfUkVTUE9OU0UiOiAxLAorICAgICJFWElTVFMiOiAyLAorICAgICJFWElTVFNfUkVTUE9OU0UiOiAzLAorICAgICJTRU5EX1BVTFNFIjogNCwKKyAgICAiU0VORF9QVUxTRV9SRVNQT05TRSI6IDUsCisgICAgIkdFVF9BTExfUFVMU0VfRk9SX1BBVEgiOiA2LAorICAgICJHRVRfQUxMX1BVTFNFX0ZPUl9QQVRIX1JFU1BPTlNFIjogNywKKyAgICAiR0VUX0FMTF9OT0RFU19GT1JfUEFUSCI6IDgsCisgICAgIkdFVF9BTExfTk9ERVNfRk9SX1BBVEhfUkVTUE9OU0UiOiA5LAorICAgICJHRVRfUFVMU0UiOiAxMCwKKyAgICAiR0VUX1BVTFNFX1JFU1BPTlNFIjogMTEsCisgICAgIkRFTEVURV9QQVRIIjogMTIsCisgICAgIkRFTEVURV9QQVRIX1JFU1BPTlNFIjogMTMsCisgICAgIkRFTEVURV9QVUxTRV9JRCI6IDE0LAorICAgICJERUxFVEVfUFVMU0VfSURfUkVTUE9OU0UiOiAxNSwKKyAgICAiQ09OVFJPTF9NRVNTQUdFIjogMTYsCisgICAgIlNBU0xfTUVTU0FHRV9UT0tFTiI6IDE3LAorICAgICJOT1RfQVVUSE9SSVpFRCI6IDE4LAorICB9CisKIAogY2xhc3MgSmF2YU9iamVjdEFyZzoKICAgIiIiCkBAIC0xMjYsMTIgKzI0OCwxMiBAQAogICAgICAgICBicmVhawogICAgICAgaWYgZmlkID09IDE6CiAgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLkkzMjoKLSAgICAgICAgICBzZWxmLmludF9hcmcgPSBpcHJvdC5yZWFkSTMyKCk7CisgICAgICAgICAgc2VsZi5pbnRfYXJnID0gaXByb3QucmVhZEkzMigpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKICAgICAgIGVsaWYgZmlkID09IDI6CiAgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLkk2NDoKLSAgICAgICAgICBzZWxmLmxvbmdfYXJnID0gaXByb3QucmVhZEk2NCgpOworICAgICAgICAgIHNlbGYubG9uZ19hcmcgPSBpcHJvdC5yZWFkSTY0KCkKICAgICAgICAgZWxzZToKICAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQogICAgICAgZWxpZiBmaWQgPT0gMzoKQEAgLTE0MSwxNyArMjYzLDE3IEBACiAgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKICAgICAgIGVsaWYgZmlkID09IDQ6CiAgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLkJPT0w6Ci0gICAgICAgICAgc2VsZi5ib29sX2FyZyA9IGlwcm90LnJlYWRCb29sKCk7CisgICAgICAgICAgc2VsZi5ib29sX2FyZyA9IGlwcm90LnJlYWRCb29sKCkKICAgICAgICAgZWxzZToKICAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQogICAgICAgZWxpZiBmaWQgPT0gNToKICAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuU1RSSU5HOgotICAgICAgICAgIHNlbGYuYmluYXJ5X2FyZyA9IGlwcm90LnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICBzZWxmLmJpbmFyeV9hcmcgPSBpcHJvdC5yZWFkU3RyaW5nKCkKICAgICAgICAgZWxzZToKICAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQogICAgICAgZWxpZiBmaWQgPT0gNjoKICAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuRE9VQkxFOgotICAgICAgICAgIHNlbGYuZG91YmxlX2FyZyA9IGlwcm90LnJlYWREb3VibGUoKTsKKyAgICAgICAgICBzZWxmLmRvdWJsZV9hcmcgPSBpcHJvdC5yZWFkRG91YmxlKCkKICAgICAgICAgZWxzZToKICAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQogICAgICAgZWxzZToKQEAgLTUyMSw3ICs2NDMsNyBAQAogICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCiAgICAgICBlbGlmIGZpZCA9PSA3OgogICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5TVFJJTkc6Ci0gICAgICAgICAgc2VsZi5jdXN0b21fc2VyaWFsaXplZCA9IGlwcm90LnJlYWRTdHJpbmcoKTsKKyAgICAgICAgICBzZWxmLmN1c3RvbV9zZXJpYWxpemVkID0gaXByb3QucmVhZFN0cmluZygpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKICAgICAgIGVsaWYgZmlkID09IDg6CkBAIC02NDMsNyArNzY1LDcgQEAKICAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQogICAgICAgZWxpZiBmaWQgPT0gMjoKICAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuQk9PTDoKLSAgICAgICAgICBzZWxmLmRpcmVjdCA9IGlwcm90LnJlYWRCb29sKCk7CisgICAgICAgICAgc2VsZi5kaXJlY3QgPSBpcHJvdC5yZWFkQm9vbCgpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKICAgICAgIGVsc2U6CkBAIC04MDQsNyArOTI2LDcgQEAKICAgICAgICAgYnJlYWsKICAgICAgIGlmIGZpZCA9PSAxOgogICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5TVFJJTkc6Ci0gICAgICAgICAgc2VsZi5zZXJpYWxpemVkX2phdmEgPSBpcHJvdC5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgc2VsZi5zZXJpYWxpemVkX2phdmEgPSBpcHJvdC5yZWFkU3RyaW5nKCkKICAgICAgICAgZWxzZToKICAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQogICAgICAgZWxpZiBmaWQgPT0gMjoKQEAgLTkyNSw3ICsxMDQ3LDcgQEAKICAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQogICAgICAgZWxpZiBmaWQgPT0gMzoKICAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuSTMyOgotICAgICAgICAgIHNlbGYucGFyYWxsZWxpc21faGludCA9IGlwcm90LnJlYWRJMzIoKTsKKyAgICAgICAgICBzZWxmLnBhcmFsbGVsaXNtX2hpbnQgPSBpcHJvdC5yZWFkSTMyKCkKICAgICAgICAgZWxzZToKICAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQogICAgICAgZWxpZiBmaWQgPT0gNDoKQEAgLTEyNTUsNiArMTM3Nyw3IEBACiAgICAtIHNwb3V0cwogICAgLSBib2x0cwogICAgLSBzdGF0ZV9zcG91dHMKKyAgIC0gd29ya2VyX2hvb2tzCiAgICIiIgogCiAgIHRocmlmdF9zcGVjID0gKApAQCAtMTI2MiwxMiArMTM4NSwxNCBAQAogICAgICgxLCBUVHlwZS5NQVAsICdzcG91dHMnLCAoVFR5cGUuU1RSSU5HLE5vbmUsVFR5cGUuU1RSVUNULChTcG91dFNwZWMsIFNwb3V0U3BlYy50aHJpZnRfc3BlYykpLCBOb25lLCApLCAjIDEKICAgICAoMiwgVFR5cGUuTUFQLCAnYm9sdHMnLCAoVFR5cGUuU1RSSU5HLE5vbmUsVFR5cGUuU1RSVUNULChCb2x0LCBCb2x0LnRocmlmdF9zcGVjKSksIE5vbmUsICksICMgMgogICAgICgzLCBUVHlwZS5NQVAsICdzdGF0ZV9zcG91dHMnLCAoVFR5cGUuU1RSSU5HLE5vbmUsVFR5cGUuU1RSVUNULChTdGF0ZVNwb3V0U3BlYywgU3RhdGVTcG91dFNwZWMudGhyaWZ0X3NwZWMpKSwgTm9uZSwgKSwgIyAzCisgICAgKDQsIFRUeXBlLkxJU1QsICd3b3JrZXJfaG9va3MnLCAoVFR5cGUuU1RSSU5HLE5vbmUpLCBOb25lLCApLCAjIDQKICAgKQogCi0gIGRlZiBfX2luaXRfXyhzZWxmLCBzcG91dHM9Tm9uZSwgYm9sdHM9Tm9uZSwgc3RhdGVfc3BvdXRzPU5vbmUsKToKKyAgZGVmIF9faW5pdF9fKHNlbGYsIHNwb3V0cz1Ob25lLCBib2x0cz1Ob25lLCBzdGF0ZV9zcG91dHM9Tm9uZSwgd29ya2VyX2hvb2tzPU5vbmUsKToKICAgICBzZWxmLnNwb3V0cyA9IHNwb3V0cwogICAgIHNlbGYuYm9sdHMgPSBib2x0cwogICAgIHNlbGYuc3RhdGVfc3BvdXRzID0gc3RhdGVfc3BvdXRzCisgICAgc2VsZi53b3JrZXJfaG9va3MgPSB3b3JrZXJfaG9va3MKIAogICBkZWYgcmVhZChzZWxmLCBpcHJvdCk6CiAgICAgaWYgaXByb3QuX19jbGFzc19fID09IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCBhbmQgaXNpbnN0YW5jZShpcHJvdC50cmFucywgVFRyYW5zcG9ydC5DUmVhZGFibGVUcmFuc3BvcnQpIGFuZCBzZWxmLnRocmlmdF9zcGVjIGlzIG5vdCBOb25lIGFuZCBmYXN0YmluYXJ5IGlzIG5vdCBOb25lOgpAQCAtMTMxNCw2ICsxNDM5LDE2IEBACiAgICAgICAgICAgaXByb3QucmVhZE1hcEVuZCgpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgIGVsaWYgZmlkID09IDQ6CisgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLkxJU1Q6CisgICAgICAgICAgc2VsZi53b3JrZXJfaG9va3MgPSBbXQorICAgICAgICAgIChfZXR5cGU2MywgX3NpemU2MCkgPSBpcHJvdC5yZWFkTGlzdEJlZ2luKCkKKyAgICAgICAgICBmb3IgX2k2NCBpbiB4cmFuZ2UoX3NpemU2MCk6CisgICAgICAgICAgICBfZWxlbTY1ID0gaXByb3QucmVhZFN0cmluZygpCisgICAgICAgICAgICBzZWxmLndvcmtlcl9ob29rcy5hcHBlbmQoX2VsZW02NSkKKyAgICAgICAgICBpcHJvdC5yZWFkTGlzdEVuZCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKICAgICAgIGVsc2U6CiAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCiAgICAgICBpcHJvdC5yZWFkRmllbGRFbmQoKQpAQCAtMTMyNywyNyArMTQ2MiwzNCBAQAogICAgIGlmIHNlbGYuc3BvdXRzIGlzIG5vdCBOb25lOgogICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCdzcG91dHMnLCBUVHlwZS5NQVAsIDEpCiAgICAgICBvcHJvdC53cml0ZU1hcEJlZ2luKFRUeXBlLlNUUklORywgVFR5cGUuU1RSVUNULCBsZW4oc2VsZi5zcG91dHMpKQotICAgICAgZm9yIGtpdGVyNjAsdml0ZXI2MSBpbiBzZWxmLnNwb3V0cy5pdGVtcygpOgotICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhraXRlcjYwLmVuY29kZSgndXRmLTgnKSkKLSAgICAgICAgdml0ZXI2MS53cml0ZShvcHJvdCkKKyAgICAgIGZvciBraXRlcjY2LHZpdGVyNjcgaW4gc2VsZi5zcG91dHMuaXRlbXMoKToKKyAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoa2l0ZXI2Ni5lbmNvZGUoJ3V0Zi04JykpCisgICAgICAgIHZpdGVyNjcud3JpdGUob3Byb3QpCiAgICAgICBvcHJvdC53cml0ZU1hcEVuZCgpCiAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKICAgICBpZiBzZWxmLmJvbHRzIGlzIG5vdCBOb25lOgogICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCdib2x0cycsIFRUeXBlLk1BUCwgMikKICAgICAgIG9wcm90LndyaXRlTWFwQmVnaW4oVFR5cGUuU1RSSU5HLCBUVHlwZS5TVFJVQ1QsIGxlbihzZWxmLmJvbHRzKSkKLSAgICAgIGZvciBraXRlcjYyLHZpdGVyNjMgaW4gc2VsZi5ib2x0cy5pdGVtcygpOgotICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhraXRlcjYyLmVuY29kZSgndXRmLTgnKSkKLSAgICAgICAgdml0ZXI2My53cml0ZShvcHJvdCkKKyAgICAgIGZvciBraXRlcjY4LHZpdGVyNjkgaW4gc2VsZi5ib2x0cy5pdGVtcygpOgorICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhraXRlcjY4LmVuY29kZSgndXRmLTgnKSkKKyAgICAgICAgdml0ZXI2OS53cml0ZShvcHJvdCkKICAgICAgIG9wcm90LndyaXRlTWFwRW5kKCkKICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKQogICAgIGlmIHNlbGYuc3RhdGVfc3BvdXRzIGlzIG5vdCBOb25lOgogICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCdzdGF0ZV9zcG91dHMnLCBUVHlwZS5NQVAsIDMpCiAgICAgICBvcHJvdC53cml0ZU1hcEJlZ2luKFRUeXBlLlNUUklORywgVFR5cGUuU1RSVUNULCBsZW4oc2VsZi5zdGF0ZV9zcG91dHMpKQotICAgICAgZm9yIGtpdGVyNjQsdml0ZXI2NSBpbiBzZWxmLnN0YXRlX3Nwb3V0cy5pdGVtcygpOgotICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhraXRlcjY0LmVuY29kZSgndXRmLTgnKSkKLSAgICAgICAgdml0ZXI2NS53cml0ZShvcHJvdCkKKyAgICAgIGZvciBraXRlcjcwLHZpdGVyNzEgaW4gc2VsZi5zdGF0ZV9zcG91dHMuaXRlbXMoKToKKyAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoa2l0ZXI3MC5lbmNvZGUoJ3V0Zi04JykpCisgICAgICAgIHZpdGVyNzEud3JpdGUob3Byb3QpCiAgICAgICBvcHJvdC53cml0ZU1hcEVuZCgpCiAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKKyAgICBpZiBzZWxmLndvcmtlcl9ob29rcyBpcyBub3QgTm9uZToKKyAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbignd29ya2VyX2hvb2tzJywgVFR5cGUuTElTVCwgNCkKKyAgICAgIG9wcm90LndyaXRlTGlzdEJlZ2luKFRUeXBlLlNUUklORywgbGVuKHNlbGYud29ya2VyX2hvb2tzKSkKKyAgICAgIGZvciBpdGVyNzIgaW4gc2VsZi53b3JrZXJfaG9va3M6CisgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKGl0ZXI3MikKKyAgICAgIG9wcm90LndyaXRlTGlzdEVuZCgpCisgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKICAgICBvcHJvdC53cml0ZUZpZWxkU3RvcCgpCiAgICAgb3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKQogCkBAIC0xMzY2LDYgKzE1MDgsNyBAQAogICAgIHZhbHVlID0gKHZhbHVlICogMzEpIF4gaGFzaChzZWxmLnNwb3V0cykKICAgICB2YWx1ZSA9ICh2YWx1ZSAqIDMxKSBeIGhhc2goc2VsZi5ib2x0cykKICAgICB2YWx1ZSA9ICh2YWx1ZSAqIDMxKSBeIGhhc2goc2VsZi5zdGF0ZV9zcG91dHMpCisgICAgdmFsdWUgPSAodmFsdWUgKiAzMSkgXiBoYXNoKHNlbGYud29ya2VyX2hvb2tzKQogICAgIHJldHVybiB2YWx1ZQogCiAgIGRlZiBfX3JlcHJfXyhzZWxmKToKQEAgLTE2NzIsNiArMTgxNSwxMiBAQAogICAgLSBzY2hlZF9zdGF0dXMKICAgIC0gb3duZXIKICAgIC0gcmVwbGljYXRpb25fY291bnQKKyAgIC0gcmVxdWVzdGVkX21lbW9uaGVhcAorICAgLSByZXF1ZXN0ZWRfbWVtb2ZmaGVhcAorICAgLSByZXF1ZXN0ZWRfY3B1CisgICAtIGFzc2lnbmVkX21lbW9uaGVhcAorICAgLSBhc3NpZ25lZF9tZW1vZmZoZWFwCisgICAtIGFzc2lnbmVkX2NwdQogICAiIiIKIAogICB0aHJpZnRfc3BlYyA9ICgKQEAgLTIxOTEsOSArMjM0MCwyMCBAQAogICAgICg1MTMsIFRUeXBlLlNUUklORywgJ3NjaGVkX3N0YXR1cycsIE5vbmUsIE5vbmUsICksICMgNTEzCiAgICAgKDUxNCwgVFR5cGUuU1RSSU5HLCAnb3duZXInLCBOb25lLCBOb25lLCApLCAjIDUxNAogICAgICg1MTUsIFRUeXBlLkkzMiwgJ3JlcGxpY2F0aW9uX2NvdW50JywgTm9uZSwgTm9uZSwgKSwgIyA1MTUKKyAgICBOb25lLCAjIDUxNgorICAgIE5vbmUsICMgNTE3CisgICAgTm9uZSwgIyA1MTgKKyAgICBOb25lLCAjIDUxOQorICAgIE5vbmUsICMgNTIwCisgICAgKDUyMSwgVFR5cGUuRE9VQkxFLCAncmVxdWVzdGVkX21lbW9uaGVhcCcsIE5vbmUsIE5vbmUsICksICMgNTIxCisgICAgKDUyMiwgVFR5cGUuRE9VQkxFLCAncmVxdWVzdGVkX21lbW9mZmhlYXAnLCBOb25lLCBOb25lLCApLCAjIDUyMgorICAgICg1MjMsIFRUeXBlLkRPVUJMRSwgJ3JlcXVlc3RlZF9jcHUnLCBOb25lLCBOb25lLCApLCAjIDUyMworICAgICg1MjQsIFRUeXBlLkRPVUJMRSwgJ2Fzc2lnbmVkX21lbW9uaGVhcCcsIE5vbmUsIE5vbmUsICksICMgNTI0CisgICAgKDUyNSwgVFR5cGUuRE9VQkxFLCAnYXNzaWduZWRfbWVtb2ZmaGVhcCcsIE5vbmUsIE5vbmUsICksICMgNTI1CisgICAgKDUyNiwgVFR5cGUuRE9VQkxFLCAnYXNzaWduZWRfY3B1JywgTm9uZSwgTm9uZSwgKSwgIyA1MjYKICAgKQogCi0gIGRlZiBfX2luaXRfXyhzZWxmLCBpZD1Ob25lLCBuYW1lPU5vbmUsIG51bV90YXNrcz1Ob25lLCBudW1fZXhlY3V0b3JzPU5vbmUsIG51bV93b3JrZXJzPU5vbmUsIHVwdGltZV9zZWNzPU5vbmUsIHN0YXR1cz1Ob25lLCBzY2hlZF9zdGF0dXM9Tm9uZSwgb3duZXI9Tm9uZSwgcmVwbGljYXRpb25fY291bnQ9Tm9uZSwpOgorICBkZWYgX19pbml0X18oc2VsZiwgaWQ9Tm9uZSwgbmFtZT1Ob25lLCBudW1fdGFza3M9Tm9uZSwgbnVtX2V4ZWN1dG9ycz1Ob25lLCBudW1fd29ya2Vycz1Ob25lLCB1cHRpbWVfc2Vjcz1Ob25lLCBzdGF0dXM9Tm9uZSwgc2NoZWRfc3RhdHVzPU5vbmUsIG93bmVyPU5vbmUsIHJlcGxpY2F0aW9uX2NvdW50PU5vbmUsIHJlcXVlc3RlZF9tZW1vbmhlYXA9Tm9uZSwgcmVxdWVzdGVkX21lbW9mZmhlYXA9Tm9uZSwgcmVxdWVzdGVkX2NwdT1Ob25lLCBhc3NpZ25lZF9tZW1vbmhlYXA9Tm9uZSwgYXNzaWduZWRfbWVtb2ZmaGVhcD1Ob25lLCBhc3NpZ25lZF9jcHU9Tm9uZSwpOgogICAgIHNlbGYuaWQgPSBpZAogICAgIHNlbGYubmFtZSA9IG5hbWUKICAgICBzZWxmLm51bV90YXNrcyA9IG51bV90YXNrcwpAQCAtMjIwNCw2ICsyMzY0LDEyIEBACiAgICAgc2VsZi5zY2hlZF9zdGF0dXMgPSBzY2hlZF9zdGF0dXMKICAgICBzZWxmLm93bmVyID0gb3duZXIKICAgICBzZWxmLnJlcGxpY2F0aW9uX2NvdW50ID0gcmVwbGljYXRpb25fY291bnQKKyAgICBzZWxmLnJlcXVlc3RlZF9tZW1vbmhlYXAgPSByZXF1ZXN0ZWRfbWVtb25oZWFwCisgICAgc2VsZi5yZXF1ZXN0ZWRfbWVtb2ZmaGVhcCA9IHJlcXVlc3RlZF9tZW1vZmZoZWFwCisgICAgc2VsZi5yZXF1ZXN0ZWRfY3B1ID0gcmVxdWVzdGVkX2NwdQorICAgIHNlbGYuYXNzaWduZWRfbWVtb25oZWFwID0gYXNzaWduZWRfbWVtb25oZWFwCisgICAgc2VsZi5hc3NpZ25lZF9tZW1vZmZoZWFwID0gYXNzaWduZWRfbWVtb2ZmaGVhcAorICAgIHNlbGYuYXNzaWduZWRfY3B1ID0gYXNzaWduZWRfY3B1CiAKICAgZGVmIHJlYWQoc2VsZiwgaXByb3QpOgogICAgIGlmIGlwcm90Ll9fY2xhc3NfXyA9PSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgYW5kIGlzaW5zdGFuY2UoaXByb3QudHJhbnMsIFRUcmFuc3BvcnQuQ1JlYWRhYmxlVHJhbnNwb3J0KSBhbmQgc2VsZi50aHJpZnRfc3BlYyBpcyBub3QgTm9uZSBhbmQgZmFzdGJpbmFyeSBpcyBub3QgTm9uZToKQEAgLTIyMjYsMjIgKzIzOTIsMjIgQEAKICAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQogICAgICAgZWxpZiBmaWQgPT0gMzoKICAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuSTMyOgotICAgICAgICAgIHNlbGYubnVtX3Rhc2tzID0gaXByb3QucmVhZEkzMigpOworICAgICAgICAgIHNlbGYubnVtX3Rhc2tzID0gaXByb3QucmVhZEkzMigpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKICAgICAgIGVsaWYgZmlkID09IDQ6CiAgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLkkzMjoKLSAgICAgICAgICBzZWxmLm51bV9leGVjdXRvcnMgPSBpcHJvdC5yZWFkSTMyKCk7CisgICAgICAgICAgc2VsZi5udW1fZXhlY3V0b3JzID0gaXByb3QucmVhZEkzMigpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKICAgICAgIGVsaWYgZmlkID09IDU6CiAgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLkkzMjoKLSAgICAgICAgICBzZWxmLm51bV93b3JrZXJzID0gaXByb3QucmVhZEkzMigpOworICAgICAgICAgIHNlbGYubnVtX3dvcmtlcnMgPSBpcHJvdC5yZWFkSTMyKCkKICAgICAgICAgZWxzZToKICAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQogICAgICAgZWxpZiBmaWQgPT0gNjoKICAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuSTMyOgotICAgICAgICAgIHNlbGYudXB0aW1lX3NlY3MgPSBpcHJvdC5yZWFkSTMyKCk7CisgICAgICAgICAgc2VsZi51cHRpbWVfc2VjcyA9IGlwcm90LnJlYWRJMzIoKQogICAgICAgICBlbHNlOgogICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCiAgICAgICBlbGlmIGZpZCA9PSA3OgpAQCAtMjI2MSw3ICsyNDI3LDM3IEBACiAgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKICAgICAgIGVsaWYgZmlkID09IDUxNToKICAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuSTMyOgotICAgICAgICAgIHNlbGYucmVwbGljYXRpb25fY291bnQgPSBpcHJvdC5yZWFkSTMyKCk7CisgICAgICAgICAgc2VsZi5yZXBsaWNhdGlvbl9jb3VudCA9IGlwcm90LnJlYWRJMzIoKQorICAgICAgICBlbHNlOgorICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBlbGlmIGZpZCA9PSA1MjE6CisgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLkRPVUJMRToKKyAgICAgICAgICBzZWxmLnJlcXVlc3RlZF9tZW1vbmhlYXAgPSBpcHJvdC5yZWFkRG91YmxlKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgZWxpZiBmaWQgPT0gNTIyOgorICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5ET1VCTEU6CisgICAgICAgICAgc2VsZi5yZXF1ZXN0ZWRfbWVtb2ZmaGVhcCA9IGlwcm90LnJlYWREb3VibGUoKQorICAgICAgICBlbHNlOgorICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBlbGlmIGZpZCA9PSA1MjM6CisgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLkRPVUJMRToKKyAgICAgICAgICBzZWxmLnJlcXVlc3RlZF9jcHUgPSBpcHJvdC5yZWFkRG91YmxlKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgZWxpZiBmaWQgPT0gNTI0OgorICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5ET1VCTEU6CisgICAgICAgICAgc2VsZi5hc3NpZ25lZF9tZW1vbmhlYXAgPSBpcHJvdC5yZWFkRG91YmxlKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgZWxpZiBmaWQgPT0gNTI1OgorICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5ET1VCTEU6CisgICAgICAgICAgc2VsZi5hc3NpZ25lZF9tZW1vZmZoZWFwID0gaXByb3QucmVhZERvdWJsZSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgIGVsaWYgZmlkID09IDUyNjoKKyAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuRE9VQkxFOgorICAgICAgICAgIHNlbGYuYXNzaWduZWRfY3B1ID0gaXByb3QucmVhZERvdWJsZSgpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKICAgICAgIGVsc2U6CkBAIC0yMzE0LDYgKzI1MTAsMzAgQEAKICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbigncmVwbGljYXRpb25fY291bnQnLCBUVHlwZS5JMzIsIDUxNSkKICAgICAgIG9wcm90LndyaXRlSTMyKHNlbGYucmVwbGljYXRpb25fY291bnQpCiAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKKyAgICBpZiBzZWxmLnJlcXVlc3RlZF9tZW1vbmhlYXAgaXMgbm90IE5vbmU6CisgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ3JlcXVlc3RlZF9tZW1vbmhlYXAnLCBUVHlwZS5ET1VCTEUsIDUyMSkKKyAgICAgIG9wcm90LndyaXRlRG91YmxlKHNlbGYucmVxdWVzdGVkX21lbW9uaGVhcCkKKyAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKQorICAgIGlmIHNlbGYucmVxdWVzdGVkX21lbW9mZmhlYXAgaXMgbm90IE5vbmU6CisgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ3JlcXVlc3RlZF9tZW1vZmZoZWFwJywgVFR5cGUuRE9VQkxFLCA1MjIpCisgICAgICBvcHJvdC53cml0ZURvdWJsZShzZWxmLnJlcXVlc3RlZF9tZW1vZmZoZWFwKQorICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCisgICAgaWYgc2VsZi5yZXF1ZXN0ZWRfY3B1IGlzIG5vdCBOb25lOgorICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCdyZXF1ZXN0ZWRfY3B1JywgVFR5cGUuRE9VQkxFLCA1MjMpCisgICAgICBvcHJvdC53cml0ZURvdWJsZShzZWxmLnJlcXVlc3RlZF9jcHUpCisgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKKyAgICBpZiBzZWxmLmFzc2lnbmVkX21lbW9uaGVhcCBpcyBub3QgTm9uZToKKyAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbignYXNzaWduZWRfbWVtb25oZWFwJywgVFR5cGUuRE9VQkxFLCA1MjQpCisgICAgICBvcHJvdC53cml0ZURvdWJsZShzZWxmLmFzc2lnbmVkX21lbW9uaGVhcCkKKyAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKQorICAgIGlmIHNlbGYuYXNzaWduZWRfbWVtb2ZmaGVhcCBpcyBub3QgTm9uZToKKyAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbignYXNzaWduZWRfbWVtb2ZmaGVhcCcsIFRUeXBlLkRPVUJMRSwgNTI1KQorICAgICAgb3Byb3Qud3JpdGVEb3VibGUoc2VsZi5hc3NpZ25lZF9tZW1vZmZoZWFwKQorICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCisgICAgaWYgc2VsZi5hc3NpZ25lZF9jcHUgaXMgbm90IE5vbmU6CisgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ2Fzc2lnbmVkX2NwdScsIFRUeXBlLkRPVUJMRSwgNTI2KQorICAgICAgb3Byb3Qud3JpdGVEb3VibGUoc2VsZi5hc3NpZ25lZF9jcHUpCisgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKICAgICBvcHJvdC53cml0ZUZpZWxkU3RvcCgpCiAgICAgb3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKQogCkBAIC0yMzQ3LDYgKzI1NjcsMTIgQEAKICAgICB2YWx1ZSA9ICh2YWx1ZSAqIDMxKSBeIGhhc2goc2VsZi5zY2hlZF9zdGF0dXMpCiAgICAgdmFsdWUgPSAodmFsdWUgKiAzMSkgXiBoYXNoKHNlbGYub3duZXIpCiAgICAgdmFsdWUgPSAodmFsdWUgKiAzMSkgXiBoYXNoKHNlbGYucmVwbGljYXRpb25fY291bnQpCisgICAgdmFsdWUgPSAodmFsdWUgKiAzMSkgXiBoYXNoKHNlbGYucmVxdWVzdGVkX21lbW9uaGVhcCkKKyAgICB2YWx1ZSA9ICh2YWx1ZSAqIDMxKSBeIGhhc2goc2VsZi5yZXF1ZXN0ZWRfbWVtb2ZmaGVhcCkKKyAgICB2YWx1ZSA9ICh2YWx1ZSAqIDMxKSBeIGhhc2goc2VsZi5yZXF1ZXN0ZWRfY3B1KQorICAgIHZhbHVlID0gKHZhbHVlICogMzEpIF4gaGFzaChzZWxmLmFzc2lnbmVkX21lbW9uaGVhcCkKKyAgICB2YWx1ZSA9ICh2YWx1ZSAqIDMxKSBeIGhhc2goc2VsZi5hc3NpZ25lZF9tZW1vZmZoZWFwKQorICAgIHZhbHVlID0gKHZhbHVlICogMzEpIF4gaGFzaChzZWxmLmFzc2lnbmVkX2NwdSkKICAgICByZXR1cm4gdmFsdWUKIAogICBkZWYgX19yZXByX18oc2VsZik6CkBAIC0yMzY5LDYgKzI1OTUsOSBAQAogICAgLSBudW1fdXNlZF93b3JrZXJzCiAgICAtIHN1cGVydmlzb3JfaWQKICAgIC0gdmVyc2lvbgorICAgLSB0b3RhbF9yZXNvdXJjZXMKKyAgIC0gdXNlZF9tZW0KKyAgIC0gdXNlZF9jcHUKICAgIiIiCiAKICAgdGhyaWZ0X3NwZWMgPSAoCkBAIC0yMzc5LDE1ICsyNjA4LDIxIEBACiAgICAgKDQsIFRUeXBlLkkzMiwgJ251bV91c2VkX3dvcmtlcnMnLCBOb25lLCBOb25lLCApLCAjIDQKICAgICAoNSwgVFR5cGUuU1RSSU5HLCAnc3VwZXJ2aXNvcl9pZCcsIE5vbmUsIE5vbmUsICksICMgNQogICAgICg2LCBUVHlwZS5TVFJJTkcsICd2ZXJzaW9uJywgTm9uZSwgIlZFUlNJT05fTk9UX1BST1ZJREVEIiwgKSwgIyA2CisgICAgKDcsIFRUeXBlLk1BUCwgJ3RvdGFsX3Jlc291cmNlcycsIChUVHlwZS5TVFJJTkcsTm9uZSxUVHlwZS5ET1VCTEUsTm9uZSksIE5vbmUsICksICMgNworICAgICg4LCBUVHlwZS5ET1VCTEUsICd1c2VkX21lbScsIE5vbmUsIE5vbmUsICksICMgOAorICAgICg5LCBUVHlwZS5ET1VCTEUsICd1c2VkX2NwdScsIE5vbmUsIE5vbmUsICksICMgOQogICApCiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3Q9Tm9uZSwgdXB0aW1lX3NlY3M9Tm9uZSwgbnVtX3dvcmtlcnM9Tm9uZSwgbnVtX3VzZWRfd29ya2Vycz1Ob25lLCBzdXBlcnZpc29yX2lkPU5vbmUsIHZlcnNpb249dGhyaWZ0X3NwZWNbNl1bNF0sKToKKyAgZGVmIF9faW5pdF9fKHNlbGYsIGhvc3Q9Tm9uZSwgdXB0aW1lX3NlY3M9Tm9uZSwgbnVtX3dvcmtlcnM9Tm9uZSwgbnVtX3VzZWRfd29ya2Vycz1Ob25lLCBzdXBlcnZpc29yX2lkPU5vbmUsIHZlcnNpb249dGhyaWZ0X3NwZWNbNl1bNF0sIHRvdGFsX3Jlc291cmNlcz1Ob25lLCB1c2VkX21lbT1Ob25lLCB1c2VkX2NwdT1Ob25lLCk6CiAgICAgc2VsZi5ob3N0ID0gaG9zdAogICAgIHNlbGYudXB0aW1lX3NlY3MgPSB1cHRpbWVfc2VjcwogICAgIHNlbGYubnVtX3dvcmtlcnMgPSBudW1fd29ya2VycwogICAgIHNlbGYubnVtX3VzZWRfd29ya2VycyA9IG51bV91c2VkX3dvcmtlcnMKICAgICBzZWxmLnN1cGVydmlzb3JfaWQgPSBzdXBlcnZpc29yX2lkCiAgICAgc2VsZi52ZXJzaW9uID0gdmVyc2lvbgorICAgIHNlbGYudG90YWxfcmVzb3VyY2VzID0gdG90YWxfcmVzb3VyY2VzCisgICAgc2VsZi51c2VkX21lbSA9IHVzZWRfbWVtCisgICAgc2VsZi51c2VkX2NwdSA9IHVzZWRfY3B1CiAKICAgZGVmIHJlYWQoc2VsZiwgaXByb3QpOgogICAgIGlmIGlwcm90Ll9fY2xhc3NfXyA9PSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgYW5kIGlzaW5zdGFuY2UoaXByb3QudHJhbnMsIFRUcmFuc3BvcnQuQ1JlYWRhYmxlVHJhbnNwb3J0KSBhbmQgc2VsZi50aHJpZnRfc3BlYyBpcyBub3QgTm9uZSBhbmQgZmFzdGJpbmFyeSBpcyBub3QgTm9uZToKQEAgLTI0MDUsMTcgKzI2NDAsMTcgQEAKICAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQogICAgICAgZWxpZiBmaWQgPT0gMjoKICAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuSTMyOgotICAgICAgICAgIHNlbGYudXB0aW1lX3NlY3MgPSBpcHJvdC5yZWFkSTMyKCk7CisgICAgICAgICAgc2VsZi51cHRpbWVfc2VjcyA9IGlwcm90LnJlYWRJMzIoKQogICAgICAgICBlbHNlOgogICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCiAgICAgICBlbGlmIGZpZCA9PSAzOgogICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5JMzI6Ci0gICAgICAgICAgc2VsZi5udW1fd29ya2VycyA9IGlwcm90LnJlYWRJMzIoKTsKKyAgICAgICAgICBzZWxmLm51bV93b3JrZXJzID0gaXByb3QucmVhZEkzMigpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKICAgICAgIGVsaWYgZmlkID09IDQ6CiAgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLkkzMjoKLSAgICAgICAgICBzZWxmLm51bV91c2VkX3dvcmtlcnMgPSBpcHJvdC5yZWFkSTMyKCk7CisgICAgICAgICAgc2VsZi5udW1fdXNlZF93b3JrZXJzID0gaXByb3QucmVhZEkzMigpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKICAgICAgIGVsaWYgZmlkID09IDU6CkBAIC0yNDI4LDYgKzI2NjMsMjcgQEAKICAgICAgICAgICBzZWxmLnZlcnNpb24gPSBpcHJvdC5yZWFkU3RyaW5nKCkuZGVjb2RlKCd1dGYtOCcpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgIGVsaWYgZmlkID09IDc6CisgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLk1BUDoKKyAgICAgICAgICBzZWxmLnRvdGFsX3Jlc291cmNlcyA9IHt9CisgICAgICAgICAgKF9rdHlwZTc0LCBfdnR5cGU3NSwgX3NpemU3MyApID0gaXByb3QucmVhZE1hcEJlZ2luKCkKKyAgICAgICAgICBmb3IgX2k3NyBpbiB4cmFuZ2UoX3NpemU3Myk6CisgICAgICAgICAgICBfa2V5NzggPSBpcHJvdC5yZWFkU3RyaW5nKCkuZGVjb2RlKCd1dGYtOCcpCisgICAgICAgICAgICBfdmFsNzkgPSBpcHJvdC5yZWFkRG91YmxlKCkKKyAgICAgICAgICAgIHNlbGYudG90YWxfcmVzb3VyY2VzW19rZXk3OF0gPSBfdmFsNzkKKyAgICAgICAgICBpcHJvdC5yZWFkTWFwRW5kKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgZWxpZiBmaWQgPT0gODoKKyAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuRE9VQkxFOgorICAgICAgICAgIHNlbGYudXNlZF9tZW0gPSBpcHJvdC5yZWFkRG91YmxlKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgZWxpZiBmaWQgPT0gOToKKyAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuRE9VQkxFOgorICAgICAgICAgIHNlbGYudXNlZF9jcHUgPSBpcHJvdC5yZWFkRG91YmxlKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQogICAgICAgZWxzZToKICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKICAgICAgIGlwcm90LnJlYWRGaWVsZEVuZCgpCkBAIC0yNDYyLDYgKzI3MTgsMjIgQEAKICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbigndmVyc2lvbicsIFRUeXBlLlNUUklORywgNikKICAgICAgIG9wcm90LndyaXRlU3RyaW5nKHNlbGYudmVyc2lvbi5lbmNvZGUoJ3V0Zi04JykpCiAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKKyAgICBpZiBzZWxmLnRvdGFsX3Jlc291cmNlcyBpcyBub3QgTm9uZToKKyAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbigndG90YWxfcmVzb3VyY2VzJywgVFR5cGUuTUFQLCA3KQorICAgICAgb3Byb3Qud3JpdGVNYXBCZWdpbihUVHlwZS5TVFJJTkcsIFRUeXBlLkRPVUJMRSwgbGVuKHNlbGYudG90YWxfcmVzb3VyY2VzKSkKKyAgICAgIGZvciBraXRlcjgwLHZpdGVyODEgaW4gc2VsZi50b3RhbF9yZXNvdXJjZXMuaXRlbXMoKToKKyAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoa2l0ZXI4MC5lbmNvZGUoJ3V0Zi04JykpCisgICAgICAgIG9wcm90LndyaXRlRG91YmxlKHZpdGVyODEpCisgICAgICBvcHJvdC53cml0ZU1hcEVuZCgpCisgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKKyAgICBpZiBzZWxmLnVzZWRfbWVtIGlzIG5vdCBOb25lOgorICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCd1c2VkX21lbScsIFRUeXBlLkRPVUJMRSwgOCkKKyAgICAgIG9wcm90LndyaXRlRG91YmxlKHNlbGYudXNlZF9tZW0pCisgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKKyAgICBpZiBzZWxmLnVzZWRfY3B1IGlzIG5vdCBOb25lOgorICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCd1c2VkX2NwdScsIFRUeXBlLkRPVUJMRSwgOSkKKyAgICAgIG9wcm90LndyaXRlRG91YmxlKHNlbGYudXNlZF9jcHUpCisgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKICAgICBvcHJvdC53cml0ZUZpZWxkU3RvcCgpCiAgICAgb3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKQogCkBAIC0yNDg3LDYgKzI3NTksOSBAQAogICAgIHZhbHVlID0gKHZhbHVlICogMzEpIF4gaGFzaChzZWxmLm51bV91c2VkX3dvcmtlcnMpCiAgICAgdmFsdWUgPSAodmFsdWUgKiAzMSkgXiBoYXNoKHNlbGYuc3VwZXJ2aXNvcl9pZCkKICAgICB2YWx1ZSA9ICh2YWx1ZSAqIDMxKSBeIGhhc2goc2VsZi52ZXJzaW9uKQorICAgIHZhbHVlID0gKHZhbHVlICogMzEpIF4gaGFzaChzZWxmLnRvdGFsX3Jlc291cmNlcykKKyAgICB2YWx1ZSA9ICh2YWx1ZSAqIDMxKSBeIGhhc2goc2VsZi51c2VkX21lbSkKKyAgICB2YWx1ZSA9ICh2YWx1ZSAqIDMxKSBeIGhhc2goc2VsZi51c2VkX2NwdSkKICAgICByZXR1cm4gdmFsdWUKIAogICBkZWYgX19yZXByX18oc2VsZik6CkBAIC0yNTQyLDE3ICsyODE3LDE3IEBACiAgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKICAgICAgIGVsaWYgZmlkID09IDI6CiAgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLkkzMjoKLSAgICAgICAgICBzZWxmLnBvcnQgPSBpcHJvdC5yZWFkSTMyKCk7CisgICAgICAgICAgc2VsZi5wb3J0ID0gaXByb3QucmVhZEkzMigpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKICAgICAgIGVsaWYgZmlkID09IDM6CiAgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLkkzMjoKLSAgICAgICAgICBzZWxmLnVwdGltZV9zZWNzID0gaXByb3QucmVhZEkzMigpOworICAgICAgICAgIHNlbGYudXB0aW1lX3NlY3MgPSBpcHJvdC5yZWFkSTMyKCkKICAgICAgICAgZWxzZToKICAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQogICAgICAgZWxpZiBmaWQgPT0gNDoKICAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuQk9PTDoKLSAgICAgICAgICBzZWxmLmlzTGVhZGVyID0gaXByb3QucmVhZEJvb2woKTsKKyAgICAgICAgICBzZWxmLmlzTGVhZGVyID0gaXByb3QucmVhZEJvb2woKQogICAgICAgICBlbHNlOgogICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCiAgICAgICBlbGlmIGZpZCA9PSA1OgpAQCAtMjYzMSw2ICsyOTA2LDcgQEAKICAgIiIiCiAgIEF0dHJpYnV0ZXM6CiAgICAtIHN1cGVydmlzb3JzCisgICAtIG5pbWJ1c191cHRpbWVfc2VjcwogICAgLSB0b3BvbG9naWVzCiAgICAtIG5pbWJ1c2VzCiAgICIiIgpAQCAtMjYzOCwxMyArMjkxNCwxNCBAQAogICB0aHJpZnRfc3BlYyA9ICgKICAgICBOb25lLCAjIDAKICAgICAoMSwgVFR5cGUuTElTVCwgJ3N1cGVydmlzb3JzJywgKFRUeXBlLlNUUlVDVCwoU3VwZXJ2aXNvclN1bW1hcnksIFN1cGVydmlzb3JTdW1tYXJ5LnRocmlmdF9zcGVjKSksIE5vbmUsICksICMgMQotICAgIE5vbmUsICMgMgorICAgICgyLCBUVHlwZS5JMzIsICduaW1idXNfdXB0aW1lX3NlY3MnLCBOb25lLCAwLCApLCAjIDIKICAgICAoMywgVFR5cGUuTElTVCwgJ3RvcG9sb2dpZXMnLCAoVFR5cGUuU1RSVUNULChUb3BvbG9neVN1bW1hcnksIFRvcG9sb2d5U3VtbWFyeS50aHJpZnRfc3BlYykpLCBOb25lLCApLCAjIDMKICAgICAoNCwgVFR5cGUuTElTVCwgJ25pbWJ1c2VzJywgKFRUeXBlLlNUUlVDVCwoTmltYnVzU3VtbWFyeSwgTmltYnVzU3VtbWFyeS50aHJpZnRfc3BlYykpLCBOb25lLCApLCAjIDQKICAgKQogCi0gIGRlZiBfX2luaXRfXyhzZWxmLCBzdXBlcnZpc29ycz1Ob25lLCB0b3BvbG9naWVzPU5vbmUsIG5pbWJ1c2VzPU5vbmUsKToKKyAgZGVmIF9faW5pdF9fKHNlbGYsIHN1cGVydmlzb3JzPU5vbmUsIG5pbWJ1c191cHRpbWVfc2Vjcz10aHJpZnRfc3BlY1syXVs0XSwgdG9wb2xvZ2llcz1Ob25lLCBuaW1idXNlcz1Ob25lLCk6CiAgICAgc2VsZi5zdXBlcnZpc29ycyA9IHN1cGVydmlzb3JzCisgICAgc2VsZi5uaW1idXNfdXB0aW1lX3NlY3MgPSBuaW1idXNfdXB0aW1lX3NlY3MKICAgICBzZWxmLnRvcG9sb2dpZXMgPSB0b3BvbG9naWVzCiAgICAgc2VsZi5uaW1idXNlcyA9IG5pbWJ1c2VzCiAKQEAgLTI2NjAsMzMgKzI5MzcsMzggQEAKICAgICAgIGlmIGZpZCA9PSAxOgogICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5MSVNUOgogICAgICAgICAgIHNlbGYuc3VwZXJ2aXNvcnMgPSBbXQotICAgICAgICAgIChfZXR5cGU2OSwgX3NpemU2NikgPSBpcHJvdC5yZWFkTGlzdEJlZ2luKCkKLSAgICAgICAgICBmb3IgX2k3MCBpbiB4cmFuZ2UoX3NpemU2Nik6Ci0gICAgICAgICAgICBfZWxlbTcxID0gU3VwZXJ2aXNvclN1bW1hcnkoKQotICAgICAgICAgICAgX2VsZW03MS5yZWFkKGlwcm90KQotICAgICAgICAgICAgc2VsZi5zdXBlcnZpc29ycy5hcHBlbmQoX2VsZW03MSkKKyAgICAgICAgICAoX2V0eXBlODUsIF9zaXplODIpID0gaXByb3QucmVhZExpc3RCZWdpbigpCisgICAgICAgICAgZm9yIF9pODYgaW4geHJhbmdlKF9zaXplODIpOgorICAgICAgICAgICAgX2VsZW04NyA9IFN1cGVydmlzb3JTdW1tYXJ5KCkKKyAgICAgICAgICAgIF9lbGVtODcucmVhZChpcHJvdCkKKyAgICAgICAgICAgIHNlbGYuc3VwZXJ2aXNvcnMuYXBwZW5kKF9lbGVtODcpCiAgICAgICAgICAgaXByb3QucmVhZExpc3RFbmQoKQogICAgICAgICBlbHNlOgogICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBlbGlmIGZpZCA9PSAyOgorICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5JMzI6CisgICAgICAgICAgc2VsZi5uaW1idXNfdXB0aW1lX3NlY3MgPSBpcHJvdC5yZWFkSTMyKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQogICAgICAgZWxpZiBmaWQgPT0gMzoKICAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuTElTVDoKICAgICAgICAgICBzZWxmLnRvcG9sb2dpZXMgPSBbXQotICAgICAgICAgIChfZXR5cGU3NSwgX3NpemU3MikgPSBpcHJvdC5yZWFkTGlzdEJlZ2luKCkKLSAgICAgICAgICBmb3IgX2k3NiBpbiB4cmFuZ2UoX3NpemU3Mik6Ci0gICAgICAgICAgICBfZWxlbTc3ID0gVG9wb2xvZ3lTdW1tYXJ5KCkKLSAgICAgICAgICAgIF9lbGVtNzcucmVhZChpcHJvdCkKLSAgICAgICAgICAgIHNlbGYudG9wb2xvZ2llcy5hcHBlbmQoX2VsZW03NykKKyAgICAgICAgICAoX2V0eXBlOTEsIF9zaXplODgpID0gaXByb3QucmVhZExpc3RCZWdpbigpCisgICAgICAgICAgZm9yIF9pOTIgaW4geHJhbmdlKF9zaXplODgpOgorICAgICAgICAgICAgX2VsZW05MyA9IFRvcG9sb2d5U3VtbWFyeSgpCisgICAgICAgICAgICBfZWxlbTkzLnJlYWQoaXByb3QpCisgICAgICAgICAgICBzZWxmLnRvcG9sb2dpZXMuYXBwZW5kKF9lbGVtOTMpCiAgICAgICAgICAgaXByb3QucmVhZExpc3RFbmQoKQogICAgICAgICBlbHNlOgogICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCiAgICAgICBlbGlmIGZpZCA9PSA0OgogICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5MSVNUOgogICAgICAgICAgIHNlbGYubmltYnVzZXMgPSBbXQotICAgICAgICAgIChfZXR5cGU4MSwgX3NpemU3OCkgPSBpcHJvdC5yZWFkTGlzdEJlZ2luKCkKLSAgICAgICAgICBmb3IgX2k4MiBpbiB4cmFuZ2UoX3NpemU3OCk6Ci0gICAgICAgICAgICBfZWxlbTgzID0gTmltYnVzU3VtbWFyeSgpCi0gICAgICAgICAgICBfZWxlbTgzLnJlYWQoaXByb3QpCi0gICAgICAgICAgICBzZWxmLm5pbWJ1c2VzLmFwcGVuZChfZWxlbTgzKQorICAgICAgICAgIChfZXR5cGU5NywgX3NpemU5NCkgPSBpcHJvdC5yZWFkTGlzdEJlZ2luKCkKKyAgICAgICAgICBmb3IgX2k5OCBpbiB4cmFuZ2UoX3NpemU5NCk6CisgICAgICAgICAgICBfZWxlbTk5ID0gTmltYnVzU3VtbWFyeSgpCisgICAgICAgICAgICBfZWxlbTk5LnJlYWQoaXByb3QpCisgICAgICAgICAgICBzZWxmLm5pbWJ1c2VzLmFwcGVuZChfZWxlbTk5KQogICAgICAgICAgIGlwcm90LnJlYWRMaXN0RW5kKCkKICAgICAgICAgZWxzZToKICAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQpAQCAtMjcwMywyMiArMjk4NSwyNiBAQAogICAgIGlmIHNlbGYuc3VwZXJ2aXNvcnMgaXMgbm90IE5vbmU6CiAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ3N1cGVydmlzb3JzJywgVFR5cGUuTElTVCwgMSkKICAgICAgIG9wcm90LndyaXRlTGlzdEJlZ2luKFRUeXBlLlNUUlVDVCwgbGVuKHNlbGYuc3VwZXJ2aXNvcnMpKQotICAgICAgZm9yIGl0ZXI4NCBpbiBzZWxmLnN1cGVydmlzb3JzOgotICAgICAgICBpdGVyODQud3JpdGUob3Byb3QpCisgICAgICBmb3IgaXRlcjEwMCBpbiBzZWxmLnN1cGVydmlzb3JzOgorICAgICAgICBpdGVyMTAwLndyaXRlKG9wcm90KQogICAgICAgb3Byb3Qud3JpdGVMaXN0RW5kKCkKICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKQorICAgIGlmIHNlbGYubmltYnVzX3VwdGltZV9zZWNzIGlzIG5vdCBOb25lOgorICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCduaW1idXNfdXB0aW1lX3NlY3MnLCBUVHlwZS5JMzIsIDIpCisgICAgICBvcHJvdC53cml0ZUkzMihzZWxmLm5pbWJ1c191cHRpbWVfc2VjcykKKyAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKQogICAgIGlmIHNlbGYudG9wb2xvZ2llcyBpcyBub3QgTm9uZToKICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbigndG9wb2xvZ2llcycsIFRUeXBlLkxJU1QsIDMpCiAgICAgICBvcHJvdC53cml0ZUxpc3RCZWdpbihUVHlwZS5TVFJVQ1QsIGxlbihzZWxmLnRvcG9sb2dpZXMpKQotICAgICAgZm9yIGl0ZXI4NSBpbiBzZWxmLnRvcG9sb2dpZXM6Ci0gICAgICAgIGl0ZXI4NS53cml0ZShvcHJvdCkKKyAgICAgIGZvciBpdGVyMTAxIGluIHNlbGYudG9wb2xvZ2llczoKKyAgICAgICAgaXRlcjEwMS53cml0ZShvcHJvdCkKICAgICAgIG9wcm90LndyaXRlTGlzdEVuZCgpCiAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKICAgICBpZiBzZWxmLm5pbWJ1c2VzIGlzIG5vdCBOb25lOgogICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCduaW1idXNlcycsIFRUeXBlLkxJU1QsIDQpCiAgICAgICBvcHJvdC53cml0ZUxpc3RCZWdpbihUVHlwZS5TVFJVQ1QsIGxlbihzZWxmLm5pbWJ1c2VzKSkKLSAgICAgIGZvciBpdGVyODYgaW4gc2VsZi5uaW1idXNlczoKLSAgICAgICAgaXRlcjg2LndyaXRlKG9wcm90KQorICAgICAgZm9yIGl0ZXIxMDIgaW4gc2VsZi5uaW1idXNlczoKKyAgICAgICAgaXRlcjEwMi53cml0ZShvcHJvdCkKICAgICAgIG9wcm90LndyaXRlTGlzdEVuZCgpCiAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKICAgICBvcHJvdC53cml0ZUZpZWxkU3RvcCgpCkBAIC0yNzM3LDYgKzMwMjMsNyBAQAogICBkZWYgX19oYXNoX18oc2VsZik6CiAgICAgdmFsdWUgPSAxNwogICAgIHZhbHVlID0gKHZhbHVlICogMzEpIF4gaGFzaChzZWxmLnN1cGVydmlzb3JzKQorICAgIHZhbHVlID0gKHZhbHVlICogMzEpIF4gaGFzaChzZWxmLm5pbWJ1c191cHRpbWVfc2VjcykKICAgICB2YWx1ZSA9ICh2YWx1ZSAqIDMxKSBeIGhhc2goc2VsZi50b3BvbG9naWVzKQogICAgIHZhbHVlID0gKHZhbHVlICogMzEpIF4gaGFzaChzZWxmLm5pbWJ1c2VzKQogICAgIHJldHVybiB2YWx1ZQpAQCAtMjc5MSw3ICszMDc4LDcgQEAKICAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQogICAgICAgZWxpZiBmaWQgPT0gMjoKICAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuSTMyOgotICAgICAgICAgIHNlbGYuZXJyb3JfdGltZV9zZWNzID0gaXByb3QucmVhZEkzMigpOworICAgICAgICAgIHNlbGYuZXJyb3JfdGltZV9zZWNzID0gaXByb3QucmVhZEkzMigpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKICAgICAgIGVsaWYgZmlkID09IDM6CkBAIC0yODAxLDcgKzMwODgsNyBAQAogICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCiAgICAgICBlbGlmIGZpZCA9PSA0OgogICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5JMzI6Ci0gICAgICAgICAgc2VsZi5wb3J0ID0gaXByb3QucmVhZEkzMigpOworICAgICAgICAgIHNlbGYucG9ydCA9IGlwcm90LnJlYWRJMzIoKQogICAgICAgICBlbHNlOgogICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCiAgICAgICBlbHNlOgpAQCAtMjg5OCw5MCArMzE4NSw5MCBAQAogICAgICAgaWYgZmlkID09IDE6CiAgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLk1BUDoKICAgICAgICAgICBzZWxmLmFja2VkID0ge30KLSAgICAgICAgICAoX2t0eXBlODgsIF92dHlwZTg5LCBfc2l6ZTg3ICkgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKQotICAgICAgICAgIGZvciBfaTkxIGluIHhyYW5nZShfc2l6ZTg3KToKLSAgICAgICAgICAgIF9rZXk5MiA9IGlwcm90LnJlYWRTdHJpbmcoKS5kZWNvZGUoJ3V0Zi04JykKLSAgICAgICAgICAgIF92YWw5MyA9IHt9Ci0gICAgICAgICAgICAoX2t0eXBlOTUsIF92dHlwZTk2LCBfc2l6ZTk0ICkgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKQotICAgICAgICAgICAgZm9yIF9pOTggaW4geHJhbmdlKF9zaXplOTQpOgotICAgICAgICAgICAgICBfa2V5OTkgPSBHbG9iYWxTdHJlYW1JZCgpCi0gICAgICAgICAgICAgIF9rZXk5OS5yZWFkKGlwcm90KQotICAgICAgICAgICAgICBfdmFsMTAwID0gaXByb3QucmVhZEk2NCgpOwotICAgICAgICAgICAgICBfdmFsOTNbX2tleTk5XSA9IF92YWwxMDAKKyAgICAgICAgICAoX2t0eXBlMTA0LCBfdnR5cGUxMDUsIF9zaXplMTAzICkgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKQorICAgICAgICAgIGZvciBfaTEwNyBpbiB4cmFuZ2UoX3NpemUxMDMpOgorICAgICAgICAgICAgX2tleTEwOCA9IGlwcm90LnJlYWRTdHJpbmcoKS5kZWNvZGUoJ3V0Zi04JykKKyAgICAgICAgICAgIF92YWwxMDkgPSB7fQorICAgICAgICAgICAgKF9rdHlwZTExMSwgX3Z0eXBlMTEyLCBfc2l6ZTExMCApID0gaXByb3QucmVhZE1hcEJlZ2luKCkKKyAgICAgICAgICAgIGZvciBfaTExNCBpbiB4cmFuZ2UoX3NpemUxMTApOgorICAgICAgICAgICAgICBfa2V5MTE1ID0gR2xvYmFsU3RyZWFtSWQoKQorICAgICAgICAgICAgICBfa2V5MTE1LnJlYWQoaXByb3QpCisgICAgICAgICAgICAgIF92YWwxMTYgPSBpcHJvdC5yZWFkSTY0KCkKKyAgICAgICAgICAgICAgX3ZhbDEwOVtfa2V5MTE1XSA9IF92YWwxMTYKICAgICAgICAgICAgIGlwcm90LnJlYWRNYXBFbmQoKQotICAgICAgICAgICAgc2VsZi5hY2tlZFtfa2V5OTJdID0gX3ZhbDkzCisgICAgICAgICAgICBzZWxmLmFja2VkW19rZXkxMDhdID0gX3ZhbDEwOQogICAgICAgICAgIGlwcm90LnJlYWRNYXBFbmQoKQogICAgICAgICBlbHNlOgogICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCiAgICAgICBlbGlmIGZpZCA9PSAyOgogICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5NQVA6CiAgICAgICAgICAgc2VsZi5mYWlsZWQgPSB7fQotICAgICAgICAgIChfa3R5cGUxMDIsIF92dHlwZTEwMywgX3NpemUxMDEgKSA9IGlwcm90LnJlYWRNYXBCZWdpbigpCi0gICAgICAgICAgZm9yIF9pMTA1IGluIHhyYW5nZShfc2l6ZTEwMSk6Ci0gICAgICAgICAgICBfa2V5MTA2ID0gaXByb3QucmVhZFN0cmluZygpLmRlY29kZSgndXRmLTgnKQotICAgICAgICAgICAgX3ZhbDEwNyA9IHt9Ci0gICAgICAgICAgICAoX2t0eXBlMTA5LCBfdnR5cGUxMTAsIF9zaXplMTA4ICkgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKQotICAgICAgICAgICAgZm9yIF9pMTEyIGluIHhyYW5nZShfc2l6ZTEwOCk6Ci0gICAgICAgICAgICAgIF9rZXkxMTMgPSBHbG9iYWxTdHJlYW1JZCgpCi0gICAgICAgICAgICAgIF9rZXkxMTMucmVhZChpcHJvdCkKLSAgICAgICAgICAgICAgX3ZhbDExNCA9IGlwcm90LnJlYWRJNjQoKTsKLSAgICAgICAgICAgICAgX3ZhbDEwN1tfa2V5MTEzXSA9IF92YWwxMTQKKyAgICAgICAgICAoX2t0eXBlMTE4LCBfdnR5cGUxMTksIF9zaXplMTE3ICkgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKQorICAgICAgICAgIGZvciBfaTEyMSBpbiB4cmFuZ2UoX3NpemUxMTcpOgorICAgICAgICAgICAgX2tleTEyMiA9IGlwcm90LnJlYWRTdHJpbmcoKS5kZWNvZGUoJ3V0Zi04JykKKyAgICAgICAgICAgIF92YWwxMjMgPSB7fQorICAgICAgICAgICAgKF9rdHlwZTEyNSwgX3Z0eXBlMTI2LCBfc2l6ZTEyNCApID0gaXByb3QucmVhZE1hcEJlZ2luKCkKKyAgICAgICAgICAgIGZvciBfaTEyOCBpbiB4cmFuZ2UoX3NpemUxMjQpOgorICAgICAgICAgICAgICBfa2V5MTI5ID0gR2xvYmFsU3RyZWFtSWQoKQorICAgICAgICAgICAgICBfa2V5MTI5LnJlYWQoaXByb3QpCisgICAgICAgICAgICAgIF92YWwxMzAgPSBpcHJvdC5yZWFkSTY0KCkKKyAgICAgICAgICAgICAgX3ZhbDEyM1tfa2V5MTI5XSA9IF92YWwxMzAKICAgICAgICAgICAgIGlwcm90LnJlYWRNYXBFbmQoKQotICAgICAgICAgICAgc2VsZi5mYWlsZWRbX2tleTEwNl0gPSBfdmFsMTA3CisgICAgICAgICAgICBzZWxmLmZhaWxlZFtfa2V5MTIyXSA9IF92YWwxMjMKICAgICAgICAgICBpcHJvdC5yZWFkTWFwRW5kKCkKICAgICAgICAgZWxzZToKICAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQogICAgICAgZWxpZiBmaWQgPT0gMzoKICAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuTUFQOgogICAgICAgICAgIHNlbGYucHJvY2Vzc19tc19hdmcgPSB7fQotICAgICAgICAgIChfa3R5cGUxMTYsIF92dHlwZTExNywgX3NpemUxMTUgKSA9IGlwcm90LnJlYWRNYXBCZWdpbigpCi0gICAgICAgICAgZm9yIF9pMTE5IGluIHhyYW5nZShfc2l6ZTExNSk6Ci0gICAgICAgICAgICBfa2V5MTIwID0gaXByb3QucmVhZFN0cmluZygpLmRlY29kZSgndXRmLTgnKQotICAgICAgICAgICAgX3ZhbDEyMSA9IHt9Ci0gICAgICAgICAgICAoX2t0eXBlMTIzLCBfdnR5cGUxMjQsIF9zaXplMTIyICkgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKQotICAgICAgICAgICAgZm9yIF9pMTI2IGluIHhyYW5nZShfc2l6ZTEyMik6Ci0gICAgICAgICAgICAgIF9rZXkxMjcgPSBHbG9iYWxTdHJlYW1JZCgpCi0gICAgICAgICAgICAgIF9rZXkxMjcucmVhZChpcHJvdCkKLSAgICAgICAgICAgICAgX3ZhbDEyOCA9IGlwcm90LnJlYWREb3VibGUoKTsKLSAgICAgICAgICAgICAgX3ZhbDEyMVtfa2V5MTI3XSA9IF92YWwxMjgKKyAgICAgICAgICAoX2t0eXBlMTMyLCBfdnR5cGUxMzMsIF9zaXplMTMxICkgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKQorICAgICAgICAgIGZvciBfaTEzNSBpbiB4cmFuZ2UoX3NpemUxMzEpOgorICAgICAgICAgICAgX2tleTEzNiA9IGlwcm90LnJlYWRTdHJpbmcoKS5kZWNvZGUoJ3V0Zi04JykKKyAgICAgICAgICAgIF92YWwxMzcgPSB7fQorICAgICAgICAgICAgKF9rdHlwZTEzOSwgX3Z0eXBlMTQwLCBfc2l6ZTEzOCApID0gaXByb3QucmVhZE1hcEJlZ2luKCkKKyAgICAgICAgICAgIGZvciBfaTE0MiBpbiB4cmFuZ2UoX3NpemUxMzgpOgorICAgICAgICAgICAgICBfa2V5MTQzID0gR2xvYmFsU3RyZWFtSWQoKQorICAgICAgICAgICAgICBfa2V5MTQzLnJlYWQoaXByb3QpCisgICAgICAgICAgICAgIF92YWwxNDQgPSBpcHJvdC5yZWFkRG91YmxlKCkKKyAgICAgICAgICAgICAgX3ZhbDEzN1tfa2V5MTQzXSA9IF92YWwxNDQKICAgICAgICAgICAgIGlwcm90LnJlYWRNYXBFbmQoKQotICAgICAgICAgICAgc2VsZi5wcm9jZXNzX21zX2F2Z1tfa2V5MTIwXSA9IF92YWwxMjEKKyAgICAgICAgICAgIHNlbGYucHJvY2Vzc19tc19hdmdbX2tleTEzNl0gPSBfdmFsMTM3CiAgICAgICAgICAgaXByb3QucmVhZE1hcEVuZCgpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKICAgICAgIGVsaWYgZmlkID09IDQ6CiAgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLk1BUDoKICAgICAgICAgICBzZWxmLmV4ZWN1dGVkID0ge30KLSAgICAgICAgICAoX2t0eXBlMTMwLCBfdnR5cGUxMzEsIF9zaXplMTI5ICkgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKQotICAgICAgICAgIGZvciBfaTEzMyBpbiB4cmFuZ2UoX3NpemUxMjkpOgotICAgICAgICAgICAgX2tleTEzNCA9IGlwcm90LnJlYWRTdHJpbmcoKS5kZWNvZGUoJ3V0Zi04JykKLSAgICAgICAgICAgIF92YWwxMzUgPSB7fQotICAgICAgICAgICAgKF9rdHlwZTEzNywgX3Z0eXBlMTM4LCBfc2l6ZTEzNiApID0gaXByb3QucmVhZE1hcEJlZ2luKCkKLSAgICAgICAgICAgIGZvciBfaTE0MCBpbiB4cmFuZ2UoX3NpemUxMzYpOgotICAgICAgICAgICAgICBfa2V5MTQxID0gR2xvYmFsU3RyZWFtSWQoKQotICAgICAgICAgICAgICBfa2V5MTQxLnJlYWQoaXByb3QpCi0gICAgICAgICAgICAgIF92YWwxNDIgPSBpcHJvdC5yZWFkSTY0KCk7Ci0gICAgICAgICAgICAgIF92YWwxMzVbX2tleTE0MV0gPSBfdmFsMTQyCisgICAgICAgICAgKF9rdHlwZTE0NiwgX3Z0eXBlMTQ3LCBfc2l6ZTE0NSApID0gaXByb3QucmVhZE1hcEJlZ2luKCkKKyAgICAgICAgICBmb3IgX2kxNDkgaW4geHJhbmdlKF9zaXplMTQ1KToKKyAgICAgICAgICAgIF9rZXkxNTAgPSBpcHJvdC5yZWFkU3RyaW5nKCkuZGVjb2RlKCd1dGYtOCcpCisgICAgICAgICAgICBfdmFsMTUxID0ge30KKyAgICAgICAgICAgIChfa3R5cGUxNTMsIF92dHlwZTE1NCwgX3NpemUxNTIgKSA9IGlwcm90LnJlYWRNYXBCZWdpbigpCisgICAgICAgICAgICBmb3IgX2kxNTYgaW4geHJhbmdlKF9zaXplMTUyKToKKyAgICAgICAgICAgICAgX2tleTE1NyA9IEdsb2JhbFN0cmVhbUlkKCkKKyAgICAgICAgICAgICAgX2tleTE1Ny5yZWFkKGlwcm90KQorICAgICAgICAgICAgICBfdmFsMTU4ID0gaXByb3QucmVhZEk2NCgpCisgICAgICAgICAgICAgIF92YWwxNTFbX2tleTE1N10gPSBfdmFsMTU4CiAgICAgICAgICAgICBpcHJvdC5yZWFkTWFwRW5kKCkKLSAgICAgICAgICAgIHNlbGYuZXhlY3V0ZWRbX2tleTEzNF0gPSBfdmFsMTM1CisgICAgICAgICAgICBzZWxmLmV4ZWN1dGVkW19rZXkxNTBdID0gX3ZhbDE1MQogICAgICAgICAgIGlwcm90LnJlYWRNYXBFbmQoKQogICAgICAgICBlbHNlOgogICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCiAgICAgICBlbGlmIGZpZCA9PSA1OgogICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5NQVA6CiAgICAgICAgICAgc2VsZi5leGVjdXRlX21zX2F2ZyA9IHt9Ci0gICAgICAgICAgKF9rdHlwZTE0NCwgX3Z0eXBlMTQ1LCBfc2l6ZTE0MyApID0gaXByb3QucmVhZE1hcEJlZ2luKCkKLSAgICAgICAgICBmb3IgX2kxNDcgaW4geHJhbmdlKF9zaXplMTQzKToKLSAgICAgICAgICAgIF9rZXkxNDggPSBpcHJvdC5yZWFkU3RyaW5nKCkuZGVjb2RlKCd1dGYtOCcpCi0gICAgICAgICAgICBfdmFsMTQ5ID0ge30KLSAgICAgICAgICAgIChfa3R5cGUxNTEsIF92dHlwZTE1MiwgX3NpemUxNTAgKSA9IGlwcm90LnJlYWRNYXBCZWdpbigpCi0gICAgICAgICAgICBmb3IgX2kxNTQgaW4geHJhbmdlKF9zaXplMTUwKToKLSAgICAgICAgICAgICAgX2tleTE1NSA9IEdsb2JhbFN0cmVhbUlkKCkKLSAgICAgICAgICAgICAgX2tleTE1NS5yZWFkKGlwcm90KQotICAgICAgICAgICAgICBfdmFsMTU2ID0gaXByb3QucmVhZERvdWJsZSgpOwotICAgICAgICAgICAgICBfdmFsMTQ5W19rZXkxNTVdID0gX3ZhbDE1NgorICAgICAgICAgIChfa3R5cGUxNjAsIF92dHlwZTE2MSwgX3NpemUxNTkgKSA9IGlwcm90LnJlYWRNYXBCZWdpbigpCisgICAgICAgICAgZm9yIF9pMTYzIGluIHhyYW5nZShfc2l6ZTE1OSk6CisgICAgICAgICAgICBfa2V5MTY0ID0gaXByb3QucmVhZFN0cmluZygpLmRlY29kZSgndXRmLTgnKQorICAgICAgICAgICAgX3ZhbDE2NSA9IHt9CisgICAgICAgICAgICAoX2t0eXBlMTY3LCBfdnR5cGUxNjgsIF9zaXplMTY2ICkgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKQorICAgICAgICAgICAgZm9yIF9pMTcwIGluIHhyYW5nZShfc2l6ZTE2Nik6CisgICAgICAgICAgICAgIF9rZXkxNzEgPSBHbG9iYWxTdHJlYW1JZCgpCisgICAgICAgICAgICAgIF9rZXkxNzEucmVhZChpcHJvdCkKKyAgICAgICAgICAgICAgX3ZhbDE3MiA9IGlwcm90LnJlYWREb3VibGUoKQorICAgICAgICAgICAgICBfdmFsMTY1W19rZXkxNzFdID0gX3ZhbDE3MgogICAgICAgICAgICAgaXByb3QucmVhZE1hcEVuZCgpCi0gICAgICAgICAgICBzZWxmLmV4ZWN1dGVfbXNfYXZnW19rZXkxNDhdID0gX3ZhbDE0OQorICAgICAgICAgICAgc2VsZi5leGVjdXRlX21zX2F2Z1tfa2V5MTY0XSA9IF92YWwxNjUKICAgICAgICAgICBpcHJvdC5yZWFkTWFwRW5kKCkKICAgICAgICAgZWxzZToKICAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQpAQCAtMjk5OCw2MCArMzI4NSw2MCBAQAogICAgIGlmIHNlbGYuYWNrZWQgaXMgbm90IE5vbmU6CiAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ2Fja2VkJywgVFR5cGUuTUFQLCAxKQogICAgICAgb3Byb3Qud3JpdGVNYXBCZWdpbihUVHlwZS5TVFJJTkcsIFRUeXBlLk1BUCwgbGVuKHNlbGYuYWNrZWQpKQotICAgICAgZm9yIGtpdGVyMTU3LHZpdGVyMTU4IGluIHNlbGYuYWNrZWQuaXRlbXMoKToKLSAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoa2l0ZXIxNTcuZW5jb2RlKCd1dGYtOCcpKQotICAgICAgICBvcHJvdC53cml0ZU1hcEJlZ2luKFRUeXBlLlNUUlVDVCwgVFR5cGUuSTY0LCBsZW4odml0ZXIxNTgpKQotICAgICAgICBmb3Iga2l0ZXIxNTksdml0ZXIxNjAgaW4gdml0ZXIxNTguaXRlbXMoKToKLSAgICAgICAgICBraXRlcjE1OS53cml0ZShvcHJvdCkKLSAgICAgICAgICBvcHJvdC53cml0ZUk2NCh2aXRlcjE2MCkKKyAgICAgIGZvciBraXRlcjE3Myx2aXRlcjE3NCBpbiBzZWxmLmFja2VkLml0ZW1zKCk6CisgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKGtpdGVyMTczLmVuY29kZSgndXRmLTgnKSkKKyAgICAgICAgb3Byb3Qud3JpdGVNYXBCZWdpbihUVHlwZS5TVFJVQ1QsIFRUeXBlLkk2NCwgbGVuKHZpdGVyMTc0KSkKKyAgICAgICAgZm9yIGtpdGVyMTc1LHZpdGVyMTc2IGluIHZpdGVyMTc0Lml0ZW1zKCk6CisgICAgICAgICAga2l0ZXIxNzUud3JpdGUob3Byb3QpCisgICAgICAgICAgb3Byb3Qud3JpdGVJNjQodml0ZXIxNzYpCiAgICAgICAgIG9wcm90LndyaXRlTWFwRW5kKCkKICAgICAgIG9wcm90LndyaXRlTWFwRW5kKCkKICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKQogICAgIGlmIHNlbGYuZmFpbGVkIGlzIG5vdCBOb25lOgogICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCdmYWlsZWQnLCBUVHlwZS5NQVAsIDIpCiAgICAgICBvcHJvdC53cml0ZU1hcEJlZ2luKFRUeXBlLlNUUklORywgVFR5cGUuTUFQLCBsZW4oc2VsZi5mYWlsZWQpKQotICAgICAgZm9yIGtpdGVyMTYxLHZpdGVyMTYyIGluIHNlbGYuZmFpbGVkLml0ZW1zKCk6Ci0gICAgICAgIG9wcm90LndyaXRlU3RyaW5nKGtpdGVyMTYxLmVuY29kZSgndXRmLTgnKSkKLSAgICAgICAgb3Byb3Qud3JpdGVNYXBCZWdpbihUVHlwZS5TVFJVQ1QsIFRUeXBlLkk2NCwgbGVuKHZpdGVyMTYyKSkKLSAgICAgICAgZm9yIGtpdGVyMTYzLHZpdGVyMTY0IGluIHZpdGVyMTYyLml0ZW1zKCk6Ci0gICAgICAgICAga2l0ZXIxNjMud3JpdGUob3Byb3QpCi0gICAgICAgICAgb3Byb3Qud3JpdGVJNjQodml0ZXIxNjQpCisgICAgICBmb3Iga2l0ZXIxNzcsdml0ZXIxNzggaW4gc2VsZi5mYWlsZWQuaXRlbXMoKToKKyAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoa2l0ZXIxNzcuZW5jb2RlKCd1dGYtOCcpKQorICAgICAgICBvcHJvdC53cml0ZU1hcEJlZ2luKFRUeXBlLlNUUlVDVCwgVFR5cGUuSTY0LCBsZW4odml0ZXIxNzgpKQorICAgICAgICBmb3Iga2l0ZXIxNzksdml0ZXIxODAgaW4gdml0ZXIxNzguaXRlbXMoKToKKyAgICAgICAgICBraXRlcjE3OS53cml0ZShvcHJvdCkKKyAgICAgICAgICBvcHJvdC53cml0ZUk2NCh2aXRlcjE4MCkKICAgICAgICAgb3Byb3Qud3JpdGVNYXBFbmQoKQogICAgICAgb3Byb3Qud3JpdGVNYXBFbmQoKQogICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCiAgICAgaWYgc2VsZi5wcm9jZXNzX21zX2F2ZyBpcyBub3QgTm9uZToKICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbigncHJvY2Vzc19tc19hdmcnLCBUVHlwZS5NQVAsIDMpCiAgICAgICBvcHJvdC53cml0ZU1hcEJlZ2luKFRUeXBlLlNUUklORywgVFR5cGUuTUFQLCBsZW4oc2VsZi5wcm9jZXNzX21zX2F2ZykpCi0gICAgICBmb3Iga2l0ZXIxNjUsdml0ZXIxNjYgaW4gc2VsZi5wcm9jZXNzX21zX2F2Zy5pdGVtcygpOgotICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhraXRlcjE2NS5lbmNvZGUoJ3V0Zi04JykpCi0gICAgICAgIG9wcm90LndyaXRlTWFwQmVnaW4oVFR5cGUuU1RSVUNULCBUVHlwZS5ET1VCTEUsIGxlbih2aXRlcjE2NikpCi0gICAgICAgIGZvciBraXRlcjE2Nyx2aXRlcjE2OCBpbiB2aXRlcjE2Ni5pdGVtcygpOgotICAgICAgICAgIGtpdGVyMTY3LndyaXRlKG9wcm90KQotICAgICAgICAgIG9wcm90LndyaXRlRG91YmxlKHZpdGVyMTY4KQorICAgICAgZm9yIGtpdGVyMTgxLHZpdGVyMTgyIGluIHNlbGYucHJvY2Vzc19tc19hdmcuaXRlbXMoKToKKyAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoa2l0ZXIxODEuZW5jb2RlKCd1dGYtOCcpKQorICAgICAgICBvcHJvdC53cml0ZU1hcEJlZ2luKFRUeXBlLlNUUlVDVCwgVFR5cGUuRE9VQkxFLCBsZW4odml0ZXIxODIpKQorICAgICAgICBmb3Iga2l0ZXIxODMsdml0ZXIxODQgaW4gdml0ZXIxODIuaXRlbXMoKToKKyAgICAgICAgICBraXRlcjE4My53cml0ZShvcHJvdCkKKyAgICAgICAgICBvcHJvdC53cml0ZURvdWJsZSh2aXRlcjE4NCkKICAgICAgICAgb3Byb3Qud3JpdGVNYXBFbmQoKQogICAgICAgb3Byb3Qud3JpdGVNYXBFbmQoKQogICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCiAgICAgaWYgc2VsZi5leGVjdXRlZCBpcyBub3QgTm9uZToKICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbignZXhlY3V0ZWQnLCBUVHlwZS5NQVAsIDQpCiAgICAgICBvcHJvdC53cml0ZU1hcEJlZ2luKFRUeXBlLlNUUklORywgVFR5cGUuTUFQLCBsZW4oc2VsZi5leGVjdXRlZCkpCi0gICAgICBmb3Iga2l0ZXIxNjksdml0ZXIxNzAgaW4gc2VsZi5leGVjdXRlZC5pdGVtcygpOgotICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhraXRlcjE2OS5lbmNvZGUoJ3V0Zi04JykpCi0gICAgICAgIG9wcm90LndyaXRlTWFwQmVnaW4oVFR5cGUuU1RSVUNULCBUVHlwZS5JNjQsIGxlbih2aXRlcjE3MCkpCi0gICAgICAgIGZvciBraXRlcjE3MSx2aXRlcjE3MiBpbiB2aXRlcjE3MC5pdGVtcygpOgotICAgICAgICAgIGtpdGVyMTcxLndyaXRlKG9wcm90KQotICAgICAgICAgIG9wcm90LndyaXRlSTY0KHZpdGVyMTcyKQorICAgICAgZm9yIGtpdGVyMTg1LHZpdGVyMTg2IGluIHNlbGYuZXhlY3V0ZWQuaXRlbXMoKToKKyAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoa2l0ZXIxODUuZW5jb2RlKCd1dGYtOCcpKQorICAgICAgICBvcHJvdC53cml0ZU1hcEJlZ2luKFRUeXBlLlNUUlVDVCwgVFR5cGUuSTY0LCBsZW4odml0ZXIxODYpKQorICAgICAgICBmb3Iga2l0ZXIxODcsdml0ZXIxODggaW4gdml0ZXIxODYuaXRlbXMoKToKKyAgICAgICAgICBraXRlcjE4Ny53cml0ZShvcHJvdCkKKyAgICAgICAgICBvcHJvdC53cml0ZUk2NCh2aXRlcjE4OCkKICAgICAgICAgb3Byb3Qud3JpdGVNYXBFbmQoKQogICAgICAgb3Byb3Qud3JpdGVNYXBFbmQoKQogICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCiAgICAgaWYgc2VsZi5leGVjdXRlX21zX2F2ZyBpcyBub3QgTm9uZToKICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbignZXhlY3V0ZV9tc19hdmcnLCBUVHlwZS5NQVAsIDUpCiAgICAgICBvcHJvdC53cml0ZU1hcEJlZ2luKFRUeXBlLlNUUklORywgVFR5cGUuTUFQLCBsZW4oc2VsZi5leGVjdXRlX21zX2F2ZykpCi0gICAgICBmb3Iga2l0ZXIxNzMsdml0ZXIxNzQgaW4gc2VsZi5leGVjdXRlX21zX2F2Zy5pdGVtcygpOgotICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhraXRlcjE3My5lbmNvZGUoJ3V0Zi04JykpCi0gICAgICAgIG9wcm90LndyaXRlTWFwQmVnaW4oVFR5cGUuU1RSVUNULCBUVHlwZS5ET1VCTEUsIGxlbih2aXRlcjE3NCkpCi0gICAgICAgIGZvciBraXRlcjE3NSx2aXRlcjE3NiBpbiB2aXRlcjE3NC5pdGVtcygpOgotICAgICAgICAgIGtpdGVyMTc1LndyaXRlKG9wcm90KQotICAgICAgICAgIG9wcm90LndyaXRlRG91YmxlKHZpdGVyMTc2KQorICAgICAgZm9yIGtpdGVyMTg5LHZpdGVyMTkwIGluIHNlbGYuZXhlY3V0ZV9tc19hdmcuaXRlbXMoKToKKyAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoa2l0ZXIxODkuZW5jb2RlKCd1dGYtOCcpKQorICAgICAgICBvcHJvdC53cml0ZU1hcEJlZ2luKFRUeXBlLlNUUlVDVCwgVFR5cGUuRE9VQkxFLCBsZW4odml0ZXIxOTApKQorICAgICAgICBmb3Iga2l0ZXIxOTEsdml0ZXIxOTIgaW4gdml0ZXIxOTAuaXRlbXMoKToKKyAgICAgICAgICBraXRlcjE5MS53cml0ZShvcHJvdCkKKyAgICAgICAgICBvcHJvdC53cml0ZURvdWJsZSh2aXRlcjE5MikKICAgICAgICAgb3Byb3Qud3JpdGVNYXBFbmQoKQogICAgICAgb3Byb3Qud3JpdGVNYXBFbmQoKQogICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCkBAIC0zMTI0LDUxICszNDExLDUxIEBACiAgICAgICBpZiBmaWQgPT0gMToKICAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuTUFQOgogICAgICAgICAgIHNlbGYuYWNrZWQgPSB7fQotICAgICAgICAgIChfa3R5cGUxNzgsIF92dHlwZTE3OSwgX3NpemUxNzcgKSA9IGlwcm90LnJlYWRNYXBCZWdpbigpCi0gICAgICAgICAgZm9yIF9pMTgxIGluIHhyYW5nZShfc2l6ZTE3Nyk6Ci0gICAgICAgICAgICBfa2V5MTgyID0gaXByb3QucmVhZFN0cmluZygpLmRlY29kZSgndXRmLTgnKQotICAgICAgICAgICAgX3ZhbDE4MyA9IHt9Ci0gICAgICAgICAgICAoX2t0eXBlMTg1LCBfdnR5cGUxODYsIF9zaXplMTg0ICkgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKQotICAgICAgICAgICAgZm9yIF9pMTg4IGluIHhyYW5nZShfc2l6ZTE4NCk6Ci0gICAgICAgICAgICAgIF9rZXkxODkgPSBpcHJvdC5yZWFkU3RyaW5nKCkuZGVjb2RlKCd1dGYtOCcpCi0gICAgICAgICAgICAgIF92YWwxOTAgPSBpcHJvdC5yZWFkSTY0KCk7Ci0gICAgICAgICAgICAgIF92YWwxODNbX2tleTE4OV0gPSBfdmFsMTkwCisgICAgICAgICAgKF9rdHlwZTE5NCwgX3Z0eXBlMTk1LCBfc2l6ZTE5MyApID0gaXByb3QucmVhZE1hcEJlZ2luKCkKKyAgICAgICAgICBmb3IgX2kxOTcgaW4geHJhbmdlKF9zaXplMTkzKToKKyAgICAgICAgICAgIF9rZXkxOTggPSBpcHJvdC5yZWFkU3RyaW5nKCkuZGVjb2RlKCd1dGYtOCcpCisgICAgICAgICAgICBfdmFsMTk5ID0ge30KKyAgICAgICAgICAgIChfa3R5cGUyMDEsIF92dHlwZTIwMiwgX3NpemUyMDAgKSA9IGlwcm90LnJlYWRNYXBCZWdpbigpCisgICAgICAgICAgICBmb3IgX2kyMDQgaW4geHJhbmdlKF9zaXplMjAwKToKKyAgICAgICAgICAgICAgX2tleTIwNSA9IGlwcm90LnJlYWRTdHJpbmcoKS5kZWNvZGUoJ3V0Zi04JykKKyAgICAgICAgICAgICAgX3ZhbDIwNiA9IGlwcm90LnJlYWRJNjQoKQorICAgICAgICAgICAgICBfdmFsMTk5W19rZXkyMDVdID0gX3ZhbDIwNgogICAgICAgICAgICAgaXByb3QucmVhZE1hcEVuZCgpCi0gICAgICAgICAgICBzZWxmLmFja2VkW19rZXkxODJdID0gX3ZhbDE4MworICAgICAgICAgICAgc2VsZi5hY2tlZFtfa2V5MTk4XSA9IF92YWwxOTkKICAgICAgICAgICBpcHJvdC5yZWFkTWFwRW5kKCkKICAgICAgICAgZWxzZToKICAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQogICAgICAgZWxpZiBmaWQgPT0gMjoKICAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuTUFQOgogICAgICAgICAgIHNlbGYuZmFpbGVkID0ge30KLSAgICAgICAgICAoX2t0eXBlMTkyLCBfdnR5cGUxOTMsIF9zaXplMTkxICkgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKQotICAgICAgICAgIGZvciBfaTE5NSBpbiB4cmFuZ2UoX3NpemUxOTEpOgotICAgICAgICAgICAgX2tleTE5NiA9IGlwcm90LnJlYWRTdHJpbmcoKS5kZWNvZGUoJ3V0Zi04JykKLSAgICAgICAgICAgIF92YWwxOTcgPSB7fQotICAgICAgICAgICAgKF9rdHlwZTE5OSwgX3Z0eXBlMjAwLCBfc2l6ZTE5OCApID0gaXByb3QucmVhZE1hcEJlZ2luKCkKLSAgICAgICAgICAgIGZvciBfaTIwMiBpbiB4cmFuZ2UoX3NpemUxOTgpOgotICAgICAgICAgICAgICBfa2V5MjAzID0gaXByb3QucmVhZFN0cmluZygpLmRlY29kZSgndXRmLTgnKQotICAgICAgICAgICAgICBfdmFsMjA0ID0gaXByb3QucmVhZEk2NCgpOwotICAgICAgICAgICAgICBfdmFsMTk3W19rZXkyMDNdID0gX3ZhbDIwNAorICAgICAgICAgIChfa3R5cGUyMDgsIF92dHlwZTIwOSwgX3NpemUyMDcgKSA9IGlwcm90LnJlYWRNYXBCZWdpbigpCisgICAgICAgICAgZm9yIF9pMjExIGluIHhyYW5nZShfc2l6ZTIwNyk6CisgICAgICAgICAgICBfa2V5MjEyID0gaXByb3QucmVhZFN0cmluZygpLmRlY29kZSgndXRmLTgnKQorICAgICAgICAgICAgX3ZhbDIxMyA9IHt9CisgICAgICAgICAgICAoX2t0eXBlMjE1LCBfdnR5cGUyMTYsIF9zaXplMjE0ICkgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKQorICAgICAgICAgICAgZm9yIF9pMjE4IGluIHhyYW5nZShfc2l6ZTIxNCk6CisgICAgICAgICAgICAgIF9rZXkyMTkgPSBpcHJvdC5yZWFkU3RyaW5nKCkuZGVjb2RlKCd1dGYtOCcpCisgICAgICAgICAgICAgIF92YWwyMjAgPSBpcHJvdC5yZWFkSTY0KCkKKyAgICAgICAgICAgICAgX3ZhbDIxM1tfa2V5MjE5XSA9IF92YWwyMjAKICAgICAgICAgICAgIGlwcm90LnJlYWRNYXBFbmQoKQotICAgICAgICAgICAgc2VsZi5mYWlsZWRbX2tleTE5Nl0gPSBfdmFsMTk3CisgICAgICAgICAgICBzZWxmLmZhaWxlZFtfa2V5MjEyXSA9IF92YWwyMTMKICAgICAgICAgICBpcHJvdC5yZWFkTWFwRW5kKCkKICAgICAgICAgZWxzZToKICAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQogICAgICAgZWxpZiBmaWQgPT0gMzoKICAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuTUFQOgogICAgICAgICAgIHNlbGYuY29tcGxldGVfbXNfYXZnID0ge30KLSAgICAgICAgICAoX2t0eXBlMjA2LCBfdnR5cGUyMDcsIF9zaXplMjA1ICkgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKQotICAgICAgICAgIGZvciBfaTIwOSBpbiB4cmFuZ2UoX3NpemUyMDUpOgotICAgICAgICAgICAgX2tleTIxMCA9IGlwcm90LnJlYWRTdHJpbmcoKS5kZWNvZGUoJ3V0Zi04JykKLSAgICAgICAgICAgIF92YWwyMTEgPSB7fQotICAgICAgICAgICAgKF9rdHlwZTIxMywgX3Z0eXBlMjE0LCBfc2l6ZTIxMiApID0gaXByb3QucmVhZE1hcEJlZ2luKCkKLSAgICAgICAgICAgIGZvciBfaTIxNiBpbiB4cmFuZ2UoX3NpemUyMTIpOgotICAgICAgICAgICAgICBfa2V5MjE3ID0gaXByb3QucmVhZFN0cmluZygpLmRlY29kZSgndXRmLTgnKQotICAgICAgICAgICAgICBfdmFsMjE4ID0gaXByb3QucmVhZERvdWJsZSgpOwotICAgICAgICAgICAgICBfdmFsMjExW19rZXkyMTddID0gX3ZhbDIxOAorICAgICAgICAgIChfa3R5cGUyMjIsIF92dHlwZTIyMywgX3NpemUyMjEgKSA9IGlwcm90LnJlYWRNYXBCZWdpbigpCisgICAgICAgICAgZm9yIF9pMjI1IGluIHhyYW5nZShfc2l6ZTIyMSk6CisgICAgICAgICAgICBfa2V5MjI2ID0gaXByb3QucmVhZFN0cmluZygpLmRlY29kZSgndXRmLTgnKQorICAgICAgICAgICAgX3ZhbDIyNyA9IHt9CisgICAgICAgICAgICAoX2t0eXBlMjI5LCBfdnR5cGUyMzAsIF9zaXplMjI4ICkgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKQorICAgICAgICAgICAgZm9yIF9pMjMyIGluIHhyYW5nZShfc2l6ZTIyOCk6CisgICAgICAgICAgICAgIF9rZXkyMzMgPSBpcHJvdC5yZWFkU3RyaW5nKCkuZGVjb2RlKCd1dGYtOCcpCisgICAgICAgICAgICAgIF92YWwyMzQgPSBpcHJvdC5yZWFkRG91YmxlKCkKKyAgICAgICAgICAgICAgX3ZhbDIyN1tfa2V5MjMzXSA9IF92YWwyMzQKICAgICAgICAgICAgIGlwcm90LnJlYWRNYXBFbmQoKQotICAgICAgICAgICAgc2VsZi5jb21wbGV0ZV9tc19hdmdbX2tleTIxMF0gPSBfdmFsMjExCisgICAgICAgICAgICBzZWxmLmNvbXBsZXRlX21zX2F2Z1tfa2V5MjI2XSA9IF92YWwyMjcKICAgICAgICAgICBpcHJvdC5yZWFkTWFwRW5kKCkKICAgICAgICAgZWxzZToKICAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQpAQCAtMzE4NSwzNiArMzQ3MiwzNiBAQAogICAgIGlmIHNlbGYuYWNrZWQgaXMgbm90IE5vbmU6CiAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ2Fja2VkJywgVFR5cGUuTUFQLCAxKQogICAgICAgb3Byb3Qud3JpdGVNYXBCZWdpbihUVHlwZS5TVFJJTkcsIFRUeXBlLk1BUCwgbGVuKHNlbGYuYWNrZWQpKQotICAgICAgZm9yIGtpdGVyMjE5LHZpdGVyMjIwIGluIHNlbGYuYWNrZWQuaXRlbXMoKToKLSAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoa2l0ZXIyMTkuZW5jb2RlKCd1dGYtOCcpKQotICAgICAgICBvcHJvdC53cml0ZU1hcEJlZ2luKFRUeXBlLlNUUklORywgVFR5cGUuSTY0LCBsZW4odml0ZXIyMjApKQotICAgICAgICBmb3Iga2l0ZXIyMjEsdml0ZXIyMjIgaW4gdml0ZXIyMjAuaXRlbXMoKToKLSAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhraXRlcjIyMS5lbmNvZGUoJ3V0Zi04JykpCi0gICAgICAgICAgb3Byb3Qud3JpdGVJNjQodml0ZXIyMjIpCisgICAgICBmb3Iga2l0ZXIyMzUsdml0ZXIyMzYgaW4gc2VsZi5hY2tlZC5pdGVtcygpOgorICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhraXRlcjIzNS5lbmNvZGUoJ3V0Zi04JykpCisgICAgICAgIG9wcm90LndyaXRlTWFwQmVnaW4oVFR5cGUuU1RSSU5HLCBUVHlwZS5JNjQsIGxlbih2aXRlcjIzNikpCisgICAgICAgIGZvciBraXRlcjIzNyx2aXRlcjIzOCBpbiB2aXRlcjIzNi5pdGVtcygpOgorICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKGtpdGVyMjM3LmVuY29kZSgndXRmLTgnKSkKKyAgICAgICAgICBvcHJvdC53cml0ZUk2NCh2aXRlcjIzOCkKICAgICAgICAgb3Byb3Qud3JpdGVNYXBFbmQoKQogICAgICAgb3Byb3Qud3JpdGVNYXBFbmQoKQogICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCiAgICAgaWYgc2VsZi5mYWlsZWQgaXMgbm90IE5vbmU6CiAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ2ZhaWxlZCcsIFRUeXBlLk1BUCwgMikKICAgICAgIG9wcm90LndyaXRlTWFwQmVnaW4oVFR5cGUuU1RSSU5HLCBUVHlwZS5NQVAsIGxlbihzZWxmLmZhaWxlZCkpCi0gICAgICBmb3Iga2l0ZXIyMjMsdml0ZXIyMjQgaW4gc2VsZi5mYWlsZWQuaXRlbXMoKToKLSAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoa2l0ZXIyMjMuZW5jb2RlKCd1dGYtOCcpKQotICAgICAgICBvcHJvdC53cml0ZU1hcEJlZ2luKFRUeXBlLlNUUklORywgVFR5cGUuSTY0LCBsZW4odml0ZXIyMjQpKQotICAgICAgICBmb3Iga2l0ZXIyMjUsdml0ZXIyMjYgaW4gdml0ZXIyMjQuaXRlbXMoKToKLSAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhraXRlcjIyNS5lbmNvZGUoJ3V0Zi04JykpCi0gICAgICAgICAgb3Byb3Qud3JpdGVJNjQodml0ZXIyMjYpCisgICAgICBmb3Iga2l0ZXIyMzksdml0ZXIyNDAgaW4gc2VsZi5mYWlsZWQuaXRlbXMoKToKKyAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoa2l0ZXIyMzkuZW5jb2RlKCd1dGYtOCcpKQorICAgICAgICBvcHJvdC53cml0ZU1hcEJlZ2luKFRUeXBlLlNUUklORywgVFR5cGUuSTY0LCBsZW4odml0ZXIyNDApKQorICAgICAgICBmb3Iga2l0ZXIyNDEsdml0ZXIyNDIgaW4gdml0ZXIyNDAuaXRlbXMoKToKKyAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhraXRlcjI0MS5lbmNvZGUoJ3V0Zi04JykpCisgICAgICAgICAgb3Byb3Qud3JpdGVJNjQodml0ZXIyNDIpCiAgICAgICAgIG9wcm90LndyaXRlTWFwRW5kKCkKICAgICAgIG9wcm90LndyaXRlTWFwRW5kKCkKICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKQogICAgIGlmIHNlbGYuY29tcGxldGVfbXNfYXZnIGlzIG5vdCBOb25lOgogICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCdjb21wbGV0ZV9tc19hdmcnLCBUVHlwZS5NQVAsIDMpCiAgICAgICBvcHJvdC53cml0ZU1hcEJlZ2luKFRUeXBlLlNUUklORywgVFR5cGUuTUFQLCBsZW4oc2VsZi5jb21wbGV0ZV9tc19hdmcpKQotICAgICAgZm9yIGtpdGVyMjI3LHZpdGVyMjI4IGluIHNlbGYuY29tcGxldGVfbXNfYXZnLml0ZW1zKCk6Ci0gICAgICAgIG9wcm90LndyaXRlU3RyaW5nKGtpdGVyMjI3LmVuY29kZSgndXRmLTgnKSkKLSAgICAgICAgb3Byb3Qud3JpdGVNYXBCZWdpbihUVHlwZS5TVFJJTkcsIFRUeXBlLkRPVUJMRSwgbGVuKHZpdGVyMjI4KSkKLSAgICAgICAgZm9yIGtpdGVyMjI5LHZpdGVyMjMwIGluIHZpdGVyMjI4Lml0ZW1zKCk6Ci0gICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoa2l0ZXIyMjkuZW5jb2RlKCd1dGYtOCcpKQotICAgICAgICAgIG9wcm90LndyaXRlRG91YmxlKHZpdGVyMjMwKQorICAgICAgZm9yIGtpdGVyMjQzLHZpdGVyMjQ0IGluIHNlbGYuY29tcGxldGVfbXNfYXZnLml0ZW1zKCk6CisgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKGtpdGVyMjQzLmVuY29kZSgndXRmLTgnKSkKKyAgICAgICAgb3Byb3Qud3JpdGVNYXBCZWdpbihUVHlwZS5TVFJJTkcsIFRUeXBlLkRPVUJMRSwgbGVuKHZpdGVyMjQ0KSkKKyAgICAgICAgZm9yIGtpdGVyMjQ1LHZpdGVyMjQ2IGluIHZpdGVyMjQ0Lml0ZW1zKCk6CisgICAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoa2l0ZXIyNDUuZW5jb2RlKCd1dGYtOCcpKQorICAgICAgICAgIG9wcm90LndyaXRlRG91YmxlKHZpdGVyMjQ2KQogICAgICAgICBvcHJvdC53cml0ZU1hcEVuZCgpCiAgICAgICBvcHJvdC53cml0ZU1hcEVuZCgpCiAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKQEAgLTMzNjQsMzQgKzM2NTEsMzQgQEAKICAgICAgIGlmIGZpZCA9PSAxOgogICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5NQVA6CiAgICAgICAgICAgc2VsZi5lbWl0dGVkID0ge30KLSAgICAgICAgICAoX2t0eXBlMjMyLCBfdnR5cGUyMzMsIF9zaXplMjMxICkgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKQotICAgICAgICAgIGZvciBfaTIzNSBpbiB4cmFuZ2UoX3NpemUyMzEpOgotICAgICAgICAgICAgX2tleTIzNiA9IGlwcm90LnJlYWRTdHJpbmcoKS5kZWNvZGUoJ3V0Zi04JykKLSAgICAgICAgICAgIF92YWwyMzcgPSB7fQotICAgICAgICAgICAgKF9rdHlwZTIzOSwgX3Z0eXBlMjQwLCBfc2l6ZTIzOCApID0gaXByb3QucmVhZE1hcEJlZ2luKCkKLSAgICAgICAgICAgIGZvciBfaTI0MiBpbiB4cmFuZ2UoX3NpemUyMzgpOgotICAgICAgICAgICAgICBfa2V5MjQzID0gaXByb3QucmVhZFN0cmluZygpLmRlY29kZSgndXRmLTgnKQotICAgICAgICAgICAgICBfdmFsMjQ0ID0gaXByb3QucmVhZEk2NCgpOwotICAgICAgICAgICAgICBfdmFsMjM3W19rZXkyNDNdID0gX3ZhbDI0NAorICAgICAgICAgIChfa3R5cGUyNDgsIF92dHlwZTI0OSwgX3NpemUyNDcgKSA9IGlwcm90LnJlYWRNYXBCZWdpbigpCisgICAgICAgICAgZm9yIF9pMjUxIGluIHhyYW5nZShfc2l6ZTI0Nyk6CisgICAgICAgICAgICBfa2V5MjUyID0gaXByb3QucmVhZFN0cmluZygpLmRlY29kZSgndXRmLTgnKQorICAgICAgICAgICAgX3ZhbDI1MyA9IHt9CisgICAgICAgICAgICAoX2t0eXBlMjU1LCBfdnR5cGUyNTYsIF9zaXplMjU0ICkgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKQorICAgICAgICAgICAgZm9yIF9pMjU4IGluIHhyYW5nZShfc2l6ZTI1NCk6CisgICAgICAgICAgICAgIF9rZXkyNTkgPSBpcHJvdC5yZWFkU3RyaW5nKCkuZGVjb2RlKCd1dGYtOCcpCisgICAgICAgICAgICAgIF92YWwyNjAgPSBpcHJvdC5yZWFkSTY0KCkKKyAgICAgICAgICAgICAgX3ZhbDI1M1tfa2V5MjU5XSA9IF92YWwyNjAKICAgICAgICAgICAgIGlwcm90LnJlYWRNYXBFbmQoKQotICAgICAgICAgICAgc2VsZi5lbWl0dGVkW19rZXkyMzZdID0gX3ZhbDIzNworICAgICAgICAgICAgc2VsZi5lbWl0dGVkW19rZXkyNTJdID0gX3ZhbDI1MwogICAgICAgICAgIGlwcm90LnJlYWRNYXBFbmQoKQogICAgICAgICBlbHNlOgogICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCiAgICAgICBlbGlmIGZpZCA9PSAyOgogICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5NQVA6CiAgICAgICAgICAgc2VsZi50cmFuc2ZlcnJlZCA9IHt9Ci0gICAgICAgICAgKF9rdHlwZTI0NiwgX3Z0eXBlMjQ3LCBfc2l6ZTI0NSApID0gaXByb3QucmVhZE1hcEJlZ2luKCkKLSAgICAgICAgICBmb3IgX2kyNDkgaW4geHJhbmdlKF9zaXplMjQ1KToKLSAgICAgICAgICAgIF9rZXkyNTAgPSBpcHJvdC5yZWFkU3RyaW5nKCkuZGVjb2RlKCd1dGYtOCcpCi0gICAgICAgICAgICBfdmFsMjUxID0ge30KLSAgICAgICAgICAgIChfa3R5cGUyNTMsIF92dHlwZTI1NCwgX3NpemUyNTIgKSA9IGlwcm90LnJlYWRNYXBCZWdpbigpCi0gICAgICAgICAgICBmb3IgX2kyNTYgaW4geHJhbmdlKF9zaXplMjUyKToKLSAgICAgICAgICAgICAgX2tleTI1NyA9IGlwcm90LnJlYWRTdHJpbmcoKS5kZWNvZGUoJ3V0Zi04JykKLSAgICAgICAgICAgICAgX3ZhbDI1OCA9IGlwcm90LnJlYWRJNjQoKTsKLSAgICAgICAgICAgICAgX3ZhbDI1MVtfa2V5MjU3XSA9IF92YWwyNTgKKyAgICAgICAgICAoX2t0eXBlMjYyLCBfdnR5cGUyNjMsIF9zaXplMjYxICkgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKQorICAgICAgICAgIGZvciBfaTI2NSBpbiB4cmFuZ2UoX3NpemUyNjEpOgorICAgICAgICAgICAgX2tleTI2NiA9IGlwcm90LnJlYWRTdHJpbmcoKS5kZWNvZGUoJ3V0Zi04JykKKyAgICAgICAgICAgIF92YWwyNjcgPSB7fQorICAgICAgICAgICAgKF9rdHlwZTI2OSwgX3Z0eXBlMjcwLCBfc2l6ZTI2OCApID0gaXByb3QucmVhZE1hcEJlZ2luKCkKKyAgICAgICAgICAgIGZvciBfaTI3MiBpbiB4cmFuZ2UoX3NpemUyNjgpOgorICAgICAgICAgICAgICBfa2V5MjczID0gaXByb3QucmVhZFN0cmluZygpLmRlY29kZSgndXRmLTgnKQorICAgICAgICAgICAgICBfdmFsMjc0ID0gaXByb3QucmVhZEk2NCgpCisgICAgICAgICAgICAgIF92YWwyNjdbX2tleTI3M10gPSBfdmFsMjc0CiAgICAgICAgICAgICBpcHJvdC5yZWFkTWFwRW5kKCkKLSAgICAgICAgICAgIHNlbGYudHJhbnNmZXJyZWRbX2tleTI1MF0gPSBfdmFsMjUxCisgICAgICAgICAgICBzZWxmLnRyYW5zZmVycmVkW19rZXkyNjZdID0gX3ZhbDI2NwogICAgICAgICAgIGlwcm90LnJlYWRNYXBFbmQoKQogICAgICAgICBlbHNlOgogICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCkBAIC0zNDAzLDcgKzM2OTAsNyBAQAogICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCiAgICAgICBlbGlmIGZpZCA9PSA0OgogICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5ET1VCTEU6Ci0gICAgICAgICAgc2VsZi5yYXRlID0gaXByb3QucmVhZERvdWJsZSgpOworICAgICAgICAgIHNlbGYucmF0ZSA9IGlwcm90LnJlYWREb3VibGUoKQogICAgICAgICBlbHNlOgogICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCiAgICAgICBlbHNlOgpAQCAtMzQxOSwyNCArMzcwNiwyNCBAQAogICAgIGlmIHNlbGYuZW1pdHRlZCBpcyBub3QgTm9uZToKICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbignZW1pdHRlZCcsIFRUeXBlLk1BUCwgMSkKICAgICAgIG9wcm90LndyaXRlTWFwQmVnaW4oVFR5cGUuU1RSSU5HLCBUVHlwZS5NQVAsIGxlbihzZWxmLmVtaXR0ZWQpKQotICAgICAgZm9yIGtpdGVyMjU5LHZpdGVyMjYwIGluIHNlbGYuZW1pdHRlZC5pdGVtcygpOgotICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhraXRlcjI1OS5lbmNvZGUoJ3V0Zi04JykpCi0gICAgICAgIG9wcm90LndyaXRlTWFwQmVnaW4oVFR5cGUuU1RSSU5HLCBUVHlwZS5JNjQsIGxlbih2aXRlcjI2MCkpCi0gICAgICAgIGZvciBraXRlcjI2MSx2aXRlcjI2MiBpbiB2aXRlcjI2MC5pdGVtcygpOgotICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKGtpdGVyMjYxLmVuY29kZSgndXRmLTgnKSkKLSAgICAgICAgICBvcHJvdC53cml0ZUk2NCh2aXRlcjI2MikKKyAgICAgIGZvciBraXRlcjI3NSx2aXRlcjI3NiBpbiBzZWxmLmVtaXR0ZWQuaXRlbXMoKToKKyAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoa2l0ZXIyNzUuZW5jb2RlKCd1dGYtOCcpKQorICAgICAgICBvcHJvdC53cml0ZU1hcEJlZ2luKFRUeXBlLlNUUklORywgVFR5cGUuSTY0LCBsZW4odml0ZXIyNzYpKQorICAgICAgICBmb3Iga2l0ZXIyNzcsdml0ZXIyNzggaW4gdml0ZXIyNzYuaXRlbXMoKToKKyAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhraXRlcjI3Ny5lbmNvZGUoJ3V0Zi04JykpCisgICAgICAgICAgb3Byb3Qud3JpdGVJNjQodml0ZXIyNzgpCiAgICAgICAgIG9wcm90LndyaXRlTWFwRW5kKCkKICAgICAgIG9wcm90LndyaXRlTWFwRW5kKCkKICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKQogICAgIGlmIHNlbGYudHJhbnNmZXJyZWQgaXMgbm90IE5vbmU6CiAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ3RyYW5zZmVycmVkJywgVFR5cGUuTUFQLCAyKQogICAgICAgb3Byb3Qud3JpdGVNYXBCZWdpbihUVHlwZS5TVFJJTkcsIFRUeXBlLk1BUCwgbGVuKHNlbGYudHJhbnNmZXJyZWQpKQotICAgICAgZm9yIGtpdGVyMjYzLHZpdGVyMjY0IGluIHNlbGYudHJhbnNmZXJyZWQuaXRlbXMoKToKLSAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoa2l0ZXIyNjMuZW5jb2RlKCd1dGYtOCcpKQotICAgICAgICBvcHJvdC53cml0ZU1hcEJlZ2luKFRUeXBlLlNUUklORywgVFR5cGUuSTY0LCBsZW4odml0ZXIyNjQpKQotICAgICAgICBmb3Iga2l0ZXIyNjUsdml0ZXIyNjYgaW4gdml0ZXIyNjQuaXRlbXMoKToKLSAgICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhraXRlcjI2NS5lbmNvZGUoJ3V0Zi04JykpCi0gICAgICAgICAgb3Byb3Qud3JpdGVJNjQodml0ZXIyNjYpCisgICAgICBmb3Iga2l0ZXIyNzksdml0ZXIyODAgaW4gc2VsZi50cmFuc2ZlcnJlZC5pdGVtcygpOgorICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhraXRlcjI3OS5lbmNvZGUoJ3V0Zi04JykpCisgICAgICAgIG9wcm90LndyaXRlTWFwQmVnaW4oVFR5cGUuU1RSSU5HLCBUVHlwZS5JNjQsIGxlbih2aXRlcjI4MCkpCisgICAgICAgIGZvciBraXRlcjI4MSx2aXRlcjI4MiBpbiB2aXRlcjI4MC5pdGVtcygpOgorICAgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKGtpdGVyMjgxLmVuY29kZSgndXRmLTgnKSkKKyAgICAgICAgICBvcHJvdC53cml0ZUk2NCh2aXRlcjI4MikKICAgICAgICAgb3Byb3Qud3JpdGVNYXBFbmQoKQogICAgICAgb3Byb3Qud3JpdGVNYXBFbmQoKQogICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCkBAIC0zNTEwLDEyICszNzk3LDEyIEBACiAgICAgICAgIGJyZWFrCiAgICAgICBpZiBmaWQgPT0gMToKICAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuSTMyOgotICAgICAgICAgIHNlbGYudGFza19zdGFydCA9IGlwcm90LnJlYWRJMzIoKTsKKyAgICAgICAgICBzZWxmLnRhc2tfc3RhcnQgPSBpcHJvdC5yZWFkSTMyKCkKICAgICAgICAgZWxzZToKICAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQogICAgICAgZWxpZiBmaWQgPT0gMjoKICAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuSTMyOgotICAgICAgICAgIHNlbGYudGFza19lbmQgPSBpcHJvdC5yZWFkSTMyKCk7CisgICAgICAgICAgc2VsZi50YXNrX2VuZCA9IGlwcm90LnJlYWRJMzIoKQogICAgICAgICBlbHNlOgogICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCiAgICAgICBlbHNlOgpAQCAtMzYyMSwxMiArMzkwOCwxMiBAQAogICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCiAgICAgICBlbGlmIGZpZCA9PSA0OgogICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5JMzI6Ci0gICAgICAgICAgc2VsZi5wb3J0ID0gaXByb3QucmVhZEkzMigpOworICAgICAgICAgIHNlbGYucG9ydCA9IGlwcm90LnJlYWRJMzIoKQogICAgICAgICBlbHNlOgogICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCiAgICAgICBlbGlmIGZpZCA9PSA1OgogICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5JMzI6Ci0gICAgICAgICAgc2VsZi51cHRpbWVfc2VjcyA9IGlwcm90LnJlYWRJMzIoKTsKKyAgICAgICAgICBzZWxmLnVwdGltZV9zZWNzID0gaXByb3QucmVhZEkzMigpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKICAgICAgIGVsaWYgZmlkID09IDc6CkBAIC0zNzA3LDYgKzM5OTQsODQgQEAKICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgcmV0dXJuIG5vdCAoc2VsZiA9PSBvdGhlcikKIAorY2xhc3MgRGVidWdPcHRpb25zOgorICAiIiIKKyAgQXR0cmlidXRlczoKKyAgIC0gZW5hYmxlCisgICAtIHNhbXBsaW5ncGN0CisgICIiIgorCisgIHRocmlmdF9zcGVjID0gKAorICAgIE5vbmUsICMgMAorICAgICgxLCBUVHlwZS5CT09MLCAnZW5hYmxlJywgTm9uZSwgTm9uZSwgKSwgIyAxCisgICAgKDIsIFRUeXBlLkRPVUJMRSwgJ3NhbXBsaW5ncGN0JywgTm9uZSwgTm9uZSwgKSwgIyAyCisgICkKKworICBkZWYgX19pbml0X18oc2VsZiwgZW5hYmxlPU5vbmUsIHNhbXBsaW5ncGN0PU5vbmUsKToKKyAgICBzZWxmLmVuYWJsZSA9IGVuYWJsZQorICAgIHNlbGYuc2FtcGxpbmdwY3QgPSBzYW1wbGluZ3BjdAorCisgIGRlZiByZWFkKHNlbGYsIGlwcm90KToKKyAgICBpZiBpcHJvdC5fX2NsYXNzX18gPT0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIGFuZCBpc2luc3RhbmNlKGlwcm90LnRyYW5zLCBUVHJhbnNwb3J0LkNSZWFkYWJsZVRyYW5zcG9ydCkgYW5kIHNlbGYudGhyaWZ0X3NwZWMgaXMgbm90IE5vbmUgYW5kIGZhc3RiaW5hcnkgaXMgbm90IE5vbmU6CisgICAgICBmYXN0YmluYXJ5LmRlY29kZV9iaW5hcnkoc2VsZiwgaXByb3QudHJhbnMsIChzZWxmLl9fY2xhc3NfXywgc2VsZi50aHJpZnRfc3BlYykpCisgICAgICByZXR1cm4KKyAgICBpcHJvdC5yZWFkU3RydWN0QmVnaW4oKQorICAgIHdoaWxlIFRydWU6CisgICAgICAoZm5hbWUsIGZ0eXBlLCBmaWQpID0gaXByb3QucmVhZEZpZWxkQmVnaW4oKQorICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuU1RPUDoKKyAgICAgICAgYnJlYWsKKyAgICAgIGlmIGZpZCA9PSAxOgorICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5CT09MOgorICAgICAgICAgIHNlbGYuZW5hYmxlID0gaXByb3QucmVhZEJvb2woKQorICAgICAgICBlbHNlOgorICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBlbGlmIGZpZCA9PSAyOgorICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5ET1VCTEU6CisgICAgICAgICAgc2VsZi5zYW1wbGluZ3BjdCA9IGlwcm90LnJlYWREb3VibGUoKQorICAgICAgICBlbHNlOgorICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBlbHNlOgorICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgaXByb3QucmVhZEZpZWxkRW5kKCkKKyAgICBpcHJvdC5yZWFkU3RydWN0RW5kKCkKKworICBkZWYgd3JpdGUoc2VsZiwgb3Byb3QpOgorICAgIGlmIG9wcm90Ll9fY2xhc3NfXyA9PSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgYW5kIHNlbGYudGhyaWZ0X3NwZWMgaXMgbm90IE5vbmUgYW5kIGZhc3RiaW5hcnkgaXMgbm90IE5vbmU6CisgICAgICBvcHJvdC50cmFucy53cml0ZShmYXN0YmluYXJ5LmVuY29kZV9iaW5hcnkoc2VsZiwgKHNlbGYuX19jbGFzc19fLCBzZWxmLnRocmlmdF9zcGVjKSkpCisgICAgICByZXR1cm4KKyAgICBvcHJvdC53cml0ZVN0cnVjdEJlZ2luKCdEZWJ1Z09wdGlvbnMnKQorICAgIGlmIHNlbGYuZW5hYmxlIGlzIG5vdCBOb25lOgorICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCdlbmFibGUnLCBUVHlwZS5CT09MLCAxKQorICAgICAgb3Byb3Qud3JpdGVCb29sKHNlbGYuZW5hYmxlKQorICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCisgICAgaWYgc2VsZi5zYW1wbGluZ3BjdCBpcyBub3QgTm9uZToKKyAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbignc2FtcGxpbmdwY3QnLCBUVHlwZS5ET1VCTEUsIDIpCisgICAgICBvcHJvdC53cml0ZURvdWJsZShzZWxmLnNhbXBsaW5ncGN0KQorICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCisgICAgb3Byb3Qud3JpdGVGaWVsZFN0b3AoKQorICAgIG9wcm90LndyaXRlU3RydWN0RW5kKCkKKworICBkZWYgdmFsaWRhdGUoc2VsZik6CisgICAgcmV0dXJuCisKKworICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgdmFsdWUgPSAxNworICAgIHZhbHVlID0gKHZhbHVlICogMzEpIF4gaGFzaChzZWxmLmVuYWJsZSkKKyAgICB2YWx1ZSA9ICh2YWx1ZSAqIDMxKSBeIGhhc2goc2VsZi5zYW1wbGluZ3BjdCkKKyAgICByZXR1cm4gdmFsdWUKKworICBkZWYgX19yZXByX18oc2VsZik6CisgICAgTCA9IFsnJXM9JXInICUgKGtleSwgdmFsdWUpCisgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzZWxmLl9fZGljdF9fLml0ZXJpdGVtcygpXQorICAgIHJldHVybiAnJXMoJXMpJyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgJywgJy5qb2luKEwpKQorCisgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgIHJldHVybiBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXykgYW5kIHNlbGYuX19kaWN0X18gPT0gb3RoZXIuX19kaWN0X18KKworICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKKyAgICByZXR1cm4gbm90IChzZWxmID09IG90aGVyKQorCiBjbGFzcyBUb3BvbG9neUluZm86CiAgICIiIgogICBBdHRyaWJ1dGVzOgpAQCAtMzcyMCw2ICs0MDg1LDEyIEBACiAgICAtIHNjaGVkX3N0YXR1cwogICAgLSBvd25lcgogICAgLSByZXBsaWNhdGlvbl9jb3VudAorICAgLSByZXF1ZXN0ZWRfbWVtb25oZWFwCisgICAtIHJlcXVlc3RlZF9tZW1vZmZoZWFwCisgICAtIHJlcXVlc3RlZF9jcHUKKyAgIC0gYXNzaWduZWRfbWVtb25oZWFwCisgICAtIGFzc2lnbmVkX21lbW9mZmhlYXAKKyAgIC0gYXNzaWduZWRfY3B1CiAgICIiIgogCiAgIHRocmlmdF9zcGVjID0gKApAQCAtNDIzOSw5ICs0NjEwLDIwIEBACiAgICAgKDUxMywgVFR5cGUuU1RSSU5HLCAnc2NoZWRfc3RhdHVzJywgTm9uZSwgTm9uZSwgKSwgIyA1MTMKICAgICAoNTE0LCBUVHlwZS5TVFJJTkcsICdvd25lcicsIE5vbmUsIE5vbmUsICksICMgNTE0CiAgICAgKDUxNSwgVFR5cGUuSTMyLCAncmVwbGljYXRpb25fY291bnQnLCBOb25lLCBOb25lLCApLCAjIDUxNQorICAgIE5vbmUsICMgNTE2CisgICAgTm9uZSwgIyA1MTcKKyAgICBOb25lLCAjIDUxOAorICAgIE5vbmUsICMgNTE5CisgICAgTm9uZSwgIyA1MjAKKyAgICAoNTIxLCBUVHlwZS5ET1VCTEUsICdyZXF1ZXN0ZWRfbWVtb25oZWFwJywgTm9uZSwgTm9uZSwgKSwgIyA1MjEKKyAgICAoNTIyLCBUVHlwZS5ET1VCTEUsICdyZXF1ZXN0ZWRfbWVtb2ZmaGVhcCcsIE5vbmUsIE5vbmUsICksICMgNTIyCisgICAgKDUyMywgVFR5cGUuRE9VQkxFLCAncmVxdWVzdGVkX2NwdScsIE5vbmUsIE5vbmUsICksICMgNTIzCisgICAgKDUyNCwgVFR5cGUuRE9VQkxFLCAnYXNzaWduZWRfbWVtb25oZWFwJywgTm9uZSwgTm9uZSwgKSwgIyA1MjQKKyAgICAoNTI1LCBUVHlwZS5ET1VCTEUsICdhc3NpZ25lZF9tZW1vZmZoZWFwJywgTm9uZSwgTm9uZSwgKSwgIyA1MjUKKyAgICAoNTI2LCBUVHlwZS5ET1VCTEUsICdhc3NpZ25lZF9jcHUnLCBOb25lLCBOb25lLCApLCAjIDUyNgogICApCiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsIGlkPU5vbmUsIG5hbWU9Tm9uZSwgdXB0aW1lX3NlY3M9Tm9uZSwgZXhlY3V0b3JzPU5vbmUsIHN0YXR1cz1Ob25lLCBlcnJvcnM9Tm9uZSwgY29tcG9uZW50X2RlYnVnPU5vbmUsIHNjaGVkX3N0YXR1cz1Ob25lLCBvd25lcj1Ob25lLCByZXBsaWNhdGlvbl9jb3VudD1Ob25lLCk6CisgIGRlZiBfX2luaXRfXyhzZWxmLCBpZD1Ob25lLCBuYW1lPU5vbmUsIHVwdGltZV9zZWNzPU5vbmUsIGV4ZWN1dG9ycz1Ob25lLCBzdGF0dXM9Tm9uZSwgZXJyb3JzPU5vbmUsIGNvbXBvbmVudF9kZWJ1Zz1Ob25lLCBzY2hlZF9zdGF0dXM9Tm9uZSwgb3duZXI9Tm9uZSwgcmVwbGljYXRpb25fY291bnQ9Tm9uZSwgcmVxdWVzdGVkX21lbW9uaGVhcD1Ob25lLCByZXF1ZXN0ZWRfbWVtb2ZmaGVhcD1Ob25lLCByZXF1ZXN0ZWRfY3B1PU5vbmUsIGFzc2lnbmVkX21lbW9uaGVhcD1Ob25lLCBhc3NpZ25lZF9tZW1vZmZoZWFwPU5vbmUsIGFzc2lnbmVkX2NwdT1Ob25lLCk6CiAgICAgc2VsZi5pZCA9IGlkCiAgICAgc2VsZi5uYW1lID0gbmFtZQogICAgIHNlbGYudXB0aW1lX3NlY3MgPSB1cHRpbWVfc2VjcwpAQCAtNDI1Miw2ICs0NjM0LDEyIEBACiAgICAgc2VsZi5zY2hlZF9zdGF0dXMgPSBzY2hlZF9zdGF0dXMKICAgICBzZWxmLm93bmVyID0gb3duZXIKICAgICBzZWxmLnJlcGxpY2F0aW9uX2NvdW50ID0gcmVwbGljYXRpb25fY291bnQKKyAgICBzZWxmLnJlcXVlc3RlZF9tZW1vbmhlYXAgPSByZXF1ZXN0ZWRfbWVtb25oZWFwCisgICAgc2VsZi5yZXF1ZXN0ZWRfbWVtb2ZmaGVhcCA9IHJlcXVlc3RlZF9tZW1vZmZoZWFwCisgICAgc2VsZi5yZXF1ZXN0ZWRfY3B1ID0gcmVxdWVzdGVkX2NwdQorICAgIHNlbGYuYXNzaWduZWRfbWVtb25oZWFwID0gYXNzaWduZWRfbWVtb25oZWFwCisgICAgc2VsZi5hc3NpZ25lZF9tZW1vZmZoZWFwID0gYXNzaWduZWRfbWVtb2ZmaGVhcAorICAgIHNlbGYuYXNzaWduZWRfY3B1ID0gYXNzaWduZWRfY3B1CiAKICAgZGVmIHJlYWQoc2VsZiwgaXByb3QpOgogICAgIGlmIGlwcm90Ll9fY2xhc3NfXyA9PSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgYW5kIGlzaW5zdGFuY2UoaXByb3QudHJhbnMsIFRUcmFuc3BvcnQuQ1JlYWRhYmxlVHJhbnNwb3J0KSBhbmQgc2VsZi50aHJpZnRfc3BlYyBpcyBub3QgTm9uZSBhbmQgZmFzdGJpbmFyeSBpcyBub3QgTm9uZToKQEAgLTQyNzQsMTcgKzQ2NjIsMTcgQEAKICAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQogICAgICAgZWxpZiBmaWQgPT0gMzoKICAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuSTMyOgotICAgICAgICAgIHNlbGYudXB0aW1lX3NlY3MgPSBpcHJvdC5yZWFkSTMyKCk7CisgICAgICAgICAgc2VsZi51cHRpbWVfc2VjcyA9IGlwcm90LnJlYWRJMzIoKQogICAgICAgICBlbHNlOgogICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCiAgICAgICBlbGlmIGZpZCA9PSA0OgogICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5MSVNUOgogICAgICAgICAgIHNlbGYuZXhlY3V0b3JzID0gW10KLSAgICAgICAgICAoX2V0eXBlMjcwLCBfc2l6ZTI2NykgPSBpcHJvdC5yZWFkTGlzdEJlZ2luKCkKLSAgICAgICAgICBmb3IgX2kyNzEgaW4geHJhbmdlKF9zaXplMjY3KToKLSAgICAgICAgICAgIF9lbGVtMjcyID0gRXhlY3V0b3JTdW1tYXJ5KCkKLSAgICAgICAgICAgIF9lbGVtMjcyLnJlYWQoaXByb3QpCi0gICAgICAgICAgICBzZWxmLmV4ZWN1dG9ycy5hcHBlbmQoX2VsZW0yNzIpCisgICAgICAgICAgKF9ldHlwZTI4NiwgX3NpemUyODMpID0gaXByb3QucmVhZExpc3RCZWdpbigpCisgICAgICAgICAgZm9yIF9pMjg3IGluIHhyYW5nZShfc2l6ZTI4Myk6CisgICAgICAgICAgICBfZWxlbTI4OCA9IEV4ZWN1dG9yU3VtbWFyeSgpCisgICAgICAgICAgICBfZWxlbTI4OC5yZWFkKGlwcm90KQorICAgICAgICAgICAgc2VsZi5leGVjdXRvcnMuYXBwZW5kKF9lbGVtMjg4KQogICAgICAgICAgIGlwcm90LnJlYWRMaXN0RW5kKCkKICAgICAgICAgZWxzZToKICAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQpAQCAtNDI5NiwyOSArNDY4NCwyOSBAQAogICAgICAgZWxpZiBmaWQgPT0gNjoKICAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuTUFQOgogICAgICAgICAgIHNlbGYuZXJyb3JzID0ge30KLSAgICAgICAgICAoX2t0eXBlMjc0LCBfdnR5cGUyNzUsIF9zaXplMjczICkgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKQotICAgICAgICAgIGZvciBfaTI3NyBpbiB4cmFuZ2UoX3NpemUyNzMpOgotICAgICAgICAgICAgX2tleTI3OCA9IGlwcm90LnJlYWRTdHJpbmcoKS5kZWNvZGUoJ3V0Zi04JykKLSAgICAgICAgICAgIF92YWwyNzkgPSBbXQotICAgICAgICAgICAgKF9ldHlwZTI4MywgX3NpemUyODApID0gaXByb3QucmVhZExpc3RCZWdpbigpCi0gICAgICAgICAgICBmb3IgX2kyODQgaW4geHJhbmdlKF9zaXplMjgwKToKLSAgICAgICAgICAgICAgX2VsZW0yODUgPSBFcnJvckluZm8oKQotICAgICAgICAgICAgICBfZWxlbTI4NS5yZWFkKGlwcm90KQotICAgICAgICAgICAgICBfdmFsMjc5LmFwcGVuZChfZWxlbTI4NSkKKyAgICAgICAgICAoX2t0eXBlMjkwLCBfdnR5cGUyOTEsIF9zaXplMjg5ICkgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKQorICAgICAgICAgIGZvciBfaTI5MyBpbiB4cmFuZ2UoX3NpemUyODkpOgorICAgICAgICAgICAgX2tleTI5NCA9IGlwcm90LnJlYWRTdHJpbmcoKS5kZWNvZGUoJ3V0Zi04JykKKyAgICAgICAgICAgIF92YWwyOTUgPSBbXQorICAgICAgICAgICAgKF9ldHlwZTI5OSwgX3NpemUyOTYpID0gaXByb3QucmVhZExpc3RCZWdpbigpCisgICAgICAgICAgICBmb3IgX2kzMDAgaW4geHJhbmdlKF9zaXplMjk2KToKKyAgICAgICAgICAgICAgX2VsZW0zMDEgPSBFcnJvckluZm8oKQorICAgICAgICAgICAgICBfZWxlbTMwMS5yZWFkKGlwcm90KQorICAgICAgICAgICAgICBfdmFsMjk1LmFwcGVuZChfZWxlbTMwMSkKICAgICAgICAgICAgIGlwcm90LnJlYWRMaXN0RW5kKCkKLSAgICAgICAgICAgIHNlbGYuZXJyb3JzW19rZXkyNzhdID0gX3ZhbDI3OQorICAgICAgICAgICAgc2VsZi5lcnJvcnNbX2tleTI5NF0gPSBfdmFsMjk1CiAgICAgICAgICAgaXByb3QucmVhZE1hcEVuZCgpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKICAgICAgIGVsaWYgZmlkID09IDc6CiAgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLk1BUDoKICAgICAgICAgICBzZWxmLmNvbXBvbmVudF9kZWJ1ZyA9IHt9Ci0gICAgICAgICAgKF9rdHlwZTI4NywgX3Z0eXBlMjg4LCBfc2l6ZTI4NiApID0gaXByb3QucmVhZE1hcEJlZ2luKCkKLSAgICAgICAgICBmb3IgX2kyOTAgaW4geHJhbmdlKF9zaXplMjg2KToKLSAgICAgICAgICAgIF9rZXkyOTEgPSBpcHJvdC5yZWFkU3RyaW5nKCkuZGVjb2RlKCd1dGYtOCcpCi0gICAgICAgICAgICBfdmFsMjkyID0gRGVidWdPcHRpb25zKCkKLSAgICAgICAgICAgIF92YWwyOTIucmVhZChpcHJvdCkKLSAgICAgICAgICAgIHNlbGYuY29tcG9uZW50X2RlYnVnW19rZXkyOTFdID0gX3ZhbDI5MgorICAgICAgICAgIChfa3R5cGUzMDMsIF92dHlwZTMwNCwgX3NpemUzMDIgKSA9IGlwcm90LnJlYWRNYXBCZWdpbigpCisgICAgICAgICAgZm9yIF9pMzA2IGluIHhyYW5nZShfc2l6ZTMwMik6CisgICAgICAgICAgICBfa2V5MzA3ID0gaXByb3QucmVhZFN0cmluZygpLmRlY29kZSgndXRmLTgnKQorICAgICAgICAgICAgX3ZhbDMwOCA9IERlYnVnT3B0aW9ucygpCisgICAgICAgICAgICBfdmFsMzA4LnJlYWQoaXByb3QpCisgICAgICAgICAgICBzZWxmLmNvbXBvbmVudF9kZWJ1Z1tfa2V5MzA3XSA9IF92YWwzMDgKICAgICAgICAgICBpcHJvdC5yZWFkTWFwRW5kKCkKICAgICAgICAgZWxzZToKICAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQpAQCAtNDMzNCw3ICs0NzIyLDM3IEBACiAgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKICAgICAgIGVsaWYgZmlkID09IDUxNToKICAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuSTMyOgotICAgICAgICAgIHNlbGYucmVwbGljYXRpb25fY291bnQgPSBpcHJvdC5yZWFkSTMyKCk7CisgICAgICAgICAgc2VsZi5yZXBsaWNhdGlvbl9jb3VudCA9IGlwcm90LnJlYWRJMzIoKQorICAgICAgICBlbHNlOgorICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBlbGlmIGZpZCA9PSA1MjE6CisgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLkRPVUJMRToKKyAgICAgICAgICBzZWxmLnJlcXVlc3RlZF9tZW1vbmhlYXAgPSBpcHJvdC5yZWFkRG91YmxlKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgZWxpZiBmaWQgPT0gNTIyOgorICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5ET1VCTEU6CisgICAgICAgICAgc2VsZi5yZXF1ZXN0ZWRfbWVtb2ZmaGVhcCA9IGlwcm90LnJlYWREb3VibGUoKQorICAgICAgICBlbHNlOgorICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBlbGlmIGZpZCA9PSA1MjM6CisgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLkRPVUJMRToKKyAgICAgICAgICBzZWxmLnJlcXVlc3RlZF9jcHUgPSBpcHJvdC5yZWFkRG91YmxlKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgZWxpZiBmaWQgPT0gNTI0OgorICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5ET1VCTEU6CisgICAgICAgICAgc2VsZi5hc3NpZ25lZF9tZW1vbmhlYXAgPSBpcHJvdC5yZWFkRG91YmxlKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgZWxpZiBmaWQgPT0gNTI1OgorICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5ET1VCTEU6CisgICAgICAgICAgc2VsZi5hc3NpZ25lZF9tZW1vZmZoZWFwID0gaXByb3QucmVhZERvdWJsZSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgIGVsaWYgZmlkID09IDUyNjoKKyAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuRE9VQkxFOgorICAgICAgICAgIHNlbGYuYXNzaWduZWRfY3B1ID0gaXByb3QucmVhZERvdWJsZSgpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKICAgICAgIGVsc2U6CkBAIC00MzYyLDggKzQ3ODAsOCBAQAogICAgIGlmIHNlbGYuZXhlY3V0b3JzIGlzIG5vdCBOb25lOgogICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCdleGVjdXRvcnMnLCBUVHlwZS5MSVNULCA0KQogICAgICAgb3Byb3Qud3JpdGVMaXN0QmVnaW4oVFR5cGUuU1RSVUNULCBsZW4oc2VsZi5leGVjdXRvcnMpKQotICAgICAgZm9yIGl0ZXIyOTMgaW4gc2VsZi5leGVjdXRvcnM6Ci0gICAgICAgIGl0ZXIyOTMud3JpdGUob3Byb3QpCisgICAgICBmb3IgaXRlcjMwOSBpbiBzZWxmLmV4ZWN1dG9yczoKKyAgICAgICAgaXRlcjMwOS53cml0ZShvcHJvdCkKICAgICAgIG9wcm90LndyaXRlTGlzdEVuZCgpCiAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKICAgICBpZiBzZWxmLnN0YXR1cyBpcyBub3QgTm9uZToKQEAgLTQzNzMsMjAgKzQ3OTEsMjAgQEAKICAgICBpZiBzZWxmLmVycm9ycyBpcyBub3QgTm9uZToKICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbignZXJyb3JzJywgVFR5cGUuTUFQLCA2KQogICAgICAgb3Byb3Qud3JpdGVNYXBCZWdpbihUVHlwZS5TVFJJTkcsIFRUeXBlLkxJU1QsIGxlbihzZWxmLmVycm9ycykpCi0gICAgICBmb3Iga2l0ZXIyOTQsdml0ZXIyOTUgaW4gc2VsZi5lcnJvcnMuaXRlbXMoKToKLSAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoa2l0ZXIyOTQuZW5jb2RlKCd1dGYtOCcpKQotICAgICAgICBvcHJvdC53cml0ZUxpc3RCZWdpbihUVHlwZS5TVFJVQ1QsIGxlbih2aXRlcjI5NSkpCi0gICAgICAgIGZvciBpdGVyMjk2IGluIHZpdGVyMjk1OgotICAgICAgICAgIGl0ZXIyOTYud3JpdGUob3Byb3QpCisgICAgICBmb3Iga2l0ZXIzMTAsdml0ZXIzMTEgaW4gc2VsZi5lcnJvcnMuaXRlbXMoKToKKyAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoa2l0ZXIzMTAuZW5jb2RlKCd1dGYtOCcpKQorICAgICAgICBvcHJvdC53cml0ZUxpc3RCZWdpbihUVHlwZS5TVFJVQ1QsIGxlbih2aXRlcjMxMSkpCisgICAgICAgIGZvciBpdGVyMzEyIGluIHZpdGVyMzExOgorICAgICAgICAgIGl0ZXIzMTIud3JpdGUob3Byb3QpCiAgICAgICAgIG9wcm90LndyaXRlTGlzdEVuZCgpCiAgICAgICBvcHJvdC53cml0ZU1hcEVuZCgpCiAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKICAgICBpZiBzZWxmLmNvbXBvbmVudF9kZWJ1ZyBpcyBub3QgTm9uZToKICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbignY29tcG9uZW50X2RlYnVnJywgVFR5cGUuTUFQLCA3KQogICAgICAgb3Byb3Qud3JpdGVNYXBCZWdpbihUVHlwZS5TVFJJTkcsIFRUeXBlLlNUUlVDVCwgbGVuKHNlbGYuY29tcG9uZW50X2RlYnVnKSkKLSAgICAgIGZvciBraXRlcjI5Nyx2aXRlcjI5OCBpbiBzZWxmLmNvbXBvbmVudF9kZWJ1Zy5pdGVtcygpOgotICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhraXRlcjI5Ny5lbmNvZGUoJ3V0Zi04JykpCi0gICAgICAgIHZpdGVyMjk4LndyaXRlKG9wcm90KQorICAgICAgZm9yIGtpdGVyMzEzLHZpdGVyMzE0IGluIHNlbGYuY29tcG9uZW50X2RlYnVnLml0ZW1zKCk6CisgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKGtpdGVyMzEzLmVuY29kZSgndXRmLTgnKSkKKyAgICAgICAgdml0ZXIzMTQud3JpdGUob3Byb3QpCiAgICAgICBvcHJvdC53cml0ZU1hcEVuZCgpCiAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKICAgICBpZiBzZWxmLnNjaGVkX3N0YXR1cyBpcyBub3QgTm9uZToKQEAgLTQ0MDEsNiArNDgxOSwzMCBAQAogICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCdyZXBsaWNhdGlvbl9jb3VudCcsIFRUeXBlLkkzMiwgNTE1KQogICAgICAgb3Byb3Qud3JpdGVJMzIoc2VsZi5yZXBsaWNhdGlvbl9jb3VudCkKICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKQorICAgIGlmIHNlbGYucmVxdWVzdGVkX21lbW9uaGVhcCBpcyBub3QgTm9uZToKKyAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbigncmVxdWVzdGVkX21lbW9uaGVhcCcsIFRUeXBlLkRPVUJMRSwgNTIxKQorICAgICAgb3Byb3Qud3JpdGVEb3VibGUoc2VsZi5yZXF1ZXN0ZWRfbWVtb25oZWFwKQorICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCisgICAgaWYgc2VsZi5yZXF1ZXN0ZWRfbWVtb2ZmaGVhcCBpcyBub3QgTm9uZToKKyAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbigncmVxdWVzdGVkX21lbW9mZmhlYXAnLCBUVHlwZS5ET1VCTEUsIDUyMikKKyAgICAgIG9wcm90LndyaXRlRG91YmxlKHNlbGYucmVxdWVzdGVkX21lbW9mZmhlYXApCisgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKKyAgICBpZiBzZWxmLnJlcXVlc3RlZF9jcHUgaXMgbm90IE5vbmU6CisgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ3JlcXVlc3RlZF9jcHUnLCBUVHlwZS5ET1VCTEUsIDUyMykKKyAgICAgIG9wcm90LndyaXRlRG91YmxlKHNlbGYucmVxdWVzdGVkX2NwdSkKKyAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKQorICAgIGlmIHNlbGYuYXNzaWduZWRfbWVtb25oZWFwIGlzIG5vdCBOb25lOgorICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCdhc3NpZ25lZF9tZW1vbmhlYXAnLCBUVHlwZS5ET1VCTEUsIDUyNCkKKyAgICAgIG9wcm90LndyaXRlRG91YmxlKHNlbGYuYXNzaWduZWRfbWVtb25oZWFwKQorICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCisgICAgaWYgc2VsZi5hc3NpZ25lZF9tZW1vZmZoZWFwIGlzIG5vdCBOb25lOgorICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCdhc3NpZ25lZF9tZW1vZmZoZWFwJywgVFR5cGUuRE9VQkxFLCA1MjUpCisgICAgICBvcHJvdC53cml0ZURvdWJsZShzZWxmLmFzc2lnbmVkX21lbW9mZmhlYXApCisgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKKyAgICBpZiBzZWxmLmFzc2lnbmVkX2NwdSBpcyBub3QgTm9uZToKKyAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbignYXNzaWduZWRfY3B1JywgVFR5cGUuRE9VQkxFLCA1MjYpCisgICAgICBvcHJvdC53cml0ZURvdWJsZShzZWxmLmFzc2lnbmVkX2NwdSkKKyAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKQogICAgIG9wcm90LndyaXRlRmllbGRTdG9wKCkKICAgICBvcHJvdC53cml0ZVN0cnVjdEVuZCgpCiAKQEAgLTQ0MzIsNiArNDg3NCwxMiBAQAogICAgIHZhbHVlID0gKHZhbHVlICogMzEpIF4gaGFzaChzZWxmLnNjaGVkX3N0YXR1cykKICAgICB2YWx1ZSA9ICh2YWx1ZSAqIDMxKSBeIGhhc2goc2VsZi5vd25lcikKICAgICB2YWx1ZSA9ICh2YWx1ZSAqIDMxKSBeIGhhc2goc2VsZi5yZXBsaWNhdGlvbl9jb3VudCkKKyAgICB2YWx1ZSA9ICh2YWx1ZSAqIDMxKSBeIGhhc2goc2VsZi5yZXF1ZXN0ZWRfbWVtb25oZWFwKQorICAgIHZhbHVlID0gKHZhbHVlICogMzEpIF4gaGFzaChzZWxmLnJlcXVlc3RlZF9tZW1vZmZoZWFwKQorICAgIHZhbHVlID0gKHZhbHVlICogMzEpIF4gaGFzaChzZWxmLnJlcXVlc3RlZF9jcHUpCisgICAgdmFsdWUgPSAodmFsdWUgKiAzMSkgXiBoYXNoKHNlbGYuYXNzaWduZWRfbWVtb25oZWFwKQorICAgIHZhbHVlID0gKHZhbHVlICogMzEpIF4gaGFzaChzZWxmLmFzc2lnbmVkX21lbW9mZmhlYXApCisgICAgdmFsdWUgPSAodmFsdWUgKiAzMSkgXiBoYXNoKHNlbGYuYXNzaWduZWRfY3B1KQogICAgIHJldHVybiB2YWx1ZQogCiAgIGRlZiBfX3JlcHJfXyhzZWxmKToKQEAgLTQ0NDUsMjIgKzQ4OTMsMzQgQEAKICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CiAgICAgcmV0dXJuIG5vdCAoc2VsZiA9PSBvdGhlcikKIAotY2xhc3MgRGVidWdPcHRpb25zOgorY2xhc3MgQ29tbW9uQWdncmVnYXRlU3RhdHM6CiAgICIiIgogICBBdHRyaWJ1dGVzOgotICAgLSBlbmFibGUKLSAgIC0gc2FtcGxpbmdwY3QKKyAgIC0gbnVtX2V4ZWN1dG9ycworICAgLSBudW1fdGFza3MKKyAgIC0gZW1pdHRlZAorICAgLSB0cmFuc2ZlcnJlZAorICAgLSBhY2tlZAorICAgLSBmYWlsZWQKICAgIiIiCiAKICAgdGhyaWZ0X3NwZWMgPSAoCiAgICAgTm9uZSwgIyAwCi0gICAgKDEsIFRUeXBlLkJPT0wsICdlbmFibGUnLCBOb25lLCBOb25lLCApLCAjIDEKLSAgICAoMiwgVFR5cGUuRE9VQkxFLCAnc2FtcGxpbmdwY3QnLCBOb25lLCBOb25lLCApLCAjIDIKKyAgICAoMSwgVFR5cGUuSTMyLCAnbnVtX2V4ZWN1dG9ycycsIE5vbmUsIE5vbmUsICksICMgMQorICAgICgyLCBUVHlwZS5JMzIsICdudW1fdGFza3MnLCBOb25lLCBOb25lLCApLCAjIDIKKyAgICAoMywgVFR5cGUuSTY0LCAnZW1pdHRlZCcsIE5vbmUsIE5vbmUsICksICMgMworICAgICg0LCBUVHlwZS5JNjQsICd0cmFuc2ZlcnJlZCcsIE5vbmUsIE5vbmUsICksICMgNAorICAgICg1LCBUVHlwZS5JNjQsICdhY2tlZCcsIE5vbmUsIE5vbmUsICksICMgNQorICAgICg2LCBUVHlwZS5JNjQsICdmYWlsZWQnLCBOb25lLCBOb25lLCApLCAjIDYKICAgKQogCi0gIGRlZiBfX2luaXRfXyhzZWxmLCBlbmFibGU9Tm9uZSwgc2FtcGxpbmdwY3Q9Tm9uZSwpOgotICAgIHNlbGYuZW5hYmxlID0gZW5hYmxlCi0gICAgc2VsZi5zYW1wbGluZ3BjdCA9IHNhbXBsaW5ncGN0CisgIGRlZiBfX2luaXRfXyhzZWxmLCBudW1fZXhlY3V0b3JzPU5vbmUsIG51bV90YXNrcz1Ob25lLCBlbWl0dGVkPU5vbmUsIHRyYW5zZmVycmVkPU5vbmUsIGFja2VkPU5vbmUsIGZhaWxlZD1Ob25lLCk6CisgICAgc2VsZi5udW1fZXhlY3V0b3JzID0gbnVtX2V4ZWN1dG9ycworICAgIHNlbGYubnVtX3Rhc2tzID0gbnVtX3Rhc2tzCisgICAgc2VsZi5lbWl0dGVkID0gZW1pdHRlZAorICAgIHNlbGYudHJhbnNmZXJyZWQgPSB0cmFuc2ZlcnJlZAorICAgIHNlbGYuYWNrZWQgPSBhY2tlZAorICAgIHNlbGYuZmFpbGVkID0gZmFpbGVkCiAKICAgZGVmIHJlYWQoc2VsZiwgaXByb3QpOgogICAgIGlmIGlwcm90Ll9fY2xhc3NfXyA9PSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgYW5kIGlzaW5zdGFuY2UoaXByb3QudHJhbnMsIFRUcmFuc3BvcnQuQ1JlYWRhYmxlVHJhbnNwb3J0KSBhbmQgc2VsZi50aHJpZnRfc3BlYyBpcyBub3QgTm9uZSBhbmQgZmFzdGJpbmFyeSBpcyBub3QgTm9uZToKQEAgLTQ0NzIsMTMgKzQ5MzIsMzMgQEAKICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLlNUT1A6CiAgICAgICAgIGJyZWFrCiAgICAgICBpZiBmaWQgPT0gMToKLSAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuQk9PTDoKLSAgICAgICAgICBzZWxmLmVuYWJsZSA9IGlwcm90LnJlYWRCb29sKCk7CisgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLkkzMjoKKyAgICAgICAgICBzZWxmLm51bV9leGVjdXRvcnMgPSBpcHJvdC5yZWFkSTMyKCkKICAgICAgICAgZWxzZToKICAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQogICAgICAgZWxpZiBmaWQgPT0gMjoKLSAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuRE9VQkxFOgotICAgICAgICAgIHNlbGYuc2FtcGxpbmdwY3QgPSBpcHJvdC5yZWFkRG91YmxlKCk7CisgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLkkzMjoKKyAgICAgICAgICBzZWxmLm51bV90YXNrcyA9IGlwcm90LnJlYWRJMzIoKQorICAgICAgICBlbHNlOgorICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBlbGlmIGZpZCA9PSAzOgorICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5JNjQ6CisgICAgICAgICAgc2VsZi5lbWl0dGVkID0gaXByb3QucmVhZEk2NCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgIGVsaWYgZmlkID09IDQ6CisgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLkk2NDoKKyAgICAgICAgICBzZWxmLnRyYW5zZmVycmVkID0gaXByb3QucmVhZEk2NCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgIGVsaWYgZmlkID09IDU6CisgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLkk2NDoKKyAgICAgICAgICBzZWxmLmFja2VkID0gaXByb3QucmVhZEk2NCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgIGVsaWYgZmlkID09IDY6CisgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLkk2NDoKKyAgICAgICAgICBzZWxmLmZhaWxlZCA9IGlwcm90LnJlYWRJNjQoKQogICAgICAgICBlbHNlOgogICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCiAgICAgICBlbHNlOgpAQCAtNDQ5MCwxNCArNDk3MCwzMCBAQAogICAgIGlmIG9wcm90Ll9fY2xhc3NfXyA9PSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgYW5kIHNlbGYudGhyaWZ0X3NwZWMgaXMgbm90IE5vbmUgYW5kIGZhc3RiaW5hcnkgaXMgbm90IE5vbmU6CiAgICAgICBvcHJvdC50cmFucy53cml0ZShmYXN0YmluYXJ5LmVuY29kZV9iaW5hcnkoc2VsZiwgKHNlbGYuX19jbGFzc19fLCBzZWxmLnRocmlmdF9zcGVjKSkpCiAgICAgICByZXR1cm4KLSAgICBvcHJvdC53cml0ZVN0cnVjdEJlZ2luKCdEZWJ1Z09wdGlvbnMnKQotICAgIGlmIHNlbGYuZW5hYmxlIGlzIG5vdCBOb25lOgotICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCdlbmFibGUnLCBUVHlwZS5CT09MLCAxKQotICAgICAgb3Byb3Qud3JpdGVCb29sKHNlbGYuZW5hYmxlKQorICAgIG9wcm90LndyaXRlU3RydWN0QmVnaW4oJ0NvbW1vbkFnZ3JlZ2F0ZVN0YXRzJykKKyAgICBpZiBzZWxmLm51bV9leGVjdXRvcnMgaXMgbm90IE5vbmU6CisgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ251bV9leGVjdXRvcnMnLCBUVHlwZS5JMzIsIDEpCisgICAgICBvcHJvdC53cml0ZUkzMihzZWxmLm51bV9leGVjdXRvcnMpCiAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKLSAgICBpZiBzZWxmLnNhbXBsaW5ncGN0IGlzIG5vdCBOb25lOgotICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCdzYW1wbGluZ3BjdCcsIFRUeXBlLkRPVUJMRSwgMikKLSAgICAgIG9wcm90LndyaXRlRG91YmxlKHNlbGYuc2FtcGxpbmdwY3QpCisgICAgaWYgc2VsZi5udW1fdGFza3MgaXMgbm90IE5vbmU6CisgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ251bV90YXNrcycsIFRUeXBlLkkzMiwgMikKKyAgICAgIG9wcm90LndyaXRlSTMyKHNlbGYubnVtX3Rhc2tzKQorICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCisgICAgaWYgc2VsZi5lbWl0dGVkIGlzIG5vdCBOb25lOgorICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCdlbWl0dGVkJywgVFR5cGUuSTY0LCAzKQorICAgICAgb3Byb3Qud3JpdGVJNjQoc2VsZi5lbWl0dGVkKQorICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCisgICAgaWYgc2VsZi50cmFuc2ZlcnJlZCBpcyBub3QgTm9uZToKKyAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbigndHJhbnNmZXJyZWQnLCBUVHlwZS5JNjQsIDQpCisgICAgICBvcHJvdC53cml0ZUk2NChzZWxmLnRyYW5zZmVycmVkKQorICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCisgICAgaWYgc2VsZi5hY2tlZCBpcyBub3QgTm9uZToKKyAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbignYWNrZWQnLCBUVHlwZS5JNjQsIDUpCisgICAgICBvcHJvdC53cml0ZUk2NChzZWxmLmFja2VkKQorICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCisgICAgaWYgc2VsZi5mYWlsZWQgaXMgbm90IE5vbmU6CisgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ2ZhaWxlZCcsIFRUeXBlLkk2NCwgNikKKyAgICAgIG9wcm90LndyaXRlSTY0KHNlbGYuZmFpbGVkKQogICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCiAgICAgb3Byb3Qud3JpdGVGaWVsZFN0b3AoKQogICAgIG9wcm90LndyaXRlU3RydWN0RW5kKCkKQEAgLTQ1MDgsOCArNTAwNCwxNzc1IEBACiAKICAgZGVmIF9faGFzaF9fKHNlbGYpOgogICAgIHZhbHVlID0gMTcKLSAgICB2YWx1ZSA9ICh2YWx1ZSAqIDMxKSBeIGhhc2goc2VsZi5lbmFibGUpCi0gICAgdmFsdWUgPSAodmFsdWUgKiAzMSkgXiBoYXNoKHNlbGYuc2FtcGxpbmdwY3QpCisgICAgdmFsdWUgPSAodmFsdWUgKiAzMSkgXiBoYXNoKHNlbGYubnVtX2V4ZWN1dG9ycykKKyAgICB2YWx1ZSA9ICh2YWx1ZSAqIDMxKSBeIGhhc2goc2VsZi5udW1fdGFza3MpCisgICAgdmFsdWUgPSAodmFsdWUgKiAzMSkgXiBoYXNoKHNlbGYuZW1pdHRlZCkKKyAgICB2YWx1ZSA9ICh2YWx1ZSAqIDMxKSBeIGhhc2goc2VsZi50cmFuc2ZlcnJlZCkKKyAgICB2YWx1ZSA9ICh2YWx1ZSAqIDMxKSBeIGhhc2goc2VsZi5hY2tlZCkKKyAgICB2YWx1ZSA9ICh2YWx1ZSAqIDMxKSBeIGhhc2goc2VsZi5mYWlsZWQpCisgICAgcmV0dXJuIHZhbHVlCisKKyAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgIEwgPSBbJyVzPSVyJyAlIChrZXksIHZhbHVlKQorICAgICAgZm9yIGtleSwgdmFsdWUgaW4gc2VsZi5fX2RpY3RfXy5pdGVyaXRlbXMoKV0KKyAgICByZXR1cm4gJyVzKCVzKScgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sICcsICcuam9pbihMKSkKKworICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICByZXR1cm4gaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pIGFuZCBzZWxmLl9fZGljdF9fID09IG90aGVyLl9fZGljdF9fCisKKyAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CisgICAgcmV0dXJuIG5vdCAoc2VsZiA9PSBvdGhlcikKKworY2xhc3MgU3BvdXRBZ2dyZWdhdGVTdGF0czoKKyAgIiIiCisgIEF0dHJpYnV0ZXM6CisgICAtIGNvbXBsZXRlX2xhdGVuY3lfbXMKKyAgIiIiCisKKyAgdGhyaWZ0X3NwZWMgPSAoCisgICAgTm9uZSwgIyAwCisgICAgKDEsIFRUeXBlLkRPVUJMRSwgJ2NvbXBsZXRlX2xhdGVuY3lfbXMnLCBOb25lLCBOb25lLCApLCAjIDEKKyAgKQorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBjb21wbGV0ZV9sYXRlbmN5X21zPU5vbmUsKToKKyAgICBzZWxmLmNvbXBsZXRlX2xhdGVuY3lfbXMgPSBjb21wbGV0ZV9sYXRlbmN5X21zCisKKyAgZGVmIHJlYWQoc2VsZiwgaXByb3QpOgorICAgIGlmIGlwcm90Ll9fY2xhc3NfXyA9PSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgYW5kIGlzaW5zdGFuY2UoaXByb3QudHJhbnMsIFRUcmFuc3BvcnQuQ1JlYWRhYmxlVHJhbnNwb3J0KSBhbmQgc2VsZi50aHJpZnRfc3BlYyBpcyBub3QgTm9uZSBhbmQgZmFzdGJpbmFyeSBpcyBub3QgTm9uZToKKyAgICAgIGZhc3RiaW5hcnkuZGVjb2RlX2JpbmFyeShzZWxmLCBpcHJvdC50cmFucywgKHNlbGYuX19jbGFzc19fLCBzZWxmLnRocmlmdF9zcGVjKSkKKyAgICAgIHJldHVybgorICAgIGlwcm90LnJlYWRTdHJ1Y3RCZWdpbigpCisgICAgd2hpbGUgVHJ1ZToKKyAgICAgIChmbmFtZSwgZnR5cGUsIGZpZCkgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpCisgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5TVE9QOgorICAgICAgICBicmVhaworICAgICAgaWYgZmlkID09IDE6CisgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLkRPVUJMRToKKyAgICAgICAgICBzZWxmLmNvbXBsZXRlX2xhdGVuY3lfbXMgPSBpcHJvdC5yZWFkRG91YmxlKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgZWxzZToKKyAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgIGlwcm90LnJlYWRGaWVsZEVuZCgpCisgICAgaXByb3QucmVhZFN0cnVjdEVuZCgpCisKKyAgZGVmIHdyaXRlKHNlbGYsIG9wcm90KToKKyAgICBpZiBvcHJvdC5fX2NsYXNzX18gPT0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIGFuZCBzZWxmLnRocmlmdF9zcGVjIGlzIG5vdCBOb25lIGFuZCBmYXN0YmluYXJ5IGlzIG5vdCBOb25lOgorICAgICAgb3Byb3QudHJhbnMud3JpdGUoZmFzdGJpbmFyeS5lbmNvZGVfYmluYXJ5KHNlbGYsIChzZWxmLl9fY2xhc3NfXywgc2VsZi50aHJpZnRfc3BlYykpKQorICAgICAgcmV0dXJuCisgICAgb3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbignU3BvdXRBZ2dyZWdhdGVTdGF0cycpCisgICAgaWYgc2VsZi5jb21wbGV0ZV9sYXRlbmN5X21zIGlzIG5vdCBOb25lOgorICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCdjb21wbGV0ZV9sYXRlbmN5X21zJywgVFR5cGUuRE9VQkxFLCAxKQorICAgICAgb3Byb3Qud3JpdGVEb3VibGUoc2VsZi5jb21wbGV0ZV9sYXRlbmN5X21zKQorICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCisgICAgb3Byb3Qud3JpdGVGaWVsZFN0b3AoKQorICAgIG9wcm90LndyaXRlU3RydWN0RW5kKCkKKworICBkZWYgdmFsaWRhdGUoc2VsZik6CisgICAgcmV0dXJuCisKKworICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgdmFsdWUgPSAxNworICAgIHZhbHVlID0gKHZhbHVlICogMzEpIF4gaGFzaChzZWxmLmNvbXBsZXRlX2xhdGVuY3lfbXMpCisgICAgcmV0dXJuIHZhbHVlCisKKyAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgIEwgPSBbJyVzPSVyJyAlIChrZXksIHZhbHVlKQorICAgICAgZm9yIGtleSwgdmFsdWUgaW4gc2VsZi5fX2RpY3RfXy5pdGVyaXRlbXMoKV0KKyAgICByZXR1cm4gJyVzKCVzKScgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sICcsICcuam9pbihMKSkKKworICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICByZXR1cm4gaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pIGFuZCBzZWxmLl9fZGljdF9fID09IG90aGVyLl9fZGljdF9fCisKKyAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CisgICAgcmV0dXJuIG5vdCAoc2VsZiA9PSBvdGhlcikKKworY2xhc3MgQm9sdEFnZ3JlZ2F0ZVN0YXRzOgorICAiIiIKKyAgQXR0cmlidXRlczoKKyAgIC0gZXhlY3V0ZV9sYXRlbmN5X21zCisgICAtIHByb2Nlc3NfbGF0ZW5jeV9tcworICAgLSBleGVjdXRlZAorICAgLSBjYXBhY2l0eQorICAiIiIKKworICB0aHJpZnRfc3BlYyA9ICgKKyAgICBOb25lLCAjIDAKKyAgICAoMSwgVFR5cGUuRE9VQkxFLCAnZXhlY3V0ZV9sYXRlbmN5X21zJywgTm9uZSwgTm9uZSwgKSwgIyAxCisgICAgKDIsIFRUeXBlLkRPVUJMRSwgJ3Byb2Nlc3NfbGF0ZW5jeV9tcycsIE5vbmUsIE5vbmUsICksICMgMgorICAgICgzLCBUVHlwZS5JNjQsICdleGVjdXRlZCcsIE5vbmUsIE5vbmUsICksICMgMworICAgICg0LCBUVHlwZS5ET1VCTEUsICdjYXBhY2l0eScsIE5vbmUsIE5vbmUsICksICMgNAorICApCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIGV4ZWN1dGVfbGF0ZW5jeV9tcz1Ob25lLCBwcm9jZXNzX2xhdGVuY3lfbXM9Tm9uZSwgZXhlY3V0ZWQ9Tm9uZSwgY2FwYWNpdHk9Tm9uZSwpOgorICAgIHNlbGYuZXhlY3V0ZV9sYXRlbmN5X21zID0gZXhlY3V0ZV9sYXRlbmN5X21zCisgICAgc2VsZi5wcm9jZXNzX2xhdGVuY3lfbXMgPSBwcm9jZXNzX2xhdGVuY3lfbXMKKyAgICBzZWxmLmV4ZWN1dGVkID0gZXhlY3V0ZWQKKyAgICBzZWxmLmNhcGFjaXR5ID0gY2FwYWNpdHkKKworICBkZWYgcmVhZChzZWxmLCBpcHJvdCk6CisgICAgaWYgaXByb3QuX19jbGFzc19fID09IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCBhbmQgaXNpbnN0YW5jZShpcHJvdC50cmFucywgVFRyYW5zcG9ydC5DUmVhZGFibGVUcmFuc3BvcnQpIGFuZCBzZWxmLnRocmlmdF9zcGVjIGlzIG5vdCBOb25lIGFuZCBmYXN0YmluYXJ5IGlzIG5vdCBOb25lOgorICAgICAgZmFzdGJpbmFyeS5kZWNvZGVfYmluYXJ5KHNlbGYsIGlwcm90LnRyYW5zLCAoc2VsZi5fX2NsYXNzX18sIHNlbGYudGhyaWZ0X3NwZWMpKQorICAgICAgcmV0dXJuCisgICAgaXByb3QucmVhZFN0cnVjdEJlZ2luKCkKKyAgICB3aGlsZSBUcnVlOgorICAgICAgKGZuYW1lLCBmdHlwZSwgZmlkKSA9IGlwcm90LnJlYWRGaWVsZEJlZ2luKCkKKyAgICAgIGlmIGZ0eXBlID09IFRUeXBlLlNUT1A6CisgICAgICAgIGJyZWFrCisgICAgICBpZiBmaWQgPT0gMToKKyAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuRE9VQkxFOgorICAgICAgICAgIHNlbGYuZXhlY3V0ZV9sYXRlbmN5X21zID0gaXByb3QucmVhZERvdWJsZSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgIGVsaWYgZmlkID09IDI6CisgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLkRPVUJMRToKKyAgICAgICAgICBzZWxmLnByb2Nlc3NfbGF0ZW5jeV9tcyA9IGlwcm90LnJlYWREb3VibGUoKQorICAgICAgICBlbHNlOgorICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBlbGlmIGZpZCA9PSAzOgorICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5JNjQ6CisgICAgICAgICAgc2VsZi5leGVjdXRlZCA9IGlwcm90LnJlYWRJNjQoKQorICAgICAgICBlbHNlOgorICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBlbGlmIGZpZCA9PSA0OgorICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5ET1VCTEU6CisgICAgICAgICAgc2VsZi5jYXBhY2l0eSA9IGlwcm90LnJlYWREb3VibGUoKQorICAgICAgICBlbHNlOgorICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBlbHNlOgorICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgaXByb3QucmVhZEZpZWxkRW5kKCkKKyAgICBpcHJvdC5yZWFkU3RydWN0RW5kKCkKKworICBkZWYgd3JpdGUoc2VsZiwgb3Byb3QpOgorICAgIGlmIG9wcm90Ll9fY2xhc3NfXyA9PSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgYW5kIHNlbGYudGhyaWZ0X3NwZWMgaXMgbm90IE5vbmUgYW5kIGZhc3RiaW5hcnkgaXMgbm90IE5vbmU6CisgICAgICBvcHJvdC50cmFucy53cml0ZShmYXN0YmluYXJ5LmVuY29kZV9iaW5hcnkoc2VsZiwgKHNlbGYuX19jbGFzc19fLCBzZWxmLnRocmlmdF9zcGVjKSkpCisgICAgICByZXR1cm4KKyAgICBvcHJvdC53cml0ZVN0cnVjdEJlZ2luKCdCb2x0QWdncmVnYXRlU3RhdHMnKQorICAgIGlmIHNlbGYuZXhlY3V0ZV9sYXRlbmN5X21zIGlzIG5vdCBOb25lOgorICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCdleGVjdXRlX2xhdGVuY3lfbXMnLCBUVHlwZS5ET1VCTEUsIDEpCisgICAgICBvcHJvdC53cml0ZURvdWJsZShzZWxmLmV4ZWN1dGVfbGF0ZW5jeV9tcykKKyAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKQorICAgIGlmIHNlbGYucHJvY2Vzc19sYXRlbmN5X21zIGlzIG5vdCBOb25lOgorICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCdwcm9jZXNzX2xhdGVuY3lfbXMnLCBUVHlwZS5ET1VCTEUsIDIpCisgICAgICBvcHJvdC53cml0ZURvdWJsZShzZWxmLnByb2Nlc3NfbGF0ZW5jeV9tcykKKyAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKQorICAgIGlmIHNlbGYuZXhlY3V0ZWQgaXMgbm90IE5vbmU6CisgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ2V4ZWN1dGVkJywgVFR5cGUuSTY0LCAzKQorICAgICAgb3Byb3Qud3JpdGVJNjQoc2VsZi5leGVjdXRlZCkKKyAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKQorICAgIGlmIHNlbGYuY2FwYWNpdHkgaXMgbm90IE5vbmU6CisgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ2NhcGFjaXR5JywgVFR5cGUuRE9VQkxFLCA0KQorICAgICAgb3Byb3Qud3JpdGVEb3VibGUoc2VsZi5jYXBhY2l0eSkKKyAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKQorICAgIG9wcm90LndyaXRlRmllbGRTdG9wKCkKKyAgICBvcHJvdC53cml0ZVN0cnVjdEVuZCgpCisKKyAgZGVmIHZhbGlkYXRlKHNlbGYpOgorICAgIHJldHVybgorCisKKyAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgIHZhbHVlID0gMTcKKyAgICB2YWx1ZSA9ICh2YWx1ZSAqIDMxKSBeIGhhc2goc2VsZi5leGVjdXRlX2xhdGVuY3lfbXMpCisgICAgdmFsdWUgPSAodmFsdWUgKiAzMSkgXiBoYXNoKHNlbGYucHJvY2Vzc19sYXRlbmN5X21zKQorICAgIHZhbHVlID0gKHZhbHVlICogMzEpIF4gaGFzaChzZWxmLmV4ZWN1dGVkKQorICAgIHZhbHVlID0gKHZhbHVlICogMzEpIF4gaGFzaChzZWxmLmNhcGFjaXR5KQorICAgIHJldHVybiB2YWx1ZQorCisgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICBMID0gWyclcz0lcicgJSAoa2V5LCB2YWx1ZSkKKyAgICAgIGZvciBrZXksIHZhbHVlIGluIHNlbGYuX19kaWN0X18uaXRlcml0ZW1zKCldCisgICAgcmV0dXJuICclcyglcyknICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCAnLCAnLmpvaW4oTCkpCisKKyAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgcmV0dXJuIGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKSBhbmQgc2VsZi5fX2RpY3RfXyA9PSBvdGhlci5fX2RpY3RfXworCisgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgorICAgIHJldHVybiBub3QgKHNlbGYgPT0gb3RoZXIpCisKK2NsYXNzIFNwZWNpZmljQWdncmVnYXRlU3RhdHM6CisgICIiIgorICBBdHRyaWJ1dGVzOgorICAgLSBib2x0CisgICAtIHNwb3V0CisgICIiIgorCisgIHRocmlmdF9zcGVjID0gKAorICAgIE5vbmUsICMgMAorICAgICgxLCBUVHlwZS5TVFJVQ1QsICdib2x0JywgKEJvbHRBZ2dyZWdhdGVTdGF0cywgQm9sdEFnZ3JlZ2F0ZVN0YXRzLnRocmlmdF9zcGVjKSwgTm9uZSwgKSwgIyAxCisgICAgKDIsIFRUeXBlLlNUUlVDVCwgJ3Nwb3V0JywgKFNwb3V0QWdncmVnYXRlU3RhdHMsIFNwb3V0QWdncmVnYXRlU3RhdHMudGhyaWZ0X3NwZWMpLCBOb25lLCApLCAjIDIKKyAgKQorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBib2x0PU5vbmUsIHNwb3V0PU5vbmUsKToKKyAgICBzZWxmLmJvbHQgPSBib2x0CisgICAgc2VsZi5zcG91dCA9IHNwb3V0CisKKyAgZGVmIHJlYWQoc2VsZiwgaXByb3QpOgorICAgIGlmIGlwcm90Ll9fY2xhc3NfXyA9PSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgYW5kIGlzaW5zdGFuY2UoaXByb3QudHJhbnMsIFRUcmFuc3BvcnQuQ1JlYWRhYmxlVHJhbnNwb3J0KSBhbmQgc2VsZi50aHJpZnRfc3BlYyBpcyBub3QgTm9uZSBhbmQgZmFzdGJpbmFyeSBpcyBub3QgTm9uZToKKyAgICAgIGZhc3RiaW5hcnkuZGVjb2RlX2JpbmFyeShzZWxmLCBpcHJvdC50cmFucywgKHNlbGYuX19jbGFzc19fLCBzZWxmLnRocmlmdF9zcGVjKSkKKyAgICAgIHJldHVybgorICAgIGlwcm90LnJlYWRTdHJ1Y3RCZWdpbigpCisgICAgd2hpbGUgVHJ1ZToKKyAgICAgIChmbmFtZSwgZnR5cGUsIGZpZCkgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpCisgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5TVE9QOgorICAgICAgICBicmVhaworICAgICAgaWYgZmlkID09IDE6CisgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLlNUUlVDVDoKKyAgICAgICAgICBzZWxmLmJvbHQgPSBCb2x0QWdncmVnYXRlU3RhdHMoKQorICAgICAgICAgIHNlbGYuYm9sdC5yZWFkKGlwcm90KQorICAgICAgICBlbHNlOgorICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBlbGlmIGZpZCA9PSAyOgorICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5TVFJVQ1Q6CisgICAgICAgICAgc2VsZi5zcG91dCA9IFNwb3V0QWdncmVnYXRlU3RhdHMoKQorICAgICAgICAgIHNlbGYuc3BvdXQucmVhZChpcHJvdCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgZWxzZToKKyAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgIGlwcm90LnJlYWRGaWVsZEVuZCgpCisgICAgaXByb3QucmVhZFN0cnVjdEVuZCgpCisKKyAgZGVmIHdyaXRlKHNlbGYsIG9wcm90KToKKyAgICBpZiBvcHJvdC5fX2NsYXNzX18gPT0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIGFuZCBzZWxmLnRocmlmdF9zcGVjIGlzIG5vdCBOb25lIGFuZCBmYXN0YmluYXJ5IGlzIG5vdCBOb25lOgorICAgICAgb3Byb3QudHJhbnMud3JpdGUoZmFzdGJpbmFyeS5lbmNvZGVfYmluYXJ5KHNlbGYsIChzZWxmLl9fY2xhc3NfXywgc2VsZi50aHJpZnRfc3BlYykpKQorICAgICAgcmV0dXJuCisgICAgb3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbignU3BlY2lmaWNBZ2dyZWdhdGVTdGF0cycpCisgICAgaWYgc2VsZi5ib2x0IGlzIG5vdCBOb25lOgorICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCdib2x0JywgVFR5cGUuU1RSVUNULCAxKQorICAgICAgc2VsZi5ib2x0LndyaXRlKG9wcm90KQorICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCisgICAgaWYgc2VsZi5zcG91dCBpcyBub3QgTm9uZToKKyAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbignc3BvdXQnLCBUVHlwZS5TVFJVQ1QsIDIpCisgICAgICBzZWxmLnNwb3V0LndyaXRlKG9wcm90KQorICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCisgICAgb3Byb3Qud3JpdGVGaWVsZFN0b3AoKQorICAgIG9wcm90LndyaXRlU3RydWN0RW5kKCkKKworICBkZWYgdmFsaWRhdGUoc2VsZik6CisgICAgcmV0dXJuCisKKworICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgdmFsdWUgPSAxNworICAgIHZhbHVlID0gKHZhbHVlICogMzEpIF4gaGFzaChzZWxmLmJvbHQpCisgICAgdmFsdWUgPSAodmFsdWUgKiAzMSkgXiBoYXNoKHNlbGYuc3BvdXQpCisgICAgcmV0dXJuIHZhbHVlCisKKyAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgIEwgPSBbJyVzPSVyJyAlIChrZXksIHZhbHVlKQorICAgICAgZm9yIGtleSwgdmFsdWUgaW4gc2VsZi5fX2RpY3RfXy5pdGVyaXRlbXMoKV0KKyAgICByZXR1cm4gJyVzKCVzKScgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sICcsICcuam9pbihMKSkKKworICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICByZXR1cm4gaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pIGFuZCBzZWxmLl9fZGljdF9fID09IG90aGVyLl9fZGljdF9fCisKKyAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CisgICAgcmV0dXJuIG5vdCAoc2VsZiA9PSBvdGhlcikKKworY2xhc3MgQ29tcG9uZW50QWdncmVnYXRlU3RhdHM6CisgICIiIgorICBBdHRyaWJ1dGVzOgorICAgLSB0eXBlCisgICAtIGNvbW1vbl9zdGF0cworICAgLSBzcGVjaWZpY19zdGF0cworICAgLSBsYXN0X2Vycm9yCisgICIiIgorCisgIHRocmlmdF9zcGVjID0gKAorICAgIE5vbmUsICMgMAorICAgICgxLCBUVHlwZS5JMzIsICd0eXBlJywgTm9uZSwgTm9uZSwgKSwgIyAxCisgICAgKDIsIFRUeXBlLlNUUlVDVCwgJ2NvbW1vbl9zdGF0cycsIChDb21tb25BZ2dyZWdhdGVTdGF0cywgQ29tbW9uQWdncmVnYXRlU3RhdHMudGhyaWZ0X3NwZWMpLCBOb25lLCApLCAjIDIKKyAgICAoMywgVFR5cGUuU1RSVUNULCAnc3BlY2lmaWNfc3RhdHMnLCAoU3BlY2lmaWNBZ2dyZWdhdGVTdGF0cywgU3BlY2lmaWNBZ2dyZWdhdGVTdGF0cy50aHJpZnRfc3BlYyksIE5vbmUsICksICMgMworICAgICg0LCBUVHlwZS5TVFJVQ1QsICdsYXN0X2Vycm9yJywgKEVycm9ySW5mbywgRXJyb3JJbmZvLnRocmlmdF9zcGVjKSwgTm9uZSwgKSwgIyA0CisgICkKKworICBkZWYgX19pbml0X18oc2VsZiwgdHlwZT1Ob25lLCBjb21tb25fc3RhdHM9Tm9uZSwgc3BlY2lmaWNfc3RhdHM9Tm9uZSwgbGFzdF9lcnJvcj1Ob25lLCk6CisgICAgc2VsZi50eXBlID0gdHlwZQorICAgIHNlbGYuY29tbW9uX3N0YXRzID0gY29tbW9uX3N0YXRzCisgICAgc2VsZi5zcGVjaWZpY19zdGF0cyA9IHNwZWNpZmljX3N0YXRzCisgICAgc2VsZi5sYXN0X2Vycm9yID0gbGFzdF9lcnJvcgorCisgIGRlZiByZWFkKHNlbGYsIGlwcm90KToKKyAgICBpZiBpcHJvdC5fX2NsYXNzX18gPT0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIGFuZCBpc2luc3RhbmNlKGlwcm90LnRyYW5zLCBUVHJhbnNwb3J0LkNSZWFkYWJsZVRyYW5zcG9ydCkgYW5kIHNlbGYudGhyaWZ0X3NwZWMgaXMgbm90IE5vbmUgYW5kIGZhc3RiaW5hcnkgaXMgbm90IE5vbmU6CisgICAgICBmYXN0YmluYXJ5LmRlY29kZV9iaW5hcnkoc2VsZiwgaXByb3QudHJhbnMsIChzZWxmLl9fY2xhc3NfXywgc2VsZi50aHJpZnRfc3BlYykpCisgICAgICByZXR1cm4KKyAgICBpcHJvdC5yZWFkU3RydWN0QmVnaW4oKQorICAgIHdoaWxlIFRydWU6CisgICAgICAoZm5hbWUsIGZ0eXBlLCBmaWQpID0gaXByb3QucmVhZEZpZWxkQmVnaW4oKQorICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuU1RPUDoKKyAgICAgICAgYnJlYWsKKyAgICAgIGlmIGZpZCA9PSAxOgorICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5JMzI6CisgICAgICAgICAgc2VsZi50eXBlID0gaXByb3QucmVhZEkzMigpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgIGVsaWYgZmlkID09IDI6CisgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLlNUUlVDVDoKKyAgICAgICAgICBzZWxmLmNvbW1vbl9zdGF0cyA9IENvbW1vbkFnZ3JlZ2F0ZVN0YXRzKCkKKyAgICAgICAgICBzZWxmLmNvbW1vbl9zdGF0cy5yZWFkKGlwcm90KQorICAgICAgICBlbHNlOgorICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBlbGlmIGZpZCA9PSAzOgorICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5TVFJVQ1Q6CisgICAgICAgICAgc2VsZi5zcGVjaWZpY19zdGF0cyA9IFNwZWNpZmljQWdncmVnYXRlU3RhdHMoKQorICAgICAgICAgIHNlbGYuc3BlY2lmaWNfc3RhdHMucmVhZChpcHJvdCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgZWxpZiBmaWQgPT0gNDoKKyAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuU1RSVUNUOgorICAgICAgICAgIHNlbGYubGFzdF9lcnJvciA9IEVycm9ySW5mbygpCisgICAgICAgICAgc2VsZi5sYXN0X2Vycm9yLnJlYWQoaXByb3QpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgIGVsc2U6CisgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBpcHJvdC5yZWFkRmllbGRFbmQoKQorICAgIGlwcm90LnJlYWRTdHJ1Y3RFbmQoKQorCisgIGRlZiB3cml0ZShzZWxmLCBvcHJvdCk6CisgICAgaWYgb3Byb3QuX19jbGFzc19fID09IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCBhbmQgc2VsZi50aHJpZnRfc3BlYyBpcyBub3QgTm9uZSBhbmQgZmFzdGJpbmFyeSBpcyBub3QgTm9uZToKKyAgICAgIG9wcm90LnRyYW5zLndyaXRlKGZhc3RiaW5hcnkuZW5jb2RlX2JpbmFyeShzZWxmLCAoc2VsZi5fX2NsYXNzX18sIHNlbGYudGhyaWZ0X3NwZWMpKSkKKyAgICAgIHJldHVybgorICAgIG9wcm90LndyaXRlU3RydWN0QmVnaW4oJ0NvbXBvbmVudEFnZ3JlZ2F0ZVN0YXRzJykKKyAgICBpZiBzZWxmLnR5cGUgaXMgbm90IE5vbmU6CisgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ3R5cGUnLCBUVHlwZS5JMzIsIDEpCisgICAgICBvcHJvdC53cml0ZUkzMihzZWxmLnR5cGUpCisgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKKyAgICBpZiBzZWxmLmNvbW1vbl9zdGF0cyBpcyBub3QgTm9uZToKKyAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbignY29tbW9uX3N0YXRzJywgVFR5cGUuU1RSVUNULCAyKQorICAgICAgc2VsZi5jb21tb25fc3RhdHMud3JpdGUob3Byb3QpCisgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKKyAgICBpZiBzZWxmLnNwZWNpZmljX3N0YXRzIGlzIG5vdCBOb25lOgorICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCdzcGVjaWZpY19zdGF0cycsIFRUeXBlLlNUUlVDVCwgMykKKyAgICAgIHNlbGYuc3BlY2lmaWNfc3RhdHMud3JpdGUob3Byb3QpCisgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKKyAgICBpZiBzZWxmLmxhc3RfZXJyb3IgaXMgbm90IE5vbmU6CisgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ2xhc3RfZXJyb3InLCBUVHlwZS5TVFJVQ1QsIDQpCisgICAgICBzZWxmLmxhc3RfZXJyb3Iud3JpdGUob3Byb3QpCisgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKKyAgICBvcHJvdC53cml0ZUZpZWxkU3RvcCgpCisgICAgb3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKQorCisgIGRlZiB2YWxpZGF0ZShzZWxmKToKKyAgICByZXR1cm4KKworCisgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICB2YWx1ZSA9IDE3CisgICAgdmFsdWUgPSAodmFsdWUgKiAzMSkgXiBoYXNoKHNlbGYudHlwZSkKKyAgICB2YWx1ZSA9ICh2YWx1ZSAqIDMxKSBeIGhhc2goc2VsZi5jb21tb25fc3RhdHMpCisgICAgdmFsdWUgPSAodmFsdWUgKiAzMSkgXiBoYXNoKHNlbGYuc3BlY2lmaWNfc3RhdHMpCisgICAgdmFsdWUgPSAodmFsdWUgKiAzMSkgXiBoYXNoKHNlbGYubGFzdF9lcnJvcikKKyAgICByZXR1cm4gdmFsdWUKKworICBkZWYgX19yZXByX18oc2VsZik6CisgICAgTCA9IFsnJXM9JXInICUgKGtleSwgdmFsdWUpCisgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzZWxmLl9fZGljdF9fLml0ZXJpdGVtcygpXQorICAgIHJldHVybiAnJXMoJXMpJyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgJywgJy5qb2luKEwpKQorCisgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgIHJldHVybiBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXykgYW5kIHNlbGYuX19kaWN0X18gPT0gb3RoZXIuX19kaWN0X18KKworICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKKyAgICByZXR1cm4gbm90IChzZWxmID09IG90aGVyKQorCitjbGFzcyBUb3BvbG9neVN0YXRzOgorICAiIiIKKyAgQXR0cmlidXRlczoKKyAgIC0gd2luZG93X3RvX2VtaXR0ZWQKKyAgIC0gd2luZG93X3RvX3RyYW5zZmVycmVkCisgICAtIHdpbmRvd190b19jb21wbGV0ZV9sYXRlbmNpZXNfbXMKKyAgIC0gd2luZG93X3RvX2Fja2VkCisgICAtIHdpbmRvd190b19mYWlsZWQKKyAgIiIiCisKKyAgdGhyaWZ0X3NwZWMgPSAoCisgICAgTm9uZSwgIyAwCisgICAgKDEsIFRUeXBlLk1BUCwgJ3dpbmRvd190b19lbWl0dGVkJywgKFRUeXBlLlNUUklORyxOb25lLFRUeXBlLkk2NCxOb25lKSwgTm9uZSwgKSwgIyAxCisgICAgKDIsIFRUeXBlLk1BUCwgJ3dpbmRvd190b190cmFuc2ZlcnJlZCcsIChUVHlwZS5TVFJJTkcsTm9uZSxUVHlwZS5JNjQsTm9uZSksIE5vbmUsICksICMgMgorICAgICgzLCBUVHlwZS5NQVAsICd3aW5kb3dfdG9fY29tcGxldGVfbGF0ZW5jaWVzX21zJywgKFRUeXBlLlNUUklORyxOb25lLFRUeXBlLkRPVUJMRSxOb25lKSwgTm9uZSwgKSwgIyAzCisgICAgKDQsIFRUeXBlLk1BUCwgJ3dpbmRvd190b19hY2tlZCcsIChUVHlwZS5TVFJJTkcsTm9uZSxUVHlwZS5JNjQsTm9uZSksIE5vbmUsICksICMgNAorICAgICg1LCBUVHlwZS5NQVAsICd3aW5kb3dfdG9fZmFpbGVkJywgKFRUeXBlLlNUUklORyxOb25lLFRUeXBlLkk2NCxOb25lKSwgTm9uZSwgKSwgIyA1CisgICkKKworICBkZWYgX19pbml0X18oc2VsZiwgd2luZG93X3RvX2VtaXR0ZWQ9Tm9uZSwgd2luZG93X3RvX3RyYW5zZmVycmVkPU5vbmUsIHdpbmRvd190b19jb21wbGV0ZV9sYXRlbmNpZXNfbXM9Tm9uZSwgd2luZG93X3RvX2Fja2VkPU5vbmUsIHdpbmRvd190b19mYWlsZWQ9Tm9uZSwpOgorICAgIHNlbGYud2luZG93X3RvX2VtaXR0ZWQgPSB3aW5kb3dfdG9fZW1pdHRlZAorICAgIHNlbGYud2luZG93X3RvX3RyYW5zZmVycmVkID0gd2luZG93X3RvX3RyYW5zZmVycmVkCisgICAgc2VsZi53aW5kb3dfdG9fY29tcGxldGVfbGF0ZW5jaWVzX21zID0gd2luZG93X3RvX2NvbXBsZXRlX2xhdGVuY2llc19tcworICAgIHNlbGYud2luZG93X3RvX2Fja2VkID0gd2luZG93X3RvX2Fja2VkCisgICAgc2VsZi53aW5kb3dfdG9fZmFpbGVkID0gd2luZG93X3RvX2ZhaWxlZAorCisgIGRlZiByZWFkKHNlbGYsIGlwcm90KToKKyAgICBpZiBpcHJvdC5fX2NsYXNzX18gPT0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIGFuZCBpc2luc3RhbmNlKGlwcm90LnRyYW5zLCBUVHJhbnNwb3J0LkNSZWFkYWJsZVRyYW5zcG9ydCkgYW5kIHNlbGYudGhyaWZ0X3NwZWMgaXMgbm90IE5vbmUgYW5kIGZhc3RiaW5hcnkgaXMgbm90IE5vbmU6CisgICAgICBmYXN0YmluYXJ5LmRlY29kZV9iaW5hcnkoc2VsZiwgaXByb3QudHJhbnMsIChzZWxmLl9fY2xhc3NfXywgc2VsZi50aHJpZnRfc3BlYykpCisgICAgICByZXR1cm4KKyAgICBpcHJvdC5yZWFkU3RydWN0QmVnaW4oKQorICAgIHdoaWxlIFRydWU6CisgICAgICAoZm5hbWUsIGZ0eXBlLCBmaWQpID0gaXByb3QucmVhZEZpZWxkQmVnaW4oKQorICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuU1RPUDoKKyAgICAgICAgYnJlYWsKKyAgICAgIGlmIGZpZCA9PSAxOgorICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5NQVA6CisgICAgICAgICAgc2VsZi53aW5kb3dfdG9fZW1pdHRlZCA9IHt9CisgICAgICAgICAgKF9rdHlwZTMxNiwgX3Z0eXBlMzE3LCBfc2l6ZTMxNSApID0gaXByb3QucmVhZE1hcEJlZ2luKCkKKyAgICAgICAgICBmb3IgX2kzMTkgaW4geHJhbmdlKF9zaXplMzE1KToKKyAgICAgICAgICAgIF9rZXkzMjAgPSBpcHJvdC5yZWFkU3RyaW5nKCkuZGVjb2RlKCd1dGYtOCcpCisgICAgICAgICAgICBfdmFsMzIxID0gaXByb3QucmVhZEk2NCgpCisgICAgICAgICAgICBzZWxmLndpbmRvd190b19lbWl0dGVkW19rZXkzMjBdID0gX3ZhbDMyMQorICAgICAgICAgIGlwcm90LnJlYWRNYXBFbmQoKQorICAgICAgICBlbHNlOgorICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBlbGlmIGZpZCA9PSAyOgorICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5NQVA6CisgICAgICAgICAgc2VsZi53aW5kb3dfdG9fdHJhbnNmZXJyZWQgPSB7fQorICAgICAgICAgIChfa3R5cGUzMjMsIF92dHlwZTMyNCwgX3NpemUzMjIgKSA9IGlwcm90LnJlYWRNYXBCZWdpbigpCisgICAgICAgICAgZm9yIF9pMzI2IGluIHhyYW5nZShfc2l6ZTMyMik6CisgICAgICAgICAgICBfa2V5MzI3ID0gaXByb3QucmVhZFN0cmluZygpLmRlY29kZSgndXRmLTgnKQorICAgICAgICAgICAgX3ZhbDMyOCA9IGlwcm90LnJlYWRJNjQoKQorICAgICAgICAgICAgc2VsZi53aW5kb3dfdG9fdHJhbnNmZXJyZWRbX2tleTMyN10gPSBfdmFsMzI4CisgICAgICAgICAgaXByb3QucmVhZE1hcEVuZCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgIGVsaWYgZmlkID09IDM6CisgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLk1BUDoKKyAgICAgICAgICBzZWxmLndpbmRvd190b19jb21wbGV0ZV9sYXRlbmNpZXNfbXMgPSB7fQorICAgICAgICAgIChfa3R5cGUzMzAsIF92dHlwZTMzMSwgX3NpemUzMjkgKSA9IGlwcm90LnJlYWRNYXBCZWdpbigpCisgICAgICAgICAgZm9yIF9pMzMzIGluIHhyYW5nZShfc2l6ZTMyOSk6CisgICAgICAgICAgICBfa2V5MzM0ID0gaXByb3QucmVhZFN0cmluZygpLmRlY29kZSgndXRmLTgnKQorICAgICAgICAgICAgX3ZhbDMzNSA9IGlwcm90LnJlYWREb3VibGUoKQorICAgICAgICAgICAgc2VsZi53aW5kb3dfdG9fY29tcGxldGVfbGF0ZW5jaWVzX21zW19rZXkzMzRdID0gX3ZhbDMzNQorICAgICAgICAgIGlwcm90LnJlYWRNYXBFbmQoKQorICAgICAgICBlbHNlOgorICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBlbGlmIGZpZCA9PSA0OgorICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5NQVA6CisgICAgICAgICAgc2VsZi53aW5kb3dfdG9fYWNrZWQgPSB7fQorICAgICAgICAgIChfa3R5cGUzMzcsIF92dHlwZTMzOCwgX3NpemUzMzYgKSA9IGlwcm90LnJlYWRNYXBCZWdpbigpCisgICAgICAgICAgZm9yIF9pMzQwIGluIHhyYW5nZShfc2l6ZTMzNik6CisgICAgICAgICAgICBfa2V5MzQxID0gaXByb3QucmVhZFN0cmluZygpLmRlY29kZSgndXRmLTgnKQorICAgICAgICAgICAgX3ZhbDM0MiA9IGlwcm90LnJlYWRJNjQoKQorICAgICAgICAgICAgc2VsZi53aW5kb3dfdG9fYWNrZWRbX2tleTM0MV0gPSBfdmFsMzQyCisgICAgICAgICAgaXByb3QucmVhZE1hcEVuZCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgIGVsaWYgZmlkID09IDU6CisgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLk1BUDoKKyAgICAgICAgICBzZWxmLndpbmRvd190b19mYWlsZWQgPSB7fQorICAgICAgICAgIChfa3R5cGUzNDQsIF92dHlwZTM0NSwgX3NpemUzNDMgKSA9IGlwcm90LnJlYWRNYXBCZWdpbigpCisgICAgICAgICAgZm9yIF9pMzQ3IGluIHhyYW5nZShfc2l6ZTM0Myk6CisgICAgICAgICAgICBfa2V5MzQ4ID0gaXByb3QucmVhZFN0cmluZygpLmRlY29kZSgndXRmLTgnKQorICAgICAgICAgICAgX3ZhbDM0OSA9IGlwcm90LnJlYWRJNjQoKQorICAgICAgICAgICAgc2VsZi53aW5kb3dfdG9fZmFpbGVkW19rZXkzNDhdID0gX3ZhbDM0OQorICAgICAgICAgIGlwcm90LnJlYWRNYXBFbmQoKQorICAgICAgICBlbHNlOgorICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBlbHNlOgorICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgaXByb3QucmVhZEZpZWxkRW5kKCkKKyAgICBpcHJvdC5yZWFkU3RydWN0RW5kKCkKKworICBkZWYgd3JpdGUoc2VsZiwgb3Byb3QpOgorICAgIGlmIG9wcm90Ll9fY2xhc3NfXyA9PSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgYW5kIHNlbGYudGhyaWZ0X3NwZWMgaXMgbm90IE5vbmUgYW5kIGZhc3RiaW5hcnkgaXMgbm90IE5vbmU6CisgICAgICBvcHJvdC50cmFucy53cml0ZShmYXN0YmluYXJ5LmVuY29kZV9iaW5hcnkoc2VsZiwgKHNlbGYuX19jbGFzc19fLCBzZWxmLnRocmlmdF9zcGVjKSkpCisgICAgICByZXR1cm4KKyAgICBvcHJvdC53cml0ZVN0cnVjdEJlZ2luKCdUb3BvbG9neVN0YXRzJykKKyAgICBpZiBzZWxmLndpbmRvd190b19lbWl0dGVkIGlzIG5vdCBOb25lOgorICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCd3aW5kb3dfdG9fZW1pdHRlZCcsIFRUeXBlLk1BUCwgMSkKKyAgICAgIG9wcm90LndyaXRlTWFwQmVnaW4oVFR5cGUuU1RSSU5HLCBUVHlwZS5JNjQsIGxlbihzZWxmLndpbmRvd190b19lbWl0dGVkKSkKKyAgICAgIGZvciBraXRlcjM1MCx2aXRlcjM1MSBpbiBzZWxmLndpbmRvd190b19lbWl0dGVkLml0ZW1zKCk6CisgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKGtpdGVyMzUwLmVuY29kZSgndXRmLTgnKSkKKyAgICAgICAgb3Byb3Qud3JpdGVJNjQodml0ZXIzNTEpCisgICAgICBvcHJvdC53cml0ZU1hcEVuZCgpCisgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKKyAgICBpZiBzZWxmLndpbmRvd190b190cmFuc2ZlcnJlZCBpcyBub3QgTm9uZToKKyAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbignd2luZG93X3RvX3RyYW5zZmVycmVkJywgVFR5cGUuTUFQLCAyKQorICAgICAgb3Byb3Qud3JpdGVNYXBCZWdpbihUVHlwZS5TVFJJTkcsIFRUeXBlLkk2NCwgbGVuKHNlbGYud2luZG93X3RvX3RyYW5zZmVycmVkKSkKKyAgICAgIGZvciBraXRlcjM1Mix2aXRlcjM1MyBpbiBzZWxmLndpbmRvd190b190cmFuc2ZlcnJlZC5pdGVtcygpOgorICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhraXRlcjM1Mi5lbmNvZGUoJ3V0Zi04JykpCisgICAgICAgIG9wcm90LndyaXRlSTY0KHZpdGVyMzUzKQorICAgICAgb3Byb3Qud3JpdGVNYXBFbmQoKQorICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCisgICAgaWYgc2VsZi53aW5kb3dfdG9fY29tcGxldGVfbGF0ZW5jaWVzX21zIGlzIG5vdCBOb25lOgorICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCd3aW5kb3dfdG9fY29tcGxldGVfbGF0ZW5jaWVzX21zJywgVFR5cGUuTUFQLCAzKQorICAgICAgb3Byb3Qud3JpdGVNYXBCZWdpbihUVHlwZS5TVFJJTkcsIFRUeXBlLkRPVUJMRSwgbGVuKHNlbGYud2luZG93X3RvX2NvbXBsZXRlX2xhdGVuY2llc19tcykpCisgICAgICBmb3Iga2l0ZXIzNTQsdml0ZXIzNTUgaW4gc2VsZi53aW5kb3dfdG9fY29tcGxldGVfbGF0ZW5jaWVzX21zLml0ZW1zKCk6CisgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKGtpdGVyMzU0LmVuY29kZSgndXRmLTgnKSkKKyAgICAgICAgb3Byb3Qud3JpdGVEb3VibGUodml0ZXIzNTUpCisgICAgICBvcHJvdC53cml0ZU1hcEVuZCgpCisgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKKyAgICBpZiBzZWxmLndpbmRvd190b19hY2tlZCBpcyBub3QgTm9uZToKKyAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbignd2luZG93X3RvX2Fja2VkJywgVFR5cGUuTUFQLCA0KQorICAgICAgb3Byb3Qud3JpdGVNYXBCZWdpbihUVHlwZS5TVFJJTkcsIFRUeXBlLkk2NCwgbGVuKHNlbGYud2luZG93X3RvX2Fja2VkKSkKKyAgICAgIGZvciBraXRlcjM1Nix2aXRlcjM1NyBpbiBzZWxmLndpbmRvd190b19hY2tlZC5pdGVtcygpOgorICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhraXRlcjM1Ni5lbmNvZGUoJ3V0Zi04JykpCisgICAgICAgIG9wcm90LndyaXRlSTY0KHZpdGVyMzU3KQorICAgICAgb3Byb3Qud3JpdGVNYXBFbmQoKQorICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCisgICAgaWYgc2VsZi53aW5kb3dfdG9fZmFpbGVkIGlzIG5vdCBOb25lOgorICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCd3aW5kb3dfdG9fZmFpbGVkJywgVFR5cGUuTUFQLCA1KQorICAgICAgb3Byb3Qud3JpdGVNYXBCZWdpbihUVHlwZS5TVFJJTkcsIFRUeXBlLkk2NCwgbGVuKHNlbGYud2luZG93X3RvX2ZhaWxlZCkpCisgICAgICBmb3Iga2l0ZXIzNTgsdml0ZXIzNTkgaW4gc2VsZi53aW5kb3dfdG9fZmFpbGVkLml0ZW1zKCk6CisgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKGtpdGVyMzU4LmVuY29kZSgndXRmLTgnKSkKKyAgICAgICAgb3Byb3Qud3JpdGVJNjQodml0ZXIzNTkpCisgICAgICBvcHJvdC53cml0ZU1hcEVuZCgpCisgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKKyAgICBvcHJvdC53cml0ZUZpZWxkU3RvcCgpCisgICAgb3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKQorCisgIGRlZiB2YWxpZGF0ZShzZWxmKToKKyAgICByZXR1cm4KKworCisgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICB2YWx1ZSA9IDE3CisgICAgdmFsdWUgPSAodmFsdWUgKiAzMSkgXiBoYXNoKHNlbGYud2luZG93X3RvX2VtaXR0ZWQpCisgICAgdmFsdWUgPSAodmFsdWUgKiAzMSkgXiBoYXNoKHNlbGYud2luZG93X3RvX3RyYW5zZmVycmVkKQorICAgIHZhbHVlID0gKHZhbHVlICogMzEpIF4gaGFzaChzZWxmLndpbmRvd190b19jb21wbGV0ZV9sYXRlbmNpZXNfbXMpCisgICAgdmFsdWUgPSAodmFsdWUgKiAzMSkgXiBoYXNoKHNlbGYud2luZG93X3RvX2Fja2VkKQorICAgIHZhbHVlID0gKHZhbHVlICogMzEpIF4gaGFzaChzZWxmLndpbmRvd190b19mYWlsZWQpCisgICAgcmV0dXJuIHZhbHVlCisKKyAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgIEwgPSBbJyVzPSVyJyAlIChrZXksIHZhbHVlKQorICAgICAgZm9yIGtleSwgdmFsdWUgaW4gc2VsZi5fX2RpY3RfXy5pdGVyaXRlbXMoKV0KKyAgICByZXR1cm4gJyVzKCVzKScgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sICcsICcuam9pbihMKSkKKworICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICByZXR1cm4gaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pIGFuZCBzZWxmLl9fZGljdF9fID09IG90aGVyLl9fZGljdF9fCisKKyAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CisgICAgcmV0dXJuIG5vdCAoc2VsZiA9PSBvdGhlcikKKworY2xhc3MgVG9wb2xvZ3lQYWdlSW5mbzoKKyAgIiIiCisgIEF0dHJpYnV0ZXM6CisgICAtIGlkCisgICAtIG5hbWUKKyAgIC0gdXB0aW1lX3NlY3MKKyAgIC0gc3RhdHVzCisgICAtIG51bV90YXNrcworICAgLSBudW1fd29ya2VycworICAgLSBudW1fZXhlY3V0b3JzCisgICAtIHRvcG9sb2d5X2NvbmYKKyAgIC0gaWRfdG9fc3BvdXRfYWdnX3N0YXRzCisgICAtIGlkX3RvX2JvbHRfYWdnX3N0YXRzCisgICAtIHNjaGVkX3N0YXR1cworICAgLSB0b3BvbG9neV9zdGF0cworICAgLSBvd25lcgorICAgLSBkZWJ1Z19vcHRpb25zCisgICAtIHJlcGxpY2F0aW9uX2NvdW50CisgICAtIHJlcXVlc3RlZF9tZW1vbmhlYXAKKyAgIC0gcmVxdWVzdGVkX21lbW9mZmhlYXAKKyAgIC0gcmVxdWVzdGVkX2NwdQorICAgLSBhc3NpZ25lZF9tZW1vbmhlYXAKKyAgIC0gYXNzaWduZWRfbWVtb2ZmaGVhcAorICAgLSBhc3NpZ25lZF9jcHUKKyAgIiIiCisKKyAgdGhyaWZ0X3NwZWMgPSAoCisgICAgTm9uZSwgIyAwCisgICAgKDEsIFRUeXBlLlNUUklORywgJ2lkJywgTm9uZSwgTm9uZSwgKSwgIyAxCisgICAgKDIsIFRUeXBlLlNUUklORywgJ25hbWUnLCBOb25lLCBOb25lLCApLCAjIDIKKyAgICAoMywgVFR5cGUuSTMyLCAndXB0aW1lX3NlY3MnLCBOb25lLCBOb25lLCApLCAjIDMKKyAgICAoNCwgVFR5cGUuU1RSSU5HLCAnc3RhdHVzJywgTm9uZSwgTm9uZSwgKSwgIyA0CisgICAgKDUsIFRUeXBlLkkzMiwgJ251bV90YXNrcycsIE5vbmUsIE5vbmUsICksICMgNQorICAgICg2LCBUVHlwZS5JMzIsICdudW1fd29ya2VycycsIE5vbmUsIE5vbmUsICksICMgNgorICAgICg3LCBUVHlwZS5JMzIsICdudW1fZXhlY3V0b3JzJywgTm9uZSwgTm9uZSwgKSwgIyA3CisgICAgKDgsIFRUeXBlLlNUUklORywgJ3RvcG9sb2d5X2NvbmYnLCBOb25lLCBOb25lLCApLCAjIDgKKyAgICAoOSwgVFR5cGUuTUFQLCAnaWRfdG9fc3BvdXRfYWdnX3N0YXRzJywgKFRUeXBlLlNUUklORyxOb25lLFRUeXBlLlNUUlVDVCwoQ29tcG9uZW50QWdncmVnYXRlU3RhdHMsIENvbXBvbmVudEFnZ3JlZ2F0ZVN0YXRzLnRocmlmdF9zcGVjKSksIE5vbmUsICksICMgOQorICAgICgxMCwgVFR5cGUuTUFQLCAnaWRfdG9fYm9sdF9hZ2dfc3RhdHMnLCAoVFR5cGUuU1RSSU5HLE5vbmUsVFR5cGUuU1RSVUNULChDb21wb25lbnRBZ2dyZWdhdGVTdGF0cywgQ29tcG9uZW50QWdncmVnYXRlU3RhdHMudGhyaWZ0X3NwZWMpKSwgTm9uZSwgKSwgIyAxMAorICAgICgxMSwgVFR5cGUuU1RSSU5HLCAnc2NoZWRfc3RhdHVzJywgTm9uZSwgTm9uZSwgKSwgIyAxMQorICAgICgxMiwgVFR5cGUuU1RSVUNULCAndG9wb2xvZ3lfc3RhdHMnLCAoVG9wb2xvZ3lTdGF0cywgVG9wb2xvZ3lTdGF0cy50aHJpZnRfc3BlYyksIE5vbmUsICksICMgMTIKKyAgICAoMTMsIFRUeXBlLlNUUklORywgJ293bmVyJywgTm9uZSwgTm9uZSwgKSwgIyAxMworICAgICgxNCwgVFR5cGUuU1RSVUNULCAnZGVidWdfb3B0aW9ucycsIChEZWJ1Z09wdGlvbnMsIERlYnVnT3B0aW9ucy50aHJpZnRfc3BlYyksIE5vbmUsICksICMgMTQKKyAgICAoMTUsIFRUeXBlLkkzMiwgJ3JlcGxpY2F0aW9uX2NvdW50JywgTm9uZSwgTm9uZSwgKSwgIyAxNQorICAgIE5vbmUsICMgMTYKKyAgICBOb25lLCAjIDE3CisgICAgTm9uZSwgIyAxOAorICAgIE5vbmUsICMgMTkKKyAgICBOb25lLCAjIDIwCisgICAgTm9uZSwgIyAyMQorICAgIE5vbmUsICMgMjIKKyAgICBOb25lLCAjIDIzCisgICAgTm9uZSwgIyAyNAorICAgIE5vbmUsICMgMjUKKyAgICBOb25lLCAjIDI2CisgICAgTm9uZSwgIyAyNworICAgIE5vbmUsICMgMjgKKyAgICBOb25lLCAjIDI5CisgICAgTm9uZSwgIyAzMAorICAgIE5vbmUsICMgMzEKKyAgICBOb25lLCAjIDMyCisgICAgTm9uZSwgIyAzMworICAgIE5vbmUsICMgMzQKKyAgICBOb25lLCAjIDM1CisgICAgTm9uZSwgIyAzNgorICAgIE5vbmUsICMgMzcKKyAgICBOb25lLCAjIDM4CisgICAgTm9uZSwgIyAzOQorICAgIE5vbmUsICMgNDAKKyAgICBOb25lLCAjIDQxCisgICAgTm9uZSwgIyA0MgorICAgIE5vbmUsICMgNDMKKyAgICBOb25lLCAjIDQ0CisgICAgTm9uZSwgIyA0NQorICAgIE5vbmUsICMgNDYKKyAgICBOb25lLCAjIDQ3CisgICAgTm9uZSwgIyA0OAorICAgIE5vbmUsICMgNDkKKyAgICBOb25lLCAjIDUwCisgICAgTm9uZSwgIyA1MQorICAgIE5vbmUsICMgNTIKKyAgICBOb25lLCAjIDUzCisgICAgTm9uZSwgIyA1NAorICAgIE5vbmUsICMgNTUKKyAgICBOb25lLCAjIDU2CisgICAgTm9uZSwgIyA1NworICAgIE5vbmUsICMgNTgKKyAgICBOb25lLCAjIDU5CisgICAgTm9uZSwgIyA2MAorICAgIE5vbmUsICMgNjEKKyAgICBOb25lLCAjIDYyCisgICAgTm9uZSwgIyA2MworICAgIE5vbmUsICMgNjQKKyAgICBOb25lLCAjIDY1CisgICAgTm9uZSwgIyA2NgorICAgIE5vbmUsICMgNjcKKyAgICBOb25lLCAjIDY4CisgICAgTm9uZSwgIyA2OQorICAgIE5vbmUsICMgNzAKKyAgICBOb25lLCAjIDcxCisgICAgTm9uZSwgIyA3MgorICAgIE5vbmUsICMgNzMKKyAgICBOb25lLCAjIDc0CisgICAgTm9uZSwgIyA3NQorICAgIE5vbmUsICMgNzYKKyAgICBOb25lLCAjIDc3CisgICAgTm9uZSwgIyA3OAorICAgIE5vbmUsICMgNzkKKyAgICBOb25lLCAjIDgwCisgICAgTm9uZSwgIyA4MQorICAgIE5vbmUsICMgODIKKyAgICBOb25lLCAjIDgzCisgICAgTm9uZSwgIyA4NAorICAgIE5vbmUsICMgODUKKyAgICBOb25lLCAjIDg2CisgICAgTm9uZSwgIyA4NworICAgIE5vbmUsICMgODgKKyAgICBOb25lLCAjIDg5CisgICAgTm9uZSwgIyA5MAorICAgIE5vbmUsICMgOTEKKyAgICBOb25lLCAjIDkyCisgICAgTm9uZSwgIyA5MworICAgIE5vbmUsICMgOTQKKyAgICBOb25lLCAjIDk1CisgICAgTm9uZSwgIyA5NgorICAgIE5vbmUsICMgOTcKKyAgICBOb25lLCAjIDk4CisgICAgTm9uZSwgIyA5OQorICAgIE5vbmUsICMgMTAwCisgICAgTm9uZSwgIyAxMDEKKyAgICBOb25lLCAjIDEwMgorICAgIE5vbmUsICMgMTAzCisgICAgTm9uZSwgIyAxMDQKKyAgICBOb25lLCAjIDEwNQorICAgIE5vbmUsICMgMTA2CisgICAgTm9uZSwgIyAxMDcKKyAgICBOb25lLCAjIDEwOAorICAgIE5vbmUsICMgMTA5CisgICAgTm9uZSwgIyAxMTAKKyAgICBOb25lLCAjIDExMQorICAgIE5vbmUsICMgMTEyCisgICAgTm9uZSwgIyAxMTMKKyAgICBOb25lLCAjIDExNAorICAgIE5vbmUsICMgMTE1CisgICAgTm9uZSwgIyAxMTYKKyAgICBOb25lLCAjIDExNworICAgIE5vbmUsICMgMTE4CisgICAgTm9uZSwgIyAxMTkKKyAgICBOb25lLCAjIDEyMAorICAgIE5vbmUsICMgMTIxCisgICAgTm9uZSwgIyAxMjIKKyAgICBOb25lLCAjIDEyMworICAgIE5vbmUsICMgMTI0CisgICAgTm9uZSwgIyAxMjUKKyAgICBOb25lLCAjIDEyNgorICAgIE5vbmUsICMgMTI3CisgICAgTm9uZSwgIyAxMjgKKyAgICBOb25lLCAjIDEyOQorICAgIE5vbmUsICMgMTMwCisgICAgTm9uZSwgIyAxMzEKKyAgICBOb25lLCAjIDEzMgorICAgIE5vbmUsICMgMTMzCisgICAgTm9uZSwgIyAxMzQKKyAgICBOb25lLCAjIDEzNQorICAgIE5vbmUsICMgMTM2CisgICAgTm9uZSwgIyAxMzcKKyAgICBOb25lLCAjIDEzOAorICAgIE5vbmUsICMgMTM5CisgICAgTm9uZSwgIyAxNDAKKyAgICBOb25lLCAjIDE0MQorICAgIE5vbmUsICMgMTQyCisgICAgTm9uZSwgIyAxNDMKKyAgICBOb25lLCAjIDE0NAorICAgIE5vbmUsICMgMTQ1CisgICAgTm9uZSwgIyAxNDYKKyAgICBOb25lLCAjIDE0NworICAgIE5vbmUsICMgMTQ4CisgICAgTm9uZSwgIyAxNDkKKyAgICBOb25lLCAjIDE1MAorICAgIE5vbmUsICMgMTUxCisgICAgTm9uZSwgIyAxNTIKKyAgICBOb25lLCAjIDE1MworICAgIE5vbmUsICMgMTU0CisgICAgTm9uZSwgIyAxNTUKKyAgICBOb25lLCAjIDE1NgorICAgIE5vbmUsICMgMTU3CisgICAgTm9uZSwgIyAxNTgKKyAgICBOb25lLCAjIDE1OQorICAgIE5vbmUsICMgMTYwCisgICAgTm9uZSwgIyAxNjEKKyAgICBOb25lLCAjIDE2MgorICAgIE5vbmUsICMgMTYzCisgICAgTm9uZSwgIyAxNjQKKyAgICBOb25lLCAjIDE2NQorICAgIE5vbmUsICMgMTY2CisgICAgTm9uZSwgIyAxNjcKKyAgICBOb25lLCAjIDE2OAorICAgIE5vbmUsICMgMTY5CisgICAgTm9uZSwgIyAxNzAKKyAgICBOb25lLCAjIDE3MQorICAgIE5vbmUsICMgMTcyCisgICAgTm9uZSwgIyAxNzMKKyAgICBOb25lLCAjIDE3NAorICAgIE5vbmUsICMgMTc1CisgICAgTm9uZSwgIyAxNzYKKyAgICBOb25lLCAjIDE3NworICAgIE5vbmUsICMgMTc4CisgICAgTm9uZSwgIyAxNzkKKyAgICBOb25lLCAjIDE4MAorICAgIE5vbmUsICMgMTgxCisgICAgTm9uZSwgIyAxODIKKyAgICBOb25lLCAjIDE4MworICAgIE5vbmUsICMgMTg0CisgICAgTm9uZSwgIyAxODUKKyAgICBOb25lLCAjIDE4NgorICAgIE5vbmUsICMgMTg3CisgICAgTm9uZSwgIyAxODgKKyAgICBOb25lLCAjIDE4OQorICAgIE5vbmUsICMgMTkwCisgICAgTm9uZSwgIyAxOTEKKyAgICBOb25lLCAjIDE5MgorICAgIE5vbmUsICMgMTkzCisgICAgTm9uZSwgIyAxOTQKKyAgICBOb25lLCAjIDE5NQorICAgIE5vbmUsICMgMTk2CisgICAgTm9uZSwgIyAxOTcKKyAgICBOb25lLCAjIDE5OAorICAgIE5vbmUsICMgMTk5CisgICAgTm9uZSwgIyAyMDAKKyAgICBOb25lLCAjIDIwMQorICAgIE5vbmUsICMgMjAyCisgICAgTm9uZSwgIyAyMDMKKyAgICBOb25lLCAjIDIwNAorICAgIE5vbmUsICMgMjA1CisgICAgTm9uZSwgIyAyMDYKKyAgICBOb25lLCAjIDIwNworICAgIE5vbmUsICMgMjA4CisgICAgTm9uZSwgIyAyMDkKKyAgICBOb25lLCAjIDIxMAorICAgIE5vbmUsICMgMjExCisgICAgTm9uZSwgIyAyMTIKKyAgICBOb25lLCAjIDIxMworICAgIE5vbmUsICMgMjE0CisgICAgTm9uZSwgIyAyMTUKKyAgICBOb25lLCAjIDIxNgorICAgIE5vbmUsICMgMjE3CisgICAgTm9uZSwgIyAyMTgKKyAgICBOb25lLCAjIDIxOQorICAgIE5vbmUsICMgMjIwCisgICAgTm9uZSwgIyAyMjEKKyAgICBOb25lLCAjIDIyMgorICAgIE5vbmUsICMgMjIzCisgICAgTm9uZSwgIyAyMjQKKyAgICBOb25lLCAjIDIyNQorICAgIE5vbmUsICMgMjI2CisgICAgTm9uZSwgIyAyMjcKKyAgICBOb25lLCAjIDIyOAorICAgIE5vbmUsICMgMjI5CisgICAgTm9uZSwgIyAyMzAKKyAgICBOb25lLCAjIDIzMQorICAgIE5vbmUsICMgMjMyCisgICAgTm9uZSwgIyAyMzMKKyAgICBOb25lLCAjIDIzNAorICAgIE5vbmUsICMgMjM1CisgICAgTm9uZSwgIyAyMzYKKyAgICBOb25lLCAjIDIzNworICAgIE5vbmUsICMgMjM4CisgICAgTm9uZSwgIyAyMzkKKyAgICBOb25lLCAjIDI0MAorICAgIE5vbmUsICMgMjQxCisgICAgTm9uZSwgIyAyNDIKKyAgICBOb25lLCAjIDI0MworICAgIE5vbmUsICMgMjQ0CisgICAgTm9uZSwgIyAyNDUKKyAgICBOb25lLCAjIDI0NgorICAgIE5vbmUsICMgMjQ3CisgICAgTm9uZSwgIyAyNDgKKyAgICBOb25lLCAjIDI0OQorICAgIE5vbmUsICMgMjUwCisgICAgTm9uZSwgIyAyNTEKKyAgICBOb25lLCAjIDI1MgorICAgIE5vbmUsICMgMjUzCisgICAgTm9uZSwgIyAyNTQKKyAgICBOb25lLCAjIDI1NQorICAgIE5vbmUsICMgMjU2CisgICAgTm9uZSwgIyAyNTcKKyAgICBOb25lLCAjIDI1OAorICAgIE5vbmUsICMgMjU5CisgICAgTm9uZSwgIyAyNjAKKyAgICBOb25lLCAjIDI2MQorICAgIE5vbmUsICMgMjYyCisgICAgTm9uZSwgIyAyNjMKKyAgICBOb25lLCAjIDI2NAorICAgIE5vbmUsICMgMjY1CisgICAgTm9uZSwgIyAyNjYKKyAgICBOb25lLCAjIDI2NworICAgIE5vbmUsICMgMjY4CisgICAgTm9uZSwgIyAyNjkKKyAgICBOb25lLCAjIDI3MAorICAgIE5vbmUsICMgMjcxCisgICAgTm9uZSwgIyAyNzIKKyAgICBOb25lLCAjIDI3MworICAgIE5vbmUsICMgMjc0CisgICAgTm9uZSwgIyAyNzUKKyAgICBOb25lLCAjIDI3NgorICAgIE5vbmUsICMgMjc3CisgICAgTm9uZSwgIyAyNzgKKyAgICBOb25lLCAjIDI3OQorICAgIE5vbmUsICMgMjgwCisgICAgTm9uZSwgIyAyODEKKyAgICBOb25lLCAjIDI4MgorICAgIE5vbmUsICMgMjgzCisgICAgTm9uZSwgIyAyODQKKyAgICBOb25lLCAjIDI4NQorICAgIE5vbmUsICMgMjg2CisgICAgTm9uZSwgIyAyODcKKyAgICBOb25lLCAjIDI4OAorICAgIE5vbmUsICMgMjg5CisgICAgTm9uZSwgIyAyOTAKKyAgICBOb25lLCAjIDI5MQorICAgIE5vbmUsICMgMjkyCisgICAgTm9uZSwgIyAyOTMKKyAgICBOb25lLCAjIDI5NAorICAgIE5vbmUsICMgMjk1CisgICAgTm9uZSwgIyAyOTYKKyAgICBOb25lLCAjIDI5NworICAgIE5vbmUsICMgMjk4CisgICAgTm9uZSwgIyAyOTkKKyAgICBOb25lLCAjIDMwMAorICAgIE5vbmUsICMgMzAxCisgICAgTm9uZSwgIyAzMDIKKyAgICBOb25lLCAjIDMwMworICAgIE5vbmUsICMgMzA0CisgICAgTm9uZSwgIyAzMDUKKyAgICBOb25lLCAjIDMwNgorICAgIE5vbmUsICMgMzA3CisgICAgTm9uZSwgIyAzMDgKKyAgICBOb25lLCAjIDMwOQorICAgIE5vbmUsICMgMzEwCisgICAgTm9uZSwgIyAzMTEKKyAgICBOb25lLCAjIDMxMgorICAgIE5vbmUsICMgMzEzCisgICAgTm9uZSwgIyAzMTQKKyAgICBOb25lLCAjIDMxNQorICAgIE5vbmUsICMgMzE2CisgICAgTm9uZSwgIyAzMTcKKyAgICBOb25lLCAjIDMxOAorICAgIE5vbmUsICMgMzE5CisgICAgTm9uZSwgIyAzMjAKKyAgICBOb25lLCAjIDMyMQorICAgIE5vbmUsICMgMzIyCisgICAgTm9uZSwgIyAzMjMKKyAgICBOb25lLCAjIDMyNAorICAgIE5vbmUsICMgMzI1CisgICAgTm9uZSwgIyAzMjYKKyAgICBOb25lLCAjIDMyNworICAgIE5vbmUsICMgMzI4CisgICAgTm9uZSwgIyAzMjkKKyAgICBOb25lLCAjIDMzMAorICAgIE5vbmUsICMgMzMxCisgICAgTm9uZSwgIyAzMzIKKyAgICBOb25lLCAjIDMzMworICAgIE5vbmUsICMgMzM0CisgICAgTm9uZSwgIyAzMzUKKyAgICBOb25lLCAjIDMzNgorICAgIE5vbmUsICMgMzM3CisgICAgTm9uZSwgIyAzMzgKKyAgICBOb25lLCAjIDMzOQorICAgIE5vbmUsICMgMzQwCisgICAgTm9uZSwgIyAzNDEKKyAgICBOb25lLCAjIDM0MgorICAgIE5vbmUsICMgMzQzCisgICAgTm9uZSwgIyAzNDQKKyAgICBOb25lLCAjIDM0NQorICAgIE5vbmUsICMgMzQ2CisgICAgTm9uZSwgIyAzNDcKKyAgICBOb25lLCAjIDM0OAorICAgIE5vbmUsICMgMzQ5CisgICAgTm9uZSwgIyAzNTAKKyAgICBOb25lLCAjIDM1MQorICAgIE5vbmUsICMgMzUyCisgICAgTm9uZSwgIyAzNTMKKyAgICBOb25lLCAjIDM1NAorICAgIE5vbmUsICMgMzU1CisgICAgTm9uZSwgIyAzNTYKKyAgICBOb25lLCAjIDM1NworICAgIE5vbmUsICMgMzU4CisgICAgTm9uZSwgIyAzNTkKKyAgICBOb25lLCAjIDM2MAorICAgIE5vbmUsICMgMzYxCisgICAgTm9uZSwgIyAzNjIKKyAgICBOb25lLCAjIDM2MworICAgIE5vbmUsICMgMzY0CisgICAgTm9uZSwgIyAzNjUKKyAgICBOb25lLCAjIDM2NgorICAgIE5vbmUsICMgMzY3CisgICAgTm9uZSwgIyAzNjgKKyAgICBOb25lLCAjIDM2OQorICAgIE5vbmUsICMgMzcwCisgICAgTm9uZSwgIyAzNzEKKyAgICBOb25lLCAjIDM3MgorICAgIE5vbmUsICMgMzczCisgICAgTm9uZSwgIyAzNzQKKyAgICBOb25lLCAjIDM3NQorICAgIE5vbmUsICMgMzc2CisgICAgTm9uZSwgIyAzNzcKKyAgICBOb25lLCAjIDM3OAorICAgIE5vbmUsICMgMzc5CisgICAgTm9uZSwgIyAzODAKKyAgICBOb25lLCAjIDM4MQorICAgIE5vbmUsICMgMzgyCisgICAgTm9uZSwgIyAzODMKKyAgICBOb25lLCAjIDM4NAorICAgIE5vbmUsICMgMzg1CisgICAgTm9uZSwgIyAzODYKKyAgICBOb25lLCAjIDM4NworICAgIE5vbmUsICMgMzg4CisgICAgTm9uZSwgIyAzODkKKyAgICBOb25lLCAjIDM5MAorICAgIE5vbmUsICMgMzkxCisgICAgTm9uZSwgIyAzOTIKKyAgICBOb25lLCAjIDM5MworICAgIE5vbmUsICMgMzk0CisgICAgTm9uZSwgIyAzOTUKKyAgICBOb25lLCAjIDM5NgorICAgIE5vbmUsICMgMzk3CisgICAgTm9uZSwgIyAzOTgKKyAgICBOb25lLCAjIDM5OQorICAgIE5vbmUsICMgNDAwCisgICAgTm9uZSwgIyA0MDEKKyAgICBOb25lLCAjIDQwMgorICAgIE5vbmUsICMgNDAzCisgICAgTm9uZSwgIyA0MDQKKyAgICBOb25lLCAjIDQwNQorICAgIE5vbmUsICMgNDA2CisgICAgTm9uZSwgIyA0MDcKKyAgICBOb25lLCAjIDQwOAorICAgIE5vbmUsICMgNDA5CisgICAgTm9uZSwgIyA0MTAKKyAgICBOb25lLCAjIDQxMQorICAgIE5vbmUsICMgNDEyCisgICAgTm9uZSwgIyA0MTMKKyAgICBOb25lLCAjIDQxNAorICAgIE5vbmUsICMgNDE1CisgICAgTm9uZSwgIyA0MTYKKyAgICBOb25lLCAjIDQxNworICAgIE5vbmUsICMgNDE4CisgICAgTm9uZSwgIyA0MTkKKyAgICBOb25lLCAjIDQyMAorICAgIE5vbmUsICMgNDIxCisgICAgTm9uZSwgIyA0MjIKKyAgICBOb25lLCAjIDQyMworICAgIE5vbmUsICMgNDI0CisgICAgTm9uZSwgIyA0MjUKKyAgICBOb25lLCAjIDQyNgorICAgIE5vbmUsICMgNDI3CisgICAgTm9uZSwgIyA0MjgKKyAgICBOb25lLCAjIDQyOQorICAgIE5vbmUsICMgNDMwCisgICAgTm9uZSwgIyA0MzEKKyAgICBOb25lLCAjIDQzMgorICAgIE5vbmUsICMgNDMzCisgICAgTm9uZSwgIyA0MzQKKyAgICBOb25lLCAjIDQzNQorICAgIE5vbmUsICMgNDM2CisgICAgTm9uZSwgIyA0MzcKKyAgICBOb25lLCAjIDQzOAorICAgIE5vbmUsICMgNDM5CisgICAgTm9uZSwgIyA0NDAKKyAgICBOb25lLCAjIDQ0MQorICAgIE5vbmUsICMgNDQyCisgICAgTm9uZSwgIyA0NDMKKyAgICBOb25lLCAjIDQ0NAorICAgIE5vbmUsICMgNDQ1CisgICAgTm9uZSwgIyA0NDYKKyAgICBOb25lLCAjIDQ0NworICAgIE5vbmUsICMgNDQ4CisgICAgTm9uZSwgIyA0NDkKKyAgICBOb25lLCAjIDQ1MAorICAgIE5vbmUsICMgNDUxCisgICAgTm9uZSwgIyA0NTIKKyAgICBOb25lLCAjIDQ1MworICAgIE5vbmUsICMgNDU0CisgICAgTm9uZSwgIyA0NTUKKyAgICBOb25lLCAjIDQ1NgorICAgIE5vbmUsICMgNDU3CisgICAgTm9uZSwgIyA0NTgKKyAgICBOb25lLCAjIDQ1OQorICAgIE5vbmUsICMgNDYwCisgICAgTm9uZSwgIyA0NjEKKyAgICBOb25lLCAjIDQ2MgorICAgIE5vbmUsICMgNDYzCisgICAgTm9uZSwgIyA0NjQKKyAgICBOb25lLCAjIDQ2NQorICAgIE5vbmUsICMgNDY2CisgICAgTm9uZSwgIyA0NjcKKyAgICBOb25lLCAjIDQ2OAorICAgIE5vbmUsICMgNDY5CisgICAgTm9uZSwgIyA0NzAKKyAgICBOb25lLCAjIDQ3MQorICAgIE5vbmUsICMgNDcyCisgICAgTm9uZSwgIyA0NzMKKyAgICBOb25lLCAjIDQ3NAorICAgIE5vbmUsICMgNDc1CisgICAgTm9uZSwgIyA0NzYKKyAgICBOb25lLCAjIDQ3NworICAgIE5vbmUsICMgNDc4CisgICAgTm9uZSwgIyA0NzkKKyAgICBOb25lLCAjIDQ4MAorICAgIE5vbmUsICMgNDgxCisgICAgTm9uZSwgIyA0ODIKKyAgICBOb25lLCAjIDQ4MworICAgIE5vbmUsICMgNDg0CisgICAgTm9uZSwgIyA0ODUKKyAgICBOb25lLCAjIDQ4NgorICAgIE5vbmUsICMgNDg3CisgICAgTm9uZSwgIyA0ODgKKyAgICBOb25lLCAjIDQ4OQorICAgIE5vbmUsICMgNDkwCisgICAgTm9uZSwgIyA0OTEKKyAgICBOb25lLCAjIDQ5MgorICAgIE5vbmUsICMgNDkzCisgICAgTm9uZSwgIyA0OTQKKyAgICBOb25lLCAjIDQ5NQorICAgIE5vbmUsICMgNDk2CisgICAgTm9uZSwgIyA0OTcKKyAgICBOb25lLCAjIDQ5OAorICAgIE5vbmUsICMgNDk5CisgICAgTm9uZSwgIyA1MDAKKyAgICBOb25lLCAjIDUwMQorICAgIE5vbmUsICMgNTAyCisgICAgTm9uZSwgIyA1MDMKKyAgICBOb25lLCAjIDUwNAorICAgIE5vbmUsICMgNTA1CisgICAgTm9uZSwgIyA1MDYKKyAgICBOb25lLCAjIDUwNworICAgIE5vbmUsICMgNTA4CisgICAgTm9uZSwgIyA1MDkKKyAgICBOb25lLCAjIDUxMAorICAgIE5vbmUsICMgNTExCisgICAgTm9uZSwgIyA1MTIKKyAgICBOb25lLCAjIDUxMworICAgIE5vbmUsICMgNTE0CisgICAgTm9uZSwgIyA1MTUKKyAgICBOb25lLCAjIDUxNgorICAgIE5vbmUsICMgNTE3CisgICAgTm9uZSwgIyA1MTgKKyAgICBOb25lLCAjIDUxOQorICAgIE5vbmUsICMgNTIwCisgICAgKDUyMSwgVFR5cGUuRE9VQkxFLCAncmVxdWVzdGVkX21lbW9uaGVhcCcsIE5vbmUsIE5vbmUsICksICMgNTIxCisgICAgKDUyMiwgVFR5cGUuRE9VQkxFLCAncmVxdWVzdGVkX21lbW9mZmhlYXAnLCBOb25lLCBOb25lLCApLCAjIDUyMgorICAgICg1MjMsIFRUeXBlLkRPVUJMRSwgJ3JlcXVlc3RlZF9jcHUnLCBOb25lLCBOb25lLCApLCAjIDUyMworICAgICg1MjQsIFRUeXBlLkRPVUJMRSwgJ2Fzc2lnbmVkX21lbW9uaGVhcCcsIE5vbmUsIE5vbmUsICksICMgNTI0CisgICAgKDUyNSwgVFR5cGUuRE9VQkxFLCAnYXNzaWduZWRfbWVtb2ZmaGVhcCcsIE5vbmUsIE5vbmUsICksICMgNTI1CisgICAgKDUyNiwgVFR5cGUuRE9VQkxFLCAnYXNzaWduZWRfY3B1JywgTm9uZSwgTm9uZSwgKSwgIyA1MjYKKyAgKQorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBpZD1Ob25lLCBuYW1lPU5vbmUsIHVwdGltZV9zZWNzPU5vbmUsIHN0YXR1cz1Ob25lLCBudW1fdGFza3M9Tm9uZSwgbnVtX3dvcmtlcnM9Tm9uZSwgbnVtX2V4ZWN1dG9ycz1Ob25lLCB0b3BvbG9neV9jb25mPU5vbmUsIGlkX3RvX3Nwb3V0X2FnZ19zdGF0cz1Ob25lLCBpZF90b19ib2x0X2FnZ19zdGF0cz1Ob25lLCBzY2hlZF9zdGF0dXM9Tm9uZSwgdG9wb2xvZ3lfc3RhdHM9Tm9uZSwgb3duZXI9Tm9uZSwgZGVidWdfb3B0aW9ucz1Ob25lLCByZXBsaWNhdGlvbl9jb3VudD1Ob25lLCByZXF1ZXN0ZWRfbWVtb25oZWFwPU5vbmUsIHJlcXVlc3RlZF9tZW1vZmZoZWFwPU5vbmUsIHJlcXVlc3RlZF9jcHU9Tm9uZSwgYXNzaWduZWRfbWVtb25oZWFwPU5vbmUsIGFzc2lnbmVkX21lbW9mZmhlYXA9Tm9uZSwgYXNzaWduZWRfY3B1PU5vbmUsKToKKyAgICBzZWxmLmlkID0gaWQKKyAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgc2VsZi51cHRpbWVfc2VjcyA9IHVwdGltZV9zZWNzCisgICAgc2VsZi5zdGF0dXMgPSBzdGF0dXMKKyAgICBzZWxmLm51bV90YXNrcyA9IG51bV90YXNrcworICAgIHNlbGYubnVtX3dvcmtlcnMgPSBudW1fd29ya2VycworICAgIHNlbGYubnVtX2V4ZWN1dG9ycyA9IG51bV9leGVjdXRvcnMKKyAgICBzZWxmLnRvcG9sb2d5X2NvbmYgPSB0b3BvbG9neV9jb25mCisgICAgc2VsZi5pZF90b19zcG91dF9hZ2dfc3RhdHMgPSBpZF90b19zcG91dF9hZ2dfc3RhdHMKKyAgICBzZWxmLmlkX3RvX2JvbHRfYWdnX3N0YXRzID0gaWRfdG9fYm9sdF9hZ2dfc3RhdHMKKyAgICBzZWxmLnNjaGVkX3N0YXR1cyA9IHNjaGVkX3N0YXR1cworICAgIHNlbGYudG9wb2xvZ3lfc3RhdHMgPSB0b3BvbG9neV9zdGF0cworICAgIHNlbGYub3duZXIgPSBvd25lcgorICAgIHNlbGYuZGVidWdfb3B0aW9ucyA9IGRlYnVnX29wdGlvbnMKKyAgICBzZWxmLnJlcGxpY2F0aW9uX2NvdW50ID0gcmVwbGljYXRpb25fY291bnQKKyAgICBzZWxmLnJlcXVlc3RlZF9tZW1vbmhlYXAgPSByZXF1ZXN0ZWRfbWVtb25oZWFwCisgICAgc2VsZi5yZXF1ZXN0ZWRfbWVtb2ZmaGVhcCA9IHJlcXVlc3RlZF9tZW1vZmZoZWFwCisgICAgc2VsZi5yZXF1ZXN0ZWRfY3B1ID0gcmVxdWVzdGVkX2NwdQorICAgIHNlbGYuYXNzaWduZWRfbWVtb25oZWFwID0gYXNzaWduZWRfbWVtb25oZWFwCisgICAgc2VsZi5hc3NpZ25lZF9tZW1vZmZoZWFwID0gYXNzaWduZWRfbWVtb2ZmaGVhcAorICAgIHNlbGYuYXNzaWduZWRfY3B1ID0gYXNzaWduZWRfY3B1CisKKyAgZGVmIHJlYWQoc2VsZiwgaXByb3QpOgorICAgIGlmIGlwcm90Ll9fY2xhc3NfXyA9PSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgYW5kIGlzaW5zdGFuY2UoaXByb3QudHJhbnMsIFRUcmFuc3BvcnQuQ1JlYWRhYmxlVHJhbnNwb3J0KSBhbmQgc2VsZi50aHJpZnRfc3BlYyBpcyBub3QgTm9uZSBhbmQgZmFzdGJpbmFyeSBpcyBub3QgTm9uZToKKyAgICAgIGZhc3RiaW5hcnkuZGVjb2RlX2JpbmFyeShzZWxmLCBpcHJvdC50cmFucywgKHNlbGYuX19jbGFzc19fLCBzZWxmLnRocmlmdF9zcGVjKSkKKyAgICAgIHJldHVybgorICAgIGlwcm90LnJlYWRTdHJ1Y3RCZWdpbigpCisgICAgd2hpbGUgVHJ1ZToKKyAgICAgIChmbmFtZSwgZnR5cGUsIGZpZCkgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpCisgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5TVE9QOgorICAgICAgICBicmVhaworICAgICAgaWYgZmlkID09IDE6CisgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLlNUUklORzoKKyAgICAgICAgICBzZWxmLmlkID0gaXByb3QucmVhZFN0cmluZygpLmRlY29kZSgndXRmLTgnKQorICAgICAgICBlbHNlOgorICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBlbGlmIGZpZCA9PSAyOgorICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5TVFJJTkc6CisgICAgICAgICAgc2VsZi5uYW1lID0gaXByb3QucmVhZFN0cmluZygpLmRlY29kZSgndXRmLTgnKQorICAgICAgICBlbHNlOgorICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBlbGlmIGZpZCA9PSAzOgorICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5JMzI6CisgICAgICAgICAgc2VsZi51cHRpbWVfc2VjcyA9IGlwcm90LnJlYWRJMzIoKQorICAgICAgICBlbHNlOgorICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBlbGlmIGZpZCA9PSA0OgorICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5TVFJJTkc6CisgICAgICAgICAgc2VsZi5zdGF0dXMgPSBpcHJvdC5yZWFkU3RyaW5nKCkuZGVjb2RlKCd1dGYtOCcpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgIGVsaWYgZmlkID09IDU6CisgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLkkzMjoKKyAgICAgICAgICBzZWxmLm51bV90YXNrcyA9IGlwcm90LnJlYWRJMzIoKQorICAgICAgICBlbHNlOgorICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBlbGlmIGZpZCA9PSA2OgorICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5JMzI6CisgICAgICAgICAgc2VsZi5udW1fd29ya2VycyA9IGlwcm90LnJlYWRJMzIoKQorICAgICAgICBlbHNlOgorICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBlbGlmIGZpZCA9PSA3OgorICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5JMzI6CisgICAgICAgICAgc2VsZi5udW1fZXhlY3V0b3JzID0gaXByb3QucmVhZEkzMigpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgIGVsaWYgZmlkID09IDg6CisgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLlNUUklORzoKKyAgICAgICAgICBzZWxmLnRvcG9sb2d5X2NvbmYgPSBpcHJvdC5yZWFkU3RyaW5nKCkuZGVjb2RlKCd1dGYtOCcpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgIGVsaWYgZmlkID09IDk6CisgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLk1BUDoKKyAgICAgICAgICBzZWxmLmlkX3RvX3Nwb3V0X2FnZ19zdGF0cyA9IHt9CisgICAgICAgICAgKF9rdHlwZTM2MSwgX3Z0eXBlMzYyLCBfc2l6ZTM2MCApID0gaXByb3QucmVhZE1hcEJlZ2luKCkKKyAgICAgICAgICBmb3IgX2kzNjQgaW4geHJhbmdlKF9zaXplMzYwKToKKyAgICAgICAgICAgIF9rZXkzNjUgPSBpcHJvdC5yZWFkU3RyaW5nKCkuZGVjb2RlKCd1dGYtOCcpCisgICAgICAgICAgICBfdmFsMzY2ID0gQ29tcG9uZW50QWdncmVnYXRlU3RhdHMoKQorICAgICAgICAgICAgX3ZhbDM2Ni5yZWFkKGlwcm90KQorICAgICAgICAgICAgc2VsZi5pZF90b19zcG91dF9hZ2dfc3RhdHNbX2tleTM2NV0gPSBfdmFsMzY2CisgICAgICAgICAgaXByb3QucmVhZE1hcEVuZCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgIGVsaWYgZmlkID09IDEwOgorICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5NQVA6CisgICAgICAgICAgc2VsZi5pZF90b19ib2x0X2FnZ19zdGF0cyA9IHt9CisgICAgICAgICAgKF9rdHlwZTM2OCwgX3Z0eXBlMzY5LCBfc2l6ZTM2NyApID0gaXByb3QucmVhZE1hcEJlZ2luKCkKKyAgICAgICAgICBmb3IgX2kzNzEgaW4geHJhbmdlKF9zaXplMzY3KToKKyAgICAgICAgICAgIF9rZXkzNzIgPSBpcHJvdC5yZWFkU3RyaW5nKCkuZGVjb2RlKCd1dGYtOCcpCisgICAgICAgICAgICBfdmFsMzczID0gQ29tcG9uZW50QWdncmVnYXRlU3RhdHMoKQorICAgICAgICAgICAgX3ZhbDM3My5yZWFkKGlwcm90KQorICAgICAgICAgICAgc2VsZi5pZF90b19ib2x0X2FnZ19zdGF0c1tfa2V5MzcyXSA9IF92YWwzNzMKKyAgICAgICAgICBpcHJvdC5yZWFkTWFwRW5kKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgZWxpZiBmaWQgPT0gMTE6CisgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLlNUUklORzoKKyAgICAgICAgICBzZWxmLnNjaGVkX3N0YXR1cyA9IGlwcm90LnJlYWRTdHJpbmcoKS5kZWNvZGUoJ3V0Zi04JykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgZWxpZiBmaWQgPT0gMTI6CisgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLlNUUlVDVDoKKyAgICAgICAgICBzZWxmLnRvcG9sb2d5X3N0YXRzID0gVG9wb2xvZ3lTdGF0cygpCisgICAgICAgICAgc2VsZi50b3BvbG9neV9zdGF0cy5yZWFkKGlwcm90KQorICAgICAgICBlbHNlOgorICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBlbGlmIGZpZCA9PSAxMzoKKyAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuU1RSSU5HOgorICAgICAgICAgIHNlbGYub3duZXIgPSBpcHJvdC5yZWFkU3RyaW5nKCkuZGVjb2RlKCd1dGYtOCcpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgIGVsaWYgZmlkID09IDE0OgorICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5TVFJVQ1Q6CisgICAgICAgICAgc2VsZi5kZWJ1Z19vcHRpb25zID0gRGVidWdPcHRpb25zKCkKKyAgICAgICAgICBzZWxmLmRlYnVnX29wdGlvbnMucmVhZChpcHJvdCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgZWxpZiBmaWQgPT0gMTU6CisgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLkkzMjoKKyAgICAgICAgICBzZWxmLnJlcGxpY2F0aW9uX2NvdW50ID0gaXByb3QucmVhZEkzMigpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgIGVsaWYgZmlkID09IDUyMToKKyAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuRE9VQkxFOgorICAgICAgICAgIHNlbGYucmVxdWVzdGVkX21lbW9uaGVhcCA9IGlwcm90LnJlYWREb3VibGUoKQorICAgICAgICBlbHNlOgorICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBlbGlmIGZpZCA9PSA1MjI6CisgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLkRPVUJMRToKKyAgICAgICAgICBzZWxmLnJlcXVlc3RlZF9tZW1vZmZoZWFwID0gaXByb3QucmVhZERvdWJsZSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgIGVsaWYgZmlkID09IDUyMzoKKyAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuRE9VQkxFOgorICAgICAgICAgIHNlbGYucmVxdWVzdGVkX2NwdSA9IGlwcm90LnJlYWREb3VibGUoKQorICAgICAgICBlbHNlOgorICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBlbGlmIGZpZCA9PSA1MjQ6CisgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLkRPVUJMRToKKyAgICAgICAgICBzZWxmLmFzc2lnbmVkX21lbW9uaGVhcCA9IGlwcm90LnJlYWREb3VibGUoKQorICAgICAgICBlbHNlOgorICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBlbGlmIGZpZCA9PSA1MjU6CisgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLkRPVUJMRToKKyAgICAgICAgICBzZWxmLmFzc2lnbmVkX21lbW9mZmhlYXAgPSBpcHJvdC5yZWFkRG91YmxlKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgZWxpZiBmaWQgPT0gNTI2OgorICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5ET1VCTEU6CisgICAgICAgICAgc2VsZi5hc3NpZ25lZF9jcHUgPSBpcHJvdC5yZWFkRG91YmxlKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgZWxzZToKKyAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgIGlwcm90LnJlYWRGaWVsZEVuZCgpCisgICAgaXByb3QucmVhZFN0cnVjdEVuZCgpCisKKyAgZGVmIHdyaXRlKHNlbGYsIG9wcm90KToKKyAgICBpZiBvcHJvdC5fX2NsYXNzX18gPT0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIGFuZCBzZWxmLnRocmlmdF9zcGVjIGlzIG5vdCBOb25lIGFuZCBmYXN0YmluYXJ5IGlzIG5vdCBOb25lOgorICAgICAgb3Byb3QudHJhbnMud3JpdGUoZmFzdGJpbmFyeS5lbmNvZGVfYmluYXJ5KHNlbGYsIChzZWxmLl9fY2xhc3NfXywgc2VsZi50aHJpZnRfc3BlYykpKQorICAgICAgcmV0dXJuCisgICAgb3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbignVG9wb2xvZ3lQYWdlSW5mbycpCisgICAgaWYgc2VsZi5pZCBpcyBub3QgTm9uZToKKyAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbignaWQnLCBUVHlwZS5TVFJJTkcsIDEpCisgICAgICBvcHJvdC53cml0ZVN0cmluZyhzZWxmLmlkLmVuY29kZSgndXRmLTgnKSkKKyAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKQorICAgIGlmIHNlbGYubmFtZSBpcyBub3QgTm9uZToKKyAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbignbmFtZScsIFRUeXBlLlNUUklORywgMikKKyAgICAgIG9wcm90LndyaXRlU3RyaW5nKHNlbGYubmFtZS5lbmNvZGUoJ3V0Zi04JykpCisgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKKyAgICBpZiBzZWxmLnVwdGltZV9zZWNzIGlzIG5vdCBOb25lOgorICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCd1cHRpbWVfc2VjcycsIFRUeXBlLkkzMiwgMykKKyAgICAgIG9wcm90LndyaXRlSTMyKHNlbGYudXB0aW1lX3NlY3MpCisgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKKyAgICBpZiBzZWxmLnN0YXR1cyBpcyBub3QgTm9uZToKKyAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbignc3RhdHVzJywgVFR5cGUuU1RSSU5HLCA0KQorICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoc2VsZi5zdGF0dXMuZW5jb2RlKCd1dGYtOCcpKQorICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCisgICAgaWYgc2VsZi5udW1fdGFza3MgaXMgbm90IE5vbmU6CisgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ251bV90YXNrcycsIFRUeXBlLkkzMiwgNSkKKyAgICAgIG9wcm90LndyaXRlSTMyKHNlbGYubnVtX3Rhc2tzKQorICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCisgICAgaWYgc2VsZi5udW1fd29ya2VycyBpcyBub3QgTm9uZToKKyAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbignbnVtX3dvcmtlcnMnLCBUVHlwZS5JMzIsIDYpCisgICAgICBvcHJvdC53cml0ZUkzMihzZWxmLm51bV93b3JrZXJzKQorICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCisgICAgaWYgc2VsZi5udW1fZXhlY3V0b3JzIGlzIG5vdCBOb25lOgorICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCdudW1fZXhlY3V0b3JzJywgVFR5cGUuSTMyLCA3KQorICAgICAgb3Byb3Qud3JpdGVJMzIoc2VsZi5udW1fZXhlY3V0b3JzKQorICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCisgICAgaWYgc2VsZi50b3BvbG9neV9jb25mIGlzIG5vdCBOb25lOgorICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCd0b3BvbG9neV9jb25mJywgVFR5cGUuU1RSSU5HLCA4KQorICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoc2VsZi50b3BvbG9neV9jb25mLmVuY29kZSgndXRmLTgnKSkKKyAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKQorICAgIGlmIHNlbGYuaWRfdG9fc3BvdXRfYWdnX3N0YXRzIGlzIG5vdCBOb25lOgorICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCdpZF90b19zcG91dF9hZ2dfc3RhdHMnLCBUVHlwZS5NQVAsIDkpCisgICAgICBvcHJvdC53cml0ZU1hcEJlZ2luKFRUeXBlLlNUUklORywgVFR5cGUuU1RSVUNULCBsZW4oc2VsZi5pZF90b19zcG91dF9hZ2dfc3RhdHMpKQorICAgICAgZm9yIGtpdGVyMzc0LHZpdGVyMzc1IGluIHNlbGYuaWRfdG9fc3BvdXRfYWdnX3N0YXRzLml0ZW1zKCk6CisgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKGtpdGVyMzc0LmVuY29kZSgndXRmLTgnKSkKKyAgICAgICAgdml0ZXIzNzUud3JpdGUob3Byb3QpCisgICAgICBvcHJvdC53cml0ZU1hcEVuZCgpCisgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKKyAgICBpZiBzZWxmLmlkX3RvX2JvbHRfYWdnX3N0YXRzIGlzIG5vdCBOb25lOgorICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCdpZF90b19ib2x0X2FnZ19zdGF0cycsIFRUeXBlLk1BUCwgMTApCisgICAgICBvcHJvdC53cml0ZU1hcEJlZ2luKFRUeXBlLlNUUklORywgVFR5cGUuU1RSVUNULCBsZW4oc2VsZi5pZF90b19ib2x0X2FnZ19zdGF0cykpCisgICAgICBmb3Iga2l0ZXIzNzYsdml0ZXIzNzcgaW4gc2VsZi5pZF90b19ib2x0X2FnZ19zdGF0cy5pdGVtcygpOgorICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhraXRlcjM3Ni5lbmNvZGUoJ3V0Zi04JykpCisgICAgICAgIHZpdGVyMzc3LndyaXRlKG9wcm90KQorICAgICAgb3Byb3Qud3JpdGVNYXBFbmQoKQorICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCisgICAgaWYgc2VsZi5zY2hlZF9zdGF0dXMgaXMgbm90IE5vbmU6CisgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ3NjaGVkX3N0YXR1cycsIFRUeXBlLlNUUklORywgMTEpCisgICAgICBvcHJvdC53cml0ZVN0cmluZyhzZWxmLnNjaGVkX3N0YXR1cy5lbmNvZGUoJ3V0Zi04JykpCisgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKKyAgICBpZiBzZWxmLnRvcG9sb2d5X3N0YXRzIGlzIG5vdCBOb25lOgorICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCd0b3BvbG9neV9zdGF0cycsIFRUeXBlLlNUUlVDVCwgMTIpCisgICAgICBzZWxmLnRvcG9sb2d5X3N0YXRzLndyaXRlKG9wcm90KQorICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCisgICAgaWYgc2VsZi5vd25lciBpcyBub3QgTm9uZToKKyAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbignb3duZXInLCBUVHlwZS5TVFJJTkcsIDEzKQorICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoc2VsZi5vd25lci5lbmNvZGUoJ3V0Zi04JykpCisgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKKyAgICBpZiBzZWxmLmRlYnVnX29wdGlvbnMgaXMgbm90IE5vbmU6CisgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ2RlYnVnX29wdGlvbnMnLCBUVHlwZS5TVFJVQ1QsIDE0KQorICAgICAgc2VsZi5kZWJ1Z19vcHRpb25zLndyaXRlKG9wcm90KQorICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCisgICAgaWYgc2VsZi5yZXBsaWNhdGlvbl9jb3VudCBpcyBub3QgTm9uZToKKyAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbigncmVwbGljYXRpb25fY291bnQnLCBUVHlwZS5JMzIsIDE1KQorICAgICAgb3Byb3Qud3JpdGVJMzIoc2VsZi5yZXBsaWNhdGlvbl9jb3VudCkKKyAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKQorICAgIGlmIHNlbGYucmVxdWVzdGVkX21lbW9uaGVhcCBpcyBub3QgTm9uZToKKyAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbigncmVxdWVzdGVkX21lbW9uaGVhcCcsIFRUeXBlLkRPVUJMRSwgNTIxKQorICAgICAgb3Byb3Qud3JpdGVEb3VibGUoc2VsZi5yZXF1ZXN0ZWRfbWVtb25oZWFwKQorICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCisgICAgaWYgc2VsZi5yZXF1ZXN0ZWRfbWVtb2ZmaGVhcCBpcyBub3QgTm9uZToKKyAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbigncmVxdWVzdGVkX21lbW9mZmhlYXAnLCBUVHlwZS5ET1VCTEUsIDUyMikKKyAgICAgIG9wcm90LndyaXRlRG91YmxlKHNlbGYucmVxdWVzdGVkX21lbW9mZmhlYXApCisgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKKyAgICBpZiBzZWxmLnJlcXVlc3RlZF9jcHUgaXMgbm90IE5vbmU6CisgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ3JlcXVlc3RlZF9jcHUnLCBUVHlwZS5ET1VCTEUsIDUyMykKKyAgICAgIG9wcm90LndyaXRlRG91YmxlKHNlbGYucmVxdWVzdGVkX2NwdSkKKyAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKQorICAgIGlmIHNlbGYuYXNzaWduZWRfbWVtb25oZWFwIGlzIG5vdCBOb25lOgorICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCdhc3NpZ25lZF9tZW1vbmhlYXAnLCBUVHlwZS5ET1VCTEUsIDUyNCkKKyAgICAgIG9wcm90LndyaXRlRG91YmxlKHNlbGYuYXNzaWduZWRfbWVtb25oZWFwKQorICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCisgICAgaWYgc2VsZi5hc3NpZ25lZF9tZW1vZmZoZWFwIGlzIG5vdCBOb25lOgorICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCdhc3NpZ25lZF9tZW1vZmZoZWFwJywgVFR5cGUuRE9VQkxFLCA1MjUpCisgICAgICBvcHJvdC53cml0ZURvdWJsZShzZWxmLmFzc2lnbmVkX21lbW9mZmhlYXApCisgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKKyAgICBpZiBzZWxmLmFzc2lnbmVkX2NwdSBpcyBub3QgTm9uZToKKyAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbignYXNzaWduZWRfY3B1JywgVFR5cGUuRE9VQkxFLCA1MjYpCisgICAgICBvcHJvdC53cml0ZURvdWJsZShzZWxmLmFzc2lnbmVkX2NwdSkKKyAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKQorICAgIG9wcm90LndyaXRlRmllbGRTdG9wKCkKKyAgICBvcHJvdC53cml0ZVN0cnVjdEVuZCgpCisKKyAgZGVmIHZhbGlkYXRlKHNlbGYpOgorICAgIGlmIHNlbGYuaWQgaXMgTm9uZToKKyAgICAgIHJhaXNlIFRQcm90b2NvbC5UUHJvdG9jb2xFeGNlcHRpb24obWVzc2FnZT0nUmVxdWlyZWQgZmllbGQgaWQgaXMgdW5zZXQhJykKKyAgICByZXR1cm4KKworCisgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICB2YWx1ZSA9IDE3CisgICAgdmFsdWUgPSAodmFsdWUgKiAzMSkgXiBoYXNoKHNlbGYuaWQpCisgICAgdmFsdWUgPSAodmFsdWUgKiAzMSkgXiBoYXNoKHNlbGYubmFtZSkKKyAgICB2YWx1ZSA9ICh2YWx1ZSAqIDMxKSBeIGhhc2goc2VsZi51cHRpbWVfc2VjcykKKyAgICB2YWx1ZSA9ICh2YWx1ZSAqIDMxKSBeIGhhc2goc2VsZi5zdGF0dXMpCisgICAgdmFsdWUgPSAodmFsdWUgKiAzMSkgXiBoYXNoKHNlbGYubnVtX3Rhc2tzKQorICAgIHZhbHVlID0gKHZhbHVlICogMzEpIF4gaGFzaChzZWxmLm51bV93b3JrZXJzKQorICAgIHZhbHVlID0gKHZhbHVlICogMzEpIF4gaGFzaChzZWxmLm51bV9leGVjdXRvcnMpCisgICAgdmFsdWUgPSAodmFsdWUgKiAzMSkgXiBoYXNoKHNlbGYudG9wb2xvZ3lfY29uZikKKyAgICB2YWx1ZSA9ICh2YWx1ZSAqIDMxKSBeIGhhc2goc2VsZi5pZF90b19zcG91dF9hZ2dfc3RhdHMpCisgICAgdmFsdWUgPSAodmFsdWUgKiAzMSkgXiBoYXNoKHNlbGYuaWRfdG9fYm9sdF9hZ2dfc3RhdHMpCisgICAgdmFsdWUgPSAodmFsdWUgKiAzMSkgXiBoYXNoKHNlbGYuc2NoZWRfc3RhdHVzKQorICAgIHZhbHVlID0gKHZhbHVlICogMzEpIF4gaGFzaChzZWxmLnRvcG9sb2d5X3N0YXRzKQorICAgIHZhbHVlID0gKHZhbHVlICogMzEpIF4gaGFzaChzZWxmLm93bmVyKQorICAgIHZhbHVlID0gKHZhbHVlICogMzEpIF4gaGFzaChzZWxmLmRlYnVnX29wdGlvbnMpCisgICAgdmFsdWUgPSAodmFsdWUgKiAzMSkgXiBoYXNoKHNlbGYucmVwbGljYXRpb25fY291bnQpCisgICAgdmFsdWUgPSAodmFsdWUgKiAzMSkgXiBoYXNoKHNlbGYucmVxdWVzdGVkX21lbW9uaGVhcCkKKyAgICB2YWx1ZSA9ICh2YWx1ZSAqIDMxKSBeIGhhc2goc2VsZi5yZXF1ZXN0ZWRfbWVtb2ZmaGVhcCkKKyAgICB2YWx1ZSA9ICh2YWx1ZSAqIDMxKSBeIGhhc2goc2VsZi5yZXF1ZXN0ZWRfY3B1KQorICAgIHZhbHVlID0gKHZhbHVlICogMzEpIF4gaGFzaChzZWxmLmFzc2lnbmVkX21lbW9uaGVhcCkKKyAgICB2YWx1ZSA9ICh2YWx1ZSAqIDMxKSBeIGhhc2goc2VsZi5hc3NpZ25lZF9tZW1vZmZoZWFwKQorICAgIHZhbHVlID0gKHZhbHVlICogMzEpIF4gaGFzaChzZWxmLmFzc2lnbmVkX2NwdSkKKyAgICByZXR1cm4gdmFsdWUKKworICBkZWYgX19yZXByX18oc2VsZik6CisgICAgTCA9IFsnJXM9JXInICUgKGtleSwgdmFsdWUpCisgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzZWxmLl9fZGljdF9fLml0ZXJpdGVtcygpXQorICAgIHJldHVybiAnJXMoJXMpJyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgJywgJy5qb2luKEwpKQorCisgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgIHJldHVybiBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXykgYW5kIHNlbGYuX19kaWN0X18gPT0gb3RoZXIuX19kaWN0X18KKworICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKKyAgICByZXR1cm4gbm90IChzZWxmID09IG90aGVyKQorCitjbGFzcyBFeGVjdXRvckFnZ3JlZ2F0ZVN0YXRzOgorICAiIiIKKyAgQXR0cmlidXRlczoKKyAgIC0gZXhlY19zdW1tYXJ5CisgICAtIHN0YXRzCisgICIiIgorCisgIHRocmlmdF9zcGVjID0gKAorICAgIE5vbmUsICMgMAorICAgICgxLCBUVHlwZS5TVFJVQ1QsICdleGVjX3N1bW1hcnknLCAoRXhlY3V0b3JTdW1tYXJ5LCBFeGVjdXRvclN1bW1hcnkudGhyaWZ0X3NwZWMpLCBOb25lLCApLCAjIDEKKyAgICAoMiwgVFR5cGUuU1RSVUNULCAnc3RhdHMnLCAoQ29tcG9uZW50QWdncmVnYXRlU3RhdHMsIENvbXBvbmVudEFnZ3JlZ2F0ZVN0YXRzLnRocmlmdF9zcGVjKSwgTm9uZSwgKSwgIyAyCisgICkKKworICBkZWYgX19pbml0X18oc2VsZiwgZXhlY19zdW1tYXJ5PU5vbmUsIHN0YXRzPU5vbmUsKToKKyAgICBzZWxmLmV4ZWNfc3VtbWFyeSA9IGV4ZWNfc3VtbWFyeQorICAgIHNlbGYuc3RhdHMgPSBzdGF0cworCisgIGRlZiByZWFkKHNlbGYsIGlwcm90KToKKyAgICBpZiBpcHJvdC5fX2NsYXNzX18gPT0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIGFuZCBpc2luc3RhbmNlKGlwcm90LnRyYW5zLCBUVHJhbnNwb3J0LkNSZWFkYWJsZVRyYW5zcG9ydCkgYW5kIHNlbGYudGhyaWZ0X3NwZWMgaXMgbm90IE5vbmUgYW5kIGZhc3RiaW5hcnkgaXMgbm90IE5vbmU6CisgICAgICBmYXN0YmluYXJ5LmRlY29kZV9iaW5hcnkoc2VsZiwgaXByb3QudHJhbnMsIChzZWxmLl9fY2xhc3NfXywgc2VsZi50aHJpZnRfc3BlYykpCisgICAgICByZXR1cm4KKyAgICBpcHJvdC5yZWFkU3RydWN0QmVnaW4oKQorICAgIHdoaWxlIFRydWU6CisgICAgICAoZm5hbWUsIGZ0eXBlLCBmaWQpID0gaXByb3QucmVhZEZpZWxkQmVnaW4oKQorICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuU1RPUDoKKyAgICAgICAgYnJlYWsKKyAgICAgIGlmIGZpZCA9PSAxOgorICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5TVFJVQ1Q6CisgICAgICAgICAgc2VsZi5leGVjX3N1bW1hcnkgPSBFeGVjdXRvclN1bW1hcnkoKQorICAgICAgICAgIHNlbGYuZXhlY19zdW1tYXJ5LnJlYWQoaXByb3QpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgIGVsaWYgZmlkID09IDI6CisgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLlNUUlVDVDoKKyAgICAgICAgICBzZWxmLnN0YXRzID0gQ29tcG9uZW50QWdncmVnYXRlU3RhdHMoKQorICAgICAgICAgIHNlbGYuc3RhdHMucmVhZChpcHJvdCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgZWxzZToKKyAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgIGlwcm90LnJlYWRGaWVsZEVuZCgpCisgICAgaXByb3QucmVhZFN0cnVjdEVuZCgpCisKKyAgZGVmIHdyaXRlKHNlbGYsIG9wcm90KToKKyAgICBpZiBvcHJvdC5fX2NsYXNzX18gPT0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIGFuZCBzZWxmLnRocmlmdF9zcGVjIGlzIG5vdCBOb25lIGFuZCBmYXN0YmluYXJ5IGlzIG5vdCBOb25lOgorICAgICAgb3Byb3QudHJhbnMud3JpdGUoZmFzdGJpbmFyeS5lbmNvZGVfYmluYXJ5KHNlbGYsIChzZWxmLl9fY2xhc3NfXywgc2VsZi50aHJpZnRfc3BlYykpKQorICAgICAgcmV0dXJuCisgICAgb3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbignRXhlY3V0b3JBZ2dyZWdhdGVTdGF0cycpCisgICAgaWYgc2VsZi5leGVjX3N1bW1hcnkgaXMgbm90IE5vbmU6CisgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ2V4ZWNfc3VtbWFyeScsIFRUeXBlLlNUUlVDVCwgMSkKKyAgICAgIHNlbGYuZXhlY19zdW1tYXJ5LndyaXRlKG9wcm90KQorICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCisgICAgaWYgc2VsZi5zdGF0cyBpcyBub3QgTm9uZToKKyAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbignc3RhdHMnLCBUVHlwZS5TVFJVQ1QsIDIpCisgICAgICBzZWxmLnN0YXRzLndyaXRlKG9wcm90KQorICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCisgICAgb3Byb3Qud3JpdGVGaWVsZFN0b3AoKQorICAgIG9wcm90LndyaXRlU3RydWN0RW5kKCkKKworICBkZWYgdmFsaWRhdGUoc2VsZik6CisgICAgcmV0dXJuCisKKworICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgdmFsdWUgPSAxNworICAgIHZhbHVlID0gKHZhbHVlICogMzEpIF4gaGFzaChzZWxmLmV4ZWNfc3VtbWFyeSkKKyAgICB2YWx1ZSA9ICh2YWx1ZSAqIDMxKSBeIGhhc2goc2VsZi5zdGF0cykKKyAgICByZXR1cm4gdmFsdWUKKworICBkZWYgX19yZXByX18oc2VsZik6CisgICAgTCA9IFsnJXM9JXInICUgKGtleSwgdmFsdWUpCisgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzZWxmLl9fZGljdF9fLml0ZXJpdGVtcygpXQorICAgIHJldHVybiAnJXMoJXMpJyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgJywgJy5qb2luKEwpKQorCisgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgIHJldHVybiBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXykgYW5kIHNlbGYuX19kaWN0X18gPT0gb3RoZXIuX19kaWN0X18KKworICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKKyAgICByZXR1cm4gbm90IChzZWxmID09IG90aGVyKQorCitjbGFzcyBDb21wb25lbnRQYWdlSW5mbzoKKyAgIiIiCisgIEF0dHJpYnV0ZXM6CisgICAtIGNvbXBvbmVudF9pZAorICAgLSBjb21wb25lbnRfdHlwZQorICAgLSB0b3BvbG9neV9pZAorICAgLSB0b3BvbG9neV9uYW1lCisgICAtIG51bV9leGVjdXRvcnMKKyAgIC0gbnVtX3Rhc2tzCisgICAtIHdpbmRvd190b19zdGF0cworICAgLSBnc2lkX3RvX2lucHV0X3N0YXRzCisgICAtIHNpZF90b19vdXRwdXRfc3RhdHMKKyAgIC0gZXhlY19zdGF0cworICAgLSBlcnJvcnMKKyAgIC0gZXZlbnRsb2dfaG9zdAorICAgLSBldmVudGxvZ19wb3J0CisgICAtIGRlYnVnX29wdGlvbnMKKyAgIC0gdG9wb2xvZ3lfc3RhdHVzCisgICIiIgorCisgIHRocmlmdF9zcGVjID0gKAorICAgIE5vbmUsICMgMAorICAgICgxLCBUVHlwZS5TVFJJTkcsICdjb21wb25lbnRfaWQnLCBOb25lLCBOb25lLCApLCAjIDEKKyAgICAoMiwgVFR5cGUuSTMyLCAnY29tcG9uZW50X3R5cGUnLCBOb25lLCBOb25lLCApLCAjIDIKKyAgICAoMywgVFR5cGUuU1RSSU5HLCAndG9wb2xvZ3lfaWQnLCBOb25lLCBOb25lLCApLCAjIDMKKyAgICAoNCwgVFR5cGUuU1RSSU5HLCAndG9wb2xvZ3lfbmFtZScsIE5vbmUsIE5vbmUsICksICMgNAorICAgICg1LCBUVHlwZS5JMzIsICdudW1fZXhlY3V0b3JzJywgTm9uZSwgTm9uZSwgKSwgIyA1CisgICAgKDYsIFRUeXBlLkkzMiwgJ251bV90YXNrcycsIE5vbmUsIE5vbmUsICksICMgNgorICAgICg3LCBUVHlwZS5NQVAsICd3aW5kb3dfdG9fc3RhdHMnLCAoVFR5cGUuU1RSSU5HLE5vbmUsVFR5cGUuU1RSVUNULChDb21wb25lbnRBZ2dyZWdhdGVTdGF0cywgQ29tcG9uZW50QWdncmVnYXRlU3RhdHMudGhyaWZ0X3NwZWMpKSwgTm9uZSwgKSwgIyA3CisgICAgKDgsIFRUeXBlLk1BUCwgJ2dzaWRfdG9faW5wdXRfc3RhdHMnLCAoVFR5cGUuU1RSVUNULChHbG9iYWxTdHJlYW1JZCwgR2xvYmFsU3RyZWFtSWQudGhyaWZ0X3NwZWMpLFRUeXBlLlNUUlVDVCwoQ29tcG9uZW50QWdncmVnYXRlU3RhdHMsIENvbXBvbmVudEFnZ3JlZ2F0ZVN0YXRzLnRocmlmdF9zcGVjKSksIE5vbmUsICksICMgOAorICAgICg5LCBUVHlwZS5NQVAsICdzaWRfdG9fb3V0cHV0X3N0YXRzJywgKFRUeXBlLlNUUklORyxOb25lLFRUeXBlLlNUUlVDVCwoQ29tcG9uZW50QWdncmVnYXRlU3RhdHMsIENvbXBvbmVudEFnZ3JlZ2F0ZVN0YXRzLnRocmlmdF9zcGVjKSksIE5vbmUsICksICMgOQorICAgICgxMCwgVFR5cGUuTElTVCwgJ2V4ZWNfc3RhdHMnLCAoVFR5cGUuU1RSVUNULChFeGVjdXRvckFnZ3JlZ2F0ZVN0YXRzLCBFeGVjdXRvckFnZ3JlZ2F0ZVN0YXRzLnRocmlmdF9zcGVjKSksIE5vbmUsICksICMgMTAKKyAgICAoMTEsIFRUeXBlLkxJU1QsICdlcnJvcnMnLCAoVFR5cGUuU1RSVUNULChFcnJvckluZm8sIEVycm9ySW5mby50aHJpZnRfc3BlYykpLCBOb25lLCApLCAjIDExCisgICAgKDEyLCBUVHlwZS5TVFJJTkcsICdldmVudGxvZ19ob3N0JywgTm9uZSwgTm9uZSwgKSwgIyAxMgorICAgICgxMywgVFR5cGUuSTMyLCAnZXZlbnRsb2dfcG9ydCcsIE5vbmUsIE5vbmUsICksICMgMTMKKyAgICAoMTQsIFRUeXBlLlNUUlVDVCwgJ2RlYnVnX29wdGlvbnMnLCAoRGVidWdPcHRpb25zLCBEZWJ1Z09wdGlvbnMudGhyaWZ0X3NwZWMpLCBOb25lLCApLCAjIDE0CisgICAgKDE1LCBUVHlwZS5TVFJJTkcsICd0b3BvbG9neV9zdGF0dXMnLCBOb25lLCBOb25lLCApLCAjIDE1CisgICkKKworICBkZWYgX19pbml0X18oc2VsZiwgY29tcG9uZW50X2lkPU5vbmUsIGNvbXBvbmVudF90eXBlPU5vbmUsIHRvcG9sb2d5X2lkPU5vbmUsIHRvcG9sb2d5X25hbWU9Tm9uZSwgbnVtX2V4ZWN1dG9ycz1Ob25lLCBudW1fdGFza3M9Tm9uZSwgd2luZG93X3RvX3N0YXRzPU5vbmUsIGdzaWRfdG9faW5wdXRfc3RhdHM9Tm9uZSwgc2lkX3RvX291dHB1dF9zdGF0cz1Ob25lLCBleGVjX3N0YXRzPU5vbmUsIGVycm9ycz1Ob25lLCBldmVudGxvZ19ob3N0PU5vbmUsIGV2ZW50bG9nX3BvcnQ9Tm9uZSwgZGVidWdfb3B0aW9ucz1Ob25lLCB0b3BvbG9neV9zdGF0dXM9Tm9uZSwpOgorICAgIHNlbGYuY29tcG9uZW50X2lkID0gY29tcG9uZW50X2lkCisgICAgc2VsZi5jb21wb25lbnRfdHlwZSA9IGNvbXBvbmVudF90eXBlCisgICAgc2VsZi50b3BvbG9neV9pZCA9IHRvcG9sb2d5X2lkCisgICAgc2VsZi50b3BvbG9neV9uYW1lID0gdG9wb2xvZ3lfbmFtZQorICAgIHNlbGYubnVtX2V4ZWN1dG9ycyA9IG51bV9leGVjdXRvcnMKKyAgICBzZWxmLm51bV90YXNrcyA9IG51bV90YXNrcworICAgIHNlbGYud2luZG93X3RvX3N0YXRzID0gd2luZG93X3RvX3N0YXRzCisgICAgc2VsZi5nc2lkX3RvX2lucHV0X3N0YXRzID0gZ3NpZF90b19pbnB1dF9zdGF0cworICAgIHNlbGYuc2lkX3RvX291dHB1dF9zdGF0cyA9IHNpZF90b19vdXRwdXRfc3RhdHMKKyAgICBzZWxmLmV4ZWNfc3RhdHMgPSBleGVjX3N0YXRzCisgICAgc2VsZi5lcnJvcnMgPSBlcnJvcnMKKyAgICBzZWxmLmV2ZW50bG9nX2hvc3QgPSBldmVudGxvZ19ob3N0CisgICAgc2VsZi5ldmVudGxvZ19wb3J0ID0gZXZlbnRsb2dfcG9ydAorICAgIHNlbGYuZGVidWdfb3B0aW9ucyA9IGRlYnVnX29wdGlvbnMKKyAgICBzZWxmLnRvcG9sb2d5X3N0YXR1cyA9IHRvcG9sb2d5X3N0YXR1cworCisgIGRlZiByZWFkKHNlbGYsIGlwcm90KToKKyAgICBpZiBpcHJvdC5fX2NsYXNzX18gPT0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIGFuZCBpc2luc3RhbmNlKGlwcm90LnRyYW5zLCBUVHJhbnNwb3J0LkNSZWFkYWJsZVRyYW5zcG9ydCkgYW5kIHNlbGYudGhyaWZ0X3NwZWMgaXMgbm90IE5vbmUgYW5kIGZhc3RiaW5hcnkgaXMgbm90IE5vbmU6CisgICAgICBmYXN0YmluYXJ5LmRlY29kZV9iaW5hcnkoc2VsZiwgaXByb3QudHJhbnMsIChzZWxmLl9fY2xhc3NfXywgc2VsZi50aHJpZnRfc3BlYykpCisgICAgICByZXR1cm4KKyAgICBpcHJvdC5yZWFkU3RydWN0QmVnaW4oKQorICAgIHdoaWxlIFRydWU6CisgICAgICAoZm5hbWUsIGZ0eXBlLCBmaWQpID0gaXByb3QucmVhZEZpZWxkQmVnaW4oKQorICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuU1RPUDoKKyAgICAgICAgYnJlYWsKKyAgICAgIGlmIGZpZCA9PSAxOgorICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5TVFJJTkc6CisgICAgICAgICAgc2VsZi5jb21wb25lbnRfaWQgPSBpcHJvdC5yZWFkU3RyaW5nKCkuZGVjb2RlKCd1dGYtOCcpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgIGVsaWYgZmlkID09IDI6CisgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLkkzMjoKKyAgICAgICAgICBzZWxmLmNvbXBvbmVudF90eXBlID0gaXByb3QucmVhZEkzMigpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgIGVsaWYgZmlkID09IDM6CisgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLlNUUklORzoKKyAgICAgICAgICBzZWxmLnRvcG9sb2d5X2lkID0gaXByb3QucmVhZFN0cmluZygpLmRlY29kZSgndXRmLTgnKQorICAgICAgICBlbHNlOgorICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBlbGlmIGZpZCA9PSA0OgorICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5TVFJJTkc6CisgICAgICAgICAgc2VsZi50b3BvbG9neV9uYW1lID0gaXByb3QucmVhZFN0cmluZygpLmRlY29kZSgndXRmLTgnKQorICAgICAgICBlbHNlOgorICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBlbGlmIGZpZCA9PSA1OgorICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5JMzI6CisgICAgICAgICAgc2VsZi5udW1fZXhlY3V0b3JzID0gaXByb3QucmVhZEkzMigpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgIGVsaWYgZmlkID09IDY6CisgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLkkzMjoKKyAgICAgICAgICBzZWxmLm51bV90YXNrcyA9IGlwcm90LnJlYWRJMzIoKQorICAgICAgICBlbHNlOgorICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBlbGlmIGZpZCA9PSA3OgorICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5NQVA6CisgICAgICAgICAgc2VsZi53aW5kb3dfdG9fc3RhdHMgPSB7fQorICAgICAgICAgIChfa3R5cGUzNzksIF92dHlwZTM4MCwgX3NpemUzNzggKSA9IGlwcm90LnJlYWRNYXBCZWdpbigpCisgICAgICAgICAgZm9yIF9pMzgyIGluIHhyYW5nZShfc2l6ZTM3OCk6CisgICAgICAgICAgICBfa2V5MzgzID0gaXByb3QucmVhZFN0cmluZygpLmRlY29kZSgndXRmLTgnKQorICAgICAgICAgICAgX3ZhbDM4NCA9IENvbXBvbmVudEFnZ3JlZ2F0ZVN0YXRzKCkKKyAgICAgICAgICAgIF92YWwzODQucmVhZChpcHJvdCkKKyAgICAgICAgICAgIHNlbGYud2luZG93X3RvX3N0YXRzW19rZXkzODNdID0gX3ZhbDM4NAorICAgICAgICAgIGlwcm90LnJlYWRNYXBFbmQoKQorICAgICAgICBlbHNlOgorICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBlbGlmIGZpZCA9PSA4OgorICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5NQVA6CisgICAgICAgICAgc2VsZi5nc2lkX3RvX2lucHV0X3N0YXRzID0ge30KKyAgICAgICAgICAoX2t0eXBlMzg2LCBfdnR5cGUzODcsIF9zaXplMzg1ICkgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKQorICAgICAgICAgIGZvciBfaTM4OSBpbiB4cmFuZ2UoX3NpemUzODUpOgorICAgICAgICAgICAgX2tleTM5MCA9IEdsb2JhbFN0cmVhbUlkKCkKKyAgICAgICAgICAgIF9rZXkzOTAucmVhZChpcHJvdCkKKyAgICAgICAgICAgIF92YWwzOTEgPSBDb21wb25lbnRBZ2dyZWdhdGVTdGF0cygpCisgICAgICAgICAgICBfdmFsMzkxLnJlYWQoaXByb3QpCisgICAgICAgICAgICBzZWxmLmdzaWRfdG9faW5wdXRfc3RhdHNbX2tleTM5MF0gPSBfdmFsMzkxCisgICAgICAgICAgaXByb3QucmVhZE1hcEVuZCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgIGVsaWYgZmlkID09IDk6CisgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLk1BUDoKKyAgICAgICAgICBzZWxmLnNpZF90b19vdXRwdXRfc3RhdHMgPSB7fQorICAgICAgICAgIChfa3R5cGUzOTMsIF92dHlwZTM5NCwgX3NpemUzOTIgKSA9IGlwcm90LnJlYWRNYXBCZWdpbigpCisgICAgICAgICAgZm9yIF9pMzk2IGluIHhyYW5nZShfc2l6ZTM5Mik6CisgICAgICAgICAgICBfa2V5Mzk3ID0gaXByb3QucmVhZFN0cmluZygpLmRlY29kZSgndXRmLTgnKQorICAgICAgICAgICAgX3ZhbDM5OCA9IENvbXBvbmVudEFnZ3JlZ2F0ZVN0YXRzKCkKKyAgICAgICAgICAgIF92YWwzOTgucmVhZChpcHJvdCkKKyAgICAgICAgICAgIHNlbGYuc2lkX3RvX291dHB1dF9zdGF0c1tfa2V5Mzk3XSA9IF92YWwzOTgKKyAgICAgICAgICBpcHJvdC5yZWFkTWFwRW5kKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgZWxpZiBmaWQgPT0gMTA6CisgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLkxJU1Q6CisgICAgICAgICAgc2VsZi5leGVjX3N0YXRzID0gW10KKyAgICAgICAgICAoX2V0eXBlNDAyLCBfc2l6ZTM5OSkgPSBpcHJvdC5yZWFkTGlzdEJlZ2luKCkKKyAgICAgICAgICBmb3IgX2k0MDMgaW4geHJhbmdlKF9zaXplMzk5KToKKyAgICAgICAgICAgIF9lbGVtNDA0ID0gRXhlY3V0b3JBZ2dyZWdhdGVTdGF0cygpCisgICAgICAgICAgICBfZWxlbTQwNC5yZWFkKGlwcm90KQorICAgICAgICAgICAgc2VsZi5leGVjX3N0YXRzLmFwcGVuZChfZWxlbTQwNCkKKyAgICAgICAgICBpcHJvdC5yZWFkTGlzdEVuZCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgIGVsaWYgZmlkID09IDExOgorICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5MSVNUOgorICAgICAgICAgIHNlbGYuZXJyb3JzID0gW10KKyAgICAgICAgICAoX2V0eXBlNDA4LCBfc2l6ZTQwNSkgPSBpcHJvdC5yZWFkTGlzdEJlZ2luKCkKKyAgICAgICAgICBmb3IgX2k0MDkgaW4geHJhbmdlKF9zaXplNDA1KToKKyAgICAgICAgICAgIF9lbGVtNDEwID0gRXJyb3JJbmZvKCkKKyAgICAgICAgICAgIF9lbGVtNDEwLnJlYWQoaXByb3QpCisgICAgICAgICAgICBzZWxmLmVycm9ycy5hcHBlbmQoX2VsZW00MTApCisgICAgICAgICAgaXByb3QucmVhZExpc3RFbmQoKQorICAgICAgICBlbHNlOgorICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBlbGlmIGZpZCA9PSAxMjoKKyAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuU1RSSU5HOgorICAgICAgICAgIHNlbGYuZXZlbnRsb2dfaG9zdCA9IGlwcm90LnJlYWRTdHJpbmcoKS5kZWNvZGUoJ3V0Zi04JykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgZWxpZiBmaWQgPT0gMTM6CisgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLkkzMjoKKyAgICAgICAgICBzZWxmLmV2ZW50bG9nX3BvcnQgPSBpcHJvdC5yZWFkSTMyKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgZWxpZiBmaWQgPT0gMTQ6CisgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLlNUUlVDVDoKKyAgICAgICAgICBzZWxmLmRlYnVnX29wdGlvbnMgPSBEZWJ1Z09wdGlvbnMoKQorICAgICAgICAgIHNlbGYuZGVidWdfb3B0aW9ucy5yZWFkKGlwcm90KQorICAgICAgICBlbHNlOgorICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBlbGlmIGZpZCA9PSAxNToKKyAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuU1RSSU5HOgorICAgICAgICAgIHNlbGYudG9wb2xvZ3lfc3RhdHVzID0gaXByb3QucmVhZFN0cmluZygpLmRlY29kZSgndXRmLTgnKQorICAgICAgICBlbHNlOgorICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBlbHNlOgorICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgaXByb3QucmVhZEZpZWxkRW5kKCkKKyAgICBpcHJvdC5yZWFkU3RydWN0RW5kKCkKKworICBkZWYgd3JpdGUoc2VsZiwgb3Byb3QpOgorICAgIGlmIG9wcm90Ll9fY2xhc3NfXyA9PSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgYW5kIHNlbGYudGhyaWZ0X3NwZWMgaXMgbm90IE5vbmUgYW5kIGZhc3RiaW5hcnkgaXMgbm90IE5vbmU6CisgICAgICBvcHJvdC50cmFucy53cml0ZShmYXN0YmluYXJ5LmVuY29kZV9iaW5hcnkoc2VsZiwgKHNlbGYuX19jbGFzc19fLCBzZWxmLnRocmlmdF9zcGVjKSkpCisgICAgICByZXR1cm4KKyAgICBvcHJvdC53cml0ZVN0cnVjdEJlZ2luKCdDb21wb25lbnRQYWdlSW5mbycpCisgICAgaWYgc2VsZi5jb21wb25lbnRfaWQgaXMgbm90IE5vbmU6CisgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ2NvbXBvbmVudF9pZCcsIFRUeXBlLlNUUklORywgMSkKKyAgICAgIG9wcm90LndyaXRlU3RyaW5nKHNlbGYuY29tcG9uZW50X2lkLmVuY29kZSgndXRmLTgnKSkKKyAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKQorICAgIGlmIHNlbGYuY29tcG9uZW50X3R5cGUgaXMgbm90IE5vbmU6CisgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ2NvbXBvbmVudF90eXBlJywgVFR5cGUuSTMyLCAyKQorICAgICAgb3Byb3Qud3JpdGVJMzIoc2VsZi5jb21wb25lbnRfdHlwZSkKKyAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKQorICAgIGlmIHNlbGYudG9wb2xvZ3lfaWQgaXMgbm90IE5vbmU6CisgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ3RvcG9sb2d5X2lkJywgVFR5cGUuU1RSSU5HLCAzKQorICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoc2VsZi50b3BvbG9neV9pZC5lbmNvZGUoJ3V0Zi04JykpCisgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKKyAgICBpZiBzZWxmLnRvcG9sb2d5X25hbWUgaXMgbm90IE5vbmU6CisgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ3RvcG9sb2d5X25hbWUnLCBUVHlwZS5TVFJJTkcsIDQpCisgICAgICBvcHJvdC53cml0ZVN0cmluZyhzZWxmLnRvcG9sb2d5X25hbWUuZW5jb2RlKCd1dGYtOCcpKQorICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCisgICAgaWYgc2VsZi5udW1fZXhlY3V0b3JzIGlzIG5vdCBOb25lOgorICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCdudW1fZXhlY3V0b3JzJywgVFR5cGUuSTMyLCA1KQorICAgICAgb3Byb3Qud3JpdGVJMzIoc2VsZi5udW1fZXhlY3V0b3JzKQorICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCisgICAgaWYgc2VsZi5udW1fdGFza3MgaXMgbm90IE5vbmU6CisgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ251bV90YXNrcycsIFRUeXBlLkkzMiwgNikKKyAgICAgIG9wcm90LndyaXRlSTMyKHNlbGYubnVtX3Rhc2tzKQorICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCisgICAgaWYgc2VsZi53aW5kb3dfdG9fc3RhdHMgaXMgbm90IE5vbmU6CisgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ3dpbmRvd190b19zdGF0cycsIFRUeXBlLk1BUCwgNykKKyAgICAgIG9wcm90LndyaXRlTWFwQmVnaW4oVFR5cGUuU1RSSU5HLCBUVHlwZS5TVFJVQ1QsIGxlbihzZWxmLndpbmRvd190b19zdGF0cykpCisgICAgICBmb3Iga2l0ZXI0MTEsdml0ZXI0MTIgaW4gc2VsZi53aW5kb3dfdG9fc3RhdHMuaXRlbXMoKToKKyAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoa2l0ZXI0MTEuZW5jb2RlKCd1dGYtOCcpKQorICAgICAgICB2aXRlcjQxMi53cml0ZShvcHJvdCkKKyAgICAgIG9wcm90LndyaXRlTWFwRW5kKCkKKyAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKQorICAgIGlmIHNlbGYuZ3NpZF90b19pbnB1dF9zdGF0cyBpcyBub3QgTm9uZToKKyAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbignZ3NpZF90b19pbnB1dF9zdGF0cycsIFRUeXBlLk1BUCwgOCkKKyAgICAgIG9wcm90LndyaXRlTWFwQmVnaW4oVFR5cGUuU1RSVUNULCBUVHlwZS5TVFJVQ1QsIGxlbihzZWxmLmdzaWRfdG9faW5wdXRfc3RhdHMpKQorICAgICAgZm9yIGtpdGVyNDEzLHZpdGVyNDE0IGluIHNlbGYuZ3NpZF90b19pbnB1dF9zdGF0cy5pdGVtcygpOgorICAgICAgICBraXRlcjQxMy53cml0ZShvcHJvdCkKKyAgICAgICAgdml0ZXI0MTQud3JpdGUob3Byb3QpCisgICAgICBvcHJvdC53cml0ZU1hcEVuZCgpCisgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKKyAgICBpZiBzZWxmLnNpZF90b19vdXRwdXRfc3RhdHMgaXMgbm90IE5vbmU6CisgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ3NpZF90b19vdXRwdXRfc3RhdHMnLCBUVHlwZS5NQVAsIDkpCisgICAgICBvcHJvdC53cml0ZU1hcEJlZ2luKFRUeXBlLlNUUklORywgVFR5cGUuU1RSVUNULCBsZW4oc2VsZi5zaWRfdG9fb3V0cHV0X3N0YXRzKSkKKyAgICAgIGZvciBraXRlcjQxNSx2aXRlcjQxNiBpbiBzZWxmLnNpZF90b19vdXRwdXRfc3RhdHMuaXRlbXMoKToKKyAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoa2l0ZXI0MTUuZW5jb2RlKCd1dGYtOCcpKQorICAgICAgICB2aXRlcjQxNi53cml0ZShvcHJvdCkKKyAgICAgIG9wcm90LndyaXRlTWFwRW5kKCkKKyAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKQorICAgIGlmIHNlbGYuZXhlY19zdGF0cyBpcyBub3QgTm9uZToKKyAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbignZXhlY19zdGF0cycsIFRUeXBlLkxJU1QsIDEwKQorICAgICAgb3Byb3Qud3JpdGVMaXN0QmVnaW4oVFR5cGUuU1RSVUNULCBsZW4oc2VsZi5leGVjX3N0YXRzKSkKKyAgICAgIGZvciBpdGVyNDE3IGluIHNlbGYuZXhlY19zdGF0czoKKyAgICAgICAgaXRlcjQxNy53cml0ZShvcHJvdCkKKyAgICAgIG9wcm90LndyaXRlTGlzdEVuZCgpCisgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKKyAgICBpZiBzZWxmLmVycm9ycyBpcyBub3QgTm9uZToKKyAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbignZXJyb3JzJywgVFR5cGUuTElTVCwgMTEpCisgICAgICBvcHJvdC53cml0ZUxpc3RCZWdpbihUVHlwZS5TVFJVQ1QsIGxlbihzZWxmLmVycm9ycykpCisgICAgICBmb3IgaXRlcjQxOCBpbiBzZWxmLmVycm9yczoKKyAgICAgICAgaXRlcjQxOC53cml0ZShvcHJvdCkKKyAgICAgIG9wcm90LndyaXRlTGlzdEVuZCgpCisgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKKyAgICBpZiBzZWxmLmV2ZW50bG9nX2hvc3QgaXMgbm90IE5vbmU6CisgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ2V2ZW50bG9nX2hvc3QnLCBUVHlwZS5TVFJJTkcsIDEyKQorICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoc2VsZi5ldmVudGxvZ19ob3N0LmVuY29kZSgndXRmLTgnKSkKKyAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKQorICAgIGlmIHNlbGYuZXZlbnRsb2dfcG9ydCBpcyBub3QgTm9uZToKKyAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbignZXZlbnRsb2dfcG9ydCcsIFRUeXBlLkkzMiwgMTMpCisgICAgICBvcHJvdC53cml0ZUkzMihzZWxmLmV2ZW50bG9nX3BvcnQpCisgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKKyAgICBpZiBzZWxmLmRlYnVnX29wdGlvbnMgaXMgbm90IE5vbmU6CisgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ2RlYnVnX29wdGlvbnMnLCBUVHlwZS5TVFJVQ1QsIDE0KQorICAgICAgc2VsZi5kZWJ1Z19vcHRpb25zLndyaXRlKG9wcm90KQorICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCisgICAgaWYgc2VsZi50b3BvbG9neV9zdGF0dXMgaXMgbm90IE5vbmU6CisgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ3RvcG9sb2d5X3N0YXR1cycsIFRUeXBlLlNUUklORywgMTUpCisgICAgICBvcHJvdC53cml0ZVN0cmluZyhzZWxmLnRvcG9sb2d5X3N0YXR1cy5lbmNvZGUoJ3V0Zi04JykpCisgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKKyAgICBvcHJvdC53cml0ZUZpZWxkU3RvcCgpCisgICAgb3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKQorCisgIGRlZiB2YWxpZGF0ZShzZWxmKToKKyAgICBpZiBzZWxmLmNvbXBvbmVudF9pZCBpcyBOb25lOgorICAgICAgcmFpc2UgVFByb3RvY29sLlRQcm90b2NvbEV4Y2VwdGlvbihtZXNzYWdlPSdSZXF1aXJlZCBmaWVsZCBjb21wb25lbnRfaWQgaXMgdW5zZXQhJykKKyAgICBpZiBzZWxmLmNvbXBvbmVudF90eXBlIGlzIE5vbmU6CisgICAgICByYWlzZSBUUHJvdG9jb2wuVFByb3RvY29sRXhjZXB0aW9uKG1lc3NhZ2U9J1JlcXVpcmVkIGZpZWxkIGNvbXBvbmVudF90eXBlIGlzIHVuc2V0IScpCisgICAgcmV0dXJuCisKKworICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgdmFsdWUgPSAxNworICAgIHZhbHVlID0gKHZhbHVlICogMzEpIF4gaGFzaChzZWxmLmNvbXBvbmVudF9pZCkKKyAgICB2YWx1ZSA9ICh2YWx1ZSAqIDMxKSBeIGhhc2goc2VsZi5jb21wb25lbnRfdHlwZSkKKyAgICB2YWx1ZSA9ICh2YWx1ZSAqIDMxKSBeIGhhc2goc2VsZi50b3BvbG9neV9pZCkKKyAgICB2YWx1ZSA9ICh2YWx1ZSAqIDMxKSBeIGhhc2goc2VsZi50b3BvbG9neV9uYW1lKQorICAgIHZhbHVlID0gKHZhbHVlICogMzEpIF4gaGFzaChzZWxmLm51bV9leGVjdXRvcnMpCisgICAgdmFsdWUgPSAodmFsdWUgKiAzMSkgXiBoYXNoKHNlbGYubnVtX3Rhc2tzKQorICAgIHZhbHVlID0gKHZhbHVlICogMzEpIF4gaGFzaChzZWxmLndpbmRvd190b19zdGF0cykKKyAgICB2YWx1ZSA9ICh2YWx1ZSAqIDMxKSBeIGhhc2goc2VsZi5nc2lkX3RvX2lucHV0X3N0YXRzKQorICAgIHZhbHVlID0gKHZhbHVlICogMzEpIF4gaGFzaChzZWxmLnNpZF90b19vdXRwdXRfc3RhdHMpCisgICAgdmFsdWUgPSAodmFsdWUgKiAzMSkgXiBoYXNoKHNlbGYuZXhlY19zdGF0cykKKyAgICB2YWx1ZSA9ICh2YWx1ZSAqIDMxKSBeIGhhc2goc2VsZi5lcnJvcnMpCisgICAgdmFsdWUgPSAodmFsdWUgKiAzMSkgXiBoYXNoKHNlbGYuZXZlbnRsb2dfaG9zdCkKKyAgICB2YWx1ZSA9ICh2YWx1ZSAqIDMxKSBeIGhhc2goc2VsZi5ldmVudGxvZ19wb3J0KQorICAgIHZhbHVlID0gKHZhbHVlICogMzEpIF4gaGFzaChzZWxmLmRlYnVnX29wdGlvbnMpCisgICAgdmFsdWUgPSAodmFsdWUgKiAzMSkgXiBoYXNoKHNlbGYudG9wb2xvZ3lfc3RhdHVzKQogICAgIHJldHVybiB2YWx1ZQogCiAgIGRlZiBfX3JlcHJfXyhzZWxmKToKQEAgLTQ1NDgsNyArNjgxMSw3IEBACiAgICAgICAgIGJyZWFrCiAgICAgICBpZiBmaWQgPT0gMToKICAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuSTMyOgotICAgICAgICAgIHNlbGYud2FpdF9zZWNzID0gaXByb3QucmVhZEkzMigpOworICAgICAgICAgIHNlbGYud2FpdF9zZWNzID0gaXByb3QucmVhZEkzMigpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKICAgICAgIGVsc2U6CkBAIC00NjE5LDIyICs2ODgyLDIyIEBACiAgICAgICAgIGJyZWFrCiAgICAgICBpZiBmaWQgPT0gMToKICAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuSTMyOgotICAgICAgICAgIHNlbGYud2FpdF9zZWNzID0gaXByb3QucmVhZEkzMigpOworICAgICAgICAgIHNlbGYud2FpdF9zZWNzID0gaXByb3QucmVhZEkzMigpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKICAgICAgIGVsaWYgZmlkID09IDI6CiAgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLkkzMjoKLSAgICAgICAgICBzZWxmLm51bV93b3JrZXJzID0gaXByb3QucmVhZEkzMigpOworICAgICAgICAgIHNlbGYubnVtX3dvcmtlcnMgPSBpcHJvdC5yZWFkSTMyKCkKICAgICAgICAgZWxzZToKICAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQogICAgICAgZWxpZiBmaWQgPT0gMzoKICAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuTUFQOgogICAgICAgICAgIHNlbGYubnVtX2V4ZWN1dG9ycyA9IHt9Ci0gICAgICAgICAgKF9rdHlwZTMwMCwgX3Z0eXBlMzAxLCBfc2l6ZTI5OSApID0gaXByb3QucmVhZE1hcEJlZ2luKCkKLSAgICAgICAgICBmb3IgX2kzMDMgaW4geHJhbmdlKF9zaXplMjk5KToKLSAgICAgICAgICAgIF9rZXkzMDQgPSBpcHJvdC5yZWFkU3RyaW5nKCkuZGVjb2RlKCd1dGYtOCcpCi0gICAgICAgICAgICBfdmFsMzA1ID0gaXByb3QucmVhZEkzMigpOwotICAgICAgICAgICAgc2VsZi5udW1fZXhlY3V0b3JzW19rZXkzMDRdID0gX3ZhbDMwNQorICAgICAgICAgIChfa3R5cGU0MjAsIF92dHlwZTQyMSwgX3NpemU0MTkgKSA9IGlwcm90LnJlYWRNYXBCZWdpbigpCisgICAgICAgICAgZm9yIF9pNDIzIGluIHhyYW5nZShfc2l6ZTQxOSk6CisgICAgICAgICAgICBfa2V5NDI0ID0gaXByb3QucmVhZFN0cmluZygpLmRlY29kZSgndXRmLTgnKQorICAgICAgICAgICAgX3ZhbDQyNSA9IGlwcm90LnJlYWRJMzIoKQorICAgICAgICAgICAgc2VsZi5udW1fZXhlY3V0b3JzW19rZXk0MjRdID0gX3ZhbDQyNQogICAgICAgICAgIGlwcm90LnJlYWRNYXBFbmQoKQogICAgICAgICBlbHNlOgogICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCkBAIC00NjU5LDkgKzY5MjIsOSBAQAogICAgIGlmIHNlbGYubnVtX2V4ZWN1dG9ycyBpcyBub3QgTm9uZToKICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbignbnVtX2V4ZWN1dG9ycycsIFRUeXBlLk1BUCwgMykKICAgICAgIG9wcm90LndyaXRlTWFwQmVnaW4oVFR5cGUuU1RSSU5HLCBUVHlwZS5JMzIsIGxlbihzZWxmLm51bV9leGVjdXRvcnMpKQotICAgICAgZm9yIGtpdGVyMzA2LHZpdGVyMzA3IGluIHNlbGYubnVtX2V4ZWN1dG9ycy5pdGVtcygpOgotICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhraXRlcjMwNi5lbmNvZGUoJ3V0Zi04JykpCi0gICAgICAgIG9wcm90LndyaXRlSTMyKHZpdGVyMzA3KQorICAgICAgZm9yIGtpdGVyNDI2LHZpdGVyNDI3IGluIHNlbGYubnVtX2V4ZWN1dG9ycy5pdGVtcygpOgorICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhraXRlcjQyNi5lbmNvZGUoJ3V0Zi04JykpCisgICAgICAgIG9wcm90LndyaXRlSTMyKHZpdGVyNDI3KQogICAgICAgb3Byb3Qud3JpdGVNYXBFbmQoKQogICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCiAgICAgb3Byb3Qud3JpdGVGaWVsZFN0b3AoKQpAQCAtNDcxNSwxMSArNjk3OCwxMSBAQAogICAgICAgaWYgZmlkID09IDE6CiAgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLk1BUDoKICAgICAgICAgICBzZWxmLmNyZWRzID0ge30KLSAgICAgICAgICAoX2t0eXBlMzA5LCBfdnR5cGUzMTAsIF9zaXplMzA4ICkgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKQotICAgICAgICAgIGZvciBfaTMxMiBpbiB4cmFuZ2UoX3NpemUzMDgpOgotICAgICAgICAgICAgX2tleTMxMyA9IGlwcm90LnJlYWRTdHJpbmcoKS5kZWNvZGUoJ3V0Zi04JykKLSAgICAgICAgICAgIF92YWwzMTQgPSBpcHJvdC5yZWFkU3RyaW5nKCkuZGVjb2RlKCd1dGYtOCcpCi0gICAgICAgICAgICBzZWxmLmNyZWRzW19rZXkzMTNdID0gX3ZhbDMxNAorICAgICAgICAgIChfa3R5cGU0MjksIF92dHlwZTQzMCwgX3NpemU0MjggKSA9IGlwcm90LnJlYWRNYXBCZWdpbigpCisgICAgICAgICAgZm9yIF9pNDMyIGluIHhyYW5nZShfc2l6ZTQyOCk6CisgICAgICAgICAgICBfa2V5NDMzID0gaXByb3QucmVhZFN0cmluZygpLmRlY29kZSgndXRmLTgnKQorICAgICAgICAgICAgX3ZhbDQzNCA9IGlwcm90LnJlYWRTdHJpbmcoKS5kZWNvZGUoJ3V0Zi04JykKKyAgICAgICAgICAgIHNlbGYuY3JlZHNbX2tleTQzM10gPSBfdmFsNDM0CiAgICAgICAgICAgaXByb3QucmVhZE1hcEVuZCgpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKQEAgLTQ3MzYsOSArNjk5OSw5IEBACiAgICAgaWYgc2VsZi5jcmVkcyBpcyBub3QgTm9uZToKICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbignY3JlZHMnLCBUVHlwZS5NQVAsIDEpCiAgICAgICBvcHJvdC53cml0ZU1hcEJlZ2luKFRUeXBlLlNUUklORywgVFR5cGUuU1RSSU5HLCBsZW4oc2VsZi5jcmVkcykpCi0gICAgICBmb3Iga2l0ZXIzMTUsdml0ZXIzMTYgaW4gc2VsZi5jcmVkcy5pdGVtcygpOgotICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhraXRlcjMxNS5lbmNvZGUoJ3V0Zi04JykpCi0gICAgICAgIG9wcm90LndyaXRlU3RyaW5nKHZpdGVyMzE2LmVuY29kZSgndXRmLTgnKSkKKyAgICAgIGZvciBraXRlcjQzNSx2aXRlcjQzNiBpbiBzZWxmLmNyZWRzLml0ZW1zKCk6CisgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKGtpdGVyNDM1LmVuY29kZSgndXRmLTgnKSkKKyAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcodml0ZXI0MzYuZW5jb2RlKCd1dGYtOCcpKQogICAgICAgb3Byb3Qud3JpdGVNYXBFbmQoKQogICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCiAgICAgb3Byb3Qud3JpdGVGaWVsZFN0b3AoKQpAQCAtNDc5NCw3ICs3MDU3LDcgQEAKICAgICAgICAgYnJlYWsKICAgICAgIGlmIGZpZCA9PSAxOgogICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5JMzI6Ci0gICAgICAgICAgc2VsZi5pbml0aWFsX3N0YXR1cyA9IGlwcm90LnJlYWRJMzIoKTsKKyAgICAgICAgICBzZWxmLmluaXRpYWxfc3RhdHVzID0gaXByb3QucmVhZEkzMigpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKICAgICAgIGVsaWYgZmlkID09IDI6CkBAIC00ODU4LDYgKzcxMjEsNyBAQAogICAgLSBzY2hlZHVsZXJfbWV0YQogICAgLSB1cHRpbWVfc2VjcwogICAgLSB2ZXJzaW9uCisgICAtIHJlc291cmNlc19tYXAKICAgIiIiCiAKICAgdGhyaWZ0X3NwZWMgPSAoCkBAIC00ODcwLDkgKzcxMzQsMTAgQEAKICAgICAoNiwgVFR5cGUuTUFQLCAnc2NoZWR1bGVyX21ldGEnLCAoVFR5cGUuU1RSSU5HLE5vbmUsVFR5cGUuU1RSSU5HLE5vbmUpLCBOb25lLCApLCAjIDYKICAgICAoNywgVFR5cGUuSTY0LCAndXB0aW1lX3NlY3MnLCBOb25lLCBOb25lLCApLCAjIDcKICAgICAoOCwgVFR5cGUuU1RSSU5HLCAndmVyc2lvbicsIE5vbmUsIE5vbmUsICksICMgOAorICAgICg5LCBUVHlwZS5NQVAsICdyZXNvdXJjZXNfbWFwJywgKFRUeXBlLlNUUklORyxOb25lLFRUeXBlLkRPVUJMRSxOb25lKSwgTm9uZSwgKSwgIyA5CiAgICkKIAotICBkZWYgX19pbml0X18oc2VsZiwgdGltZV9zZWNzPU5vbmUsIGhvc3RuYW1lPU5vbmUsIGFzc2lnbm1lbnRfaWQ9Tm9uZSwgdXNlZF9wb3J0cz1Ob25lLCBtZXRhPU5vbmUsIHNjaGVkdWxlcl9tZXRhPU5vbmUsIHVwdGltZV9zZWNzPU5vbmUsIHZlcnNpb249Tm9uZSwpOgorICBkZWYgX19pbml0X18oc2VsZiwgdGltZV9zZWNzPU5vbmUsIGhvc3RuYW1lPU5vbmUsIGFzc2lnbm1lbnRfaWQ9Tm9uZSwgdXNlZF9wb3J0cz1Ob25lLCBtZXRhPU5vbmUsIHNjaGVkdWxlcl9tZXRhPU5vbmUsIHVwdGltZV9zZWNzPU5vbmUsIHZlcnNpb249Tm9uZSwgcmVzb3VyY2VzX21hcD1Ob25lLCk6CiAgICAgc2VsZi50aW1lX3NlY3MgPSB0aW1lX3NlY3MKICAgICBzZWxmLmhvc3RuYW1lID0gaG9zdG5hbWUKICAgICBzZWxmLmFzc2lnbm1lbnRfaWQgPSBhc3NpZ25tZW50X2lkCkBAIC00ODgxLDYgKzcxNDYsNyBAQAogICAgIHNlbGYuc2NoZWR1bGVyX21ldGEgPSBzY2hlZHVsZXJfbWV0YQogICAgIHNlbGYudXB0aW1lX3NlY3MgPSB1cHRpbWVfc2VjcwogICAgIHNlbGYudmVyc2lvbiA9IHZlcnNpb24KKyAgICBzZWxmLnJlc291cmNlc19tYXAgPSByZXNvdXJjZXNfbWFwCiAKICAgZGVmIHJlYWQoc2VsZiwgaXByb3QpOgogICAgIGlmIGlwcm90Ll9fY2xhc3NfXyA9PSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgYW5kIGlzaW5zdGFuY2UoaXByb3QudHJhbnMsIFRUcmFuc3BvcnQuQ1JlYWRhYmxlVHJhbnNwb3J0KSBhbmQgc2VsZi50aHJpZnRfc3BlYyBpcyBub3QgTm9uZSBhbmQgZmFzdGJpbmFyeSBpcyBub3QgTm9uZToKQEAgLTQ4OTMsNyArNzE1OSw3IEBACiAgICAgICAgIGJyZWFrCiAgICAgICBpZiBmaWQgPT0gMToKICAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuSTY0OgotICAgICAgICAgIHNlbGYudGltZV9zZWNzID0gaXByb3QucmVhZEk2NCgpOworICAgICAgICAgIHNlbGYudGltZV9zZWNzID0gaXByb3QucmVhZEk2NCgpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKICAgICAgIGVsaWYgZmlkID09IDI6CkBAIC00OTA5LDM3ICs3MTc1LDM3IEBACiAgICAgICBlbGlmIGZpZCA9PSA0OgogICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5MSVNUOgogICAgICAgICAgIHNlbGYudXNlZF9wb3J0cyA9IFtdCi0gICAgICAgICAgKF9ldHlwZTMyMCwgX3NpemUzMTcpID0gaXByb3QucmVhZExpc3RCZWdpbigpCi0gICAgICAgICAgZm9yIF9pMzIxIGluIHhyYW5nZShfc2l6ZTMxNyk6Ci0gICAgICAgICAgICBfZWxlbTMyMiA9IGlwcm90LnJlYWRJNjQoKTsKLSAgICAgICAgICAgIHNlbGYudXNlZF9wb3J0cy5hcHBlbmQoX2VsZW0zMjIpCisgICAgICAgICAgKF9ldHlwZTQ0MCwgX3NpemU0MzcpID0gaXByb3QucmVhZExpc3RCZWdpbigpCisgICAgICAgICAgZm9yIF9pNDQxIGluIHhyYW5nZShfc2l6ZTQzNyk6CisgICAgICAgICAgICBfZWxlbTQ0MiA9IGlwcm90LnJlYWRJNjQoKQorICAgICAgICAgICAgc2VsZi51c2VkX3BvcnRzLmFwcGVuZChfZWxlbTQ0MikKICAgICAgICAgICBpcHJvdC5yZWFkTGlzdEVuZCgpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKICAgICAgIGVsaWYgZmlkID09IDU6CiAgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLkxJU1Q6CiAgICAgICAgICAgc2VsZi5tZXRhID0gW10KLSAgICAgICAgICAoX2V0eXBlMzI2LCBfc2l6ZTMyMykgPSBpcHJvdC5yZWFkTGlzdEJlZ2luKCkKLSAgICAgICAgICBmb3IgX2kzMjcgaW4geHJhbmdlKF9zaXplMzIzKToKLSAgICAgICAgICAgIF9lbGVtMzI4ID0gaXByb3QucmVhZEk2NCgpOwotICAgICAgICAgICAgc2VsZi5tZXRhLmFwcGVuZChfZWxlbTMyOCkKKyAgICAgICAgICAoX2V0eXBlNDQ2LCBfc2l6ZTQ0MykgPSBpcHJvdC5yZWFkTGlzdEJlZ2luKCkKKyAgICAgICAgICBmb3IgX2k0NDcgaW4geHJhbmdlKF9zaXplNDQzKToKKyAgICAgICAgICAgIF9lbGVtNDQ4ID0gaXByb3QucmVhZEk2NCgpCisgICAgICAgICAgICBzZWxmLm1ldGEuYXBwZW5kKF9lbGVtNDQ4KQogICAgICAgICAgIGlwcm90LnJlYWRMaXN0RW5kKCkKICAgICAgICAgZWxzZToKICAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQogICAgICAgZWxpZiBmaWQgPT0gNjoKICAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuTUFQOgogICAgICAgICAgIHNlbGYuc2NoZWR1bGVyX21ldGEgPSB7fQotICAgICAgICAgIChfa3R5cGUzMzAsIF92dHlwZTMzMSwgX3NpemUzMjkgKSA9IGlwcm90LnJlYWRNYXBCZWdpbigpCi0gICAgICAgICAgZm9yIF9pMzMzIGluIHhyYW5nZShfc2l6ZTMyOSk6Ci0gICAgICAgICAgICBfa2V5MzM0ID0gaXByb3QucmVhZFN0cmluZygpLmRlY29kZSgndXRmLTgnKQotICAgICAgICAgICAgX3ZhbDMzNSA9IGlwcm90LnJlYWRTdHJpbmcoKS5kZWNvZGUoJ3V0Zi04JykKLSAgICAgICAgICAgIHNlbGYuc2NoZWR1bGVyX21ldGFbX2tleTMzNF0gPSBfdmFsMzM1CisgICAgICAgICAgKF9rdHlwZTQ1MCwgX3Z0eXBlNDUxLCBfc2l6ZTQ0OSApID0gaXByb3QucmVhZE1hcEJlZ2luKCkKKyAgICAgICAgICBmb3IgX2k0NTMgaW4geHJhbmdlKF9zaXplNDQ5KToKKyAgICAgICAgICAgIF9rZXk0NTQgPSBpcHJvdC5yZWFkU3RyaW5nKCkuZGVjb2RlKCd1dGYtOCcpCisgICAgICAgICAgICBfdmFsNDU1ID0gaXByb3QucmVhZFN0cmluZygpLmRlY29kZSgndXRmLTgnKQorICAgICAgICAgICAgc2VsZi5zY2hlZHVsZXJfbWV0YVtfa2V5NDU0XSA9IF92YWw0NTUKICAgICAgICAgICBpcHJvdC5yZWFkTWFwRW5kKCkKICAgICAgICAgZWxzZToKICAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQogICAgICAgZWxpZiBmaWQgPT0gNzoKICAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuSTY0OgotICAgICAgICAgIHNlbGYudXB0aW1lX3NlY3MgPSBpcHJvdC5yZWFkSTY0KCk7CisgICAgICAgICAgc2VsZi51cHRpbWVfc2VjcyA9IGlwcm90LnJlYWRJNjQoKQogICAgICAgICBlbHNlOgogICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCiAgICAgICBlbGlmIGZpZCA9PSA4OgpAQCAtNDk0Nyw2ICs3MjEzLDE3IEBACiAgICAgICAgICAgc2VsZi52ZXJzaW9uID0gaXByb3QucmVhZFN0cmluZygpLmRlY29kZSgndXRmLTgnKQogICAgICAgICBlbHNlOgogICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBlbGlmIGZpZCA9PSA5OgorICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5NQVA6CisgICAgICAgICAgc2VsZi5yZXNvdXJjZXNfbWFwID0ge30KKyAgICAgICAgICAoX2t0eXBlNDU3LCBfdnR5cGU0NTgsIF9zaXplNDU2ICkgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKQorICAgICAgICAgIGZvciBfaTQ2MCBpbiB4cmFuZ2UoX3NpemU0NTYpOgorICAgICAgICAgICAgX2tleTQ2MSA9IGlwcm90LnJlYWRTdHJpbmcoKS5kZWNvZGUoJ3V0Zi04JykKKyAgICAgICAgICAgIF92YWw0NjIgPSBpcHJvdC5yZWFkRG91YmxlKCkKKyAgICAgICAgICAgIHNlbGYucmVzb3VyY2VzX21hcFtfa2V5NDYxXSA9IF92YWw0NjIKKyAgICAgICAgICBpcHJvdC5yZWFkTWFwRW5kKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQogICAgICAgZWxzZToKICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKICAgICAgIGlwcm90LnJlYWRGaWVsZEVuZCgpCkBAIC00OTcyLDIzICs3MjQ5LDIzIEBACiAgICAgaWYgc2VsZi51c2VkX3BvcnRzIGlzIG5vdCBOb25lOgogICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCd1c2VkX3BvcnRzJywgVFR5cGUuTElTVCwgNCkKICAgICAgIG9wcm90LndyaXRlTGlzdEJlZ2luKFRUeXBlLkk2NCwgbGVuKHNlbGYudXNlZF9wb3J0cykpCi0gICAgICBmb3IgaXRlcjMzNiBpbiBzZWxmLnVzZWRfcG9ydHM6Ci0gICAgICAgIG9wcm90LndyaXRlSTY0KGl0ZXIzMzYpCisgICAgICBmb3IgaXRlcjQ2MyBpbiBzZWxmLnVzZWRfcG9ydHM6CisgICAgICAgIG9wcm90LndyaXRlSTY0KGl0ZXI0NjMpCiAgICAgICBvcHJvdC53cml0ZUxpc3RFbmQoKQogICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCiAgICAgaWYgc2VsZi5tZXRhIGlzIG5vdCBOb25lOgogICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCdtZXRhJywgVFR5cGUuTElTVCwgNSkKICAgICAgIG9wcm90LndyaXRlTGlzdEJlZ2luKFRUeXBlLkk2NCwgbGVuKHNlbGYubWV0YSkpCi0gICAgICBmb3IgaXRlcjMzNyBpbiBzZWxmLm1ldGE6Ci0gICAgICAgIG9wcm90LndyaXRlSTY0KGl0ZXIzMzcpCisgICAgICBmb3IgaXRlcjQ2NCBpbiBzZWxmLm1ldGE6CisgICAgICAgIG9wcm90LndyaXRlSTY0KGl0ZXI0NjQpCiAgICAgICBvcHJvdC53cml0ZUxpc3RFbmQoKQogICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCiAgICAgaWYgc2VsZi5zY2hlZHVsZXJfbWV0YSBpcyBub3QgTm9uZToKICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbignc2NoZWR1bGVyX21ldGEnLCBUVHlwZS5NQVAsIDYpCiAgICAgICBvcHJvdC53cml0ZU1hcEJlZ2luKFRUeXBlLlNUUklORywgVFR5cGUuU1RSSU5HLCBsZW4oc2VsZi5zY2hlZHVsZXJfbWV0YSkpCi0gICAgICBmb3Iga2l0ZXIzMzgsdml0ZXIzMzkgaW4gc2VsZi5zY2hlZHVsZXJfbWV0YS5pdGVtcygpOgotICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhraXRlcjMzOC5lbmNvZGUoJ3V0Zi04JykpCi0gICAgICAgIG9wcm90LndyaXRlU3RyaW5nKHZpdGVyMzM5LmVuY29kZSgndXRmLTgnKSkKKyAgICAgIGZvciBraXRlcjQ2NSx2aXRlcjQ2NiBpbiBzZWxmLnNjaGVkdWxlcl9tZXRhLml0ZW1zKCk6CisgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKGtpdGVyNDY1LmVuY29kZSgndXRmLTgnKSkKKyAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcodml0ZXI0NjYuZW5jb2RlKCd1dGYtOCcpKQogICAgICAgb3Byb3Qud3JpdGVNYXBFbmQoKQogICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCiAgICAgaWYgc2VsZi51cHRpbWVfc2VjcyBpcyBub3QgTm9uZToKQEAgLTQ5OTksNiArNzI3NiwxNCBAQAogICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCd2ZXJzaW9uJywgVFR5cGUuU1RSSU5HLCA4KQogICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoc2VsZi52ZXJzaW9uLmVuY29kZSgndXRmLTgnKSkKICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKQorICAgIGlmIHNlbGYucmVzb3VyY2VzX21hcCBpcyBub3QgTm9uZToKKyAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbigncmVzb3VyY2VzX21hcCcsIFRUeXBlLk1BUCwgOSkKKyAgICAgIG9wcm90LndyaXRlTWFwQmVnaW4oVFR5cGUuU1RSSU5HLCBUVHlwZS5ET1VCTEUsIGxlbihzZWxmLnJlc291cmNlc19tYXApKQorICAgICAgZm9yIGtpdGVyNDY3LHZpdGVyNDY4IGluIHNlbGYucmVzb3VyY2VzX21hcC5pdGVtcygpOgorICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhraXRlcjQ2Ny5lbmNvZGUoJ3V0Zi04JykpCisgICAgICAgIG9wcm90LndyaXRlRG91YmxlKHZpdGVyNDY4KQorICAgICAgb3Byb3Qud3JpdGVNYXBFbmQoKQorICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCiAgICAgb3Byb3Qud3JpdGVGaWVsZFN0b3AoKQogICAgIG9wcm90LndyaXRlU3RydWN0RW5kKCkKIApAQCAtNTAyMCw2ICs3MzA1LDcgQEAKICAgICB2YWx1ZSA9ICh2YWx1ZSAqIDMxKSBeIGhhc2goc2VsZi5zY2hlZHVsZXJfbWV0YSkKICAgICB2YWx1ZSA9ICh2YWx1ZSAqIDMxKSBeIGhhc2goc2VsZi51cHRpbWVfc2VjcykKICAgICB2YWx1ZSA9ICh2YWx1ZSAqIDMxKSBeIGhhc2goc2VsZi52ZXJzaW9uKQorICAgIHZhbHVlID0gKHZhbHVlICogMzEpIF4gaGFzaChzZWxmLnJlc291cmNlc19tYXApCiAgICAgcmV0dXJuIHZhbHVlCiAKICAgZGVmIF9fcmVwcl9fKHNlbGYpOgpAQCAtNTA2NywxMCArNzM1MywxMCBAQAogICAgICAgZWxpZiBmaWQgPT0gMjoKICAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuU0VUOgogICAgICAgICAgIHNlbGYucG9ydCA9IHNldCgpCi0gICAgICAgICAgKF9ldHlwZTM0MywgX3NpemUzNDApID0gaXByb3QucmVhZFNldEJlZ2luKCkKLSAgICAgICAgICBmb3IgX2kzNDQgaW4geHJhbmdlKF9zaXplMzQwKToKLSAgICAgICAgICAgIF9lbGVtMzQ1ID0gaXByb3QucmVhZEk2NCgpOwotICAgICAgICAgICAgc2VsZi5wb3J0LmFkZChfZWxlbTM0NSkKKyAgICAgICAgICAoX2V0eXBlNDcyLCBfc2l6ZTQ2OSkgPSBpcHJvdC5yZWFkU2V0QmVnaW4oKQorICAgICAgICAgIGZvciBfaTQ3MyBpbiB4cmFuZ2UoX3NpemU0NjkpOgorICAgICAgICAgICAgX2VsZW00NzQgPSBpcHJvdC5yZWFkSTY0KCkKKyAgICAgICAgICAgIHNlbGYucG9ydC5hZGQoX2VsZW00NzQpCiAgICAgICAgICAgaXByb3QucmVhZFNldEVuZCgpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKQEAgLTUwOTEsOCArNzM3Nyw4IEBACiAgICAgaWYgc2VsZi5wb3J0IGlzIG5vdCBOb25lOgogICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCdwb3J0JywgVFR5cGUuU0VULCAyKQogICAgICAgb3Byb3Qud3JpdGVTZXRCZWdpbihUVHlwZS5JNjQsIGxlbihzZWxmLnBvcnQpKQotICAgICAgZm9yIGl0ZXIzNDYgaW4gc2VsZi5wb3J0OgotICAgICAgICBvcHJvdC53cml0ZUk2NChpdGVyMzQ2KQorICAgICAgZm9yIGl0ZXI0NzUgaW4gc2VsZi5wb3J0OgorICAgICAgICBvcHJvdC53cml0ZUk2NChpdGVyNDc1KQogICAgICAgb3Byb3Qud3JpdGVTZXRFbmQoKQogICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCiAgICAgb3Byb3Qud3JpdGVGaWVsZFN0b3AoKQpAQCAtNTEyMyw2ICs3NDA5LDk3IEBACiAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgIHJldHVybiBub3QgKHNlbGYgPT0gb3RoZXIpCiAKK2NsYXNzIFdvcmtlclJlc291cmNlczoKKyAgIiIiCisgIEF0dHJpYnV0ZXM6CisgICAtIG1lbV9vbl9oZWFwCisgICAtIG1lbV9vZmZfaGVhcAorICAgLSBjcHUKKyAgIiIiCisKKyAgdGhyaWZ0X3NwZWMgPSAoCisgICAgTm9uZSwgIyAwCisgICAgKDEsIFRUeXBlLkRPVUJMRSwgJ21lbV9vbl9oZWFwJywgTm9uZSwgTm9uZSwgKSwgIyAxCisgICAgKDIsIFRUeXBlLkRPVUJMRSwgJ21lbV9vZmZfaGVhcCcsIE5vbmUsIE5vbmUsICksICMgMgorICAgICgzLCBUVHlwZS5ET1VCTEUsICdjcHUnLCBOb25lLCBOb25lLCApLCAjIDMKKyAgKQorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBtZW1fb25faGVhcD1Ob25lLCBtZW1fb2ZmX2hlYXA9Tm9uZSwgY3B1PU5vbmUsKToKKyAgICBzZWxmLm1lbV9vbl9oZWFwID0gbWVtX29uX2hlYXAKKyAgICBzZWxmLm1lbV9vZmZfaGVhcCA9IG1lbV9vZmZfaGVhcAorICAgIHNlbGYuY3B1ID0gY3B1CisKKyAgZGVmIHJlYWQoc2VsZiwgaXByb3QpOgorICAgIGlmIGlwcm90Ll9fY2xhc3NfXyA9PSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgYW5kIGlzaW5zdGFuY2UoaXByb3QudHJhbnMsIFRUcmFuc3BvcnQuQ1JlYWRhYmxlVHJhbnNwb3J0KSBhbmQgc2VsZi50aHJpZnRfc3BlYyBpcyBub3QgTm9uZSBhbmQgZmFzdGJpbmFyeSBpcyBub3QgTm9uZToKKyAgICAgIGZhc3RiaW5hcnkuZGVjb2RlX2JpbmFyeShzZWxmLCBpcHJvdC50cmFucywgKHNlbGYuX19jbGFzc19fLCBzZWxmLnRocmlmdF9zcGVjKSkKKyAgICAgIHJldHVybgorICAgIGlwcm90LnJlYWRTdHJ1Y3RCZWdpbigpCisgICAgd2hpbGUgVHJ1ZToKKyAgICAgIChmbmFtZSwgZnR5cGUsIGZpZCkgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpCisgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5TVE9QOgorICAgICAgICBicmVhaworICAgICAgaWYgZmlkID09IDE6CisgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLkRPVUJMRToKKyAgICAgICAgICBzZWxmLm1lbV9vbl9oZWFwID0gaXByb3QucmVhZERvdWJsZSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgIGVsaWYgZmlkID09IDI6CisgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLkRPVUJMRToKKyAgICAgICAgICBzZWxmLm1lbV9vZmZfaGVhcCA9IGlwcm90LnJlYWREb3VibGUoKQorICAgICAgICBlbHNlOgorICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBlbGlmIGZpZCA9PSAzOgorICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5ET1VCTEU6CisgICAgICAgICAgc2VsZi5jcHUgPSBpcHJvdC5yZWFkRG91YmxlKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgZWxzZToKKyAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgIGlwcm90LnJlYWRGaWVsZEVuZCgpCisgICAgaXByb3QucmVhZFN0cnVjdEVuZCgpCisKKyAgZGVmIHdyaXRlKHNlbGYsIG9wcm90KToKKyAgICBpZiBvcHJvdC5fX2NsYXNzX18gPT0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIGFuZCBzZWxmLnRocmlmdF9zcGVjIGlzIG5vdCBOb25lIGFuZCBmYXN0YmluYXJ5IGlzIG5vdCBOb25lOgorICAgICAgb3Byb3QudHJhbnMud3JpdGUoZmFzdGJpbmFyeS5lbmNvZGVfYmluYXJ5KHNlbGYsIChzZWxmLl9fY2xhc3NfXywgc2VsZi50aHJpZnRfc3BlYykpKQorICAgICAgcmV0dXJuCisgICAgb3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbignV29ya2VyUmVzb3VyY2VzJykKKyAgICBpZiBzZWxmLm1lbV9vbl9oZWFwIGlzIG5vdCBOb25lOgorICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCdtZW1fb25faGVhcCcsIFRUeXBlLkRPVUJMRSwgMSkKKyAgICAgIG9wcm90LndyaXRlRG91YmxlKHNlbGYubWVtX29uX2hlYXApCisgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKKyAgICBpZiBzZWxmLm1lbV9vZmZfaGVhcCBpcyBub3QgTm9uZToKKyAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbignbWVtX29mZl9oZWFwJywgVFR5cGUuRE9VQkxFLCAyKQorICAgICAgb3Byb3Qud3JpdGVEb3VibGUoc2VsZi5tZW1fb2ZmX2hlYXApCisgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKKyAgICBpZiBzZWxmLmNwdSBpcyBub3QgTm9uZToKKyAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbignY3B1JywgVFR5cGUuRE9VQkxFLCAzKQorICAgICAgb3Byb3Qud3JpdGVEb3VibGUoc2VsZi5jcHUpCisgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKKyAgICBvcHJvdC53cml0ZUZpZWxkU3RvcCgpCisgICAgb3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKQorCisgIGRlZiB2YWxpZGF0ZShzZWxmKToKKyAgICByZXR1cm4KKworCisgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICB2YWx1ZSA9IDE3CisgICAgdmFsdWUgPSAodmFsdWUgKiAzMSkgXiBoYXNoKHNlbGYubWVtX29uX2hlYXApCisgICAgdmFsdWUgPSAodmFsdWUgKiAzMSkgXiBoYXNoKHNlbGYubWVtX29mZl9oZWFwKQorICAgIHZhbHVlID0gKHZhbHVlICogMzEpIF4gaGFzaChzZWxmLmNwdSkKKyAgICByZXR1cm4gdmFsdWUKKworICBkZWYgX19yZXByX18oc2VsZik6CisgICAgTCA9IFsnJXM9JXInICUgKGtleSwgdmFsdWUpCisgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzZWxmLl9fZGljdF9fLml0ZXJpdGVtcygpXQorICAgIHJldHVybiAnJXMoJXMpJyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgJywgJy5qb2luKEwpKQorCisgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgIHJldHVybiBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXykgYW5kIHNlbGYuX19kaWN0X18gPT0gb3RoZXIuX19kaWN0X18KKworICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKKyAgICByZXR1cm4gbm90IChzZWxmID09IG90aGVyKQorCiBjbGFzcyBBc3NpZ25tZW50OgogICAiIiIKICAgQXR0cmlidXRlczoKQEAgLTUxMzAsNiArNzUwNyw3IEBACiAgICAtIG5vZGVfaG9zdAogICAgLSBleGVjdXRvcl9ub2RlX3BvcnQKICAgIC0gZXhlY3V0b3Jfc3RhcnRfdGltZV9zZWNzCisgICAtIHdvcmtlcl9yZXNvdXJjZXMKICAgIiIiCiAKICAgdGhyaWZ0X3NwZWMgPSAoCkBAIC01MTQxLDkgKzc1MTksMTEgQEAKICAgICB9LCApLCAjIDMKICAgICAoNCwgVFR5cGUuTUFQLCAnZXhlY3V0b3Jfc3RhcnRfdGltZV9zZWNzJywgKFRUeXBlLkxJU1QsKFRUeXBlLkk2NCxOb25lKSxUVHlwZS5JNjQsTm9uZSksIHsKICAgICB9LCApLCAjIDQKKyAgICAoNSwgVFR5cGUuTUFQLCAnd29ya2VyX3Jlc291cmNlcycsIChUVHlwZS5TVFJVQ1QsKE5vZGVJbmZvLCBOb2RlSW5mby50aHJpZnRfc3BlYyksVFR5cGUuU1RSVUNULChXb3JrZXJSZXNvdXJjZXMsIFdvcmtlclJlc291cmNlcy50aHJpZnRfc3BlYykpLCB7CisgICAgfSwgKSwgIyA1CiAgICkKIAotICBkZWYgX19pbml0X18oc2VsZiwgbWFzdGVyX2NvZGVfZGlyPU5vbmUsIG5vZGVfaG9zdD10aHJpZnRfc3BlY1syXVs0XSwgZXhlY3V0b3Jfbm9kZV9wb3J0PXRocmlmdF9zcGVjWzNdWzRdLCBleGVjdXRvcl9zdGFydF90aW1lX3NlY3M9dGhyaWZ0X3NwZWNbNF1bNF0sKToKKyAgZGVmIF9faW5pdF9fKHNlbGYsIG1hc3Rlcl9jb2RlX2Rpcj1Ob25lLCBub2RlX2hvc3Q9dGhyaWZ0X3NwZWNbMl1bNF0sIGV4ZWN1dG9yX25vZGVfcG9ydD10aHJpZnRfc3BlY1szXVs0XSwgZXhlY3V0b3Jfc3RhcnRfdGltZV9zZWNzPXRocmlmdF9zcGVjWzRdWzRdLCB3b3JrZXJfcmVzb3VyY2VzPXRocmlmdF9zcGVjWzVdWzRdLCk6CiAgICAgc2VsZi5tYXN0ZXJfY29kZV9kaXIgPSBtYXN0ZXJfY29kZV9kaXIKICAgICBpZiBub2RlX2hvc3QgaXMgc2VsZi50aHJpZnRfc3BlY1syXVs0XToKICAgICAgIG5vZGVfaG9zdCA9IHsKQEAgLTUxNTcsNiArNzUzNywxMCBAQAogICAgICAgZXhlY3V0b3Jfc3RhcnRfdGltZV9zZWNzID0gewogICAgIH0KICAgICBzZWxmLmV4ZWN1dG9yX3N0YXJ0X3RpbWVfc2VjcyA9IGV4ZWN1dG9yX3N0YXJ0X3RpbWVfc2VjcworICAgIGlmIHdvcmtlcl9yZXNvdXJjZXMgaXMgc2VsZi50aHJpZnRfc3BlY1s1XVs0XToKKyAgICAgIHdvcmtlcl9yZXNvdXJjZXMgPSB7CisgICAgfQorICAgIHNlbGYud29ya2VyX3Jlc291cmNlcyA9IHdvcmtlcl9yZXNvdXJjZXMKIAogICBkZWYgcmVhZChzZWxmLCBpcHJvdCk6CiAgICAgaWYgaXByb3QuX19jbGFzc19fID09IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCBhbmQgaXNpbnN0YW5jZShpcHJvdC50cmFucywgVFRyYW5zcG9ydC5DUmVhZGFibGVUcmFuc3BvcnQpIGFuZCBzZWxmLnRocmlmdF9zcGVjIGlzIG5vdCBOb25lIGFuZCBmYXN0YmluYXJ5IGlzIG5vdCBOb25lOgpAQCAtNTE3NSw0NCArNzU1OSw1NyBAQAogICAgICAgZWxpZiBmaWQgPT0gMjoKICAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuTUFQOgogICAgICAgICAgIHNlbGYubm9kZV9ob3N0ID0ge30KLSAgICAgICAgICAoX2t0eXBlMzQ4LCBfdnR5cGUzNDksIF9zaXplMzQ3ICkgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKQotICAgICAgICAgIGZvciBfaTM1MSBpbiB4cmFuZ2UoX3NpemUzNDcpOgotICAgICAgICAgICAgX2tleTM1MiA9IGlwcm90LnJlYWRTdHJpbmcoKS5kZWNvZGUoJ3V0Zi04JykKLSAgICAgICAgICAgIF92YWwzNTMgPSBpcHJvdC5yZWFkU3RyaW5nKCkuZGVjb2RlKCd1dGYtOCcpCi0gICAgICAgICAgICBzZWxmLm5vZGVfaG9zdFtfa2V5MzUyXSA9IF92YWwzNTMKKyAgICAgICAgICAoX2t0eXBlNDc3LCBfdnR5cGU0NzgsIF9zaXplNDc2ICkgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKQorICAgICAgICAgIGZvciBfaTQ4MCBpbiB4cmFuZ2UoX3NpemU0NzYpOgorICAgICAgICAgICAgX2tleTQ4MSA9IGlwcm90LnJlYWRTdHJpbmcoKS5kZWNvZGUoJ3V0Zi04JykKKyAgICAgICAgICAgIF92YWw0ODIgPSBpcHJvdC5yZWFkU3RyaW5nKCkuZGVjb2RlKCd1dGYtOCcpCisgICAgICAgICAgICBzZWxmLm5vZGVfaG9zdFtfa2V5NDgxXSA9IF92YWw0ODIKICAgICAgICAgICBpcHJvdC5yZWFkTWFwRW5kKCkKICAgICAgICAgZWxzZToKICAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQogICAgICAgZWxpZiBmaWQgPT0gMzoKICAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuTUFQOgogICAgICAgICAgIHNlbGYuZXhlY3V0b3Jfbm9kZV9wb3J0ID0ge30KLSAgICAgICAgICAoX2t0eXBlMzU1LCBfdnR5cGUzNTYsIF9zaXplMzU0ICkgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKQotICAgICAgICAgIGZvciBfaTM1OCBpbiB4cmFuZ2UoX3NpemUzNTQpOgotICAgICAgICAgICAgX2tleTM1OSA9IFtdCi0gICAgICAgICAgICAoX2V0eXBlMzY0LCBfc2l6ZTM2MSkgPSBpcHJvdC5yZWFkTGlzdEJlZ2luKCkKLSAgICAgICAgICAgIGZvciBfaTM2NSBpbiB4cmFuZ2UoX3NpemUzNjEpOgotICAgICAgICAgICAgICBfZWxlbTM2NiA9IGlwcm90LnJlYWRJNjQoKTsKLSAgICAgICAgICAgICAgX2tleTM1OS5hcHBlbmQoX2VsZW0zNjYpCisgICAgICAgICAgKF9rdHlwZTQ4NCwgX3Z0eXBlNDg1LCBfc2l6ZTQ4MyApID0gaXByb3QucmVhZE1hcEJlZ2luKCkKKyAgICAgICAgICBmb3IgX2k0ODcgaW4geHJhbmdlKF9zaXplNDgzKToKKyAgICAgICAgICAgIF9rZXk0ODggPSBbXQorICAgICAgICAgICAgKF9ldHlwZTQ5MywgX3NpemU0OTApID0gaXByb3QucmVhZExpc3RCZWdpbigpCisgICAgICAgICAgICBmb3IgX2k0OTQgaW4geHJhbmdlKF9zaXplNDkwKToKKyAgICAgICAgICAgICAgX2VsZW00OTUgPSBpcHJvdC5yZWFkSTY0KCkKKyAgICAgICAgICAgICAgX2tleTQ4OC5hcHBlbmQoX2VsZW00OTUpCiAgICAgICAgICAgICBpcHJvdC5yZWFkTGlzdEVuZCgpCi0gICAgICAgICAgICBfdmFsMzYwID0gTm9kZUluZm8oKQotICAgICAgICAgICAgX3ZhbDM2MC5yZWFkKGlwcm90KQotICAgICAgICAgICAgc2VsZi5leGVjdXRvcl9ub2RlX3BvcnRbX2tleTM1OV0gPSBfdmFsMzYwCisgICAgICAgICAgICBfdmFsNDg5ID0gTm9kZUluZm8oKQorICAgICAgICAgICAgX3ZhbDQ4OS5yZWFkKGlwcm90KQorICAgICAgICAgICAgc2VsZi5leGVjdXRvcl9ub2RlX3BvcnRbX2tleTQ4OF0gPSBfdmFsNDg5CiAgICAgICAgICAgaXByb3QucmVhZE1hcEVuZCgpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKICAgICAgIGVsaWYgZmlkID09IDQ6CiAgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLk1BUDoKICAgICAgICAgICBzZWxmLmV4ZWN1dG9yX3N0YXJ0X3RpbWVfc2VjcyA9IHt9Ci0gICAgICAgICAgKF9rdHlwZTM2OCwgX3Z0eXBlMzY5LCBfc2l6ZTM2NyApID0gaXByb3QucmVhZE1hcEJlZ2luKCkKLSAgICAgICAgICBmb3IgX2kzNzEgaW4geHJhbmdlKF9zaXplMzY3KToKLSAgICAgICAgICAgIF9rZXkzNzIgPSBbXQotICAgICAgICAgICAgKF9ldHlwZTM3NywgX3NpemUzNzQpID0gaXByb3QucmVhZExpc3RCZWdpbigpCi0gICAgICAgICAgICBmb3IgX2kzNzggaW4geHJhbmdlKF9zaXplMzc0KToKLSAgICAgICAgICAgICAgX2VsZW0zNzkgPSBpcHJvdC5yZWFkSTY0KCk7Ci0gICAgICAgICAgICAgIF9rZXkzNzIuYXBwZW5kKF9lbGVtMzc5KQorICAgICAgICAgIChfa3R5cGU0OTcsIF92dHlwZTQ5OCwgX3NpemU0OTYgKSA9IGlwcm90LnJlYWRNYXBCZWdpbigpCisgICAgICAgICAgZm9yIF9pNTAwIGluIHhyYW5nZShfc2l6ZTQ5Nik6CisgICAgICAgICAgICBfa2V5NTAxID0gW10KKyAgICAgICAgICAgIChfZXR5cGU1MDYsIF9zaXplNTAzKSA9IGlwcm90LnJlYWRMaXN0QmVnaW4oKQorICAgICAgICAgICAgZm9yIF9pNTA3IGluIHhyYW5nZShfc2l6ZTUwMyk6CisgICAgICAgICAgICAgIF9lbGVtNTA4ID0gaXByb3QucmVhZEk2NCgpCisgICAgICAgICAgICAgIF9rZXk1MDEuYXBwZW5kKF9lbGVtNTA4KQogICAgICAgICAgICAgaXByb3QucmVhZExpc3RFbmQoKQotICAgICAgICAgICAgX3ZhbDM3MyA9IGlwcm90LnJlYWRJNjQoKTsKLSAgICAgICAgICAgIHNlbGYuZXhlY3V0b3Jfc3RhcnRfdGltZV9zZWNzW19rZXkzNzJdID0gX3ZhbDM3MworICAgICAgICAgICAgX3ZhbDUwMiA9IGlwcm90LnJlYWRJNjQoKQorICAgICAgICAgICAgc2VsZi5leGVjdXRvcl9zdGFydF90aW1lX3NlY3NbX2tleTUwMV0gPSBfdmFsNTAyCisgICAgICAgICAgaXByb3QucmVhZE1hcEVuZCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgIGVsaWYgZmlkID09IDU6CisgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLk1BUDoKKyAgICAgICAgICBzZWxmLndvcmtlcl9yZXNvdXJjZXMgPSB7fQorICAgICAgICAgIChfa3R5cGU1MTAsIF92dHlwZTUxMSwgX3NpemU1MDkgKSA9IGlwcm90LnJlYWRNYXBCZWdpbigpCisgICAgICAgICAgZm9yIF9pNTEzIGluIHhyYW5nZShfc2l6ZTUwOSk6CisgICAgICAgICAgICBfa2V5NTE0ID0gTm9kZUluZm8oKQorICAgICAgICAgICAgX2tleTUxNC5yZWFkKGlwcm90KQorICAgICAgICAgICAgX3ZhbDUxNSA9IFdvcmtlclJlc291cmNlcygpCisgICAgICAgICAgICBfdmFsNTE1LnJlYWQoaXByb3QpCisgICAgICAgICAgICBzZWxmLndvcmtlcl9yZXNvdXJjZXNbX2tleTUxNF0gPSBfdmFsNTE1CiAgICAgICAgICAgaXByb3QucmVhZE1hcEVuZCgpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKQEAgLTUyMzMsMzEgKzc2MzAsMzkgQEAKICAgICBpZiBzZWxmLm5vZGVfaG9zdCBpcyBub3QgTm9uZToKICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbignbm9kZV9ob3N0JywgVFR5cGUuTUFQLCAyKQogICAgICAgb3Byb3Qud3JpdGVNYXBCZWdpbihUVHlwZS5TVFJJTkcsIFRUeXBlLlNUUklORywgbGVuKHNlbGYubm9kZV9ob3N0KSkKLSAgICAgIGZvciBraXRlcjM4MCx2aXRlcjM4MSBpbiBzZWxmLm5vZGVfaG9zdC5pdGVtcygpOgotICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhraXRlcjM4MC5lbmNvZGUoJ3V0Zi04JykpCi0gICAgICAgIG9wcm90LndyaXRlU3RyaW5nKHZpdGVyMzgxLmVuY29kZSgndXRmLTgnKSkKKyAgICAgIGZvciBraXRlcjUxNix2aXRlcjUxNyBpbiBzZWxmLm5vZGVfaG9zdC5pdGVtcygpOgorICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhraXRlcjUxNi5lbmNvZGUoJ3V0Zi04JykpCisgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKHZpdGVyNTE3LmVuY29kZSgndXRmLTgnKSkKICAgICAgIG9wcm90LndyaXRlTWFwRW5kKCkKICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKQogICAgIGlmIHNlbGYuZXhlY3V0b3Jfbm9kZV9wb3J0IGlzIG5vdCBOb25lOgogICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCdleGVjdXRvcl9ub2RlX3BvcnQnLCBUVHlwZS5NQVAsIDMpCiAgICAgICBvcHJvdC53cml0ZU1hcEJlZ2luKFRUeXBlLkxJU1QsIFRUeXBlLlNUUlVDVCwgbGVuKHNlbGYuZXhlY3V0b3Jfbm9kZV9wb3J0KSkKLSAgICAgIGZvciBraXRlcjM4Mix2aXRlcjM4MyBpbiBzZWxmLmV4ZWN1dG9yX25vZGVfcG9ydC5pdGVtcygpOgotICAgICAgICBvcHJvdC53cml0ZUxpc3RCZWdpbihUVHlwZS5JNjQsIGxlbihraXRlcjM4MikpCi0gICAgICAgIGZvciBpdGVyMzg0IGluIGtpdGVyMzgyOgotICAgICAgICAgIG9wcm90LndyaXRlSTY0KGl0ZXIzODQpCisgICAgICBmb3Iga2l0ZXI1MTgsdml0ZXI1MTkgaW4gc2VsZi5leGVjdXRvcl9ub2RlX3BvcnQuaXRlbXMoKToKKyAgICAgICAgb3Byb3Qud3JpdGVMaXN0QmVnaW4oVFR5cGUuSTY0LCBsZW4oa2l0ZXI1MTgpKQorICAgICAgICBmb3IgaXRlcjUyMCBpbiBraXRlcjUxODoKKyAgICAgICAgICBvcHJvdC53cml0ZUk2NChpdGVyNTIwKQogICAgICAgICBvcHJvdC53cml0ZUxpc3RFbmQoKQotICAgICAgICB2aXRlcjM4My53cml0ZShvcHJvdCkKKyAgICAgICAgdml0ZXI1MTkud3JpdGUob3Byb3QpCiAgICAgICBvcHJvdC53cml0ZU1hcEVuZCgpCiAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKICAgICBpZiBzZWxmLmV4ZWN1dG9yX3N0YXJ0X3RpbWVfc2VjcyBpcyBub3QgTm9uZToKICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbignZXhlY3V0b3Jfc3RhcnRfdGltZV9zZWNzJywgVFR5cGUuTUFQLCA0KQogICAgICAgb3Byb3Qud3JpdGVNYXBCZWdpbihUVHlwZS5MSVNULCBUVHlwZS5JNjQsIGxlbihzZWxmLmV4ZWN1dG9yX3N0YXJ0X3RpbWVfc2VjcykpCi0gICAgICBmb3Iga2l0ZXIzODUsdml0ZXIzODYgaW4gc2VsZi5leGVjdXRvcl9zdGFydF90aW1lX3NlY3MuaXRlbXMoKToKLSAgICAgICAgb3Byb3Qud3JpdGVMaXN0QmVnaW4oVFR5cGUuSTY0LCBsZW4oa2l0ZXIzODUpKQotICAgICAgICBmb3IgaXRlcjM4NyBpbiBraXRlcjM4NToKLSAgICAgICAgICBvcHJvdC53cml0ZUk2NChpdGVyMzg3KQorICAgICAgZm9yIGtpdGVyNTIxLHZpdGVyNTIyIGluIHNlbGYuZXhlY3V0b3Jfc3RhcnRfdGltZV9zZWNzLml0ZW1zKCk6CisgICAgICAgIG9wcm90LndyaXRlTGlzdEJlZ2luKFRUeXBlLkk2NCwgbGVuKGtpdGVyNTIxKSkKKyAgICAgICAgZm9yIGl0ZXI1MjMgaW4ga2l0ZXI1MjE6CisgICAgICAgICAgb3Byb3Qud3JpdGVJNjQoaXRlcjUyMykKICAgICAgICAgb3Byb3Qud3JpdGVMaXN0RW5kKCkKLSAgICAgICAgb3Byb3Qud3JpdGVJNjQodml0ZXIzODYpCisgICAgICAgIG9wcm90LndyaXRlSTY0KHZpdGVyNTIyKQorICAgICAgb3Byb3Qud3JpdGVNYXBFbmQoKQorICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCisgICAgaWYgc2VsZi53b3JrZXJfcmVzb3VyY2VzIGlzIG5vdCBOb25lOgorICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCd3b3JrZXJfcmVzb3VyY2VzJywgVFR5cGUuTUFQLCA1KQorICAgICAgb3Byb3Qud3JpdGVNYXBCZWdpbihUVHlwZS5TVFJVQ1QsIFRUeXBlLlNUUlVDVCwgbGVuKHNlbGYud29ya2VyX3Jlc291cmNlcykpCisgICAgICBmb3Iga2l0ZXI1MjQsdml0ZXI1MjUgaW4gc2VsZi53b3JrZXJfcmVzb3VyY2VzLml0ZW1zKCk6CisgICAgICAgIGtpdGVyNTI0LndyaXRlKG9wcm90KQorICAgICAgICB2aXRlcjUyNS53cml0ZShvcHJvdCkKICAgICAgIG9wcm90LndyaXRlTWFwRW5kKCkKICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKQogICAgIG9wcm90LndyaXRlRmllbGRTdG9wKCkKQEAgLTUyNzUsNiArNzY4MCw3IEBACiAgICAgdmFsdWUgPSAodmFsdWUgKiAzMSkgXiBoYXNoKHNlbGYubm9kZV9ob3N0KQogICAgIHZhbHVlID0gKHZhbHVlICogMzEpIF4gaGFzaChzZWxmLmV4ZWN1dG9yX25vZGVfcG9ydCkKICAgICB2YWx1ZSA9ICh2YWx1ZSAqIDMxKSBeIGhhc2goc2VsZi5leGVjdXRvcl9zdGFydF90aW1lX3NlY3MpCisgICAgdmFsdWUgPSAodmFsdWUgKiAzMSkgXiBoYXNoKHNlbGYud29ya2VyX3Jlc291cmNlcykKICAgICByZXR1cm4gdmFsdWUKIAogICBkZWYgX19yZXByX18oc2VsZik6CkBAIC01NDIyLDI4ICs3ODI4LDI4IEBACiAgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKICAgICAgIGVsaWYgZmlkID09IDI6CiAgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLkkzMjoKLSAgICAgICAgICBzZWxmLnN0YXR1cyA9IGlwcm90LnJlYWRJMzIoKTsKKyAgICAgICAgICBzZWxmLnN0YXR1cyA9IGlwcm90LnJlYWRJMzIoKQogICAgICAgICBlbHNlOgogICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCiAgICAgICBlbGlmIGZpZCA9PSAzOgogICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5JMzI6Ci0gICAgICAgICAgc2VsZi5udW1fd29ya2VycyA9IGlwcm90LnJlYWRJMzIoKTsKKyAgICAgICAgICBzZWxmLm51bV93b3JrZXJzID0gaXByb3QucmVhZEkzMigpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKICAgICAgIGVsaWYgZmlkID09IDQ6CiAgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLk1BUDoKICAgICAgICAgICBzZWxmLmNvbXBvbmVudF9leGVjdXRvcnMgPSB7fQotICAgICAgICAgIChfa3R5cGUzODksIF92dHlwZTM5MCwgX3NpemUzODggKSA9IGlwcm90LnJlYWRNYXBCZWdpbigpCi0gICAgICAgICAgZm9yIF9pMzkyIGluIHhyYW5nZShfc2l6ZTM4OCk6Ci0gICAgICAgICAgICBfa2V5MzkzID0gaXByb3QucmVhZFN0cmluZygpLmRlY29kZSgndXRmLTgnKQotICAgICAgICAgICAgX3ZhbDM5NCA9IGlwcm90LnJlYWRJMzIoKTsKLSAgICAgICAgICAgIHNlbGYuY29tcG9uZW50X2V4ZWN1dG9yc1tfa2V5MzkzXSA9IF92YWwzOTQKKyAgICAgICAgICAoX2t0eXBlNTI3LCBfdnR5cGU1MjgsIF9zaXplNTI2ICkgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKQorICAgICAgICAgIGZvciBfaTUzMCBpbiB4cmFuZ2UoX3NpemU1MjYpOgorICAgICAgICAgICAgX2tleTUzMSA9IGlwcm90LnJlYWRTdHJpbmcoKS5kZWNvZGUoJ3V0Zi04JykKKyAgICAgICAgICAgIF92YWw1MzIgPSBpcHJvdC5yZWFkSTMyKCkKKyAgICAgICAgICAgIHNlbGYuY29tcG9uZW50X2V4ZWN1dG9yc1tfa2V5NTMxXSA9IF92YWw1MzIKICAgICAgICAgICBpcHJvdC5yZWFkTWFwRW5kKCkKICAgICAgICAgZWxzZToKICAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQogICAgICAgZWxpZiBmaWQgPT0gNToKICAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuSTMyOgotICAgICAgICAgIHNlbGYubGF1bmNoX3RpbWVfc2VjcyA9IGlwcm90LnJlYWRJMzIoKTsKKyAgICAgICAgICBzZWxmLmxhdW5jaF90aW1lX3NlY3MgPSBpcHJvdC5yZWFkSTMyKCkKICAgICAgICAgZWxzZToKICAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQogICAgICAgZWxpZiBmaWQgPT0gNjoKQEAgLTU0NTksMTggKzc4NjUsMTggQEAKICAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQogICAgICAgZWxpZiBmaWQgPT0gODoKICAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuSTMyOgotICAgICAgICAgIHNlbGYucHJldl9zdGF0dXMgPSBpcHJvdC5yZWFkSTMyKCk7CisgICAgICAgICAgc2VsZi5wcmV2X3N0YXR1cyA9IGlwcm90LnJlYWRJMzIoKQogICAgICAgICBlbHNlOgogICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCiAgICAgICBlbGlmIGZpZCA9PSA5OgogICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5NQVA6CiAgICAgICAgICAgc2VsZi5jb21wb25lbnRfZGVidWcgPSB7fQotICAgICAgICAgIChfa3R5cGUzOTYsIF92dHlwZTM5NywgX3NpemUzOTUgKSA9IGlwcm90LnJlYWRNYXBCZWdpbigpCi0gICAgICAgICAgZm9yIF9pMzk5IGluIHhyYW5nZShfc2l6ZTM5NSk6Ci0gICAgICAgICAgICBfa2V5NDAwID0gaXByb3QucmVhZFN0cmluZygpLmRlY29kZSgndXRmLTgnKQotICAgICAgICAgICAgX3ZhbDQwMSA9IERlYnVnT3B0aW9ucygpCi0gICAgICAgICAgICBfdmFsNDAxLnJlYWQoaXByb3QpCi0gICAgICAgICAgICBzZWxmLmNvbXBvbmVudF9kZWJ1Z1tfa2V5NDAwXSA9IF92YWw0MDEKKyAgICAgICAgICAoX2t0eXBlNTM0LCBfdnR5cGU1MzUsIF9zaXplNTMzICkgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKQorICAgICAgICAgIGZvciBfaTUzNyBpbiB4cmFuZ2UoX3NpemU1MzMpOgorICAgICAgICAgICAgX2tleTUzOCA9IGlwcm90LnJlYWRTdHJpbmcoKS5kZWNvZGUoJ3V0Zi04JykKKyAgICAgICAgICAgIF92YWw1MzkgPSBEZWJ1Z09wdGlvbnMoKQorICAgICAgICAgICAgX3ZhbDUzOS5yZWFkKGlwcm90KQorICAgICAgICAgICAgc2VsZi5jb21wb25lbnRfZGVidWdbX2tleTUzOF0gPSBfdmFsNTM5CiAgICAgICAgICAgaXByb3QucmVhZE1hcEVuZCgpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKQEAgLTU0OTksOSArNzkwNSw5IEBACiAgICAgaWYgc2VsZi5jb21wb25lbnRfZXhlY3V0b3JzIGlzIG5vdCBOb25lOgogICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCdjb21wb25lbnRfZXhlY3V0b3JzJywgVFR5cGUuTUFQLCA0KQogICAgICAgb3Byb3Qud3JpdGVNYXBCZWdpbihUVHlwZS5TVFJJTkcsIFRUeXBlLkkzMiwgbGVuKHNlbGYuY29tcG9uZW50X2V4ZWN1dG9ycykpCi0gICAgICBmb3Iga2l0ZXI0MDIsdml0ZXI0MDMgaW4gc2VsZi5jb21wb25lbnRfZXhlY3V0b3JzLml0ZW1zKCk6Ci0gICAgICAgIG9wcm90LndyaXRlU3RyaW5nKGtpdGVyNDAyLmVuY29kZSgndXRmLTgnKSkKLSAgICAgICAgb3Byb3Qud3JpdGVJMzIodml0ZXI0MDMpCisgICAgICBmb3Iga2l0ZXI1NDAsdml0ZXI1NDEgaW4gc2VsZi5jb21wb25lbnRfZXhlY3V0b3JzLml0ZW1zKCk6CisgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKGtpdGVyNTQwLmVuY29kZSgndXRmLTgnKSkKKyAgICAgICAgb3Byb3Qud3JpdGVJMzIodml0ZXI1NDEpCiAgICAgICBvcHJvdC53cml0ZU1hcEVuZCgpCiAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKICAgICBpZiBzZWxmLmxhdW5jaF90aW1lX3NlY3MgaXMgbm90IE5vbmU6CkBAIC01NTIzLDkgKzc5MjksOSBAQAogICAgIGlmIHNlbGYuY29tcG9uZW50X2RlYnVnIGlzIG5vdCBOb25lOgogICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCdjb21wb25lbnRfZGVidWcnLCBUVHlwZS5NQVAsIDkpCiAgICAgICBvcHJvdC53cml0ZU1hcEJlZ2luKFRUeXBlLlNUUklORywgVFR5cGUuU1RSVUNULCBsZW4oc2VsZi5jb21wb25lbnRfZGVidWcpKQotICAgICAgZm9yIGtpdGVyNDA0LHZpdGVyNDA1IGluIHNlbGYuY29tcG9uZW50X2RlYnVnLml0ZW1zKCk6Ci0gICAgICAgIG9wcm90LndyaXRlU3RyaW5nKGtpdGVyNDA0LmVuY29kZSgndXRmLTgnKSkKLSAgICAgICAgdml0ZXI0MDUud3JpdGUob3Byb3QpCisgICAgICBmb3Iga2l0ZXI1NDIsdml0ZXI1NDMgaW4gc2VsZi5jb21wb25lbnRfZGVidWcuaXRlbXMoKToKKyAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoa2l0ZXI1NDIuZW5jb2RlKCd1dGYtOCcpKQorICAgICAgICB2aXRlcjU0My53cml0ZShvcHJvdCkKICAgICAgIG9wcm90LndyaXRlTWFwRW5kKCkKICAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKQogICAgIG9wcm90LndyaXRlRmllbGRTdG9wKCkKQEAgLTU2MDUsMjQgKzgwMTEsMjQgQEAKICAgICAgIGVsaWYgZmlkID09IDI6CiAgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLk1BUDoKICAgICAgICAgICBzZWxmLmV4ZWN1dG9yX3N0YXRzID0ge30KLSAgICAgICAgICAoX2t0eXBlNDA3LCBfdnR5cGU0MDgsIF9zaXplNDA2ICkgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKQotICAgICAgICAgIGZvciBfaTQxMCBpbiB4cmFuZ2UoX3NpemU0MDYpOgotICAgICAgICAgICAgX2tleTQxMSA9IEV4ZWN1dG9ySW5mbygpCi0gICAgICAgICAgICBfa2V5NDExLnJlYWQoaXByb3QpCi0gICAgICAgICAgICBfdmFsNDEyID0gRXhlY3V0b3JTdGF0cygpCi0gICAgICAgICAgICBfdmFsNDEyLnJlYWQoaXByb3QpCi0gICAgICAgICAgICBzZWxmLmV4ZWN1dG9yX3N0YXRzW19rZXk0MTFdID0gX3ZhbDQxMgorICAgICAgICAgIChfa3R5cGU1NDUsIF92dHlwZTU0NiwgX3NpemU1NDQgKSA9IGlwcm90LnJlYWRNYXBCZWdpbigpCisgICAgICAgICAgZm9yIF9pNTQ4IGluIHhyYW5nZShfc2l6ZTU0NCk6CisgICAgICAgICAgICBfa2V5NTQ5ID0gRXhlY3V0b3JJbmZvKCkKKyAgICAgICAgICAgIF9rZXk1NDkucmVhZChpcHJvdCkKKyAgICAgICAgICAgIF92YWw1NTAgPSBFeGVjdXRvclN0YXRzKCkKKyAgICAgICAgICAgIF92YWw1NTAucmVhZChpcHJvdCkKKyAgICAgICAgICAgIHNlbGYuZXhlY3V0b3Jfc3RhdHNbX2tleTU0OV0gPSBfdmFsNTUwCiAgICAgICAgICAgaXByb3QucmVhZE1hcEVuZCgpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKICAgICAgIGVsaWYgZmlkID09IDM6CiAgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLkkzMjoKLSAgICAgICAgICBzZWxmLnRpbWVfc2VjcyA9IGlwcm90LnJlYWRJMzIoKTsKKyAgICAgICAgICBzZWxmLnRpbWVfc2VjcyA9IGlwcm90LnJlYWRJMzIoKQogICAgICAgICBlbHNlOgogICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCiAgICAgICBlbGlmIGZpZCA9PSA0OgogICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5JMzI6Ci0gICAgICAgICAgc2VsZi51cHRpbWVfc2VjcyA9IGlwcm90LnJlYWRJMzIoKTsKKyAgICAgICAgICBzZWxmLnVwdGltZV9zZWNzID0gaXByb3QucmVhZEkzMigpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKICAgICAgIGVsc2U6CkBAIC01NjQyLDkgKzgwNDgsOSBAQAogICAgIGlmIHNlbGYuZXhlY3V0b3Jfc3RhdHMgaXMgbm90IE5vbmU6CiAgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ2V4ZWN1dG9yX3N0YXRzJywgVFR5cGUuTUFQLCAyKQogICAgICAgb3Byb3Qud3JpdGVNYXBCZWdpbihUVHlwZS5TVFJVQ1QsIFRUeXBlLlNUUlVDVCwgbGVuKHNlbGYuZXhlY3V0b3Jfc3RhdHMpKQotICAgICAgZm9yIGtpdGVyNDEzLHZpdGVyNDE0IGluIHNlbGYuZXhlY3V0b3Jfc3RhdHMuaXRlbXMoKToKLSAgICAgICAga2l0ZXI0MTMud3JpdGUob3Byb3QpCi0gICAgICAgIHZpdGVyNDE0LndyaXRlKG9wcm90KQorICAgICAgZm9yIGtpdGVyNTUxLHZpdGVyNTUyIGluIHNlbGYuZXhlY3V0b3Jfc3RhdHMuaXRlbXMoKToKKyAgICAgICAga2l0ZXI1NTEud3JpdGUob3Byb3QpCisgICAgICAgIHZpdGVyNTUyLndyaXRlKG9wcm90KQogICAgICAgb3Byb3Qud3JpdGVNYXBFbmQoKQogICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCiAgICAgaWYgc2VsZi50aW1lX3NlY3MgaXMgbm90IE5vbmU6CkBAIC01NzIyLDcgKzgxMjgsNyBAQAogICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCiAgICAgICBlbGlmIGZpZCA9PSAyOgogICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5TVFJJTkc6Ci0gICAgICAgICAgc2VsZi5iaXRzID0gaXByb3QucmVhZFN0cmluZygpOworICAgICAgICAgIHNlbGYuYml0cyA9IGlwcm90LnJlYWRTdHJpbmcoKQogICAgICAgICBlbHNlOgogICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCiAgICAgICBlbHNlOgpAQCAtNTc5NywxMiArODIwMywxMiBAQAogICAgICAgaWYgZmlkID09IDE6CiAgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLk1BUDoKICAgICAgICAgICBzZWxmLnNlcmlhbGl6ZWRfcGFydHMgPSB7fQotICAgICAgICAgIChfa3R5cGU0MTYsIF92dHlwZTQxNywgX3NpemU0MTUgKSA9IGlwcm90LnJlYWRNYXBCZWdpbigpCi0gICAgICAgICAgZm9yIF9pNDE5IGluIHhyYW5nZShfc2l6ZTQxNSk6Ci0gICAgICAgICAgICBfa2V5NDIwID0gaXByb3QucmVhZFN0cmluZygpLmRlY29kZSgndXRmLTgnKQotICAgICAgICAgICAgX3ZhbDQyMSA9IFRocmlmdFNlcmlhbGl6ZWRPYmplY3QoKQotICAgICAgICAgICAgX3ZhbDQyMS5yZWFkKGlwcm90KQotICAgICAgICAgICAgc2VsZi5zZXJpYWxpemVkX3BhcnRzW19rZXk0MjBdID0gX3ZhbDQyMQorICAgICAgICAgIChfa3R5cGU1NTQsIF92dHlwZTU1NSwgX3NpemU1NTMgKSA9IGlwcm90LnJlYWRNYXBCZWdpbigpCisgICAgICAgICAgZm9yIF9pNTU3IGluIHhyYW5nZShfc2l6ZTU1Myk6CisgICAgICAgICAgICBfa2V5NTU4ID0gaXByb3QucmVhZFN0cmluZygpLmRlY29kZSgndXRmLTgnKQorICAgICAgICAgICAgX3ZhbDU1OSA9IFRocmlmdFNlcmlhbGl6ZWRPYmplY3QoKQorICAgICAgICAgICAgX3ZhbDU1OS5yZWFkKGlwcm90KQorICAgICAgICAgICAgc2VsZi5zZXJpYWxpemVkX3BhcnRzW19rZXk1NThdID0gX3ZhbDU1OQogICAgICAgICAgIGlwcm90LnJlYWRNYXBFbmQoKQogICAgICAgICBlbHNlOgogICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCkBAIC01ODE5LDkgKzgyMjUsOSBAQAogICAgIGlmIHNlbGYuc2VyaWFsaXplZF9wYXJ0cyBpcyBub3QgTm9uZToKICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbignc2VyaWFsaXplZF9wYXJ0cycsIFRUeXBlLk1BUCwgMSkKICAgICAgIG9wcm90LndyaXRlTWFwQmVnaW4oVFR5cGUuU1RSSU5HLCBUVHlwZS5TVFJVQ1QsIGxlbihzZWxmLnNlcmlhbGl6ZWRfcGFydHMpKQotICAgICAgZm9yIGtpdGVyNDIyLHZpdGVyNDIzIGluIHNlbGYuc2VyaWFsaXplZF9wYXJ0cy5pdGVtcygpOgotICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhraXRlcjQyMi5lbmNvZGUoJ3V0Zi04JykpCi0gICAgICAgIHZpdGVyNDIzLndyaXRlKG9wcm90KQorICAgICAgZm9yIGtpdGVyNTYwLHZpdGVyNTYxIGluIHNlbGYuc2VyaWFsaXplZF9wYXJ0cy5pdGVtcygpOgorICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhraXRlcjU2MC5lbmNvZGUoJ3V0Zi04JykpCisgICAgICAgIHZpdGVyNTYxLndyaXRlKG9wcm90KQogICAgICAgb3Byb3Qud3JpdGVNYXBFbmQoKQogICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCiAgICAgb3Byb3Qud3JpdGVGaWVsZFN0b3AoKQpAQCAtNTg1NCwxNyArODI2MCwyMCBAQAogICBBdHRyaWJ1dGVzOgogICAgLSB0b3BvbG9neV9pZAogICAgLSBleGVjdXRvcnMKKyAgIC0gcmVzb3VyY2VzCiAgICIiIgogCiAgIHRocmlmdF9zcGVjID0gKAogICAgIE5vbmUsICMgMAogICAgICgxLCBUVHlwZS5TVFJJTkcsICd0b3BvbG9neV9pZCcsIE5vbmUsIE5vbmUsICksICMgMQogICAgICgyLCBUVHlwZS5MSVNULCAnZXhlY3V0b3JzJywgKFRUeXBlLlNUUlVDVCwoRXhlY3V0b3JJbmZvLCBFeGVjdXRvckluZm8udGhyaWZ0X3NwZWMpKSwgTm9uZSwgKSwgIyAyCisgICAgKDMsIFRUeXBlLlNUUlVDVCwgJ3Jlc291cmNlcycsIChXb3JrZXJSZXNvdXJjZXMsIFdvcmtlclJlc291cmNlcy50aHJpZnRfc3BlYyksIE5vbmUsICksICMgMwogICApCiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsIHRvcG9sb2d5X2lkPU5vbmUsIGV4ZWN1dG9ycz1Ob25lLCk6CisgIGRlZiBfX2luaXRfXyhzZWxmLCB0b3BvbG9neV9pZD1Ob25lLCBleGVjdXRvcnM9Tm9uZSwgcmVzb3VyY2VzPU5vbmUsKToKICAgICBzZWxmLnRvcG9sb2d5X2lkID0gdG9wb2xvZ3lfaWQKICAgICBzZWxmLmV4ZWN1dG9ycyA9IGV4ZWN1dG9ycworICAgIHNlbGYucmVzb3VyY2VzID0gcmVzb3VyY2VzCiAKICAgZGVmIHJlYWQoc2VsZiwgaXByb3QpOgogICAgIGlmIGlwcm90Ll9fY2xhc3NfXyA9PSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgYW5kIGlzaW5zdGFuY2UoaXByb3QudHJhbnMsIFRUcmFuc3BvcnQuQ1JlYWRhYmxlVHJhbnNwb3J0KSBhbmQgc2VsZi50aHJpZnRfc3BlYyBpcyBub3QgTm9uZSBhbmQgZmFzdGJpbmFyeSBpcyBub3QgTm9uZToKQEAgLTU4ODMsMTQgKzgyOTIsMjAgQEAKICAgICAgIGVsaWYgZmlkID09IDI6CiAgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLkxJU1Q6CiAgICAgICAgICAgc2VsZi5leGVjdXRvcnMgPSBbXQotICAgICAgICAgIChfZXR5cGU0MjcsIF9zaXplNDI0KSA9IGlwcm90LnJlYWRMaXN0QmVnaW4oKQotICAgICAgICAgIGZvciBfaTQyOCBpbiB4cmFuZ2UoX3NpemU0MjQpOgotICAgICAgICAgICAgX2VsZW00MjkgPSBFeGVjdXRvckluZm8oKQotICAgICAgICAgICAgX2VsZW00MjkucmVhZChpcHJvdCkKLSAgICAgICAgICAgIHNlbGYuZXhlY3V0b3JzLmFwcGVuZChfZWxlbTQyOSkKKyAgICAgICAgICAoX2V0eXBlNTY1LCBfc2l6ZTU2MikgPSBpcHJvdC5yZWFkTGlzdEJlZ2luKCkKKyAgICAgICAgICBmb3IgX2k1NjYgaW4geHJhbmdlKF9zaXplNTYyKToKKyAgICAgICAgICAgIF9lbGVtNTY3ID0gRXhlY3V0b3JJbmZvKCkKKyAgICAgICAgICAgIF9lbGVtNTY3LnJlYWQoaXByb3QpCisgICAgICAgICAgICBzZWxmLmV4ZWN1dG9ycy5hcHBlbmQoX2VsZW01NjcpCiAgICAgICAgICAgaXByb3QucmVhZExpc3RFbmQoKQogICAgICAgICBlbHNlOgogICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBlbGlmIGZpZCA9PSAzOgorICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5TVFJVQ1Q6CisgICAgICAgICAgc2VsZi5yZXNvdXJjZXMgPSBXb3JrZXJSZXNvdXJjZXMoKQorICAgICAgICAgIHNlbGYucmVzb3VyY2VzLnJlYWQoaXByb3QpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKICAgICAgIGVsc2U6CiAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCiAgICAgICBpcHJvdC5yZWFkRmllbGRFbmQoKQpAQCAtNTkwOCwxMCArODMyMywxNCBAQAogICAgIGlmIHNlbGYuZXhlY3V0b3JzIGlzIG5vdCBOb25lOgogICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCdleGVjdXRvcnMnLCBUVHlwZS5MSVNULCAyKQogICAgICAgb3Byb3Qud3JpdGVMaXN0QmVnaW4oVFR5cGUuU1RSVUNULCBsZW4oc2VsZi5leGVjdXRvcnMpKQotICAgICAgZm9yIGl0ZXI0MzAgaW4gc2VsZi5leGVjdXRvcnM6Ci0gICAgICAgIGl0ZXI0MzAud3JpdGUob3Byb3QpCisgICAgICBmb3IgaXRlcjU2OCBpbiBzZWxmLmV4ZWN1dG9yczoKKyAgICAgICAgaXRlcjU2OC53cml0ZShvcHJvdCkKICAgICAgIG9wcm90LndyaXRlTGlzdEVuZCgpCiAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKKyAgICBpZiBzZWxmLnJlc291cmNlcyBpcyBub3QgTm9uZToKKyAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbigncmVzb3VyY2VzJywgVFR5cGUuU1RSVUNULCAzKQorICAgICAgc2VsZi5yZXNvdXJjZXMud3JpdGUob3Byb3QpCisgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKICAgICBvcHJvdC53cml0ZUZpZWxkU3RvcCgpCiAgICAgb3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKQogCkBAIC01OTI3LDYgKzgzNDYsNyBAQAogICAgIHZhbHVlID0gMTcKICAgICB2YWx1ZSA9ICh2YWx1ZSAqIDMxKSBeIGhhc2goc2VsZi50b3BvbG9neV9pZCkKICAgICB2YWx1ZSA9ICh2YWx1ZSAqIDMxKSBeIGhhc2goc2VsZi5leGVjdXRvcnMpCisgICAgdmFsdWUgPSAodmFsdWUgKiAzMSkgXiBoYXNoKHNlbGYucmVzb3VyY2VzKQogICAgIHJldHVybiB2YWx1ZQogCiAgIGRlZiBfX3JlcHJfXyhzZWxmKToKQEAgLTYwMzMsMTEgKzg0NTMsMTEgQEAKICAgICAgIGlmIGZpZCA9PSAxOgogICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5NQVA6CiAgICAgICAgICAgc2VsZi5hcHByb3ZlZF93b3JrZXJzID0ge30KLSAgICAgICAgICAoX2t0eXBlNDMyLCBfdnR5cGU0MzMsIF9zaXplNDMxICkgPSBpcHJvdC5yZWFkTWFwQmVnaW4oKQotICAgICAgICAgIGZvciBfaTQzNSBpbiB4cmFuZ2UoX3NpemU0MzEpOgotICAgICAgICAgICAgX2tleTQzNiA9IGlwcm90LnJlYWRTdHJpbmcoKS5kZWNvZGUoJ3V0Zi04JykKLSAgICAgICAgICAgIF92YWw0MzcgPSBpcHJvdC5yZWFkSTMyKCk7Ci0gICAgICAgICAgICBzZWxmLmFwcHJvdmVkX3dvcmtlcnNbX2tleTQzNl0gPSBfdmFsNDM3CisgICAgICAgICAgKF9rdHlwZTU3MCwgX3Z0eXBlNTcxLCBfc2l6ZTU2OSApID0gaXByb3QucmVhZE1hcEJlZ2luKCkKKyAgICAgICAgICBmb3IgX2k1NzMgaW4geHJhbmdlKF9zaXplNTY5KToKKyAgICAgICAgICAgIF9rZXk1NzQgPSBpcHJvdC5yZWFkU3RyaW5nKCkuZGVjb2RlKCd1dGYtOCcpCisgICAgICAgICAgICBfdmFsNTc1ID0gaXByb3QucmVhZEkzMigpCisgICAgICAgICAgICBzZWxmLmFwcHJvdmVkX3dvcmtlcnNbX2tleTU3NF0gPSBfdmFsNTc1CiAgICAgICAgICAgaXByb3QucmVhZE1hcEVuZCgpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKQEAgLTYwNTQsOSArODQ3NCw5IEBACiAgICAgaWYgc2VsZi5hcHByb3ZlZF93b3JrZXJzIGlzIG5vdCBOb25lOgogICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCdhcHByb3ZlZF93b3JrZXJzJywgVFR5cGUuTUFQLCAxKQogICAgICAgb3Byb3Qud3JpdGVNYXBCZWdpbihUVHlwZS5TVFJJTkcsIFRUeXBlLkkzMiwgbGVuKHNlbGYuYXBwcm92ZWRfd29ya2VycykpCi0gICAgICBmb3Iga2l0ZXI0Mzgsdml0ZXI0MzkgaW4gc2VsZi5hcHByb3ZlZF93b3JrZXJzLml0ZW1zKCk6Ci0gICAgICAgIG9wcm90LndyaXRlU3RyaW5nKGtpdGVyNDM4LmVuY29kZSgndXRmLTgnKSkKLSAgICAgICAgb3Byb3Qud3JpdGVJMzIodml0ZXI0MzkpCisgICAgICBmb3Iga2l0ZXI1NzYsdml0ZXI1NzcgaW4gc2VsZi5hcHByb3ZlZF93b3JrZXJzLml0ZW1zKCk6CisgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKGtpdGVyNTc2LmVuY29kZSgndXRmLTgnKSkKKyAgICAgICAgb3Byb3Qud3JpdGVJMzIodml0ZXI1NzcpCiAgICAgICBvcHJvdC53cml0ZU1hcEVuZCgpCiAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKICAgICBvcHJvdC53cml0ZUZpZWxkU3RvcCgpCkBAIC02MTEwLDEyICs4NTMwLDEyIEBACiAgICAgICBpZiBmaWQgPT0gMToKICAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuTUFQOgogICAgICAgICAgIHNlbGYuYXNzaWdubWVudHMgPSB7fQotICAgICAgICAgIChfa3R5cGU0NDEsIF92dHlwZTQ0MiwgX3NpemU0NDAgKSA9IGlwcm90LnJlYWRNYXBCZWdpbigpCi0gICAgICAgICAgZm9yIF9pNDQ0IGluIHhyYW5nZShfc2l6ZTQ0MCk6Ci0gICAgICAgICAgICBfa2V5NDQ1ID0gaXByb3QucmVhZEkzMigpOwotICAgICAgICAgICAgX3ZhbDQ0NiA9IExvY2FsQXNzaWdubWVudCgpCi0gICAgICAgICAgICBfdmFsNDQ2LnJlYWQoaXByb3QpCi0gICAgICAgICAgICBzZWxmLmFzc2lnbm1lbnRzW19rZXk0NDVdID0gX3ZhbDQ0NgorICAgICAgICAgIChfa3R5cGU1NzksIF92dHlwZTU4MCwgX3NpemU1NzggKSA9IGlwcm90LnJlYWRNYXBCZWdpbigpCisgICAgICAgICAgZm9yIF9pNTgyIGluIHhyYW5nZShfc2l6ZTU3OCk6CisgICAgICAgICAgICBfa2V5NTgzID0gaXByb3QucmVhZEkzMigpCisgICAgICAgICAgICBfdmFsNTg0ID0gTG9jYWxBc3NpZ25tZW50KCkKKyAgICAgICAgICAgIF92YWw1ODQucmVhZChpcHJvdCkKKyAgICAgICAgICAgIHNlbGYuYXNzaWdubWVudHNbX2tleTU4M10gPSBfdmFsNTg0CiAgICAgICAgICAgaXByb3QucmVhZE1hcEVuZCgpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKQEAgLTYxMzIsOSArODU1Miw5IEBACiAgICAgaWYgc2VsZi5hc3NpZ25tZW50cyBpcyBub3QgTm9uZToKICAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbignYXNzaWdubWVudHMnLCBUVHlwZS5NQVAsIDEpCiAgICAgICBvcHJvdC53cml0ZU1hcEJlZ2luKFRUeXBlLkkzMiwgVFR5cGUuU1RSVUNULCBsZW4oc2VsZi5hc3NpZ25tZW50cykpCi0gICAgICBmb3Iga2l0ZXI0NDcsdml0ZXI0NDggaW4gc2VsZi5hc3NpZ25tZW50cy5pdGVtcygpOgotICAgICAgICBvcHJvdC53cml0ZUkzMihraXRlcjQ0NykKLSAgICAgICAgdml0ZXI0NDgud3JpdGUob3Byb3QpCisgICAgICBmb3Iga2l0ZXI1ODUsdml0ZXI1ODYgaW4gc2VsZi5hc3NpZ25tZW50cy5pdGVtcygpOgorICAgICAgICBvcHJvdC53cml0ZUkzMihraXRlcjU4NSkKKyAgICAgICAgdml0ZXI1ODYud3JpdGUob3Byb3QpCiAgICAgICBvcHJvdC53cml0ZU1hcEVuZCgpCiAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKICAgICBvcHJvdC53cml0ZUZpZWxkU3RvcCgpCkBAIC02MTk2LDcgKzg2MTYsNyBAQAogICAgICAgICBicmVhawogICAgICAgaWYgZmlkID09IDE6CiAgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLkkzMjoKLSAgICAgICAgICBzZWxmLnRpbWVfc2VjcyA9IGlwcm90LnJlYWRJMzIoKTsKKyAgICAgICAgICBzZWxmLnRpbWVfc2VjcyA9IGlwcm90LnJlYWRJMzIoKQogICAgICAgICBlbHNlOgogICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCiAgICAgICBlbGlmIGZpZCA9PSAyOgpAQCAtNjIwNywxNyArODYyNywxNyBAQAogICAgICAgZWxpZiBmaWQgPT0gMzoKICAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuTElTVDoKICAgICAgICAgICBzZWxmLmV4ZWN1dG9ycyA9IFtdCi0gICAgICAgICAgKF9ldHlwZTQ1MiwgX3NpemU0NDkpID0gaXByb3QucmVhZExpc3RCZWdpbigpCi0gICAgICAgICAgZm9yIF9pNDUzIGluIHhyYW5nZShfc2l6ZTQ0OSk6Ci0gICAgICAgICAgICBfZWxlbTQ1NCA9IEV4ZWN1dG9ySW5mbygpCi0gICAgICAgICAgICBfZWxlbTQ1NC5yZWFkKGlwcm90KQotICAgICAgICAgICAgc2VsZi5leGVjdXRvcnMuYXBwZW5kKF9lbGVtNDU0KQorICAgICAgICAgIChfZXR5cGU1OTAsIF9zaXplNTg3KSA9IGlwcm90LnJlYWRMaXN0QmVnaW4oKQorICAgICAgICAgIGZvciBfaTU5MSBpbiB4cmFuZ2UoX3NpemU1ODcpOgorICAgICAgICAgICAgX2VsZW01OTIgPSBFeGVjdXRvckluZm8oKQorICAgICAgICAgICAgX2VsZW01OTIucmVhZChpcHJvdCkKKyAgICAgICAgICAgIHNlbGYuZXhlY3V0b3JzLmFwcGVuZChfZWxlbTU5MikKICAgICAgICAgICBpcHJvdC5yZWFkTGlzdEVuZCgpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKICAgICAgIGVsaWYgZmlkID09IDQ6CiAgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLkkzMjoKLSAgICAgICAgICBzZWxmLnBvcnQgPSBpcHJvdC5yZWFkSTMyKCk7CisgICAgICAgICAgc2VsZi5wb3J0ID0gaXByb3QucmVhZEkzMigpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKICAgICAgIGVsc2U6CkBAIC02MjQxLDggKzg2NjEsOCBAQAogICAgIGlmIHNlbGYuZXhlY3V0b3JzIGlzIG5vdCBOb25lOgogICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCdleGVjdXRvcnMnLCBUVHlwZS5MSVNULCAzKQogICAgICAgb3Byb3Qud3JpdGVMaXN0QmVnaW4oVFR5cGUuU1RSVUNULCBsZW4oc2VsZi5leGVjdXRvcnMpKQotICAgICAgZm9yIGl0ZXI0NTUgaW4gc2VsZi5leGVjdXRvcnM6Ci0gICAgICAgIGl0ZXI0NTUud3JpdGUob3Byb3QpCisgICAgICBmb3IgaXRlcjU5MyBpbiBzZWxmLmV4ZWN1dG9yczoKKyAgICAgICAgaXRlcjU5My53cml0ZShvcHJvdCkKICAgICAgIG9wcm90LndyaXRlTGlzdEVuZCgpCiAgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKICAgICBpZiBzZWxmLnBvcnQgaXMgbm90IE5vbmU6CkBAIC02MjgzLDYgKzg3MDMsMzA2IEBACiAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgIHJldHVybiBub3QgKHNlbGYgPT0gb3RoZXIpCiAKK2NsYXNzIExTVG9wb0hpc3Rvcnk6CisgICIiIgorICBBdHRyaWJ1dGVzOgorICAgLSB0b3BvbG9neV9pZAorICAgLSB0aW1lX3N0YW1wCisgICAtIHVzZXJzCisgICAtIGdyb3VwcworICAiIiIKKworICB0aHJpZnRfc3BlYyA9ICgKKyAgICBOb25lLCAjIDAKKyAgICAoMSwgVFR5cGUuU1RSSU5HLCAndG9wb2xvZ3lfaWQnLCBOb25lLCBOb25lLCApLCAjIDEKKyAgICAoMiwgVFR5cGUuSTY0LCAndGltZV9zdGFtcCcsIE5vbmUsIE5vbmUsICksICMgMgorICAgICgzLCBUVHlwZS5MSVNULCAndXNlcnMnLCAoVFR5cGUuU1RSSU5HLE5vbmUpLCBOb25lLCApLCAjIDMKKyAgICAoNCwgVFR5cGUuTElTVCwgJ2dyb3VwcycsIChUVHlwZS5TVFJJTkcsTm9uZSksIE5vbmUsICksICMgNAorICApCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIHRvcG9sb2d5X2lkPU5vbmUsIHRpbWVfc3RhbXA9Tm9uZSwgdXNlcnM9Tm9uZSwgZ3JvdXBzPU5vbmUsKToKKyAgICBzZWxmLnRvcG9sb2d5X2lkID0gdG9wb2xvZ3lfaWQKKyAgICBzZWxmLnRpbWVfc3RhbXAgPSB0aW1lX3N0YW1wCisgICAgc2VsZi51c2VycyA9IHVzZXJzCisgICAgc2VsZi5ncm91cHMgPSBncm91cHMKKworICBkZWYgcmVhZChzZWxmLCBpcHJvdCk6CisgICAgaWYgaXByb3QuX19jbGFzc19fID09IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCBhbmQgaXNpbnN0YW5jZShpcHJvdC50cmFucywgVFRyYW5zcG9ydC5DUmVhZGFibGVUcmFuc3BvcnQpIGFuZCBzZWxmLnRocmlmdF9zcGVjIGlzIG5vdCBOb25lIGFuZCBmYXN0YmluYXJ5IGlzIG5vdCBOb25lOgorICAgICAgZmFzdGJpbmFyeS5kZWNvZGVfYmluYXJ5KHNlbGYsIGlwcm90LnRyYW5zLCAoc2VsZi5fX2NsYXNzX18sIHNlbGYudGhyaWZ0X3NwZWMpKQorICAgICAgcmV0dXJuCisgICAgaXByb3QucmVhZFN0cnVjdEJlZ2luKCkKKyAgICB3aGlsZSBUcnVlOgorICAgICAgKGZuYW1lLCBmdHlwZSwgZmlkKSA9IGlwcm90LnJlYWRGaWVsZEJlZ2luKCkKKyAgICAgIGlmIGZ0eXBlID09IFRUeXBlLlNUT1A6CisgICAgICAgIGJyZWFrCisgICAgICBpZiBmaWQgPT0gMToKKyAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuU1RSSU5HOgorICAgICAgICAgIHNlbGYudG9wb2xvZ3lfaWQgPSBpcHJvdC5yZWFkU3RyaW5nKCkuZGVjb2RlKCd1dGYtOCcpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgIGVsaWYgZmlkID09IDI6CisgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLkk2NDoKKyAgICAgICAgICBzZWxmLnRpbWVfc3RhbXAgPSBpcHJvdC5yZWFkSTY0KCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgZWxpZiBmaWQgPT0gMzoKKyAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuTElTVDoKKyAgICAgICAgICBzZWxmLnVzZXJzID0gW10KKyAgICAgICAgICAoX2V0eXBlNTk3LCBfc2l6ZTU5NCkgPSBpcHJvdC5yZWFkTGlzdEJlZ2luKCkKKyAgICAgICAgICBmb3IgX2k1OTggaW4geHJhbmdlKF9zaXplNTk0KToKKyAgICAgICAgICAgIF9lbGVtNTk5ID0gaXByb3QucmVhZFN0cmluZygpLmRlY29kZSgndXRmLTgnKQorICAgICAgICAgICAgc2VsZi51c2Vycy5hcHBlbmQoX2VsZW01OTkpCisgICAgICAgICAgaXByb3QucmVhZExpc3RFbmQoKQorICAgICAgICBlbHNlOgorICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBlbGlmIGZpZCA9PSA0OgorICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5MSVNUOgorICAgICAgICAgIHNlbGYuZ3JvdXBzID0gW10KKyAgICAgICAgICAoX2V0eXBlNjAzLCBfc2l6ZTYwMCkgPSBpcHJvdC5yZWFkTGlzdEJlZ2luKCkKKyAgICAgICAgICBmb3IgX2k2MDQgaW4geHJhbmdlKF9zaXplNjAwKToKKyAgICAgICAgICAgIF9lbGVtNjA1ID0gaXByb3QucmVhZFN0cmluZygpLmRlY29kZSgndXRmLTgnKQorICAgICAgICAgICAgc2VsZi5ncm91cHMuYXBwZW5kKF9lbGVtNjA1KQorICAgICAgICAgIGlwcm90LnJlYWRMaXN0RW5kKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgZWxzZToKKyAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgIGlwcm90LnJlYWRGaWVsZEVuZCgpCisgICAgaXByb3QucmVhZFN0cnVjdEVuZCgpCisKKyAgZGVmIHdyaXRlKHNlbGYsIG9wcm90KToKKyAgICBpZiBvcHJvdC5fX2NsYXNzX18gPT0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIGFuZCBzZWxmLnRocmlmdF9zcGVjIGlzIG5vdCBOb25lIGFuZCBmYXN0YmluYXJ5IGlzIG5vdCBOb25lOgorICAgICAgb3Byb3QudHJhbnMud3JpdGUoZmFzdGJpbmFyeS5lbmNvZGVfYmluYXJ5KHNlbGYsIChzZWxmLl9fY2xhc3NfXywgc2VsZi50aHJpZnRfc3BlYykpKQorICAgICAgcmV0dXJuCisgICAgb3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbignTFNUb3BvSGlzdG9yeScpCisgICAgaWYgc2VsZi50b3BvbG9neV9pZCBpcyBub3QgTm9uZToKKyAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbigndG9wb2xvZ3lfaWQnLCBUVHlwZS5TVFJJTkcsIDEpCisgICAgICBvcHJvdC53cml0ZVN0cmluZyhzZWxmLnRvcG9sb2d5X2lkLmVuY29kZSgndXRmLTgnKSkKKyAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKQorICAgIGlmIHNlbGYudGltZV9zdGFtcCBpcyBub3QgTm9uZToKKyAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbigndGltZV9zdGFtcCcsIFRUeXBlLkk2NCwgMikKKyAgICAgIG9wcm90LndyaXRlSTY0KHNlbGYudGltZV9zdGFtcCkKKyAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKQorICAgIGlmIHNlbGYudXNlcnMgaXMgbm90IE5vbmU6CisgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ3VzZXJzJywgVFR5cGUuTElTVCwgMykKKyAgICAgIG9wcm90LndyaXRlTGlzdEJlZ2luKFRUeXBlLlNUUklORywgbGVuKHNlbGYudXNlcnMpKQorICAgICAgZm9yIGl0ZXI2MDYgaW4gc2VsZi51c2VyczoKKyAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoaXRlcjYwNi5lbmNvZGUoJ3V0Zi04JykpCisgICAgICBvcHJvdC53cml0ZUxpc3RFbmQoKQorICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCisgICAgaWYgc2VsZi5ncm91cHMgaXMgbm90IE5vbmU6CisgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ2dyb3VwcycsIFRUeXBlLkxJU1QsIDQpCisgICAgICBvcHJvdC53cml0ZUxpc3RCZWdpbihUVHlwZS5TVFJJTkcsIGxlbihzZWxmLmdyb3VwcykpCisgICAgICBmb3IgaXRlcjYwNyBpbiBzZWxmLmdyb3VwczoKKyAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoaXRlcjYwNy5lbmNvZGUoJ3V0Zi04JykpCisgICAgICBvcHJvdC53cml0ZUxpc3RFbmQoKQorICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCisgICAgb3Byb3Qud3JpdGVGaWVsZFN0b3AoKQorICAgIG9wcm90LndyaXRlU3RydWN0RW5kKCkKKworICBkZWYgdmFsaWRhdGUoc2VsZik6CisgICAgaWYgc2VsZi50b3BvbG9neV9pZCBpcyBOb25lOgorICAgICAgcmFpc2UgVFByb3RvY29sLlRQcm90b2NvbEV4Y2VwdGlvbihtZXNzYWdlPSdSZXF1aXJlZCBmaWVsZCB0b3BvbG9neV9pZCBpcyB1bnNldCEnKQorICAgIGlmIHNlbGYudGltZV9zdGFtcCBpcyBOb25lOgorICAgICAgcmFpc2UgVFByb3RvY29sLlRQcm90b2NvbEV4Y2VwdGlvbihtZXNzYWdlPSdSZXF1aXJlZCBmaWVsZCB0aW1lX3N0YW1wIGlzIHVuc2V0IScpCisgICAgaWYgc2VsZi51c2VycyBpcyBOb25lOgorICAgICAgcmFpc2UgVFByb3RvY29sLlRQcm90b2NvbEV4Y2VwdGlvbihtZXNzYWdlPSdSZXF1aXJlZCBmaWVsZCB1c2VycyBpcyB1bnNldCEnKQorICAgIGlmIHNlbGYuZ3JvdXBzIGlzIE5vbmU6CisgICAgICByYWlzZSBUUHJvdG9jb2wuVFByb3RvY29sRXhjZXB0aW9uKG1lc3NhZ2U9J1JlcXVpcmVkIGZpZWxkIGdyb3VwcyBpcyB1bnNldCEnKQorICAgIHJldHVybgorCisKKyAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgIHZhbHVlID0gMTcKKyAgICB2YWx1ZSA9ICh2YWx1ZSAqIDMxKSBeIGhhc2goc2VsZi50b3BvbG9neV9pZCkKKyAgICB2YWx1ZSA9ICh2YWx1ZSAqIDMxKSBeIGhhc2goc2VsZi50aW1lX3N0YW1wKQorICAgIHZhbHVlID0gKHZhbHVlICogMzEpIF4gaGFzaChzZWxmLnVzZXJzKQorICAgIHZhbHVlID0gKHZhbHVlICogMzEpIF4gaGFzaChzZWxmLmdyb3VwcykKKyAgICByZXR1cm4gdmFsdWUKKworICBkZWYgX19yZXByX18oc2VsZik6CisgICAgTCA9IFsnJXM9JXInICUgKGtleSwgdmFsdWUpCisgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzZWxmLl9fZGljdF9fLml0ZXJpdGVtcygpXQorICAgIHJldHVybiAnJXMoJXMpJyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgJywgJy5qb2luKEwpKQorCisgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgIHJldHVybiBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXykgYW5kIHNlbGYuX19kaWN0X18gPT0gb3RoZXIuX19kaWN0X18KKworICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKKyAgICByZXR1cm4gbm90IChzZWxmID09IG90aGVyKQorCitjbGFzcyBMU1RvcG9IaXN0b3J5TGlzdDoKKyAgIiIiCisgIEF0dHJpYnV0ZXM6CisgICAtIHRvcG9faGlzdG9yeQorICAiIiIKKworICB0aHJpZnRfc3BlYyA9ICgKKyAgICBOb25lLCAjIDAKKyAgICAoMSwgVFR5cGUuTElTVCwgJ3RvcG9faGlzdG9yeScsIChUVHlwZS5TVFJVQ1QsKExTVG9wb0hpc3RvcnksIExTVG9wb0hpc3RvcnkudGhyaWZ0X3NwZWMpKSwgTm9uZSwgKSwgIyAxCisgICkKKworICBkZWYgX19pbml0X18oc2VsZiwgdG9wb19oaXN0b3J5PU5vbmUsKToKKyAgICBzZWxmLnRvcG9faGlzdG9yeSA9IHRvcG9faGlzdG9yeQorCisgIGRlZiByZWFkKHNlbGYsIGlwcm90KToKKyAgICBpZiBpcHJvdC5fX2NsYXNzX18gPT0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIGFuZCBpc2luc3RhbmNlKGlwcm90LnRyYW5zLCBUVHJhbnNwb3J0LkNSZWFkYWJsZVRyYW5zcG9ydCkgYW5kIHNlbGYudGhyaWZ0X3NwZWMgaXMgbm90IE5vbmUgYW5kIGZhc3RiaW5hcnkgaXMgbm90IE5vbmU6CisgICAgICBmYXN0YmluYXJ5LmRlY29kZV9iaW5hcnkoc2VsZiwgaXByb3QudHJhbnMsIChzZWxmLl9fY2xhc3NfXywgc2VsZi50aHJpZnRfc3BlYykpCisgICAgICByZXR1cm4KKyAgICBpcHJvdC5yZWFkU3RydWN0QmVnaW4oKQorICAgIHdoaWxlIFRydWU6CisgICAgICAoZm5hbWUsIGZ0eXBlLCBmaWQpID0gaXByb3QucmVhZEZpZWxkQmVnaW4oKQorICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuU1RPUDoKKyAgICAgICAgYnJlYWsKKyAgICAgIGlmIGZpZCA9PSAxOgorICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5MSVNUOgorICAgICAgICAgIHNlbGYudG9wb19oaXN0b3J5ID0gW10KKyAgICAgICAgICAoX2V0eXBlNjExLCBfc2l6ZTYwOCkgPSBpcHJvdC5yZWFkTGlzdEJlZ2luKCkKKyAgICAgICAgICBmb3IgX2k2MTIgaW4geHJhbmdlKF9zaXplNjA4KToKKyAgICAgICAgICAgIF9lbGVtNjEzID0gTFNUb3BvSGlzdG9yeSgpCisgICAgICAgICAgICBfZWxlbTYxMy5yZWFkKGlwcm90KQorICAgICAgICAgICAgc2VsZi50b3BvX2hpc3RvcnkuYXBwZW5kKF9lbGVtNjEzKQorICAgICAgICAgIGlwcm90LnJlYWRMaXN0RW5kKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgZWxzZToKKyAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgIGlwcm90LnJlYWRGaWVsZEVuZCgpCisgICAgaXByb3QucmVhZFN0cnVjdEVuZCgpCisKKyAgZGVmIHdyaXRlKHNlbGYsIG9wcm90KToKKyAgICBpZiBvcHJvdC5fX2NsYXNzX18gPT0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIGFuZCBzZWxmLnRocmlmdF9zcGVjIGlzIG5vdCBOb25lIGFuZCBmYXN0YmluYXJ5IGlzIG5vdCBOb25lOgorICAgICAgb3Byb3QudHJhbnMud3JpdGUoZmFzdGJpbmFyeS5lbmNvZGVfYmluYXJ5KHNlbGYsIChzZWxmLl9fY2xhc3NfXywgc2VsZi50aHJpZnRfc3BlYykpKQorICAgICAgcmV0dXJuCisgICAgb3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbignTFNUb3BvSGlzdG9yeUxpc3QnKQorICAgIGlmIHNlbGYudG9wb19oaXN0b3J5IGlzIG5vdCBOb25lOgorICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCd0b3BvX2hpc3RvcnknLCBUVHlwZS5MSVNULCAxKQorICAgICAgb3Byb3Qud3JpdGVMaXN0QmVnaW4oVFR5cGUuU1RSVUNULCBsZW4oc2VsZi50b3BvX2hpc3RvcnkpKQorICAgICAgZm9yIGl0ZXI2MTQgaW4gc2VsZi50b3BvX2hpc3Rvcnk6CisgICAgICAgIGl0ZXI2MTQud3JpdGUob3Byb3QpCisgICAgICBvcHJvdC53cml0ZUxpc3RFbmQoKQorICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCisgICAgb3Byb3Qud3JpdGVGaWVsZFN0b3AoKQorICAgIG9wcm90LndyaXRlU3RydWN0RW5kKCkKKworICBkZWYgdmFsaWRhdGUoc2VsZik6CisgICAgaWYgc2VsZi50b3BvX2hpc3RvcnkgaXMgTm9uZToKKyAgICAgIHJhaXNlIFRQcm90b2NvbC5UUHJvdG9jb2xFeGNlcHRpb24obWVzc2FnZT0nUmVxdWlyZWQgZmllbGQgdG9wb19oaXN0b3J5IGlzIHVuc2V0IScpCisgICAgcmV0dXJuCisKKworICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgdmFsdWUgPSAxNworICAgIHZhbHVlID0gKHZhbHVlICogMzEpIF4gaGFzaChzZWxmLnRvcG9faGlzdG9yeSkKKyAgICByZXR1cm4gdmFsdWUKKworICBkZWYgX19yZXByX18oc2VsZik6CisgICAgTCA9IFsnJXM9JXInICUgKGtleSwgdmFsdWUpCisgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzZWxmLl9fZGljdF9fLml0ZXJpdGVtcygpXQorICAgIHJldHVybiAnJXMoJXMpJyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgJywgJy5qb2luKEwpKQorCisgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgIHJldHVybiBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXykgYW5kIHNlbGYuX19kaWN0X18gPT0gb3RoZXIuX19kaWN0X18KKworICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKKyAgICByZXR1cm4gbm90IChzZWxmID09IG90aGVyKQorCitjbGFzcyBQcm9maWxlUmVxdWVzdDoKKyAgIiIiCisgIEF0dHJpYnV0ZXM6CisgICAtIG5vZGVJbmZvCisgICAtIGFjdGlvbgorICAgLSB0aW1lX3N0YW1wCisgICIiIgorCisgIHRocmlmdF9zcGVjID0gKAorICAgIE5vbmUsICMgMAorICAgICgxLCBUVHlwZS5TVFJVQ1QsICdub2RlSW5mbycsIChOb2RlSW5mbywgTm9kZUluZm8udGhyaWZ0X3NwZWMpLCBOb25lLCApLCAjIDEKKyAgICAoMiwgVFR5cGUuSTMyLCAnYWN0aW9uJywgTm9uZSwgTm9uZSwgKSwgIyAyCisgICAgKDMsIFRUeXBlLkk2NCwgJ3RpbWVfc3RhbXAnLCBOb25lLCBOb25lLCApLCAjIDMKKyAgKQorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBub2RlSW5mbz1Ob25lLCBhY3Rpb249Tm9uZSwgdGltZV9zdGFtcD1Ob25lLCk6CisgICAgc2VsZi5ub2RlSW5mbyA9IG5vZGVJbmZvCisgICAgc2VsZi5hY3Rpb24gPSBhY3Rpb24KKyAgICBzZWxmLnRpbWVfc3RhbXAgPSB0aW1lX3N0YW1wCisKKyAgZGVmIHJlYWQoc2VsZiwgaXByb3QpOgorICAgIGlmIGlwcm90Ll9fY2xhc3NfXyA9PSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgYW5kIGlzaW5zdGFuY2UoaXByb3QudHJhbnMsIFRUcmFuc3BvcnQuQ1JlYWRhYmxlVHJhbnNwb3J0KSBhbmQgc2VsZi50aHJpZnRfc3BlYyBpcyBub3QgTm9uZSBhbmQgZmFzdGJpbmFyeSBpcyBub3QgTm9uZToKKyAgICAgIGZhc3RiaW5hcnkuZGVjb2RlX2JpbmFyeShzZWxmLCBpcHJvdC50cmFucywgKHNlbGYuX19jbGFzc19fLCBzZWxmLnRocmlmdF9zcGVjKSkKKyAgICAgIHJldHVybgorICAgIGlwcm90LnJlYWRTdHJ1Y3RCZWdpbigpCisgICAgd2hpbGUgVHJ1ZToKKyAgICAgIChmbmFtZSwgZnR5cGUsIGZpZCkgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpCisgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5TVE9QOgorICAgICAgICBicmVhaworICAgICAgaWYgZmlkID09IDE6CisgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLlNUUlVDVDoKKyAgICAgICAgICBzZWxmLm5vZGVJbmZvID0gTm9kZUluZm8oKQorICAgICAgICAgIHNlbGYubm9kZUluZm8ucmVhZChpcHJvdCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgZWxpZiBmaWQgPT0gMjoKKyAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuSTMyOgorICAgICAgICAgIHNlbGYuYWN0aW9uID0gaXByb3QucmVhZEkzMigpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgIGVsaWYgZmlkID09IDM6CisgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLkk2NDoKKyAgICAgICAgICBzZWxmLnRpbWVfc3RhbXAgPSBpcHJvdC5yZWFkSTY0KCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgZWxzZToKKyAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgIGlwcm90LnJlYWRGaWVsZEVuZCgpCisgICAgaXByb3QucmVhZFN0cnVjdEVuZCgpCisKKyAgZGVmIHdyaXRlKHNlbGYsIG9wcm90KToKKyAgICBpZiBvcHJvdC5fX2NsYXNzX18gPT0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIGFuZCBzZWxmLnRocmlmdF9zcGVjIGlzIG5vdCBOb25lIGFuZCBmYXN0YmluYXJ5IGlzIG5vdCBOb25lOgorICAgICAgb3Byb3QudHJhbnMud3JpdGUoZmFzdGJpbmFyeS5lbmNvZGVfYmluYXJ5KHNlbGYsIChzZWxmLl9fY2xhc3NfXywgc2VsZi50aHJpZnRfc3BlYykpKQorICAgICAgcmV0dXJuCisgICAgb3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbignUHJvZmlsZVJlcXVlc3QnKQorICAgIGlmIHNlbGYubm9kZUluZm8gaXMgbm90IE5vbmU6CisgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ25vZGVJbmZvJywgVFR5cGUuU1RSVUNULCAxKQorICAgICAgc2VsZi5ub2RlSW5mby53cml0ZShvcHJvdCkKKyAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKQorICAgIGlmIHNlbGYuYWN0aW9uIGlzIG5vdCBOb25lOgorICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCdhY3Rpb24nLCBUVHlwZS5JMzIsIDIpCisgICAgICBvcHJvdC53cml0ZUkzMihzZWxmLmFjdGlvbikKKyAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKQorICAgIGlmIHNlbGYudGltZV9zdGFtcCBpcyBub3QgTm9uZToKKyAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbigndGltZV9zdGFtcCcsIFRUeXBlLkk2NCwgMykKKyAgICAgIG9wcm90LndyaXRlSTY0KHNlbGYudGltZV9zdGFtcCkKKyAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKQorICAgIG9wcm90LndyaXRlRmllbGRTdG9wKCkKKyAgICBvcHJvdC53cml0ZVN0cnVjdEVuZCgpCisKKyAgZGVmIHZhbGlkYXRlKHNlbGYpOgorICAgIGlmIHNlbGYubm9kZUluZm8gaXMgTm9uZToKKyAgICAgIHJhaXNlIFRQcm90b2NvbC5UUHJvdG9jb2xFeGNlcHRpb24obWVzc2FnZT0nUmVxdWlyZWQgZmllbGQgbm9kZUluZm8gaXMgdW5zZXQhJykKKyAgICBpZiBzZWxmLmFjdGlvbiBpcyBOb25lOgorICAgICAgcmFpc2UgVFByb3RvY29sLlRQcm90b2NvbEV4Y2VwdGlvbihtZXNzYWdlPSdSZXF1aXJlZCBmaWVsZCBhY3Rpb24gaXMgdW5zZXQhJykKKyAgICByZXR1cm4KKworCisgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICB2YWx1ZSA9IDE3CisgICAgdmFsdWUgPSAodmFsdWUgKiAzMSkgXiBoYXNoKHNlbGYubm9kZUluZm8pCisgICAgdmFsdWUgPSAodmFsdWUgKiAzMSkgXiBoYXNoKHNlbGYuYWN0aW9uKQorICAgIHZhbHVlID0gKHZhbHVlICogMzEpIF4gaGFzaChzZWxmLnRpbWVfc3RhbXApCisgICAgcmV0dXJuIHZhbHVlCisKKyAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgIEwgPSBbJyVzPSVyJyAlIChrZXksIHZhbHVlKQorICAgICAgZm9yIGtleSwgdmFsdWUgaW4gc2VsZi5fX2RpY3RfXy5pdGVyaXRlbXMoKV0KKyAgICByZXR1cm4gJyVzKCVzKScgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sICcsICcuam9pbihMKSkKKworICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICByZXR1cm4gaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pIGFuZCBzZWxmLl9fZGljdF9fID09IG90aGVyLl9fZGljdF9fCisKKyAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CisgICAgcmV0dXJuIG5vdCAoc2VsZiA9PSBvdGhlcikKKwogY2xhc3MgR2V0SW5mb09wdGlvbnM6CiAgICIiIgogICBBdHRyaWJ1dGVzOgpAQCAtNjMwOCw3ICs5MDI4LDcgQEAKICAgICAgICAgYnJlYWsKICAgICAgIGlmIGZpZCA9PSAxOgogICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5JMzI6Ci0gICAgICAgICAgc2VsZi5udW1fZXJyX2Nob2ljZSA9IGlwcm90LnJlYWRJMzIoKTsKKyAgICAgICAgICBzZWxmLm51bV9lcnJfY2hvaWNlID0gaXByb3QucmVhZEkzMigpCiAgICAgICAgIGVsc2U6CiAgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKICAgICAgIGVsc2U6CkBAIC02MzQ4LDYgKzkwNjgsMjc1IEBACiAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgIHJldHVybiBub3QgKHNlbGYgPT0gb3RoZXIpCiAKK2NsYXNzIExvZ0xldmVsOgorICAiIiIKKyAgQXR0cmlidXRlczoKKyAgIC0gYWN0aW9uCisgICAtIHRhcmdldF9sb2dfbGV2ZWwKKyAgIC0gcmVzZXRfbG9nX2xldmVsX3RpbWVvdXRfc2VjcworICAgLSByZXNldF9sb2dfbGV2ZWxfdGltZW91dF9lcG9jaAorICAgLSByZXNldF9sb2dfbGV2ZWwKKyAgIiIiCisKKyAgdGhyaWZ0X3NwZWMgPSAoCisgICAgTm9uZSwgIyAwCisgICAgKDEsIFRUeXBlLkkzMiwgJ2FjdGlvbicsIE5vbmUsIE5vbmUsICksICMgMQorICAgICgyLCBUVHlwZS5TVFJJTkcsICd0YXJnZXRfbG9nX2xldmVsJywgTm9uZSwgTm9uZSwgKSwgIyAyCisgICAgKDMsIFRUeXBlLkkzMiwgJ3Jlc2V0X2xvZ19sZXZlbF90aW1lb3V0X3NlY3MnLCBOb25lLCBOb25lLCApLCAjIDMKKyAgICAoNCwgVFR5cGUuSTY0LCAncmVzZXRfbG9nX2xldmVsX3RpbWVvdXRfZXBvY2gnLCBOb25lLCBOb25lLCApLCAjIDQKKyAgICAoNSwgVFR5cGUuU1RSSU5HLCAncmVzZXRfbG9nX2xldmVsJywgTm9uZSwgTm9uZSwgKSwgIyA1CisgICkKKworICBkZWYgX19pbml0X18oc2VsZiwgYWN0aW9uPU5vbmUsIHRhcmdldF9sb2dfbGV2ZWw9Tm9uZSwgcmVzZXRfbG9nX2xldmVsX3RpbWVvdXRfc2Vjcz1Ob25lLCByZXNldF9sb2dfbGV2ZWxfdGltZW91dF9lcG9jaD1Ob25lLCByZXNldF9sb2dfbGV2ZWw9Tm9uZSwpOgorICAgIHNlbGYuYWN0aW9uID0gYWN0aW9uCisgICAgc2VsZi50YXJnZXRfbG9nX2xldmVsID0gdGFyZ2V0X2xvZ19sZXZlbAorICAgIHNlbGYucmVzZXRfbG9nX2xldmVsX3RpbWVvdXRfc2VjcyA9IHJlc2V0X2xvZ19sZXZlbF90aW1lb3V0X3NlY3MKKyAgICBzZWxmLnJlc2V0X2xvZ19sZXZlbF90aW1lb3V0X2Vwb2NoID0gcmVzZXRfbG9nX2xldmVsX3RpbWVvdXRfZXBvY2gKKyAgICBzZWxmLnJlc2V0X2xvZ19sZXZlbCA9IHJlc2V0X2xvZ19sZXZlbAorCisgIGRlZiByZWFkKHNlbGYsIGlwcm90KToKKyAgICBpZiBpcHJvdC5fX2NsYXNzX18gPT0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIGFuZCBpc2luc3RhbmNlKGlwcm90LnRyYW5zLCBUVHJhbnNwb3J0LkNSZWFkYWJsZVRyYW5zcG9ydCkgYW5kIHNlbGYudGhyaWZ0X3NwZWMgaXMgbm90IE5vbmUgYW5kIGZhc3RiaW5hcnkgaXMgbm90IE5vbmU6CisgICAgICBmYXN0YmluYXJ5LmRlY29kZV9iaW5hcnkoc2VsZiwgaXByb3QudHJhbnMsIChzZWxmLl9fY2xhc3NfXywgc2VsZi50aHJpZnRfc3BlYykpCisgICAgICByZXR1cm4KKyAgICBpcHJvdC5yZWFkU3RydWN0QmVnaW4oKQorICAgIHdoaWxlIFRydWU6CisgICAgICAoZm5hbWUsIGZ0eXBlLCBmaWQpID0gaXByb3QucmVhZEZpZWxkQmVnaW4oKQorICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuU1RPUDoKKyAgICAgICAgYnJlYWsKKyAgICAgIGlmIGZpZCA9PSAxOgorICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5JMzI6CisgICAgICAgICAgc2VsZi5hY3Rpb24gPSBpcHJvdC5yZWFkSTMyKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgZWxpZiBmaWQgPT0gMjoKKyAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuU1RSSU5HOgorICAgICAgICAgIHNlbGYudGFyZ2V0X2xvZ19sZXZlbCA9IGlwcm90LnJlYWRTdHJpbmcoKS5kZWNvZGUoJ3V0Zi04JykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgZWxpZiBmaWQgPT0gMzoKKyAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuSTMyOgorICAgICAgICAgIHNlbGYucmVzZXRfbG9nX2xldmVsX3RpbWVvdXRfc2VjcyA9IGlwcm90LnJlYWRJMzIoKQorICAgICAgICBlbHNlOgorICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBlbGlmIGZpZCA9PSA0OgorICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5JNjQ6CisgICAgICAgICAgc2VsZi5yZXNldF9sb2dfbGV2ZWxfdGltZW91dF9lcG9jaCA9IGlwcm90LnJlYWRJNjQoKQorICAgICAgICBlbHNlOgorICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBlbGlmIGZpZCA9PSA1OgorICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5TVFJJTkc6CisgICAgICAgICAgc2VsZi5yZXNldF9sb2dfbGV2ZWwgPSBpcHJvdC5yZWFkU3RyaW5nKCkuZGVjb2RlKCd1dGYtOCcpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgIGVsc2U6CisgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBpcHJvdC5yZWFkRmllbGRFbmQoKQorICAgIGlwcm90LnJlYWRTdHJ1Y3RFbmQoKQorCisgIGRlZiB3cml0ZShzZWxmLCBvcHJvdCk6CisgICAgaWYgb3Byb3QuX19jbGFzc19fID09IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCBhbmQgc2VsZi50aHJpZnRfc3BlYyBpcyBub3QgTm9uZSBhbmQgZmFzdGJpbmFyeSBpcyBub3QgTm9uZToKKyAgICAgIG9wcm90LnRyYW5zLndyaXRlKGZhc3RiaW5hcnkuZW5jb2RlX2JpbmFyeShzZWxmLCAoc2VsZi5fX2NsYXNzX18sIHNlbGYudGhyaWZ0X3NwZWMpKSkKKyAgICAgIHJldHVybgorICAgIG9wcm90LndyaXRlU3RydWN0QmVnaW4oJ0xvZ0xldmVsJykKKyAgICBpZiBzZWxmLmFjdGlvbiBpcyBub3QgTm9uZToKKyAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbignYWN0aW9uJywgVFR5cGUuSTMyLCAxKQorICAgICAgb3Byb3Qud3JpdGVJMzIoc2VsZi5hY3Rpb24pCisgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKKyAgICBpZiBzZWxmLnRhcmdldF9sb2dfbGV2ZWwgaXMgbm90IE5vbmU6CisgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ3RhcmdldF9sb2dfbGV2ZWwnLCBUVHlwZS5TVFJJTkcsIDIpCisgICAgICBvcHJvdC53cml0ZVN0cmluZyhzZWxmLnRhcmdldF9sb2dfbGV2ZWwuZW5jb2RlKCd1dGYtOCcpKQorICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCisgICAgaWYgc2VsZi5yZXNldF9sb2dfbGV2ZWxfdGltZW91dF9zZWNzIGlzIG5vdCBOb25lOgorICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCdyZXNldF9sb2dfbGV2ZWxfdGltZW91dF9zZWNzJywgVFR5cGUuSTMyLCAzKQorICAgICAgb3Byb3Qud3JpdGVJMzIoc2VsZi5yZXNldF9sb2dfbGV2ZWxfdGltZW91dF9zZWNzKQorICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCisgICAgaWYgc2VsZi5yZXNldF9sb2dfbGV2ZWxfdGltZW91dF9lcG9jaCBpcyBub3QgTm9uZToKKyAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbigncmVzZXRfbG9nX2xldmVsX3RpbWVvdXRfZXBvY2gnLCBUVHlwZS5JNjQsIDQpCisgICAgICBvcHJvdC53cml0ZUk2NChzZWxmLnJlc2V0X2xvZ19sZXZlbF90aW1lb3V0X2Vwb2NoKQorICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCisgICAgaWYgc2VsZi5yZXNldF9sb2dfbGV2ZWwgaXMgbm90IE5vbmU6CisgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ3Jlc2V0X2xvZ19sZXZlbCcsIFRUeXBlLlNUUklORywgNSkKKyAgICAgIG9wcm90LndyaXRlU3RyaW5nKHNlbGYucmVzZXRfbG9nX2xldmVsLmVuY29kZSgndXRmLTgnKSkKKyAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKQorICAgIG9wcm90LndyaXRlRmllbGRTdG9wKCkKKyAgICBvcHJvdC53cml0ZVN0cnVjdEVuZCgpCisKKyAgZGVmIHZhbGlkYXRlKHNlbGYpOgorICAgIGlmIHNlbGYuYWN0aW9uIGlzIE5vbmU6CisgICAgICByYWlzZSBUUHJvdG9jb2wuVFByb3RvY29sRXhjZXB0aW9uKG1lc3NhZ2U9J1JlcXVpcmVkIGZpZWxkIGFjdGlvbiBpcyB1bnNldCEnKQorICAgIHJldHVybgorCisKKyAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgIHZhbHVlID0gMTcKKyAgICB2YWx1ZSA9ICh2YWx1ZSAqIDMxKSBeIGhhc2goc2VsZi5hY3Rpb24pCisgICAgdmFsdWUgPSAodmFsdWUgKiAzMSkgXiBoYXNoKHNlbGYudGFyZ2V0X2xvZ19sZXZlbCkKKyAgICB2YWx1ZSA9ICh2YWx1ZSAqIDMxKSBeIGhhc2goc2VsZi5yZXNldF9sb2dfbGV2ZWxfdGltZW91dF9zZWNzKQorICAgIHZhbHVlID0gKHZhbHVlICogMzEpIF4gaGFzaChzZWxmLnJlc2V0X2xvZ19sZXZlbF90aW1lb3V0X2Vwb2NoKQorICAgIHZhbHVlID0gKHZhbHVlICogMzEpIF4gaGFzaChzZWxmLnJlc2V0X2xvZ19sZXZlbCkKKyAgICByZXR1cm4gdmFsdWUKKworICBkZWYgX19yZXByX18oc2VsZik6CisgICAgTCA9IFsnJXM9JXInICUgKGtleSwgdmFsdWUpCisgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzZWxmLl9fZGljdF9fLml0ZXJpdGVtcygpXQorICAgIHJldHVybiAnJXMoJXMpJyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgJywgJy5qb2luKEwpKQorCisgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgIHJldHVybiBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXykgYW5kIHNlbGYuX19kaWN0X18gPT0gb3RoZXIuX19kaWN0X18KKworICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKKyAgICByZXR1cm4gbm90IChzZWxmID09IG90aGVyKQorCitjbGFzcyBMb2dDb25maWc6CisgICIiIgorICBBdHRyaWJ1dGVzOgorICAgLSBuYW1lZF9sb2dnZXJfbGV2ZWwKKyAgIiIiCisKKyAgdGhyaWZ0X3NwZWMgPSAoCisgICAgTm9uZSwgIyAwCisgICAgTm9uZSwgIyAxCisgICAgKDIsIFRUeXBlLk1BUCwgJ25hbWVkX2xvZ2dlcl9sZXZlbCcsIChUVHlwZS5TVFJJTkcsTm9uZSxUVHlwZS5TVFJVQ1QsKExvZ0xldmVsLCBMb2dMZXZlbC50aHJpZnRfc3BlYykpLCBOb25lLCApLCAjIDIKKyAgKQorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lZF9sb2dnZXJfbGV2ZWw9Tm9uZSwpOgorICAgIHNlbGYubmFtZWRfbG9nZ2VyX2xldmVsID0gbmFtZWRfbG9nZ2VyX2xldmVsCisKKyAgZGVmIHJlYWQoc2VsZiwgaXByb3QpOgorICAgIGlmIGlwcm90Ll9fY2xhc3NfXyA9PSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgYW5kIGlzaW5zdGFuY2UoaXByb3QudHJhbnMsIFRUcmFuc3BvcnQuQ1JlYWRhYmxlVHJhbnNwb3J0KSBhbmQgc2VsZi50aHJpZnRfc3BlYyBpcyBub3QgTm9uZSBhbmQgZmFzdGJpbmFyeSBpcyBub3QgTm9uZToKKyAgICAgIGZhc3RiaW5hcnkuZGVjb2RlX2JpbmFyeShzZWxmLCBpcHJvdC50cmFucywgKHNlbGYuX19jbGFzc19fLCBzZWxmLnRocmlmdF9zcGVjKSkKKyAgICAgIHJldHVybgorICAgIGlwcm90LnJlYWRTdHJ1Y3RCZWdpbigpCisgICAgd2hpbGUgVHJ1ZToKKyAgICAgIChmbmFtZSwgZnR5cGUsIGZpZCkgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpCisgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5TVE9QOgorICAgICAgICBicmVhaworICAgICAgaWYgZmlkID09IDI6CisgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLk1BUDoKKyAgICAgICAgICBzZWxmLm5hbWVkX2xvZ2dlcl9sZXZlbCA9IHt9CisgICAgICAgICAgKF9rdHlwZTYxNiwgX3Z0eXBlNjE3LCBfc2l6ZTYxNSApID0gaXByb3QucmVhZE1hcEJlZ2luKCkKKyAgICAgICAgICBmb3IgX2k2MTkgaW4geHJhbmdlKF9zaXplNjE1KToKKyAgICAgICAgICAgIF9rZXk2MjAgPSBpcHJvdC5yZWFkU3RyaW5nKCkuZGVjb2RlKCd1dGYtOCcpCisgICAgICAgICAgICBfdmFsNjIxID0gTG9nTGV2ZWwoKQorICAgICAgICAgICAgX3ZhbDYyMS5yZWFkKGlwcm90KQorICAgICAgICAgICAgc2VsZi5uYW1lZF9sb2dnZXJfbGV2ZWxbX2tleTYyMF0gPSBfdmFsNjIxCisgICAgICAgICAgaXByb3QucmVhZE1hcEVuZCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgIGVsc2U6CisgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBpcHJvdC5yZWFkRmllbGRFbmQoKQorICAgIGlwcm90LnJlYWRTdHJ1Y3RFbmQoKQorCisgIGRlZiB3cml0ZShzZWxmLCBvcHJvdCk6CisgICAgaWYgb3Byb3QuX19jbGFzc19fID09IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCBhbmQgc2VsZi50aHJpZnRfc3BlYyBpcyBub3QgTm9uZSBhbmQgZmFzdGJpbmFyeSBpcyBub3QgTm9uZToKKyAgICAgIG9wcm90LnRyYW5zLndyaXRlKGZhc3RiaW5hcnkuZW5jb2RlX2JpbmFyeShzZWxmLCAoc2VsZi5fX2NsYXNzX18sIHNlbGYudGhyaWZ0X3NwZWMpKSkKKyAgICAgIHJldHVybgorICAgIG9wcm90LndyaXRlU3RydWN0QmVnaW4oJ0xvZ0NvbmZpZycpCisgICAgaWYgc2VsZi5uYW1lZF9sb2dnZXJfbGV2ZWwgaXMgbm90IE5vbmU6CisgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ25hbWVkX2xvZ2dlcl9sZXZlbCcsIFRUeXBlLk1BUCwgMikKKyAgICAgIG9wcm90LndyaXRlTWFwQmVnaW4oVFR5cGUuU1RSSU5HLCBUVHlwZS5TVFJVQ1QsIGxlbihzZWxmLm5hbWVkX2xvZ2dlcl9sZXZlbCkpCisgICAgICBmb3Iga2l0ZXI2MjIsdml0ZXI2MjMgaW4gc2VsZi5uYW1lZF9sb2dnZXJfbGV2ZWwuaXRlbXMoKToKKyAgICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoa2l0ZXI2MjIuZW5jb2RlKCd1dGYtOCcpKQorICAgICAgICB2aXRlcjYyMy53cml0ZShvcHJvdCkKKyAgICAgIG9wcm90LndyaXRlTWFwRW5kKCkKKyAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKQorICAgIG9wcm90LndyaXRlRmllbGRTdG9wKCkKKyAgICBvcHJvdC53cml0ZVN0cnVjdEVuZCgpCisKKyAgZGVmIHZhbGlkYXRlKHNlbGYpOgorICAgIHJldHVybgorCisKKyAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgIHZhbHVlID0gMTcKKyAgICB2YWx1ZSA9ICh2YWx1ZSAqIDMxKSBeIGhhc2goc2VsZi5uYW1lZF9sb2dnZXJfbGV2ZWwpCisgICAgcmV0dXJuIHZhbHVlCisKKyAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgIEwgPSBbJyVzPSVyJyAlIChrZXksIHZhbHVlKQorICAgICAgZm9yIGtleSwgdmFsdWUgaW4gc2VsZi5fX2RpY3RfXy5pdGVyaXRlbXMoKV0KKyAgICByZXR1cm4gJyVzKCVzKScgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sICcsICcuam9pbihMKSkKKworICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICByZXR1cm4gaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pIGFuZCBzZWxmLl9fZGljdF9fID09IG90aGVyLl9fZGljdF9fCisKKyAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CisgICAgcmV0dXJuIG5vdCAoc2VsZiA9PSBvdGhlcikKKworY2xhc3MgVG9wb2xvZ3lIaXN0b3J5SW5mbzoKKyAgIiIiCisgIEF0dHJpYnV0ZXM6CisgICAtIHRvcG9faWRzCisgICIiIgorCisgIHRocmlmdF9zcGVjID0gKAorICAgIE5vbmUsICMgMAorICAgICgxLCBUVHlwZS5MSVNULCAndG9wb19pZHMnLCAoVFR5cGUuU1RSSU5HLE5vbmUpLCBOb25lLCApLCAjIDEKKyAgKQorCisgIGRlZiBfX2luaXRfXyhzZWxmLCB0b3BvX2lkcz1Ob25lLCk6CisgICAgc2VsZi50b3BvX2lkcyA9IHRvcG9faWRzCisKKyAgZGVmIHJlYWQoc2VsZiwgaXByb3QpOgorICAgIGlmIGlwcm90Ll9fY2xhc3NfXyA9PSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgYW5kIGlzaW5zdGFuY2UoaXByb3QudHJhbnMsIFRUcmFuc3BvcnQuQ1JlYWRhYmxlVHJhbnNwb3J0KSBhbmQgc2VsZi50aHJpZnRfc3BlYyBpcyBub3QgTm9uZSBhbmQgZmFzdGJpbmFyeSBpcyBub3QgTm9uZToKKyAgICAgIGZhc3RiaW5hcnkuZGVjb2RlX2JpbmFyeShzZWxmLCBpcHJvdC50cmFucywgKHNlbGYuX19jbGFzc19fLCBzZWxmLnRocmlmdF9zcGVjKSkKKyAgICAgIHJldHVybgorICAgIGlwcm90LnJlYWRTdHJ1Y3RCZWdpbigpCisgICAgd2hpbGUgVHJ1ZToKKyAgICAgIChmbmFtZSwgZnR5cGUsIGZpZCkgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpCisgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5TVE9QOgorICAgICAgICBicmVhaworICAgICAgaWYgZmlkID09IDE6CisgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLkxJU1Q6CisgICAgICAgICAgc2VsZi50b3BvX2lkcyA9IFtdCisgICAgICAgICAgKF9ldHlwZTYyNywgX3NpemU2MjQpID0gaXByb3QucmVhZExpc3RCZWdpbigpCisgICAgICAgICAgZm9yIF9pNjI4IGluIHhyYW5nZShfc2l6ZTYyNCk6CisgICAgICAgICAgICBfZWxlbTYyOSA9IGlwcm90LnJlYWRTdHJpbmcoKS5kZWNvZGUoJ3V0Zi04JykKKyAgICAgICAgICAgIHNlbGYudG9wb19pZHMuYXBwZW5kKF9lbGVtNjI5KQorICAgICAgICAgIGlwcm90LnJlYWRMaXN0RW5kKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgZWxzZToKKyAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgIGlwcm90LnJlYWRGaWVsZEVuZCgpCisgICAgaXByb3QucmVhZFN0cnVjdEVuZCgpCisKKyAgZGVmIHdyaXRlKHNlbGYsIG9wcm90KToKKyAgICBpZiBvcHJvdC5fX2NsYXNzX18gPT0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIGFuZCBzZWxmLnRocmlmdF9zcGVjIGlzIG5vdCBOb25lIGFuZCBmYXN0YmluYXJ5IGlzIG5vdCBOb25lOgorICAgICAgb3Byb3QudHJhbnMud3JpdGUoZmFzdGJpbmFyeS5lbmNvZGVfYmluYXJ5KHNlbGYsIChzZWxmLl9fY2xhc3NfXywgc2VsZi50aHJpZnRfc3BlYykpKQorICAgICAgcmV0dXJuCisgICAgb3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbignVG9wb2xvZ3lIaXN0b3J5SW5mbycpCisgICAgaWYgc2VsZi50b3BvX2lkcyBpcyBub3QgTm9uZToKKyAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbigndG9wb19pZHMnLCBUVHlwZS5MSVNULCAxKQorICAgICAgb3Byb3Qud3JpdGVMaXN0QmVnaW4oVFR5cGUuU1RSSU5HLCBsZW4oc2VsZi50b3BvX2lkcykpCisgICAgICBmb3IgaXRlcjYzMCBpbiBzZWxmLnRvcG9faWRzOgorICAgICAgICBvcHJvdC53cml0ZVN0cmluZyhpdGVyNjMwLmVuY29kZSgndXRmLTgnKSkKKyAgICAgIG9wcm90LndyaXRlTGlzdEVuZCgpCisgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKKyAgICBvcHJvdC53cml0ZUZpZWxkU3RvcCgpCisgICAgb3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKQorCisgIGRlZiB2YWxpZGF0ZShzZWxmKToKKyAgICByZXR1cm4KKworCisgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICB2YWx1ZSA9IDE3CisgICAgdmFsdWUgPSAodmFsdWUgKiAzMSkgXiBoYXNoKHNlbGYudG9wb19pZHMpCisgICAgcmV0dXJuIHZhbHVlCisKKyAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgIEwgPSBbJyVzPSVyJyAlIChrZXksIHZhbHVlKQorICAgICAgZm9yIGtleSwgdmFsdWUgaW4gc2VsZi5fX2RpY3RfXy5pdGVyaXRlbXMoKV0KKyAgICByZXR1cm4gJyVzKCVzKScgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sICcsICcuam9pbihMKSkKKworICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICByZXR1cm4gaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pIGFuZCBzZWxmLl9fZGljdF9fID09IG90aGVyLl9fZGljdF9fCisKKyAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CisgICAgcmV0dXJuIG5vdCAoc2VsZiA9PSBvdGhlcikKKwogY2xhc3MgRFJQQ1JlcXVlc3Q6CiAgICIiIgogICBBdHRyaWJ1dGVzOgpAQCAtNjQ5OSwzICs5NDg4LDU5NiBAQAogCiAgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgogICAgIHJldHVybiBub3QgKHNlbGYgPT0gb3RoZXIpCisKK2NsYXNzIEhCTWVzc2FnZURhdGE6CisgICIiIgorICBBdHRyaWJ1dGVzOgorICAgLSBwYXRoCisgICAtIHB1bHNlCisgICAtIGJvb2x2YWwKKyAgIC0gcmVjb3JkcworICAgLSBub2RlcworICAgLSBtZXNzYWdlX2Jsb2IKKyAgIiIiCisKKyAgdGhyaWZ0X3NwZWMgPSAoCisgICAgTm9uZSwgIyAwCisgICAgKDEsIFRUeXBlLlNUUklORywgJ3BhdGgnLCBOb25lLCBOb25lLCApLCAjIDEKKyAgICAoMiwgVFR5cGUuU1RSVUNULCAncHVsc2UnLCAoSEJQdWxzZSwgSEJQdWxzZS50aHJpZnRfc3BlYyksIE5vbmUsICksICMgMgorICAgICgzLCBUVHlwZS5CT09MLCAnYm9vbHZhbCcsIE5vbmUsIE5vbmUsICksICMgMworICAgICg0LCBUVHlwZS5TVFJVQ1QsICdyZWNvcmRzJywgKEhCUmVjb3JkcywgSEJSZWNvcmRzLnRocmlmdF9zcGVjKSwgTm9uZSwgKSwgIyA0CisgICAgKDUsIFRUeXBlLlNUUlVDVCwgJ25vZGVzJywgKEhCTm9kZXMsIEhCTm9kZXMudGhyaWZ0X3NwZWMpLCBOb25lLCApLCAjIDUKKyAgICBOb25lLCAjIDYKKyAgICAoNywgVFR5cGUuU1RSSU5HLCAnbWVzc2FnZV9ibG9iJywgTm9uZSwgTm9uZSwgKSwgIyA3CisgICkKKworICBkZWYgX19pbml0X18oc2VsZiwgcGF0aD1Ob25lLCBwdWxzZT1Ob25lLCBib29sdmFsPU5vbmUsIHJlY29yZHM9Tm9uZSwgbm9kZXM9Tm9uZSwgbWVzc2FnZV9ibG9iPU5vbmUsKToKKyAgICBzZWxmLnBhdGggPSBwYXRoCisgICAgc2VsZi5wdWxzZSA9IHB1bHNlCisgICAgc2VsZi5ib29sdmFsID0gYm9vbHZhbAorICAgIHNlbGYucmVjb3JkcyA9IHJlY29yZHMKKyAgICBzZWxmLm5vZGVzID0gbm9kZXMKKyAgICBzZWxmLm1lc3NhZ2VfYmxvYiA9IG1lc3NhZ2VfYmxvYgorCisgIGRlZiByZWFkKHNlbGYsIGlwcm90KToKKyAgICBpZiBpcHJvdC5fX2NsYXNzX18gPT0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIGFuZCBpc2luc3RhbmNlKGlwcm90LnRyYW5zLCBUVHJhbnNwb3J0LkNSZWFkYWJsZVRyYW5zcG9ydCkgYW5kIHNlbGYudGhyaWZ0X3NwZWMgaXMgbm90IE5vbmUgYW5kIGZhc3RiaW5hcnkgaXMgbm90IE5vbmU6CisgICAgICBmYXN0YmluYXJ5LmRlY29kZV9iaW5hcnkoc2VsZiwgaXByb3QudHJhbnMsIChzZWxmLl9fY2xhc3NfXywgc2VsZi50aHJpZnRfc3BlYykpCisgICAgICByZXR1cm4KKyAgICBpcHJvdC5yZWFkU3RydWN0QmVnaW4oKQorICAgIHdoaWxlIFRydWU6CisgICAgICAoZm5hbWUsIGZ0eXBlLCBmaWQpID0gaXByb3QucmVhZEZpZWxkQmVnaW4oKQorICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuU1RPUDoKKyAgICAgICAgYnJlYWsKKyAgICAgIGlmIGZpZCA9PSAxOgorICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5TVFJJTkc6CisgICAgICAgICAgc2VsZi5wYXRoID0gaXByb3QucmVhZFN0cmluZygpLmRlY29kZSgndXRmLTgnKQorICAgICAgICBlbHNlOgorICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBlbGlmIGZpZCA9PSAyOgorICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5TVFJVQ1Q6CisgICAgICAgICAgc2VsZi5wdWxzZSA9IEhCUHVsc2UoKQorICAgICAgICAgIHNlbGYucHVsc2UucmVhZChpcHJvdCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgZWxpZiBmaWQgPT0gMzoKKyAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuQk9PTDoKKyAgICAgICAgICBzZWxmLmJvb2x2YWwgPSBpcHJvdC5yZWFkQm9vbCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgIGVsaWYgZmlkID09IDQ6CisgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLlNUUlVDVDoKKyAgICAgICAgICBzZWxmLnJlY29yZHMgPSBIQlJlY29yZHMoKQorICAgICAgICAgIHNlbGYucmVjb3Jkcy5yZWFkKGlwcm90KQorICAgICAgICBlbHNlOgorICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBlbGlmIGZpZCA9PSA1OgorICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5TVFJVQ1Q6CisgICAgICAgICAgc2VsZi5ub2RlcyA9IEhCTm9kZXMoKQorICAgICAgICAgIHNlbGYubm9kZXMucmVhZChpcHJvdCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgZWxpZiBmaWQgPT0gNzoKKyAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuU1RSSU5HOgorICAgICAgICAgIHNlbGYubWVzc2FnZV9ibG9iID0gaXByb3QucmVhZFN0cmluZygpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgIGVsc2U6CisgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBpcHJvdC5yZWFkRmllbGRFbmQoKQorICAgIGlwcm90LnJlYWRTdHJ1Y3RFbmQoKQorCisgIGRlZiB3cml0ZShzZWxmLCBvcHJvdCk6CisgICAgaWYgb3Byb3QuX19jbGFzc19fID09IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCBhbmQgc2VsZi50aHJpZnRfc3BlYyBpcyBub3QgTm9uZSBhbmQgZmFzdGJpbmFyeSBpcyBub3QgTm9uZToKKyAgICAgIG9wcm90LnRyYW5zLndyaXRlKGZhc3RiaW5hcnkuZW5jb2RlX2JpbmFyeShzZWxmLCAoc2VsZi5fX2NsYXNzX18sIHNlbGYudGhyaWZ0X3NwZWMpKSkKKyAgICAgIHJldHVybgorICAgIG9wcm90LndyaXRlU3RydWN0QmVnaW4oJ0hCTWVzc2FnZURhdGEnKQorICAgIGlmIHNlbGYucGF0aCBpcyBub3QgTm9uZToKKyAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbigncGF0aCcsIFRUeXBlLlNUUklORywgMSkKKyAgICAgIG9wcm90LndyaXRlU3RyaW5nKHNlbGYucGF0aC5lbmNvZGUoJ3V0Zi04JykpCisgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKKyAgICBpZiBzZWxmLnB1bHNlIGlzIG5vdCBOb25lOgorICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCdwdWxzZScsIFRUeXBlLlNUUlVDVCwgMikKKyAgICAgIHNlbGYucHVsc2Uud3JpdGUob3Byb3QpCisgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKKyAgICBpZiBzZWxmLmJvb2x2YWwgaXMgbm90IE5vbmU6CisgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ2Jvb2x2YWwnLCBUVHlwZS5CT09MLCAzKQorICAgICAgb3Byb3Qud3JpdGVCb29sKHNlbGYuYm9vbHZhbCkKKyAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKQorICAgIGlmIHNlbGYucmVjb3JkcyBpcyBub3QgTm9uZToKKyAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbigncmVjb3JkcycsIFRUeXBlLlNUUlVDVCwgNCkKKyAgICAgIHNlbGYucmVjb3Jkcy53cml0ZShvcHJvdCkKKyAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKQorICAgIGlmIHNlbGYubm9kZXMgaXMgbm90IE5vbmU6CisgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ25vZGVzJywgVFR5cGUuU1RSVUNULCA1KQorICAgICAgc2VsZi5ub2Rlcy53cml0ZShvcHJvdCkKKyAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKQorICAgIGlmIHNlbGYubWVzc2FnZV9ibG9iIGlzIG5vdCBOb25lOgorICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCdtZXNzYWdlX2Jsb2InLCBUVHlwZS5TVFJJTkcsIDcpCisgICAgICBvcHJvdC53cml0ZVN0cmluZyhzZWxmLm1lc3NhZ2VfYmxvYikKKyAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKQorICAgIG9wcm90LndyaXRlRmllbGRTdG9wKCkKKyAgICBvcHJvdC53cml0ZVN0cnVjdEVuZCgpCisKKyAgZGVmIHZhbGlkYXRlKHNlbGYpOgorICAgIHJldHVybgorCisKKyAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgIHZhbHVlID0gMTcKKyAgICB2YWx1ZSA9ICh2YWx1ZSAqIDMxKSBeIGhhc2goc2VsZi5wYXRoKQorICAgIHZhbHVlID0gKHZhbHVlICogMzEpIF4gaGFzaChzZWxmLnB1bHNlKQorICAgIHZhbHVlID0gKHZhbHVlICogMzEpIF4gaGFzaChzZWxmLmJvb2x2YWwpCisgICAgdmFsdWUgPSAodmFsdWUgKiAzMSkgXiBoYXNoKHNlbGYucmVjb3JkcykKKyAgICB2YWx1ZSA9ICh2YWx1ZSAqIDMxKSBeIGhhc2goc2VsZi5ub2RlcykKKyAgICB2YWx1ZSA9ICh2YWx1ZSAqIDMxKSBeIGhhc2goc2VsZi5tZXNzYWdlX2Jsb2IpCisgICAgcmV0dXJuIHZhbHVlCisKKyAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgIEwgPSBbJyVzPSVyJyAlIChrZXksIHZhbHVlKQorICAgICAgZm9yIGtleSwgdmFsdWUgaW4gc2VsZi5fX2RpY3RfXy5pdGVyaXRlbXMoKV0KKyAgICByZXR1cm4gJyVzKCVzKScgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sICcsICcuam9pbihMKSkKKworICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICByZXR1cm4gaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pIGFuZCBzZWxmLl9fZGljdF9fID09IG90aGVyLl9fZGljdF9fCisKKyAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CisgICAgcmV0dXJuIG5vdCAoc2VsZiA9PSBvdGhlcikKKworY2xhc3MgSEJNZXNzYWdlOgorICAiIiIKKyAgQXR0cmlidXRlczoKKyAgIC0gdHlwZQorICAgLSBkYXRhCisgICAtIG1lc3NhZ2VfaWQKKyAgIiIiCisKKyAgdGhyaWZ0X3NwZWMgPSAoCisgICAgTm9uZSwgIyAwCisgICAgKDEsIFRUeXBlLkkzMiwgJ3R5cGUnLCBOb25lLCBOb25lLCApLCAjIDEKKyAgICAoMiwgVFR5cGUuU1RSVUNULCAnZGF0YScsIChIQk1lc3NhZ2VEYXRhLCBIQk1lc3NhZ2VEYXRhLnRocmlmdF9zcGVjKSwgTm9uZSwgKSwgIyAyCisgICAgKDMsIFRUeXBlLkkzMiwgJ21lc3NhZ2VfaWQnLCBOb25lLCAtMSwgKSwgIyAzCisgICkKKworICBkZWYgX19pbml0X18oc2VsZiwgdHlwZT1Ob25lLCBkYXRhPU5vbmUsIG1lc3NhZ2VfaWQ9dGhyaWZ0X3NwZWNbM11bNF0sKToKKyAgICBzZWxmLnR5cGUgPSB0eXBlCisgICAgc2VsZi5kYXRhID0gZGF0YQorICAgIHNlbGYubWVzc2FnZV9pZCA9IG1lc3NhZ2VfaWQKKworICBkZWYgcmVhZChzZWxmLCBpcHJvdCk6CisgICAgaWYgaXByb3QuX19jbGFzc19fID09IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCBhbmQgaXNpbnN0YW5jZShpcHJvdC50cmFucywgVFRyYW5zcG9ydC5DUmVhZGFibGVUcmFuc3BvcnQpIGFuZCBzZWxmLnRocmlmdF9zcGVjIGlzIG5vdCBOb25lIGFuZCBmYXN0YmluYXJ5IGlzIG5vdCBOb25lOgorICAgICAgZmFzdGJpbmFyeS5kZWNvZGVfYmluYXJ5KHNlbGYsIGlwcm90LnRyYW5zLCAoc2VsZi5fX2NsYXNzX18sIHNlbGYudGhyaWZ0X3NwZWMpKQorICAgICAgcmV0dXJuCisgICAgaXByb3QucmVhZFN0cnVjdEJlZ2luKCkKKyAgICB3aGlsZSBUcnVlOgorICAgICAgKGZuYW1lLCBmdHlwZSwgZmlkKSA9IGlwcm90LnJlYWRGaWVsZEJlZ2luKCkKKyAgICAgIGlmIGZ0eXBlID09IFRUeXBlLlNUT1A6CisgICAgICAgIGJyZWFrCisgICAgICBpZiBmaWQgPT0gMToKKyAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuSTMyOgorICAgICAgICAgIHNlbGYudHlwZSA9IGlwcm90LnJlYWRJMzIoKQorICAgICAgICBlbHNlOgorICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBlbGlmIGZpZCA9PSAyOgorICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5TVFJVQ1Q6CisgICAgICAgICAgc2VsZi5kYXRhID0gSEJNZXNzYWdlRGF0YSgpCisgICAgICAgICAgc2VsZi5kYXRhLnJlYWQoaXByb3QpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgIGVsaWYgZmlkID09IDM6CisgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLkkzMjoKKyAgICAgICAgICBzZWxmLm1lc3NhZ2VfaWQgPSBpcHJvdC5yZWFkSTMyKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgZWxzZToKKyAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgIGlwcm90LnJlYWRGaWVsZEVuZCgpCisgICAgaXByb3QucmVhZFN0cnVjdEVuZCgpCisKKyAgZGVmIHdyaXRlKHNlbGYsIG9wcm90KToKKyAgICBpZiBvcHJvdC5fX2NsYXNzX18gPT0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIGFuZCBzZWxmLnRocmlmdF9zcGVjIGlzIG5vdCBOb25lIGFuZCBmYXN0YmluYXJ5IGlzIG5vdCBOb25lOgorICAgICAgb3Byb3QudHJhbnMud3JpdGUoZmFzdGJpbmFyeS5lbmNvZGVfYmluYXJ5KHNlbGYsIChzZWxmLl9fY2xhc3NfXywgc2VsZi50aHJpZnRfc3BlYykpKQorICAgICAgcmV0dXJuCisgICAgb3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbignSEJNZXNzYWdlJykKKyAgICBpZiBzZWxmLnR5cGUgaXMgbm90IE5vbmU6CisgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ3R5cGUnLCBUVHlwZS5JMzIsIDEpCisgICAgICBvcHJvdC53cml0ZUkzMihzZWxmLnR5cGUpCisgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKKyAgICBpZiBzZWxmLmRhdGEgaXMgbm90IE5vbmU6CisgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ2RhdGEnLCBUVHlwZS5TVFJVQ1QsIDIpCisgICAgICBzZWxmLmRhdGEud3JpdGUob3Byb3QpCisgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKKyAgICBpZiBzZWxmLm1lc3NhZ2VfaWQgaXMgbm90IE5vbmU6CisgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ21lc3NhZ2VfaWQnLCBUVHlwZS5JMzIsIDMpCisgICAgICBvcHJvdC53cml0ZUkzMihzZWxmLm1lc3NhZ2VfaWQpCisgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKKyAgICBvcHJvdC53cml0ZUZpZWxkU3RvcCgpCisgICAgb3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKQorCisgIGRlZiB2YWxpZGF0ZShzZWxmKToKKyAgICByZXR1cm4KKworCisgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICB2YWx1ZSA9IDE3CisgICAgdmFsdWUgPSAodmFsdWUgKiAzMSkgXiBoYXNoKHNlbGYudHlwZSkKKyAgICB2YWx1ZSA9ICh2YWx1ZSAqIDMxKSBeIGhhc2goc2VsZi5kYXRhKQorICAgIHZhbHVlID0gKHZhbHVlICogMzEpIF4gaGFzaChzZWxmLm1lc3NhZ2VfaWQpCisgICAgcmV0dXJuIHZhbHVlCisKKyAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgIEwgPSBbJyVzPSVyJyAlIChrZXksIHZhbHVlKQorICAgICAgZm9yIGtleSwgdmFsdWUgaW4gc2VsZi5fX2RpY3RfXy5pdGVyaXRlbXMoKV0KKyAgICByZXR1cm4gJyVzKCVzKScgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sICcsICcuam9pbihMKSkKKworICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICByZXR1cm4gaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pIGFuZCBzZWxmLl9fZGljdF9fID09IG90aGVyLl9fZGljdF9fCisKKyAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CisgICAgcmV0dXJuIG5vdCAoc2VsZiA9PSBvdGhlcikKKworY2xhc3MgSEJBdXRob3JpemF0aW9uRXhjZXB0aW9uKFRFeGNlcHRpb24pOgorICAiIiIKKyAgQXR0cmlidXRlczoKKyAgIC0gbXNnCisgICIiIgorCisgIHRocmlmdF9zcGVjID0gKAorICAgIE5vbmUsICMgMAorICAgICgxLCBUVHlwZS5TVFJJTkcsICdtc2cnLCBOb25lLCBOb25lLCApLCAjIDEKKyAgKQorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBtc2c9Tm9uZSwpOgorICAgIHNlbGYubXNnID0gbXNnCisKKyAgZGVmIHJlYWQoc2VsZiwgaXByb3QpOgorICAgIGlmIGlwcm90Ll9fY2xhc3NfXyA9PSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgYW5kIGlzaW5zdGFuY2UoaXByb3QudHJhbnMsIFRUcmFuc3BvcnQuQ1JlYWRhYmxlVHJhbnNwb3J0KSBhbmQgc2VsZi50aHJpZnRfc3BlYyBpcyBub3QgTm9uZSBhbmQgZmFzdGJpbmFyeSBpcyBub3QgTm9uZToKKyAgICAgIGZhc3RiaW5hcnkuZGVjb2RlX2JpbmFyeShzZWxmLCBpcHJvdC50cmFucywgKHNlbGYuX19jbGFzc19fLCBzZWxmLnRocmlmdF9zcGVjKSkKKyAgICAgIHJldHVybgorICAgIGlwcm90LnJlYWRTdHJ1Y3RCZWdpbigpCisgICAgd2hpbGUgVHJ1ZToKKyAgICAgIChmbmFtZSwgZnR5cGUsIGZpZCkgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpCisgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5TVE9QOgorICAgICAgICBicmVhaworICAgICAgaWYgZmlkID09IDE6CisgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLlNUUklORzoKKyAgICAgICAgICBzZWxmLm1zZyA9IGlwcm90LnJlYWRTdHJpbmcoKS5kZWNvZGUoJ3V0Zi04JykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgZWxzZToKKyAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgIGlwcm90LnJlYWRGaWVsZEVuZCgpCisgICAgaXByb3QucmVhZFN0cnVjdEVuZCgpCisKKyAgZGVmIHdyaXRlKHNlbGYsIG9wcm90KToKKyAgICBpZiBvcHJvdC5fX2NsYXNzX18gPT0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIGFuZCBzZWxmLnRocmlmdF9zcGVjIGlzIG5vdCBOb25lIGFuZCBmYXN0YmluYXJ5IGlzIG5vdCBOb25lOgorICAgICAgb3Byb3QudHJhbnMud3JpdGUoZmFzdGJpbmFyeS5lbmNvZGVfYmluYXJ5KHNlbGYsIChzZWxmLl9fY2xhc3NfXywgc2VsZi50aHJpZnRfc3BlYykpKQorICAgICAgcmV0dXJuCisgICAgb3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbignSEJBdXRob3JpemF0aW9uRXhjZXB0aW9uJykKKyAgICBpZiBzZWxmLm1zZyBpcyBub3QgTm9uZToKKyAgICAgIG9wcm90LndyaXRlRmllbGRCZWdpbignbXNnJywgVFR5cGUuU1RSSU5HLCAxKQorICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoc2VsZi5tc2cuZW5jb2RlKCd1dGYtOCcpKQorICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCisgICAgb3Byb3Qud3JpdGVGaWVsZFN0b3AoKQorICAgIG9wcm90LndyaXRlU3RydWN0RW5kKCkKKworICBkZWYgdmFsaWRhdGUoc2VsZik6CisgICAgaWYgc2VsZi5tc2cgaXMgTm9uZToKKyAgICAgIHJhaXNlIFRQcm90b2NvbC5UUHJvdG9jb2xFeGNlcHRpb24obWVzc2FnZT0nUmVxdWlyZWQgZmllbGQgbXNnIGlzIHVuc2V0IScpCisgICAgcmV0dXJuCisKKworICBkZWYgX19zdHJfXyhzZWxmKToKKyAgICByZXR1cm4gcmVwcihzZWxmKQorCisgIGRlZiBfX2hhc2hfXyhzZWxmKToKKyAgICB2YWx1ZSA9IDE3CisgICAgdmFsdWUgPSAodmFsdWUgKiAzMSkgXiBoYXNoKHNlbGYubXNnKQorICAgIHJldHVybiB2YWx1ZQorCisgIGRlZiBfX3JlcHJfXyhzZWxmKToKKyAgICBMID0gWyclcz0lcicgJSAoa2V5LCB2YWx1ZSkKKyAgICAgIGZvciBrZXksIHZhbHVlIGluIHNlbGYuX19kaWN0X18uaXRlcml0ZW1zKCldCisgICAgcmV0dXJuICclcyglcyknICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCAnLCAnLmpvaW4oTCkpCisKKyAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6CisgICAgcmV0dXJuIGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKSBhbmQgc2VsZi5fX2RpY3RfXyA9PSBvdGhlci5fX2RpY3RfXworCisgIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgorICAgIHJldHVybiBub3QgKHNlbGYgPT0gb3RoZXIpCisKK2NsYXNzIEhCRXhlY3V0aW9uRXhjZXB0aW9uKFRFeGNlcHRpb24pOgorICAiIiIKKyAgQXR0cmlidXRlczoKKyAgIC0gbXNnCisgICIiIgorCisgIHRocmlmdF9zcGVjID0gKAorICAgIE5vbmUsICMgMAorICAgICgxLCBUVHlwZS5TVFJJTkcsICdtc2cnLCBOb25lLCBOb25lLCApLCAjIDEKKyAgKQorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBtc2c9Tm9uZSwpOgorICAgIHNlbGYubXNnID0gbXNnCisKKyAgZGVmIHJlYWQoc2VsZiwgaXByb3QpOgorICAgIGlmIGlwcm90Ll9fY2xhc3NfXyA9PSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgYW5kIGlzaW5zdGFuY2UoaXByb3QudHJhbnMsIFRUcmFuc3BvcnQuQ1JlYWRhYmxlVHJhbnNwb3J0KSBhbmQgc2VsZi50aHJpZnRfc3BlYyBpcyBub3QgTm9uZSBhbmQgZmFzdGJpbmFyeSBpcyBub3QgTm9uZToKKyAgICAgIGZhc3RiaW5hcnkuZGVjb2RlX2JpbmFyeShzZWxmLCBpcHJvdC50cmFucywgKHNlbGYuX19jbGFzc19fLCBzZWxmLnRocmlmdF9zcGVjKSkKKyAgICAgIHJldHVybgorICAgIGlwcm90LnJlYWRTdHJ1Y3RCZWdpbigpCisgICAgd2hpbGUgVHJ1ZToKKyAgICAgIChmbmFtZSwgZnR5cGUsIGZpZCkgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpCisgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5TVE9QOgorICAgICAgICBicmVhaworICAgICAgaWYgZmlkID09IDE6CisgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLlNUUklORzoKKyAgICAgICAgICBzZWxmLm1zZyA9IGlwcm90LnJlYWRTdHJpbmcoKS5kZWNvZGUoJ3V0Zi04JykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgZWxzZToKKyAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgIGlwcm90LnJlYWRGaWVsZEVuZCgpCisgICAgaXByb3QucmVhZFN0cnVjdEVuZCgpCisKKyAgZGVmIHdyaXRlKHNlbGYsIG9wcm90KToKKyAgICBpZiBvcHJvdC5fX2NsYXNzX18gPT0gVEJpbmFyeVByb3RvY29sLlRCaW5hcnlQcm90b2NvbEFjY2VsZXJhdGVkIGFuZCBzZWxmLnRocmlmdF9zcGVjIGlzIG5vdCBOb25lIGFuZCBmYXN0YmluYXJ5IGlzIG5vdCBOb25lOgorICAgICAgb3Byb3QudHJhbnMud3JpdGUoZmFzdGJpbmFyeS5lbmNvZGVfYmluYXJ5KHNlbGYsIChzZWxmLl9fY2xhc3NfXywgc2VsZi50aHJpZnRfc3BlYykpKQorICAgICAgcmV0dXJuCisgICAgb3Byb3Qud3JpdGVTdHJ1Y3RCZWdpbignSEJFeGVjdXRpb25FeGNlcHRpb24nKQorICAgIGlmIHNlbGYubXNnIGlzIG5vdCBOb25lOgorICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCdtc2cnLCBUVHlwZS5TVFJJTkcsIDEpCisgICAgICBvcHJvdC53cml0ZVN0cmluZyhzZWxmLm1zZy5lbmNvZGUoJ3V0Zi04JykpCisgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKKyAgICBvcHJvdC53cml0ZUZpZWxkU3RvcCgpCisgICAgb3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKQorCisgIGRlZiB2YWxpZGF0ZShzZWxmKToKKyAgICBpZiBzZWxmLm1zZyBpcyBOb25lOgorICAgICAgcmFpc2UgVFByb3RvY29sLlRQcm90b2NvbEV4Y2VwdGlvbihtZXNzYWdlPSdSZXF1aXJlZCBmaWVsZCBtc2cgaXMgdW5zZXQhJykKKyAgICByZXR1cm4KKworCisgIGRlZiBfX3N0cl9fKHNlbGYpOgorICAgIHJldHVybiByZXByKHNlbGYpCisKKyAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgIHZhbHVlID0gMTcKKyAgICB2YWx1ZSA9ICh2YWx1ZSAqIDMxKSBeIGhhc2goc2VsZi5tc2cpCisgICAgcmV0dXJuIHZhbHVlCisKKyAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgIEwgPSBbJyVzPSVyJyAlIChrZXksIHZhbHVlKQorICAgICAgZm9yIGtleSwgdmFsdWUgaW4gc2VsZi5fX2RpY3RfXy5pdGVyaXRlbXMoKV0KKyAgICByZXR1cm4gJyVzKCVzKScgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sICcsICcuam9pbihMKSkKKworICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICByZXR1cm4gaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pIGFuZCBzZWxmLl9fZGljdF9fID09IG90aGVyLl9fZGljdF9fCisKKyAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CisgICAgcmV0dXJuIG5vdCAoc2VsZiA9PSBvdGhlcikKKworY2xhc3MgSEJQdWxzZToKKyAgIiIiCisgIEF0dHJpYnV0ZXM6CisgICAtIGlkCisgICAtIGRldGFpbHMKKyAgIiIiCisKKyAgdGhyaWZ0X3NwZWMgPSAoCisgICAgTm9uZSwgIyAwCisgICAgKDEsIFRUeXBlLlNUUklORywgJ2lkJywgTm9uZSwgTm9uZSwgKSwgIyAxCisgICAgKDIsIFRUeXBlLlNUUklORywgJ2RldGFpbHMnLCBOb25lLCBOb25lLCApLCAjIDIKKyAgKQorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBpZD1Ob25lLCBkZXRhaWxzPU5vbmUsKToKKyAgICBzZWxmLmlkID0gaWQKKyAgICBzZWxmLmRldGFpbHMgPSBkZXRhaWxzCisKKyAgZGVmIHJlYWQoc2VsZiwgaXByb3QpOgorICAgIGlmIGlwcm90Ll9fY2xhc3NfXyA9PSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgYW5kIGlzaW5zdGFuY2UoaXByb3QudHJhbnMsIFRUcmFuc3BvcnQuQ1JlYWRhYmxlVHJhbnNwb3J0KSBhbmQgc2VsZi50aHJpZnRfc3BlYyBpcyBub3QgTm9uZSBhbmQgZmFzdGJpbmFyeSBpcyBub3QgTm9uZToKKyAgICAgIGZhc3RiaW5hcnkuZGVjb2RlX2JpbmFyeShzZWxmLCBpcHJvdC50cmFucywgKHNlbGYuX19jbGFzc19fLCBzZWxmLnRocmlmdF9zcGVjKSkKKyAgICAgIHJldHVybgorICAgIGlwcm90LnJlYWRTdHJ1Y3RCZWdpbigpCisgICAgd2hpbGUgVHJ1ZToKKyAgICAgIChmbmFtZSwgZnR5cGUsIGZpZCkgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpCisgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5TVE9QOgorICAgICAgICBicmVhaworICAgICAgaWYgZmlkID09IDE6CisgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLlNUUklORzoKKyAgICAgICAgICBzZWxmLmlkID0gaXByb3QucmVhZFN0cmluZygpLmRlY29kZSgndXRmLTgnKQorICAgICAgICBlbHNlOgorICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBlbGlmIGZpZCA9PSAyOgorICAgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5TVFJJTkc6CisgICAgICAgICAgc2VsZi5kZXRhaWxzID0gaXByb3QucmVhZFN0cmluZygpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgaXByb3Quc2tpcChmdHlwZSkKKyAgICAgIGVsc2U6CisgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBpcHJvdC5yZWFkRmllbGRFbmQoKQorICAgIGlwcm90LnJlYWRTdHJ1Y3RFbmQoKQorCisgIGRlZiB3cml0ZShzZWxmLCBvcHJvdCk6CisgICAgaWYgb3Byb3QuX19jbGFzc19fID09IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCBhbmQgc2VsZi50aHJpZnRfc3BlYyBpcyBub3QgTm9uZSBhbmQgZmFzdGJpbmFyeSBpcyBub3QgTm9uZToKKyAgICAgIG9wcm90LnRyYW5zLndyaXRlKGZhc3RiaW5hcnkuZW5jb2RlX2JpbmFyeShzZWxmLCAoc2VsZi5fX2NsYXNzX18sIHNlbGYudGhyaWZ0X3NwZWMpKSkKKyAgICAgIHJldHVybgorICAgIG9wcm90LndyaXRlU3RydWN0QmVnaW4oJ0hCUHVsc2UnKQorICAgIGlmIHNlbGYuaWQgaXMgbm90IE5vbmU6CisgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ2lkJywgVFR5cGUuU1RSSU5HLCAxKQorICAgICAgb3Byb3Qud3JpdGVTdHJpbmcoc2VsZi5pZC5lbmNvZGUoJ3V0Zi04JykpCisgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKKyAgICBpZiBzZWxmLmRldGFpbHMgaXMgbm90IE5vbmU6CisgICAgICBvcHJvdC53cml0ZUZpZWxkQmVnaW4oJ2RldGFpbHMnLCBUVHlwZS5TVFJJTkcsIDIpCisgICAgICBvcHJvdC53cml0ZVN0cmluZyhzZWxmLmRldGFpbHMpCisgICAgICBvcHJvdC53cml0ZUZpZWxkRW5kKCkKKyAgICBvcHJvdC53cml0ZUZpZWxkU3RvcCgpCisgICAgb3Byb3Qud3JpdGVTdHJ1Y3RFbmQoKQorCisgIGRlZiB2YWxpZGF0ZShzZWxmKToKKyAgICBpZiBzZWxmLmlkIGlzIE5vbmU6CisgICAgICByYWlzZSBUUHJvdG9jb2wuVFByb3RvY29sRXhjZXB0aW9uKG1lc3NhZ2U9J1JlcXVpcmVkIGZpZWxkIGlkIGlzIHVuc2V0IScpCisgICAgcmV0dXJuCisKKworICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgdmFsdWUgPSAxNworICAgIHZhbHVlID0gKHZhbHVlICogMzEpIF4gaGFzaChzZWxmLmlkKQorICAgIHZhbHVlID0gKHZhbHVlICogMzEpIF4gaGFzaChzZWxmLmRldGFpbHMpCisgICAgcmV0dXJuIHZhbHVlCisKKyAgZGVmIF9fcmVwcl9fKHNlbGYpOgorICAgIEwgPSBbJyVzPSVyJyAlIChrZXksIHZhbHVlKQorICAgICAgZm9yIGtleSwgdmFsdWUgaW4gc2VsZi5fX2RpY3RfXy5pdGVyaXRlbXMoKV0KKyAgICByZXR1cm4gJyVzKCVzKScgJSAoc2VsZi5fX2NsYXNzX18uX19uYW1lX18sICcsICcuam9pbihMKSkKKworICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKKyAgICByZXR1cm4gaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pIGFuZCBzZWxmLl9fZGljdF9fID09IG90aGVyLl9fZGljdF9fCisKKyAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6CisgICAgcmV0dXJuIG5vdCAoc2VsZiA9PSBvdGhlcikKKworY2xhc3MgSEJSZWNvcmRzOgorICAiIiIKKyAgQXR0cmlidXRlczoKKyAgIC0gcHVsc2VzCisgICIiIgorCisgIHRocmlmdF9zcGVjID0gKAorICAgIE5vbmUsICMgMAorICAgICgxLCBUVHlwZS5MSVNULCAncHVsc2VzJywgKFRUeXBlLlNUUlVDVCwoSEJQdWxzZSwgSEJQdWxzZS50aHJpZnRfc3BlYykpLCBOb25lLCApLCAjIDEKKyAgKQorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBwdWxzZXM9Tm9uZSwpOgorICAgIHNlbGYucHVsc2VzID0gcHVsc2VzCisKKyAgZGVmIHJlYWQoc2VsZiwgaXByb3QpOgorICAgIGlmIGlwcm90Ll9fY2xhc3NfXyA9PSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgYW5kIGlzaW5zdGFuY2UoaXByb3QudHJhbnMsIFRUcmFuc3BvcnQuQ1JlYWRhYmxlVHJhbnNwb3J0KSBhbmQgc2VsZi50aHJpZnRfc3BlYyBpcyBub3QgTm9uZSBhbmQgZmFzdGJpbmFyeSBpcyBub3QgTm9uZToKKyAgICAgIGZhc3RiaW5hcnkuZGVjb2RlX2JpbmFyeShzZWxmLCBpcHJvdC50cmFucywgKHNlbGYuX19jbGFzc19fLCBzZWxmLnRocmlmdF9zcGVjKSkKKyAgICAgIHJldHVybgorICAgIGlwcm90LnJlYWRTdHJ1Y3RCZWdpbigpCisgICAgd2hpbGUgVHJ1ZToKKyAgICAgIChmbmFtZSwgZnR5cGUsIGZpZCkgPSBpcHJvdC5yZWFkRmllbGRCZWdpbigpCisgICAgICBpZiBmdHlwZSA9PSBUVHlwZS5TVE9QOgorICAgICAgICBicmVhaworICAgICAgaWYgZmlkID09IDE6CisgICAgICAgIGlmIGZ0eXBlID09IFRUeXBlLkxJU1Q6CisgICAgICAgICAgc2VsZi5wdWxzZXMgPSBbXQorICAgICAgICAgIChfZXR5cGU2MjcsIF9zaXplNjI0KSA9IGlwcm90LnJlYWRMaXN0QmVnaW4oKQorICAgICAgICAgIGZvciBfaTYyOCBpbiB4cmFuZ2UoX3NpemU2MjQpOgorICAgICAgICAgICAgX2VsZW02MjkgPSBIQlB1bHNlKCkKKyAgICAgICAgICAgIF9lbGVtNjI5LnJlYWQoaXByb3QpCisgICAgICAgICAgICBzZWxmLnB1bHNlcy5hcHBlbmQoX2VsZW02MjkpCisgICAgICAgICAgaXByb3QucmVhZExpc3RFbmQoKQorICAgICAgICBlbHNlOgorICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBlbHNlOgorICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgaXByb3QucmVhZEZpZWxkRW5kKCkKKyAgICBpcHJvdC5yZWFkU3RydWN0RW5kKCkKKworICBkZWYgd3JpdGUoc2VsZiwgb3Byb3QpOgorICAgIGlmIG9wcm90Ll9fY2xhc3NfXyA9PSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgYW5kIHNlbGYudGhyaWZ0X3NwZWMgaXMgbm90IE5vbmUgYW5kIGZhc3RiaW5hcnkgaXMgbm90IE5vbmU6CisgICAgICBvcHJvdC50cmFucy53cml0ZShmYXN0YmluYXJ5LmVuY29kZV9iaW5hcnkoc2VsZiwgKHNlbGYuX19jbGFzc19fLCBzZWxmLnRocmlmdF9zcGVjKSkpCisgICAgICByZXR1cm4KKyAgICBvcHJvdC53cml0ZVN0cnVjdEJlZ2luKCdIQlJlY29yZHMnKQorICAgIGlmIHNlbGYucHVsc2VzIGlzIG5vdCBOb25lOgorICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCdwdWxzZXMnLCBUVHlwZS5MSVNULCAxKQorICAgICAgb3Byb3Qud3JpdGVMaXN0QmVnaW4oVFR5cGUuU1RSVUNULCBsZW4oc2VsZi5wdWxzZXMpKQorICAgICAgZm9yIGl0ZXI2MzAgaW4gc2VsZi5wdWxzZXM6CisgICAgICAgIGl0ZXI2MzAud3JpdGUob3Byb3QpCisgICAgICBvcHJvdC53cml0ZUxpc3RFbmQoKQorICAgICAgb3Byb3Qud3JpdGVGaWVsZEVuZCgpCisgICAgb3Byb3Qud3JpdGVGaWVsZFN0b3AoKQorICAgIG9wcm90LndyaXRlU3RydWN0RW5kKCkKKworICBkZWYgdmFsaWRhdGUoc2VsZik6CisgICAgcmV0dXJuCisKKworICBkZWYgX19oYXNoX18oc2VsZik6CisgICAgdmFsdWUgPSAxNworICAgIHZhbHVlID0gKHZhbHVlICogMzEpIF4gaGFzaChzZWxmLnB1bHNlcykKKyAgICByZXR1cm4gdmFsdWUKKworICBkZWYgX19yZXByX18oc2VsZik6CisgICAgTCA9IFsnJXM9JXInICUgKGtleSwgdmFsdWUpCisgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzZWxmLl9fZGljdF9fLml0ZXJpdGVtcygpXQorICAgIHJldHVybiAnJXMoJXMpJyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgJywgJy5qb2luKEwpKQorCisgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgIHJldHVybiBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXykgYW5kIHNlbGYuX19kaWN0X18gPT0gb3RoZXIuX19kaWN0X18KKworICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKKyAgICByZXR1cm4gbm90IChzZWxmID09IG90aGVyKQorCitjbGFzcyBIQk5vZGVzOgorICAiIiIKKyAgQXR0cmlidXRlczoKKyAgIC0gcHVsc2VJZHMKKyAgIiIiCisKKyAgdGhyaWZ0X3NwZWMgPSAoCisgICAgTm9uZSwgIyAwCisgICAgKDEsIFRUeXBlLkxJU1QsICdwdWxzZUlkcycsIChUVHlwZS5TVFJJTkcsTm9uZSksIE5vbmUsICksICMgMQorICApCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIHB1bHNlSWRzPU5vbmUsKToKKyAgICBzZWxmLnB1bHNlSWRzID0gcHVsc2VJZHMKKworICBkZWYgcmVhZChzZWxmLCBpcHJvdCk6CisgICAgaWYgaXByb3QuX19jbGFzc19fID09IFRCaW5hcnlQcm90b2NvbC5UQmluYXJ5UHJvdG9jb2xBY2NlbGVyYXRlZCBhbmQgaXNpbnN0YW5jZShpcHJvdC50cmFucywgVFRyYW5zcG9ydC5DUmVhZGFibGVUcmFuc3BvcnQpIGFuZCBzZWxmLnRocmlmdF9zcGVjIGlzIG5vdCBOb25lIGFuZCBmYXN0YmluYXJ5IGlzIG5vdCBOb25lOgorICAgICAgZmFzdGJpbmFyeS5kZWNvZGVfYmluYXJ5KHNlbGYsIGlwcm90LnRyYW5zLCAoc2VsZi5fX2NsYXNzX18sIHNlbGYudGhyaWZ0X3NwZWMpKQorICAgICAgcmV0dXJuCisgICAgaXByb3QucmVhZFN0cnVjdEJlZ2luKCkKKyAgICB3aGlsZSBUcnVlOgorICAgICAgKGZuYW1lLCBmdHlwZSwgZmlkKSA9IGlwcm90LnJlYWRGaWVsZEJlZ2luKCkKKyAgICAgIGlmIGZ0eXBlID09IFRUeXBlLlNUT1A6CisgICAgICAgIGJyZWFrCisgICAgICBpZiBmaWQgPT0gMToKKyAgICAgICAgaWYgZnR5cGUgPT0gVFR5cGUuTElTVDoKKyAgICAgICAgICBzZWxmLnB1bHNlSWRzID0gW10KKyAgICAgICAgICAoX2V0eXBlNjM0LCBfc2l6ZTYzMSkgPSBpcHJvdC5yZWFkTGlzdEJlZ2luKCkKKyAgICAgICAgICBmb3IgX2k2MzUgaW4geHJhbmdlKF9zaXplNjMxKToKKyAgICAgICAgICAgIF9lbGVtNjM2ID0gaXByb3QucmVhZFN0cmluZygpLmRlY29kZSgndXRmLTgnKQorICAgICAgICAgICAgc2VsZi5wdWxzZUlkcy5hcHBlbmQoX2VsZW02MzYpCisgICAgICAgICAgaXByb3QucmVhZExpc3RFbmQoKQorICAgICAgICBlbHNlOgorICAgICAgICAgIGlwcm90LnNraXAoZnR5cGUpCisgICAgICBlbHNlOgorICAgICAgICBpcHJvdC5za2lwKGZ0eXBlKQorICAgICAgaXByb3QucmVhZEZpZWxkRW5kKCkKKyAgICBpcHJvdC5yZWFkU3RydWN0RW5kKCkKKworICBkZWYgd3JpdGUoc2VsZiwgb3Byb3QpOgorICAgIGlmIG9wcm90Ll9fY2xhc3NfXyA9PSBUQmluYXJ5UHJvdG9jb2wuVEJpbmFyeVByb3RvY29sQWNjZWxlcmF0ZWQgYW5kIHNlbGYudGhyaWZ0X3NwZWMgaXMgbm90IE5vbmUgYW5kIGZhc3RiaW5hcnkgaXMgbm90IE5vbmU6CisgICAgICBvcHJvdC50cmFucy53cml0ZShmYXN0YmluYXJ5LmVuY29kZV9iaW5hcnkoc2VsZiwgKHNlbGYuX19jbGFzc19fLCBzZWxmLnRocmlmdF9zcGVjKSkpCisgICAgICByZXR1cm4KKyAgICBvcHJvdC53cml0ZVN0cnVjdEJlZ2luKCdIQk5vZGVzJykKKyAgICBpZiBzZWxmLnB1bHNlSWRzIGlzIG5vdCBOb25lOgorICAgICAgb3Byb3Qud3JpdGVGaWVsZEJlZ2luKCdwdWxzZUlkcycsIFRUeXBlLkxJU1QsIDEpCisgICAgICBvcHJvdC53cml0ZUxpc3RCZWdpbihUVHlwZS5TVFJJTkcsIGxlbihzZWxmLnB1bHNlSWRzKSkKKyAgICAgIGZvciBpdGVyNjM3IGluIHNlbGYucHVsc2VJZHM6CisgICAgICAgIG9wcm90LndyaXRlU3RyaW5nKGl0ZXI2MzcuZW5jb2RlKCd1dGYtOCcpKQorICAgICAgb3Byb3Qud3JpdGVMaXN0RW5kKCkKKyAgICAgIG9wcm90LndyaXRlRmllbGRFbmQoKQorICAgIG9wcm90LndyaXRlRmllbGRTdG9wKCkKKyAgICBvcHJvdC53cml0ZVN0cnVjdEVuZCgpCisKKyAgZGVmIHZhbGlkYXRlKHNlbGYpOgorICAgIHJldHVybgorCisKKyAgZGVmIF9faGFzaF9fKHNlbGYpOgorICAgIHZhbHVlID0gMTcKKyAgICB2YWx1ZSA9ICh2YWx1ZSAqIDMxKSBeIGhhc2goc2VsZi5wdWxzZUlkcykKKyAgICByZXR1cm4gdmFsdWUKKworICBkZWYgX19yZXByX18oc2VsZik6CisgICAgTCA9IFsnJXM9JXInICUgKGtleSwgdmFsdWUpCisgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzZWxmLl9fZGljdF9fLml0ZXJpdGVtcygpXQorICAgIHJldHVybiAnJXMoJXMpJyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgJywgJy5qb2luKEwpKQorCisgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgorICAgIHJldHVybiBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXykgYW5kIHNlbGYuX19kaWN0X18gPT0gb3RoZXIuX19kaWN0X18KKworICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKKyAgICByZXR1cm4gbm90IChzZWxmID09IG90aGVyKQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvc3Rvcm0udGhyaWZ0IGIvc3Rvcm0tY29yZS9zcmMvc3Rvcm0udGhyaWZ0CmluZGV4IGY2ODc2ODEuLjY3N2RlMmIgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL3N0b3JtLnRocmlmdAorKysgYi9zdG9ybS1jb3JlL3NyYy9zdG9ybS50aHJpZnQKQEAgLTExNyw2ICsxMTcsNyBAQAogICAxOiByZXF1aXJlZCBtYXA8c3RyaW5nLCBTcG91dFNwZWM+IHNwb3V0czsKICAgMjogcmVxdWlyZWQgbWFwPHN0cmluZywgQm9sdD4gYm9sdHM7CiAgIDM6IHJlcXVpcmVkIG1hcDxzdHJpbmcsIFN0YXRlU3BvdXRTcGVjPiBzdGF0ZV9zcG91dHM7CisgIDQ6IG9wdGlvbmFsIGxpc3Q8YmluYXJ5PiB3b3JrZXJfaG9va3M7CiB9CiAKIGV4Y2VwdGlvbiBBbHJlYWR5QWxpdmVFeGNlcHRpb24gewpAQCAtMTQ2LDYgKzE0NywxMiBAQAogNTEzOiBvcHRpb25hbCBzdHJpbmcgc2NoZWRfc3RhdHVzOwogNTE0OiBvcHRpb25hbCBzdHJpbmcgb3duZXI7CiA1MTU6IG9wdGlvbmFsIGkzMiByZXBsaWNhdGlvbl9jb3VudDsKKzUyMTogb3B0aW9uYWwgZG91YmxlIHJlcXVlc3RlZF9tZW1vbmhlYXA7Cis1MjI6IG9wdGlvbmFsIGRvdWJsZSByZXF1ZXN0ZWRfbWVtb2ZmaGVhcDsKKzUyMzogb3B0aW9uYWwgZG91YmxlIHJlcXVlc3RlZF9jcHU7Cis1MjQ6IG9wdGlvbmFsIGRvdWJsZSBhc3NpZ25lZF9tZW1vbmhlYXA7Cis1MjU6IG9wdGlvbmFsIGRvdWJsZSBhc3NpZ25lZF9tZW1vZmZoZWFwOworNTI2OiBvcHRpb25hbCBkb3VibGUgYXNzaWduZWRfY3B1OwogfQogCiBzdHJ1Y3QgU3VwZXJ2aXNvclN1bW1hcnkgewpAQCAtMTU1LDYgKzE2Miw5IEBACiAgIDQ6IHJlcXVpcmVkIGkzMiBudW1fdXNlZF93b3JrZXJzOwogICA1OiByZXF1aXJlZCBzdHJpbmcgc3VwZXJ2aXNvcl9pZDsKICAgNjogb3B0aW9uYWwgc3RyaW5nIHZlcnNpb24gPSAiVkVSU0lPTl9OT1RfUFJPVklERUQiOworICA3OiBvcHRpb25hbCBtYXA8c3RyaW5nLCBkb3VibGU+IHRvdGFsX3Jlc291cmNlczsKKyAgODogb3B0aW9uYWwgZG91YmxlIHVzZWRfbWVtOworICA5OiBvcHRpb25hbCBkb3VibGUgdXNlZF9jcHU7CiB9CiAKIHN0cnVjdCBOaW1idXNTdW1tYXJ5IHsKQEAgLTE2Nyw2ICsxNzcsOCBAQAogCiBzdHJ1Y3QgQ2x1c3RlclN1bW1hcnkgewogICAxOiByZXF1aXJlZCBsaXN0PFN1cGVydmlzb3JTdW1tYXJ5PiBzdXBlcnZpc29yczsKKyAgLy9AZGVwcmVjYXRlZCwgcGxlYXNlIHVzZSBuaW1idXNlcy51cHRpbWVfc2VjcyBpbnN0ZWFkLgorICAyOiBvcHRpb25hbCBpMzIgbmltYnVzX3VwdGltZV9zZWNzID0gMDsKICAgMzogcmVxdWlyZWQgbGlzdDxUb3BvbG9neVN1bW1hcnk+IHRvcG9sb2dpZXM7CiAgIDQ6IHJlcXVpcmVkIGxpc3Q8TmltYnVzU3VtbWFyeT4gbmltYnVzZXM7CiB9CkBAIC0yMjAsNiArMjMyLDExIEBACiAgIDc6IG9wdGlvbmFsIEV4ZWN1dG9yU3RhdHMgc3RhdHM7CiB9CiAKK3N0cnVjdCBEZWJ1Z09wdGlvbnMgeworICAxOiBvcHRpb25hbCBib29sIGVuYWJsZQorICAyOiBvcHRpb25hbCBkb3VibGUgc2FtcGxpbmdwY3QKK30KKwogc3RydWN0IFRvcG9sb2d5SW5mbyB7CiAgIDE6IHJlcXVpcmVkIHN0cmluZyBpZDsKICAgMjogcmVxdWlyZWQgc3RyaW5nIG5hbWU7CkBAIC0yMzEsMTEgKzI0OCwxMDQgQEAKIDUxMzogb3B0aW9uYWwgc3RyaW5nIHNjaGVkX3N0YXR1czsKIDUxNDogb3B0aW9uYWwgc3RyaW5nIG93bmVyOwogNTE1OiBvcHRpb25hbCBpMzIgcmVwbGljYXRpb25fY291bnQ7Cis1MjE6IG9wdGlvbmFsIGRvdWJsZSByZXF1ZXN0ZWRfbWVtb25oZWFwOworNTIyOiBvcHRpb25hbCBkb3VibGUgcmVxdWVzdGVkX21lbW9mZmhlYXA7Cis1MjM6IG9wdGlvbmFsIGRvdWJsZSByZXF1ZXN0ZWRfY3B1OworNTI0OiBvcHRpb25hbCBkb3VibGUgYXNzaWduZWRfbWVtb25oZWFwOworNTI1OiBvcHRpb25hbCBkb3VibGUgYXNzaWduZWRfbWVtb2ZmaGVhcDsKKzUyNjogb3B0aW9uYWwgZG91YmxlIGFzc2lnbmVkX2NwdTsKIH0KIAotc3RydWN0IERlYnVnT3B0aW9ucyB7Ci0gIDE6IG9wdGlvbmFsIGJvb2wgZW5hYmxlCi0gIDI6IG9wdGlvbmFsIGRvdWJsZSBzYW1wbGluZ3BjdAorc3RydWN0IENvbW1vbkFnZ3JlZ2F0ZVN0YXRzIHsKKzE6IG9wdGlvbmFsIGkzMiBudW1fZXhlY3V0b3JzOworMjogb3B0aW9uYWwgaTMyIG51bV90YXNrczsKKzM6IG9wdGlvbmFsIGk2NCBlbWl0dGVkOworNDogb3B0aW9uYWwgaTY0IHRyYW5zZmVycmVkOworNTogb3B0aW9uYWwgaTY0IGFja2VkOworNjogb3B0aW9uYWwgaTY0IGZhaWxlZDsKK30KKworc3RydWN0IFNwb3V0QWdncmVnYXRlU3RhdHMgeworMTogb3B0aW9uYWwgZG91YmxlIGNvbXBsZXRlX2xhdGVuY3lfbXM7Cit9CisKK3N0cnVjdCBCb2x0QWdncmVnYXRlU3RhdHMgeworMTogb3B0aW9uYWwgZG91YmxlIGV4ZWN1dGVfbGF0ZW5jeV9tczsKKzI6IG9wdGlvbmFsIGRvdWJsZSBwcm9jZXNzX2xhdGVuY3lfbXM7CiszOiBvcHRpb25hbCBpNjQgICAgZXhlY3V0ZWQ7Cis0OiBvcHRpb25hbCBkb3VibGUgY2FwYWNpdHk7Cit9CisKK3VuaW9uIFNwZWNpZmljQWdncmVnYXRlU3RhdHMgeworMTogQm9sdEFnZ3JlZ2F0ZVN0YXRzICBib2x0OworMjogU3BvdXRBZ2dyZWdhdGVTdGF0cyBzcG91dDsKK30KKworZW51bSBDb21wb25lbnRUeXBlIHsKKyAgQk9MVCA9IDEsCisgIFNQT1VUID0gMgorfQorCitzdHJ1Y3QgQ29tcG9uZW50QWdncmVnYXRlU3RhdHMgeworMTogb3B0aW9uYWwgQ29tcG9uZW50VHlwZSB0eXBlOworMjogb3B0aW9uYWwgQ29tbW9uQWdncmVnYXRlU3RhdHMgY29tbW9uX3N0YXRzOworMzogb3B0aW9uYWwgU3BlY2lmaWNBZ2dyZWdhdGVTdGF0cyBzcGVjaWZpY19zdGF0czsKKzQ6IG9wdGlvbmFsIEVycm9ySW5mbyBsYXN0X2Vycm9yOworfQorCitzdHJ1Y3QgVG9wb2xvZ3lTdGF0cyB7CisxOiBvcHRpb25hbCBtYXA8c3RyaW5nLCBpNjQ+IHdpbmRvd190b19lbWl0dGVkOworMjogb3B0aW9uYWwgbWFwPHN0cmluZywgaTY0PiB3aW5kb3dfdG9fdHJhbnNmZXJyZWQ7CiszOiBvcHRpb25hbCBtYXA8c3RyaW5nLCBkb3VibGU+IHdpbmRvd190b19jb21wbGV0ZV9sYXRlbmNpZXNfbXM7Cis0OiBvcHRpb25hbCBtYXA8c3RyaW5nLCBpNjQ+IHdpbmRvd190b19hY2tlZDsKKzU6IG9wdGlvbmFsIG1hcDxzdHJpbmcsIGk2ND4gd2luZG93X3RvX2ZhaWxlZDsKK30KKworc3RydWN0IFRvcG9sb2d5UGFnZUluZm8geworIDE6IHJlcXVpcmVkIHN0cmluZyBpZDsKKyAyOiBvcHRpb25hbCBzdHJpbmcgbmFtZTsKKyAzOiBvcHRpb25hbCBpMzIgdXB0aW1lX3NlY3M7CisgNDogb3B0aW9uYWwgc3RyaW5nIHN0YXR1czsKKyA1OiBvcHRpb25hbCBpMzIgbnVtX3Rhc2tzOworIDY6IG9wdGlvbmFsIGkzMiBudW1fd29ya2VyczsKKyA3OiBvcHRpb25hbCBpMzIgbnVtX2V4ZWN1dG9yczsKKyA4OiBvcHRpb25hbCBzdHJpbmcgdG9wb2xvZ3lfY29uZjsKKyA5OiBvcHRpb25hbCBtYXA8c3RyaW5nLENvbXBvbmVudEFnZ3JlZ2F0ZVN0YXRzPiBpZF90b19zcG91dF9hZ2dfc3RhdHM7CisxMDogb3B0aW9uYWwgbWFwPHN0cmluZyxDb21wb25lbnRBZ2dyZWdhdGVTdGF0cz4gaWRfdG9fYm9sdF9hZ2dfc3RhdHM7CisxMTogb3B0aW9uYWwgc3RyaW5nIHNjaGVkX3N0YXR1czsKKzEyOiBvcHRpb25hbCBUb3BvbG9neVN0YXRzIHRvcG9sb2d5X3N0YXRzOworMTM6IG9wdGlvbmFsIHN0cmluZyBvd25lcjsKKzE0OiBvcHRpb25hbCBEZWJ1Z09wdGlvbnMgZGVidWdfb3B0aW9uczsKKzE1OiBvcHRpb25hbCBpMzIgcmVwbGljYXRpb25fY291bnQ7Cis1MjE6IG9wdGlvbmFsIGRvdWJsZSByZXF1ZXN0ZWRfbWVtb25oZWFwOworNTIyOiBvcHRpb25hbCBkb3VibGUgcmVxdWVzdGVkX21lbW9mZmhlYXA7Cis1MjM6IG9wdGlvbmFsIGRvdWJsZSByZXF1ZXN0ZWRfY3B1OworNTI0OiBvcHRpb25hbCBkb3VibGUgYXNzaWduZWRfbWVtb25oZWFwOworNTI1OiBvcHRpb25hbCBkb3VibGUgYXNzaWduZWRfbWVtb2ZmaGVhcDsKKzUyNjogb3B0aW9uYWwgZG91YmxlIGFzc2lnbmVkX2NwdTsKK30KKworc3RydWN0IEV4ZWN1dG9yQWdncmVnYXRlU3RhdHMgeworMTogb3B0aW9uYWwgRXhlY3V0b3JTdW1tYXJ5IGV4ZWNfc3VtbWFyeTsKKzI6IG9wdGlvbmFsIENvbXBvbmVudEFnZ3JlZ2F0ZVN0YXRzIHN0YXRzOworfQorCitzdHJ1Y3QgQ29tcG9uZW50UGFnZUluZm8geworIDE6IHJlcXVpcmVkIHN0cmluZyBjb21wb25lbnRfaWQ7CisgMjogcmVxdWlyZWQgQ29tcG9uZW50VHlwZSBjb21wb25lbnRfdHlwZTsKKyAzOiBvcHRpb25hbCBzdHJpbmcgdG9wb2xvZ3lfaWQ7CisgNDogb3B0aW9uYWwgc3RyaW5nIHRvcG9sb2d5X25hbWU7CisgNTogb3B0aW9uYWwgaTMyIG51bV9leGVjdXRvcnM7CisgNjogb3B0aW9uYWwgaTMyIG51bV90YXNrczsKKyA3OiBvcHRpb25hbCBtYXA8c3RyaW5nLENvbXBvbmVudEFnZ3JlZ2F0ZVN0YXRzPiB3aW5kb3dfdG9fc3RhdHM7CisgODogb3B0aW9uYWwgbWFwPEdsb2JhbFN0cmVhbUlkLENvbXBvbmVudEFnZ3JlZ2F0ZVN0YXRzPiBnc2lkX3RvX2lucHV0X3N0YXRzOworIDk6IG9wdGlvbmFsIG1hcDxzdHJpbmcsQ29tcG9uZW50QWdncmVnYXRlU3RhdHM+IHNpZF90b19vdXRwdXRfc3RhdHM7CisxMDogb3B0aW9uYWwgbGlzdDxFeGVjdXRvckFnZ3JlZ2F0ZVN0YXRzPiBleGVjX3N0YXRzOworMTE6IG9wdGlvbmFsIGxpc3Q8RXJyb3JJbmZvPiBlcnJvcnM7CisxMjogb3B0aW9uYWwgc3RyaW5nIGV2ZW50bG9nX2hvc3Q7CisxMzogb3B0aW9uYWwgaTMyIGV2ZW50bG9nX3BvcnQ7CisxNDogb3B0aW9uYWwgRGVidWdPcHRpb25zIGRlYnVnX29wdGlvbnM7CisxNTogb3B0aW9uYWwgc3RyaW5nIHRvcG9sb2d5X3N0YXR1czsKIH0KIAogc3RydWN0IEtpbGxPcHRpb25zIHsKQEAgLTI3MCw2ICszODAsNyBAQAogICAgIDY6IG9wdGlvbmFsIG1hcDxzdHJpbmcsIHN0cmluZz4gc2NoZWR1bGVyX21ldGE7CiAgICAgNzogb3B0aW9uYWwgaTY0IHVwdGltZV9zZWNzOwogICAgIDg6IG9wdGlvbmFsIHN0cmluZyB2ZXJzaW9uOworICAgIDk6IG9wdGlvbmFsIG1hcDxzdHJpbmcsIGRvdWJsZT4gcmVzb3VyY2VzX21hcDsKIH0KIAogc3RydWN0IE5vZGVJbmZvIHsKQEAgLTI3NywxMSArMzg4LDE3IEBACiAgICAgMjogcmVxdWlyZWQgc2V0PGk2ND4gcG9ydDsKIH0KIAorc3RydWN0IFdvcmtlclJlc291cmNlcyB7CisgICAgMTogb3B0aW9uYWwgZG91YmxlIG1lbV9vbl9oZWFwOworICAgIDI6IG9wdGlvbmFsIGRvdWJsZSBtZW1fb2ZmX2hlYXA7CisgICAgMzogb3B0aW9uYWwgZG91YmxlIGNwdTsKK30KIHN0cnVjdCBBc3NpZ25tZW50IHsKICAgICAxOiByZXF1aXJlZCBzdHJpbmcgbWFzdGVyX2NvZGVfZGlyOwogICAgIDI6IG9wdGlvbmFsIG1hcDxzdHJpbmcsIHN0cmluZz4gbm9kZV9ob3N0ID0ge307CiAgICAgMzogb3B0aW9uYWwgbWFwPGxpc3Q8aTY0PiwgTm9kZUluZm8+IGV4ZWN1dG9yX25vZGVfcG9ydCA9IHt9OwogICAgIDQ6IG9wdGlvbmFsIG1hcDxsaXN0PGk2ND4sIGk2ND4gZXhlY3V0b3Jfc3RhcnRfdGltZV9zZWNzID0ge307CisgICAgNTogb3B0aW9uYWwgbWFwPE5vZGVJbmZvLCBXb3JrZXJSZXNvdXJjZXM+IHdvcmtlcl9yZXNvdXJjZXMgPSB7fTsKIH0KIAogZW51bSBUb3BvbG9neVN0YXR1cyB7CkBAIC0zMjcsNiArNDQ0LDcgQEAKIHN0cnVjdCBMb2NhbEFzc2lnbm1lbnQgewogICAxOiByZXF1aXJlZCBzdHJpbmcgdG9wb2xvZ3lfaWQ7CiAgIDI6IHJlcXVpcmVkIGxpc3Q8RXhlY3V0b3JJbmZvPiBleGVjdXRvcnM7CisgIDM6IG9wdGlvbmFsIFdvcmtlclJlc291cmNlcyByZXNvdXJjZXM7CiB9CiAKIHN0cnVjdCBMU1N1cGVydmlzb3JJZCB7CkBAIC0zNDgsMTYgKzQ2Niw3OCBAQAogICAgNDogcmVxdWlyZWQgaTMyIHBvcnQ7CiB9CiAKK3N0cnVjdCBMU1RvcG9IaXN0b3J5IHsKKyAgIDE6IHJlcXVpcmVkIHN0cmluZyB0b3BvbG9neV9pZDsKKyAgIDI6IHJlcXVpcmVkIGk2NCB0aW1lX3N0YW1wOworICAgMzogcmVxdWlyZWQgbGlzdDxzdHJpbmc+IHVzZXJzOworICAgNDogcmVxdWlyZWQgbGlzdDxzdHJpbmc+IGdyb3VwczsKK30KKworc3RydWN0IExTVG9wb0hpc3RvcnlMaXN0IHsKKyAgMTogcmVxdWlyZWQgbGlzdDxMU1RvcG9IaXN0b3J5PiB0b3BvX2hpc3Rvcnk7Cit9CisKIGVudW0gTnVtRXJyb3JzQ2hvaWNlIHsKICAgQUxMLAogICBOT05FLAogICBPTkUKIH0KIAorZW51bSBQcm9maWxlQWN0aW9uIHsKKyAgSlBST0ZJTEVfU1RPUCwKKyAgSlBST0ZJTEVfU1RBUlQsCisgIEpQUk9GSUxFX0RVTVAsCisgIEpNQVBfRFVNUCwKKyAgSlNUQUNLX0RVTVAsCisgIEpWTV9SRVNUQVJUCit9CisKK3N0cnVjdCBQcm9maWxlUmVxdWVzdCB7CisgIDE6IHJlcXVpcmVkIE5vZGVJbmZvIG5vZGVJbmZvLAorICAyOiByZXF1aXJlZCBQcm9maWxlQWN0aW9uIGFjdGlvbiwKKyAgMzogb3B0aW9uYWwgaTY0IHRpbWVfc3RhbXA7IAorfQorCiBzdHJ1Y3QgR2V0SW5mb09wdGlvbnMgewogICAxOiBvcHRpb25hbCBOdW1FcnJvcnNDaG9pY2UgbnVtX2Vycl9jaG9pY2U7CiB9CiAKK2VudW0gTG9nTGV2ZWxBY3Rpb24geworICBVTkNIQU5HRUQgPSAxLAorICBVUERBVEUgICAgPSAyLAorICBSRU1PVkUgICAgPSAzCit9CisKK3N0cnVjdCBMb2dMZXZlbCB7CisgIDE6IHJlcXVpcmVkIExvZ0xldmVsQWN0aW9uIGFjdGlvbjsKKworICAvLyBkdXJpbmcgdGhpcyB0aHJpZnQgY2FsbCwgd2UnbGwgbW92ZSBsb2dnZXIgdG8gdGFyZ2V0X2xvZ19sZXZlbAorICAyOiBvcHRpb25hbCBzdHJpbmcgdGFyZ2V0X2xvZ19sZXZlbDsKKworICAvLyBudW1iZXIgb2Ygc2Vjb25kcyB0aGF0IHRhcmdldF9sb2dfbGV2ZWwgc2hvdWxkIGJlIGtlcHQKKyAgLy8gYWZ0ZXIgdGhpcyB0aW1lb3V0LCB0aGUgbG9nZ2VycyB3aWxsIGJlIHJlc2V0IHRvIHJlc2V0X2xvZ19sZXZlbAorICAvLyBpZiB0aW1lb3V0IGlzIDAsIHdlIHdpbGwgbm90IHJlc2V0IAorICAzOiBvcHRpb25hbCBpMzIgcmVzZXRfbG9nX2xldmVsX3RpbWVvdXRfc2VjczsKKworICAvLyBudW1iZXIgb2Ygc2Vjb25kcyBzaW5jZSB1bml4IGVwb2NoIGNvcnJlc3BvbmRpbmcgdG8gCisgIC8vIGN1cnJlbnQgdGltZSAod2hlbiBtZXNzYWdlIGdldHMgdG8gbmltYnVzKSArIHJlc2V0X2xvZ19sZXZlbF90aW1lb3V0X3NlCisgIC8vIE5PVEU6IHRoaXMgZmllbGQgZ2V0cyBzZXQgaW4gTmltYnVzIAorICA0OiBvcHRpb25hbCBpNjQgcmVzZXRfbG9nX2xldmVsX3RpbWVvdXRfZXBvY2g7CisKKyAgLy8gaWYgcmVzZXQgdGltZW91dCB3YXMgc2V0LCB0aGVuIHdlIHdvdWxkIHJlc2V0IAorICAvLyB0byB0aGlzIGxldmVsIGFmdGVyIHRpbWVvdXQgKG9yIElORk8gYnkgZGVmYXVsdCkKKyAgNTogb3B0aW9uYWwgc3RyaW5nIHJlc2V0X2xvZ19sZXZlbDsKK30KKworc3RydWN0IExvZ0NvbmZpZyB7IAorICAvLyBsb2dnZXIgbmFtZSAtPiBsb2cgbGV2ZWwgbWFwCisgIDI6IG9wdGlvbmFsIG1hcDxzdHJpbmcsIExvZ0xldmVsPiBuYW1lZF9sb2dnZXJfbGV2ZWw7Cit9CisKK3N0cnVjdCBUb3BvbG9neUhpc3RvcnlJbmZvIHsKKyAgMTogbGlzdDxzdHJpbmc+IHRvcG9faWRzOworfQorCiBzZXJ2aWNlIE5pbWJ1cyB7CiAgIHZvaWQgc3VibWl0VG9wb2xvZ3koMTogc3RyaW5nIG5hbWUsIDI6IHN0cmluZyB1cGxvYWRlZEphckxvY2F0aW9uLCAzOiBzdHJpbmcganNvbkNvbmYsIDQ6IFN0b3JtVG9wb2xvZ3kgdG9wb2xvZ3kpIHRocm93cyAoMTogQWxyZWFkeUFsaXZlRXhjZXB0aW9uIGUsIDI6IEludmFsaWRUb3BvbG9neUV4Y2VwdGlvbiBpdGUsIDM6IEF1dGhvcml6YXRpb25FeGNlcHRpb24gYXplKTsKICAgdm9pZCBzdWJtaXRUb3BvbG9neVdpdGhPcHRzKDE6IHN0cmluZyBuYW1lLCAyOiBzdHJpbmcgdXBsb2FkZWRKYXJMb2NhdGlvbiwgMzogc3RyaW5nIGpzb25Db25mLCA0OiBTdG9ybVRvcG9sb2d5IHRvcG9sb2d5LCA1OiBTdWJtaXRPcHRpb25zIG9wdGlvbnMpIHRocm93cyAoMTogQWxyZWFkeUFsaXZlRXhjZXB0aW9uIGUsIDI6IEludmFsaWRUb3BvbG9neUV4Y2VwdGlvbiBpdGUsIDM6IEF1dGhvcml6YXRpb25FeGNlcHRpb24gYXplKTsKQEAgLTM2Niw2ICs1NDYsMTEgQEAKICAgdm9pZCBhY3RpdmF0ZSgxOiBzdHJpbmcgbmFtZSkgdGhyb3dzICgxOiBOb3RBbGl2ZUV4Y2VwdGlvbiBlLCAyOiBBdXRob3JpemF0aW9uRXhjZXB0aW9uIGF6ZSk7CiAgIHZvaWQgZGVhY3RpdmF0ZSgxOiBzdHJpbmcgbmFtZSkgdGhyb3dzICgxOiBOb3RBbGl2ZUV4Y2VwdGlvbiBlLCAyOiBBdXRob3JpemF0aW9uRXhjZXB0aW9uIGF6ZSk7CiAgIHZvaWQgcmViYWxhbmNlKDE6IHN0cmluZyBuYW1lLCAyOiBSZWJhbGFuY2VPcHRpb25zIG9wdGlvbnMpIHRocm93cyAoMTogTm90QWxpdmVFeGNlcHRpb24gZSwgMjogSW52YWxpZFRvcG9sb2d5RXhjZXB0aW9uIGl0ZSwgMzogQXV0aG9yaXphdGlvbkV4Y2VwdGlvbiBhemUpOworCisgIC8vIGR5bmFtaWMgbG9nIGxldmVscworICB2b2lkIHNldExvZ0NvbmZpZygxOiBzdHJpbmcgbmFtZSwgMjogTG9nQ29uZmlnIGNvbmZpZyk7CisgIExvZ0NvbmZpZyBnZXRMb2dDb25maWcoMTogc3RyaW5nIG5hbWUpOworCiAgIC8qKgogICAqIEVuYWJsZS9kaXNhYmxlIGxvZ2dpbmcgdGhlIHR1cGxlcyBnZW5lcmF0ZWQgaW4gdG9wb2xvZ3kgdmlhIGFuIGludGVybmFsIEV2ZW50TG9nZ2VyIGJvbHQuIFRoZSBjb21wb25lbnQgbmFtZSBpcyBvcHRpb25hbAogICAqIGFuZCBpZiBudWxsIG9yIGVtcHR5LCB0aGUgZGVidWcgZmxhZyB3aWxsIGFwcGx5IHRvIHRoZSBlbnRpcmUgdG9wb2xvZ3kuCkBAIC0zNzMsNiArNTU4LDExIEBACiAgICogVGhlICdzYW1wbGluZ1BlcmNlbnRhZ2UnIHdpbGwgbGltaXQgbG9nZ2dpbmcgdG8gYSBwZXJjZW50YWdlIG9mIGdlbmVyYXRlZCB0dXBsZXMuCiAgICoqLwogICB2b2lkIGRlYnVnKDE6IHN0cmluZyBuYW1lLCAyOiBzdHJpbmcgY29tcG9uZW50LCAzOiBib29sIGVuYWJsZSwgNDogZG91YmxlIHNhbXBsaW5nUGVyY2VudGFnZSkgdGhyb3dzICgxOiBOb3RBbGl2ZUV4Y2VwdGlvbiBlLCAyOiBBdXRob3JpemF0aW9uRXhjZXB0aW9uIGF6ZSk7CisKKyAgLy8gZHluYW1pYyBwcm9maWxlIGFjdGlvbnMKKyAgdm9pZCBzZXRXb3JrZXJQcm9maWxlcigxOiBzdHJpbmcgaWQsIDI6IFByb2ZpbGVSZXF1ZXN0ICBwcm9maWxlUmVxdWVzdCk7CisgIGxpc3Q8UHJvZmlsZVJlcXVlc3Q+IGdldENvbXBvbmVudFBlbmRpbmdQcm9maWxlQWN0aW9ucygxOiBzdHJpbmcgaWQsIDI6IHN0cmluZyBjb21wb25lbnRfaWQsIDM6IFByb2ZpbGVBY3Rpb24gYWN0aW9uKTsKKwogICB2b2lkIHVwbG9hZE5ld0NyZWRlbnRpYWxzKDE6IHN0cmluZyBuYW1lLCAyOiBDcmVkZW50aWFscyBjcmVkcykgdGhyb3dzICgxOiBOb3RBbGl2ZUV4Y2VwdGlvbiBlLCAyOiBJbnZhbGlkVG9wb2xvZ3lFeGNlcHRpb24gaXRlLCAzOiBBdXRob3JpemF0aW9uRXhjZXB0aW9uIGF6ZSk7CiAKICAgLy8gbmVlZCB0byBhZGQgZnVuY3Rpb25zIGZvciBhc2tpbmcgYWJvdXQgc3RhdHVzIG9mIHN0b3Jtcywgd2hhdCBub2RlcyB0aGV5J3JlIHJ1bm5pbmcgb24sIGxvb2tpbmcgYXQgdGFzayBsb2dzCkBAIC0zOTEsNiArNTgxLDggQEAKICAgQ2x1c3RlclN1bW1hcnkgZ2V0Q2x1c3RlckluZm8oKSB0aHJvd3MgKDE6IEF1dGhvcml6YXRpb25FeGNlcHRpb24gYXplKTsKICAgVG9wb2xvZ3lJbmZvIGdldFRvcG9sb2d5SW5mbygxOiBzdHJpbmcgaWQpIHRocm93cyAoMTogTm90QWxpdmVFeGNlcHRpb24gZSwgMjogQXV0aG9yaXphdGlvbkV4Y2VwdGlvbiBhemUpOwogICBUb3BvbG9neUluZm8gZ2V0VG9wb2xvZ3lJbmZvV2l0aE9wdHMoMTogc3RyaW5nIGlkLCAyOiBHZXRJbmZvT3B0aW9ucyBvcHRpb25zKSB0aHJvd3MgKDE6IE5vdEFsaXZlRXhjZXB0aW9uIGUsIDI6IEF1dGhvcml6YXRpb25FeGNlcHRpb24gYXplKTsKKyAgVG9wb2xvZ3lQYWdlSW5mbyBnZXRUb3BvbG9neVBhZ2VJbmZvKDE6IHN0cmluZyBpZCwgMjogc3RyaW5nIHdpbmRvdywgMzogYm9vbCBpc19pbmNsdWRlX3N5cykgdGhyb3dzICgxOiBOb3RBbGl2ZUV4Y2VwdGlvbiBlLCAyOiBBdXRob3JpemF0aW9uRXhjZXB0aW9uIGF6ZSk7CisgIENvbXBvbmVudFBhZ2VJbmZvIGdldENvbXBvbmVudFBhZ2VJbmZvKDE6IHN0cmluZyB0b3BvbG9neV9pZCwgMjogc3RyaW5nIGNvbXBvbmVudF9pZCwgMzogc3RyaW5nIHdpbmRvdywgNDogYm9vbCBpc19pbmNsdWRlX3N5cykgdGhyb3dzICgxOiBOb3RBbGl2ZUV4Y2VwdGlvbiBlLCAyOiBBdXRob3JpemF0aW9uRXhjZXB0aW9uIGF6ZSk7CiAgIC8vcmV0dXJucyBqc29uCiAgIHN0cmluZyBnZXRUb3BvbG9neUNvbmYoMTogc3RyaW5nIGlkKSB0aHJvd3MgKDE6IE5vdEFsaXZlRXhjZXB0aW9uIGUsIDI6IEF1dGhvcml6YXRpb25FeGNlcHRpb24gYXplKTsKICAgLyoqCkBAIC00MDEsNiArNTkzLDcgQEAKICAgICogUmV0dXJucyB0aGUgdXNlciBzcGVjaWZpZWQgdG9wb2xvZ3kgYXMgc3VibWl0dGVkIG9yaWdpbmFsbHkuIENvbXBhcmUge0BsaW5rICNnZXRUb3BvbG9neShTdHJpbmcgaWQpfS4KICAgICovCiAgIFN0b3JtVG9wb2xvZ3kgZ2V0VXNlclRvcG9sb2d5KDE6IHN0cmluZyBpZCkgdGhyb3dzICgxOiBOb3RBbGl2ZUV4Y2VwdGlvbiBlLCAyOiBBdXRob3JpemF0aW9uRXhjZXB0aW9uIGF6ZSk7CisgIFRvcG9sb2d5SGlzdG9yeUluZm8gZ2V0VG9wb2xvZ3lIaXN0b3J5KDE6IHN0cmluZyB1c2VyKSB0aHJvd3MgKDE6IEF1dGhvcml6YXRpb25FeGNlcHRpb24gYXplKTsKIH0KIAogc3RydWN0IERSUENSZXF1ZXN0IHsKQEAgLTQyMSwzICs2MTQsNjIgQEAKICAgRFJQQ1JlcXVlc3QgZmV0Y2hSZXF1ZXN0KDE6IHN0cmluZyBmdW5jdGlvbk5hbWUpIHRocm93cyAoMTogQXV0aG9yaXphdGlvbkV4Y2VwdGlvbiBhemUpOwogICB2b2lkIGZhaWxSZXF1ZXN0KDE6IHN0cmluZyBpZCkgdGhyb3dzICgxOiBBdXRob3JpemF0aW9uRXhjZXB0aW9uIGF6ZSk7ICAKIH0KKworZW51bSBIQlNlcnZlck1lc3NhZ2VUeXBlIHsKKyAgQ1JFQVRFX1BBVEgsCisgIENSRUFURV9QQVRIX1JFU1BPTlNFLAorICBFWElTVFMsCisgIEVYSVNUU19SRVNQT05TRSwKKyAgU0VORF9QVUxTRSwKKyAgU0VORF9QVUxTRV9SRVNQT05TRSwKKyAgR0VUX0FMTF9QVUxTRV9GT1JfUEFUSCwKKyAgR0VUX0FMTF9QVUxTRV9GT1JfUEFUSF9SRVNQT05TRSwKKyAgR0VUX0FMTF9OT0RFU19GT1JfUEFUSCwKKyAgR0VUX0FMTF9OT0RFU19GT1JfUEFUSF9SRVNQT05TRSwKKyAgR0VUX1BVTFNFLAorICBHRVRfUFVMU0VfUkVTUE9OU0UsCisgIERFTEVURV9QQVRILAorICBERUxFVEVfUEFUSF9SRVNQT05TRSwKKyAgREVMRVRFX1BVTFNFX0lELAorICBERUxFVEVfUFVMU0VfSURfUkVTUE9OU0UsCisgIENPTlRST0xfTUVTU0FHRSwKKyAgU0FTTF9NRVNTQUdFX1RPS0VOLAorICBOT1RfQVVUSE9SSVpFRAorfQorCit1bmlvbiBIQk1lc3NhZ2VEYXRhIHsKKyAgMTogc3RyaW5nIHBhdGgsCisgIDI6IEhCUHVsc2UgcHVsc2UsCisgIDM6IGJvb2wgYm9vbHZhbCwKKyAgNDogSEJSZWNvcmRzIHJlY29yZHMsCisgIDU6IEhCTm9kZXMgbm9kZXMsCisgIDc6IG9wdGlvbmFsIGJpbmFyeSBtZXNzYWdlX2Jsb2I7Cit9CisKK3N0cnVjdCBIQk1lc3NhZ2UgeworICAxOiBIQlNlcnZlck1lc3NhZ2VUeXBlIHR5cGUsCisgIDI6IEhCTWVzc2FnZURhdGEgZGF0YSwKKyAgMzogb3B0aW9uYWwgaTMyIG1lc3NhZ2VfaWQgPSAtMSwKK30KKworCitleGNlcHRpb24gSEJBdXRob3JpemF0aW9uRXhjZXB0aW9uIHsKKyAgMTogcmVxdWlyZWQgc3RyaW5nIG1zZzsKK30KKworZXhjZXB0aW9uIEhCRXhlY3V0aW9uRXhjZXB0aW9uIHsKKyAgMTogcmVxdWlyZWQgc3RyaW5nIG1zZzsKK30KKworc3RydWN0IEhCUHVsc2UgeworICAxOiByZXF1aXJlZCBzdHJpbmcgaWQ7CisgIDI6IGJpbmFyeSBkZXRhaWxzOworfQorCitzdHJ1Y3QgSEJSZWNvcmRzIHsKKyAgMTogbGlzdDxIQlB1bHNlPiBwdWxzZXM7Cit9CisKK3N0cnVjdCBIQk5vZGVzIHsKKyAgMTogbGlzdDxzdHJpbmc+IHB1bHNlSWRzOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL3VpL3B1YmxpYy9jb21wb25lbnQuaHRtbCBiL3N0b3JtLWNvcmUvc3JjL3VpL3B1YmxpYy9jb21wb25lbnQuaHRtbAppbmRleCA0YmU1ODYwLi5hZTI0NjNjIDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy91aS9wdWJsaWMvY29tcG9uZW50Lmh0bWwKKysrIGIvc3Rvcm0tY29yZS9zcmMvdWkvcHVibGljL2NvbXBvbmVudC5odG1sCkBAIC01OCw2ICs1OCw5IEBACiAgICAgPGRpdiBpZD0iY29tcG9uZW50LW91dHB1dC1zdGF0cyIgY2xhc3M9ImNvbC1tZC0xMiI+PC9kaXY+CiAgIDwvZGl2PgogICA8ZGl2IGNsYXNzPSJyb3ciPgorICAgIDxkaXYgaWQ9InByb2ZpbGVyLWNvbnRyb2wiIGNsYXNzPSJjb2wtbWQtMTIiPjwvZGl2PgorICA8L2Rpdj4KKyAgPGRpdiBjbGFzcz0icm93Ij4KICAgICA8ZGl2IGlkPSJjb21wb25lbnQtZXhlY3V0b3Itc3RhdHMiIGNsYXNzPSJjb2wtbWQtMTIiPjwvZGl2PgogICA8L2Rpdj4KICAgPGRpdiBjbGFzcz0icm93Ij4KQEAgLTc2LDYgKzc5LDE1IEBACiAkKGRvY3VtZW50KS5hamF4U3RhcnQoZnVuY3Rpb24oKXsKICAgICAkLmJsb2NrVUkoeyBtZXNzYWdlOiAnPGltZyBzcmM9ImltYWdlcy9zcGlubmVyLmdpZiIgLz4gPGgzPkxvYWRpbmcgY29tcG9uZW50IHN1bW1hcnkuLi48L2gzPid9KTsKIH0pOworZnVuY3Rpb24ganNFcnJvcihvdGhlcikgeworICAgIHRyeSB7CisgICAgICBvdGhlcigpOworICAgIH0gY2F0Y2ggKGVycikgeworICAgICAgJC5nZXQoIi90ZW1wbGF0ZXMvanNvbi1lcnJvci10ZW1wbGF0ZS5odG1sIiwgZnVuY3Rpb24odGVtcGxhdGUpIHsKKyAgICAgICAgJCgiI2pzb24tcmVzcG9uc2UtZXJyb3IiKS5hcHBlbmQoTXVzdGFjaGUucmVuZGVyKCQodGVtcGxhdGUpLmZpbHRlcigiI2pzb24tZXJyb3ItdGVtcGxhdGUiKS5odG1sKCkse2Vycm9yOiAiSlMgRXJyb3IiLCBlcnJvck1lc3NhZ2U6IGVycn0pKTsKKyAgICAgIH0pOworICAgIH0KK30KICQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgewogICAgIHZhciBjb21wb25lbnRJZCA9ICQudXJsKCI/aWQiKTsKICAgICB2YXIgdG9wb2xvZ3lJZCA9ICQudXJsKCI/dG9wb2xvZ3lfaWQiKTsKQEAgLTEyMSwxMSArMTMzLDQ3IEBACiAgICAgICAgIHZhciBjb21wb25lbnRTdGF0c0RldGFpbCA9ICQoIiNjb21wb25lbnQtc3RhdHMtZGV0YWlsIikKICAgICAgICAgdmFyIGlucHV0U3RhdHMgPSAkKCIjY29tcG9uZW50LWlucHV0LXN0YXRzIik7CiAgICAgICAgIHZhciBvdXRwdXRTdGF0cyA9ICQoIiNjb21wb25lbnQtb3V0cHV0LXN0YXRzIik7CisgICAgICAgIHZhciBwcm9maWxlckNvbnRyb2wgPSAkKCIjcHJvZmlsZXItY29udHJvbCIpOwogICAgICAgICB2YXIgZXhlY3V0b3JTdGF0cyA9ICQoIiNjb21wb25lbnQtZXhlY3V0b3Itc3RhdHMiKTsKICAgICAgICAgdmFyIGNvbXBvbmVudEVycm9ycyA9ICQoIiNjb21wb25lbnQtZXJyb3JzIik7CiAgICAgICAgICQuZ2V0KCIvdGVtcGxhdGVzL2NvbXBvbmVudC1wYWdlLXRlbXBsYXRlLmh0bWwiLCBmdW5jdGlvbih0ZW1wbGF0ZSkgewotICAgICAgICAgICAgY29tcG9uZW50U3VtbWFyeS5hcHBlbmQoTXVzdGFjaGUucmVuZGVyKCQodGVtcGxhdGUpLmZpbHRlcigiI2NvbXBvbmVudC1zdW1tYXJ5LXRlbXBsYXRlIikuaHRtbCgpLHJlc3BvbnNlKSk7Ci0gICAgICAgICAgICBjb21wb25lbnRBY3Rpb25zLmFwcGVuZChNdXN0YWNoZS5yZW5kZXIoJCh0ZW1wbGF0ZSkuZmlsdGVyKCIjY29tcG9uZW50LWFjdGlvbnMtdGVtcGxhdGUiKS5odG1sKCksYnV0dG9uSnNvbkRhdGEpKTsKKyAgICAgICAgICAgIHJlc3BvbnNlWyJob3N0cyJdID0gW107CisgICAgICAgICAgICBmb3IodmFyIGNvbXBfaW5kZXggaW4gcmVzcG9uc2VbImV4ZWN1dG9yU3RhdHMiXSkgeworICAgICAgICAgICAgICAgIHZhciBjb21wID0gcmVzcG9uc2VbImV4ZWN1dG9yU3RhdHMiXVtjb21wX2luZGV4XTsKKyAgICAgICAgICAgICAgICB2YXIgaG9zdF9wb3J0ID0gY29tcFsiaG9zdCJdICsgIjoiICsgY29tcFsicG9ydCJdOworICAgICAgICAgICAgICAgIGlmKCQuaW5BcnJheShob3N0X3BvcnQsIHJlc3BvbnNlWyJob3N0cyJdKSA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICByZXNwb25zZVsiaG9zdHMiXS5wdXNoKGhvc3RfcG9ydCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXNwb25zZVsiaG9zdHMiXSA9ICQubWFwKHJlc3BvbnNlWyJob3N0cyJdLCBmdW5jdGlvbihob3N0X3BvcnQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4geyJuYW1lIjogaG9zdF9wb3J0fTsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICByZXNwb25zZVsicHJvZmlsZXJBY3RpdmUiXSA9ICQubWFwKHJlc3BvbnNlWyJwcm9maWxlckFjdGl2ZSJdLCBmdW5jdGlvbihhY3RpdmVfbWFwKSB7CisgICAgICAgICAgICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZSgpOworICAgICAgICAgICAgICAgIHZhciBtaWxsaXMgPSBkYXRlLmdldFRpbWUoKSArIHBhcnNlSW50KGFjdGl2ZV9tYXBbInRpbWVzdGFtcCJdKTsKKyAgICAgICAgICAgICAgICBkYXRlID0gbmV3IERhdGUobWlsbGlzKTsKKyAgICAgICAgICAgICAgICBhY3RpdmVfbWFwWyJ0aW1lc3RhbXAiXSA9IGRhdGUudG9UaW1lU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFjdGl2ZV9tYXA7CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAganNFcnJvcihmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgY29tcG9uZW50U3VtbWFyeS5hcHBlbmQoTXVzdGFjaGUucmVuZGVyKCQodGVtcGxhdGUpLmZpbHRlcigiI2NvbXBvbmVudC1zdW1tYXJ5LXRlbXBsYXRlIikuaHRtbCgpLHJlc3BvbnNlKSk7CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAganNFcnJvcihmdW5jdGlvbigpIHsKKyAgICAgICAgICAgICAgY29tcG9uZW50QWN0aW9ucy5hcHBlbmQoTXVzdGFjaGUucmVuZGVyKCQodGVtcGxhdGUpLmZpbHRlcigiI2NvbXBvbmVudC1hY3Rpb25zLXRlbXBsYXRlIikuaHRtbCgpLGJ1dHRvbkpzb25EYXRhKSk7CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgaWYocmVzcG9uc2VbInByb2ZpbGVBY3Rpb25FbmFibGVkIl0gPT0gdHJ1ZSkgeworICAgICAgICAgICAgICAgIGpzRXJyb3IoZnVuY3Rpb24gKCkgeworICAgICAgICAgICAgICAgICAgICB2YXIgcGFydCA9ICQodGVtcGxhdGUpLmZpbHRlcignI3Byb2ZpbGVyLWFjdGl2ZS1wYXJ0aWFsJykuaHRtbCgpOworICAgICAgICAgICAgICAgICAgICB2YXIgcGFydGlhbHMgPSB7InByb2ZpbGVyQWN0aXZlIjogcGFydH07CisgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVyQ29udHJvbC5hcHBlbmQoTXVzdGFjaGUucmVuZGVyKCQodGVtcGxhdGUpLmZpbHRlcigiI3Byb2ZpbGluZy10ZW1wbGF0ZSIpLmh0bWwoKSwgcmVzcG9uc2UsIHBhcnRpYWxzKSk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGlmKHJlc3BvbnNlWyJjb21wb25lbnRUeXBlIl0gPT0gInNwb3V0IikgewogICAgICAgICAgICAgICAgIGNvbXBvbmVudFN0YXRzRGV0YWlsLmFwcGVuZChNdXN0YWNoZS5yZW5kZXIoJCh0ZW1wbGF0ZSkuZmlsdGVyKCIjc3BvdXQtc3RhdHMtZGV0YWlsLXRlbXBsYXRlIikuaHRtbCgpLHJlc3BvbnNlKSk7CiAgICAgICAgICAgICAgICAgLy93aW5kb3csIGVtaXR0ZWQsIHRyYW5zZmVycmVkLCBjb21wbGV0ZSBsYXRlbmN5LCBhY2tlZCwgZmFpbGVkCkBAIC0yMTMsNiArMjYxLDEyMSBAQAogICAgICAgICB9KTsKICAgICB9KTsKIH0pOworCitmdW5jdGlvbiBwcm9maWxlcl9zZWxlY3RlZF93b3JrZXIoKSB7CisgICAgcmV0dXJuICQoIiNzZWxlY3RlZF93b3JrZXIiKS52YWwoKTsKK30KKworZnVuY3Rpb24gc3RhcnRfcHJvZmlsaW5nKGlkKSB7CisgICAgdmFyIHRvcG9sb2d5SWQgPSAkLnVybCgiP3RvcG9sb2d5X2lkIik7CisgICAgdmFyIHRpbWVvdXQgPSAkKCIjdGltZW91dCIpLnZhbCgpOworCisgICAgaWYodGltZW91dCA9PSAiIikgeyB0aW1lb3V0ID0gMTA7IH0KKyAgICBpZihpc05hTihwYXJzZUZsb2F0KHRpbWVvdXQpKSB8fCAhaXNGaW5pdGUodGltZW91dCkpIHsKKyAgICAgICAgYWxlcnQoIk11c3Qgc3BlY2lmeSBhIG51bWVyaWMgdGltZW91dCIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdmFyIHVybCA9ICIvYXBpL3YxL3RvcG9sb2d5LyIrdG9wb2xvZ3lJZCsiL3Byb2ZpbGluZy9zdGFydC8iICsgaWQgKyAiLyIgKyB0aW1lb3V0OworICAgICQuZ2V0KHVybCwgZnVuY3Rpb24ocmVzcG9uc2Usc3RhdHVzLGpxWEhSKSB7CisgICAgICAgIGpzRXJyb3IoZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAkLmdldCgiL3RlbXBsYXRlcy9jb21wb25lbnQtcGFnZS10ZW1wbGF0ZS5odG1sIiwgZnVuY3Rpb24odGVtcGxhdGUpIHsKKyAgICAgICAgICAgICAgICB2YXIgaG9zdF9wb3J0X3NwbGl0ID0gaWQuc3BsaXQoIjoiKTsKKyAgICAgICAgICAgICAgICB2YXIgaG9zdCA9IGhvc3RfcG9ydF9zcGxpdFswXTsKKyAgICAgICAgICAgICAgICB2YXIgcG9ydCA9IGhvc3RfcG9ydF9zcGxpdFsxXTsKKyAgICAgICAgICAgICAgICB2YXIgbWlsbGlzID0gbmV3IERhdGUoKS5nZXRUaW1lKCkgKyAodGltZW91dCAqIDYwMDAwKTsKKyAgICAgICAgICAgICAgICB2YXIgdGltZXN0YW1wID0gbmV3IERhdGUobWlsbGlzKS50b1RpbWVTdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICB2YXIgbXVzdGFjaGUgPSBNdXN0YWNoZS5yZW5kZXIoJCh0ZW1wbGF0ZSkuZmlsdGVyKCIjcHJvZmlsZXItYWN0aXZlLXBhcnRpYWwiKS5odG1sKCksIHsicHJvZmlsZXJBY3RpdmUiOiBbeworICAgICAgICAgICAgICAgICAgICAiaG9zdCI6IGhvc3QsCisgICAgICAgICAgICAgICAgICAgICJwb3J0IjogcG9ydCwKKyAgICAgICAgICAgICAgICAgICAgInRpbWVzdGFtcCI6IHRpbWVzdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgImR1bXBsaW5rIjogcmVzcG9uc2VbImR1bXBsaW5rIl19XX0pOworICAgICAgICAgICAgICAgICQoIiNwcm9maWxlci10YWJsZS1ib2R5IikuYXBwZW5kKG11c3RhY2hlKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9KTsKKyAgICB9KQorICAgIC5mYWlsKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CisgICAgICAgIGFsZXJ0KCAiU3RhcnRpbmcgcHJvZmlsZXIgZm9yICIgKyBpZCArICIgZmFpbGVkOiBcbiIgKyBKU09OLnN0cmluZ2lmeShyZXNwb25zZSkpOworICAgIH0pOworfQorCitmdW5jdGlvbiBzdG9wX3Byb2ZpbGluZyhpZCkgeworICAgIHZhciB0b3BvbG9neUlkID0gJC51cmwoIj90b3BvbG9neV9pZCIpOworICAgIHZhciB1cmwgPSAiL2FwaS92MS90b3BvbG9neS8iK3RvcG9sb2d5SWQrIi9wcm9maWxpbmcvc3RvcC8iICsgaWQ7CisKKyAgICAkKCIjc3RvcF8iICsgaWQpLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSk7CisgICAgc2V0VGltZW91dChmdW5jdGlvbigpeyAkKCIjc3RvcF8iICsgaWQpLnByb3AoJ2Rpc2FibGVkJywgZmFsc2UpOyB9LCA1MDAwKTsKKyAgICAKKyAgICAkLmdldCh1cmwsIGZ1bmN0aW9uKHJlc3BvbnNlLHN0YXR1cyxqcVhIUikgeworICAgICAgICBhbGVydCgiU3VibWl0dGVkIHJlcXVlc3QgdG8gc3RvcCBwcm9maWxpbmcuLi4iKTsKKyAgICB9KQorICAgIC5mYWlsKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CisgICAgICAgIGFsZXJ0KCAiU3RvcHBpbmcgcHJvZmlsZXIgZm9yICIgKyBpZCArICIgZmFpbGVkOiBcbiIgKyBKU09OLnN0cmluZ2lmeShyZXNwb25zZSkpOworICAgIH0pOworICAgIAorfQorCitmdW5jdGlvbiBkdW1wX3Byb2ZpbGUoaWQpIHsKKyAgICB2YXIgdG9wb2xvZ3lJZCA9ICQudXJsKCI/dG9wb2xvZ3lfaWQiKTsKKyAgICB2YXIgdXJsID0gIi9hcGkvdjEvdG9wb2xvZ3kvIit0b3BvbG9neUlkKyIvcHJvZmlsaW5nL2R1bXBwcm9maWxlLyIgKyBpZDsKKworICAgICQoIiNkdW1wX3Byb2ZpbGVfIiArIGlkKS5wcm9wKCdkaXNhYmxlZCcsIHRydWUpOworICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsgJCgiI2R1bXBfcHJvZmlsZV8iICsgaWQpLnByb3AoJ2Rpc2FibGVkJywgZmFsc2UpOyB9LCA1MDAwKTsKKyAgICAKKyAgICAkLmdldCh1cmwsIGZ1bmN0aW9uKHJlc3BvbnNlLHN0YXR1cyxqcVhIUikgeworICAgICAgICBhbGVydCgiU3VibWl0dGVkIHJlcXVlc3QgdG8gZHVtcCBwcm9maWxlIHNuYXBzaG90Li4uIik7CisgICAgfSkKKyAgICAuZmFpbChmdW5jdGlvbihyZXNwb25zZSkgeworICAgICAgICBhbGVydCggIkR1bXBpbmcgcHJvZmlsZSBkYXRhIGZvciAiICsgaWQgKyAiIGZhaWxlZDogXG4iICsgSlNPTi5zdHJpbmdpZnkocmVzcG9uc2UpKTsKKyAgICB9KTsKK30KKworZnVuY3Rpb24gZHVtcF9qc3RhY2soaWQpIHsKKyAgICB2YXIgdG9wb2xvZ3lJZCA9ICQudXJsKCI/dG9wb2xvZ3lfaWQiKTsKKyAgICB2YXIgdXJsID0gIi9hcGkvdjEvdG9wb2xvZ3kvIit0b3BvbG9neUlkKyIvcHJvZmlsaW5nL2R1bXBqc3RhY2svIiArIGlkOworCisgICAgJCgiI2R1bXBfanN0YWNrXyIgKyBpZCkucHJvcCgnZGlzYWJsZWQnLCB0cnVlKTsKKyAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ICQoIiNkdW1wX2pzdGFja18iICsgaWQpLnByb3AoJ2Rpc2FibGVkJywgZmFsc2UpOyB9LCA1MDAwKTsKKyAgICAKKyAgICAkLmdldCh1cmwsIGZ1bmN0aW9uKHJlc3BvbnNlLHN0YXR1cyxqcVhIUikgeworICAgICAgICBhbGVydCgiU3VibWl0dGVkIHJlcXVlc3QgZm9yIGpzdGFjayBkdW1wLi4uIik7CisgICAgfSkKKyAgICAuZmFpbChmdW5jdGlvbihyZXNwb25zZSkgeworICAgICAgICBhbGVydCggIkR1bXBpbmcgSlN0YWNrIGZvciAiICsgaWQgKyAiIGZhaWxlZDogXG4iICsgSlNPTi5zdHJpbmdpZnkocmVzcG9uc2UpKTsKKyAgICB9KTsKK30KKworZnVuY3Rpb24gcmVzdGFydF93b3JrZXJfanZtKGlkKSB7CisgICAgdmFyIHRvcG9sb2d5SWQgPSAkLnVybCgiP3RvcG9sb2d5X2lkIik7CisgICAgdmFyIHVybCA9ICIvYXBpL3YxL3RvcG9sb2d5LyIrdG9wb2xvZ3lJZCsiL3Byb2ZpbGluZy9yZXN0YXJ0d29ya2VyLyIgKyBpZDsKKworICAgICQoIiNyZXN0YXJ0X3dvcmtlcl9qdm1fIiArIGlkKS5wcm9wKCdkaXNhYmxlZCcsIHRydWUpOworICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXsgJCgiI3Jlc3RhcnRfd29ya2VyX2p2bV8iICsgaWQpLnByb3AoJ2Rpc2FibGVkJywgZmFsc2UpOyB9LCA1MDAwKTsKKworICAgICQuZ2V0KHVybCwgZnVuY3Rpb24ocmVzcG9uc2Usc3RhdHVzLGpxWEhSKSB7CisgICAgICAgIGFsZXJ0KCJTdWJtaXR0ZWQgcmVxdWVzdCBmb3IgcmVzdGFydGluZyB3b3JrZXIuLi4iKTsKKyAgICB9KQorICAgIC5mYWlsKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CisgICAgICAgIGFsZXJ0KCAiRmFpbGVkIHRvIHJlc3RhcnQgd29ya2VyIGZvciAiICsgaWQgKyAiIGZhaWxlZDogXG4iICsgSlNPTi5zdHJpbmdpZnkocmVzcG9uc2UpKTsKKyAgICB9KTsKK30KKworZnVuY3Rpb24gZHVtcF9oZWFwKGlkKSB7CisgICAgdmFyIHRvcG9sb2d5SWQgPSAkLnVybCgiP3RvcG9sb2d5X2lkIik7CisgICAgdmFyIHVybCA9ICIvYXBpL3YxL3RvcG9sb2d5LyIrdG9wb2xvZ3lJZCsiL3Byb2ZpbGluZy9kdW1waGVhcC8iICsgaWQ7CisgICAgdmFyIGhlYXAgPSAkKCIjZHVtcF9oZWFwXyIgKyBpZCk7CisgICAgJCgiI2R1bXBfaGVhcF8iICsgaWQpLnByb3AoJ2Rpc2FibGVkJywgdHJ1ZSk7CisgICAgc2V0VGltZW91dChmdW5jdGlvbigpeyAkKCIjZHVtcF9oZWFwXyIgKyBpZCkucHJvcCgnZGlzYWJsZWQnLCBmYWxzZSk7IH0sIDUwMDApOworICAgIAorICAgICQuZ2V0KHVybCwgZnVuY3Rpb24ocmVzcG9uc2Usc3RhdHVzLGpxWEhSKSB7CisgICAgICAgIGFsZXJ0KCJTdWJtaXR0ZWQgcmVxdWVzdCBmb3Igam1hcCBkdW1wLi4uIik7CisgICAgfSkKKyAgICAuZmFpbChmdW5jdGlvbihyZXNwb25zZSkgeworICAgICAgICBhbGVydCggIkR1bXBpbmcgSGVhcCBmb3IgIiArIGlkICsgIiBmYWlsZWQ6IFxuIiArIEpTT04uc3RyaW5naWZ5KHJlc3BvbnNlKSk7CisgICAgfSk7Cit9CisKIDwvc2NyaXB0PgogPC9kaXY+CiA8L2JvZHk+CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy91aS9wdWJsaWMvY3NzL3N0eWxlLmNzcyBiL3N0b3JtLWNvcmUvc3JjL3VpL3B1YmxpYy9jc3Mvc3R5bGUuY3NzCmluZGV4IGUwNTg4NTAuLmRkYWUyZDUgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL3VpL3B1YmxpYy9jc3Mvc3R5bGUuY3NzCisrKyBiL3N0b3JtLWNvcmUvc3JjL3VpL3B1YmxpYy9jc3Mvc3R5bGUuY3NzCkBAIC0yNCw2ICsyNCwxNCBAQAogICAgIHBhZGRpbmc6IDAuNWVtOwogfQogCisjY2hhbmdlLWxvZy1sZXZlbCBzZWxlY3R7CisgICAgd2lkdGg6MTBlbTsKK30KKworI2NoYW5nZS1sb2ctbGV2ZWwgaW5wdXQudGltZW91dF9pbnB1dHsKKyAgICB3aWR0aDo1ZW07Cit9CisKIGJvZHksCiAuZGF0YVRhYmxlc193cmFwcGVyIGxhYmVsLAogZGl2LmRhdGFUYWJsZXNfaW5mb1tyb2xlPSJzdGF0dXMiXSwKQEAgLTk2LDMgKzEwNCwxMSBAQAogICBwYWRkaW5nOiAwcHg7CiAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50OwogfQorCisuaW1hZ2VfcHJlX2Zvcm1hdCB7CisgIGJvcmRlcjogbm9uZTsKKyAgcGFkZGluZzogMHB4OworICBoZWlnaHQ6IDFlbTsKKyAgd2lkdGg6IDFlbTsKK30KKwpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvdWkvcHVibGljL2RlZXBfc2VhcmNoX3Jlc3VsdC5odG1sIGIvc3Rvcm0tY29yZS9zcmMvdWkvcHVibGljL2RlZXBfc2VhcmNoX3Jlc3VsdC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNmExMDEKLS0tIC9kZXYvbnVsbAorKysgYi9zdG9ybS1jb3JlL3NyYy91aS9wdWJsaWMvZGVlcF9zZWFyY2hfcmVzdWx0Lmh0bWwKQEAgLTAsMCArMSwxNTUgQEAKKzxodG1sPjxoZWFkPgorICAgIDwhLS0KKyAgICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgICAgLS0+Cis8bWV0YSBjaGFyc2V0PSJVVEYtOCI+Cis8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPgorPHRpdGxlPlN0b3JtIFVJPC90aXRsZT4KKzxsaW5rIGhyZWY9Ii9jc3MvYm9vdHN0cmFwLTMuMy4xLm1pbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPgorPGxpbmsgaHJlZj0iL2Nzcy9qcXVlcnkuZGF0YVRhYmxlcy4xLjEwLjQubWluLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+Cis8bGluayBocmVmPSIvY3NzL2RhdGFUYWJsZXMuYm9vdHN0cmFwLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+Cis8bGluayBocmVmPSIvY3NzL3N0eWxlLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+Cis8c2NyaXB0IHNyYz0iL2pzL2pxdWVyeS0xLjExLjEubWluLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9Ii9qcy9qcXVlcnkuZGF0YVRhYmxlcy4xLjEwLjQubWluLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9Ii9qcy9qcXVlcnkuY29va2llcy4yLjIuMC5taW4uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0iL2pzL2pxdWVyeS5tdXN0YWNoZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSIvanMvdHlwZWFoZWFkLmpxdWVyeS5taW4uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0iL2pzL2Jvb3RzdHJhcC0zLjMuMS5taW4uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0iL2pzL2pxdWVyeS5ibG9ja1VJLm1pbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSIvanMvdXJsLm1pbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSIvanMvZGF0YVRhYmxlcy5ib290c3RyYXAubWluLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9Ii9qcy9zY3JpcHQuanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+Cis8L2hlYWQ+Cis8Ym9keT4KKzxkaXYgY2xhc3M9ImNvbnRhaW5lci1mbHVpZCI+CisgIDxkaXYgY2xhc3M9InJvdyI+CisgICAgPGRpdiBpZD0ic2VhcmNoLWZvcm0iPjwvZGl2PgorICA8L2Rpdj4KKyAgPGRpdiBjbGFzcz0icm93Ij4KKyAgICA8ZGl2IGlkPSJyZXN1bHQiPjwvZGl2PgorICA8L2Rpdj4KKzwvZGl2PgorPC9ib2R5PgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorCitmdW5jdGlvbiBlbGVtX2lkX2Zvcl9ob3N0KGhvc3QpIHsKKyAgICByZXR1cm4gInNlYXJjaC1yZXN1bHRzLSIraG9zdC5yZXBsYWNlKC9cLi9nLCItIik7Cit9CisKKyQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uKCkgeworICAgIHZhciBpZCA9ICQudXJsKCI/aWQiKTsKKyAgICB2YXIgc2VhcmNoID0gJC51cmwoIj9zZWFyY2giKTsKKyAgICB2YXIgY291bnQgPSAkLnVybCgiP2NvdW50IikgfHwgMjsKKyAgICB2YXIgcG9ydCA9ICQudXJsKCI/cG9ydCIpIHx8ICIqIjsKKyAgICB2YXIgc2VhcmNoX2FyY2hpdmVkID0gJC51cmwoIj9zZWFyY2gtYXJjaGl2ZWQiKTsKKworICAgICQuZ2V0KCIvdGVtcGxhdGVzL2RlZXAtc2VhcmNoLXJlc3VsdC1wYWdlLXRlbXBsYXRlLmh0bWwiLCBmdW5jdGlvbih0ZW1wbGF0ZSkgeworICAgICAgICB2YXIgY2hlY2tlZDsKKyAgICAgICAgaWYgKHNlYXJjaF9hcmNoaXZlZCkgeworICAgICAgICAgICAgY2hlY2tlZCA9ICJjaGVja2VkIjsKKyAgICAgICAgfQorICAgICAgICAkLmdldCgiL2FwaS92MS9oaXN0b3J5L3N1bW1hcnkiLCBmdW5jdGlvbiAocmVzcG9uc2UsIHN0YXR1cywganFYSFIpIHsKKyAgICAgICAgICAgIHZhciBmaW5kSWRzID0gZnVuY3Rpb24gZmluZElkcyhxdWVyeSwgY2IpIHsKKyAgICAgICAgICAgICAgICB2YXIgZm91bmQgPSBbXTsKKyAgICAgICAgICAgICAgICB2YXIgcmUgPSBuZXcgUmVnRXhwKHF1ZXJ5LCAnaScpOworICAgICAgICAgICAgICAgIGZvciAodmFyIGogaW4gcmVzcG9uc2VbInRvcG8taGlzdG9yeSJdKSB7CisgICAgICAgICAgICAgICAgICAgIHZhciBpZCA9IHJlc3BvbnNlWyJ0b3BvLWhpc3RvcnkiXVtqXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlLnRlc3QoaWQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZC5wdXNoKHsgdmFsdWU6IGlkIH0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICBjYihmb3VuZCk7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICAkKCIjc2VhcmNoLWZvcm0iKS5hcHBlbmQoTXVzdGFjaGUucmVuZGVyKCQodGVtcGxhdGUpLmZpbHRlcigiI3NlYXJjaC1mb3JtLXRlbXBsYXRlIikuaHRtbCgpLHtpZDogaWQsIHNlYXJjaDogc2VhcmNoLCBjb3VudDogY291bnQsIHNlYXJjaF9hcmNoaXZlZDogY2hlY2tlZCwgdG9wb2xvZ2llczogcmVzcG9uc2VbInRvcG8taGlzdG9yeSJdfSkpOworICAgICAgICAgICAgJCgnI3NlYXJjaC1pZCcpLnR5cGVhaGVhZCh7CisgICAgICAgICAgICAgIGhpbnQ6IHRydWUsCisgICAgICAgICAgICAgIGhpZ2hsaWdodDogdHJ1ZSwKKyAgICAgICAgICAgICAgbWluTGVuZ3RoOiAxCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgeworICAgICAgICAgICAgICBuYW1lOiAnaWRzJywKKyAgICAgICAgICAgICAgZGlzcGxheUtleTogJ3ZhbHVlJywKKyAgICAgICAgICAgICAgc291cmNlOiBmaW5kSWRzIAorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAkKCcjc2VhcmNoLWZvcm0gW2RhdGEtdG9nZ2xlPSJ0b29sdGlwIl0nKS50b29sdGlwKCk7CisgICAgICAgIH0pOworCisgICAgICAgIGZ1bmN0aW9uIHJlbmRlcl9maWxlKGZpbGUsIGhvc3QsIGxvZ3ZpZXdlclBvcnQsIGNvdW50LCB0ZW1wbGF0ZSkgeworICAgICAgICAgICAgZmlsZS5ob3N0ID0gaG9zdDsKKyAgICAgICAgICAgIGZpbGUuaWQgPSBpZDsKKyAgICAgICAgICAgIGZpbGUuY291bnQgPSBjb3VudDsKKyAgICAgICAgICAgIGZpbGUubG9ndmlld2VyUG9ydCA9IGxvZ3ZpZXdlclBvcnQ7CisgICAgICAgICAgICBmaWxlLnNlYXJjaF9hcmNoaXZlZCA9IHNlYXJjaF9hcmNoaXZlZDsKKyAgICAgICAgICAgIHZhciBzZWFyY2hUZW1wbGF0ZSA9ICQodGVtcGxhdGUpLmZpbHRlcigiI3NlYXJjaC1yZXN1bHQtaWRlbnRpZmllZC10ZW1wbGF0ZSIpLmh0bWwoKTsKKyAgICAgICAgICAgIHZhciByZW5kZXJlZCA9IE11c3RhY2hlLnJlbmRlcihzZWFyY2hUZW1wbGF0ZSwgZmlsZSk7CisgICAgICAgICAgICB2YXIgZWxlbUlkID0gZWxlbV9pZF9mb3JfaG9zdChob3N0KTsKKyAgICAgICAgICAgICQoIiMiK2VsZW1JZCkucmVtb3ZlKCk7CisgICAgICAgICAgICAkKCIjc2VhcmNoLXJlc3VsdC10YWJsZSA+IHRib2R5IikuYXBwZW5kKHJlbmRlcmVkKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgdmFyIHJlc3VsdCA9ICQoIiNyZXN1bHQiKTsKKyAgICAgICAgaWYoc2VhcmNoKSB7CisgICAgICAgICAgICAkLmdldCgiL2FwaS92MS9zdXBlcnZpc29yL3N1bW1hcnkiLCBmdW5jdGlvbihyZXNwb25zZSwgc3RhdHVzLCBqcVhIUikgeworCisgICAgICAgICAgICAgICAgZm9yKHZhciBpIGluIHJlc3BvbnNlLnN1cGVydmlzb3JzKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnN1cGVydmlzb3JzW2ldLmVsZW1JZCA9IGVsZW1faWRfZm9yX2hvc3QocmVzcG9uc2Uuc3VwZXJ2aXNvcnNbaV0uaG9zdCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChNdXN0YWNoZS5yZW5kZXIoJCh0ZW1wbGF0ZSkuZmlsdGVyKCIjc2VhcmNoLXJlc3VsdC1maWxlcy10ZW1wbGF0ZSIpLmh0bWwoKSxyZXNwb25zZSkpOworCisgICAgICAgICAgICAgICAgdmFyIGxvZ3ZpZXdlclBvcnQgPSByZXNwb25zZS5sb2d2aWV3ZXJQb3J0OworICAgICAgICAgICAgICAgIHZhciBkaXN0aW5jdF9ob3N0cyA9IHt9OworICAgICAgICAgICAgICAgIGZvciAodmFyIGluZGV4IGluIHJlc3BvbnNlLnN1cGVydmlzb3JzKSB7CisgICAgICAgICAgICAgICAgICAgIGRpc3RpbmN0X2hvc3RzW3Jlc3BvbnNlLnN1cGVydmlzb3JzW2luZGV4XS5ob3N0XSA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgICAgICBmb3IgKHZhciBob3N0IGluIGRpc3RpbmN0X2hvc3RzKSB7CisgICAgICAgICAgICAgICAgICAgIHZhciBzZWFyY2hVUkwgPSAiaHR0cDovLyIraG9zdCsiOiIrbG9ndmlld2VyUG9ydCsiL2RlZXBTZWFyY2gvIitpZCsiP3NlYXJjaC1zdHJpbmc9IitzZWFyY2grIiZudW0tbWF0Y2hlcz0iK2NvdW50KyImcG9ydD0iK3BvcnQ7CisgICAgICAgICAgICAgICAgICAgIGlmKHNlYXJjaF9hcmNoaXZlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaFVSTCArPSAiJnNlYXJjaC1hcmNoaXZlZD0iICsgc2VhcmNoX2FyY2hpdmVkOworICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgICQuYWpheCh7ZGF0YVR5cGU6ICJqc29uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHNlYXJjaFVSTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4aHJGaWVsZHM6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0cnVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiAkLnByb3h5KGZ1bmN0aW9uKGRhdGEsc3RhdHVzLGpxWEhSKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHBvcnQgPT0gIioiKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IodmFyIGJ5X3BvcnQgaW4gZGF0YSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcih2YXIgaSBpbiBkYXRhW2J5X3BvcnRdLm1hdGNoZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyX2ZpbGUoZGF0YVtieV9wb3J0XS5tYXRjaGVzW2ldLCB0aGlzLmhvc3QsIGxvZ3ZpZXdlclBvcnQsIGNvdW50LCB0ZW1wbGF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKHZhciBpIGluIGRhdGEubWF0Y2hlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcl9maWxlKGRhdGEubWF0Y2hlc1tpXSwgdGhpcy5ob3N0LCBsb2d2aWV3ZXJQb3J0LCBjb3VudCwgdGVtcGxhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwge2hvc3Q6IGhvc3QsIGlkOiBpZH0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgIH0pOworfSk7CisKKzwvc2NyaXB0PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvdWkvcHVibGljL2ltYWdlcy9idWcucG5nIGIvc3Rvcm0tY29yZS9zcmMvdWkvcHVibGljL2ltYWdlcy9idWcucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5OGUxNTYKLS0tIC9kZXYvbnVsbAorKysgYi9zdG9ybS1jb3JlL3NyYy91aS9wdWJsaWMvaW1hZ2VzL2J1Zy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvdWkvcHVibGljL2ltYWdlcy9zZWFyY2gucG5nIGIvc3Rvcm0tY29yZS9zcmMvdWkvcHVibGljL2ltYWdlcy9zZWFyY2gucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhM2E2ODkKLS0tIC9kZXYvbnVsbAorKysgYi9zdG9ybS1jb3JlL3NyYy91aS9wdWJsaWMvaW1hZ2VzL3NlYXJjaC5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvdWkvcHVibGljL2ltYWdlcy9zdGF0aXN0aWMucG5nIGIvc3Rvcm0tY29yZS9zcmMvdWkvcHVibGljL2ltYWdlcy9zdGF0aXN0aWMucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5YWQzOGEKLS0tIC9kZXYvbnVsbAorKysgYi9zdG9ybS1jb3JlL3NyYy91aS9wdWJsaWMvaW1hZ2VzL3N0YXRpc3RpYy5wbmcKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvdWkvcHVibGljL2luZGV4Lmh0bWwgYi9zdG9ybS1jb3JlL3NyYy91aS9wdWJsaWMvaW5kZXguaHRtbAppbmRleCAxY2Q2NDQ1Li5lYWU0MjNjIDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy91aS9wdWJsaWMvaW5kZXguaHRtbAorKysgYi9zdG9ybS1jb3JlL3NyYy91aS9wdWJsaWMvaW5kZXguaHRtbApAQCAtMzcsMTAgKzM3LDEwIEBACiA8Ym9keT4KIDxkaXYgY2xhc3M9ImNvbnRhaW5lci1mbHVpZCI+CiAgIDxkaXYgY2xhc3M9InJvdyI+Ci0gICAgPGRpdiBjbGFzcz0iY29sLW1kLTExIj4KKyAgICA8ZGl2IGNsYXNzPSJjb2wtbWQtOSI+CiAgICAgICA8aDE+PGEgaHJlZj0iLyI+U3Rvcm0gVUk8L2E+PC9oMT4KICAgICA8L2Rpdj4KLSAgICA8ZGl2IGlkPSJ1aS11c2VyIiBjbGFzcz0iY29sLW1kLTEiPjwvZGl2PgorICAgIDxkaXYgaWQ9InVpLXVzZXIiIGNsYXNzPSJjb2wtbWQtMyI+PC9kaXY+CiAgIDwvZGl2PgogICA8ZGl2IGNsYXNzPSJyb3ciPgogICAgIDxkaXYgY2xhc3M9ImNvbC1tZC0xMiI+CkBAIC0xMzUsMTEgKzEzNSwxMSBAQAogICAgICQuZ2V0SlNPTigiL2FwaS92MS90b3BvbG9neS9zdW1tYXJ5IixmdW5jdGlvbihyZXNwb25zZSxzdGF0dXMsanFYSFIpIHsKICAgICAgICQuZ2V0KCIvdGVtcGxhdGVzL2luZGV4LXBhZ2UtdGVtcGxhdGUuaHRtbCIsIGZ1bmN0aW9uKHRlbXBsYXRlKSB7CiAgICAgICAgICAgdG9wb2xvZ3lTdW1tYXJ5LmFwcGVuZChNdXN0YWNoZS5yZW5kZXIoJCh0ZW1wbGF0ZSkuZmlsdGVyKCIjdG9wb2xvZ3ktc3VtbWFyeS10ZW1wbGF0ZSIpLmh0bWwoKSxyZXNwb25zZSkpOwotICAgICAgICAgIC8vbmFtZSwgaWQsIG93bmVyLCBzdGF0dXMsIHVwdGltZSwgbnVtIHdvcmtlcnMsIG51bSBleGVjdXRvcnMsIG51bSB0YXNrcywgc2NoZWR1bGVyIGluZm8KKyAgICAgICAgICAvL25hbWUsIG93bmVyLCBzdGF0dXMsIHVwdGltZSwgbnVtIHdvcmtlcnMsIG51bSBleGVjdXRvcnMsIG51bSB0YXNrcywgcmVwbGljYXRpb24gY291bnQsIGFzc2lnbmVkIHRvdGFsIG1lbSwgYXNzaWduZWQgdG90YWwgY3B1LCBzY2hlZHVsZXIgaW5mbwogICAgICAgICAgIGR0QXV0b1BhZ2UoIiN0b3BvbG9neS1zdW1tYXJ5LXRhYmxlIiwgewogICAgICAgICAgICAgY29sdW1uRGVmczogWwotICAgICAgICAgICAgICB7dHlwZTogIm51bSIsIHRhcmdldHM6IFs1LCA2LCA3XX0sCi0gICAgICAgICAgICAgIHt0eXBlOiAidGltZS1zdHIiLCB0YXJnZXRzOiBbNF19CisgICAgICAgICAgICAgIHt0eXBlOiAibnVtIiwgdGFyZ2V0czogWzQsIDUsIDYsIDcsIDgsIDldfSwKKyAgICAgICAgICAgICAge3R5cGU6ICJ0aW1lLXN0ciIsIHRhcmdldHM6IFszXX0KICAgICAgICAgICAgIF0KICAgICAgICAgICB9KTsKICAgICAgICAgICAkKCcjdG9wb2xvZ3ktc3VtbWFyeSBbZGF0YS10b2dnbGU9InRvb2x0aXAiXScpLnRvb2x0aXAoKTsKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL3VpL3B1YmxpYy9qcy9zY3JpcHQuanMgYi9zdG9ybS1jb3JlL3NyYy91aS9wdWJsaWMvanMvc2NyaXB0LmpzCmluZGV4IGZlODY0M2QuLmE4ODAyMDUgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL3VpL3B1YmxpYy9qcy9zY3JpcHQuanMKKysrIGIvc3Rvcm0tY29yZS9zcmMvdWkvcHVibGljL2pzL3NjcmlwdC5qcwpAQCAtODEsNiArODEsMjYgQEAKICAgICByZXR1cm4gaXNJbnQ7CiB9CiAKK2Z1bmN0aW9uIHNlbmRSZXF1ZXN0KGlkLCBhY3Rpb24sIGV4dHJhLCBib2R5LCBjYil7CisgICB2YXIgb3B0cyA9IHsKKyAgICAgICAgdHlwZTonUE9TVCcsCisgICAgICAgIHVybDonL2FwaS92MS90b3BvbG9neS8nICsgaWQgKyAnLycgKyBhY3Rpb24KKyAgICB9OworCisgICAgaWYgKGJvZHkpIHsKKyAgICAgICAgb3B0cy5kYXRhID0gSlNPTi5zdHJpbmdpZnkoYm9keSk7CisgICAgICAgIG9wdHMuY29udGVudFR5cGUgPSAnYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOCc7CisgICAgfQorCisgICAgb3B0cy51cmwgKz0gZXh0cmEgPyAiLyIgKyBleHRyYSA6ICIiOworCisgICAgJC5hamF4KG9wdHMpLmFsd2F5cyhmdW5jdGlvbihkYXRhKXsKKyAgICAgICAgY2IgKGRhdGEpOworICAgIH0pLmZhaWwgKGZ1bmN0aW9uKCl7CisgICAgICAgIGFsZXJ0KCJFcnJvciB3aGlsZSBjb21tdW5pY2F0aW5nIHdpdGggTmltYnVzLiIpOworICAgIH0pOworfQorCiBmdW5jdGlvbiBjb25maXJtQ29tcG9uZW50QWN0aW9uKHRvcG9sb2d5SWQsIGNvbXBvbmVudElkLCBjb21wb25lbnROYW1lLCBhY3Rpb24sIHBhcmFtLCBkZWZhdWx0UGFyYW1WYWx1ZSwgcGFyYW1UZXh0LCBhY3Rpb25UZXh0KSB7CiAgICAgdmFyIG9wdHMgPSB7CiAgICAgICAgIHR5cGU6J1BPU1QnLApkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvdWkvcHVibGljL2pzL3R5cGVhaGVhZC5qcXVlcnkubWluLmpzIGIvc3Rvcm0tY29yZS9zcmMvdWkvcHVibGljL2pzL3R5cGVhaGVhZC5qcXVlcnkubWluLmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlZTI5ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9zdG9ybS1jb3JlL3NyYy91aS9wdWJsaWMvanMvdHlwZWFoZWFkLmpxdWVyeS5taW4uanMKQEAgLTAsMCArMSw3IEBACisvKiEKKyAqIHR5cGVhaGVhZC5qcyAwLjEwLjUKKyAqIGh0dHBzOi8vZ2l0aHViLmNvbS90d2l0dGVyL3R5cGVhaGVhZC5qcworICogQ29weXJpZ2h0IDIwMTMtMjAxNCBUd2l0dGVyLCBJbmMuIGFuZCBvdGhlciBjb250cmlidXRvcnM7IExpY2Vuc2VkIE1JVAorICovCisKKyFmdW5jdGlvbihhKXt2YXIgYj1mdW5jdGlvbigpeyJ1c2Ugc3RyaWN0IjtyZXR1cm57aXNNc2llOmZ1bmN0aW9uKCl7cmV0dXJuLyhtc2llfHRyaWRlbnQpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KT9uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC8obXNpZSB8cnY6KShcZCsoLlxkKyk/KS9pKVsyXTohMX0saXNCbGFua1N0cmluZzpmdW5jdGlvbihhKXtyZXR1cm4hYXx8L15ccyokLy50ZXN0KGEpfSxlc2NhcGVSZWdFeENoYXJzOmZ1bmN0aW9uKGEpe3JldHVybiBhLnJlcGxhY2UoL1tcLVxbXF1cL1x7XH1cKFwpXCpcK1w/XC5cXFxeXCRcfF0vZywiXFwkJiIpfSxpc1N0cmluZzpmdW5jdGlvbihhKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGF9LGlzTnVtYmVyOmZ1bmN0aW9uKGEpe3JldHVybiJudW1iZXIiPT10eXBlb2YgYX0saXNBcnJheTphLmlzQXJyYXksaXNGdW5jdGlvbjphLmlzRnVuY3Rpb24saXNPYmplY3Q6YS5pc1BsYWluT2JqZWN0LGlzVW5kZWZpbmVkOmZ1bmN0aW9uKGEpe3JldHVybiJ1bmRlZmluZWQiPT10eXBlb2YgYX0sdG9TdHI6ZnVuY3Rpb24oYSl7cmV0dXJuIGIuaXNVbmRlZmluZWQoYSl8fG51bGw9PT1hPyIiOmErIiJ9LGJpbmQ6YS5wcm94eSxlYWNoOmZ1bmN0aW9uKGIsYyl7ZnVuY3Rpb24gZChhLGIpe3JldHVybiBjKGIsYSl9YS5lYWNoKGIsZCl9LG1hcDphLm1hcCxmaWx0ZXI6YS5ncmVwLGV2ZXJ5OmZ1bmN0aW9uKGIsYyl7dmFyIGQ9ITA7cmV0dXJuIGI/KGEuZWFjaChiLGZ1bmN0aW9uKGEsZSl7cmV0dXJuKGQ9Yy5jYWxsKG51bGwsZSxhLGIpKT92b2lkIDA6ITF9KSwhIWQpOmR9LHNvbWU6ZnVuY3Rpb24oYixjKXt2YXIgZD0hMTtyZXR1cm4gYj8oYS5lYWNoKGIsZnVuY3Rpb24oYSxlKXtyZXR1cm4oZD1jLmNhbGwobnVsbCxlLGEsYikpPyExOnZvaWQgMH0pLCEhZCk6ZH0sbWl4aW46YS5leHRlbmQsZ2V0VW5pcXVlSWQ6ZnVuY3Rpb24oKXt2YXIgYT0wO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBhKyt9fSgpLHRlbXBsYXRpZnk6ZnVuY3Rpb24oYil7ZnVuY3Rpb24gYygpe3JldHVybiBTdHJpbmcoYil9cmV0dXJuIGEuaXNGdW5jdGlvbihiKT9iOmN9LGRlZmVyOmZ1bmN0aW9uKGEpe3NldFRpbWVvdXQoYSwwKX0sZGVib3VuY2U6ZnVuY3Rpb24oYSxiLGMpe3ZhciBkLGU7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGYsZyxoPXRoaXMsaT1hcmd1bWVudHM7cmV0dXJuIGY9ZnVuY3Rpb24oKXtkPW51bGwsY3x8KGU9YS5hcHBseShoLGkpKX0sZz1jJiYhZCxjbGVhclRpbWVvdXQoZCksZD1zZXRUaW1lb3V0KGYsYiksZyYmKGU9YS5hcHBseShoLGkpKSxlfX0sdGhyb3R0bGU6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGUsZixnLGg7cmV0dXJuIGc9MCxoPWZ1bmN0aW9uKCl7Zz1uZXcgRGF0ZSxlPW51bGwsZj1hLmFwcGx5KGMsZCl9LGZ1bmN0aW9uKCl7dmFyIGk9bmV3IERhdGUsaj1iLShpLWcpO3JldHVybiBjPXRoaXMsZD1hcmd1bWVudHMsMD49aj8oY2xlYXJUaW1lb3V0KGUpLGU9bnVsbCxnPWksZj1hLmFwcGx5KGMsZCkpOmV8fChlPXNldFRpbWVvdXQoaCxqKSksZn19LG5vb3A6ZnVuY3Rpb24oKXt9fX0oKSxjPWZ1bmN0aW9uKCl7cmV0dXJue3dyYXBwZXI6JzxzcGFuIGNsYXNzPSJ0d2l0dGVyLXR5cGVhaGVhZCI+PC9zcGFuPicsZHJvcGRvd246JzxzcGFuIGNsYXNzPSJ0dC1kcm9wZG93bi1tZW51Ij48L3NwYW4+JyxkYXRhc2V0Oic8ZGl2IGNsYXNzPSJ0dC1kYXRhc2V0LSVDTEFTUyUiPjwvZGl2Picsc3VnZ2VzdGlvbnM6JzxzcGFuIGNsYXNzPSJ0dC1zdWdnZXN0aW9ucyI+PC9zcGFuPicsc3VnZ2VzdGlvbjonPGRpdiBjbGFzcz0idHQtc3VnZ2VzdGlvbiI+PC9kaXY+J319KCksZD1mdW5jdGlvbigpeyJ1c2Ugc3RyaWN0Ijt2YXIgYT17d3JhcHBlcjp7cG9zaXRpb246InJlbGF0aXZlIixkaXNwbGF5OiJpbmxpbmUtYmxvY2sifSxoaW50Ontwb3NpdGlvbjoiYWJzb2x1dGUiLHRvcDoiMCIsbGVmdDoiMCIsYm9yZGVyQ29sb3I6InRyYW5zcGFyZW50Iixib3hTaGFkb3c6Im5vbmUiLG9wYWNpdHk6IjEifSxpbnB1dDp7cG9zaXRpb246InJlbGF0aXZlIix2ZXJ0aWNhbEFsaWduOiJ0b3AiLGJhY2tncm91bmRDb2xvcjoidHJhbnNwYXJlbnQifSxpbnB1dFdpdGhOb0hpbnQ6e3Bvc2l0aW9uOiJyZWxhdGl2ZSIsdmVydGljYWxBbGlnbjoidG9wIn0sZHJvcGRvd246e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdG9wOiIxMDAlIixsZWZ0OiIwIix6SW5kZXg6IjEwMCIsZGlzcGxheToibm9uZSJ9LHN1Z2dlc3Rpb25zOntkaXNwbGF5OiJibG9jayJ9LHN1Z2dlc3Rpb246e3doaXRlU3BhY2U6Im5vd3JhcCIsY3Vyc29yOiJwb2ludGVyIn0sc3VnZ2VzdGlvbkNoaWxkOnt3aGl0ZVNwYWNlOiJub3JtYWwifSxsdHI6e2xlZnQ6IjAiLHJpZ2h0OiJhdXRvIn0scnRsOntsZWZ0OiJhdXRvIixyaWdodDoiIDAifX07cmV0dXJuIGIuaXNNc2llKCkmJmIubWl4aW4oYS5pbnB1dCx7YmFja2dyb3VuZEltYWdlOiJ1cmwoZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBQkFJQUFBQUFBQVAvLy95SDVCQUVBQUFBQUxBQUFBQUFCQUFFQUFBSUJSQUE3KSJ9KSxiLmlzTXNpZSgpJiZiLmlzTXNpZSgpPD03JiZiLm1peGluKGEuaW5wdXQse21hcmdpblRvcDoiLTFweCJ9KSxhfSgpLGU9ZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gYyhiKXtiJiZiLmVsfHxhLmVycm9yKCJFdmVudEJ1cyBpbml0aWFsaXplZCB3aXRob3V0IGVsIiksdGhpcy4kZWw9YShiLmVsKX12YXIgZD0idHlwZWFoZWFkOiI7cmV0dXJuIGIubWl4aW4oYy5wcm90b3R5cGUse3RyaWdnZXI6ZnVuY3Rpb24oYSl7dmFyIGI9W10uc2xpY2UuY2FsbChhcmd1bWVudHMsMSk7dGhpcy4kZWwudHJpZ2dlcihkK2EsYil9fSksY30oKSxmPWZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGEoYSxiLGMsZCl7dmFyIGU7aWYoIWMpcmV0dXJuIHRoaXM7Zm9yKGI9Yi5zcGxpdChpKSxjPWQ/aChjLGQpOmMsdGhpcy5fY2FsbGJhY2tzPXRoaXMuX2NhbGxiYWNrc3x8e307ZT1iLnNoaWZ0KCk7KXRoaXMuX2NhbGxiYWNrc1tlXT10aGlzLl9jYWxsYmFja3NbZV18fHtzeW5jOltdLGFzeW5jOltdfSx0aGlzLl9jYWxsYmFja3NbZV1bYV0ucHVzaChjKTtyZXR1cm4gdGhpc31mdW5jdGlvbiBiKGIsYyxkKXtyZXR1cm4gYS5jYWxsKHRoaXMsImFzeW5jIixiLGMsZCl9ZnVuY3Rpb24gYyhiLGMsZCl7cmV0dXJuIGEuY2FsbCh0aGlzLCJzeW5jIixiLGMsZCl9ZnVuY3Rpb24gZChhKXt2YXIgYjtpZighdGhpcy5fY2FsbGJhY2tzKXJldHVybiB0aGlzO2ZvcihhPWEuc3BsaXQoaSk7Yj1hLnNoaWZ0KCk7KWRlbGV0ZSB0aGlzLl9jYWxsYmFja3NbYl07cmV0dXJuIHRoaXN9ZnVuY3Rpb24gZShhKXt2YXIgYixjLGQsZSxnO2lmKCF0aGlzLl9jYWxsYmFja3MpcmV0dXJuIHRoaXM7Zm9yKGE9YS5zcGxpdChpKSxkPVtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpOyhiPWEuc2hpZnQoKSkmJihjPXRoaXMuX2NhbGxiYWNrc1tiXSk7KWU9ZihjLnN5bmMsdGhpcyxbYl0uY29uY2F0KGQpKSxnPWYoYy5hc3luYyx0aGlzLFtiXS5jb25jYXQoZCkpLGUoKSYmaihnKTtyZXR1cm4gdGhpc31mdW5jdGlvbiBmKGEsYixjKXtmdW5jdGlvbiBkKCl7Zm9yKHZhciBkLGU9MCxmPWEubGVuZ3RoOyFkJiZmPmU7ZSs9MSlkPWFbZV0uYXBwbHkoYixjKT09PSExO3JldHVybiFkfXJldHVybiBkfWZ1bmN0aW9uIGcoKXt2YXIgYTtyZXR1cm4gYT13aW5kb3cuc2V0SW1tZWRpYXRlP2Z1bmN0aW9uKGEpe3NldEltbWVkaWF0ZShmdW5jdGlvbigpe2EoKX0pfTpmdW5jdGlvbihhKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YSgpfSwwKX19ZnVuY3Rpb24gaChhLGIpe3JldHVybiBhLmJpbmQ/YS5iaW5kKGIpOmZ1bmN0aW9uKCl7YS5hcHBseShiLFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApKX19dmFyIGk9L1xzKy8saj1nKCk7cmV0dXJue29uU3luYzpjLG9uQXN5bmM6YixvZmY6ZCx0cmlnZ2VyOmV9fSgpLGc9ZnVuY3Rpb24oYSl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGMoYSxjLGQpe2Zvcih2YXIgZSxmPVtdLGc9MCxoPWEubGVuZ3RoO2g+ZztnKyspZi5wdXNoKGIuZXNjYXBlUmVnRXhDaGFycyhhW2ddKSk7cmV0dXJuIGU9ZD8iXFxiKCIrZi5qb2luKCJ8IikrIilcXGIiOiIoIitmLmpvaW4oInwiKSsiKSIsYz9uZXcgUmVnRXhwKGUpOm5ldyBSZWdFeHAoZSwiaSIpfXZhciBkPXtub2RlOm51bGwscGF0dGVybjpudWxsLHRhZ05hbWU6InN0cm9uZyIsY2xhc3NOYW1lOm51bGwsd29yZHNPbmx5OiExLGNhc2VTZW5zaXRpdmU6ITF9O3JldHVybiBmdW5jdGlvbihlKXtmdW5jdGlvbiBmKGIpe3ZhciBjLGQsZjtyZXR1cm4oYz1oLmV4ZWMoYi5kYXRhKSkmJihmPWEuY3JlYXRlRWxlbWVudChlLnRhZ05hbWUpLGUuY2xhc3NOYW1lJiYoZi5jbGFzc05hbWU9ZS5jbGFzc05hbWUpLGQ9Yi5zcGxpdFRleHQoYy5pbmRleCksZC5zcGxpdFRleHQoY1swXS5sZW5ndGgpLGYuYXBwZW5kQ2hpbGQoZC5jbG9uZU5vZGUoITApKSxiLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGYsZCkpLCEhY31mdW5jdGlvbiBnKGEsYil7Zm9yKHZhciBjLGQ9MyxlPTA7ZTxhLmNoaWxkTm9kZXMubGVuZ3RoO2UrKyljPWEuY2hpbGROb2Rlc1tlXSxjLm5vZGVUeXBlPT09ZD9lKz1iKGMpPzE6MDpnKGMsYil9dmFyIGg7ZT1iLm1peGluKHt9LGQsZSksZS5ub2RlJiZlLnBhdHRlcm4mJihlLnBhdHRlcm49Yi5pc0FycmF5KGUucGF0dGVybik/ZS5wYXR0ZXJuOltlLnBhdHRlcm5dLGg9YyhlLnBhdHRlcm4sZS5jYXNlU2Vuc2l0aXZlLGUud29yZHNPbmx5KSxnKGUubm9kZSxmKSl9fSh3aW5kb3cuZG9jdW1lbnQpLGg9ZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gYyhjKXt2YXIgZSxmLGcsaSxqPXRoaXM7Yz1jfHx7fSxjLmlucHV0fHxhLmVycm9yKCJpbnB1dCBpcyBtaXNzaW5nIiksZT1iLmJpbmQodGhpcy5fb25CbHVyLHRoaXMpLGY9Yi5iaW5kKHRoaXMuX29uRm9jdXMsdGhpcyksZz1iLmJpbmQodGhpcy5fb25LZXlkb3duLHRoaXMpLGk9Yi5iaW5kKHRoaXMuX29uSW5wdXQsdGhpcyksdGhpcy4kaGludD1hKGMuaGludCksdGhpcy4kaW5wdXQ9YShjLmlucHV0KS5vbigiYmx1ci50dCIsZSkub24oImZvY3VzLnR0IixmKS5vbigia2V5ZG93bi50dCIsZyksMD09PXRoaXMuJGhpbnQubGVuZ3RoJiYodGhpcy5zZXRIaW50PXRoaXMuZ2V0SGludD10aGlzLmNsZWFySGludD10aGlzLmNsZWFySGludElmSW52YWxpZD1iLm5vb3ApLGIuaXNNc2llKCk/dGhpcy4kaW5wdXQub24oImtleWRvd24udHQga2V5cHJlc3MudHQgY3V0LnR0IHBhc3RlLnR0IixmdW5jdGlvbihhKXtoW2Eud2hpY2h8fGEua2V5Q29kZV18fGIuZGVmZXIoYi5iaW5kKGouX29uSW5wdXQsaixhKSl9KTp0aGlzLiRpbnB1dC5vbigiaW5wdXQudHQiLGkpLHRoaXMucXVlcnk9dGhpcy4kaW5wdXQudmFsKCksdGhpcy4kb3ZlcmZsb3dIZWxwZXI9ZCh0aGlzLiRpbnB1dCl9ZnVuY3Rpb24gZChiKXtyZXR1cm4gYSgnPHByZSBhcmlhLWhpZGRlbj0idHJ1ZSI+PC9wcmU+JykuY3NzKHtwb3NpdGlvbjoiYWJzb2x1dGUiLHZpc2liaWxpdHk6ImhpZGRlbiIsd2hpdGVTcGFjZToicHJlIixmb250RmFtaWx5OmIuY3NzKCJmb250LWZhbWlseSIpLGZvbnRTaXplOmIuY3NzKCJmb250LXNpemUiKSxmb250U3R5bGU6Yi5jc3MoImZvbnQtc3R5bGUiKSxmb250VmFyaWFudDpiLmNzcygiZm9udC12YXJpYW50IiksZm9udFdlaWdodDpiLmNzcygiZm9udC13ZWlnaHQiKSx3b3JkU3BhY2luZzpiLmNzcygid29yZC1zcGFjaW5nIiksbGV0dGVyU3BhY2luZzpiLmNzcygibGV0dGVyLXNwYWNpbmciKSx0ZXh0SW5kZW50OmIuY3NzKCJ0ZXh0LWluZGVudCIpLHRleHRSZW5kZXJpbmc6Yi5jc3MoInRleHQtcmVuZGVyaW5nIiksdGV4dFRyYW5zZm9ybTpiLmNzcygidGV4dC10cmFuc2Zvcm0iKX0pLmluc2VydEFmdGVyKGIpfWZ1bmN0aW9uIGUoYSxiKXtyZXR1cm4gYy5ub3JtYWxpemVRdWVyeShhKT09PWMubm9ybWFsaXplUXVlcnkoYil9ZnVuY3Rpb24gZyhhKXtyZXR1cm4gYS5hbHRLZXl8fGEuY3RybEtleXx8YS5tZXRhS2V5fHxhLnNoaWZ0S2V5fXZhciBoO3JldHVybiBoPXs5OiJ0YWIiLDI3OiJlc2MiLDM3OiJsZWZ0IiwzOToicmlnaHQiLDEzOiJlbnRlciIsMzg6InVwIiw0MDoiZG93biJ9LGMubm9ybWFsaXplUXVlcnk9ZnVuY3Rpb24oYSl7cmV0dXJuKGF8fCIiKS5yZXBsYWNlKC9eXHMqL2csIiIpLnJlcGxhY2UoL1xzezIsfS9nLCIgIil9LGIubWl4aW4oYy5wcm90b3R5cGUsZix7X29uQmx1cjpmdW5jdGlvbigpe3RoaXMucmVzZXRJbnB1dFZhbHVlKCksdGhpcy50cmlnZ2VyKCJibHVycmVkIil9LF9vbkZvY3VzOmZ1bmN0aW9uKCl7dGhpcy50cmlnZ2VyKCJmb2N1c2VkIil9LF9vbktleWRvd246ZnVuY3Rpb24oYSl7dmFyIGI9aFthLndoaWNofHxhLmtleUNvZGVdO3RoaXMuX21hbmFnZVByZXZlbnREZWZhdWx0KGIsYSksYiYmdGhpcy5fc2hvdWxkVHJpZ2dlcihiLGEpJiZ0aGlzLnRyaWdnZXIoYisiS2V5ZWQiLGEpfSxfb25JbnB1dDpmdW5jdGlvbigpe3RoaXMuX2NoZWNrSW5wdXRWYWx1ZSgpfSxfbWFuYWdlUHJldmVudERlZmF1bHQ6ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGU7c3dpdGNoKGEpe2Nhc2UidGFiIjpkPXRoaXMuZ2V0SGludCgpLGU9dGhpcy5nZXRJbnB1dFZhbHVlKCksYz1kJiZkIT09ZSYmIWcoYik7YnJlYWs7Y2FzZSJ1cCI6Y2FzZSJkb3duIjpjPSFnKGIpO2JyZWFrO2RlZmF1bHQ6Yz0hMX1jJiZiLnByZXZlbnREZWZhdWx0KCl9LF9zaG91bGRUcmlnZ2VyOmZ1bmN0aW9uKGEsYil7dmFyIGM7c3dpdGNoKGEpe2Nhc2UidGFiIjpjPSFnKGIpO2JyZWFrO2RlZmF1bHQ6Yz0hMH1yZXR1cm4gY30sX2NoZWNrSW5wdXRWYWx1ZTpmdW5jdGlvbigpe3ZhciBhLGIsYzthPXRoaXMuZ2V0SW5wdXRWYWx1ZSgpLGI9ZShhLHRoaXMucXVlcnkpLGM9Yj90aGlzLnF1ZXJ5Lmxlbmd0aCE9PWEubGVuZ3RoOiExLHRoaXMucXVlcnk9YSxiP2MmJnRoaXMudHJpZ2dlcigid2hpdGVzcGFjZUNoYW5nZWQiLHRoaXMucXVlcnkpOnRoaXMudHJpZ2dlcigicXVlcnlDaGFuZ2VkIix0aGlzLnF1ZXJ5KX0sZm9jdXM6ZnVuY3Rpb24oKXt0aGlzLiRpbnB1dC5mb2N1cygpfSxibHVyOmZ1bmN0aW9uKCl7dGhpcy4kaW5wdXQuYmx1cigpfSxnZXRRdWVyeTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnF1ZXJ5fSxzZXRRdWVyeTpmdW5jdGlvbihhKXt0aGlzLnF1ZXJ5PWF9LGdldElucHV0VmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kaW5wdXQudmFsKCl9LHNldElucHV0VmFsdWU6ZnVuY3Rpb24oYSxiKXt0aGlzLiRpbnB1dC52YWwoYSksYj90aGlzLmNsZWFySGludCgpOnRoaXMuX2NoZWNrSW5wdXRWYWx1ZSgpfSxyZXNldElucHV0VmFsdWU6ZnVuY3Rpb24oKXt0aGlzLnNldElucHV0VmFsdWUodGhpcy5xdWVyeSwhMCl9LGdldEhpbnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kaGludC52YWwoKX0sc2V0SGludDpmdW5jdGlvbihhKXt0aGlzLiRoaW50LnZhbChhKX0sY2xlYXJIaW50OmZ1bmN0aW9uKCl7dGhpcy5zZXRIaW50KCIiKX0sY2xlYXJIaW50SWZJbnZhbGlkOmZ1bmN0aW9uKCl7dmFyIGEsYixjLGQ7YT10aGlzLmdldElucHV0VmFsdWUoKSxiPXRoaXMuZ2V0SGludCgpLGM9YSE9PWImJjA9PT1iLmluZGV4T2YoYSksZD0iIiE9PWEmJmMmJiF0aGlzLmhhc092ZXJmbG93KCksIWQmJnRoaXMuY2xlYXJIaW50KCl9LGdldExhbmd1YWdlRGlyZWN0aW9uOmZ1bmN0aW9uKCl7cmV0dXJuKHRoaXMuJGlucHV0LmNzcygiZGlyZWN0aW9uIil8fCJsdHIiKS50b0xvd2VyQ2FzZSgpfSxoYXNPdmVyZmxvdzpmdW5jdGlvbigpe3ZhciBhPXRoaXMuJGlucHV0LndpZHRoKCktMjtyZXR1cm4gdGhpcy4kb3ZlcmZsb3dIZWxwZXIudGV4dCh0aGlzLmdldElucHV0VmFsdWUoKSksdGhpcy4kb3ZlcmZsb3dIZWxwZXIud2lkdGgoKT49YX0saXNDdXJzb3JBdEVuZDpmdW5jdGlvbigpe3ZhciBhLGMsZDtyZXR1cm4gYT10aGlzLiRpbnB1dC52YWwoKS5sZW5ndGgsYz10aGlzLiRpbnB1dFswXS5zZWxlY3Rpb25TdGFydCxiLmlzTnVtYmVyKGMpP2M9PT1hOmRvY3VtZW50LnNlbGVjdGlvbj8oZD1kb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKSxkLm1vdmVTdGFydCgiY2hhcmFjdGVyIiwtYSksYT09PWQudGV4dC5sZW5ndGgpOiEwfSxkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy4kaGludC5vZmYoIi50dCIpLHRoaXMuJGlucHV0Lm9mZigiLnR0IiksdGhpcy4kaGludD10aGlzLiRpbnB1dD10aGlzLiRvdmVyZmxvd0hlbHBlcj1udWxsfX0pLGN9KCksaT1mdW5jdGlvbigpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBlKGQpe2Q9ZHx8e30sZC50ZW1wbGF0ZXM9ZC50ZW1wbGF0ZXN8fHt9LGQuc291cmNlfHxhLmVycm9yKCJtaXNzaW5nIHNvdXJjZSIpLGQubmFtZSYmIWooZC5uYW1lKSYmYS5lcnJvcigiaW52YWxpZCBkYXRhc2V0IG5hbWU6ICIrZC5uYW1lKSx0aGlzLnF1ZXJ5PW51bGwsdGhpcy5oaWdobGlnaHQ9ISFkLmhpZ2hsaWdodCx0aGlzLm5hbWU9ZC5uYW1lfHxiLmdldFVuaXF1ZUlkKCksdGhpcy5zb3VyY2U9ZC5zb3VyY2UsdGhpcy5kaXNwbGF5Rm49aChkLmRpc3BsYXl8fGQuZGlzcGxheUtleSksdGhpcy50ZW1wbGF0ZXM9aShkLnRlbXBsYXRlcyx0aGlzLmRpc3BsYXlGbiksdGhpcy4kZWw9YShjLmRhdGFzZXQucmVwbGFjZSgiJUNMQVNTJSIsdGhpcy5uYW1lKSl9ZnVuY3Rpb24gaChhKXtmdW5jdGlvbiBjKGIpe3JldHVybiBiW2FdfXJldHVybiBhPWF8fCJ2YWx1ZSIsYi5pc0Z1bmN0aW9uKGEpP2E6Y31mdW5jdGlvbiBpKGEsYyl7ZnVuY3Rpb24gZChhKXtyZXR1cm4iPHA+IitjKGEpKyI8L3A+In1yZXR1cm57ZW1wdHk6YS5lbXB0eSYmYi50ZW1wbGF0aWZ5KGEuZW1wdHkpLGhlYWRlcjphLmhlYWRlciYmYi50ZW1wbGF0aWZ5KGEuaGVhZGVyKSxmb290ZXI6YS5mb290ZXImJmIudGVtcGxhdGlmeShhLmZvb3Rlciksc3VnZ2VzdGlvbjphLnN1Z2dlc3Rpb258fGR9fWZ1bmN0aW9uIGooYSl7cmV0dXJuL15bX2EtekEtWjAtOS1dKyQvLnRlc3QoYSl9dmFyIGs9InR0RGF0YXNldCIsbD0idHRWYWx1ZSIsbT0idHREYXR1bSI7cmV0dXJuIGUuZXh0cmFjdERhdGFzZXROYW1lPWZ1bmN0aW9uKGIpe3JldHVybiBhKGIpLmRhdGEoayl9LGUuZXh0cmFjdFZhbHVlPWZ1bmN0aW9uKGIpe3JldHVybiBhKGIpLmRhdGEobCl9LGUuZXh0cmFjdERhdHVtPWZ1bmN0aW9uKGIpe3JldHVybiBhKGIpLmRhdGEobSl9LGIubWl4aW4oZS5wcm90b3R5cGUsZix7X3JlbmRlcjpmdW5jdGlvbihlLGYpe2Z1bmN0aW9uIGgoKXtyZXR1cm4gcC50ZW1wbGF0ZXMuZW1wdHkoe3F1ZXJ5OmUsaXNFbXB0eTohMH0pfWZ1bmN0aW9uIGkoKXtmdW5jdGlvbiBoKGIpe3ZhciBlO3JldHVybiBlPWEoYy5zdWdnZXN0aW9uKS5hcHBlbmQocC50ZW1wbGF0ZXMuc3VnZ2VzdGlvbihiKSkuZGF0YShrLHAubmFtZSkuZGF0YShsLHAuZGlzcGxheUZuKGIpKS5kYXRhKG0sYiksZS5jaGlsZHJlbigpLmVhY2goZnVuY3Rpb24oKXthKHRoaXMpLmNzcyhkLnN1Z2dlc3Rpb25DaGlsZCl9KSxlfXZhciBpLGo7cmV0dXJuIGk9YShjLnN1Z2dlc3Rpb25zKS5jc3MoZC5zdWdnZXN0aW9ucyksaj1iLm1hcChmLGgpLGkuYXBwZW5kLmFwcGx5KGksaikscC5oaWdobGlnaHQmJmcoe2NsYXNzTmFtZToidHQtaGlnaGxpZ2h0Iixub2RlOmlbMF0scGF0dGVybjplfSksaX1mdW5jdGlvbiBqKCl7cmV0dXJuIHAudGVtcGxhdGVzLmhlYWRlcih7cXVlcnk6ZSxpc0VtcHR5OiFvfSl9ZnVuY3Rpb24gbigpe3JldHVybiBwLnRlbXBsYXRlcy5mb290ZXIoe3F1ZXJ5OmUsaXNFbXB0eTohb30pfWlmKHRoaXMuJGVsKXt2YXIgbyxwPXRoaXM7dGhpcy4kZWwuZW1wdHkoKSxvPWYmJmYubGVuZ3RoLCFvJiZ0aGlzLnRlbXBsYXRlcy5lbXB0eT90aGlzLiRlbC5odG1sKGgoKSkucHJlcGVuZChwLnRlbXBsYXRlcy5oZWFkZXI/aigpOm51bGwpLmFwcGVuZChwLnRlbXBsYXRlcy5mb290ZXI/bigpOm51bGwpOm8mJnRoaXMuJGVsLmh0bWwoaSgpKS5wcmVwZW5kKHAudGVtcGxhdGVzLmhlYWRlcj9qKCk6bnVsbCkuYXBwZW5kKHAudGVtcGxhdGVzLmZvb3Rlcj9uKCk6bnVsbCksdGhpcy50cmlnZ2VyKCJyZW5kZXJlZCIpfX0sZ2V0Um9vdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiRlbH0sdXBkYXRlOmZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYil7Yy5jYW5jZWxlZHx8YSE9PWMucXVlcnl8fGMuX3JlbmRlcihhLGIpfXZhciBjPXRoaXM7dGhpcy5xdWVyeT1hLHRoaXMuY2FuY2VsZWQ9ITEsdGhpcy5zb3VyY2UoYSxiKX0sY2FuY2VsOmZ1bmN0aW9uKCl7dGhpcy5jYW5jZWxlZD0hMH0sY2xlYXI6ZnVuY3Rpb24oKXt0aGlzLmNhbmNlbCgpLHRoaXMuJGVsLmVtcHR5KCksdGhpcy50cmlnZ2VyKCJyZW5kZXJlZCIpfSxpc0VtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGVsLmlzKCI6ZW1wdHkiKX0sZGVzdHJveTpmdW5jdGlvbigpe3RoaXMuJGVsPW51bGx9fSksZX0oKSxqPWZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGMoYyl7dmFyIGQsZixnLGg9dGhpcztjPWN8fHt9LGMubWVudXx8YS5lcnJvcigibWVudSBpcyByZXF1aXJlZCIpLHRoaXMuaXNPcGVuPSExLHRoaXMuaXNFbXB0eT0hMCx0aGlzLmRhdGFzZXRzPWIubWFwKGMuZGF0YXNldHMsZSksZD1iLmJpbmQodGhpcy5fb25TdWdnZXN0aW9uQ2xpY2ssdGhpcyksZj1iLmJpbmQodGhpcy5fb25TdWdnZXN0aW9uTW91c2VFbnRlcix0aGlzKSxnPWIuYmluZCh0aGlzLl9vblN1Z2dlc3Rpb25Nb3VzZUxlYXZlLHRoaXMpLHRoaXMuJG1lbnU9YShjLm1lbnUpLm9uKCJjbGljay50dCIsIi50dC1zdWdnZXN0aW9uIixkKS5vbigibW91c2VlbnRlci50dCIsIi50dC1zdWdnZXN0aW9uIixmKS5vbigibW91c2VsZWF2ZS50dCIsIi50dC1zdWdnZXN0aW9uIixnKSxiLmVhY2godGhpcy5kYXRhc2V0cyxmdW5jdGlvbihhKXtoLiRtZW51LmFwcGVuZChhLmdldFJvb3QoKSksYS5vblN5bmMoInJlbmRlcmVkIixoLl9vblJlbmRlcmVkLGgpfSl9ZnVuY3Rpb24gZShhKXtyZXR1cm4gbmV3IGkoYSl9cmV0dXJuIGIubWl4aW4oYy5wcm90b3R5cGUsZix7X29uU3VnZ2VzdGlvbkNsaWNrOmZ1bmN0aW9uKGIpe3RoaXMudHJpZ2dlcigic3VnZ2VzdGlvbkNsaWNrZWQiLGEoYi5jdXJyZW50VGFyZ2V0KSl9LF9vblN1Z2dlc3Rpb25Nb3VzZUVudGVyOmZ1bmN0aW9uKGIpe3RoaXMuX3JlbW92ZUN1cnNvcigpLHRoaXMuX3NldEN1cnNvcihhKGIuY3VycmVudFRhcmdldCksITApfSxfb25TdWdnZXN0aW9uTW91c2VMZWF2ZTpmdW5jdGlvbigpe3RoaXMuX3JlbW92ZUN1cnNvcigpfSxfb25SZW5kZXJlZDpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSl7cmV0dXJuIGEuaXNFbXB0eSgpfXRoaXMuaXNFbXB0eT1iLmV2ZXJ5KHRoaXMuZGF0YXNldHMsYSksdGhpcy5pc0VtcHR5P3RoaXMuX2hpZGUoKTp0aGlzLmlzT3BlbiYmdGhpcy5fc2hvdygpLHRoaXMudHJpZ2dlcigiZGF0YXNldFJlbmRlcmVkIil9LF9oaWRlOmZ1bmN0aW9uKCl7dGhpcy4kbWVudS5oaWRlKCl9LF9zaG93OmZ1bmN0aW9uKCl7dGhpcy4kbWVudS5jc3MoImRpc3BsYXkiLCJibG9jayIpfSxfZ2V0U3VnZ2VzdGlvbnM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy4kbWVudS5maW5kKCIudHQtc3VnZ2VzdGlvbiIpfSxfZ2V0Q3Vyc29yOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJG1lbnUuZmluZCgiLnR0LWN1cnNvciIpLmZpcnN0KCl9LF9zZXRDdXJzb3I6ZnVuY3Rpb24oYSxiKXthLmZpcnN0KCkuYWRkQ2xhc3MoInR0LWN1cnNvciIpLCFiJiZ0aGlzLnRyaWdnZXIoImN1cnNvck1vdmVkIil9LF9yZW1vdmVDdXJzb3I6ZnVuY3Rpb24oKXt0aGlzLl9nZXRDdXJzb3IoKS5yZW1vdmVDbGFzcygidHQtY3Vyc29yIil9LF9tb3ZlQ3Vyc29yOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlO2lmKHRoaXMuaXNPcGVuKXtpZihjPXRoaXMuX2dldEN1cnNvcigpLGI9dGhpcy5fZ2V0U3VnZ2VzdGlvbnMoKSx0aGlzLl9yZW1vdmVDdXJzb3IoKSxkPWIuaW5kZXgoYykrYSxkPShkKzEpJShiLmxlbmd0aCsxKS0xLC0xPT09ZClyZXR1cm4gdm9pZCB0aGlzLnRyaWdnZXIoImN1cnNvclJlbW92ZWQiKTstMT5kJiYoZD1iLmxlbmd0aC0xKSx0aGlzLl9zZXRDdXJzb3IoZT1iLmVxKGQpKSx0aGlzLl9lbnN1cmVWaXNpYmxlKGUpfX0sX2Vuc3VyZVZpc2libGU6ZnVuY3Rpb24oYSl7dmFyIGIsYyxkLGU7Yj1hLnBvc2l0aW9uKCkudG9wLGM9YithLm91dGVySGVpZ2h0KCEwKSxkPXRoaXMuJG1lbnUuc2Nyb2xsVG9wKCksZT10aGlzLiRtZW51LmhlaWdodCgpK3BhcnNlSW50KHRoaXMuJG1lbnUuY3NzKCJwYWRkaW5nVG9wIiksMTApK3BhcnNlSW50KHRoaXMuJG1lbnUuY3NzKCJwYWRkaW5nQm90dG9tIiksMTApLDA+Yj90aGlzLiRtZW51LnNjcm9sbFRvcChkK2IpOmM+ZSYmdGhpcy4kbWVudS5zY3JvbGxUb3AoZCsoYy1lKSl9LGNsb3NlOmZ1bmN0aW9uKCl7dGhpcy5pc09wZW4mJih0aGlzLmlzT3Blbj0hMSx0aGlzLl9yZW1vdmVDdXJzb3IoKSx0aGlzLl9oaWRlKCksdGhpcy50cmlnZ2VyKCJjbG9zZWQiKSl9LG9wZW46ZnVuY3Rpb24oKXt0aGlzLmlzT3Blbnx8KHRoaXMuaXNPcGVuPSEwLCF0aGlzLmlzRW1wdHkmJnRoaXMuX3Nob3coKSx0aGlzLnRyaWdnZXIoIm9wZW5lZCIpKX0sc2V0TGFuZ3VhZ2VEaXJlY3Rpb246ZnVuY3Rpb24oYSl7dGhpcy4kbWVudS5jc3MoImx0ciI9PT1hP2QubHRyOmQucnRsKX0sbW92ZUN1cnNvclVwOmZ1bmN0aW9uKCl7dGhpcy5fbW92ZUN1cnNvcigtMSl9LG1vdmVDdXJzb3JEb3duOmZ1bmN0aW9uKCl7dGhpcy5fbW92ZUN1cnNvcigxKX0sZ2V0RGF0dW1Gb3JTdWdnZXN0aW9uOmZ1bmN0aW9uKGEpe3ZhciBiPW51bGw7cmV0dXJuIGEubGVuZ3RoJiYoYj17cmF3OmkuZXh0cmFjdERhdHVtKGEpLHZhbHVlOmkuZXh0cmFjdFZhbHVlKGEpLGRhdGFzZXROYW1lOmkuZXh0cmFjdERhdGFzZXROYW1lKGEpfSksYn0sZ2V0RGF0dW1Gb3JDdXJzb3I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXREYXR1bUZvclN1Z2dlc3Rpb24odGhpcy5fZ2V0Q3Vyc29yKCkuZmlyc3QoKSl9LGdldERhdHVtRm9yVG9wU3VnZ2VzdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLmdldERhdHVtRm9yU3VnZ2VzdGlvbih0aGlzLl9nZXRTdWdnZXN0aW9ucygpLmZpcnN0KCkpfSx1cGRhdGU6ZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYyhiKXtiLnVwZGF0ZShhKX1iLmVhY2godGhpcy5kYXRhc2V0cyxjKX0sZW1wdHk6ZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEpe2EuY2xlYXIoKX1iLmVhY2godGhpcy5kYXRhc2V0cyxhKSx0aGlzLmlzRW1wdHk9ITB9LGlzVmlzaWJsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmlzT3BlbiYmIXRoaXMuaXNFbXB0eX0sZGVzdHJveTpmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSl7YS5kZXN0cm95KCl9dGhpcy4kbWVudS5vZmYoIi50dCIpLHRoaXMuJG1lbnU9bnVsbCxiLmVhY2godGhpcy5kYXRhc2V0cyxhKX19KSxjfSgpLGs9ZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gZihjKXt2YXIgZCxmLGk7Yz1jfHx7fSxjLmlucHV0fHxhLmVycm9yKCJtaXNzaW5nIGlucHV0IiksdGhpcy5pc0FjdGl2YXRlZD0hMSx0aGlzLmF1dG9zZWxlY3Q9ISFjLmF1dG9zZWxlY3QsdGhpcy5taW5MZW5ndGg9Yi5pc051bWJlcihjLm1pbkxlbmd0aCk/Yy5taW5MZW5ndGg6MSx0aGlzLiRub2RlPWcoYy5pbnB1dCxjLndpdGhIaW50KSxkPXRoaXMuJG5vZGUuZmluZCgiLnR0LWRyb3Bkb3duLW1lbnUiKSxmPXRoaXMuJG5vZGUuZmluZCgiLnR0LWlucHV0IiksaT10aGlzLiRub2RlLmZpbmQoIi50dC1oaW50IiksZi5vbigiYmx1ci50dCIsZnVuY3Rpb24oYSl7dmFyIGMsZSxnO2M9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudCxlPWQuaXMoYyksZz1kLmhhcyhjKS5sZW5ndGg+MCxiLmlzTXNpZSgpJiYoZXx8ZykmJihhLnByZXZlbnREZWZhdWx0KCksYS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSxiLmRlZmVyKGZ1bmN0aW9uKCl7Zi5mb2N1cygpfSkpfSksZC5vbigibW91c2Vkb3duLnR0IixmdW5jdGlvbihhKXthLnByZXZlbnREZWZhdWx0KCl9KSx0aGlzLmV2ZW50QnVzPWMuZXZlbnRCdXN8fG5ldyBlKHtlbDpmfSksdGhpcy5kcm9wZG93bj1uZXcgaih7bWVudTpkLGRhdGFzZXRzOmMuZGF0YXNldHN9KS5vblN5bmMoInN1Z2dlc3Rpb25DbGlja2VkIix0aGlzLl9vblN1Z2dlc3Rpb25DbGlja2VkLHRoaXMpLm9uU3luYygiY3Vyc29yTW92ZWQiLHRoaXMuX29uQ3Vyc29yTW92ZWQsdGhpcykub25TeW5jKCJjdXJzb3JSZW1vdmVkIix0aGlzLl9vbkN1cnNvclJlbW92ZWQsdGhpcykub25TeW5jKCJvcGVuZWQiLHRoaXMuX29uT3BlbmVkLHRoaXMpLm9uU3luYygiY2xvc2VkIix0aGlzLl9vbkNsb3NlZCx0aGlzKS5vbkFzeW5jKCJkYXRhc2V0UmVuZGVyZWQiLHRoaXMuX29uRGF0YXNldFJlbmRlcmVkLHRoaXMpLHRoaXMuaW5wdXQ9bmV3IGgoe2lucHV0OmYsaGludDppfSkub25TeW5jKCJmb2N1c2VkIix0aGlzLl9vbkZvY3VzZWQsdGhpcykub25TeW5jKCJibHVycmVkIix0aGlzLl9vbkJsdXJyZWQsdGhpcykub25TeW5jKCJlbnRlcktleWVkIix0aGlzLl9vbkVudGVyS2V5ZWQsdGhpcykub25TeW5jKCJ0YWJLZXllZCIsdGhpcy5fb25UYWJLZXllZCx0aGlzKS5vblN5bmMoImVzY0tleWVkIix0aGlzLl9vbkVzY0tleWVkLHRoaXMpLm9uU3luYygidXBLZXllZCIsdGhpcy5fb25VcEtleWVkLHRoaXMpLm9uU3luYygiZG93bktleWVkIix0aGlzLl9vbkRvd25LZXllZCx0aGlzKS5vblN5bmMoImxlZnRLZXllZCIsdGhpcy5fb25MZWZ0S2V5ZWQsdGhpcykub25TeW5jKCJyaWdodEtleWVkIix0aGlzLl9vblJpZ2h0S2V5ZWQsdGhpcykub25TeW5jKCJxdWVyeUNoYW5nZWQiLHRoaXMuX29uUXVlcnlDaGFuZ2VkLHRoaXMpLm9uU3luYygid2hpdGVzcGFjZUNoYW5nZWQiLHRoaXMuX29uV2hpdGVzcGFjZUNoYW5nZWQsdGhpcyksdGhpcy5fc2V0TGFuZ3VhZ2VEaXJlY3Rpb24oKX1mdW5jdGlvbiBnKGIsZSl7dmFyIGYsZyxoLGo7Zj1hKGIpLGc9YShjLndyYXBwZXIpLmNzcyhkLndyYXBwZXIpLGg9YShjLmRyb3Bkb3duKS5jc3MoZC5kcm9wZG93biksaj1mLmNsb25lKCkuY3NzKGQuaGludCkuY3NzKGkoZikpLGoudmFsKCIiKS5yZW1vdmVEYXRhKCkuYWRkQ2xhc3MoInR0LWhpbnQiKS5yZW1vdmVBdHRyKCJpZCBuYW1lIHBsYWNlaG9sZGVyIHJlcXVpcmVkIikucHJvcCgicmVhZG9ubHkiLCEwKS5hdHRyKHthdXRvY29tcGxldGU6Im9mZiIsc3BlbGxjaGVjazoiZmFsc2UiLHRhYmluZGV4Oi0xfSksZi5kYXRhKGwse2RpcjpmLmF0dHIoImRpciIpLGF1dG9jb21wbGV0ZTpmLmF0dHIoImF1dG9jb21wbGV0ZSIpLHNwZWxsY2hlY2s6Zi5hdHRyKCJzcGVsbGNoZWNrIiksc3R5bGU6Zi5hdHRyKCJzdHlsZSIpfSksZi5hZGRDbGFzcygidHQtaW5wdXQiKS5hdHRyKHthdXRvY29tcGxldGU6Im9mZiIsc3BlbGxjaGVjazohMX0pLmNzcyhlP2QuaW5wdXQ6ZC5pbnB1dFdpdGhOb0hpbnQpO3RyeXshZi5hdHRyKCJkaXIiKSYmZi5hdHRyKCJkaXIiLCJhdXRvIil9Y2F0Y2goayl7fXJldHVybiBmLndyYXAoZykucGFyZW50KCkucHJlcGVuZChlP2o6bnVsbCkuYXBwZW5kKGgpfWZ1bmN0aW9uIGkoYSl7cmV0dXJue2JhY2tncm91bmRBdHRhY2htZW50OmEuY3NzKCJiYWNrZ3JvdW5kLWF0dGFjaG1lbnQiKSxiYWNrZ3JvdW5kQ2xpcDphLmNzcygiYmFja2dyb3VuZC1jbGlwIiksYmFja2dyb3VuZENvbG9yOmEuY3NzKCJiYWNrZ3JvdW5kLWNvbG9yIiksYmFja2dyb3VuZEltYWdlOmEuY3NzKCJiYWNrZ3JvdW5kLWltYWdlIiksYmFja2dyb3VuZE9yaWdpbjphLmNzcygiYmFja2dyb3VuZC1vcmlnaW4iKSxiYWNrZ3JvdW5kUG9zaXRpb246YS5jc3MoImJhY2tncm91bmQtcG9zaXRpb24iKSxiYWNrZ3JvdW5kUmVwZWF0OmEuY3NzKCJiYWNrZ3JvdW5kLXJlcGVhdCIpLGJhY2tncm91bmRTaXplOmEuY3NzKCJiYWNrZ3JvdW5kLXNpemUiKX19ZnVuY3Rpb24gayhhKXt2YXIgYz1hLmZpbmQoIi50dC1pbnB1dCIpO2IuZWFjaChjLmRhdGEobCksZnVuY3Rpb24oYSxkKXtiLmlzVW5kZWZpbmVkKGEpP2MucmVtb3ZlQXR0cihkKTpjLmF0dHIoZCxhKX0pLGMuZGV0YWNoKCkucmVtb3ZlRGF0YShsKS5yZW1vdmVDbGFzcygidHQtaW5wdXQiKS5pbnNlcnRBZnRlcihhKSxhLnJlbW92ZSgpfXZhciBsPSJ0dEF0dHJzIjtyZXR1cm4gYi5taXhpbihmLnByb3RvdHlwZSx7X29uU3VnZ2VzdGlvbkNsaWNrZWQ6ZnVuY3Rpb24oYSxiKXt2YXIgYzsoYz10aGlzLmRyb3Bkb3duLmdldERhdHVtRm9yU3VnZ2VzdGlvbihiKSkmJnRoaXMuX3NlbGVjdChjKX0sX29uQ3Vyc29yTW92ZWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmRyb3Bkb3duLmdldERhdHVtRm9yQ3Vyc29yKCk7dGhpcy5pbnB1dC5zZXRJbnB1dFZhbHVlKGEudmFsdWUsITApLHRoaXMuZXZlbnRCdXMudHJpZ2dlcigiY3Vyc29yY2hhbmdlZCIsYS5yYXcsYS5kYXRhc2V0TmFtZSl9LF9vbkN1cnNvclJlbW92ZWQ6ZnVuY3Rpb24oKXt0aGlzLmlucHV0LnJlc2V0SW5wdXRWYWx1ZSgpLHRoaXMuX3VwZGF0ZUhpbnQoKX0sX29uRGF0YXNldFJlbmRlcmVkOmZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlSGludCgpfSxfb25PcGVuZWQ6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVIaW50KCksdGhpcy5ldmVudEJ1cy50cmlnZ2VyKCJvcGVuZWQiKX0sX29uQ2xvc2VkOmZ1bmN0aW9uKCl7dGhpcy5pbnB1dC5jbGVhckhpbnQoKSx0aGlzLmV2ZW50QnVzLnRyaWdnZXIoImNsb3NlZCIpfSxfb25Gb2N1c2VkOmZ1bmN0aW9uKCl7dGhpcy5pc0FjdGl2YXRlZD0hMCx0aGlzLmRyb3Bkb3duLm9wZW4oKX0sX29uQmx1cnJlZDpmdW5jdGlvbigpe3RoaXMuaXNBY3RpdmF0ZWQ9ITEsdGhpcy5kcm9wZG93bi5lbXB0eSgpLHRoaXMuZHJvcGRvd24uY2xvc2UoKX0sX29uRW50ZXJLZXllZDpmdW5jdGlvbihhLGIpe3ZhciBjLGQ7Yz10aGlzLmRyb3Bkb3duLmdldERhdHVtRm9yQ3Vyc29yKCksZD10aGlzLmRyb3Bkb3duLmdldERhdHVtRm9yVG9wU3VnZ2VzdGlvbigpLGM/KHRoaXMuX3NlbGVjdChjKSxiLnByZXZlbnREZWZhdWx0KCkpOnRoaXMuYXV0b3NlbGVjdCYmZCYmKHRoaXMuX3NlbGVjdChkKSxiLnByZXZlbnREZWZhdWx0KCkpfSxfb25UYWJLZXllZDpmdW5jdGlvbihhLGIpe3ZhciBjOyhjPXRoaXMuZHJvcGRvd24uZ2V0RGF0dW1Gb3JDdXJzb3IoKSk/KHRoaXMuX3NlbGVjdChjKSxiLnByZXZlbnREZWZhdWx0KCkpOnRoaXMuX2F1dG9jb21wbGV0ZSghMCl9LF9vbkVzY0tleWVkOmZ1bmN0aW9uKCl7dGhpcy5kcm9wZG93bi5jbG9zZSgpLHRoaXMuaW5wdXQucmVzZXRJbnB1dFZhbHVlKCl9LF9vblVwS2V5ZWQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLmlucHV0LmdldFF1ZXJ5KCk7dGhpcy5kcm9wZG93bi5pc0VtcHR5JiZhLmxlbmd0aD49dGhpcy5taW5MZW5ndGg/dGhpcy5kcm9wZG93bi51cGRhdGUoYSk6dGhpcy5kcm9wZG93bi5tb3ZlQ3Vyc29yVXAoKSx0aGlzLmRyb3Bkb3duLm9wZW4oKX0sX29uRG93bktleWVkOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5pbnB1dC5nZXRRdWVyeSgpO3RoaXMuZHJvcGRvd24uaXNFbXB0eSYmYS5sZW5ndGg+PXRoaXMubWluTGVuZ3RoP3RoaXMuZHJvcGRvd24udXBkYXRlKGEpOnRoaXMuZHJvcGRvd24ubW92ZUN1cnNvckRvd24oKSx0aGlzLmRyb3Bkb3duLm9wZW4oKX0sX29uTGVmdEtleWVkOmZ1bmN0aW9uKCl7InJ0bCI9PT10aGlzLmRpciYmdGhpcy5fYXV0b2NvbXBsZXRlKCl9LF9vblJpZ2h0S2V5ZWQ6ZnVuY3Rpb24oKXsibHRyIj09PXRoaXMuZGlyJiZ0aGlzLl9hdXRvY29tcGxldGUoKX0sX29uUXVlcnlDaGFuZ2VkOmZ1bmN0aW9uKGEsYil7dGhpcy5pbnB1dC5jbGVhckhpbnRJZkludmFsaWQoKSxiLmxlbmd0aD49dGhpcy5taW5MZW5ndGg/dGhpcy5kcm9wZG93bi51cGRhdGUoYik6dGhpcy5kcm9wZG93bi5lbXB0eSgpLHRoaXMuZHJvcGRvd24ub3BlbigpLHRoaXMuX3NldExhbmd1YWdlRGlyZWN0aW9uKCl9LF9vbldoaXRlc3BhY2VDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlSGludCgpLHRoaXMuZHJvcGRvd24ub3BlbigpfSxfc2V0TGFuZ3VhZ2VEaXJlY3Rpb246ZnVuY3Rpb24oKXt2YXIgYTt0aGlzLmRpciE9PShhPXRoaXMuaW5wdXQuZ2V0TGFuZ3VhZ2VEaXJlY3Rpb24oKSkmJih0aGlzLmRpcj1hLHRoaXMuJG5vZGUuY3NzKCJkaXJlY3Rpb24iLGEpLHRoaXMuZHJvcGRvd24uc2V0TGFuZ3VhZ2VEaXJlY3Rpb24oYSkpfSxfdXBkYXRlSGludDpmdW5jdGlvbigpe3ZhciBhLGMsZCxlLGYsZzthPXRoaXMuZHJvcGRvd24uZ2V0RGF0dW1Gb3JUb3BTdWdnZXN0aW9uKCksYSYmdGhpcy5kcm9wZG93bi5pc1Zpc2libGUoKSYmIXRoaXMuaW5wdXQuaGFzT3ZlcmZsb3coKT8oYz10aGlzLmlucHV0LmdldElucHV0VmFsdWUoKSxkPWgubm9ybWFsaXplUXVlcnkoYyksZT1iLmVzY2FwZVJlZ0V4Q2hhcnMoZCksZj1uZXcgUmVnRXhwKCJeKD86IitlKyIpKC4rJCkiLCJpIiksZz1mLmV4ZWMoYS52YWx1ZSksZz90aGlzLmlucHV0LnNldEhpbnQoYytnWzFdKTp0aGlzLmlucHV0LmNsZWFySGludCgpKTp0aGlzLmlucHV0LmNsZWFySGludCgpfSxfYXV0b2NvbXBsZXRlOmZ1bmN0aW9uKGEpe3ZhciBiLGMsZCxlO2I9dGhpcy5pbnB1dC5nZXRIaW50KCksYz10aGlzLmlucHV0LmdldFF1ZXJ5KCksZD1hfHx0aGlzLmlucHV0LmlzQ3Vyc29yQXRFbmQoKSxiJiZjIT09YiYmZCYmKGU9dGhpcy5kcm9wZG93bi5nZXREYXR1bUZvclRvcFN1Z2dlc3Rpb24oKSxlJiZ0aGlzLmlucHV0LnNldElucHV0VmFsdWUoZS52YWx1ZSksdGhpcy5ldmVudEJ1cy50cmlnZ2VyKCJhdXRvY29tcGxldGVkIixlLnJhdyxlLmRhdGFzZXROYW1lKSl9LF9zZWxlY3Q6ZnVuY3Rpb24oYSl7dGhpcy5pbnB1dC5zZXRRdWVyeShhLnZhbHVlKSx0aGlzLmlucHV0LnNldElucHV0VmFsdWUoYS52YWx1ZSwhMCksdGhpcy5fc2V0TGFuZ3VhZ2VEaXJlY3Rpb24oKSx0aGlzLmV2ZW50QnVzLnRyaWdnZXIoInNlbGVjdGVkIixhLnJhdyxhLmRhdGFzZXROYW1lKSx0aGlzLmRyb3Bkb3duLmNsb3NlKCksYi5kZWZlcihiLmJpbmQodGhpcy5kcm9wZG93bi5lbXB0eSx0aGlzLmRyb3Bkb3duKSl9LG9wZW46ZnVuY3Rpb24oKXt0aGlzLmRyb3Bkb3duLm9wZW4oKX0sY2xvc2U6ZnVuY3Rpb24oKXt0aGlzLmRyb3Bkb3duLmNsb3NlKCl9LHNldFZhbDpmdW5jdGlvbihhKXthPWIudG9TdHIoYSksdGhpcy5pc0FjdGl2YXRlZD90aGlzLmlucHV0LnNldElucHV0VmFsdWUoYSk6KHRoaXMuaW5wdXQuc2V0UXVlcnkoYSksdGhpcy5pbnB1dC5zZXRJbnB1dFZhbHVlKGEsITApKSx0aGlzLl9zZXRMYW5ndWFnZURpcmVjdGlvbigpfSxnZXRWYWw6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbnB1dC5nZXRRdWVyeSgpfSxkZXN0cm95OmZ1bmN0aW9uKCl7dGhpcy5pbnB1dC5kZXN0cm95KCksdGhpcy5kcm9wZG93bi5kZXN0cm95KCksayh0aGlzLiRub2RlKSx0aGlzLiRub2RlPW51bGx9fSksZn0oKTshZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7dmFyIGMsZCxmO2M9YS5mbi50eXBlYWhlYWQsZD0idHRUeXBlYWhlYWQiLGY9e2luaXRpYWxpemU6ZnVuY3Rpb24oYyxmKXtmdW5jdGlvbiBnKCl7dmFyIGcsaCxpPWEodGhpcyk7Yi5lYWNoKGYsZnVuY3Rpb24oYSl7YS5oaWdobGlnaHQ9ISFjLmhpZ2hsaWdodH0pLGg9bmV3IGsoe2lucHV0OmksZXZlbnRCdXM6Zz1uZXcgZSh7ZWw6aX0pLHdpdGhIaW50OmIuaXNVbmRlZmluZWQoYy5oaW50KT8hMDohIWMuaGludCxtaW5MZW5ndGg6Yy5taW5MZW5ndGgsYXV0b3NlbGVjdDpjLmF1dG9zZWxlY3QsZGF0YXNldHM6Zn0pLGkuZGF0YShkLGgpfXJldHVybiBmPWIuaXNBcnJheShmKT9mOltdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpLGM9Y3x8e30sdGhpcy5lYWNoKGcpfSxvcGVuOmZ1bmN0aW9uKCl7ZnVuY3Rpb24gYigpe3ZhciBiLGM9YSh0aGlzKTsoYj1jLmRhdGEoZCkpJiZiLm9wZW4oKX1yZXR1cm4gdGhpcy5lYWNoKGIpfSxjbG9zZTpmdW5jdGlvbigpe2Z1bmN0aW9uIGIoKXt2YXIgYixjPWEodGhpcyk7KGI9Yy5kYXRhKGQpKSYmYi5jbG9zZSgpfXJldHVybiB0aGlzLmVhY2goYil9LHZhbDpmdW5jdGlvbihiKXtmdW5jdGlvbiBjKCl7dmFyIGMsZT1hKHRoaXMpOyhjPWUuZGF0YShkKSkmJmMuc2V0VmFsKGIpfWZ1bmN0aW9uIGUoYSl7dmFyIGIsYztyZXR1cm4oYj1hLmRhdGEoZCkpJiYoYz1iLmdldFZhbCgpKSxjfXJldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaChjKTplKHRoaXMuZmlyc3QoKSl9LGRlc3Ryb3k6ZnVuY3Rpb24oKXtmdW5jdGlvbiBiKCl7dmFyIGIsYz1hKHRoaXMpOyhiPWMuZGF0YShkKSkmJihiLmRlc3Ryb3koKSxjLnJlbW92ZURhdGEoZCkpfXJldHVybiB0aGlzLmVhY2goYil9fSxhLmZuLnR5cGVhaGVhZD1mdW5jdGlvbihiKXt2YXIgYztyZXR1cm4gZltiXSYmImluaXRpYWxpemUiIT09Yj8oYz10aGlzLmZpbHRlcihmdW5jdGlvbigpe3JldHVybiEhYSh0aGlzKS5kYXRhKGQpfSksZltiXS5hcHBseShjLFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpKSk6Zi5pbml0aWFsaXplLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sYS5mbi50eXBlYWhlYWQubm9Db25mbGljdD1mdW5jdGlvbigpe3JldHVybiBhLmZuLnR5cGVhaGVhZD1jLHRoaXN9fSgpfSh3aW5kb3cualF1ZXJ5KTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy91aS9wdWJsaWMvanMvdmlzdWFsaXphdGlvbi5qcyBiL3N0b3JtLWNvcmUvc3JjL3VpL3B1YmxpYy9qcy92aXN1YWxpemF0aW9uLmpzCmluZGV4IDFlMWM0ZDYuLjlhYWIwODcgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL3VpL3B1YmxpYy9qcy92aXN1YWxpemF0aW9uLmpzCisrKyBiL3N0b3JtLWNvcmUvc3JjL3VpL3B1YmxpYy9qcy92aXN1YWxpemF0aW9uLmpzCkBAIC0zNzUsNDUgKzM3NSw2NyBAQAogICAgIH0pOwogfQogCitmdW5jdGlvbiBqc0Vycm9yKG90aGVyKSB7CisgIHRyeSB7CisgICAgb3RoZXIoKTsKKyAgfSBjYXRjaCAoZXJyKSB7CisgICAgJC5nZXQoIi90ZW1wbGF0ZXMvanNvbi1lcnJvci10ZW1wbGF0ZS5odG1sIiwgZnVuY3Rpb24odGVtcGxhdGUpIHsKKyAgICAgICQoIiNqc29uLXJlc3BvbnNlLWVycm9yIikuYXBwZW5kKE11c3RhY2hlLnJlbmRlcigkKHRlbXBsYXRlKS5maWx0ZXIoIiNqc29uLWVycm9yLXRlbXBsYXRlIikuaHRtbCgpLHtlcnJvcjogIkpTIEVycm9yIiwgZXJyb3JNZXNzYWdlOiBlcnJ9KSk7CisgICAgfSk7CisgIH0KK30KKwogdmFyIHNob3VsZF91cGRhdGU7CiBmdW5jdGlvbiBzaG93X3Zpc3VhbGl6YXRpb24oc3lzKSB7CisgICAgJC5nZXRKU09OKCIvYXBpL3YxL3RvcG9sb2d5LyIrJC51cmwoIj9pZCIpKyIvdmlzdWFsaXphdGlvbi1pbml0IixmdW5jdGlvbihyZXNwb25zZSxzdGF0dXMsanFYSFIpIHsKKyAgICAgICAgJC5nZXQoIi90ZW1wbGF0ZXMvdG9wb2xvZ3ktcGFnZS10ZW1wbGF0ZS5odG1sIiwgZnVuY3Rpb24odGVtcGxhdGUpIHsKKyAgICAgICAgICAgIGpzRXJyb3IoZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgdmFyIHRvcG9sb2d5VmlzdWFsaXphdGlvbiA9ICQoIiN2aXN1YWxpemF0aW9uLWNvbnRhaW5lciIpOworICAgICAgICAgICAgICAgIHRvcG9sb2d5VmlzdWFsaXphdGlvbi5hcHBlbmQoCisgICAgICAgICAgICAgICAgICAgIE11c3RhY2hlLnJlbmRlcigkKHRlbXBsYXRlKQorICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigiI3RvcG9sb2d5LXZpc3VhbGl6YXRpb24tY29udGFpbmVyLXRlbXBsYXRlIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5odG1sKCksCisgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSkpOworICAgICAgICAgICAgICAgIH0pOwogCi0gICAgaWYoc3lzID09IG51bGwpCi0gICAgewotICAgICAgICBzeXMgPSBhcmJvci5QYXJ0aWNsZVN5c3RlbSgyMCwgMTAwMCwgMC4xNSwgdHJ1ZSwgNTUsIDAuMDIsIDAuNik7Ci0gICAgICAgIHN5cy5yZW5kZXJlciA9IHJlbmRlckdyYXBoKCIjdG9wb0dyYXBoIik7Ci0gICAgICAgIHN5cy5zdG9wKCk7CisgICAgICAgICAgICBpZihzeXMgPT0gbnVsbCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzeXMgPSBhcmJvci5QYXJ0aWNsZVN5c3RlbSgyMCwgMTAwMCwgMC4xNSwgdHJ1ZSwgNTUsIDAuMDIsIDAuNik7CisgICAgICAgICAgICAgICAgc3lzLnJlbmRlcmVyID0gcmVuZGVyR3JhcGgoIiN0b3BvR3JhcGgiKTsKKyAgICAgICAgICAgICAgICBzeXMuc3RvcCgpOwogCi0gICAgICAgICQoIi5zdHJlYW0tYm94IikuY2xpY2soZnVuY3Rpb24gKCkgeyByZWNob29zZSh0b3BvbG9neV9kYXRhLCBzeXMsIHRoaXMpIH0pOyAgICAKLSAgICB9Ci0KLSAgICBzaG91bGRfdXBkYXRlID0gdHJ1ZTsKLSAgICB2YXIgdXBkYXRlX2ZyZXFfbXMgPSAxMDAwMDsKLSAgICB2YXIgdXBkYXRlID0gZnVuY3Rpb24oc2hvdWxkX3JlY2hvb3NlKSB7Ci0gICAgICBpZihzaG91bGRfdXBkYXRlKSB7Ci0gICAgICAgICQuYWpheCh7Ci0gICAgICAgICAgICB1cmw6ICIvYXBpL3YxL3RvcG9sb2d5LyIrJC51cmwoIj9pZCIpKyIvdmlzdWFsaXphdGlvbiIsCi0gICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAoZGF0YSwgc3RhdHVzLCBqcVhIUikgewotICAgICAgICAgICAgICAgIHRvcG9sb2d5X2RhdGEgPSBkYXRhOwotICAgICAgICAgICAgICAgIHVwZGF0ZV9kYXRhKHRvcG9sb2d5X2RhdGEsIHN5cyk7Ci0gICAgICAgICAgICAgICAgc3lzLnJlbmRlcmVyLnNpZ25hbF91cGRhdGUoKTsKLSAgICAgICAgICAgICAgICBzeXMucmVuZGVyZXIucmVkcmF3KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHNob3VsZF91cGRhdGUpCi0gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQodXBkYXRlLCB1cGRhdGVfZnJlcV9tcyk7Ci0gICAgICAgICAgICAgICAgaWYgKHNob3VsZF9yZWNob29zZSkKLSAgICAgICAgICAgICAgICAgICAgJCgiLnN0cmVhbS1ib3giKS5lYWNoKGZ1bmN0aW9uICgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlY2hvb3NlKHRvcG9sb2d5X2RhdGEsIHN5cywgdGhpcykKLSAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgJCgiLnN0cmVhbS1ib3giKS5jbGljayhmdW5jdGlvbiAoKSB7IHJlY2hvb3NlKHRvcG9sb2d5X2RhdGEsIHN5cywgdGhpcykgfSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgfQotICAgIH07Ci0gICAgCi0gICAgdXBkYXRlKHRydWUpOwotICAgICQoIiN2aXN1YWxpemF0aW9uLWNvbnRhaW5lciIpLnNob3coNTAwKTsKLSAgICAkKCIjc2hvdy1oaWRlLXZpc3VhbGl6YXRpb24iKS5hdHRyKCd2YWx1ZScsICdIaWRlIFZpc3VhbGl6YXRpb24nKTsKLSAgICAkKCIjc2hvdy1oaWRlLXZpc3VhbGl6YXRpb24iKS51bmJpbmQoImNsaWNrIik7Ci0gICAgJCgiI3Nob3ctaGlkZS12aXN1YWxpemF0aW9uIikuY2xpY2soZnVuY3Rpb24gKCkgeyBoaWRlX3Zpc3VhbGl6YXRpb24oc3lzKSB9KTsKKworICAgICAgICAgICAgc2hvdWxkX3VwZGF0ZSA9IHRydWU7CisgICAgICAgICAgICB2YXIgdXBkYXRlX2ZyZXFfbXMgPSAxMDAwMDsKKyAgICAgICAgICAgIHZhciB1cGRhdGUgPSBmdW5jdGlvbihzaG91bGRfcmVjaG9vc2UpeworICAgICAgICAgICAgICBpZihzaG91bGRfdXBkYXRlKSB7CisgICAgICAgICAgICAgICAgJC5hamF4KHsKKyAgICAgICAgICAgICAgICAgICAgdXJsOiAiL2FwaS92MS90b3BvbG9neS8iKyQudXJsKCI/aWQiKSsiL3Zpc3VhbGl6YXRpb24iLAorICAgICAgICAgICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbihkYXRhLCBzdGF0dXMsIGpxWEhSKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0b3BvbG9neV9kYXRhID0gZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZV9kYXRhKHRvcG9sb2d5X2RhdGEsIHN5cyk7CisgICAgICAgICAgICAgICAgICAgICAgICBzeXMucmVuZGVyZXIuc2lnbmFsX3VwZGF0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgc3lzLnJlbmRlcmVyLnJlZHJhdygpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoc2hvdWxkX3VwZGF0ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KHVwZGF0ZSwgdXBkYXRlX2ZyZXFfbXMpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoc2hvdWxkX3JlY2hvb3NlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoIi5zdHJlYW0tYm94IikuZWFjaChmdW5jdGlvbiAoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2hvb3NlKHRvcG9sb2d5X2RhdGEsIHN5cywgdGhpcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICB1cGRhdGUodHJ1ZSk7CisgICAgICAgICAgICAkKCIjdmlzdWFsaXphdGlvbi1jb250YWluZXIiKS5zaG93KDUwMCk7CisgICAgICAgICAgICAkKCIjc2hvdy1oaWRlLXZpc3VhbGl6YXRpb24iKS5hdHRyKCd2YWx1ZScsICdIaWRlIFZpc3VhbGl6YXRpb24nKTsKKyAgICAgICAgICAgICQoIiNzaG93LWhpZGUtdmlzdWFsaXphdGlvbiIpLnVuYmluZCgiY2xpY2siKTsKKyAgICAgICAgICAgICQoIiNzaG93LWhpZGUtdmlzdWFsaXphdGlvbiIpLmNsaWNrKGZ1bmN0aW9uICgpIHsgaGlkZV92aXN1YWxpemF0aW9uKHN5cykgfSk7CisgICAgICAgIH0pCisgICAgfSk7CiB9CiAKIGZ1bmN0aW9uIGhpZGVfdmlzdWFsaXphdGlvbihzeXMpIHsKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL3VpL3B1YmxpYy9sb2d2aWV3ZXJfc2VhcmNoLmh0bWwgYi9zdG9ybS1jb3JlL3NyYy91aS9wdWJsaWMvbG9ndmlld2VyX3NlYXJjaC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MGYzZmIKLS0tIC9kZXYvbnVsbAorKysgYi9zdG9ybS1jb3JlL3NyYy91aS9wdWJsaWMvbG9ndmlld2VyX3NlYXJjaC5odG1sCkBAIC0wLDAgKzEsNjUgQEAKKzxodG1sPjxoZWFkPgorICAgIDwhLS0KKyAgICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgICAgLS0+Cis8bWV0YSBjaGFyc2V0PSJVVEYtOCI+Cis8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPgorPHRpdGxlPlN0b3JtIFVJPC90aXRsZT4KKzxsaW5rIGhyZWY9Ii9jc3MvYm9vdHN0cmFwLTMuMy4xLm1pbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPgorPGxpbmsgaHJlZj0iL2Nzcy9qcXVlcnkuZGF0YVRhYmxlcy4xLjEwLjQubWluLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+Cis8bGluayBocmVmPSIvY3NzL2RhdGFUYWJsZXMuYm9vdHN0cmFwLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+Cis8bGluayBocmVmPSIvY3NzL3N0eWxlLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+Cis8c2NyaXB0IHNyYz0iL2pzL2pxdWVyeS0xLjExLjEubWluLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9Ii9qcy9qcXVlcnkuZGF0YVRhYmxlcy4xLjEwLjQubWluLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9Ii9qcy9qcXVlcnkuY29va2llcy4yLjIuMC5taW4uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0iL2pzL2pxdWVyeS5tdXN0YWNoZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSIvanMvYm9vdHN0cmFwLTMuMy4xLm1pbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSIvanMvanF1ZXJ5LmJsb2NrVUkubWluLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9Ii9qcy91cmwubWluLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9Ii9qcy9kYXRhVGFibGVzLmJvb3RzdHJhcC5taW4uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0iL2pzL3NjcmlwdC5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KKzwvaGVhZD4KKzxib2R5PgorPGRpdiBjbGFzcz0iY29udGFpbmVyLWZsdWlkIj4KKyAgPGRpdiBjbGFzcz0icm93Ij4KKyAgICA8ZGl2IGlkPSJzZWFyY2gtZm9ybSI+PC9kaXY+CisgIDwvZGl2PgorICA8ZGl2IGNsYXNzPSJyb3ciPgorICAgIDxkaXYgaWQ9InJlc3VsdCI+PC9kaXY+CisgIDwvZGl2PgorPC9kaXY+Cis8L2JvZHk+Cis8c2NyaXB0PgorJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7CisgICAgdmFyIGZpbGUgPSAkLnVybCgiP2ZpbGUiKTsKKyAgICB2YXIgc2VhcmNoID0gJC51cmwoIj9zZWFyY2giKTsKKyAgICB2YXIgb2Zmc2V0ID0gJC51cmwoIj9vZmZzZXQiKSB8fCAwOworICAgIGZpbGUgPSBkZWNvZGVVUklDb21wb25lbnQoZmlsZSk7CisgICAgc2VhcmNoID0gZGVjb2RlVVJJQ29tcG9uZW50KHNlYXJjaCk7CisKKyAgICAkLmdldCgiL3RlbXBsYXRlcy9sb2d2aWV3ZXItc2VhcmNoLXBhZ2UtdGVtcGxhdGUuaHRtbCIsIGZ1bmN0aW9uKHRlbXBsYXRlKSB7CisgICAgICAgICQoIiNzZWFyY2gtZm9ybSIpLmFwcGVuZChNdXN0YWNoZS5yZW5kZXIoJCh0ZW1wbGF0ZSkuZmlsdGVyKCIjc2VhcmNoLXNpbmdsZS1maWxlIikuaHRtbCgpLHtmaWxlOiBmaWxlLCBzZWFyY2g6IHNlYXJjaH0pKTsKKworICAgICAgICB2YXIgcmVzdWx0ID0gJCgiI3Jlc3VsdCIpOworICAgICAgICB2YXIgdXJsID0gIi9zZWFyY2gvIitlbmNvZGVVUklDb21wb25lbnQoZmlsZSkrIj9zZWFyY2gtc3RyaW5nPSIrc2VhcmNoKyImc3RhcnQtYnl0ZS1vZmZzZXQ9IitvZmZzZXQ7CisgICAgICAgICQuZ2V0SlNPTih1cmwsZnVuY3Rpb24ocmVzcG9uc2Usc3RhdHVzLGpxWEhSKSB7CisgICAgICAgICAgIHJlc3BvbnNlLmZpbGUgPSBmaWxlOworICAgICAgICAgICByZXN1bHQuYXBwZW5kKE11c3RhY2hlLnJlbmRlcigkKHRlbXBsYXRlKS5maWx0ZXIoIiNsb2d2aWV3ZXItc2VhcmNoLXJlc3VsdC10ZW1wbGF0ZSIpLmh0bWwoKSxyZXNwb25zZSkpOworICAgICAgIH0pOworICAgIH0pOworICB9KTsKKzwvc2NyaXB0PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvdWkvcHVibGljL3NlYXJjaF9yZXN1bHQuaHRtbCBiL3N0b3JtLWNvcmUvc3JjL3VpL3B1YmxpYy9zZWFyY2hfcmVzdWx0Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM0NGFhOQotLS0gL2Rldi9udWxsCisrKyBiL3N0b3JtLWNvcmUvc3JjL3VpL3B1YmxpYy9zZWFyY2hfcmVzdWx0Lmh0bWwKQEAgLTAsMCArMSwxMDAgQEAKKzxodG1sPjxoZWFkPgorICAgIDwhLS0KKyAgICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgICAgIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorICAgICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgICAgIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgICAgICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgICAgIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgICAgLS0+Cis8bWV0YSBjaGFyc2V0PSJVVEYtOCI+Cis8bWV0YSBuYW1lPSJ2aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPgorPHRpdGxlPlN0b3JtIFVJPC90aXRsZT4KKzxsaW5rIGhyZWY9Ii9jc3MvYm9vdHN0cmFwLTMuMy4xLm1pbi5jc3MiIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiPgorPGxpbmsgaHJlZj0iL2Nzcy9qcXVlcnkuZGF0YVRhYmxlcy4xLjEwLjQubWluLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+Cis8bGluayBocmVmPSIvY3NzL2RhdGFUYWJsZXMuYm9vdHN0cmFwLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+Cis8bGluayBocmVmPSIvY3NzL3N0eWxlLmNzcyIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+Cis8c2NyaXB0IHNyYz0iL2pzL2pxdWVyeS0xLjExLjEubWluLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9Ii9qcy9qcXVlcnkuZGF0YVRhYmxlcy4xLjEwLjQubWluLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9Ii9qcy9qcXVlcnkuY29va2llcy4yLjIuMC5taW4uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0iL2pzL2pxdWVyeS5tdXN0YWNoZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSIvanMvYm9vdHN0cmFwLTMuMy4xLm1pbi5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KKzxzY3JpcHQgc3JjPSIvanMvanF1ZXJ5LmJsb2NrVUkubWluLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9Ii9qcy91cmwubWluLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgorPHNjcmlwdCBzcmM9Ii9qcy9kYXRhVGFibGVzLmJvb3RzdHJhcC5taW4uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+PC9zY3JpcHQ+Cis8c2NyaXB0IHNyYz0iL2pzL3NjcmlwdC5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KKzwvaGVhZD4KKzxib2R5PgorPGRpdiBjbGFzcz0iY29udGFpbmVyLWZsdWlkIj4KKyAgPGRpdiBjbGFzcz0icm93Ij4KKyAgICA8ZGl2IGlkPSJzZWFyY2gtZm9ybSI+PC9kaXY+CisgIDwvZGl2PgorICA8ZGl2IGNsYXNzPSJyb3ciPgorICAgIDxkaXYgaWQ9InJlc3VsdCI+PC9kaXY+CisgIDwvZGl2PgorPC9kaXY+Cis8L2JvZHk+Cis8c2NyaXB0PgorJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24oKSB7CisgICAgdmFyIGlkID0gJC51cmwoIj9pZCIpOworICAgIHZhciBzZWFyY2ggPSAkLnVybCgiP3NlYXJjaCIpOworICAgIHZhciBjb3VudCA9ICQudXJsKCI/Y291bnQiKSB8fCAyOworICAgIHZhciBzZWFyY2hBcmNoaXZlZCA9ICQudXJsKCI/c2VhcmNoQXJjaGl2ZWQiKSB8fCAiIjsKKworICAgICQuZ2V0KCIvdGVtcGxhdGVzL3NlYXJjaC1yZXN1bHQtcGFnZS10ZW1wbGF0ZS5odG1sIiwgZnVuY3Rpb24odGVtcGxhdGUpIHsKKyAgICAgICAgJCgiI3NlYXJjaC1mb3JtIikuYXBwZW5kKE11c3RhY2hlLnJlbmRlcigkKHRlbXBsYXRlKS5maWx0ZXIoIiNzZWFyY2gtZm9ybS10ZW1wbGF0ZSIpLmh0bWwoKSx7aWQ6IGlkLCBzZWFyY2g6IHNlYXJjaCwgY291bnQ6IGNvdW50LCBzZWFyY2hBcmNoaXZlZDogc2VhcmNoQXJjaGl2ZWR9KSk7CisKKyAgICAgICAgdmFyIHJlc3VsdCA9ICQoIiNyZXN1bHQiKTsKKyAgICAgICAgJC5nZXRKU09OKCIvYXBpL3YxL3RvcG9sb2d5LXdvcmtlcnMvIitpZCwgZnVuY3Rpb24ocmVzcG9uc2Usc3RhdHVzLGpxWEhSKSB7CisgICAgICAgICAgIGZvciAodmFyIGluZGV4IGluIHJlc3BvbnNlLmhvc3RQb3J0TGlzdCkgeworICAgICAgICAgICAgIHZhciBob3N0ID0gcmVzcG9uc2UuaG9zdFBvcnRMaXN0W2luZGV4XS5ob3N0OworICAgICAgICAgICAgIHZhciBwb3J0ID0gcmVzcG9uc2UuaG9zdFBvcnRMaXN0W2luZGV4XS5wb3J0OworICAgICAgICAgICAgIHZhciBlbGVtSWQgPSAic2VhcmNoLXJlc3VsdHMtIitob3N0LnJlcGxhY2UoL1wuL2csIi0iKSsiLSIrcG9ydDsKKyAgICAgICAgICAgICByZXNwb25zZS5ob3N0UG9ydExpc3RbaW5kZXhdLmVsZW1JZCA9IGVsZW1JZDsKKyAgICAgICAgICAgfQorICAgICAgICAgICByZXN1bHQuYXBwZW5kKE11c3RhY2hlLnJlbmRlcigkKHRlbXBsYXRlKS5maWx0ZXIoIiNzZWFyY2gtcmVzdWx0LWZpbGVzLXRlbXBsYXRlIikuaHRtbCgpLHJlc3BvbnNlKSk7CisKKyAgICAgICAgICAgdmFyIGxvZ3ZpZXdlclBvcnQgPSByZXNwb25zZS5sb2d2aWV3ZXJQb3J0OworICAgICAgICAgICBmb3IgKHZhciBpbmRleCBpbiByZXNwb25zZS5ob3N0UG9ydExpc3QpIHsKKyAgICAgICAgICAgICB2YXIgaG9zdCA9IHJlc3BvbnNlLmhvc3RQb3J0TGlzdFtpbmRleF0uaG9zdDsKKyAgICAgICAgICAgICB2YXIgcG9ydCA9IHJlc3BvbnNlLmhvc3RQb3J0TGlzdFtpbmRleF0ucG9ydDsKKyAgICAgICAgICAgICB2YXIgZWxlbUlkID0gcmVzcG9uc2UuaG9zdFBvcnRMaXN0W2luZGV4XS5lbGVtSWQ7CisgICAgICAgICAgICAgdmFyIGZpbGUgPSBpZCsiLyIrcG9ydCsiL3dvcmtlci5sb2ciOworICAgICAgICAgICAgIHZhciBzZWFyY2hVUkwgPSAiaHR0cDovLyIraG9zdCsiOiIrbG9ndmlld2VyUG9ydCsiL3NlYXJjaC8iK2VuY29kZVVSSUNvbXBvbmVudChmaWxlKSsiP3NlYXJjaC1zdHJpbmc9IitzZWFyY2grIiZudW0tbWF0Y2hlcz0iK2NvdW50OworICAgICAgICAgICAgIGlmIChzZWFyY2hBcmNoaXZlZCAhPSAiIikgeworICAgICAgICAgICAgICAgc2VhcmNoVVJMID0gImh0dHA6Ly8iK2hvc3QrIjoiK2xvZ3ZpZXdlclBvcnQrIi9kZWVwU2VhcmNoLyIraWQrIj9zZWFyY2gtc3RyaW5nPSIrc2VhcmNoKyImbnVtLW1hdGNoZXM9Iitjb3VudCsiJnNlYXJjaC1hcmNoaXZlZD10cnVlJnBvcnQ9Iitwb3J0OworICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICQuYWpheCh7ZGF0YVR5cGU6ICJqc29uIiwKKyAgICAgICAgICAgICAgIHVybDogc2VhcmNoVVJMLAorICAgICAgICAgICAgICAgeGhyRmllbGRzOiB7CisgICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdHJ1ZQorICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgIHN1Y2Nlc3M6ICQucHJveHkoZnVuY3Rpb24oZGF0YSxzdGF0dXMsanFYSFIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmZpbGUgPSB0aGlzLmZpbGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5ob3N0ID0gdGhpcy5ob3N0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucG9ydCA9IHRoaXMucG9ydDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmlkID0gaWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5sb2d2aWV3ZXJQb3J0ID0gbG9ndmlld2VyUG9ydDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2VhcmNoVGVtcCA9ICQodGVtcGxhdGUpLmZpbHRlcigiI3NlYXJjaC1yZXN1bHQtaWRlbnRpZmllZC10ZW1wbGF0ZSIpLmh0bWwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VhcmNoQXJjaGl2ZWQgIT0gIiIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaFRlbXAgPSAkKHRlbXBsYXRlKS5maWx0ZXIoIiNkZWVwc2VhcmNoLXJlc3VsdC1pZGVudGlmaWVkLXRlbXBsYXRlIikuaHRtbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVuZGVyZWQgPSBNdXN0YWNoZS5yZW5kZXIoc2VhcmNoVGVtcCwgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgiIyIrdGhpcy5lbGVtSWQpLnJlcGxhY2VXaXRoKHJlbmRlcmVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LCB7aG9zdDogaG9zdCwgcG9ydDogcG9ydCwgZmlsZTogZmlsZSwgZWxlbUlkOiBlbGVtSWR9KQorICAgICAgICAgICAgIH0pOworICAgICAgICAgICB9CisgICAgICAgfSk7CisgICAgfSk7CisgIH0pOworPC9zY3JpcHQ+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy91aS9wdWJsaWMvdGVtcGxhdGVzL2NvbXBvbmVudC1wYWdlLXRlbXBsYXRlLmh0bWwgYi9zdG9ybS1jb3JlL3NyYy91aS9wdWJsaWMvdGVtcGxhdGVzL2NvbXBvbmVudC1wYWdlLXRlbXBsYXRlLmh0bWwKaW5kZXggY2NiNGQ1YS4uZjIxYjMwZCAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvdWkvcHVibGljL3RlbXBsYXRlcy9jb21wb25lbnQtcGFnZS10ZW1wbGF0ZS5odG1sCisrKyBiL3N0b3JtLWNvcmUvc3JjL3VpL3B1YmxpYy90ZW1wbGF0ZXMvY29tcG9uZW50LXBhZ2UtdGVtcGxhdGUuaHRtbApAQCAtMjI3LDYgKzIyNyw1OSBAQAogICAgIDwvdGJvZHk+CiAgIDwvdGFibGU+CiA8L3NjcmlwdD4KKzxzY3JpcHQgaWQ9InByb2ZpbGluZy10ZW1wbGF0ZSIgdHlwZT0idGV4dC9odG1sIj4KKyAgPGgyPlByb2ZpbGluZyBhbmQgRGVidWdnaW5nPC9oMj4KKyAgVXNlIHRoZSBmb2xsb3dpbmcgY29udHJvbHMgdG8gcHJvZmlsZSBhbmQgZGVidWcgdGhlIGNvbXBvbmVudHMgb24gdGhpcyBwYWdlLgorICA8dGFibGUgY2xhc3M9InRhYmxlIHRhYmxlLXN0cmlwZWQgY29tcGFjdCI+CisgICAgPHRoZWFkPgorICAgICAgPHRyPgorICAgICAgICA8dGggY2xhc3M9ImhlYWRlciI+Q29tcG9uZW50PC90aD4KKyAgICAgICAgPHRoIGNsYXNzPSJoZWFkZXIiPgorICAgICAgICAgIDxzcGFuIGRhdGEtb3JpZ2luYWwtdGl0bGU9IlRoZSBzdGF0dXMgb2YgYSBydW5uaW5nIHByb2ZpbGVyIG9yIHRoZSB0aW1lb3V0IGZvciBvbmUgeW91J3JlIHN0YXJ0aW5nIChpbiBtaW51dGVzKSIgZGF0YS10b2dnbGU9InRvb2x0aXAiPgorICAgICAgICAgICAgU3RhdHVzIC8gVGltZW91dCAoTWludXRlcykKKyAgICAgICAgICA8L3NwYW4+CisgICAgICAgIDwvdGg+CisgICAgICAgIDx0aCBjbGFzcz0iaGVhZGVyIj5BY3Rpb25zPC90aD4KKyAgICAgIDwvdHI+CisgICAgPC90aGVhZD4KKyAgICA8dGJvZHkgaWQ9InByb2ZpbGVyLXRhYmxlLWJvZHkiPgorICAgICAgPHRyPgorICAgICAgICA8dGQ+CisgICAgICAgICAgPHNlbGVjdCBpZD0ic2VsZWN0ZWRfd29ya2VyIj4KKyAgICAgICAgICAgIHt7I2hvc3RzfX0KKyAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9Int7bmFtZX19Ij57e25hbWV9fTwvb3B0aW9uPgorICAgICAgICAgICAge3svaG9zdHN9fQorICAgICAgICAgIDwvc2VsZWN0PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQ+CisgICAgICAgICAgPGlucHV0IGlkPSJ0aW1lb3V0IiBjbGFzcz0idGltZW91dF9pbnB1dCIgdHlwZT0idGV4dCIgdmFsdWU9IiIgcGxhY2Vob2xkZXI9IjEwIi8+CisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZD4KKyAgICAgICAgICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iU3RhcnQiIG5hbWU9InN0YXJ0IiBvbkNsaWNrPSJzdGFydF9wcm9maWxpbmcocHJvZmlsZXJfc2VsZWN0ZWRfd29ya2VyKCkpIiBjbGFzcz0iYnRuIGJ0bi1zZWNvbmRhcnkiLz4KKyAgICAgICAgICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iSlN0YWNrIiBuYW1lPSJqc3RhY2siIG9uQ2xpY2s9ImR1bXBfanN0YWNrKHByb2ZpbGVyX3NlbGVjdGVkX3dvcmtlcigpKSIgY2xhc3M9ImJ0biBidG4tc2Vjb25kYXJ5Ii8+CisgICAgICAgICAgPGlucHV0IHR5cGU9ImJ1dHRvbiIgdmFsdWU9IlJlc3RhcnQgV29ya2VyIiBuYW1lPSJqdm1yZXN0YXJ0IiBvbkNsaWNrPSJyZXN0YXJ0X3dvcmtlcl9qdm0ocHJvZmlsZXJfc2VsZWN0ZWRfd29ya2VyKCkpIiBjbGFzcz0iYnRuIGJ0bi1zZWNvbmRhcnkiLz4KKyAgICAgICAgICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iSGVhcCIgbmFtZT0iaGVhcCIgb25DbGljaz0iZHVtcF9oZWFwKHByb2ZpbGVyX3NlbGVjdGVkX3dvcmtlcigpKSIgY2xhc3M9ImJ0biBidG4tc2Vjb25kYXJ5Ii8+CisgICAgICAgIDwvdGQ+CisgICAgICA8L3RyPgorICAgICAge3s+IHByb2ZpbGVyQWN0aXZlfX0KKyAgICA8L3Rib2R5PgorICA8L3RhYmxlPgorPC9zY3JpcHQ+Cis8c2NyaXB0IGlkPSJwcm9maWxlci1hY3RpdmUtcGFydGlhbCIgdHlwZT0idGV4dC9odG1sIj4KKyAge3sjcHJvZmlsZXJBY3RpdmV9fQorICA8dHI+CisgICAgPHRkPnt7aG9zdH19Ont7cG9ydH19PC90ZD4KKyAgICA8dGQ+QWN0aXZlIHVudGlsIHt7dGltZXN0YW1wfX08L3RkPgorICAgIDx0ZD4KKyAgICAgIDxpbnB1dCBpZD0ic3RvcF97e2hvc3R9fTp7e3BvcnR9fSIgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iU3RvcCIgbmFtZT0ic3RvcCIgb25DbGljaz0ic3RvcF9wcm9maWxpbmcoJ3t7aG9zdH19Ont7cG9ydH19JykiIGNsYXNzPSJidG4gYnRuLXNlY29uZGFyeSIvPgorICAgICAgPGlucHV0IGlkPSJkdW1wX3Byb2ZpbGVfe3tob3N0fX06e3twb3J0fX0iIHR5cGU9ImJ1dHRvbiIgdmFsdWU9IkR1bXAgUHJvZmlsZSIgbmFtZT0iZHVtcGpwcm9maWxlIiBvbkNsaWNrPSJkdW1wX3Byb2ZpbGUoJ3t7aG9zdH19Ont7cG9ydH19JykiIGNsYXNzPSJidG4gYnRuLXNlY29uZGFyeSIvPgorICAgICAgPGlucHV0IGlkPSJkdW1wX2pzdGFja197e2hvc3R9fTp7e3BvcnR9fSIgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iSlN0YWNrIiBuYW1lPSJqc3RhY2siIG9uQ2xpY2s9ImR1bXBfanN0YWNrKCd7e2hvc3R9fTp7e3BvcnR9fScpIiBjbGFzcz0iYnRuIGJ0bi1zZWNvbmRhcnkiLz4KKyAgICAgIDxpbnB1dCBpZD0icmVzdGFydF93b3JrZXJfanZtX3t7aG9zdH19Ont7cG9ydH19IiB0eXBlPSJidXR0b24iIHZhbHVlPSJSZXN0YXJ0IFdvcmtlciIgbmFtZT0ianZtcmVzdGFydCIgb25DbGljaz0icmVzdGFydF93b3JrZXJfanZtKCd7e2hvc3R9fTp7e3BvcnR9fScpIiBjbGFzcz0iYnRuIGJ0bi1zZWNvbmRhcnkiLz4KKyAgICAgIDxpbnB1dCBpZD0iZHVtcF9oZWFwX3t7aG9zdH19Ont7cG9ydH19IiB0eXBlPSJidXR0b24iIHZhbHVlPSJIZWFwIiBuYW1lPSJoZWFwIiBvbkNsaWNrPSJkdW1wX2hlYXAoJ3t7aG9zdH19Ont7cG9ydH19JykiIGNsYXNzPSJidG4gYnRuLXNlY29uZGFyeSIvPiA8YSBocmVmPSJ7e2R1bXBsaW5rfX0iPk15IER1bXAgRmlsZXM8L2E+CisgICAgPC90ZD4KKyAgPC90cj4KKyAge3svcHJvZmlsZXJBY3RpdmV9fQorPC9zY3JpcHQ+CiA8c2NyaXB0IGlkPSJib2x0LXN0YXRzLXRlbXBsYXRlIiB0eXBlPSJ0ZXh0L2h0bWwiPgogICA8aDI+Qm9sdCBzdGF0czwvaDI+CiAgIDx0YWJsZSBjbGFzcz0idGFibGUgdGFibGUtc3RyaXBlZCBjb21wYWN0IiBpZD0iYm9sdC1zdGF0cy10YWJsZSI+CkBAIC00ODEsNyArNTM0LDcgQEAKICAgICA8dGJvZHk+CiAgICAgICB7eyNjb21wb25lbnRFcnJvcnN9fQogICAgICAgPHRyPgotICAgICAgICA8dGQ+e3t0aW1lfX08L3RkPgorICAgICAgICA8dGQ+e3tlcnJvclRpbWV9fTwvdGQ+CiAgICAgICAgIDx0ZD57e2Vycm9ySG9zdH19PC90ZD4KICAgICAgICAgPHRkPjxhIGhyZWY9Int7ZXJyb3JXb3JrZXJMb2dMaW5rfX0iPnt7ZXJyb3JQb3J0fX08L2E+PC90ZD4KICAgICAgICAgPHRkPgpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvdWkvcHVibGljL3RlbXBsYXRlcy9kZWVwLXNlYXJjaC1yZXN1bHQtcGFnZS10ZW1wbGF0ZS5odG1sIGIvc3Rvcm0tY29yZS9zcmMvdWkvcHVibGljL3RlbXBsYXRlcy9kZWVwLXNlYXJjaC1yZXN1bHQtcGFnZS10ZW1wbGF0ZS5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NThlNWMKLS0tIC9kZXYvbnVsbAorKysgYi9zdG9ybS1jb3JlL3NyYy91aS9wdWJsaWMvdGVtcGxhdGVzL2RlZXAtc2VhcmNoLXJlc3VsdC1wYWdlLXRlbXBsYXRlLmh0bWwKQEAgLTAsMCArMSw2NiBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHNjcmlwdCBpZD0ic2VhcmNoLXJlc3VsdC1maWxlcy10ZW1wbGF0ZSIgdHlwZT0idGV4dC9odG1sIj4KKzx0YWJsZSBpZD0ic2VhcmNoLXJlc3VsdC10YWJsZSIgY2xhc3M9InRhYmxlIHRhYmxlLXN0cmlwZWQgY29tcGFjdCI+CisgIDx0aGVhZD48dHI+PHRoPmhvc3Q6cG9ydDwvdGg+PHRoPk1hdGNoPC90aD48L3RyPjwvdGhlYWQ+CisgIDx0Ym9keT4KKyAgICB7eyNzdXBlcnZpc29yc319CisgICAgPHRyIGlkPSJ7e2VsZW1JZH19Ij4KKyAgICAgIDx0ZD57e2hvc3R9fTwvdGQ+CisgICAgICA8dGQ+TE9BRElORyAuLi48L3RkPgorICAgIDwvdHI+CisgICAge3svc3VwZXJ2aXNvcnN9fQorICA8L3Rib2R5PgorPC90YWJsZT4KKzwvc2NyaXB0PgorPHNjcmlwdCBpZD0ic2VhcmNoLXJlc3VsdC1pZGVudGlmaWVkLXRlbXBsYXRlIiB0eXBlPSJ0ZXh0L2h0bWwiPgorICAgIHt7I21hdGNoZXN9fQorICAgIDx0cj4KKyAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8ve3tob3N0fX06e3tsb2d2aWV3ZXJQb3J0fX0vbG9ndmlld2VyX3NlYXJjaC5odG1sP2ZpbGU9e3tmaWxlTmFtZX19JnNlYXJjaD17e3NlYXJjaFN0cmluZ319Ij57e2hvc3R9fTp7e3BvcnR9fTwvYT48L3RkPgorICAgICAgPHRkPjxwcmU+e3tiZWZvcmVTdHJpbmd9fTxiPjxhIGhyZWY9Int7bG9ndmlld2VyVVJMfX0iPnt7bWF0Y2hTdHJpbmd9fTwvYT48L2I+e3thZnRlclN0cmluZ319PC9wcmU+PC90ZD4KKyAgICA8L3RyPgorICAgIHt7L21hdGNoZXN9fQorPC9zY3JpcHQ+Cis8c2NyaXB0IGlkPSJzZWFyY2gtZm9ybS10ZW1wbGF0ZSIgdHlwZT0idGV4dC9odG1sIj4KKyAgPGRpdiBpZD0ic2VhcmNoLWZvcm0tY29udGFpbmVyIiBjbGFzcz0ic2VhcmNoLWJveCI+CisgICAgPGZvcm0gYWN0aW9uPSJkZWVwX3NlYXJjaF9yZXN1bHQuaHRtbCIgaWQ9InNlYXJjaC1ib3giPgorICAgICAgPGRpdiBjbGFzcz0icm93IiAgZGF0YS10b2dnbGU9InRvb2x0aXAiIGRhdGEtcGxhY2VtZW50PSJib3R0b20iIHRpdGxlPSJUaGUgSUQgb2YgdGhlIHRvcG9sb2d5LCBjYW4gYmUgYSByZWdleCBmb3Igc2VhcmNoLCBpLmUuICcuJyBsaXN0cyBldmVyeXRoaW5nIj4KKyAgICAgICAgPGRpdiBjbGFzcz0iY29sLW1kLTIiPlRvcG9sb2d5IElkOjwvZGl2PgorICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtbWQtMTAiPgorICAgICAgICAgIDxpbnB1dCBjbGFzcz0iZXhwYW5kLWJveCIgaWQ9InNlYXJjaC1pZCIgbmFtZT0iaWQiIGNsYXNzPSJ0eXBlYWhlYWQiIHR5cGU9InRleHQiIHBsYWNlaG9sZGVyPSJUb3BvbG9neS1JRCIgdmFsdWU9Int7aWR9fSIgbnVtYmVyPSI1MCI+CisgICAgICAgIDwvZGl2PgorICAgICAgPC9kaXY+CisgICAgICA8ZGl2IGNsYXNzPSJyb3ciIGRhdGEtdG9nZ2xlPSJ0b29sdGlwIiBkYXRhLXBsYWNlbWVudD0iYm90dG9tIiB0aXRsZT0iRXhhY3Qgc2VhcmNoIHN0cmluZyB0byBsb29rIGZvciAoTk9UIEEgUkVHRVgpIj4KKyAgICAgICAgPGRpdiBjbGFzcz0iY29sLW1kLTIiPlNlYXJjaDo8L2Rpdj4KKyAgICAgICAgPGRpdiBjbGFzcz0iY29sLW1kLTEwIj4KKyAgICAgICAgICA8aW5wdXQgY2xhc3M9ImV4cGFuZC1ib3giIHR5cGU9InRleHQiIG5hbWU9InNlYXJjaCIgdmFsdWU9Int7c2VhcmNofX0iIHBsYWNlaG9sZGVyPSJTZWFyY2giIG51bWJlcj0iNTAiPgorICAgICAgICA8L2Rpdj4KKyAgICAgIDwvZGl2PgorICAgICAgPGRpdiBjbGFzcz0icm93IiBkYXRhLXRvZ2dsZT0idG9vbHRpcCIgZGF0YS1wbGFjZW1lbnQ9ImJvdHRvbSIgdGl0bGU9IlNlYXJjaCBvbGRlciBsb2dzIHRoYXQgaGF2ZSByb3RhdGVkIGFuZCBtYXkgaGF2ZSBiZWVuIGNvbXByZXNzZWQuICBUaGlzIGNvdWxkIHRha2UgbXVjaCBsb25nZXIuIj4KKyAgICAgICAgPGRpdiBjbGFzcz0iY29sLW1kLTIiPlNlYXJjaCBhcmNoaXZlZCBsb2dzOjwvZGl2PgorICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtbWQtMTAiPjxpbnB1dCB0eXBlPSJjaGVja2JveCIgbmFtZT0ic2VhcmNoLWFyY2hpdmVkIiB7e3NlYXJjaF9hcmNoaXZlZH19PjwvZGl2PgorICAgICAgPC9kaXY+CisgICAgICA8ZGl2IGNsYXNzPSJyb3ciPgorICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtbWQtMTIiPgorICAgICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJTZWFyY2giPgorICAgICAgICA8L3RkPgorICAgICAgPC9kaXY+CisgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJjb3VudCIgdmFsdWU9Int7Y291bnR9fSI+CisgICAgPC9mb3JtPgorICA8L2Rpdj4KKzwvc2NyaXB0PgorCmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3NyYy91aS9wdWJsaWMvdGVtcGxhdGVzL2luZGV4LXBhZ2UtdGVtcGxhdGUuaHRtbCBiL3N0b3JtLWNvcmUvc3JjL3VpL3B1YmxpYy90ZW1wbGF0ZXMvaW5kZXgtcGFnZS10ZW1wbGF0ZS5odG1sCmluZGV4IDFlNTg1ZmYuLjUxNzMzNTYgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvc3JjL3VpL3B1YmxpYy90ZW1wbGF0ZXMvaW5kZXgtcGFnZS10ZW1wbGF0ZS5odG1sCisrKyBiL3N0b3JtLWNvcmUvc3JjL3VpL3B1YmxpYy90ZW1wbGF0ZXMvaW5kZXgtcGFnZS10ZW1wbGF0ZS5odG1sCkBAIC04Nyw3ICs4Nyw3IEBACiAgICAgICAgICAgICAgICAgPHNwYW4gZGF0YS10b2dnbGU9InRvb2x0aXAiIGRhdGEtcGxhY2VtZW50PSJhYm92ZSIgdGl0bGU9IlN0b3JtIHZlcnNpb24gdGhpcyBuaW1idXMgaG9zdCBpcyBydW5uaW5nLiI+VmVyc2lvbjwvc3Bhbj4KICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgICAgICA8dGg+Ci0gICAgICAgICAgICAgICAgPHNwYW4gZGF0YS10b2dnbGU9InRvb2x0aXAiIGRhdGEtcGxhY2VtZW50PSJsZWZ0IiB0aXRsZT0iVGltZSBzaW5jZSB0aGlzIG5pbWJ1cyBob3N0IGhhcyBiZWVuIHJ1bm5pbmcuIj5VcFRpbWUgU2Vjb25kczwvc3Bhbj4KKyAgICAgICAgICAgICAgICA8c3BhbiBkYXRhLXRvZ2dsZT0idG9vbHRpcCIgZGF0YS1wbGFjZW1lbnQ9ImxlZnQiIHRpdGxlPSJUaW1lIHNpbmNlIHRoaXMgbmltYnVzIGhvc3QgaGFzIGJlZW4gcnVubmluZy4iPlVwVGltZTwvc3Bhbj4KICAgICAgICAgICAgIDwvdGg+CiAgICAgICAgIDwvdHI+CiAgICAgICAgIDwvdGhlYWQ+CkBAIC0xMTUsMTEgKzExNSw2IEBACiAgICAgICAgICAgPC9zcGFuPgogICAgICAgICA8L3RoPgogICAgICAgICA8dGg+Ci0gICAgICAgICAgPHNwYW4gZGF0YS10b2dnbGU9InRvb2x0aXAiIGRhdGEtcGxhY2VtZW50PSJyaWdodCIgdGl0bGU9IlRoZSB1bmlxdWUgSUQgZ2l2ZW4gdG8gYSBUb3BvbG9neSBlYWNoIHRpbWUgaXQgaXMgbGF1bmNoZWQuIj4KLSAgICAgICAgICAgIElkCi0gICAgICAgICAgPC9zcGFuPgotICAgICAgICA8L3RoPgotICAgICAgICA8dGg+CiAgICAgICAgICAgPHNwYW4gZGF0YS10b2dnbGU9InRvb2x0aXAiIGRhdGEtcGxhY2VtZW50PSJhYm92ZSIgdGl0bGU9IlRoZSB1c2VyIHRoYXQgc3VibWl0dGVkIHRoZSBUb3BvbG9neSwgaWYgYXV0aGVudGljYXRpb24gaXMgZW5hYmxlZC4iPgogICAgICAgICAgICAgT3duZXIKICAgICAgICAgICA8L3NwYW4+CkBAIC0xNTUsNiArMTUwLDE4IEBACiAgICAgICAgICAgPC9zcGFuPgogICAgICAgICA8L3RoPgogICAgICAgICA8dGg+CisgICAgICAgICAgPHNwYW4gZGF0YS10b2dnbGU9InRvb2x0aXAiIGRhdGEtcGxhY2VtZW50PSJhYm92ZSIgdGl0bGU9IkFzc2lnbmVkIFRvdGFsIE1lbW9yeSBieSBTY2hlZHVsZXIuIj4KKyAgICAgICAgICAgIEFzc2lnbmVkIE1lbSAoTUIpCisgICAgICAgICAgPC9zcGFuPgorICAgICAgICA8L3RoPgorICAgICAgICB7eyNzY2hlZHVsZXJEaXNwbGF5UmVzb3VyY2V9fQorICAgICAgICA8dGg+CisgICAgICAgICAgPHNwYW4gZGF0YS10b2dnbGU9InRvb2x0aXAiIGRhdGEtcGxhY2VtZW50PSJhYm92ZSIgdGl0bGU9IkFzc2lnbmVkIFRvdGFsIENQVSBieSBTY2hlZHVsZXIuIEV2ZXJ5IDEwMCBtZWFucyAxIGNvcmUuIj4KKyAgICAgICAgICAgIEFzc2lnbmVkIENQVSAoJSkKKyAgICAgICAgICA8L3NwYW4+CisgICAgICAgIDwvdGg+CisgICAgICAgIHt7L3NjaGVkdWxlckRpc3BsYXlSZXNvdXJjZX19CisgICAgICAgIDx0aD4KICAgICAgICAgICA8c3BhbiBkYXRhLXRvZ2dsZT0idG9vbHRpcCIgZGF0YS1wbGFjZW1lbnQ9ImxlZnQiIHRpdGxlPSJUaGlzIHNob3dzIGluZm9ybWF0aW9uIGZyb20gdGhlIHNjaGVkdWxlciBhYm91dCB0aGUgbGF0ZXN0IGF0dGVtcHQgdG8gc2NoZWR1bGUgdGhlIFRvcG9sb2d5IG9uIHRoZSBjbHVzdGVyLiI+CiAgICAgICAgICAgICBTY2hlZHVsZXIgSW5mbwogICAgICAgICAgIDwvc3Bhbj4KQEAgLTE2NSw3ICsxNzIsNiBAQAogICAgICAge3sjdG9wb2xvZ2llc319CiAgICAgICA8dHI+CiAgICAgICAgIDx0ZD48YSBocmVmPSIvdG9wb2xvZ3kuaHRtbD9pZD17e2VuY29kZWRJZH19Ij57e25hbWV9fTwvYT48L3RkPgotICAgICAgICA8dGQ+e3tpZH19PC90ZD4KICAgICAgICAgPHRkPnt7b3duZXJ9fTwvdGQ+CiAgICAgICAgIDx0ZD57e3N0YXR1c319PC90ZD4KICAgICAgICAgPHRkPnt7dXB0aW1lfX08L3RkPgpAQCAtMTczLDYgKzE3OSwxMCBAQAogICAgICAgICA8dGQ+e3tleGVjdXRvcnNUb3RhbH19PC90ZD4KICAgICAgICAgPHRkPnt7dGFza3NUb3RhbH19PC90ZD4KICAgICAgICAgPHRkPnt7cmVwbGljYXRpb25Db3VudH19PC90ZD4KKyAgICAgICAgPHRkPnt7YXNzaWduZWRUb3RhbE1lbX19PC90ZD4KKyAgICAgICAge3sjc2NoZWR1bGVyRGlzcGxheVJlc291cmNlfX0KKyAgICAgICAgPHRkPnt7YXNzaWduZWRDcHV9fTwvdGQ+CisgICAgICAgIHt7L3NjaGVkdWxlckRpc3BsYXlSZXNvdXJjZX19CiAgICAgICAgIDx0ZD57e3NjaGVkdWxlckluZm99fTwvdGQ+CiAgICAgICA8L3RyPgogICAgICAge3svdG9wb2xvZ2llc319CkBAIC0yMDgsNiArMjE4LDMwIEBACiAgICAgICAgICAgVXNlZCBzbG90cwogICAgICAgICA8L3NwYW4+CiAgICAgICA8L3RoPgorICAgICAge3sjc2NoZWR1bGVyRGlzcGxheVJlc291cmNlfX0KKyAgICAgIDx0aD4KKyAgICAgICAgPHNwYW4gZGF0YS10b2dnbGU9InRvb2x0aXAiIGRhdGEtcGxhY2VtZW50PSJhYm92ZSIgdGl0bGU9Ik1lbW9yeSBjYXBhY2l0eSBvZiBhIHN1cGVydmlzb3IuIj4KKyAgICAgICAgICBUb3RhbCBNZW0gKE1CKQorICAgICAgICA8L3NwYW4+CisgICAgICA8L3RoPgorICAgICAge3svc2NoZWR1bGVyRGlzcGxheVJlc291cmNlfX0KKyAgICAgIDx0aD4KKyAgICAgICAgPHNwYW4gZGF0YS10b2dnbGU9InRvb2x0aXAiIGRhdGEtcGxhY2VtZW50PSJsZWZ0IiB0aXRsZT0iTWVtb3J5IHRoYXQgaGFzIGJlZW4gYWxsb2NhdGVkLiI+CisgICAgICAgICAgVXNlZCBNZW0gKE1CKQorICAgICAgICA8L3NwYW4+CisgICAgICA8L3RoPgorICAgICAge3sjc2NoZWR1bGVyRGlzcGxheVJlc291cmNlfX0KKyAgICAgIDx0aD4KKyAgICAgICAgPHNwYW4gZGF0YS10b2dnbGU9InRvb2x0aXAiIGRhdGEtcGxhY2VtZW50PSJhYm92ZSIgdGl0bGU9IkNQVSBjYXBhY2l0eSBvZiBhIHN1cGVydmlzb3IuIEV2ZXJ5IDEwMCBtZWFucyBvbmUgY29yZS4iPgorICAgICAgICAgIFRvdGFsIENQVSAoJSkKKyAgICAgICAgPC9zcGFuPgorICAgICAgPC90aD4KKyAgICAgIDx0aD4KKyAgICAgICAgPHNwYW4gZGF0YS10b2dnbGU9InRvb2x0aXAiIGRhdGEtcGxhY2VtZW50PSJsZWZ0IiB0aXRsZT0iQ1BVIHRoYXQgaGFzIGJlZW4gYWxsb2NhdGVkLiBFdmVyeSAxMDAgbWVhbnMgb25lIGNvcmUiPgorICAgICAgICAgIFVzZWQgQ1BVICglKQorICAgICAgICA8L3NwYW4+CisgICAgICA8L3RoPgorICAgICAge3svc2NoZWR1bGVyRGlzcGxheVJlc291cmNlfX0KICAgICAgIDx0aD4KICAgICAgICAgPHNwYW4gZGF0YS10b2dnbGU9InRvb2x0aXAiIGRhdGEtcGxhY2VtZW50PSJsZWZ0IiB0aXRsZT0iVmVyc2lvbiI+CiAgICAgICAgICAgVmVyc2lvbgpAQCAtMjIzLDYgKzI1NywxNCBAQAogICAgICAgPHRkPnt7dXB0aW1lfX08L3RkPgogICAgICAgPHRkPnt7c2xvdHNUb3RhbH19PC90ZD4KICAgICAgIDx0ZD57e3Nsb3RzVXNlZH19PC90ZD4KKyAgICAgIHt7I3NjaGVkdWxlckRpc3BsYXlSZXNvdXJjZX19CisgICAgICA8dGQ+e3t0b3RhbE1lbX19PC90ZD4KKyAgICAgIHt7L3NjaGVkdWxlckRpc3BsYXlSZXNvdXJjZX19CisgICAgICA8dGQ+e3t1c2VkTWVtfX08L3RkPgorICAgICAge3sjc2NoZWR1bGVyRGlzcGxheVJlc291cmNlfX0KKyAgICAgIDx0ZD57e3RvdGFsQ3B1fX08L3RkPgorICAgICAgPHRkPnt7dXNlZENwdX19PC90ZD4KKyAgICAgIHt7L3NjaGVkdWxlckRpc3BsYXlSZXNvdXJjZX19CiAgICAgICA8dGQ+e3t2ZXJzaW9ufX08L3RkPgogICAgIDwvdHI+CiAgICAge3svc3VwZXJ2aXNvcnN9fQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvdWkvcHVibGljL3RlbXBsYXRlcy9sb2d2aWV3ZXItc2VhcmNoLXBhZ2UtdGVtcGxhdGUuaHRtbCBiL3N0b3JtLWNvcmUvc3JjL3VpL3B1YmxpYy90ZW1wbGF0ZXMvbG9ndmlld2VyLXNlYXJjaC1wYWdlLXRlbXBsYXRlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQyMDhkMwotLS0gL2Rldi9udWxsCisrKyBiL3N0b3JtLWNvcmUvc3JjL3VpL3B1YmxpYy90ZW1wbGF0ZXMvbG9ndmlld2VyLXNlYXJjaC1wYWdlLXRlbXBsYXRlLmh0bWwKQEAgLTAsMCArMSw0NCBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHNjcmlwdCBpZD0ibG9ndmlld2VyLXNlYXJjaC1yZXN1bHQtdGVtcGxhdGUiIHR5cGU9InRleHQvaHRtbCI+Cit7eyNuZXh0Qnl0ZU9mZnNldH19Cis8YSBocmVmPSIvbG9ndmlld2VyX3NlYXJjaC5odG1sP2ZpbGU9e3tmaWxlfX0mc2VhcmNoPXt7c2VhcmNoU3RyaW5nfX0mb2Zmc2V0PXt7bmV4dEJ5dGVPZmZzZXR9fSIgY2xhc3M9ImJ0biBidG4tZGVmYXVsdCBlbmFibGVkIj5OZXh0PC9hPgore3svbmV4dEJ5dGVPZmZzZXR9fQorPHRhYmxlIGlkPSJzZWFyY2gtcmVzdWx0LXRhYmxlIiBjbGFzcz0idGFibGUgdGFibGUtc3RyaXBlZCBjb21wYWN0Ij4KKyAgPHRoZWFkPjx0cj48dGg+RmlsZSBvZmZzZXQ8L3RoPjx0aD5NYXRjaDwvdGg+PC90cj48L3RoZWFkPgorICA8dGJvZHk+CisgICAge3sjbWF0Y2hlc319CisgICAgPHRyPgorICAgICAgPHRkPnt7Ynl0ZU9mZnNldH19PC90ZD4KKyAgICAgIDx0ZD48cHJlPnt7YmVmb3JlU3RyaW5nfX08Yj48YSBocmVmPSJ7e2xvZ3ZpZXdlclVSTH19Ij57e21hdGNoU3RyaW5nfX08L2E+PC9iPnt7YWZ0ZXJTdHJpbmd9fTwvcHJlPjwvdGQ+CisgICAgPC90cj4KKyAgICB7ey9tYXRjaGVzfX0KKyAgPC90Ym9keT4KKzwvdGFibGU+Cit7eyNuZXh0Qnl0ZU9mZnNldH19Cis8YSBocmVmPSIvbG9ndmlld2VyX3NlYXJjaC5odG1sP2ZpbGU9e3tmaWxlfX0mc2VhcmNoPXt7c2VhcmNoU3RyaW5nfX0mb2Zmc2V0PXt7bmV4dEJ5dGVPZmZzZXR9fSIgY2xhc3M9ImJ0biBidG4tZGVmYXVsdCBlbmFibGVkIj5OZXh0PC9hPgore3svbmV4dEJ5dGVPZmZzZXR9fQorPC9zY3JpcHQ+Cis8c2NyaXB0IGlkPSJzZWFyY2gtc2luZ2xlLWZpbGUiIHR5cGU9InRleHQvaHRtbCI+Cis8Zm9ybSBhY3Rpb249ImxvZ3ZpZXdlcl9zZWFyY2guaHRtbCIgaWQ9InNlYXJjaC1ib3giPgorICBTZWFyY2gge3tmaWxlfX06CisgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJzZWFyY2giIHZhbHVlPSJ7e3NlYXJjaH19Ij4KKyAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iZmlsZSIgdmFsdWU9Int7ZmlsZX19Ij4KKyAgPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IlNlYXJjaCI+Cis8L2Zvcm0+Cis8L3NjcmlwdD4KKwpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvdWkvcHVibGljL3RlbXBsYXRlcy9zZWFyY2gtcmVzdWx0LXBhZ2UtdGVtcGxhdGUuaHRtbCBiL3N0b3JtLWNvcmUvc3JjL3VpL3B1YmxpYy90ZW1wbGF0ZXMvc2VhcmNoLXJlc3VsdC1wYWdlLXRlbXBsYXRlLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQyYTY0MwotLS0gL2Rldi9udWxsCisrKyBiL3N0b3JtLWNvcmUvc3JjL3VpL3B1YmxpYy90ZW1wbGF0ZXMvc2VhcmNoLXJlc3VsdC1wYWdlLXRlbXBsYXRlLmh0bWwKQEAgLTAsMCArMSw2MCBAQAorPCEtLQorIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQorIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAorIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KKyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAorICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCisgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPHNjcmlwdCBpZD0ic2VhcmNoLXJlc3VsdC1maWxlcy10ZW1wbGF0ZSIgdHlwZT0idGV4dC9odG1sIj4KKzx0YWJsZSBpZD0ic2VhcmNoLXJlc3VsdC10YWJsZSIgY2xhc3M9InRhYmxlIHRhYmxlLXN0cmlwZWQgY29tcGFjdCI+CisgIDx0aGVhZD48dHI+PHRoPmhvc3Q6cG9ydDwvdGg+PHRoPk1hdGNoPC90aD48L3RyPjwvdGhlYWQ+CisgIDx0Ym9keT4KKyAgICB7eyNob3N0UG9ydExpc3R9fQorICAgICAgPHRyIGlkPSJ7e2VsZW1JZH19Ij4KKyAgICAgICAgPHRkPnt7aG9zdH19Ont7cG9ydH19PC90ZD4KKyAgICAgICAgPHRkPkxPQURJTkcgLi4uPC90ZD4KKyAgICAgIDwvdHI+CisgICAge3svaG9zdFBvcnRMaXN0fX0KKyAgPC90Ym9keT4KKzwvdGFibGU+Cis8L3NjcmlwdD4KKzxzY3JpcHQgaWQ9InNlYXJjaC1yZXN1bHQtaWRlbnRpZmllZC10ZW1wbGF0ZSIgdHlwZT0idGV4dC9odG1sIj4KKyAgICB7eyNtYXRjaGVzfX0KKyAgICA8dHI+CisgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3t7aG9zdH19Ont7bG9ndmlld2VyUG9ydH19L2xvZ3ZpZXdlcl9zZWFyY2guaHRtbD9maWxlPXt7ZmlsZX19JnNlYXJjaD17e3NlYXJjaFN0cmluZ319Ij57e2hvc3R9fTp7e3BvcnR9fTwvYT48L3RkPgorICAgICAgPHRkPjxwcmU+e3tiZWZvcmVTdHJpbmd9fTxiPjxhIGhyZWY9Int7bG9ndmlld2VyVVJMfX0iPnt7bWF0Y2hTdHJpbmd9fTwvYT48L2I+e3thZnRlclN0cmluZ319PC9wcmU+PC90ZD4KKyAgICA8L3RyPgorICAgIHt7L21hdGNoZXN9fQorPC9zY3JpcHQ+Cis8c2NyaXB0IGlkPSJkZWVwc2VhcmNoLXJlc3VsdC1pZGVudGlmaWVkLXRlbXBsYXRlIiB0eXBlPSJ0ZXh0L2h0bWwiPgorICAgIHt7I21hdGNoZXN9fQorICAgIHt7I21hdGNoZXN9fQorICAgIDx0cj4KKyAgICAgIDx0ZD48YSBocmVmPSJodHRwOi8ve3tob3N0fX06e3tsb2d2aWV3ZXJQb3J0fX0vbG9ndmlld2VyX3NlYXJjaC5odG1sP2ZpbGU9e3tmaWxlTmFtZX19JnNlYXJjaD17e3NlYXJjaFN0cmluZ319Ij57e2hvc3R9fTp7e3BvcnR9fTwvYT48L3RkPgorICAgICAgPHRkPjxwcmU+e3tiZWZvcmVTdHJpbmd9fTxiPjxhIGhyZWY9Int7bG9ndmlld2VyVVJMfX0iPnt7bWF0Y2hTdHJpbmd9fTwvYT48L2I+e3thZnRlclN0cmluZ319PC9wcmU+PC90ZD4KKyAgICA8L3RyPgorICAgIHt7L21hdGNoZXN9fQorICAgIHt7L21hdGNoZXN9fQorPC9zY3JpcHQ+Cis8c2NyaXB0IGlkPSJzZWFyY2gtZm9ybS10ZW1wbGF0ZSIgdHlwZT0idGV4dC9odG1sIj4KKyAgPGRpdiBjbGFzcz0ic2VhcmNoLWJveCI+CisgICAgPGZvcm0gYWN0aW9uPSJzZWFyY2hfcmVzdWx0Lmh0bWwiIGlkPSJzZWFyY2gtYm94Ij4KKyAgICAgIFNlYXJjaCB7e2lkfX06CisgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ic2VhcmNoIiB2YWx1ZT0ie3tzZWFyY2h9fSI+CisgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJpZCIgdmFsdWU9Int7aWR9fSI+CisgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJjb3VudCIgdmFsdWU9Int7Y291bnR9fSI+CisgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iU2VhcmNoIj4KKyAgICAgIFNlYXJjaCBBcmNoaXZlZCBMb2dzOiA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9InNlYXJjaEFyY2hpdmVkIiB2YWx1ZT0iY2hlY2tlZCIge3tzZWFyY2hBcmNoaXZlZH19PgorICAgIDwvZm9ybT4KKyAgPC9kaXY+Cis8L3NjcmlwdD4KKwpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvdWkvcHVibGljL3RlbXBsYXRlcy90b3BvbG9neS1wYWdlLXRlbXBsYXRlLmh0bWwgYi9zdG9ybS1jb3JlL3NyYy91aS9wdWJsaWMvdGVtcGxhdGVzL3RvcG9sb2d5LXBhZ2UtdGVtcGxhdGUuaHRtbAppbmRleCAzMjkyZWUwLi4xZjgxZjFiIDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy91aS9wdWJsaWMvdGVtcGxhdGVzL3RvcG9sb2d5LXBhZ2UtdGVtcGxhdGUuaHRtbAorKysgYi9zdG9ybS1jb3JlL3NyYy91aS9wdWJsaWMvdGVtcGxhdGVzL3RvcG9sb2d5LXBhZ2UtdGVtcGxhdGUuaHRtbApAQCAtNjQsNiArNjQsMTEgQEAKICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgIDwvdGg+CiAgICAgICAgIDx0aD4KKyAgICAgICAgICA8c3BhbiBkYXRhLXRvZ2dsZT0idG9vbHRpcCIgZGF0YS1wbGFjZW1lbnQ9ImFib3ZlIiB0aXRsZT0iQXNzaWduZWQgVG90YWwgTWVtb3J5IGJ5IFNjaGVkdWxlci4iPgorICAgICAgICAgICAgQXNzaWduZWQgTWVtIChNQikKKyAgICAgICAgICA8L3NwYW4+CisgICAgICAgIDwvdGg+CisgICAgICAgIDx0aD4KICAgICAgICAgICA8c3BhbiBkYXRhLXRvZ2dsZT0idG9vbHRpcCIgZGF0YS1wbGFjZW1lbnQ9ImxlZnQiIHRpdGxlPSJUaGlzIHNob3dzIGluZm9ybWF0aW9uIGZyb20gdGhlIHNjaGVkdWxlciBhYm91dCB0aGUgbGF0ZXN0IGF0dGVtcHQgdG8gc2NoZWR1bGUgdGhlIFRvcG9sb2d5IG9uIHRoZSBjbHVzdGVyLiI+CiAgICAgICAgICAgICBTY2hlZHVsZXIgSW5mbwogICAgICAgICAgIDwvc3Bhbj4KQEAgLTgxLDExICs4Niw3MiBAQAogICAgICAgICA8dGQ+e3tleGVjdXRvcnNUb3RhbH19PC90ZD4KICAgICAgICAgPHRkPnt7dGFza3NUb3RhbH19PC90ZD4KICAgICAgICAgPHRkPnt7cmVwbGljYXRpb25Db3VudH19PC90ZD4KKyAgICAgICAgPHRkPnt7YXNzaWduZWRUb3RhbE1lbX19PC90ZD4KICAgICAgICAgPHRkPnt7c2NoZWR1bGVySW5mb319PC90ZD4KICAgICAgIDwvdHI+CiAgICAgPC90Ym9keT4KICAgPC90YWJsZT4KIDwvc2NyaXB0PgorPHNjcmlwdCBpZD0idG9wb2xvZ3ktcmVzb3VyY2VzLXRlbXBsYXRlIiB0eXBlPSJ0ZXh0L2h0bWwiPgorICA8dGFibGUgaWQ9InRvcG9sb2d5LXJlc291cmNlcy10YWJsZSIgY2xhc3M9InRhYmxlIGNvbXBhY3QiPgorICAgIDx0aGVhZD4KKyAgICA8dHI+CisgICAgICA8dGg+CisgICAgICAgICAgPHNwYW4gZGF0YS10b2dnbGU9InRvb2x0aXAiIGRhdGEtcGxhY2VtZW50PSJyaWdodCIgdGl0bGU9IlRoZSBuYW1lIGdpdmVuIHRvIHRoZSB0b3BvbG9neSBieSB3aGVuIGl0IHdhcyBzdWJtaXR0ZWQuIj4KKyAgICAgICAgICAgIE5hbWUKKyAgICAgICAgICA8L3NwYW4+CisgICAgICA8L3RoPgorICAgICAgPHRoPgorICAgICAgICAgIDxzcGFuIGRhdGEtdG9nZ2xlPSJ0b29sdGlwIiBkYXRhLXBsYWNlbWVudD0icmlnaHQiIHRpdGxlPSJUaGUgdW5pcXVlIElEIGdpdmVuIHRvIGEgVG9wb2xvZ3kgZWFjaCB0aW1lIGl0IGlzIGxhdW5jaGVkLiI+CisgICAgICAgICAgICBJZAorICAgICAgICAgIDwvc3Bhbj4KKyAgICAgIDwvdGg+CisgICAgICA8dGg+CisgICAgICAgICAgPHNwYW4gZGF0YS10b2dnbGU9InRvb2x0aXAiIGRhdGEtcGxhY2VtZW50PSJhYm92ZSIgdGl0bGU9IlJlcXVlc3RlZCBUb3RhbCBPbi1IZWFwIE1lbW9yeSBieSBVc2VyLiI+CisgICAgICAgICAgICBSZXF1ZXN0ZWQgT24tSGVhcCBNZW1vcnkgKE1CKQorICAgICAgICAgIDwvc3Bhbj4KKyAgICAgIDwvdGg+CisgICAgICA8dGg+CisgICAgICAgICAgPHNwYW4gZGF0YS10b2dnbGU9InRvb2x0aXAiIGRhdGEtcGxhY2VtZW50PSJhYm92ZSIgdGl0bGU9IkFzc2lnbmVkIFRvdGFsIE9uLUhlYXAgTWVtb3J5IGJ5IFNjaGVkdWxlci4iPgorICAgICAgICAgICAgQXNzaWduZWQgT24tSGVhcCBNZW1vcnkgKE1CKQorICAgICAgICAgIDwvc3Bhbj4KKyAgICAgIDwvdGg+CisgICAgICA8dGg+CisgICAgICAgICAgPHNwYW4gZGF0YS10b2dnbGU9InRvb2x0aXAiIGRhdGEtcGxhY2VtZW50PSJhYm92ZSIgdGl0bGU9IlJlcXVlc3RlZCBUb3RhbCBPZmYtSGVhcCBNZW1vcnkgYnkgVXNlci4iPgorICAgICAgICAgICAgUmVxdWVzdGVkIE9mZi1IZWFwIE1lbW9yeSAoTUIpCisgICAgICAgICAgPC9zcGFuPgorICAgICAgPC90aD4KKyAgICAgIDx0aD4KKyAgICAgICAgICA8c3BhbiBkYXRhLXRvZ2dsZT0idG9vbHRpcCIgZGF0YS1wbGFjZW1lbnQ9ImFib3ZlIiB0aXRsZT0iQXNzaWduZWQgVG90YWwgT2ZmLUhlYXAgTWVtb3J5IGJ5IFNjaGVkdWxlci4iPgorICAgICAgICAgICAgQXNzaWduZWQgT2ZmLUhlYXAgTWVtb3J5IChNQikKKyAgICAgICAgICA8L3NwYW4+CisgICAgICA8L3RoPgorICAgICAgPHRoPgorICAgICAgICAgIDxzcGFuIGRhdGEtdG9nZ2xlPSJ0b29sdGlwIiBkYXRhLXBsYWNlbWVudD0iYWJvdmUiIHRpdGxlPSJSZXF1ZXN0ZWQgVG90YWwgQ1BVIGJ5IFVzZXIuIEV2ZXJ5IDEwMCBtZWFucyAxIGNvcmUuIj4KKyAgICAgICAgICAgIFJlcXVlc3RlZCBDUFUgKCUpCisgICAgICAgICAgPC9zcGFuPgorICAgICAgPC90aD4KKyAgICAgIDx0aD4KKyAgICAgICAgICA8c3BhbiBkYXRhLXRvZ2dsZT0idG9vbHRpcCIgZGF0YS1wbGFjZW1lbnQ9ImxlZnQiIHRpdGxlPSJBc3NpZ25lZCBUb3RhbCBDUFUgYnkgU2NoZWR1bGVyLiBFdmVyeSAxMDAgbWVhbnMgMSBjb3JlLiI+CisgICAgICAgICAgICBBc3NpZ25lZCBDUFUgKCUpCisgICAgICAgICAgPC9zcGFuPgorICAgICAgPC90aD4KKyAgICA8L3RyPgorICAgIDwvdGhlYWQ+CisgICAgPHRib2R5PgorICAgIDx0cj4KKyAgICAgIDx0ZD57e25hbWV9fTwvdGQ+CisgICAgICA8dGQ+e3tpZH19PC90ZD4KKyAgICAgIDx0ZD57e3JlcXVlc3RlZE1lbU9uSGVhcH19PC90ZD4KKyAgICAgIDx0ZD57e2Fzc2lnbmVkTWVtT25IZWFwfX08L3RkPgorICAgICAgPHRkPnt7cmVxdWVzdGVkTWVtT2ZmSGVhcH19PC90ZD4KKyAgICAgIDx0ZD57e2Fzc2lnbmVkTWVtT2ZmSGVhcH19PC90ZD4KKyAgICAgIDx0ZD57e3JlcXVlc3RlZENwdX19PC90ZD4KKyAgICAgIDx0ZD57e2Fzc2lnbmVkQ3B1fX08L3RkPgorICAgIDwvdHI+CisgICAgPC90Ym9keT4KKyAgPC90YWJsZT4KKzwvc2NyaXB0PgogPHNjcmlwdCBpZD0idG9wb2xvZ3ktc3RhdHMtdGVtcGxhdGUiIHR5cGU9InRleHQvaHRtbCI+CiAgIDxoMj5Ub3BvbG9neSBzdGF0czwvaDI+CiAgIDx0YWJsZSBjbGFzcz0idGFibGUgdGFibGUtc3RyaXBlZCBjb21wYWN0IiBpZD0idG9wb2xvZ3ktc3RhdHMtdGFibGUiPgpAQCAtMTM3LDMzICsyMDMsMzcgQEAKICAgICA8L3Rib2R5PgogICA8L3RhYmxlPgogPC9zY3JpcHQ+CisKKzxzY3JpcHQgaWQ9InRvcG9sb2d5LXZpc3VhbGl6YXRpb24tY29udGFpbmVyLXRlbXBsYXRlIiB0eXBlPSJ0ZXh0L2h0bWwiPgorICA8cD4KKyAgICA8dGFibGUgY2xhc3M9InRhYmxlIHRhYmxlLXN0cmlwZWQgY29tcGFjdCI+CisgICAgICA8dGhlYWQ+CisgICAgICAgIDx0cj4KKyAgICAgICAgICA8dGggY2xhc3M9ImhlYWRlciIgY29sc3Bhbj00PgorICAgICAgICAgICAgU3RyZWFtcworICAgICAgICAgIDwvdGg+CisgICAgICAgIDwvdHI+CisgICAgICA8L3RoZWFkPgorICAgICAge3sjdmlzdWFsaXphdGlvblRhYmxlfX0KKyAgICAgIDx0cj4KKyAgICAgICAge3sjOnJvd319CisgICAgICAgIDx0ZD4KKyAgICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPXt7OnNhbmktc3RyZWFtfX0gY2xhc3M9InN0cmVhbS1ib3giIHt7IzpjaGVja2VkfX1jaGVja2Vke3svOmNoZWNrZWR9fS8+CisgICAgICAgICAge3s6c3RyZWFtfX0KKyAgICAgICAgPC90ZD4KKyAgICAgICAge3svOnJvd319CisgICAgICA8L3RyPgorICAgICAge3svdmlzdWFsaXphdGlvblRhYmxlfX0KKyAgICA8L3RhYmxlPgorICA8L3A+CisgIDxjYW52YXMgaWQ9InRvcG9HcmFwaCIgd2lkdGg9MTAyNCBoZWlnaHQ9NzY4IHN0eWxlPSJib3JkZXI6MXB4IHNvbGlkICMwMDAwMDA7Ij4KKzwvc2NyaXB0PgorCiA8c2NyaXB0IGlkPSJ0b3BvbG9neS12aXN1YWxpemF0aW9uLXRlbXBsYXRlIiB0eXBlPSJ0ZXh0L2h0bWwiPgogICA8aDI+VG9wb2xvZ3kgVmlzdWFsaXphdGlvbjwvaDI+CiAgIDxpbnB1dCB0eXBlPSJidXR0b24iIGlkPSJzaG93LWhpZGUtdmlzdWFsaXphdGlvbiIgdmFsdWU9IlNob3cgVmlzdWFsaXphdGlvbiIgY2xhc3M9ImJ0biBidG4tZGVmYXVsdCIvPgogICA8cD4KICAgICA8ZGl2IGlkPSJ2aXN1YWxpemF0aW9uLWNvbnRhaW5lciIgc3R5bGU9ImRpc3BsYXk6bm9uZTsiPgotICAgICAgPHA+Ci0gICAgICAgIDx0YWJsZSBjbGFzcz0idGFibGUgdGFibGUtc3RyaXBlZCBjb21wYWN0Ij4KLSAgICAgICAgICA8dGhlYWQ+Ci0gICAgICAgICAgICA8dHI+Ci0gICAgICAgICAgICAgIDx0aCBjbGFzcz0iaGVhZGVyIiBjb2xzcGFuPTQ+Ci0gICAgICAgICAgICAgICAgU3RyZWFtcwotICAgICAgICAgICAgICA8L3RoPgotICAgICAgICAgICAgPC90cj4KLSAgICAgICAgICA8L3RoZWFkPgotICAgICAgICAgIHt7I3Zpc3VhbGl6YXRpb25UYWJsZX19Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAge3sjOnJvd319Ci0gICAgICAgICAgICA8dGQ+Ci0gICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9e3s6c2FuaS1zdHJlYW19fSBjbGFzcz0ic3RyZWFtLWJveCIge3sjOmNoZWNrZWR9fWNoZWNrZWR7ey86Y2hlY2tlZH19Lz4KLSAgICAgICAgICAgICAge3s6c3RyZWFtfX0KLSAgICAgICAgICAgIDwvdGQ+Ci0gICAgICAgICAgICB7ey86cm93fX0KLSAgICAgICAgICA8L3RyPgotICAgICAgICAgIHt7L3Zpc3VhbGl6YXRpb25UYWJsZX19Ci0gICAgICAgIDwvdGFibGU+Ci0gICAgICA8L3A+Ci0gICAgICA8Y2FudmFzIGlkPSJ0b3BvR3JhcGgiIHdpZHRoPTEwMjQgaGVpZ2h0PTc2OCBzdHlsZT0iYm9yZGVyOjFweCBzb2xpZCAjMDAwMDAwOyI+CiAgICAgPC9kaXY+CiAgIDwvcD4KIDwvc2NyaXB0PgpAQCAtMjUzLDcgKzMyMyw3IEBACiAgICAgICAgICAgPHNwYW4gaWQ9Int7ZXJyb3JMYXBzZWRTZWNzfX0iIGNsYXNzPSJlcnJvclNwYW4iPnt7bGFzdEVycm9yfX08L3NwYW4+CiAgICAgICAgIDwvdGQ+CiAgICAgICAgIDx0ZD4KLSAgICAgICAgICA8c3BhbiBpZD0ie3t0aW1lfX0iIGNsYXNzPSJlcnJvclRpbWUiIGRhdGEtdG9nZ2xlPSJ0b29sdGlwIiB0aXRsZT0ie3tlcnJvckxhcHNlZFNlY3N9fSI+e3t0aW1lfX08L3NwYW4+CisgICAgICAgICAgPHNwYW4gaWQ9Int7ZXJyb3JUaW1lfX0iIGNsYXNzPSJlcnJvclRpbWUiIGRhdGEtdG9nZ2xlPSJ0b29sdGlwIiB0aXRsZT0ie3tlcnJvckxhcHNlZFNlY3N9fSI+e3tlcnJvclRpbWV9fTwvc3Bhbj4KICAgICAgICAgPC90ZD4KICAgICAgICAge3svc3BvdXRzfX0KICAgICA8L3Rib2R5PgpAQCAtMzQ3LDcgKzQxNyw3IEBACiAgICAgICAgICAgPHNwYW4gaWQ9Int7ZXJyb3JMYXBzZWRTZWNzfX0iIGNsYXNzPSJlcnJvclNwYW4iPnt7bGFzdEVycm9yfX08L3NwYW4+CiAgICAgICAgIDwvdGQ+CiAgICAgICAgIDx0ZD4KLSAgICAgICAgICA8c3BhbiBpZD0ie3t0aW1lfX0iIGNsYXNzPSJlcnJvclRpbWUiIGRhdGEtdG9nZ2xlPSJ0b29sdGlwIiB0aXRsZT0ie3tlcnJvckxhcHNlZFNlY3N9fSI+e3t0aW1lfX08L3NwYW4+CisgICAgICAgICAgPHNwYW4gaWQ9Int7ZXJyb3JUaW1lfX0iIGNsYXNzPSJlcnJvclRpbWUiIGRhdGEtdG9nZ2xlPSJ0b29sdGlwIiB0aXRsZT0ie3tlcnJvckxhcHNlZFNlY3N9fSI+e3tlcnJvclRpbWV9fTwvc3Bhbj4KICAgICAgICAgPC90ZD4KICAgICAgICAge3svYm9sdHN9fQogICAgIDwvdGJvZHk+CkBAIC0zNjIsNSArNDMyLDg0IEBACiAgICAgPGlucHV0IHt7a2lsbFN0YXR1c319IG9uY2xpY2s9ImNvbmZpcm1BY3Rpb24oJ3t7ZW5jb2RlZElkfX0nLCAne3tuYW1lfX0nLCAna2lsbCcsIHRydWUsIDMwLCAnd2FpdCB0aW1lIGluIHNlY29uZHMnKSIgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iS2lsbCIgY2xhc3M9ImJ0biBidG4tZGVmYXVsdCI+CiAgICAgPGlucHV0IHt7c3RhcnREZWJ1Z1N0YXR1c319IG9uY2xpY2s9ImNvbmZpcm1BY3Rpb24oJ3t7ZW5jb2RlZElkfX0nLCAne3tuYW1lfX0nLCAnZGVidWcvZW5hYmxlJywgdHJ1ZSwge3tjdXJyZW50U2FtcGxpbmdQY3R9fSwgJ3NhbXBsaW5nIHBlcmNlbnRhZ2UnLCAnZGVidWcnKSIgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iRGVidWciIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQiPgogICAgIDxpbnB1dCB7e3N0b3BEZWJ1Z1N0YXR1c319IG9uY2xpY2s9ImNvbmZpcm1BY3Rpb24oJ3t7ZW5jb2RlZElkfX0nLCAne3tuYW1lfX0nLCAnZGVidWcvZGlzYWJsZScsIGZhbHNlLCAwLCAnc2FtcGxpbmcgcGVyY2VudGFnZScsICdzdG9wIGRlYnVnZ2luZycpIiB0eXBlPSJidXR0b24iIHZhbHVlPSJTdG9wIERlYnVnIiBjbGFzcz0iYnRuIGJ0bi1kZWZhdWx0Ij4KKyAgICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB7e2xvZ0xldmVsfX0gdmFsdWU9IkNoYW5nZSBMb2cgTGV2ZWwiIG9uY2xpY2s9InRvZ2dsZUNoYW5nZUxvZ0xldmVsKCkiIGNsYXNzPSJidG4gYnRuLWRlZmF1bHQiPgogICA8L3A+CisgIDwhLS0gCisgICAgQ29udGVudHMgb2YgdG9wb2xvZ3ktY2hhbmdlLWxvZy1sZXZlbC10ZW1wbGF0ZSB3aWxsIGJlIGFkZGVkIHRvIHRoZSBkaXYgYmVsb3cKKyAgICBvbmNlIHVzZXIgY2xpY2tzIG9uICJDaGFuZ2UgTG9nIExldmVsIgorICAtLT4KKyAgPGRpdiBpZD0iY2hhbmdlLWxvZy1sZXZlbCIgc3R5bGU9ImRpc3BsYXk6bm9uZSI+PC9kaXY+Cis8L3NjcmlwdD4KKworPHNjcmlwdCBpZD0ic2VhcmNoLWZvcm0tdGVtcGxhdGUiIHR5cGU9InRleHQvaHRtbCI+CisgIDxmb3JtIGFjdGlvbj0ic2VhcmNoX3Jlc3VsdC5odG1sIiBpZD0ic2VhcmNoLWJveCI+CisgICAgU2VhcmNoIHt7aWR9fToKKyAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ic2VhcmNoIj4KKyAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJpZCIgdmFsdWU9Int7aWR9fSI+CisgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iY291bnQiIHZhbHVlPSIxIj4KKyAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iU2VhcmNoIj4KKyAgICBTZWFyY2ggQXJjaGl2ZWQgTG9nczogPGlucHV0IHR5cGU9ImNoZWNrYm94IiBuYW1lPSJzZWFyY2hBcmNoaXZlZCIgdmFsdWU9ImNoZWNrZWQiPgorICA8L2Zvcm0+Cis8L3NjcmlwdD4KKworPHNjcmlwdCBpZD0ibG9nLWxldmVsLWFuZC10aW1lb3V0IiB0eXBlPSJ0ZXh0L2h0bWwiIGNsYXNzPSJwYXJ0aWFscyI+CisgICAgPHRyIGlkPSJsb2dnZXIte3tsb2dnZXJJZH19IiBjbGFzcz0ie3tjbHN9fSI+CisgICAgICAgIHt7I2xvZ2dlck5hbWV9fQorICAgICAgICAgIDx0ZD57e2xvZ2dlck5hbWV9fTwvdGQ+CisgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgaWQ9ImxvZ2dlck5hbWUte3tsb2dnZXJJZH19IiB2YWx1ZT0ie3tsb2dnZXJOYW1lfX0iLz4KKyAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBpZD0ibG9nZ2VyUmVtb3ZlLXt7bG9nZ2VySWR9fSIgdmFsdWU9ImZhbHNlIi8+CisgICAgICAgIHt7L2xvZ2dlck5hbWV9fQorCisgICAgICAgIHt7I2lzTmV3fX0KKyAgICAgICAgICA8dGQ+CisgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgaWQ9ImxvZ2dlck5hbWUte3tsb2dnZXJJZH19IiBwbGFjZWhvbGRlcj0iY29tLnlvdXIub3JnYW5pemF0aW9uLkxvZ2dlck5hbWUiLz4KKyAgICAgICAgICA8L3RkPgorICAgICAgICB7ey9pc05ld319CisKKyAgICAgICAgPHRkPgorICAgICAgICAgICAgPHNlbGVjdCBpZD0ibG9nZ2VyTGV2ZWwte3tsb2dnZXJJZH19Ij4KKyAgICAgICAgICAgICAgICB7eyNsZXZlbHN9fSAKKyAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0ie3tuYW1lfX0iIHt7bGV2ZWxTZWxlY3RlZH19Pnt7bmFtZX19PC9vcHRpb24+CisgICAgICAgICAgICAgICAge3svbGV2ZWxzfX0KKyAgICAgICAgICAgIDwvc2VsZWN0PgorICAgICAgICA8L3RkPgorICAgICAgICA8dGQ+CisgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgY2xhc3M9InRpbWVvdXRfaW5wdXQiIGlkPSJsb2dnZXJUaW1lb3V0LXt7bG9nZ2VySWR9fSIgcGxhY2Vob2xkZXI9IjMwIiB2YWx1ZT0ie3t0aW1lb3V0fX0iLz4gCisgICAgICAgIDwvdGQ+CisgICAgICAgIDx0ZD4KKyAgICAgICAgICAgIHt7YWJzb2x1dGVUaW1lb3V0fX0KKyAgICAgICAgPC90ZD4KKyAgICAgICAgPHRkPgorICAgICAgICAgICAge3sjaXNOZXd9fQorICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJidXR0b24iIHZhbHVlPSJBZGQiIG5hbWU9ImNsZWFyIiBvbkNsaWNrPSdzZW5kTG9nZ2VyTGV2ZWwoe3tsb2dnZXJJZH19KScgY2xhc3M9ImJ0biBidG4tc2Vjb25kYXJ5Ii8+CisgICAgICAgICAgICB7ey9pc05ld319CisgICAgICAgICAgICB7eyNsb2dnZXJOYW1lfX0KKyAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iQXBwbHkiIG5hbWU9ImNsZWFyIiBvbkNsaWNrPSdzZW5kTG9nZ2VyTGV2ZWwoe3tsb2dnZXJJZH19KScgY2xhc3M9ImJ0biBidG4tc2Vjb25kYXJ5Ii8+CisgICAgICAgICAgICAgICAge3sjY2FuQ2xlYXJ9fQorICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iYnV0dG9uIiB2YWx1ZT0iQ2xlYXIiIG5hbWU9ImNsZWFyIiBvbkNsaWNrPSdjbGVhckxvZ2dlckxldmVsKHt7bG9nZ2VySWR9fSknIGNsYXNzPSJidG4gYnRuLXNlY29uZGFyeSIvPgorICAgICAgICAgICAgICAgIHt7L2NhbkNsZWFyfX0KKyAgICAgICAgICAgIHt7L2xvZ2dlck5hbWV9fQorICAgICAgICA8L3RkPgorICAgIDwvdHI+Cis8L3NjcmlwdD4KKworPHNjcmlwdCBpZD0idG9wb2xvZ3ktY2hhbmdlLWxvZy1sZXZlbC10ZW1wbGF0ZSIgdHlwZT0idGV4dC9odG1sIj4KKyAgPGRpdiBpZD0iY2hhbmdlLWxvZy1sZXZlbCI+CisgICAgICA8aDM+Q2hhbmdlIExvZyBMZXZlbDwvaDM+CisgICAgICBNb2RpZnkgdGhlIGxvZ2dlciBsZXZlbHMgZm9yIHRvcG9sb2d5LiBOb3RlIHRoYXQgYXBwbHlpbmcgYSBzZXR0aW5nIHJlc3RhcnRzIHRoZSB0aW1lciBpbiB0aGUgd29ya2Vycy4gVG8gY29uZmlndXJlIHRoZSByb290IGxvZ2dlciwgdXNlIHRoZSBuYW1lIFJPT1QuIAorICAgICAgPHRhYmxlIGNsYXNzPSJ0YWJsZSB0YWJsZS1zdHJpcGVkIGNvbXBhY3QiPgorICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgICAgPHRyPgorICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJoZWFkZXIiPkxvZ2dlcjwvdGg+CisgICAgICAgICAgICAgICAgICA8dGggY2xhc3M9ImhlYWRlciI+TGV2ZWw8L3RoPgorICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJoZWFkZXIiPlRpbWVvdXQgKHNlYyk8L3RoPgorICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJoZWFkZXIiPkV4cGlyZXMgYXQ8L3RoPgorICAgICAgICAgICAgICAgICAgPHRoIGNsYXNzPSJoZWFkZXIiPkFjdGlvbnM8L3RoPgorICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgIDwvdGhlYWQ+CisgICAgICB7eyNsb2dnZXJzfX0KKyAgICAgICAgICB7eyA+IGxvZy1sZXZlbC1hbmQtdGltZW91dCB9fQorICAgICAge3svbG9nZ2Vyc319CisgICAgICA8L3RhYmxlPgorICA8L2Rpdj4KIDwvc2NyaXB0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvc3JjL3VpL3B1YmxpYy90ZW1wbGF0ZXMvdXNlci10ZW1wbGF0ZS5odG1sIGIvc3Rvcm0tY29yZS9zcmMvdWkvcHVibGljL3RlbXBsYXRlcy91c2VyLXRlbXBsYXRlLmh0bWwKaW5kZXggNGZhMTMzOC4uODUzZjBjOSAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS9zcmMvdWkvcHVibGljL3RlbXBsYXRlcy91c2VyLXRlbXBsYXRlLmh0bWwKKysrIGIvc3Rvcm0tY29yZS9zcmMvdWkvcHVibGljL3RlbXBsYXRlcy91c2VyLXRlbXBsYXRlLmh0bWwKQEAgLTE1LDExICsxNSwyNCBAQAogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogLS0+CiA8c2NyaXB0IGlkPSJ1c2VyLXRlbXBsYXRlIiB0eXBlPSJ0ZXh0L2h0bWwiPgotIHt7I3VzZXJ9fQotICA8ZGl2IGNsYXNzPSJ1aS11c2VyIj48cD4KLSAgICA8c3BhbiBkYXRhLXRvZ2dsZT0idG9vbHRpcCIgZGF0YS1wbGFjZW1lbnQ9ImJlbG93IiBkYXRhLW9yaWdpbmFsLXRpdGxlPSJUaGlzIHNob3VsZCBiZSB5b3UuIj4KLSAgICAgICAgICAgIFVzZXI6IHt7dXNlcn19Ci0gICAgPC9zcGFuPgotICA8L3A+PC9kaXY+Ci0gIHt7L3VzZXJ9fQorIDxkaXYgY2xhc3M9InVpLXVzZXIiPgorICAgICB7eyNjZW50cmFsLWxvZy11cmx9fQorICAgICAgICA8c3BhbiBkYXRhLXRvZ2dsZT0idG9vbHRpcCIgZGF0YS1wbGFjZW1lbnQ9ImJvdHRvbSIgZGF0YS1vcmlnaW5hbC10aXRsZT0iTGluayB0byBDZW50cmFsIExvZ2dpbmciPgorICAgICAgICAgICAgICAgIDxhIGhyZWY9Int7Y2VudHJhbC1sb2ctdXJsfX0iIHRhcmdldD0iX2JsYW5rIj48aW1hZ2Ugc3JjPSIvaW1hZ2VzL3N0YXRpc3RpYy5wbmciIGNsYXNzPSJpbWFnZV9wcmVfZm9ybWF0Ii8+PC9hPgorICAgICAgICA8L3NwYW4+CisgICAgICB7ey9jZW50cmFsLWxvZy11cmx9fQorICAgICB7eyNidWd0cmFja2VyLXVybH19CisgICAgICAgIDxzcGFuIGRhdGEtdG9nZ2xlPSJ0b29sdGlwIiBkYXRhLXBsYWNlbWVudD0iYm90dG9tIiBkYXRhLW9yaWdpbmFsLXRpdGxlPSJTdWJtaXQgQlVHIGZvciBIZWxwIGFuZCB0cmFja2luZyB0aGUgaXNzdWUuIj4KKyAgICAgICAgICAgICAgICA8YSBocmVmPSJ7e2J1Z3RyYWNrZXItdXJsfX0iIHRhcmdldD0iX2JsYW5rIj48aW1hZ2Ugc3JjPSIvaW1hZ2VzL2J1Zy5wbmciIGNsYXNzPSJpbWFnZV9wcmVfZm9ybWF0Ii8+PC9hPgorICAgICAgICA8L3NwYW4+CisgICAgIHt7L2J1Z3RyYWNrZXItdXJsfX0KKyAgICAgPHNwYW4gZGF0YS10b2dnbGU9InRvb2x0aXAiIGRhdGEtcGxhY2VtZW50PSJib3R0b20iIGRhdGEtb3JpZ2luYWwtdGl0bGU9IlNlYXJjaCB0aHJvdWdoIGFsbCBsb2dzIGZvciBhbnkgdG9wb2xvZ3kuIj4KKyAgICAgICAgICAgICA8YSBocmVmPSIvZGVlcF9zZWFyY2hfcmVzdWx0Lmh0bWwiIHRhcmdldD0iX2JsYW5rIj48aW1hZ2Ugc3JjPSIvaW1hZ2VzL3NlYXJjaC5wbmciIGNsYXNzPSJpbWFnZV9wcmVfZm9ybWF0Ii8+PC9hPgorICAgICA8L3NwYW4+CisgICAgIHt7I3VzZXJ9fQorICAgICAgICA8c3BhbiBkYXRhLXRvZ2dsZT0idG9vbHRpcCIgZGF0YS1wbGFjZW1lbnQ9ImJvdHRvbSIgZGF0YS1vcmlnaW5hbC10aXRsZT0iVGhpcyBzaG91bGQgYmUgeW91LiI+CisgICAgICAgICAgICAgICAgVXNlcjoge3t1c2VyfX0KKyAgICAgICAgPC9zcGFuPgorICAgICB7ey91c2VyfX0KKyA8L2Rpdj4KIDwvc2NyaXB0PgpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS9zcmMvdWkvcHVibGljL3RvcG9sb2d5Lmh0bWwgYi9zdG9ybS1jb3JlL3NyYy91aS9wdWJsaWMvdG9wb2xvZ3kuaHRtbAppbmRleCAyYjEyMTRjLi41ODY5ZDlhIDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3NyYy91aS9wdWJsaWMvdG9wb2xvZ3kuaHRtbAorKysgYi9zdG9ybS1jb3JlL3NyYy91aS9wdWJsaWMvdG9wb2xvZ3kuaHRtbApAQCAtNDgsMTIgKzQ4LDIyIEBACiAgICAgPGRpdiBpZD0idWktdXNlciIgY2xhc3M9ImNvbC1tZC0xIj48L2Rpdj4KICAgPC9kaXY+CiAgIDxkaXYgY2xhc3M9InJvdyI+CisgICAgICA8ZGl2IGNsYXNzPSJjb2wtbWQtMTIiIGlkPSJzZWFyY2gtZm9ybSI+CisgICAgICA8L2Rpdj4KKyAgPC9kaXY+CisgIDxkaXYgY2xhc3M9InJvdyI+CiAgICAgPGRpdiBjbGFzcz0iY29sLW1kLTEyIj4KICAgICAgIDxoMj5Ub3BvbG9neSBzdW1tYXJ5PC9oMj4KICAgICAgIDxkaXYgaWQ9InRvcG9sb2d5LXN1bW1hcnkiPjwvZGl2PgogICAgIDwvZGl2PgogICA8L2Rpdj4KICAgPGRpdiBjbGFzcz0icm93Ij4KKyAgICAgIDxkaXYgY2xhc3M9ImNvbC1tZC0xMiI+CisgICAgICAgICAgPGgyIGlkPSJ0b3BvbG9neS1yZXNvdXJjZXMtaGVhZGVyIj5Ub3BvbG9neSByZXNvdXJjZXM8L2gyPgorICAgICAgICAgIDxkaXYgaWQ9InRvcG9sb2d5LXJlc291cmNlcyI+PC9kaXY+CisgICAgICA8L2Rpdj4KKyAgPC9kaXY+CisgIDxkaXYgY2xhc3M9InJvdyI+CiAgICAgPGRpdiBpZD0idG9wb2xvZ3ktYWN0aW9ucyIgY2xhc3M9ImNvbC1tZC0xMiI+PC9kaXY+CiAgIDwvZGl2PgogICA8ZGl2IGNsYXNzPSJyb3ciPgpAQCAtODIsNiArOTIsMTQ2IEBACiA8L2Rpdj4KIDwvYm9keT4KIDxzY3JpcHQ+CisKK3ZhciB0b2dnbGVDaGFuZ2VMb2dMZXZlbDsKKworZnVuY3Rpb24gY2xvc2VDaGFuZ2VMb2dMZXZlbCAoKXsKKyAgICB2YXIgY29udGFpbmVyID0gJCgiI2NoYW5nZS1sb2ctbGV2ZWwiKTsKKyAgICBjb250YWluZXIuaGlkZSgpOworfQorCitmdW5jdGlvbiBjbGVhckxvZ2dlckxldmVsKGlkKXsKKyAgICAkKCIjbG9nZ2VyUmVtb3ZlLSIgKyBpZCkudmFsKCJ0cnVlIik7CisgICAgc2VuZExvZ2dlckxldmVsKGlkKTsKKyAgICAkKCIjbG9nZ2VyLSIgKyBpZCkucmVtb3ZlKCk7Cit9CisKK2Z1bmN0aW9uIHNlbmRMb2dnZXJMZXZlbChpZCl7CisgICAgdmFyIHRvcG9sb2d5SWQgPSAkLnVybCgiP2lkIik7CisgICAgdmFyIHNob3VsZFJlbW92ZSA9ICQoIiNsb2dnZXJSZW1vdmUtIiArIGlkKS52YWwoKSA9PT0gInRydWUiOworICAgIHZhciBsZXZlbCA9ICQoIiNsb2dnZXJMZXZlbC0iICsgaWQpLnZhbCgpOworICAgIHZhciB0aW1lb3V0ID0gcGFyc2VJbnQoJCgiI2xvZ2dlclRpbWVvdXQtIiArIGlkKS52YWwoKSk7CisgICAgICAgIHRpbWVvdXQgPSBpc05hTih0aW1lb3V0KSA/IDAgOiB0aW1lb3V0OworICAgIHZhciBsb2dnZXJOYW1lID0gJCgiI2xvZ2dlck5hbWUtIiArIGlkKS52YWwoKTsKKyAgICBpZiAobGV2ZWwgPT09ICdQaWNrIExldmVsJyl7CisgICAgICAgIGFsZXJ0ICgnUGxlYXNlIHBpY2sgYSB2YWxpZCBsb2cgbGV2ZWwnKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICB2YXIgbGV2ZWxCZWxvd0luZm8gPSBsZXZlbCA9PT0gJ0RFQlVHJzsKKworICAgIGlmICghc2hvdWxkUmVtb3ZlICYmIGxldmVsQmVsb3dJbmZvICYmIHRpbWVvdXQgPD0gMCl7CisgICAgICAgIHRpbWVvdXQgPSBwYXJzZUludCAoCisgICAgICAgICAgICBwcm9tcHQgKCJZb3UgbXVzdCBwcm92aWRlIGEgdGltZW91dCA+IDAgZm9yIERFQlVHIGxvZyBsZXZlbC4gV2hhdCB0aW1lb3V0IHdvdWxkIHlvdSBsaWtlIChzZWNzKT8iLCAzMCkpOworICAgICAgICBpZiAoIXRpbWVvdXQpeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIHZhciBkYXRhID0ge307CisgICAgdmFyIGxvZ2dlclNldHRpbmc7CisKKyAgICBpZiAoaWQgPT09IDApIHsKKyAgICAgICAgZGF0YVsibmFtZWRMb2dnZXJMZXZlbHMiXSA9IHt9OworICAgICAgICBkYXRhWyJuYW1lZExvZ2dlckxldmVscyJdWyJST09UIl0gPSB7fTsKKyAgICAgICAgbG9nZ2VyU2V0dGluZyA9IGRhdGFbIm5hbWVkTG9nZ2VyTGV2ZWxzIl1bIlJPT1QiXTsKKyAgICB9IGVsc2UgeworICAgICAgICBkYXRhWyJuYW1lZExvZ2dlckxldmVscyJdID0ge307CisgICAgICAgIGRhdGFbIm5hbWVkTG9nZ2VyTGV2ZWxzIl1bbG9nZ2VyTmFtZV0gPSB7fTsKKyAgICAgICAgbG9nZ2VyU2V0dGluZyA9IGRhdGFbIm5hbWVkTG9nZ2VyTGV2ZWxzIl1bbG9nZ2VyTmFtZV07CisgICAgfQorCisgICAgbG9nZ2VyU2V0dGluZy50YXJnZXRfbGV2ZWwgPSBzaG91bGRSZW1vdmUgPyBudWxsIDogbGV2ZWw7CisgICAgbG9nZ2VyU2V0dGluZy5yZXNldF9sZXZlbCAgPSAiSU5GTyI7CisgICAgbG9nZ2VyU2V0dGluZy50aW1lb3V0ID0gdGltZW91dDsKKworICAgIHNlbmRSZXF1ZXN0ICh0b3BvbG9neUlkLCAibG9nY29uZmlnIiwgbnVsbCwgZGF0YSwgdG9nZ2xlQ2hhbmdlTG9nTGV2ZWwpOworfTsKKworZnVuY3Rpb24gcmVuZGVyTG9nTGV2ZWxGb3JtICh0ZW1wbGF0ZSwgcmVzcG9uc2VEYXRhKXsKKyAgICB2YXIgdG9wb2xvZ3lJZCA9ICQudXJsKCI/aWQiKTsKKyAgICB2YXIgY29udGFpbmVyID0gJCgiI2NoYW5nZS1sb2ctbGV2ZWwiKTsKKworICAgIHZhciBsZXZlbHMgPSBbCisgICAgICAgIHtuYW1lOiAiUGljayBMZXZlbCJ9LAorICAgICAgICB7bmFtZTogIkFMTCJ9LAorICAgICAgICB7bmFtZTogIlRSQUNFIn0sCisgICAgICAgIHtuYW1lOiAiREVCVUcifSwKKyAgICAgICAge25hbWU6ICJJTkZPIiB9LAorICAgICAgICB7bmFtZTogIldBUk4iIH0sCisgICAgICAgIHtuYW1lOiAiRVJST1IifSwKKyAgICAgICAge25hbWU6ICJGQVRBTCJ9LAorICAgICAgICB7bmFtZTogIk9GRiJ9CisgICAgXTsKKyAgICB2YXIgcGFydGlhbFRlbXBsYXRlcyA9ICQodGVtcGxhdGUpLmZpbHRlcignLnBhcnRpYWxzJyk7CisgICAgdmFyIHBhcnRpYWxzID0ge307CisKKyAgICAkLmVhY2gocGFydGlhbFRlbXBsYXRlcywgZnVuY3Rpb24gKGl4LCBwYXJ0aWFsKXsKKyAgICAgICAgdmFyIG9iaiA9ICQocGFydGlhbCk7CisgICAgICAgIHBhcnRpYWxzIFtvYmouYXR0cignaWQnKV0gPSBvYmouaHRtbCgpOyAKKyAgICB9KTsKKworICAgIHZhciBsb2dMZXZlbFRlbXBsYXRlID0gJCh0ZW1wbGF0ZSkuZmlsdGVyKCIjdG9wb2xvZ3ktY2hhbmdlLWxvZy1sZXZlbC10ZW1wbGF0ZSIpLmh0bWwoKTsKKworICAgIHZhciBjYWxjQWJzb2x1dGVUaW1lb3V0ID0gZnVuY3Rpb24gKHRpbWVvdXRfZXBvY2gpIHsKKyAgICAgICAgdmFyIGFic29sdXRlVGltZW91dCA9ICIiOworICAgICAgICBpZiAodGltZW91dF9lcG9jaCkgeworICAgICAgICAgICAgdmFyIGQgPSBuZXcgRGF0ZSgwKTsgCisgICAgICAgICAgICBkLnNldFVUQ1NlY29uZHModGltZW91dF9lcG9jaCAvIDEwMDApOworICAgICAgICAgICAgYWJzb2x1dGVUaW1lb3V0ID0gZC50b0xvY2FsZURhdGVTdHJpbmcoKSArICIgIiArIGQudG9Mb2NhbGVUaW1lU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFic29sdXRlVGltZW91dDsKKyAgICB9OworICAgIHZhciByZW5kZXJJbXBsID0gZnVuY3Rpb24gKGRhdGEpeworICAgICAgICB2YXIgbG9nZ2VycyA9IFtdOworICAgICAgICB2YXIgbG9nZ2VyQ291bnQgPSAxOworICAgICAgICB2YXIgb2JqID0gZGF0YS5uYW1lZExvZ2dlckxldmVsczsKKyAgICAgICAgaWYgKCFvYmopIHsKKyAgICAgICAgICAgIG9iaiA9IHt9OworICAgICAgICAgICAgZGF0YS5uYW1lZExvZ2dlckxldmVscyA9IG9iajsKKyAgICAgICAgfQorCisgICAgICAgIHZhciBzb3J0ZWRMb2dnZXJzID0gT2JqZWN0LmtleXMob2JqKS5zb3J0KGZ1bmN0aW9uIChsMSwgbDIpeworICAgICAgICAgICAgaWYgKGwxID09PSAiUk9PVCIpIHJldHVybiAtMTsKKyAgICAgICAgICAgIGlmIChsMiA9PT0gIlJPT1QiKSByZXR1cm4gMTsKKyAgICAgICAgICAgIHJldHVybiBsMSA+IGwyOworICAgICAgICB9KTsKKworICAgICAgICBzb3J0ZWRMb2dnZXJzLmZvckVhY2ggKGZ1bmN0aW9uIChsKXsKKyAgICAgICAgICAgIHZhciBvYmogPSBkYXRhLm5hbWVkTG9nZ2VyTGV2ZWxzW2xdOworICAgICAgICAgICAgb2JqLmxvZ2dlcklkID0gbG9nZ2VyQ291bnQrKzsKKyAgICAgICAgICAgIG9iai5sb2dnZXJOYW1lID0gbDsKKyAgICAgICAgICAgIG9iai5uYW1lZCA9IGwgIT0gIlJPT1QiOworICAgICAgICAgICAgb2JqLmNscyA9ICJuYW1lZExvZ2dlcnMiOworICAgICAgICAgICAgb2JqLmxldmVsU2VsZWN0ZWQgPSBmdW5jdGlvbiAob2JqKXsKKyAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCl7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5hbWUgPT09IG9iai50YXJnZXRfbGV2ZWwgPyAic2VsZWN0ZWQiIDogIiI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfShvYmopOworICAgICAgICAgICAgb2JqLmFic29sdXRlVGltZW91dCA9IGNhbGNBYnNvbHV0ZVRpbWVvdXQgKG9iai50aW1lb3V0X2Vwb2NoKTsKKyAgICAgICAgICAgIG9iai5jYW5DbGVhciA9IHRydWU7CisgICAgICAgICAgICBsb2dnZXJzLnB1c2gob2JqKTsKKyAgICAgICAgfSk7CisKKyAgICAgICAgbG9nZ2Vycy5wdXNoKHsKKyAgICAgICAgICAgIGxvZ2dlcklkOiBsb2dnZXJDb3VudCwKKyAgICAgICAgICAgIGlzTmV3OiB0cnVlLAorICAgICAgICAgICAgY2xzOiAnbmV3TG9nZ2VyJworICAgICAgICB9KTsKKworICAgICAgICB2YXIgdG1wbERhdGEgPSB7CisgICAgICAgICAgICBsb2dnZXJzOiBsb2dnZXJzLAorICAgICAgICAgICAgbGV2ZWxzOiBsZXZlbHMKKyAgICAgICAgfTsKKworICAgICAgICBjb250YWluZXIuaHRtbChNdXN0YWNoZS5yZW5kZXIobG9nTGV2ZWxUZW1wbGF0ZSwgdG1wbERhdGEsIHBhcnRpYWxzKSk7CisgICAgICAgIGNvbnRhaW5lci5zaG93KCdmYXN0Jyk7CisgICAgfTsKKyAgICBpZiAoIXJlc3BvbnNlRGF0YSkgeworICAgICAgICB2YXIgdG9wb2xvZ3lJZCA9ICQudXJsKCI/aWQiKTsKKyAgICAgICAgJC5nZXQgKCcvYXBpL3YxL3RvcG9sb2d5LycgKyB0b3BvbG9neUlkICsgJy9sb2djb25maWcnLCByZW5kZXJJbXBsKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZW5kZXJJbXBsIChyZXNwb25zZURhdGEpOworICAgIH0KK30gCiAkKGRvY3VtZW50KS5hamF4U3RvcCgkLnVuYmxvY2tVSSk7CiAkKGRvY3VtZW50KS5hamF4U3RhcnQoZnVuY3Rpb24oKXsKICAgICBpZiAoJCgiI3RvcG9sb2d5LXZpc3VhbGl6YXRpb24iKS5jaGlsZHJlbigpLnNpemUoKSA9PSAwKSB7CkBAIC0xMjUsMTcgKzI3NSwyOSBAQAogICAgICAgICB9KTsKIAogICAgICAgICB2YXIgdG9wb2xvZ3lTdW1tYXJ5ID0gJCgiI3RvcG9sb2d5LXN1bW1hcnkiKTsKKyAgICAgICAgdmFyIHRvcG9sb2d5UmVzb3VyY2VzID0gJCgiI3RvcG9sb2d5LXJlc291cmNlcyIpOwogICAgICAgICB2YXIgdG9wb2xvZ3lTdGF0cyA9ICQoIiN0b3BvbG9neS1zdGF0cyIpOwogICAgICAgICB2YXIgc3BvdXRTdGF0cyA9ICQoIiNzcG91dC1zdGF0cyIpOwogICAgICAgICB2YXIgYm9sdFN0YXRzID0gJCgiI2JvbHQtc3RhdHMiKTsKICAgICAgICAgdmFyIGNvbmZpZyA9ICQoIiN0b3BvbG9neS1jb25maWd1cmF0aW9uIik7CiAgICAgICAgIHZhciB0b3BvbG9neUFjdGlvbnMgPSAkKCIjdG9wb2xvZ3ktYWN0aW9ucyIpOwogICAgICAgICB2YXIgdG9wb2xvZ3lWaXN1YWxpemF0aW9uID0gJCgiI3RvcG9sb2d5LXZpc3VhbGl6YXRpb24iKQorICAgICAgICB2YXIgc2VhcmNoRm9ybSA9ICQoIiNzZWFyY2gtZm9ybSIpCiAgICAgICAgIHZhciBmb3JtYXR0ZWRDb25maWcgPSBmb3JtYXRDb25maWdEYXRhKHJlc3BvbnNlWyJjb25maWd1cmF0aW9uIl0pOwogICAgICAgICB2YXIgYnV0dG9uSnNvbkRhdGEgPSB0b3BvbG9neUFjdGlvbkpzb24ocmVzcG9uc2VbImlkIl0scmVzcG9uc2VbImVuY29kZWRJZCJdLHJlc3BvbnNlWyJuYW1lIl0scmVzcG9uc2VbInN0YXR1cyJdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAscmVzcG9uc2VbIm1zZ1RpbWVvdXQiXSxyZXNwb25zZVsiZGVidWciXSxyZXNwb25zZVsic2FtcGxpbmdQY3QiXSk7Ci0gICAgICAgICQuZ2V0KCIvdGVtcGxhdGVzL3RvcG9sb2d5LXBhZ2UtdGVtcGxhdGUuaHRtbCIsIGZ1bmN0aW9uKHRlbXBsYXRlKSB7CisgICAgICAgICQuYWpheCAoe3VybDogIi90ZW1wbGF0ZXMvdG9wb2xvZ3ktcGFnZS10ZW1wbGF0ZS5odG1sIiwgc3VjY2VzczogZnVuY3Rpb24odGVtcGxhdGUpIHsKKyAgICAgICAgICAgIHRvZ2dsZUNoYW5nZUxvZ0xldmVsID0gZnVuY3Rpb24gKGRhdGEpIHsKKyAgICAgICAgICAgICAgcmVuZGVyTG9nTGV2ZWxGb3JtICh0ZW1wbGF0ZSwgZGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZWFyY2hGb3JtLmFwcGVuZChNdXN0YWNoZS5yZW5kZXIoJCh0ZW1wbGF0ZSkuZmlsdGVyKCIjc2VhcmNoLWZvcm0tdGVtcGxhdGUiKS5odG1sKCkse2lkOiB0b3BvbG9neUlkfSkpOwogICAgICAgICAgICAgdG9wb2xvZ3lTdW1tYXJ5LmFwcGVuZChNdXN0YWNoZS5yZW5kZXIoJCh0ZW1wbGF0ZSkuZmlsdGVyKCIjdG9wb2xvZ3ktc3VtbWFyeS10ZW1wbGF0ZSIpLmh0bWwoKSxyZXNwb25zZSkpOworICAgICAgICAgICAgdG9wb2xvZ3lSZXNvdXJjZXMuYXBwZW5kKE11c3RhY2hlLnJlbmRlcigkKHRlbXBsYXRlKS5maWx0ZXIoIiN0b3BvbG9neS1yZXNvdXJjZXMtdGVtcGxhdGUiKS5odG1sKCkscmVzcG9uc2UpKTsKKyAgICAgICAgICAgIHZhciBkaXNwbGF5UmVzb3VyY2UgPSByZXNwb25zZVsic2NoZWR1bGVyRGlzcGxheVJlc291cmNlIl07CisgICAgICAgICAgICBpZiAoIWRpc3BsYXlSZXNvdXJjZSl7CisgICAgICAgICAgICAgICAgJCgnI3RvcG9sb2d5LXJlc291cmNlcy1oZWFkZXInKS5oaWRlKCk7CisgICAgICAgICAgICAgICAgJCgnI3RvcG9sb2d5LXJlc291cmNlcycpLmhpZGUoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHRvcG9sb2d5QWN0aW9ucy5hcHBlbmQoTXVzdGFjaGUucmVuZGVyKCQodGVtcGxhdGUpLmZpbHRlcigiI3RvcG9sb2d5LWFjdGlvbnMtdGVtcGxhdGUiKS5odG1sKCksYnV0dG9uSnNvbkRhdGEpKTsKICAgICAgICAgICAgIHRvcG9sb2d5U3RhdHMuYXBwZW5kKE11c3RhY2hlLnJlbmRlcigkKHRlbXBsYXRlKS5maWx0ZXIoIiN0b3BvbG9neS1zdGF0cy10ZW1wbGF0ZSIpLmh0bWwoKSxyZXNwb25zZSkpOwogICAgICAgICAgICAgLy93aW5kb3csIGVtaXR0ZWQsIHRyYW5zZmVycmVkLCBjb21wbGV0ZSBsYXRlbmN5LCBhY2tlZCwgZmFpbGVkCkBAIC0yMjIsOCArMzg0LDggQEAKICAgICAgICAgICAgICQoJyN0b3BvbG9neS1jb25maWd1cmF0aW9uIFtkYXRhLXRvZ2dsZT0idG9vbHRpcCJdJykudG9vbHRpcCgpOwogICAgICAgICAgICAgJCgnI3RvcG9sb2d5LWFjdGlvbnMgW2RhdGEtdG9nZ2xlPSJ0b29sdGlwIl0nKS50b29sdGlwKCk7CiAgICAgICAgICAgICAkKCcjdG9wb2xvZ3ktdmlzdWFsaXphdGlvbiBbZGF0YS10b2dnbGU9InRvb2x0aXAiXScpLnRvb2x0aXAoKTsKLSAgICAgICAgfSk7CisgICAgICB9fSk7CiAgICAgfSk7CiAgfSk7CiA8L3NjcmlwdD4KLTwvaHRtbD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCis8L2h0bWw+CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3Rlc3QvY2xqL2JhY2t0eXBlL3N0b3JtL2NsdXN0ZXJfdGVzdC5jbGogYi9zdG9ybS1jb3JlL3Rlc3QvY2xqL2JhY2t0eXBlL3N0b3JtL2NsdXN0ZXJfdGVzdC5jbGoKaW5kZXggYjQxM2Q0My4uZWVhNDYzNyAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS90ZXN0L2Nsai9iYWNrdHlwZS9zdG9ybS9jbHVzdGVyX3Rlc3QuY2xqCisrKyBiL3N0b3JtLWNvcmUvdGVzdC9jbGovYmFja3R5cGUvc3Rvcm0vY2x1c3Rlcl90ZXN0LmNsagpAQCAtMjMsNiArMjMsNyBAQAogICAoOmltcG9ydCBbb3JnLm1vY2tpdG8uZXhjZXB0aW9ucy5iYXNlIE1vY2tpdG9Bc3NlcnRpb25FcnJvcl0pCiAgICg6aW1wb3J0IFtvcmcuYXBhY2hlLmN1cmF0b3IuZnJhbWV3b3JrIEN1cmF0b3JGcmFtZXdvcmsgQ3VyYXRvckZyYW1ld29ya0ZhY3RvcnkgQ3VyYXRvckZyYW1ld29ya0ZhY3RvcnkkQnVpbGRlcl0pCiAgICg6aW1wb3J0IFtiYWNrdHlwZS5zdG9ybS51dGlscyBVdGlscyBUZXN0VXRpbHMgWm9va2VlcGVyQXV0aEluZm9dKQorICAoOmltcG9ydCBbYmFja3R5cGUuc3Rvcm0uY2x1c3RlciBDbHVzdGVyU3RhdGVdKQogICAoOnJlcXVpcmUgW2JhY2t0eXBlLnN0b3JtIFt6b29rZWVwZXIgOmFzIHprXV0pCiAgICg6cmVxdWlyZSBbY29uanVyZS5jb3JlXSkKICAgKDp1c2UgW2Nvbmp1cmUgY29yZV0pCkBAIC0xNzAsOCArMTcxLDggQEAKIChkZWZ0ZXN0IHRlc3Qtc3Rvcm0tY2x1c3Rlci1zdGF0ZS1iYXNpY3MKICAgKHdpdGgtaW5wcm9jZXNzLXpvb2tlZXBlciB6ay1wb3J0CiAgICAgKGxldCBbc3RhdGUgKG1rLXN0b3JtLXN0YXRlIHprLXBvcnQpCi0gICAgICAgICAgYXNzaWdubWVudDEgKEFzc2lnbm1lbnQuICIvYWFhIiB7fSB7WzFdIFsiMSIgMTAwMSAxXX0ge30pCi0gICAgICAgICAgYXNzaWdubWVudDIgKEFzc2lnbm1lbnQuICIvYWFhIiB7fSB7WzJdIFsiMiIgMjAwMl19IHt9KQorICAgICAgICAgIGFzc2lnbm1lbnQxIChBc3NpZ25tZW50LiAiL2FhYSIge30ge1sxXSBbIjEiIDEwMDEgMV19IHt9IHt9KQorICAgICAgICAgIGFzc2lnbm1lbnQyIChBc3NpZ25tZW50LiAiL2FhYSIge30ge1syXSBbIjIiIDIwMDJdfSB7fSB7fSkKICAgICAgICAgICBuaW1idXNJbmZvMSAoTmltYnVzSW5mby4gIm5pbWJ1czEiIDY2NjcgZmFsc2UpCiAgICAgICAgICAgbmltYnVzSW5mbzIgKE5pbWJ1c0luZm8uICJuaW1idXMyIiA2NjY3IGZhbHNlKQogICAgICAgICAgIG5pbWJ1c1N1bW1hcnkxIChOaW1idXNTdW1tYXJ5LiAibmltYnVzMSIgNjY2NyAoY3VycmVudC10aW1lLXNlY3MpIGZhbHNlICJ2MSIpCkBAIC0yNjQsOCArMjY1LDggQEAKICAgKHdpdGgtaW5wcm9jZXNzLXpvb2tlZXBlciB6ay1wb3J0CiAgICAgKGxldCBbc3RhdGUxIChtay1zdG9ybS1zdGF0ZSB6ay1wb3J0KQogICAgICAgICAgIHN0YXRlMiAobWstc3Rvcm0tc3RhdGUgemstcG9ydCkKLSAgICAgICAgICBzdXBlcnZpc29yLWluZm8xIChTdXBlcnZpc29ySW5mby4gMTAgImhvc3RuYW1lLTEiICJpZDEiIFsxIDJdIFtdIHt9IDEwMDAgIjAuOS4yIikKLSAgICAgICAgICBzdXBlcnZpc29yLWluZm8yIChTdXBlcnZpc29ySW5mby4gMTAgImhvc3RuYW1lLTIiICJpZDIiIFsxIDJdIFtdIHt9IDEwMDAgIjAuOS4yIikKKyAgICAgICAgICBzdXBlcnZpc29yLWluZm8xIChTdXBlcnZpc29ySW5mby4gMTAgImhvc3RuYW1lLTEiICJpZDEiIFsxIDJdIFtdIHt9IDEwMDAgIjAuOS4yIiBuaWwpCisgICAgICAgICAgc3VwZXJ2aXNvci1pbmZvMiAoU3VwZXJ2aXNvckluZm8uIDEwICJob3N0bmFtZS0yIiAiaWQyIiBbMSAyXSBbXSB7fSAxMDAwICIwLjkuMiIgbmlsKQogICAgICAgICAgIF0KICAgICAgIChpcyAoPSBbXSAoLnN1cGVydmlzb3JzIHN0YXRlMSBuaWwpKSkKICAgICAgICguc3VwZXJ2aXNvci1oZWFydGJlYXQhIHN0YXRlMiAiMiIgc3VwZXJ2aXNvci1pbmZvMikKQEAgLTMxMiw5ICszMTMsOSBAQAogICAgICAgKG1rLWRpc3RyaWJ1dGVkLWNsdXN0ZXItc3RhdGUge30pCiAgICAgICAodmVyaWZ5LWNhbGwtdGltZXMtZm9yIHprL21rZGlycyAxKQogICAgICAgKHZlcmlmeS1maXJzdC1jYWxsLWFyZ3MtZm9yLWluZGljZXMgemsvbWtkaXJzIFsyXSBuaWwpKQotICAgIChzdHViYmluZyBbbWstZGlzdHJpYnV0ZWQtY2x1c3Rlci1zdGF0ZSBuaWwKLSAgICAgICAgICAgICAgIHJlZ2lzdGVyIG5pbAotICAgICAgICAgICAgICAgbWtkaXJzIG5pbF0KKyAgICAoc3R1YmJpbmcgW21rLWRpc3RyaWJ1dGVkLWNsdXN0ZXItc3RhdGUgKHJlaWZ5IENsdXN0ZXJTdGF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZWdpc3RlciBbdGhpcyBjYWxsYmFja10gbmlsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChta2RpcnMgW3RoaXMgcGF0aCBhY2xzXSBuaWwpKV0KICAgICAgIChtay1zdG9ybS1jbHVzdGVyLXN0YXRlIHt9KQogICAgICAgKHZlcmlmeS1jYWxsLXRpbWVzLWZvciBtay1kaXN0cmlidXRlZC1jbHVzdGVyLXN0YXRlIDEpCiAgICAgICAodmVyaWZ5LWZpcnN0LWNhbGwtYXJncy1mb3ItaW5kaWNlcyBtay1kaXN0cmlidXRlZC1jbHVzdGVyLXN0YXRlIFs0XSBuaWwpKSkpCmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3Rlc3QvY2xqL2JhY2t0eXBlL3N0b3JtL2NvbmZpZ190ZXN0LmNsaiBiL3N0b3JtLWNvcmUvdGVzdC9jbGovYmFja3R5cGUvc3Rvcm0vY29uZmlnX3Rlc3QuY2xqCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OTAzMmJkLi4wMDAwMDAwCi0tLSBhL3N0b3JtLWNvcmUvdGVzdC9jbGovYmFja3R5cGUvc3Rvcm0vY29uZmlnX3Rlc3QuY2xqCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLTs7IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLTs7IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotOzsgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLTs7IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLTs7IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLTs7ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLTs7IHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLTs7Ci07OyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLTs7Ci07OyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi07OyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotOzsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi07OyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi07OyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLShucyBiYWNrdHlwZS5zdG9ybS5jb25maWctdGVzdAotICAoOmltcG9ydCBbYmFja3R5cGUuc3Rvcm0gQ29uZmlnIENvbmZpZ1ZhbGlkYXRpb25dKQotICAoOmltcG9ydCBbYmFja3R5cGUuc3Rvcm0uc2NoZWR1bGVyIFRvcG9sb2d5RGV0YWlsc10pCi0gICg6aW1wb3J0IFtiYWNrdHlwZS5zdG9ybS51dGlscyBVdGlsc10pCi0gICg6dXNlIFtjbG9qdXJlIHRlc3RdKQotICAoOnVzZSBbYmFja3R5cGUuc3Rvcm0gY29uZmlnIHV0aWxdKQotICApCi0KLShkZWZ0ZXN0IHRlc3QtdmFsaWRpdHkKLSAgKGlzIChVdGlscy9pc1ZhbGlkQ29uZiB7VE9QT0xPR1ktREVCVUcgdHJ1ZSAicSIgImFzYXNkYXNkIiAiYWFhIiAoSW50ZWdlci4gIjEyMyIpICJiYmIiIChMb25nLiAiNDU2IikgImVlZSIgWzEgMiAoSW50ZWdlci4gIjMiKSAoTG9uZy4gIjQiKV19KSkKLSAgKGlzIChub3QgKFV0aWxzL2lzVmFsaWRDb25mIHsicXFxIiAoYmFja3R5cGUuc3Rvcm0udXRpbHMuVXRpbHMuKX0pKSkKLSAgKQotCi0oZGVmdGVzdCB0ZXN0LXBvd2VyLW9mLTItdmFsaWRhdG9yCi0gIChsZXQgW3ZhbGlkYXRvciBDb25maWdWYWxpZGF0aW9uL1Bvd2VyT2YyVmFsaWRhdG9yXQotICAgIChkb3NlcSBbeCBbNDIuNDIgNDIgMjM0MjM0MjM0MjMgLTMzIC0zMiAtMSAtMC4wMDAwMSAwIC0wICJGb3J0eS10d28iXV0KLSAgICAgIChpcyAodGhyb3duLWNhdXNlPyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICAgICgudmFsaWRhdGVGaWVsZCB2YWxpZGF0b3IgInRlc3QiIHgpKSkpCi0KLSAgICAoZG9zZXEgW3ggWzY0IDQyOTQ5NjcyOTYgMSBuaWxdXQotICAgICAgKGlzIChuaWw/ICh0cnkKLSAgICAgICAgICAgICAgICAgICgudmFsaWRhdGVGaWVsZCB2YWxpZGF0b3IgInRlc3QiIHgpCi0gICAgICAgICAgICAgICAgICAoY2F0Y2ggRXhjZXB0aW9uIGUgZSkpKSkpKSkKLQotKGRlZnRlc3QgdGVzdC1saXN0LXZhbGlkYXRvcgotICAobGV0IFt2YWxpZGF0b3IgQ29uZmlnVmFsaWRhdGlvbi9TdHJpbmdzVmFsaWRhdG9yXQotICAgIChkb3NlcSBbeCBbCi0gICAgICAgICAgICAgICBbIkZvcnR5LXR3byIgNDJdCi0gICAgICAgICAgICAgICBbNDJdCi0gICAgICAgICAgICAgICBbdHJ1ZSAiZmFsc2UiXQotICAgICAgICAgICAgICAgW25pbF0KLSAgICAgICAgICAgICAgIFtuaWwgIm5pbCJdCi0gICAgICAgICAgICAgIF1dCi0gICAgICAoaXMgKHRocm93bi1jYXVzZS13aXRoLW1zZz8KLSAgICAgICAgICAgIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIyIoP2kpLiplYWNoIGVsZW1lbnQuKiIKLSAgICAgICAgKC52YWxpZGF0ZUZpZWxkIHZhbGlkYXRvciAidGVzdCIgeCkpKSkKLQotICAgIChkb3NlcSBbeCBbIm5vdCBhIGxpc3QgYXQgYWxsIl1dCi0gICAgICAoaXMgKHRocm93bi1jYXVzZS13aXRoLW1zZz8KLSAgICAgICAgICAgIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gIyIoP2kpLiptdXN0IGJlIGFuIGl0ZXJhYmxlLioiCi0gICAgICAgICgudmFsaWRhdGVGaWVsZCB2YWxpZGF0b3IgInRlc3QiIHgpKSkpCi0KLSAgICAoZG9zZXEgW3ggWwotICAgICAgICAgICAgICAgWyJvbmUiICJ0d28iICJ0aHJlZSJdCi0gICAgICAgICAgICAgICBbIiJdCi0gICAgICAgICAgICAgICBbIjQyIiAiNjQiXQotICAgICAgICAgICAgICAgbmlsCi0gICAgICAgICAgICAgIF1dCi0gICAgKGlzIChuaWw/ICh0cnkKLSAgICAgICAgICAgICAgICAoLnZhbGlkYXRlRmllbGQgdmFsaWRhdG9yICJ0ZXN0IiB4KQotICAgICAgICAgICAgICAgIChjYXRjaCBFeGNlcHRpb24gZSBlKSkpKSkpKQotCi0oZGVmdGVzdCB0ZXN0LWludGVnZXItdmFsaWRhdG9yCi0gIChsZXQgW3ZhbGlkYXRvciBDb25maWdWYWxpZGF0aW9uL0ludGVnZXJWYWxpZGF0b3JdCi0gICAgKC52YWxpZGF0ZUZpZWxkIHZhbGlkYXRvciAidGVzdCIgbmlsKQotICAgICgudmFsaWRhdGVGaWVsZCB2YWxpZGF0b3IgInRlc3QiIDEwMDApCi0gICAgKGlzICh0aHJvd24tY2F1c2U/IGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgICAgICAoLnZhbGlkYXRlRmllbGQgdmFsaWRhdG9yICJ0ZXN0IiAxLjM0KSkpCi0gICAgKGlzICh0aHJvd24tY2F1c2U/IGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgICAgICAoLnZhbGlkYXRlRmllbGQgdmFsaWRhdG9yICJ0ZXN0IiAoaW5jIEludGVnZXIvTUFYX1ZBTFVFKSkpKSkpCi0KLShkZWZ0ZXN0IHRlc3QtcG9zLWludGVnZXItdmFsaWRhdG9yCi0gIChsZXQgW3ZhbGlkYXRvciBDb25maWdWYWxpZGF0aW9uL05vdE51bGxQb3NJbnRlZ2VyVmFsaWRhdG9yXQotICAgIChpcyAodGhyb3duLWNhdXNlPyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICAgICgudmFsaWRhdGVGaWVsZCB2YWxpZGF0b3IgInRlc3QiIG5pbCkpKQotICAgICgudmFsaWRhdGVGaWVsZCB2YWxpZGF0b3IgInRlc3QiIDEwMDApCi0gICAgKGlzICh0aHJvd24tY2F1c2U/IGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgICAgICAoLnZhbGlkYXRlRmllbGQgdmFsaWRhdG9yICJ0ZXN0IiAxLjM0KSkpCi0gICAgKGlzICh0aHJvd24tY2F1c2U/IGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgICAgICAoLnZhbGlkYXRlRmllbGQgdmFsaWRhdG9yICJ0ZXN0IiAwKSkpCi0gICAgKGlzICh0aHJvd24tY2F1c2U/IGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgICAgICAoLnZhbGlkYXRlRmllbGQgdmFsaWRhdG9yICJ0ZXN0IiAtMTAwKSkpCi0gICAgKGlzICh0aHJvd24tY2F1c2U/IGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgICAgICAoLnZhbGlkYXRlRmllbGQgdmFsaWRhdG9yICJ0ZXN0IiAoaW5jIEludGVnZXIvTUFYX1ZBTFVFKSkpKSkpCi0KLShkZWZ0ZXN0IHRlc3QtaW50ZWdlcnMtdmFsaWRhdG9yCi0gIChsZXQgW3ZhbGlkYXRvciBDb25maWdWYWxpZGF0aW9uL05vRHVwbGljYXRlSW50ZWdlcnNWYWxpZGF0b3JdCi0gICAgKC52YWxpZGF0ZUZpZWxkIHZhbGlkYXRvciAidGVzdCIgbmlsKQotICAgICgudmFsaWRhdGVGaWVsZCB2YWxpZGF0b3IgInRlc3QiIFsxMDAwIDAgLTEwMDBdKQotICAgIChpcyAodGhyb3duLWNhdXNlPyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICAgICAgKC52YWxpZGF0ZUZpZWxkIHZhbGlkYXRvciAidGVzdCIgWzAgMTAgMTBdKSkpCi0gICAgKGlzICh0aHJvd24tY2F1c2U/IGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgICAgICAoLnZhbGlkYXRlRmllbGQgdmFsaWRhdG9yICJ0ZXN0IiBbMCAxMCAxLjM0XSkpKQotICAgIChpcyAodGhyb3duLWNhdXNlPyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICAgICAgKC52YWxpZGF0ZUZpZWxkIHZhbGlkYXRvciAidGVzdCIgWzAgbmlsXSkpKQotICAgIChpcyAodGhyb3duLWNhdXNlPyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICAgICAgKC52YWxpZGF0ZUZpZWxkIHZhbGlkYXRvciAidGVzdCIgWy0xMDAgKGluYyBJbnRlZ2VyL01BWF9WQUxVRSldKSkpKSkKLQotKGRlZnRlc3QgdGVzdC1wb3NpdGl2ZS1udW1iZXItdmFsaWRhdG9yCi0gIChsZXQgW3ZhbGlkYXRvciBDb25maWdWYWxpZGF0aW9uL1Bvc2l0aXZlTnVtYmVyVmFsaWRhdG9yXQotICAgICgudmFsaWRhdGVGaWVsZCB2YWxpZGF0b3IgInRlc3QiIG5pbCkKLSAgICAoLnZhbGlkYXRlRmllbGQgdmFsaWRhdG9yICJ0ZXN0IiAxLjApCi0gICAgKC52YWxpZGF0ZUZpZWxkIHZhbGlkYXRvciAidGVzdCIgMSkKLSAgICAoaXMgKHRocm93bi1jYXVzZT8gamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAgICAgICgudmFsaWRhdGVGaWVsZCB2YWxpZGF0b3IgInRlc3QiIC0xLjApKSkKLSAgICAoaXMgKHRocm93bi1jYXVzZT8gamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAgICAgICgudmFsaWRhdGVGaWVsZCB2YWxpZGF0b3IgInRlc3QiIC0xKSkpCi0gICAgKGlzICh0aHJvd24tY2F1c2U/IGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgICAgICAoLnZhbGlkYXRlRmllbGQgdmFsaWRhdG9yICJ0ZXN0IiAwKSkpCi0gICAgKGlzICh0aHJvd24tY2F1c2U/IGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgICAgICAoLnZhbGlkYXRlRmllbGQgdmFsaWRhdG9yICJ0ZXN0IiAwLjApKSkpKQotCi0oZGVmdGVzdCB0ZXN0LXRvcG9sb2d5LXdvcmtlcnMtaXMtaW50ZWdlcgotICAobGV0IFt2YWxpZGF0b3IgKENPTkZJRy1TQ0hFTUEtTUFQIFRPUE9MT0dZLVdPUktFUlMpXQotICAgICgudmFsaWRhdGVGaWVsZCB2YWxpZGF0b3IgInRlc3QiIDQyKQotICAgIChpcyAodGhyb3duLWNhdXNlPyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICAoLnZhbGlkYXRlRmllbGQgdmFsaWRhdG9yICJ0ZXN0IiAzLjE0MTU5KSkpKSkKLQotKGRlZnRlc3QgdGVzdC10b3BvbG9neS1zdGF0cy1zYW1wbGUtcmF0ZS1pcy1mbG9hdAotICAobGV0IFt2YWxpZGF0b3IgKENPTkZJRy1TQ0hFTUEtTUFQIFRPUE9MT0dZLVNUQVRTLVNBTVBMRS1SQVRFKV0KLSAgICAoLnZhbGlkYXRlRmllbGQgdmFsaWRhdG9yICJ0ZXN0IiAwLjUpCi0gICAgKC52YWxpZGF0ZUZpZWxkIHZhbGlkYXRvciAidGVzdCIgMTApCi0gICAgKC52YWxpZGF0ZUZpZWxkIHZhbGlkYXRvciAidGVzdCIgRG91YmxlL01BWF9WQUxVRSkpKQotCi0oZGVmdGVzdCB0ZXN0LWlzb2xhdGlvbi1zY2hlZHVsZXItbWFjaGluZXMtaXMtbWFwCi0gIChsZXQgW3ZhbGlkYXRvciAoQ09ORklHLVNDSEVNQS1NQVAgSVNPTEFUSU9OLVNDSEVEVUxFUi1NQUNISU5FUyldCi0gICAgKGlzIChuaWw/ICh0cnkKLSAgICAgICAgICAgICAgICAoLnZhbGlkYXRlRmllbGQgdmFsaWRhdG9yICJ0ZXN0IiB7fSkKLSAgICAgICAgICAgICAgICAoY2F0Y2ggRXhjZXB0aW9uIGUgZSkpKSkKLSAgICAoaXMgKG5pbD8gKHRyeQotICAgICAgICAgICAgICAgICgudmFsaWRhdGVGaWVsZCB2YWxpZGF0b3IgInRlc3QiIHsiaG9zdDAiIDEgImhvc3QxIiAyfSkKLSAgICAgICAgICAgICAgICAoY2F0Y2ggRXhjZXB0aW9uIGUgZSkpKSkKLSAgICAoaXMgKHRocm93bi1jYXVzZT8gamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgICAgKC52YWxpZGF0ZUZpZWxkIHZhbGlkYXRvciAidGVzdCIgNDIpKSkpKQotCi0oZGVmdGVzdCB0ZXN0LXBvc2l0aXZlLWludGVnZXItdmFsaWRhdG9yCi0gIChsZXQgW3ZhbGlkYXRvciBDb25maWdWYWxpZGF0aW9uL1Bvc2l0aXZlSW50ZWdlclZhbGlkYXRvcl0KLSAgICAoZG9zZXEgW3ggWzQyLjQyIC0zMiAwIC0wICJGb3J0eS10d28iXV0KLSAgICAgIChpcyAodGhyb3duLWNhdXNlPyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICAgICgudmFsaWRhdGVGaWVsZCB2YWxpZGF0b3IgInRlc3QiIHgpKSkpCi0KLSAgICAoZG9zZXEgW3ggWzQyIDQyOTQ5NjcyOTYgMSBuaWxdXQotICAgICAgKGlzIChuaWw/ICh0cnkKLSAgICAgICAgICAgICAgICAgICgudmFsaWRhdGVGaWVsZCB2YWxpZGF0b3IgInRlc3QiIHgpCi0gICAgICAgICAgICAgICAgICAoY2F0Y2ggRXhjZXB0aW9uIGUgZSkpKSkpKSkKLQotKGRlZnRlc3QgdGVzdC13b3JrZXItY2hpbGRvcHRzLWlzLXN0cmluZy1vci1zdHJpbmctbGlzdAotICAobGV0IFtwYXNzLWNhc2VzIFtuaWwgInNvbWUgc3RyaW5nIiBbInNvbWUiICJzdHJpbmciICJsaXN0Il1dXQotICAgICh0ZXN0aW5nICJ3b3JrZXIuY2hpbGRvcHRzIHZhbGlkYXRlcyIKLSAgICAgIChsZXQgW3ZhbGlkYXRvciAoQ09ORklHLVNDSEVNQS1NQVAgV09SS0VSLUNISUxET1BUUyldCi0gICAgICAgIChkb3NlcSBbdmFsdWUgcGFzcy1jYXNlc10KLSAgICAgICAgICAoaXMgKG5pbD8gKHRyeQotICAgICAgICAgICAgICAgICAgICAgICgudmFsaWRhdGVGaWVsZCB2YWxpZGF0b3IgInRlc3QiIHZhbHVlKQotICAgICAgICAgICAgICAgICAgICAgIChjYXRjaCBFeGNlcHRpb24gZSBlKSkpKSkKLSAgICAgICAgKGlzICh0aHJvd24tY2F1c2U/IGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KLSAgICAgICAgICAoLnZhbGlkYXRlRmllbGQgdmFsaWRhdG9yICJ0ZXN0IiA0MikpKSkpCi0KLSAgICAodGVzdGluZyAidG9wb2xvZ3kud29ya2VyLmNoaWxkb3B0cyB2YWxpZGF0ZXMiCi0gICAgICAobGV0IFt2YWxpZGF0b3IgKENPTkZJRy1TQ0hFTUEtTUFQIFRPUE9MT0dZLVdPUktFUi1DSElMRE9QVFMpXQotICAgICAgICAoZG9zZXEgW3ZhbHVlIHBhc3MtY2FzZXNdCi0gICAgICAgICAgKGlzIChuaWw/ICh0cnkKLSAgICAgICAgICAgICAgICAgICAgICAoLnZhbGlkYXRlRmllbGQgdmFsaWRhdG9yICJ0ZXN0IiB2YWx1ZSkKLSAgICAgICAgICAgICAgICAgICAgICAoY2F0Y2ggRXhjZXB0aW9uIGUgZSkpKSkpCi0gICAgICAgIChpcyAodGhyb3duLWNhdXNlPyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICAgICAgKC52YWxpZGF0ZUZpZWxkIHZhbGlkYXRvciAidGVzdCIgNDIpKSkpKSkpCi0KLShkZWZ0ZXN0IHRlc3QtYWJzb2x1dGUtc3Rvcm0tbG9jYWwtZGlyCi0gIChsZXQgW3N0b3JtLWhvbWUta2V5ICJzdG9ybS5ob21lIgotICAgICAgICBjb25mLXJlbGF0aXZlIHtTVE9STS1MT0NBTC1ESVIgInN0b3JtLWxvY2FsIn0KLSAgICAgICAgY29uZi1hYnNvbHV0ZSB7U1RPUk0tTE9DQUwtRElSCi0gICAgICAgICAgICAgICAgICAgICAgIChpZiBvbi13aW5kb3dzPwotICAgICAgICAgICAgICAgICAgICAgICAgICJDOlxcc3Rvcm0tbG9jYWwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIi92YXIvc3Rvcm0tbG9jYWwiKX1dCi0gICAgKHRlc3RpbmcKLSAgICAgICJmb3IgcmVsYXRpdmUgcGF0aCIKLSAgICAgIChpcyAoPSAoc3RyIChTeXN0ZW0vZ2V0UHJvcGVydHkgc3Rvcm0taG9tZS1rZXkpIGZpbGUtcGF0aC1zZXBhcmF0b3IgKGNvbmYtcmVsYXRpdmUgU1RPUk0tTE9DQUwtRElSKSkKLSAgICAgICAgICAgICAoYWJzb2x1dGUtc3Rvcm0tbG9jYWwtZGlyIGNvbmYtcmVsYXRpdmUpKSkpCi0gICAgKHRlc3RpbmcKLSAgICAgICJmb3IgYWJzb2x1dGUgcGF0aCIKLSAgICAgIChpcyAoPSAoaWYgb24td2luZG93cz8gIkM6XFxzdG9ybS1sb2NhbCIgIi92YXIvc3Rvcm0tbG9jYWwiKQotICAgICAgICAgICAgIChhYnNvbHV0ZS1zdG9ybS1sb2NhbC1kaXIgY29uZi1hYnNvbHV0ZSkpKSkpKQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvdGVzdC9jbGovYmFja3R5cGUvc3Rvcm0vZ3JvdXBpbmdfdGVzdC5jbGogYi9zdG9ybS1jb3JlL3Rlc3QvY2xqL2JhY2t0eXBlL3N0b3JtL2dyb3VwaW5nX3Rlc3QuY2xqCmluZGV4IDJiZmEwNjYuLmY5MTQ1OTEgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvdGVzdC9jbGovYmFja3R5cGUvc3Rvcm0vZ3JvdXBpbmdfdGVzdC5jbGoKKysrIGIvc3Rvcm0tY29yZS90ZXN0L2Nsai9iYWNrdHlwZS9zdG9ybS9ncm91cGluZ190ZXN0LmNsagpAQCAtMTcsMjcgKzE3LDg1IEBACiAgICg6dXNlIFtjbG9qdXJlIHRlc3RdKQogICAoOmltcG9ydCBbYmFja3R5cGUuc3Rvcm0udGVzdGluZyBUZXN0V29yZENvdW50ZXIgVGVzdFdvcmRTcG91dCBUZXN0R2xvYmFsQ291bnQgVGVzdEFnZ3JlZ2F0ZXNDb3VudGVyIFRlc3RXb3JkQnl0ZXNDb3VudGVyIE5Hcm91cGluZ10KICAgICAgICAgICAgW2JhY2t0eXBlLnN0b3JtLmdlbmVyYXRlZCBKYXZhT2JqZWN0IEphdmFPYmplY3RBcmddKQotICAoOnVzZSBbYmFja3R5cGUuc3Rvcm0gdGVzdGluZyBjbG9qdXJlXSkKLSAgKDp1c2UgW2JhY2t0eXBlLnN0b3JtLmRhZW1vbiBjb21tb25dKQorICAoOmltcG9ydCBbYmFja3R5cGUuc3Rvcm0uZ3JvdXBpbmcgTG9hZE1hcHBpbmddKQorICAoOnVzZSBbYmFja3R5cGUuc3Rvcm0gdGVzdGluZyBjbG9qdXJlIGxvZyBjb25maWddKQorICAoOnVzZSBbYmFja3R5cGUuc3Rvcm0uZGFlbW9uIGNvbW1vbiBleGVjdXRvcl0pCiAgICg6cmVxdWlyZSBbYmFja3R5cGUuc3Rvcm0gW3RocmlmdCA6YXMgdGhyaWZ0XV0pKQogCiAoZGVmdGVzdCB0ZXN0LXNodWZmbGUKKyAobGV0IFtzaHVmZmxlLWZuIChtay1zaHVmZmxlLWdyb3VwZXIgWyhpbnQgMSkgKGludCAyKV0ge1RPUE9MT0dZLURJU0FCTEUtTE9BREFXQVJFLU1FU1NBR0lORyB0cnVlfSBuaWwgImNvbXAiICJzdHJlYW0iKQorICAgICAgIG51bS1tZXNzYWdlcyAxMDAwMDAKKyAgICAgICBtaW4tcHJjbnQgKGludCAoKiBudW0tbWVzc2FnZXMgMC40OSkpCisgICAgICAgbWF4LXByY250IChpbnQgKCogbnVtLW1lc3NhZ2VzIDAuNTEpKQorICAgICAgIGRhdGEgWzEgMl0KKyAgICAgICBmcmVxIChmcmVxdWVuY2llcyAoZm9yIFt4IChyYW5nZSAwIG51bS1tZXNzYWdlcyldIChzaHVmZmxlLWZuIChpbnQgMSkgZGF0YSBuaWwpKSkKKyAgICAgICBsb2FkMSAoLmdldCBmcmVxIFsoaW50IDEpXSkKKyAgICAgICBsb2FkMiAoLmdldCBmcmVxIFsoaW50IDIpXSldCisgICAgKGxvZy1tZXNzYWdlICJGUkVROiIgZnJlcSkKKyAgICAoaXMgKD49IGxvYWQxIG1pbi1wcmNudCkpCisgICAgKGlzICg8PSBsb2FkMSBtYXgtcHJjbnQpKQorICAgIChpcyAoPj0gbG9hZDIgbWluLXByY250KSkKKyAgICAoaXMgKDw9IGxvYWQyIG1heC1wcmNudCkpKSkKKworKGRlZnRlc3QgdGVzdC1zaHVmZmxlLWxvYWQtZXZlbgorIChsZXQgW3NodWZmbGUtZm4gKG1rLXNodWZmbGUtZ3JvdXBlciBbKGludCAxKSAoaW50IDIpXSB7fSBuaWwgImNvbXAiICJzdHJlYW0iKQorICAgICAgIG51bS1tZXNzYWdlcyAxMDAwMDAKKyAgICAgICBtaW4tcHJjbnQgKGludCAoKiBudW0tbWVzc2FnZXMgMC40OSkpCisgICAgICAgbWF4LXByY250IChpbnQgKCogbnVtLW1lc3NhZ2VzIDAuNTEpKQorICAgICAgIGxvYWQgKExvYWRNYXBwaW5nLikKKyAgICAgICBfICguc2V0TG9jYWwgbG9hZCB7KGludCAxKSAwLjAgKGludCAyKSAwLjB9KQorICAgICAgIGRhdGEgWzEgMl0KKyAgICAgICBmcmVxIChmcmVxdWVuY2llcyAoZm9yIFt4IChyYW5nZSAwIG51bS1tZXNzYWdlcyldIChzaHVmZmxlLWZuIChpbnQgMSkgZGF0YSBsb2FkKSkpCisgICAgICAgbG9hZDEgKC5nZXQgZnJlcSBbKGludCAxKV0pCisgICAgICAgbG9hZDIgKC5nZXQgZnJlcSBbKGludCAyKV0pXQorICAgIChsb2ctbWVzc2FnZSAiRlJFUToiIGZyZXEpCisgICAgKGlzICg+PSBsb2FkMSBtaW4tcHJjbnQpKQorICAgIChpcyAoPD0gbG9hZDEgbWF4LXByY250KSkKKyAgICAoaXMgKD49IGxvYWQyIG1pbi1wcmNudCkpCisgICAgKGlzICg8PSBsb2FkMiBtYXgtcHJjbnQpKSkpCisKKyhkZWZ0ZXN0IHRlc3Qtc2h1ZmZsZS1sb2FkLXVuZXZlbgorIChsZXQgW3NodWZmbGUtZm4gKG1rLXNodWZmbGUtZ3JvdXBlciBbKGludCAxKSAoaW50IDIpXSB7fSBuaWwgImNvbXAiICJzdHJlYW0iKQorICAgICAgIG51bS1tZXNzYWdlcyAxMDAwMDAKKyAgICAgICBtaW4xLXByY250IChpbnQgKCogbnVtLW1lc3NhZ2VzIDAuMzIpKQorICAgICAgIG1heDEtcHJjbnQgKGludCAoKiBudW0tbWVzc2FnZXMgMC4zNCkpCisgICAgICAgbWluMi1wcmNudCAoaW50ICgqIG51bS1tZXNzYWdlcyAwLjY1KSkKKyAgICAgICBtYXgyLXByY250IChpbnQgKCogbnVtLW1lc3NhZ2VzIDAuNjcpKQorICAgICAgIGxvYWQgKExvYWRNYXBwaW5nLikKKyAgICAgICBfICguc2V0TG9jYWwgbG9hZCB7KGludCAxKSAwLjUgKGludCAyKSAwLjB9KQorICAgICAgIGRhdGEgWzEgMl0KKyAgICAgICBmcmVxIChmcmVxdWVuY2llcyAoZm9yIFt4IChyYW5nZSAwIG51bS1tZXNzYWdlcyldIChzaHVmZmxlLWZuIChpbnQgMSkgZGF0YSBsb2FkKSkpCisgICAgICAgbG9hZDEgKC5nZXQgZnJlcSBbKGludCAxKV0pCisgICAgICAgbG9hZDIgKC5nZXQgZnJlcSBbKGludCAyKV0pXQorICAgIChsb2ctbWVzc2FnZSAiRlJFUToiIGZyZXEpCisgICAgKGlzICg+PSBsb2FkMSBtaW4xLXByY250KSkKKyAgICAoaXMgKDw9IGxvYWQxIG1heDEtcHJjbnQpKQorICAgIChpcyAoPj0gbG9hZDIgbWluMi1wcmNudCkpCisgICAgKGlzICg8PSBsb2FkMiBtYXgyLXByY250KSkpKQorCisoZGVmdGVzdCB0ZXN0LWZpZWxkCiAgICh3aXRoLXNpbXVsYXRlZC10aW1lLWxvY2FsLWNsdXN0ZXIgW2NsdXN0ZXIgOnN1cGVydmlzb3JzIDRdCi0gICAgKGxldCBbdG9wb2xvZ3kgKHRocmlmdC9tay10b3BvbG9neQotICAgICAgICAgICAgICAgICAgICB7IjEiICh0aHJpZnQvbWstc3BvdXQtc3BlYyAoVGVzdFdvcmRTcG91dC4gdHJ1ZSkgOnBhcmFsbGVsaXNtLWhpbnQgNCl9Ci0gICAgICAgICAgICAgICAgICAgIHsiMiIgKHRocmlmdC9tay1ib2x0LXNwZWMgeyIxIiA6c2h1ZmZsZX0gKFRlc3RHbG9iYWxDb3VudC4pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpwYXJhbGxlbGlzbS1oaW50IDYpCisgICAgKGxldCBbc3BvdXQtcGhpbnQgNAorICAgICAgICAgIGJvbHQtcGhpbnQgNgorICAgICAgICAgIHRvcG9sb2d5ICh0aHJpZnQvbWstdG9wb2xvZ3kKKyAgICAgICAgICAgICAgICAgICAgeyIxIiAodGhyaWZ0L21rLXNwb3V0LXNwZWMgKFRlc3RXb3JkU3BvdXQuIHRydWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpwYXJhbGxlbGlzbS1oaW50IHNwb3V0LXBoaW50KX0KKyAgICAgICAgICAgICAgICAgICAgeyIyIiAodGhyaWZ0L21rLWJvbHQtc3BlYyB7IjEiIFsid29yZCJdfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChUZXN0V29yZEJ5dGVzQ291bnRlci4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOnBhcmFsbGVsaXNtLWhpbnQgYm9sdC1waGludCkKICAgICAgICAgICAgICAgICAgICAgIH0pCi0gICAgICAgICAgcmVzdWx0cyAoY29tcGxldGUtdG9wb2xvZ3kgY2x1c3RlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcG9sb2d5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOzsgaW1wb3J0YW50IGZvciB0ZXN0IHRoYXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OyAjdHVwbGVzID0gbXVsdGlwbGUgb2YgNCBhbmQgNgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDptb2NrLXNvdXJjZXMgeyIxIiAoLT4+IFtbImEiXSBbImIiXV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVwZWF0IDEyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhcHBseSBjb25jYXQpKX0pXQotICAgICAgKGlzIChtcz0gKGFwcGx5IGNvbmNhdCAocmVwZWF0IDYgW1sxXSBbMl0gWzNdIFs0XV0pKQotICAgICAgICAgICAgICAgKHJlYWQtdHVwbGVzIHJlc3VsdHMgIjIiKSkpCi0gICAgICApKSkKKyAgICAgICAgICByZXN1bHRzIChjb21wbGV0ZS10b3BvbG9neQorICAgICAgICAgICAgICAgICAgICBjbHVzdGVyCisgICAgICAgICAgICAgICAgICAgIHRvcG9sb2d5CisgICAgICAgICAgICAgICAgICAgIDptb2NrLXNvdXJjZXMgeyIxIiAoLT4+IFtbKC5nZXRCeXRlcyAiYSIpXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyguZ2V0Qnl0ZXMgImIiKV1dCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXBlYXQgKCogc3BvdXQtcGhpbnQgYm9sdC1waGludCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhcHBseSBjb25jYXQpKX0pXQorICAgICAgKGlzIChtcz0gKGFwcGx5IGNvbmNhdAorICAgICAgICAgICAgICAgICAgICAgIChmb3IgW3ZhbHVlICcoImEiICJiIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW0gKHJhbmdlIDEgKGluYyAoKiBzcG91dC1waGludCBib2x0LXBoaW50KSkpXQorICAgICAgICAgICAgICAgICAgICAgICAgW1t2YWx1ZSBzdW1dXSkpCisgICAgICAgICAgICAgICAocmVhZC10dXBsZXMgcmVzdWx0cyAiMiIpKSkpKSkKIAogKGRlZnRlc3QgdGVzdC1maWVsZAogICAod2l0aC1zaW11bGF0ZWQtdGltZS1sb2NhbC1jbHVzdGVyIFtjbHVzdGVyIDpzdXBlcnZpc29ycyA0XQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS90ZXN0L2Nsai9iYWNrdHlwZS9zdG9ybS9pbnRlZ3JhdGlvbl90ZXN0LmNsaiBiL3N0b3JtLWNvcmUvdGVzdC9jbGovYmFja3R5cGUvc3Rvcm0vaW50ZWdyYXRpb25fdGVzdC5jbGoKaW5kZXggNzEyYjE5NS4uY2MwMjA4ZCAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS90ZXN0L2Nsai9iYWNrdHlwZS9zdG9ybS9pbnRlZ3JhdGlvbl90ZXN0LmNsagorKysgYi9zdG9ybS1jb3JlL3Rlc3QvY2xqL2JhY2t0eXBlL3N0b3JtL2ludGVncmF0aW9uX3Rlc3QuY2xqCkBAIC0xNyw3ICsxNyw3IEBACiAgICg6dXNlIFtjbG9qdXJlIHRlc3RdKQogICAoOmltcG9ydCBbYmFja3R5cGUuc3Rvcm0gQ29uZmlnXSkKICAgKDppbXBvcnQgW2JhY2t0eXBlLnN0b3JtLnRvcG9sb2d5IFRvcG9sb2d5QnVpbGRlcl0pCi0gICg6aW1wb3J0IFtiYWNrdHlwZS5zdG9ybS5nZW5lcmF0ZWQgSW52YWxpZFRvcG9sb2d5RXhjZXB0aW9uIFN1Ym1pdE9wdGlvbnMgVG9wb2xvZ3lJbml0aWFsU3RhdHVzXSkKKyAgKDppbXBvcnQgW2JhY2t0eXBlLnN0b3JtLmdlbmVyYXRlZCBJbnZhbGlkVG9wb2xvZ3lFeGNlcHRpb24gU3VibWl0T3B0aW9ucyBUb3BvbG9neUluaXRpYWxTdGF0dXMgUmViYWxhbmNlT3B0aW9uc10pCiAgICg6aW1wb3J0IFtiYWNrdHlwZS5zdG9ybS50ZXN0aW5nIFRlc3RXb3JkQ291bnRlciBUZXN0V29yZFNwb3V0IFRlc3RHbG9iYWxDb3VudAogICAgICAgICAgICAgVGVzdEFnZ3JlZ2F0ZXNDb3VudGVyIFRlc3RDb25mQm9sdCBBY2tGYWlsTWFwVHJhY2tlciBBY2tUcmFja2VyIFRlc3RQbGFubmVyU3BvdXRdKQogICAoOmltcG9ydCBbYmFja3R5cGUuc3Rvcm0udHVwbGUgRmllbGRzXSkKQEAgLTYyLDEzICs2MiwxMyBAQAogICAod2l0aC1zaW11bGF0ZWQtdGltZS1sb2NhbC1jbHVzdGVyIFtjbHVzdGVyIDpzdXBlcnZpc29ycyA0XQogICAgIChsZXQgW3RvcG9sb2d5ICh0aHJpZnQvbWstdG9wb2xvZ3kKICAgICAgICAgICAgICAgICAgICAgeyIxIiAodGhyaWZ0L21rLXNwb3V0LXNwZWMgKFRlc3RXb3JkU3BvdXQuIHRydWUpKX0KLSAgICAgICAgICAgICAgICAgICAgeyIyIiAodGhyaWZ0L21rLWJvbHQtc3BlYyB7IjEiIDpzaHVmZmxlfSBlbWl0LXRhc2staWQKKyAgICAgICAgICAgICAgICAgICAgeyIyIiAodGhyaWZ0L21rLWJvbHQtc3BlYyB7IjEiIDphbGx9IGVtaXQtdGFzay1pZAogICAgICAgICAgICAgICAgICAgICAgIDpwYXJhbGxlbGlzbS1oaW50IDMKICAgICAgICAgICAgICAgICAgICAgICA6Y29uZiB7VE9QT0xPR1ktVEFTS1MgNn0pCiAgICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgIHJlc3VsdHMgKGNvbXBsZXRlLXRvcG9sb2d5IGNsdXN0ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BvbG9neQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDptb2NrLXNvdXJjZXMgeyIxIiBbWyJhIl0gWyJhIl0gWyJhIl0gWyJhIl0gWyJhIl0gWyJhIl1dfSldCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOm1vY2stc291cmNlcyB7IjEiIFtbImEiXV19KV0KICAgICAgIChpcyAobXM9IFtbMF0gWzFdIFsyXSBbM10gWzRdIFs1XV0KICAgICAgICAgICAgICAgIChyZWFkLXR1cGxlcyByZXN1bHRzICIyIikpKQogICAgICAgKSkpCkBAIC0xMDUsNiArMTA1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRpbWVvdXQtdGVzdGVyIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7VE9QT0xPR1ktTUVTU0FHRS1USU1FT1VULVNFQ1MgMTB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcG9sb2d5KQorICAgICAgKGFkdmFuY2UtY2x1c3Rlci10aW1lIGNsdXN0ZXIgMTEpCiAgICAgICAoLmZlZWQgZmVlZGVyIFsiYSJdIDEpCiAgICAgICAoLmZlZWQgZmVlZGVyIFsiYiJdIDIpCiAgICAgICAoLmZlZWQgZmVlZGVyIFsiYyJdIDMpCkBAIC0yMzYsNiArMjM3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFja2luZy10ZXN0MSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDp0b3BvbG9neSB0cmFja2VkKSkKKyAgICAgIChhZHZhbmNlLWNsdXN0ZXItdGltZSBjbHVzdGVyIDExKQogICAgICAgKC5mZWVkIGZlZWRlcjEgWzFdKQogICAgICAgKHRyYWNrZWQtd2FpdCB0cmFja2VkIDEpCiAgICAgICAoY2hlY2tlcjEgMCkKQEAgLTI3OCw2ICsyODAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGVzdC1hY2tpbmcyIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoOnRvcG9sb2d5IHRyYWNrZWQpKQorICAgICAgKGFkdmFuY2UtY2x1c3Rlci10aW1lIGNsdXN0ZXIgMTEpCiAgICAgICAoLmZlZWQgZmVlZGVyIFsxXSkKICAgICAgICh0cmFja2VkLXdhaXQgdHJhY2tlZCAxKQogICAgICAgKGNoZWNrZXIgMCkKQEAgLTMyMyw2ICszMjYsNyBAQAogICAgICAgICB7VE9QT0xPR1ktTUVTU0FHRS1USU1FT1VULVNFQ1MgMTB9CiAgICAgICAgIHRvcG9sb2d5CiAgICAgICAgIChTdWJtaXRPcHRpb25zLiBUb3BvbG9neUluaXRpYWxTdGF0dXMvSU5BQ1RJVkUpKQorICAgICAgKGFkdmFuY2UtY2x1c3Rlci10aW1lIGNsdXN0ZXIgMTEpCiAgICAgICAoLmZlZWQgZmVlZGVyIFsiYSJdIDEpCiAgICAgICAoYWR2YW5jZS1jbHVzdGVyLXRpbWUgY2x1c3RlciA5KQogICAgICAgKGlzIChub3QgQGJvbHQtcHJlcGFyZWQ/KSkKQEAgLTM0Nyw2ICszNTEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGVzdCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDp0b3BvbG9neSB0cmFja2VkKSkKKyAgICAgIChhZHZhbmNlLWNsdXN0ZXItdGltZSBjbHVzdGVyIDExKQogICAgICAgKC5mZWVkIGZlZWRlciBbMV0pCiAgICAgICAodHJhY2tlZC13YWl0IHRyYWNrZWQgMSkKICAgICAgIChjaGVja2VyIDEpCkBAIC01NjgsNiArNTczLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUT1BPTE9HWS1ERUJVRyB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDp0b3BvbG9neSB0cmFja2VkKSkKKyAgICAgICAgICAgIF8gKGFkdmFuY2UtY2x1c3Rlci10aW1lIGNsdXN0ZXIgMTEpCiAgICAgICAgICAgICBzdG9ybS1pZCAoZ2V0LXN0b3JtLWlkIHN0YXRlICJ0ZXN0LWVycm9ycyIpCiAgICAgICAgICAgICBlcnJvcnMtY291bnQgKGZuIFtdIChjb3VudCAoLmVycm9ycyBzdGF0ZSBzdG9ybS1pZCAiMiIpKSldCiAKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvdGVzdC9jbGovYmFja3R5cGUvc3Rvcm0vbG9ndmlld2VyX3Rlc3QuY2xqIGIvc3Rvcm0tY29yZS90ZXN0L2Nsai9iYWNrdHlwZS9zdG9ybS9sb2d2aWV3ZXJfdGVzdC5jbGoKaW5kZXggYTc5MGRkZi4uMmFmYTg4YyAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS90ZXN0L2Nsai9iYWNrdHlwZS9zdG9ybS9sb2d2aWV3ZXJfdGVzdC5jbGoKKysrIGIvc3Rvcm0tY29yZS90ZXN0L2Nsai9iYWNrdHlwZS9zdG9ybS9sb2d2aWV3ZXJfdGVzdC5jbGoKQEAgLTIwLDMwICsyMCwzOCBAQAogICAoOnJlcXVpcmUgW2Nvbmp1cmUuY29yZV0pCiAgICg6dXNlIFtjbG9qdXJlIHRlc3RdKQogICAoOnVzZSBbY29uanVyZSBjb3JlXSkKKyAgKDp1c2UgW2JhY2t0eXBlLnN0b3JtLnVpIGhlbHBlcnNdKQorICAoOmltcG9ydCBbamF2YS5uaW8uZmlsZSBGaWxlc10pCisgICg6aW1wb3J0IFtqYXZhLm5pby5maWxlLmF0dHJpYnV0ZSBGaWxlQXR0cmlidXRlXSkKKyAgKDppbXBvcnQgW2phdmEuaW8gRmlsZV0pCiAgICg6aW1wb3J0IFtvcmcubW9ja2l0byBNb2NraXRvXSkpCiAKIChkZWZtdWx0aSBtay1tb2NrLUZpbGUgIyg6dHlwZSAlKSkKIAotKGRlZm1ldGhvZCBtay1tb2NrLUZpbGUgOmZpbGUgW3tmaWxlLW5hbWUgOm5hbWUgbXRpbWUgOm10aW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpvciB7ZmlsZS1uYW1lICJhZmlsZSIgbXRpbWUgMX19XQorKGRlZm1ldGhvZCBtay1tb2NrLUZpbGUgOmZpbGUgW3tmaWxlLW5hbWUgOm5hbWUgbXRpbWUgOm10aW1lIGxlbmd0aCA6bGVuZ3RoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpvciB7ZmlsZS1uYW1lICJhZmlsZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdGltZSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoICgqIDEwICgqIDEwMjQgKCogMTAyNCAxMDI0KSkpIH19XSA7IExlbmd0aCAxMCBHQgogICAobGV0IFttb2NrRmlsZSAoTW9ja2l0by9tb2NrIGphdmEuaW8uRmlsZSldCiAgICAgKC4gKE1vY2tpdG8vd2hlbiAoLmdldE5hbWUgbW9ja0ZpbGUpKSB0aGVuUmV0dXJuIGZpbGUtbmFtZSkKICAgICAoLiAoTW9ja2l0by93aGVuICgubGFzdE1vZGlmaWVkIG1vY2tGaWxlKSkgdGhlblJldHVybiBtdGltZSkKICAgICAoLiAoTW9ja2l0by93aGVuICguaXNGaWxlIG1vY2tGaWxlKSkgdGhlblJldHVybiB0cnVlKQogICAgICguIChNb2NraXRvL3doZW4gKC5nZXRDYW5vbmljYWxQYXRoIG1vY2tGaWxlKSkKLSAgICAgICB0aGVuUmV0dXJuIChzdHIgIi9tb2NrL2Nhbm9uaWNhbC9wYXRoL3RvLyIgZmlsZS1uYW1lKSkKKyAgICAgIHRoZW5SZXR1cm4gKHN0ciAiL21vY2svY2Fub25pY2FsL3BhdGgvdG8vIiBmaWxlLW5hbWUpKQorICAgICguIChNb2NraXRvL3doZW4gKC5sZW5ndGggbW9ja0ZpbGUpKSB0aGVuUmV0dXJuIGxlbmd0aCkKICAgICBtb2NrRmlsZSkpCiAKLShkZWZtZXRob2QgbWstbW9jay1GaWxlIDpkaXJlY3RvcnkgW3tkaXItbmFtZSA6bmFtZSBtdGltZSA6bXRpbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6b3Ige2Rpci1uYW1lICJhZGlyIiBtdGltZSAxfX1dCisoZGVmbWV0aG9kIG1rLW1vY2stRmlsZSA6ZGlyZWN0b3J5IFt7ZGlyLW5hbWUgOm5hbWUgbXRpbWUgOm10aW1lIGZpbGVzIDpmaWxlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpvciB7ZGlyLW5hbWUgImFkaXIiIG10aW1lIDEgZmlsZXMgW119fV0KICAgKGxldCBbbW9ja0RpciAoTW9ja2l0by9tb2NrIGphdmEuaW8uRmlsZSldCiAgICAgKC4gKE1vY2tpdG8vd2hlbiAoLmdldE5hbWUgbW9ja0RpcikpIHRoZW5SZXR1cm4gZGlyLW5hbWUpCiAgICAgKC4gKE1vY2tpdG8vd2hlbiAoLmxhc3RNb2RpZmllZCBtb2NrRGlyKSkgdGhlblJldHVybiBtdGltZSkKICAgICAoLiAoTW9ja2l0by93aGVuICguaXNGaWxlIG1vY2tEaXIpKSB0aGVuUmV0dXJuIGZhbHNlKQorICAgICguIChNb2NraXRvL3doZW4gKC5saXN0RmlsZXMgbW9ja0RpcikpIHRoZW5SZXR1cm4gKGludG8tYXJyYXkgRmlsZSBmaWxlcykpCiAgICAgbW9ja0RpcikpCiAKIChkZWZ0ZXN0IHRlc3QtbWstRmlsZUZpbHRlci1mb3ItbG9nLWNsZWFudXAKLSAgKHRlc3RpbmcgImxvZyBmaWxlIGZpbHRlciBzZWxlY3RzIHRoZSBjb3JyZWN0IGxvZyBmaWxlcyBmb3IgcHVyZ2UiCisgICh0ZXN0aW5nICJsb2cgZmlsZSBmaWx0ZXIgc2VsZWN0cyB0aGUgY29ycmVjdCB3b3JrZXItbG9nIGRpcnMgZm9yIHB1cmdlIgogICAgIChsZXQgW25vdy1taWxsaXMgKGN1cnJlbnQtdGltZS1taWxsaXMpCiAgICAgICAgICAgY29uZiB7TE9HVklFV0VSLUNMRUFOVVAtQUdFLU1JTlMgNjAKICAgICAgICAgICAgICAgICBMT0dWSUVXRVItQ0xFQU5VUC1JTlRFUlZBTC1TRUNTIDMwMH0KQEAgLTUxLDEyMCArNTksMTgxIEBACiAgICAgICAgICAgb2xkLW10aW1lLW1pbGxpcyAoLSBjdXRvZmYtbWlsbGlzIDUwMCkKICAgICAgICAgICBuZXctbXRpbWUtbWlsbGlzICgrIGN1dG9mZi1taWxsaXMgNTAwKQogICAgICAgICAgIG1hdGNoaW5nLWZpbGVzIChtYXAgIyhtay1tb2NrLUZpbGUgJSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt7Om5hbWUgIm9sZGxvZy0xLTItd29ya2VyLTMubG9nIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6dHlwZSA6ZmlsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6bXRpbWUgb2xkLW10aW1lLW1pbGxpc30KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Om5hbWUgIm9sZGxvZy0xLTItd29ya2VyLTMubG9nLjgiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDp0eXBlIDpmaWxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDptdGltZSBvbGQtbXRpbWUtbWlsbGlzfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs6bmFtZSAiZm9vYmFyKl90b3BvLTEtMjQyNDItd29ya2VyLTI4MzQyMzgubG9nIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6dHlwZSA6ZmlsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6bXRpbWUgb2xkLW10aW1lLW1pbGxpc31dKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgW3s6bmFtZSAiMzAzMSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOnR5cGUgOmRpcmVjdG9yeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6bXRpbWUgb2xkLW10aW1lLW1pbGxpc30KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Om5hbWUgIjMwMzIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDp0eXBlIDpkaXJlY3RvcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOm10aW1lIG9sZC1tdGltZS1taWxsaXN9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgezpuYW1lICI3MDc3IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6dHlwZSA6ZGlyZWN0b3J5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDptdGltZSBvbGQtbXRpbWUtbWlsbGlzfV0pCiAgICAgICAgICAgZXhjbHVkZWQtZmlsZXMgKG1hcCAjKG1rLW1vY2stRmlsZSAlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3s6bmFtZSAib2xkbG9nLTEtMi13b3JrZXItLmxvZyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOnR5cGUgOmZpbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOm10aW1lIG9sZC1tdGltZS1taWxsaXN9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezpuYW1lICJvbGRkaXItMS0yLXdvcmtlci5sb2ciCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDp0eXBlIDpkaXJlY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOm10aW1lIG9sZC1tdGltZS1taWxsaXN9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezpuYW1lICJuZXdsb2ctMS0yLXdvcmtlci5sb2ciCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDp0eXBlIDpmaWxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDptdGltZSBuZXctbXRpbWUtbWlsbGlzfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs6bmFtZSAic29tZS1vbGQtZmlsZS50eHQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDp0eXBlIDpmaWxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDptdGltZSBvbGQtbXRpbWUtbWlsbGlzfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs6bmFtZSAibWV0YWRhdGEiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDp0eXBlIDpkaXJlY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOm10aW1lIG9sZC1tdGltZS1taWxsaXN9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezpuYW1lICJuZXdkaXItMS0yLXdvcmtlci5sb2ciCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDp0eXBlIDpkaXJlY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOm10aW1lIG5ldy1tdGltZS1taWxsaXN9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezpuYW1lICJuZXdkaXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDp0eXBlIDpkaXJlY3RvcnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOm10aW1lIG5ldy1tdGltZS1taWxsaXN9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgW3s6bmFtZSAib2xkbG9nLTEtMi13b3JrZXItLmxvZyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOnR5cGUgOmZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOm10aW1lIG9sZC1tdGltZS1taWxsaXN9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgezpuYW1lICJuZXdsb2ctMS0yLXdvcmtlci5sb2ciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDp0eXBlIDpmaWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDptdGltZSBuZXctbXRpbWUtbWlsbGlzfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs6bmFtZSAic29tZS1vbGQtZmlsZS50eHQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDp0eXBlIDpmaWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDptdGltZSBvbGQtbXRpbWUtbWlsbGlzfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs6bmFtZSAib2xkZGlyLTEtMi13b3JrZXIubG9nIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6dHlwZSA6ZGlyZWN0b3J5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDptdGltZSBuZXctbXRpbWUtbWlsbGlzfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs6bmFtZSAibWV0YWRhdGEiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDp0eXBlIDpkaXJlY3RvcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOm10aW1lIG5ldy1tdGltZS1taWxsaXN9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgezpuYW1lICJuZXdkaXIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDp0eXBlIDpkaXJlY3RvcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOm10aW1lIG5ldy1tdGltZS1taWxsaXN9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgXSkKICAgICAgICAgICBmaWxlLWZpbHRlciAobG9ndmlld2VyL21rLUZpbGVGaWx0ZXItZm9yLWxvZy1jbGVhbnVwIGNvbmYgbm93LW1pbGxpcyldCi0gICAgICAgIChpcyAgIChldmVyeT8gIyguYWNjZXB0IGZpbGUtZmlsdGVyICUpIG1hdGNoaW5nLWZpbGVzKSkKLSAgICAgICAgKGlzIChub3QtYW55PyAjKC5hY2NlcHQgZmlsZS1maWx0ZXIgJSkgZXhjbHVkZWQtZmlsZXMpKQorICAgICAgKGlzICAgKGV2ZXJ5PyAjKC5hY2NlcHQgZmlsZS1maWx0ZXIgJSkgbWF0Y2hpbmctZmlsZXMpKQorICAgICAgKGlzIChub3QtYW55PyAjKC5hY2NlcHQgZmlsZS1maWx0ZXIgJSkgZXhjbHVkZWQtZmlsZXMpKQogICAgICAgKSkpCiAKLShkZWZ0ZXN0IHRlc3QtZ2V0LWxvZy1yb290LT5maWxlcy1tYXAKLSAgKHRlc3RpbmcgInJldHVybnMgbWFwIG9mIHJvb3QgbmFtZSB0byBsaXN0IG9mIGZpbGVzIgotICAgIChsZXQgW2ZpbGVzICh2ZWMgKG1hcCAjKGphdmEuaW8uRmlsZS4gJSkgWyJsb2ctMS0yLXdvcmtlci0zLmxvZyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9nLTEtMi13b3JrZXItMy5sb2cuMS5neiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9nLTEtMi13b3JrZXItMy5sb2cuZXJyIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb2ctMS0yLXdvcmtlci0zLmxvZy5vdXQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvZy0xLTItd29ya2VyLTMubG9nLm91dC4xLmd6IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb2ctMS0yLXdvcmtlci0zLmxvZy4xIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb2ctMi00LXdvcmtlci02LmxvZy4xIl0pKQotICAgICAgICAgIGV4cGVjdGVkIHsibG9nLTEtMi13b3JrZXItMyIgI3soZmlsZXMgMCkgKGZpbGVzIDEpIChmaWxlcyAyKSAoZmlsZXMgMykgKGZpbGVzIDQpIChmaWxlcyA1KX0KLSAgICAgICAgICAgICAgICAgICAgImxvZy0yLTQtd29ya2VyLTYiICN7KGZpbGVzIDYpfX1dCi0gICAgICAoaXMgKD0gZXhwZWN0ZWQgKGxvZ3ZpZXdlci9nZXQtbG9nLXJvb3QtPmZpbGVzLW1hcCBmaWxlcykpKSkpKQorKGRlZnRlc3QgdGVzdC1zb3J0LXdvcmtlci1sb2dzCisgICh0ZXN0aW5nICJjbGVhbmVyIHNvcnRzIHRoZSBsb2cgZmlsZXMgaW4gYXNjZW5kaW5nIGFnZXMgZm9yIGRlbGV0aW9uIgorICAgIChzdHViYmluZyBbbG9ndmlld2VyL2ZpbHRlci1jYW5kaWRhdGUtZmlsZXMgKGZuIFt4IF9dIHgpXQorICAgICAgKGxldCBbbm93LW1pbGxpcyAoY3VycmVudC10aW1lLW1pbGxpcykKKyAgICAgICAgICAgIGZpbGVzMSAoaW50by1hcnJheSBGaWxlIChtYXAgIyhtay1tb2NrLUZpbGUgezpuYW1lIChzdHIgJSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDp0eXBlIDpmaWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6bXRpbWUgKC0gbm93LW1pbGxpcyAoKiAxMDAgJSkpfSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJhbmdlIDEgNikpKQorICAgICAgICAgICAgZmlsZXMyIChpbnRvLWFycmF5IEZpbGUgKG1hcCAjKG1rLW1vY2stRmlsZSB7Om5hbWUgKHN0ciAlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOnR5cGUgOmZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDptdGltZSAoLSBub3ctbWlsbGlzICgqIDEwMCAlKSl9KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmFuZ2UgNiAxMSkpKQorICAgICAgICAgICAgZmlsZXMzIChpbnRvLWFycmF5IEZpbGUgKG1hcCAjKG1rLW1vY2stRmlsZSB7Om5hbWUgKHN0ciAlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOnR5cGUgOmZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDptdGltZSAoLSBub3ctbWlsbGlzICgqIDEwMCAlKSl9KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmFuZ2UgMTEgMTYpKSkKKyAgICAgICAgICAgIHBvcnQxLWRpciAobWstbW9jay1GaWxlIHs6bmFtZSAiL3dvcmtlcnMtYXJ0aWZhY3RzL3RvcG8xL3BvcnQxIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDp0eXBlIDpkaXJlY3RvcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ZmlsZXMgZmlsZXMxfSkKKyAgICAgICAgICAgIHBvcnQyLWRpciAobWstbW9jay1GaWxlIHs6bmFtZSAiL3dvcmtlcnMtYXJ0aWZhY3RzL3RvcG8xL3BvcnQyIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDp0eXBlIDpkaXJlY3RvcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ZmlsZXMgZmlsZXMyfSkKKyAgICAgICAgICAgIHBvcnQzLWRpciAobWstbW9jay1GaWxlIHs6bmFtZSAiL3dvcmtlcnMtYXJ0aWZhY3RzL3RvcG8yL3BvcnQzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDp0eXBlIDpkaXJlY3RvcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ZmlsZXMgZmlsZXMzfSkKKyAgICAgICAgICAgIHRvcG8xLWZpbGVzIChpbnRvLWFycmF5IEZpbGUgW3BvcnQxLWRpciBwb3J0Mi1kaXJdKQorICAgICAgICAgICAgdG9wbzItZmlsZXMgKGludG8tYXJyYXkgRmlsZSBbcG9ydDMtZGlyXSkKKyAgICAgICAgICAgIHRvcG8xLWRpciAobWstbW9jay1GaWxlIHs6bmFtZSAiL3dvcmtlcnMtYXJ0aWZhY3RzL3RvcG8xIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDp0eXBlIDpkaXJlY3RvcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ZmlsZXMgdG9wbzEtZmlsZXN9KQorICAgICAgICAgICAgdG9wbzItZGlyIChtay1tb2NrLUZpbGUgezpuYW1lICIvd29ya2Vycy1hcnRpZmFjdHMvdG9wbzIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOnR5cGUgOmRpcmVjdG9yeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpmaWxlcyB0b3BvMi1maWxlc30pCisgICAgICAgICAgICByb290LWZpbGVzIChpbnRvLWFycmF5IEZpbGUgW3RvcG8xLWRpciB0b3BvMi1kaXJdKQorICAgICAgICAgICAgcm9vdC1kaXIgKG1rLW1vY2stRmlsZSB7Om5hbWUgIi93b3JrZXJzLWFydGlmYWN0cyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDp0eXBlIDpkaXJlY3RvcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpmaWxlcyByb290LWZpbGVzfSkKKyAgICAgICAgICAgIHNvcnRlZC1sb2dzIChsb2d2aWV3ZXIvc29ydGVkLXdvcmtlci1sb2dzIHJvb3QtZGlyKQorICAgICAgICAgICAgc29ydGVkLWludHMgKG1hcCAjKEludGVnZXIuICguZ2V0TmFtZSAlKSkgc29ydGVkLWxvZ3MpXQorICAgICAgICAoaXMgKD0gKGNvdW50IHNvcnRlZC1sb2dzKSAxNSkpCisgICAgICAgIChpcyAoPSAoY291bnQgc29ydGVkLWludHMpIDE1KSkKKyAgICAgICAgKGlzIChhcHBseSAjJz4gc29ydGVkLWludHMpKSkpKSkKIAotKGRlZnRlc3QgdGVzdC1pZGVudGlmeS13b3JrZXItbG9nLWZpbGVzCi0gICh0ZXN0aW5nICJEb2VzIG5vdCBpbmNsdWRlIG1ldGFkYXRhIGZpbGUgd2hlbiB0aGVyZSBhcmUgYW55IGxvZyBmaWxlcyB0aGF0Ci0gICAgICAgICAgIHNob3VsZCBub3QgYmUgY2xlYW5lZCB1cCIKLSAgICAobGV0IFtjdXRvZmYtbWlsbGlzIDIwMDAKLSAgICAgICAgICBvbGQtbG9nRmlsZSAobWstbW9jay1GaWxlIHs6bmFtZSAibW9jay0xLTEtd29ya2VyLTEubG9nLjEiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOnR5cGUgOmZpbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6bXRpbWUgKC0gY3V0b2ZmLW1pbGxpcyAxMDAwKX0pCi0gICAgICAgICAgbW9jay1tZXRhRmlsZSAobWstbW9jay1GaWxlIHs6bmFtZSAibW9jay0xLTEtd29ya2VyLTEueWFtbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDp0eXBlIDpmaWxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6bXRpbWUgMX0pCi0gICAgICAgICAgbmV3LWxvZ0ZpbGUgKG1rLW1vY2stRmlsZSB7Om5hbWUgIm1vY2stMS0xLXdvcmtlci0xLmxvZyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6dHlwZSA6ZmlsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDptdGltZSAoKyBjdXRvZmYtbWlsbGlzIDEwMDApfSkKKyhkZWZ0ZXN0IHRlc3QtcGVyLXdvcmtlcmRpci1jbGVhbnVwCisgICh0ZXN0aW5nICJjbGVhbmVyIGRlbGV0ZXMgb2xkZXN0IGZpbGVzIGluIGVhY2ggd29ya2VyIGRpciBpZiBmaWxlcyBhcmUgbGFyZ2VyIHRoYW4gcGVyLWRpciBxdW90YS4iCisgICAgKHN0dWJiaW5nIFtybXIgbmlsXQorICAgICAgKGxldCBbbm93LW1pbGxpcyAoY3VycmVudC10aW1lLW1pbGxpcykKKyAgICAgICAgICAgIGZpbGVzMSAoaW50by1hcnJheSBGaWxlIChtYXAgIyhtay1tb2NrLUZpbGUgezpuYW1lIChzdHIgIkEiICUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6dHlwZSA6ZmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOm10aW1lICgrIG5vdy1taWxsaXMgKCogMTAwICUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmxlbmd0aCAyMDAgfSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJhbmdlIDAgMTApKSkKKyAgICAgICAgICAgIGZpbGVzMiAoaW50by1hcnJheSBGaWxlIChtYXAgIyhtay1tb2NrLUZpbGUgezpuYW1lIChzdHIgIkIiICUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6dHlwZSA6ZmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOm10aW1lICgrIG5vdy1taWxsaXMgKCogMTAwICUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmxlbmd0aCAyMDAgfSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJhbmdlIDAgMTApKSkKKyAgICAgICAgICAgIGZpbGVzMyAoaW50by1hcnJheSBGaWxlIChtYXAgIyhtay1tb2NrLUZpbGUgezpuYW1lIChzdHIgIkMiICUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6dHlwZSA6ZmlsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOm10aW1lICgrIG5vdy1taWxsaXMgKCogMTAwICUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmxlbmd0aCAyMDAgfSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJhbmdlIDAgMTApKSkKKyAgICAgICAgICAgIHBvcnQxLWRpciAobWstbW9jay1GaWxlIHs6bmFtZSAiL3dvcmtlcnMtYXJ0aWZhY3RzL3RvcG8xL3BvcnQxIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDp0eXBlIDpkaXJlY3RvcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ZmlsZXMgZmlsZXMxfSkKKyAgICAgICAgICAgIHBvcnQyLWRpciAobWstbW9jay1GaWxlIHs6bmFtZSAiL3dvcmtlcnMtYXJ0aWZhY3RzL3RvcG8xL3BvcnQyIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDp0eXBlIDpkaXJlY3RvcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ZmlsZXMgZmlsZXMyfSkKKyAgICAgICAgICAgIHBvcnQzLWRpciAobWstbW9jay1GaWxlIHs6bmFtZSAiL3dvcmtlcnMtYXJ0aWZhY3RzL3RvcG8yL3BvcnQzIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDp0eXBlIDpkaXJlY3RvcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ZmlsZXMgZmlsZXMzfSkKKyAgICAgICAgICAgIHRvcG8xLWZpbGVzIChpbnRvLWFycmF5IEZpbGUgW3BvcnQxLWRpciBwb3J0Mi1kaXJdKQorICAgICAgICAgICAgdG9wbzItZmlsZXMgKGludG8tYXJyYXkgRmlsZSBbcG9ydDMtZGlyXSkKKyAgICAgICAgICAgIHRvcG8xLWRpciAobWstbW9jay1GaWxlIHs6bmFtZSAiL3dvcmtlcnMtYXJ0aWZhY3RzL3RvcG8xIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDp0eXBlIDpkaXJlY3RvcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ZmlsZXMgdG9wbzEtZmlsZXN9KQorICAgICAgICAgICAgdG9wbzItZGlyIChtay1tb2NrLUZpbGUgezpuYW1lICIvd29ya2Vycy1hcnRpZmFjdHMvdG9wbzIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOnR5cGUgOmRpcmVjdG9yeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpmaWxlcyB0b3BvMi1maWxlc30pCisgICAgICAgICAgICByb290LWZpbGVzIChpbnRvLWFycmF5IEZpbGUgW3RvcG8xLWRpciB0b3BvMi1kaXJdKQorICAgICAgICAgICAgcm9vdC1kaXIgKG1rLW1vY2stRmlsZSB7Om5hbWUgIi93b3JrZXJzLWFydGlmYWN0cyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDp0eXBlIDpkaXJlY3RvcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpmaWxlcyByb290LWZpbGVzfSkKKyAgICAgICAgICAgIHJlbWFpbmluZy1sb2dzIChsb2d2aWV3ZXIvcGVyLXdvcmtlcmRpci1jbGVhbnVwIHJvb3QtZGlyIDEyMDApXQorICAgICAgICAoaXMgKD0gKGNvdW50IChmaXJzdCByZW1haW5pbmctbG9ncykpIDYpKQorICAgICAgICAoaXMgKD0gKGNvdW50IChzZWNvbmQgcmVtYWluaW5nLWxvZ3MpKSA2KSkKKyAgICAgICAgKGlzICg9IChjb3VudCAobGFzdCByZW1haW5pbmctbG9ncykpIDYpKSkpKSkKKworKGRlZnRlc3QgdGVzdC1kZWxldGUtb2xkZXN0LWxvZy1jbGVhbnVwCisgICh0ZXN0aW5nICJkZWxldGUgb2xkZXN0IGxvZ3MgZGVsZXRlcyB0aGUgb2xkZXN0IHNldCBvZiBsb2dzIHdoZW4gdGhlIHRvdGFsIHNpemUgZ2V0cyB0b28gbGFyZ2UuIgorICAgIChzdHViYmluZyBbcm1yIG5pbF0KKyAgICAgIChsZXQgW25vdy1taWxsaXMgKGN1cnJlbnQtdGltZS1taWxsaXMpCisgICAgICAgICAgICBmaWxlcyAoaW50by1hcnJheSBGaWxlIChtYXAgIyhtay1tb2NrLUZpbGUgezpuYW1lIChzdHIgJSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOnR5cGUgOmZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOm10aW1lICgrIG5vdy1taWxsaXMgKCogMTAwICUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6bGVuZ3RoIDEwMCB9KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyYW5nZSAwIDIwKSkpCisgICAgICAgICAgICByZW1haW5pbmctbG9ncyAobG9ndmlld2VyL2RlbGV0ZS1vbGRlc3Qtd2hpbGUtbG9ncy10b28tbGFyZ2UgZmlsZXMgNTAxKV0KKyAgICAgICAgKGlzICg9IChsb2d2aWV3ZXIvc3VtLWZpbGUtc2l6ZSBmaWxlcykgMjAwMCkpCisgICAgICAgIChpcyAoPSAoY291bnQgcmVtYWluaW5nLWxvZ3MpIDUpKQorICAgICAgICAoaXMgKD0gKC5nZXROYW1lIChmaXJzdCByZW1haW5pbmctbG9ncykpICIxNSIpKSkpKSkKKworKGRlZnRlc3QgdGVzdC1pZGVudGlmeS13b3JrZXItbG9nLWRpcnMKKyAgKHRlc3RpbmcgIkJ1aWxkIHVwIHdvcmtlcmlkLXdvcmtlcmxvZ2RpciBtYXAgZm9yIHRoZSBvbGQgd29ya2VycycgZGlycyIKKyAgICAobGV0IFtwb3J0MS1kaXIgKG1rLW1vY2stRmlsZSB7Om5hbWUgIi93b3JrZXJzLWFydGlmYWN0cy90b3BvMS9wb3J0MSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOnR5cGUgOmRpcmVjdG9yeX0pCisgICAgICAgICAgbW9jay1tZXRhRmlsZSAobWstbW9jay1GaWxlIHs6bmFtZSAid29ya2VyLnlhbWwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6dHlwZSA6ZmlsZX0pCiAgICAgICAgICAgZXhwLWlkICJpZDEyMzQ1IgotICAgICAgICAgIGV4cC11c2VyICJhbGljZSIKLSAgICAgICAgICBleHBlY3RlZCB7ZXhwLWlkIHs6b3duZXIgZXhwLXVzZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ZmlsZXMgI3tvbGQtbG9nRmlsZX19fV0KKyAgICAgICAgICBleHBlY3RlZCB7ZXhwLWlkIHBvcnQxLWRpcn1dCiAgICAgICAoc3R1YmJpbmcgW3N1cGVydmlzb3IvcmVhZC13b3JrZXItaGVhcnRiZWF0cyBuaWwKLSAgICAgICAgICAgICAgICBsb2d2aWV3ZXIvZ2V0LW1ldGFkYXRhLWZpbGUtZm9yLWxvZy1yb290LW5hbWUgbW9jay1tZXRhRmlsZQotICAgICAgICAgICAgICAgIHJlYWQtZGlyLWNvbnRlbnRzIFsoLmdldE5hbWUgb2xkLWxvZ0ZpbGUpICguZ2V0TmFtZSBuZXctbG9nRmlsZSldCi0gICAgICAgICAgICAgICAgbG9ndmlld2VyL2dldC13b3JrZXItaWQtZnJvbS1tZXRhZGF0YS1maWxlIGV4cC1pZAotICAgICAgICAgICAgICAgIGxvZ3ZpZXdlci9nZXQtdG9wby1vd25lci1mcm9tLW1ldGFkYXRhLWZpbGUgZXhwLXVzZXJdCi0gICAgICAgIChpcyAoPSBleHBlY3RlZCAobG9ndmlld2VyL2lkZW50aWZ5LXdvcmtlci1sb2ctZmlsZXMgW29sZC1sb2dGaWxlXSAiL3RtcC8iKSkpKSkpKQorICAgICAgICAgICAgICAgICBsb2d2aWV3ZXIvZ2V0LW1ldGFkYXRhLWZpbGUtZm9yLXdyb2tlci1sb2dkaXIgbW9jay1tZXRhRmlsZQorICAgICAgICAgICAgICAgICBsb2d2aWV3ZXIvZ2V0LXdvcmtlci1pZC1mcm9tLW1ldGFkYXRhLWZpbGUgZXhwLWlkXQorICAgICAgICAoaXMgKD0gZXhwZWN0ZWQgKGxvZ3ZpZXdlci9pZGVudGlmeS13b3JrZXItbG9nLWRpcnMgW3BvcnQxLWRpcl0pKSkpKSkpCiAKLShkZWZ0ZXN0IHRlc3QtZ2V0LWRlYWQtd29ya2VyLWZpbGVzLWFuZC1vd25lcnMKKyhkZWZ0ZXN0IHRlc3QtZ2V0LWRlYWQtd29ya2VyLWRpcnMKICAgKHRlc3RpbmcgInJlbW92ZXMgYW55IGZpbGVzIG9mIHdvcmtlcnMgdGhhdCBhcmUgc3RpbGwgYWxpdmUiCiAgICAgKGxldCBbY29uZiB7U1VQRVJWSVNPUi1XT1JLRVItVElNRU9VVC1TRUNTIDV9CiAgICAgICAgICAgaWQtPmhiIHsiNDIiIHs6dGltZS1zZWNzIDF9fQogICAgICAgICAgIG5vdy1zZWNzIDIKLSAgICAgICAgICBsb2ctZmlsZXMgI3s6ZXhwZWN0ZWQtZmlsZSA6dW5leHBlY3RlZC1maWxlfQotICAgICAgICAgIGV4cC1vd25lciAiYWxpY2UiXQotICAgICAgKHN0dWJiaW5nIFtsb2d2aWV3ZXIvaWRlbnRpZnktd29ya2VyLWxvZy1maWxlcyB7IjQyIiB7Om93bmVyIGV4cC1vd25lcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmZpbGVzICN7OnVuZXhwZWN0ZWQtZmlsZX19Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMDA3IiB7Om93bmVyIGV4cC1vd25lcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpmaWxlcyAjezpleHBlY3RlZC1maWxlfX19Ci0gICAgICAgICAgICAgICAgIGxvZ3ZpZXdlci9nZXQtdG9wby1vd25lci1mcm9tLW1ldGFkYXRhLWZpbGUgImFsaWNlIgorICAgICAgICAgIHVuZXhwZWN0ZWQtZGlyIChtay1tb2NrLUZpbGUgezpuYW1lICJkaXIxIiA6dHlwZSA6ZGlyZWN0b3J5fSkKKyAgICAgICAgICBleHBlY3RlZC1kaXIgKG1rLW1vY2stRmlsZSB7Om5hbWUgImRpcjIiIDp0eXBlIDpkaXJlY3Rvcnl9KQorICAgICAgICAgIGxvZy1kaXJzICN7dW5leHBlY3RlZC1kaXIgZXhwZWN0ZWQtZGlyfV0KKyAgICAgIChzdHViYmluZyBbbG9ndmlld2VyL2lkZW50aWZ5LXdvcmtlci1sb2ctZGlycyB7IjQyIiB1bmV4cGVjdGVkLWRpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjAwNyIgZXhwZWN0ZWQtZGlyfQogICAgICAgICAgICAgICAgICBzdXBlcnZpc29yL3JlYWQtd29ya2VyLWhlYXJ0YmVhdHMgaWQtPmhiXQotICAgICAgICAoaXMgKD0gW3s6b3duZXIgZXhwLW93bmVyIDpmaWxlcyAjezpleHBlY3RlZC1maWxlfX1dCi0gICAgICAgICAgICAgICAobG9ndmlld2VyL2dldC1kZWFkLXdvcmtlci1maWxlcy1hbmQtb3duZXJzIGNvbmYgbm93LXNlY3MgbG9nLWZpbGVzICIvdG1wLyIpKSkpKSkpCisgICAgICAgIChpcyAoPSAje2V4cGVjdGVkLWRpcn0KKyAgICAgICAgICAgICAgKGxvZ3ZpZXdlci9nZXQtZGVhZC13b3JrZXItZGlycyBjb25mIG5vdy1zZWNzIGxvZy1kaXJzKSkpKSkpKQogCiAoZGVmdGVzdCB0ZXN0LWNsZWFudXAtZm4KLSAgKHRlc3RpbmcgImNsZWFudXAgZnVuY3Rpb24gcmVtb3ZlcyBmaWxlIGFzIHVzZXIgd2hlbiBvbmUgaXMgc3BlY2lmaWVkIgotICAgIChsZXQgW2V4cC11c2VyICJtb2NrLXVzZXIiCi0gICAgICAgICAgbW9ja2ZpbGUxIChtay1tb2NrLUZpbGUgezpuYW1lICJmaWxlMSIgOnR5cGUgOmZpbGV9KQotICAgICAgICAgIG1vY2tmaWxlMiAobWstbW9jay1GaWxlIHs6bmFtZSAiZmlsZTIiIDp0eXBlIDpmaWxlfSkKLSAgICAgICAgICBtb2NrZmlsZTMgKG1rLW1vY2stRmlsZSB7Om5hbWUgImZpbGUzIiA6dHlwZSA6ZmlsZX0pCi0gICAgICAgICAgbW9ja3lhbWwgIChtay1tb2NrLUZpbGUgezpuYW1lICJmb28ueWFtbCIgOnR5cGUgOmZpbGV9KQotICAgICAgICAgIGV4cC1jbWQgKHN0ciAicm1yIC9tb2NrL2Nhbm9uaWNhbC9wYXRoL3RvLyIgKC5nZXROYW1lIG1vY2tmaWxlMykpXQotICAgICAgKHN0dWJiaW5nIFtsb2d2aWV3ZXIvc2VsZWN0LWZpbGVzLWZvci1jbGVhbnVwCi0gICAgICAgICAgICAgICAgICAgWyhtay1tb2NrLUZpbGUgezpuYW1lICJ0aHJvd2F3YXkiIDp0eXBlIDpmaWxlfSldCi0gICAgICAgICAgICAgICAgIGxvZ3ZpZXdlci9nZXQtZGVhZC13b3JrZXItZmlsZXMtYW5kLW93bmVycwotICAgICAgICAgICAgICAgICAgIFt7Om93bmVyIG5pbCA6ZmlsZXMgI3ttb2NrZmlsZTF9fQotICAgICAgICAgICAgICAgICAgICB7OmZpbGVzICN7bW9ja2ZpbGUyfX0KLSAgICAgICAgICAgICAgICAgICAgezpvd25lciBleHAtdXNlciA6ZmlsZXMgI3ttb2NrZmlsZTMgbW9ja3lhbWx9fV0KLSAgICAgICAgICAgICAgICAgc3VwZXJ2aXNvci93b3JrZXItbGF1bmNoZXIgbmlsCisgICh0ZXN0aW5nICJjbGVhbnVwIGZ1bmN0aW9uIHJtcidzIGZpbGVzIG9mIGRlYWQgd29ya2VycyIKKyAgICAobGV0IFttb2NrZmlsZTEgKG1rLW1vY2stRmlsZSB7Om5hbWUgImRlbGV0ZS1tZTEiIDp0eXBlIDpmaWxlfSkKKyAgICAgICAgICBtb2NrZmlsZTIgKG1rLW1vY2stRmlsZSB7Om5hbWUgImRlbGV0ZS1tZTIiIDp0eXBlIDpmaWxlfSldCisgICAgICAoc3R1YmJpbmcgW2xvZ3ZpZXdlci9zZWxlY3QtZGlycy1mb3ItY2xlYW51cCBuaWwKKyAgICAgICAgICAgICAgICAgbG9ndmlld2VyL2dldC1kZWFkLXdvcmtlci1kaXJzIChzb3J0ZWQtc2V0IG1vY2tmaWxlMSBtb2NrZmlsZTIpCisgICAgICAgICAgICAgICAgIGxvZ3ZpZXdlci9jbGVhbnVwLWVtcHR5LXRvcG9kaXIgbmlsCiAgICAgICAgICAgICAgICAgIHJtciBuaWxdCi0gICAgICAgIChsb2d2aWV3ZXIvY2xlYW51cC1mbiEgIi90bXAvIikKLSAgICAgICAgKHZlcmlmeS1jYWxsLXRpbWVzLWZvciBzdXBlcnZpc29yL3dvcmtlci1sYXVuY2hlciAxKQotICAgICAgICAodmVyaWZ5LWZpcnN0LWNhbGwtYXJncy1mb3ItaW5kaWNlcyBzdXBlcnZpc29yL3dvcmtlci1sYXVuY2hlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMSAyXSBleHAtdXNlciBleHAtY21kKQotICAgICAgICAodmVyaWZ5LWNhbGwtdGltZXMtZm9yIHJtciAzKQorICAgICAgICAobG9ndmlld2VyL2NsZWFudXAtZm4hICIvYm9ndXMvcGF0aCIpCisgICAgICAgICh2ZXJpZnktY2FsbC10aW1lcy1mb3Igcm1yIDIpCiAgICAgICAgICh2ZXJpZnktbnRoLWNhbGwtYXJncy1mb3IgMSBybXIgKC5nZXRDYW5vbmljYWxQYXRoIG1vY2tmaWxlMSkpCi0gICAgICAgICh2ZXJpZnktbnRoLWNhbGwtYXJncy1mb3IgMiBybXIgKC5nZXRDYW5vbmljYWxQYXRoIG1vY2tmaWxlMikpCi0gICAgICAgICh2ZXJpZnktbnRoLWNhbGwtYXJncy1mb3IgMyBybXIgKC5nZXRDYW5vbmljYWxQYXRoIG1vY2t5YW1sKSkpKSkpCisgICAgICAgICh2ZXJpZnktbnRoLWNhbGwtYXJncy1mb3IgMiBybXIgKC5nZXRDYW5vbmljYWxQYXRoIG1vY2tmaWxlMikpKSkpKQogCiAoZGVmdGVzdCB0ZXN0LWF1dGhvcml6ZWQtbG9nLXVzZXIKICAgKHRlc3RpbmcgImFsbG93IGNsdXN0ZXIgYWRtaW4iCkBAIC0yMTIsMyArMjgxLDQ1NiBAQAogICAgICAgKGlzIChub3QgKGxvZ3ZpZXdlci9hdXRob3JpemVkLWxvZy11c2VyPyAiYWxpY2UiICJub24tYmxhbmstZm5hbWUiIHt9KSkpCiAgICAgICAodmVyaWZ5LWZpcnN0LWNhbGwtYXJncy1mb3IgbG9ndmlld2VyL2dldC1sb2ctdXNlci1ncm91cC13aGl0ZWxpc3QgIm5vbi1ibGFuay1mbmFtZSIpCiAgICAgICAodmVyaWZ5LWZpcnN0LWNhbGwtYXJncy1mb3IgbG9ndmlld2VyL3VzZXItZ3JvdXBzICJhbGljZSIpKSkpCisKKyhkZWZ0ZXN0IHRlc3QtbGlzdC1sb2ctZmlsZXMKKyAgKHRlc3RpbmcgImxpc3QtbG9nLWZpbGVzIGZpbHRlciBzZWxlY3RzIHRoZSBjb3JyZWN0IGxvZyBmaWxlcyB0byByZXR1cm4iCisgICAgKGxldCBbYXR0cnMgKG1ha2UtYXJyYXkgRmlsZUF0dHJpYnV0ZSAwKQorICAgICAgICAgIHJvb3QtcGF0aCAoLmdldENhbm9uaWNhbFBhdGggKC50b0ZpbGUgKEZpbGVzL2NyZWF0ZVRlbXBEaXJlY3RvcnkgIndvcmtlcnMtYXJ0aWZhY3RzIiBhdHRycykpKQorICAgICAgICAgIGZpbGUxIChjbG9qdXJlLmphdmEuaW8vZmlsZSByb290LXBhdGggInRvcG9BIiAicG9ydDEiICJ3b3JrZXIubG9nIikKKyAgICAgICAgICBmaWxlMiAoY2xvanVyZS5qYXZhLmlvL2ZpbGUgcm9vdC1wYXRoICJ0b3BvQSIgInBvcnQyIiAid29ya2VyLmxvZyIpCisgICAgICAgICAgZmlsZTMgKGNsb2p1cmUuamF2YS5pby9maWxlIHJvb3QtcGF0aCAidG9wb0IiICJwb3J0MSIgIndvcmtlci5sb2ciKQorICAgICAgICAgIF8gKGNsb2p1cmUuamF2YS5pby9tYWtlLXBhcmVudHMgZmlsZTEpCisgICAgICAgICAgXyAoY2xvanVyZS5qYXZhLmlvL21ha2UtcGFyZW50cyBmaWxlMikKKyAgICAgICAgICBfIChjbG9qdXJlLmphdmEuaW8vbWFrZS1wYXJlbnRzIGZpbGUzKQorICAgICAgICAgIF8gKC5jcmVhdGVOZXdGaWxlIGZpbGUxKQorICAgICAgICAgIF8gKC5jcmVhdGVOZXdGaWxlIGZpbGUyKQorICAgICAgICAgIF8gKC5jcmVhdGVOZXdGaWxlIGZpbGUzKQorICAgICAgICAgIG9yaWdpbiAid3d3Lm9yaWdpbi5zZXJ2ZXIubmV0IgorICAgICAgICAgIGV4cGVjdGVkLWFsbCAoanNvbi1yZXNwb25zZSAnKCJ0b3BvQS9wb3J0MS93b3JrZXIubG9nIiAidG9wb0EvcG9ydDIvd29ya2VyLmxvZyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvcG9CL3BvcnQxL3dvcmtlci5sb2ciKQorICAgICAgICAgICAgICAgICAgICAgICAgIG5pbAorICAgICAgICAgICAgICAgICAgICAgICAgIDpoZWFkZXJzIHsiQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luIiBvcmlnaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFjY2Vzcy1Db250cm9sLUFsbG93LUNyZWRlbnRpYWxzIiAidHJ1ZSJ9KQorICAgICAgICAgIGV4cGVjdGVkLWZpbHRlci1wb3J0IChqc29uLXJlc3BvbnNlICcoInRvcG9BL3BvcnQxL3dvcmtlci5sb2ciICJ0b3BvQi9wb3J0MS93b3JrZXIubG9nIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5pbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmhlYWRlcnMgeyJBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW4iIG9yaWdpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBY2Nlc3MtQ29udHJvbC1BbGxvdy1DcmVkZW50aWFscyIgInRydWUifSkKKyAgICAgICAgICBleHBlY3RlZC1maWx0ZXItdG9wb0lkIChqc29uLXJlc3BvbnNlICcoInRvcG9CL3BvcnQxL3dvcmtlci5sb2ciKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOmhlYWRlcnMgeyJBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW4iIG9yaWdpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFjY2Vzcy1Db250cm9sLUFsbG93LUNyZWRlbnRpYWxzIiAidHJ1ZSJ9KQorICAgICAgICAgIHJldHVybmVkLWFsbCAobG9ndmlld2VyL2xpc3QtbG9nLWZpbGVzICJ1c2VyIiBuaWwgbmlsIHJvb3QtcGF0aCBuaWwgb3JpZ2luKQorICAgICAgICAgIHJldHVybmVkLWZpbHRlci1wb3J0IChsb2d2aWV3ZXIvbGlzdC1sb2ctZmlsZXMgInVzZXIiIG5pbCAicG9ydDEiIHJvb3QtcGF0aCBuaWwgb3JpZ2luKQorICAgICAgICAgIHJldHVybmVkLWZpbHRlci10b3BvSWQgKGxvZ3ZpZXdlci9saXN0LWxvZy1maWxlcyAidXNlciIgInRvcG9CIiBuaWwgcm9vdC1wYXRoIG5pbCBvcmlnaW4pXQorICAgICAgKHJtciByb290LXBhdGgpCisgICAgICAoaXMgICAoPSBleHBlY3RlZC1hbGwgcmV0dXJuZWQtYWxsKSkKKyAgICAgIChpcyAgICg9IGV4cGVjdGVkLWZpbHRlci1wb3J0IHJldHVybmVkLWZpbHRlci1wb3J0KSkKKyAgICAgIChpcyAgICg9IGV4cGVjdGVkLWZpbHRlci10b3BvSWQgcmV0dXJuZWQtZmlsdGVyLXRvcG9JZCkpKSkpCisKKyhkZWZ0ZXN0IHRlc3Qtc2VhcmNoLXZpYS1yZXN0LWFwaQorICAodGVzdGluZyAiVGhyb3dzIGlmIGJvZ3VzIGZpbGUgaXMgZ2l2ZW4iCisgICAgKHRocm93bi1jYXVzZT8gamF2YS5sYW5nLlJ1bnRpbWVFeGNlcHRpb24KKyAgICAgIChsb2d2aWV3ZXIvc3Vic3RyaW5nLXNlYXJjaCBuaWwgImEgc3RyaW5nIikpKQorCisgIChsZXQgW3BhdHRlcm4gIm5lZWRsZSIKKyAgICAgICAgZXhwZWN0ZWQtaG9zdCAiZGV2Lm51bGwuaW52YWxpZCIKKyAgICAgICAgZXhwZWN0ZWQtcG9ydCA4ODg4CisgICAgICAgIDs7IFdoZW4gd2UgY2xpY2sgYSBsaW5rIHRvIHRoZSBsb2d2aWV3ZXIsIHdlIGV4cGVjdCB0aGUgbWF0Y2ggbGluZSB0bworICAgICAgICA7OyBiZSBzb21ld2hlcmUgbmVhciB0aGUgbWlkZGxlIG9mIHRoZSBwYWdlLiAgU28gd2Ugc3VidHJhY3QgaGFsZiBvZgorICAgICAgICA7OyB0aGUgZGVmYXVsdCBwYWdlIGxlbmd0aCBmcm9tIHRoZSBvZmZzZXQgYXQgd2hpY2ggd2UgZm91bmQgdGhlCisgICAgICAgIDs7IG1hdGNoLgorICAgICAgICBleHAtb2Zmc2V0LWZuICMoLSAoLyBsb2d2aWV3ZXIvZGVmYXVsdC1ieXRlcy1wZXItcGFnZSAyKSAlKV0KKworICAgIChzdHViYmluZyBbbG9jYWwtaG9zdG5hbWUgZXhwZWN0ZWQtaG9zdAorICAgICAgICAgICAgICAgbG9ndmlld2VyL2xvZ3ZpZXdlci1wb3J0IGV4cGVjdGVkLXBvcnRdCisKKyAgICAgICh0ZXN0aW5nICJMb2d2aWV3ZXIgbGluayBjZW50ZXJzIHRoZSBtYXRjaCBpbiB0aGUgcGFnZSIKKyAgICAgICAgKGxldCBbZXhwZWN0ZWQtZm5hbWUgImZvb2Jhci5sb2ciXQorICAgICAgICAgIChpcyAoPSAoc3RyICJodHRwOi8vIgorICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLWhvc3QKKyAgICAgICAgICAgICAgICAgICAiOiIKKyAgICAgICAgICAgICAgICAgICBleHBlY3RlZC1wb3J0CisgICAgICAgICAgICAgICAgICAgIi9sb2c/ZmlsZT0iCisgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQtZm5hbWUKKyAgICAgICAgICAgICAgICAgICAiJnN0YXJ0PTE5NDcmbGVuZ3RoPSIKKyAgICAgICAgICAgICAgICAgICBsb2d2aWV3ZXIvZGVmYXVsdC1ieXRlcy1wZXItcGFnZSkKKyAgICAgICAgICAgICAgICAobG9ndmlld2VyL3VybC10by1tYXRjaC1jZW50ZXJlZC1pbi1sb2ctcGFnZSAoYnl0ZS1hcnJheSA0MikKKyAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLWZuYW1lCisgICAgICAgICAgICAgICAgICAyNzUyNgorICAgICAgICAgICAgICAgICAgODg4OCkpKSkpCisKKyAgICAgIChsZXQgW2ZpbGUgKC0+PiAibG9ndmlld2VyLXNlYXJjaC1jb250ZXh0LXRlc3RzLmxvZyIKKyAgICAgICAgICAgICAgICAgICAoY2xvanVyZS5qYXZhLmlvL2ZpbGUgInNyYyIgImRldiIpKV0KKyAgICAgICAgKHRlc3RpbmcgInJldHVybnMgY29ycmVjdCBiZWZvcmUvYWZ0ZXIgY29udGV4dCIKKyAgICAgICAgICAoaXMgKD0geyJzZWFyY2hTdHJpbmciIHBhdHRlcm4KKyAgICAgICAgICAgICAgICAgICJzdGFydEJ5dGVPZmZzZXQiIDAKKyAgICAgICAgICAgICAgICAgICJtYXRjaGVzIiBbeyJieXRlT2Zmc2V0IiAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmVmb3JlU3RyaW5nIiAiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFmdGVyU3RyaW5nIiAiIG5lZWRsZTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMG5lZWRsZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWF0Y2hTdHJpbmciIHBhdHRlcm4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb2d2aWV3ZXJVUkwiIChzdHIgImh0dHA6Ly8iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLWhvc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjoiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLXBvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9sb2c/ZmlsZT1zcmMlMkZkZXYlMkYiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICguZ2V0TmFtZSBmaWxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJnN0YXJ0PTAmbGVuZ3RoPTUxMjAwIil9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiYnl0ZU9mZnNldCIgNworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJlZm9yZVN0cmluZyIgIm5lZWRsZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWZ0ZXJTdHJpbmciICIwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDBuZWVkbGUgbmVlZGxlXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWF0Y2hTdHJpbmciIHBhdHRlcm4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb2d2aWV3ZXJVUkwiIChzdHIgImh0dHA6Ly8iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLWhvc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjoiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLXBvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9sb2c/ZmlsZT1zcmMlMkZkZXYlMkYiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICguZ2V0TmFtZSBmaWxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJnN0YXJ0PTAmbGVuZ3RoPTUxMjAwIil9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsiYnl0ZU9mZnNldCIgMTI3CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmVmb3JlU3RyaW5nIiAibmVlZGxlIG5lZWRsZTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZnRlclN0cmluZyIgIiBuZWVkbGVcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXRjaFN0cmluZyIgcGF0dGVybgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvZ3ZpZXdlclVSTCIgKHN0ciAiaHR0cDovLyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQtaG9zdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQtcG9ydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL2xvZz9maWxlPXNyYyUyRmRldiUyRiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC5nZXROYW1lIGZpbGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICImc3RhcnQ9MCZsZW5ndGg9NTEyMDAiKX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJieXRlT2Zmc2V0IiAxMzQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZWZvcmVTdHJpbmciICIgbmVlZGxlMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwbmVlZGxlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZnRlclN0cmluZyIgIlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hdGNoU3RyaW5nIiBwYXR0ZXJuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9ndmlld2VyVVJMIiAoc3RyICJodHRwOi8vIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC1ob3N0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC1wb3J0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvbG9nP2ZpbGU9c3JjJTJGZGV2JTJGIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLmdldE5hbWUgZmlsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiZzdGFydD0wJmxlbmd0aD01MTIwMCIpfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdfQorICAgICAgICAgICAgICAgIChsb2d2aWV3ZXIvc3Vic3RyaW5nLXNlYXJjaCBmaWxlIHBhdHRlcm4pKSkpKQorCisgICAgICAobGV0IFtmaWxlIChjbG9qdXJlLmphdmEuaW8vZmlsZSAic3JjIiAiZGV2IiAic21hbGwtd29ya2VyLmxvZyIpXQorICAgICAgICAodGVzdGluZyAiYSByZWFsbHkgc21hbGwgbG9nIGZpbGUiCisgICAgICAgICAgKGlzICg9IHsic2VhcmNoU3RyaW5nIiBwYXR0ZXJuCisgICAgICAgICAgICAgICAgICAic3RhcnRCeXRlT2Zmc2V0IiAwCisgICAgICAgICAgICAgICAgICAibWF0Y2hlcyIgW3siYnl0ZU9mZnNldCIgNworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJlZm9yZVN0cmluZyIgIjAwMDAwMCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWZ0ZXJTdHJpbmciICIgMDAwMDAwXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWF0Y2hTdHJpbmciIHBhdHRlcm4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb2d2aWV3ZXJVUkwiIChzdHIgImh0dHA6Ly8iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLWhvc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjoiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLXBvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9sb2c/ZmlsZT1zcmMlMkZkZXYlMkYiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICguZ2V0TmFtZSBmaWxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJnN0YXJ0PTAmbGVuZ3RoPTUxMjAwIil9XX0KKyAgICAgICAgICAgICAgICAobG9ndmlld2VyL3N1YnN0cmluZy1zZWFyY2ggZmlsZSBwYXR0ZXJuKSkpKSkKKworICAgICAgKGxldCBbZmlsZSAoY2xvanVyZS5qYXZhLmlvL2ZpbGUgInNyYyIgImRldiIgInRlc3QtMzA3Mi5sb2ciKV0KKyAgICAgICAgKHRlc3RpbmcgIm5vIG9mZnNldCByZXR1cm5lZCB3aGVuIGZpbGUgZW5kcyBvbiBidWZmZXIgb2Zmc2V0IgorICAgICAgICAgIChsZXQgW2V4cGVjdGVkCisgICAgICAgICAgICAgICAgeyJzZWFyY2hTdHJpbmciIHBhdHRlcm4KKyAgICAgICAgICAgICAgICAgInN0YXJ0Qnl0ZU9mZnNldCIgMAorICAgICAgICAgICAgICAgICAibWF0Y2hlcyIgW3siYnl0ZU9mZnNldCIgMzA2NgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmVmb3JlU3RyaW5nIiAoLT4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlcGVhdCAxMjggJy4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvanVyZS5zdHJpbmcvam9pbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFmdGVyU3RyaW5nIiAiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWF0Y2hTdHJpbmciIHBhdHRlcm4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvZ3ZpZXdlclVSTCIgKHN0ciAiaHR0cDovLyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC1ob3N0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjoiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQtcG9ydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvbG9nP2ZpbGU9c3JjJTJGZGV2JTJGIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICguZ2V0TmFtZSBmaWxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICImc3RhcnQ9MCZsZW5ndGg9NTEyMDAiKX1dfV0KKyAgICAgICAgICAgIChpcyAoPSBleHBlY3RlZAorICAgICAgICAgICAgICAgICAgKGxvZ3ZpZXdlci9zdWJzdHJpbmctc2VhcmNoIGZpbGUgcGF0dGVybikpKQorICAgICAgICAgICAgKGlzICg9IGV4cGVjdGVkCisgICAgICAgICAgICAgICAgICAobG9ndmlld2VyL3N1YnN0cmluZy1zZWFyY2ggZmlsZSBwYXR0ZXJuIDpudW0tbWF0Y2hlcyAxKSkpKSkpCisKKyAgICAgIChsZXQgW2ZpbGUgKGNsb2p1cmUuamF2YS5pby9maWxlICJzcmMiICJkZXYiICJ0ZXN0LXdvcmtlci5sb2ciKV0KKworICAgICAgICAodGVzdGluZyAibmV4dCBieXRlIG9mZnNldHMgYXJlIGNvcnJlY3QgZm9yIGVhY2ggbWF0Y2giCisgICAgICAgICAgKGRvc2VxIFtbbnVtLW1hdGNoZXMtc291Z2h0CisgICAgICAgICAgICAgICAgICAgbnVtLW1hdGNoZXMtZm91bmQKKyAgICAgICAgICAgICAgICAgICBleHBlY3RlZC1uZXh0LWJ5dGUtb2Zmc2V0XSBbWzEgMSAxMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzIgMiAyMDQyXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMyAzIDIwNTJdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFs0IDQgMzA3OF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzUgNSAzMTk2XQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbNiA2IDMyMDJdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFs3IDcgNjI1Ml0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzggOCA2MzIxXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbOSA5IDYzOTddCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsxMCAxMCA2NDc2XQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMTEgMTEgNjU1NF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzEyIDEyIG5pbF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzEzIDEyIG5pbF1dXQorICAgICAgICAgICAgKGxldCBbcmVzdWx0CisgICAgICAgICAgICAgICAgICAobG9ndmlld2VyL3N1YnN0cmluZy1zZWFyY2ggZmlsZQorICAgICAgICAgICAgICAgICAgICBwYXR0ZXJuCisgICAgICAgICAgICAgICAgICAgIDpudW0tbWF0Y2hlcyBudW0tbWF0Y2hlcy1zb3VnaHQpXQorICAgICAgICAgICAgICAoaXMgKD0gZXhwZWN0ZWQtbmV4dC1ieXRlLW9mZnNldAorICAgICAgICAgICAgICAgICAgICAoZ2V0IHJlc3VsdCAibmV4dEJ5dGVPZmZzZXQiKSkpCisgICAgICAgICAgICAgIChpcyAoPSBudW0tbWF0Y2hlcy1mb3VuZCAoY291bnQgKGdldCByZXN1bHQgIm1hdGNoZXMiKSkpKSkpKQorCisgICAgICAgIChpcworICAgICAgICAgICg9IHsibmV4dEJ5dGVPZmZzZXQiIDYyNTIKKyAgICAgICAgICAgICAgInNlYXJjaFN0cmluZyIgcGF0dGVybgorICAgICAgICAgICAgICAic3RhcnRCeXRlT2Zmc2V0IiAwCisgICAgICAgICAgICAgICJtYXRjaGVzIiBbCisgICAgICAgICAgICAgICAgICAgICAgICAgIHsiYnl0ZU9mZnNldCIgNQorICAgICAgICAgICAgICAgICAgICAgICAgICAgImJlZm9yZVN0cmluZyIgIlRlc3QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgImFmdGVyU3RyaW5nIiAiIGlzIG5lYXIgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZS5cblRoaXMgZmlsZSBhc3N1bWVzIGEgYnVmZmVyIHNpemUgb2YgMjA0OCBieXRlcywgYSBtYXggc2VhcmNoIHN0cmluZyBzaXplIG9mIDEwMjQgYnl0ZXMsIGFuZCBhIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hdGNoU3RyaW5nIiBwYXR0ZXJuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9ndmlld2VyVVJMIiAoc3RyICJodHRwOi8vIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC1ob3N0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC1wb3J0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvbG9nP2ZpbGU9c3JjJTJGZGV2JTJGIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLmdldE5hbWUgZmlsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiZzdGFydD0wJmxlbmd0aD01MTIwMCIpfQorICAgICAgICAgICAgICAgICAgICAgICAgICB7ImJ5dGVPZmZzZXQiIDIwMzYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZWZvcmVTdHJpbmciICJuZyAxNDZcbnBhZGRpbmcgMTQ3XG5wYWRkaW5nIDE0OFxucGFkZGluZyAxNDlcbnBhZGRpbmcgMTUwXG5wYWRkaW5nIDE1MVxucGFkZGluZyAxNTJcbnBhZGRpbmcgMTUzXG5OZWFyIHRoZSBlbmQgb2YgYSAxMDI0IGJ5dGUgYmxvY2ssIGEgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgImFmdGVyU3RyaW5nIiAiLlxuQSBuZWVkbGUgdGhhdCBzdHJhZGRsZXMgYSAxMDI0IGJ5dGUgYm91bmRhcnkgc2hvdWxkIGFsc28gYmUgZGV0ZWN0ZWQuXG5cbnBhZGRpbmcgMTU3XG5wYWRkaW5nIDE1OFxucGFkZGluZyAxNTlcbnBhZGRpbmcgMTYwXG5wYWRkaW5nIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hdGNoU3RyaW5nIiBwYXR0ZXJuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9ndmlld2VyVVJMIiAoc3RyICJodHRwOi8vIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC1ob3N0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC1wb3J0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvbG9nP2ZpbGU9c3JjJTJGZGV2JTJGIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLmdldE5hbWUgZmlsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiZzdGFydD0wJmxlbmd0aD01MTIwMCIpfQorICAgICAgICAgICAgICAgICAgICAgICAgICB7ImJ5dGVPZmZzZXQiIDIwNDYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZWZvcmVTdHJpbmciICJkaW5nIDE0N1xucGFkZGluZyAxNDhcbnBhZGRpbmcgMTQ5XG5wYWRkaW5nIDE1MFxucGFkZGluZyAxNTFcbnBhZGRpbmcgMTUyXG5wYWRkaW5nIDE1M1xuTmVhciB0aGUgZW5kIG9mIGEgMTAyNCBieXRlIGJsb2NrLCBhIG5lZWRsZS5cbkEgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgImFmdGVyU3RyaW5nIiAiIHRoYXQgc3RyYWRkbGVzIGEgMTAyNCBieXRlIGJvdW5kYXJ5IHNob3VsZCBhbHNvIGJlIGRldGVjdGVkLlxuXG5wYWRkaW5nIDE1N1xucGFkZGluZyAxNThcbnBhZGRpbmcgMTU5XG5wYWRkaW5nIDE2MFxucGFkZGluZyAxNjFcbnBhZGRpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hdGNoU3RyaW5nIiBwYXR0ZXJuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9ndmlld2VyVVJMIiAoc3RyICJodHRwOi8vIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC1ob3N0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC1wb3J0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvbG9nP2ZpbGU9c3JjJTJGZGV2JTJGIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLmdldE5hbWUgZmlsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiZzdGFydD0wJmxlbmd0aD01MTIwMCIpfQorICAgICAgICAgICAgICAgICAgICAgICAgICB7ImJ5dGVPZmZzZXQiIDMwNzIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZWZvcmVTdHJpbmciICJhZGRpbmcgMjI2XG5wYWRkaW5nIDIyN1xucGFkZGluZyAyMjhcbnBhZGRpbmcgMjI5XG5wYWRkaW5nIDIzMFxucGFkZGluZyAyMzFcbnBhZGRpbmcgMjMyXG5wYWRkaW5nIDIzM1xucGFkZGluZyAyMzRcbnBhZGRpbmcgMjM1XG5cblxuSGVyZSBhICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZnRlclN0cmluZyIgIiBvY2N1cnMganVzdCBhZnRlciBhIDEwMjQgYnl0ZSBib3VuZGFyeS4gIEl0IHNob3VsZCBoYXZlIHRoZSBjb3JyZWN0IGNvbnRleHQuXG5cblRleHQgd2l0aCB0d28gYWRqb2luaW5nIG1hdGNoZXM6IG5lZWRsZW5lZWRsZVxuXG5wYSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXRjaFN0cmluZyIgcGF0dGVybgorICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvZ3ZpZXdlclVSTCIgKHN0ciAiaHR0cDovLyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQtaG9zdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQtcG9ydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL2xvZz9maWxlPXNyYyUyRmRldiUyRiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC5nZXROYW1lIGZpbGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICImc3RhcnQ9MCZsZW5ndGg9NTEyMDAiKX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgeyJieXRlT2Zmc2V0IiAzMTkwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmVmb3JlU3RyaW5nIiAiXG5cblxuSGVyZSBhIG5lZWRsZSBvY2N1cnMganVzdCBhZnRlciBhIDEwMjQgYnl0ZSBib3VuZGFyeS4gIEl0IHNob3VsZCBoYXZlIHRoZSBjb3JyZWN0IGNvbnRleHQuXG5cblRleHQgd2l0aCB0d28gYWRqb2luaW5nIG1hdGNoZXM6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZnRlclN0cmluZyIgIm5lZWRsZVxuXG5wYWRkaW5nIDI0M1xucGFkZGluZyAyNDRcbnBhZGRpbmcgMjQ1XG5wYWRkaW5nIDI0NlxucGFkZGluZyAyNDdcbnBhZGRpbmcgMjQ4XG5wYWRkaW5nIDI0OVxucGFkZGluZyAyNTBcbnBhZGRpbmcgMjUxXG5wYWRkaW5nIDI1MlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hdGNoU3RyaW5nIiBwYXR0ZXJuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9ndmlld2VyVVJMIiAoc3RyICJodHRwOi8vIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC1ob3N0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC1wb3J0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvbG9nP2ZpbGU9c3JjJTJGZGV2JTJGIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLmdldE5hbWUgZmlsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiZzdGFydD0wJmxlbmd0aD01MTIwMCIpfQorICAgICAgICAgICAgICAgICAgICAgICAgICB7ImJ5dGVPZmZzZXQiIDMxOTYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZWZvcmVTdHJpbmciICJlIGEgbmVlZGxlIG9jY3VycyBqdXN0IGFmdGVyIGEgMTAyNCBieXRlIGJvdW5kYXJ5LiAgSXQgc2hvdWxkIGhhdmUgdGhlIGNvcnJlY3QgY29udGV4dC5cblxuVGV4dCB3aXRoIHR3byBhZGpvaW5pbmcgbWF0Y2hlczogbmVlZGxlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgImFmdGVyU3RyaW5nIiAiXG5cbnBhZGRpbmcgMjQzXG5wYWRkaW5nIDI0NFxucGFkZGluZyAyNDVcbnBhZGRpbmcgMjQ2XG5wYWRkaW5nIDI0N1xucGFkZGluZyAyNDhcbnBhZGRpbmcgMjQ5XG5wYWRkaW5nIDI1MFxucGFkZGluZyAyNTFcbnBhZGRpbmcgMjUyXG5wYWRkaW4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAibWF0Y2hTdHJpbmciIHBhdHRlcm4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb2d2aWV3ZXJVUkwiIChzdHIgImh0dHA6Ly8iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLWhvc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjoiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLXBvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9sb2c/ZmlsZT1zcmMlMkZkZXYlMkYiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICguZ2V0TmFtZSBmaWxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJnN0YXJ0PTAmbGVuZ3RoPTUxMjAwIil9CisgICAgICAgICAgICAgICAgICAgICAgICAgIHsiYnl0ZU9mZnNldCIgNjI0NgorICAgICAgICAgICAgICAgICAgICAgICAgICAgImJlZm9yZVN0cmluZyIgIlhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYXG5cbkhlcmUgYXJlIGZvdXIgbm9uLWFzY2lpIDEtYnl0ZSBVVEYtOCBjaGFyYWN0ZXJzOiDOsc6yzrPOtM61XG5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZnRlclN0cmluZyIgIlxuXG5IZXJlIGFyZSBmb3VyIHByaW50YWJsZSAyLWJ5dGUgVVRGLTggY2hhcmFjdGVyczogwqHCosKjwqTCpVxuXG5uZWVkbGVcblxuXG5cbkhlcmUgYXJlIGZvdXIgcHJpbnRhYmxlIDMtYnl0ZSBVVEYtOCBjaGFyYWN0ZXJzOiDgpITgpIUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAibWF0Y2hTdHJpbmciIHBhdHRlcm4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb2d2aWV3ZXJVUkwiIChzdHIgImh0dHA6Ly8iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLWhvc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjoiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLXBvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9sb2c/ZmlsZT1zcmMlMkZkZXYlMkYiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICguZ2V0TmFtZSBmaWxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJnN0YXJ0PTAmbGVuZ3RoPTUxMjAwIil9CisgICAgICAgICAgICAgICAgICAgICAgICAgIF19CisgICAgICAgICAgICAobG9ndmlld2VyL3N1YnN0cmluZy1zZWFyY2ggZmlsZSBwYXR0ZXJuIDpudW0tbWF0Y2hlcyA3KSkpCisKKyAgICAgICAgKHRlc3RpbmcgIkNvcnJlY3QgbWF0Y2ggb2Zmc2V0IGlzIHJldHVybmVkIHdoZW4gc2tpcHBpbmcgYnl0ZXMiCisgICAgICAgICAgKGxldCBbc3RhcnQtYnl0ZS1vZmZzZXQgMzE5N10KKyAgICAgICAgICAgIChpcyAoPSB7Im5leHRCeXRlT2Zmc2V0IiA2MjUyCisgICAgICAgICAgICAgICAgICAgICJzZWFyY2hTdHJpbmciIHBhdHRlcm4KKyAgICAgICAgICAgICAgICAgICAgInN0YXJ0Qnl0ZU9mZnNldCIgc3RhcnQtYnl0ZS1vZmZzZXQKKyAgICAgICAgICAgICAgICAgICAgIm1hdGNoZXMiIFt7ImJ5dGVPZmZzZXQiIDYyNDYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJlZm9yZVN0cmluZyIgIlhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYXG5cbkhlcmUgYXJlIGZvdXIgbm9uLWFzY2lpIDEtYnl0ZSBVVEYtOCBjaGFyYWN0ZXJzOiDOsc6yzrPOtM61XG5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFmdGVyU3RyaW5nIiAiXG5cbkhlcmUgYXJlIGZvdXIgcHJpbnRhYmxlIDItYnl0ZSBVVEYtOCBjaGFyYWN0ZXJzOiDCocKiwqPCpMKlXG5cbm5lZWRsZVxuXG5cblxuSGVyZSBhcmUgZm91ciBwcmludGFibGUgMy1ieXRlIFVURi04IGNoYXJhY3RlcnM6IOCkhOCkhSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hdGNoU3RyaW5nIiBwYXR0ZXJuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb2d2aWV3ZXJVUkwiIChzdHIgImh0dHA6Ly8iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQtaG9zdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLXBvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL2xvZz9maWxlPXNyYyUyRmRldiUyRiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLmdldE5hbWUgZmlsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJnN0YXJ0PTAmbGVuZ3RoPTUxMjAwIil9XX0KKyAgICAgICAgICAgICAgICAgIChsb2d2aWV3ZXIvc3Vic3RyaW5nLXNlYXJjaCBmaWxlCisgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4KKyAgICAgICAgICAgICAgICAgICAgOm51bS1tYXRjaGVzIDEKKyAgICAgICAgICAgICAgICAgICAgOnN0YXJ0LWJ5dGUtb2Zmc2V0IHN0YXJ0LWJ5dGUtb2Zmc2V0KSkpKSkKKworICAgICAgICAobGV0IFtwYXR0ZXJuIChjbG9qdXJlLnN0cmluZy9qb2luIChyZXBlYXQgMTAyNCAnWCkpXQorICAgICAgICAgIChpcworICAgICAgICAgICAgKD0geyJuZXh0Qnl0ZU9mZnNldCIgNjE4MworICAgICAgICAgICAgICAgICJzZWFyY2hTdHJpbmciIHBhdHRlcm4KKyAgICAgICAgICAgICAgICAic3RhcnRCeXRlT2Zmc2V0IiAwCisgICAgICAgICAgICAgICAgIm1hdGNoZXMiIFsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ImJ5dGVPZmZzZXQiIDQwNzUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJlZm9yZVN0cmluZyIgIlxuXG5UaGUgZm9sbG93aW5nIG1hdGNoIG9mIDEwMjQgYnl0ZXMgY29tcGxldGVseSBmaWxscyBoYWxmIHRoZSBieXRlIGJ1ZmZlci4gIEl0IGlzIGEgc2VhcmNoIHN1YnN0cmluZyBvZiB0aGUgbWF4aW11bSBzaXplLi4uLi4uXG5cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFmdGVyU3RyaW5nIiAiXG5UaGUgZm9sbG93aW5nIG1heC1zaXplIG1hdGNoIHN0cmFkZGxlcyBhIDEwMjQgYnl0ZSBidWZmZXIuXG5YWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hdGNoU3RyaW5nIiBwYXR0ZXJuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb2d2aWV3ZXJVUkwiIChzdHIgImh0dHA6Ly8iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQtaG9zdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLXBvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL2xvZz9maWxlPXNyYyUyRmRldiUyRiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLmdldE5hbWUgZmlsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJnN0YXJ0PTAmbGVuZ3RoPTUxMjAwIil9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJieXRlT2Zmc2V0IiA1MTU5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiZWZvcmVTdHJpbmciICJYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFxuVGhlIGZvbGxvd2luZyBtYXgtc2l6ZSBtYXRjaCBzdHJhZGRsZXMgYSAxMDI0IGJ5dGUgYnVmZmVyLlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWZ0ZXJTdHJpbmciICJcblxuSGVyZSBhcmUgZm91ciBub24tYXNjaWkgMS1ieXRlIFVURi04IGNoYXJhY3RlcnM6IM6xzrLOs860zrVcblxubmVlZGxlXG5cbkhlcmUgYXJlIGZvdXIgcHJpbnRhYmxlIDItYnl0ZSBVVEYtOCBjaGFyYWN0ZXJzOiDCocKiwqPCpCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hdGNoU3RyaW5nIiBwYXR0ZXJuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb2d2aWV3ZXJVUkwiIChzdHIgImh0dHA6Ly8iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWQtaG9zdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI6IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLXBvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL2xvZz9maWxlPXNyYyUyRmRldiUyRiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLmdldE5hbWUgZmlsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJnN0YXJ0PTAmbGVuZ3RoPTUxMjAwIil9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgXX0KKyAgICAgICAgICAgICAgKGxvZ3ZpZXdlci9zdWJzdHJpbmctc2VhcmNoIGZpbGUgcGF0dGVybiA6bnVtLW1hdGNoZXMgMikpKSkKKworICAgICAgICAobGV0IFtwYXR0ZXJuICLwkISA8JCEgfCQhIIiXQorICAgICAgICAgIChpcworICAgICAgICAgICAgKD0geyJuZXh0Qnl0ZU9mZnNldCIgNzE3NgorICAgICAgICAgICAgICAgICJzZWFyY2hTdHJpbmciIHBhdHRlcm4KKyAgICAgICAgICAgICAgICAic3RhcnRCeXRlT2Zmc2V0IiAwCisgICAgICAgICAgICAgICAgIm1hdGNoZXMiIFsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ImJ5dGVPZmZzZXQiIDcxNjQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJlZm9yZVN0cmluZyIgInBhZGRpbmcgMzcyXG5wYWRkaW5nIDM3M1xucGFkZGluZyAzNzRcbnBhZGRpbmcgMzc1XG5cblRoZSBmb2xsb3dpbmcgdGVzdHMgbXVsdGlieXRlIFVURi04IENoYXJhY3RlcnMgc3RyYWRkbGluZyB0aGUgYnl0ZSBib3VuZGFyeTogICAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZnRlclN0cmluZyIgIlxuXG5uZWVkbGUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXRjaFN0cmluZyIgcGF0dGVybgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9ndmlld2VyVVJMIiAoc3RyICJodHRwOi8vIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkLWhvc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiOiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC1wb3J0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9sb2c/ZmlsZT1zcmMlMkZkZXYlMkYiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC5nZXROYW1lIGZpbGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiZzdGFydD0wJmxlbmd0aD01MTIwMCIpfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF19CisgICAgICAgICAgICAgIChsb2d2aWV3ZXIvc3Vic3RyaW5nLXNlYXJjaCBmaWxlIHBhdHRlcm4gOm51bS1tYXRjaGVzIDEpKSkpCisKKyAgICAgICAgKHRlc3RpbmcgIlJldHVybnMgMCBtYXRjaGVzIGZvciB1bnNlZW4gcGF0dGVybiIKKyAgICAgICAgICAobGV0IFtwYXR0ZXJuICJOb3QgVGhlcmUiXQorICAgICAgICAgICAgKGlzICg9IHsic2VhcmNoU3RyaW5nIiBwYXR0ZXJuCisgICAgICAgICAgICAgICAgICAgICJzdGFydEJ5dGVPZmZzZXQiIDAKKyAgICAgICAgICAgICAgICAgICAgIm1hdGNoZXMiIFtdfQorICAgICAgICAgICAgICAgICAgKGxvZ3ZpZXdlci9zdWJzdHJpbmctc2VhcmNoIGZpbGUKKyAgICAgICAgICAgICAgICAgICAgcGF0dGVybgorICAgICAgICAgICAgICAgICAgICA6bnVtLW1hdGNoZXMgbmlsCisgICAgICAgICAgICAgICAgICAgIDpzdGFydC1ieXRlLW9mZnNldCBuaWwpKSkpKSkpKSkKKworKGRlZnRlc3QgdGVzdC1maW5kLW4tbWF0Y2hlcworICAodGVzdGluZyAiZmluZC1uLW1hdGNoZXMgbG9va3MgdGhyb3VnaCBsb2dzIHByb3Blcmx5IgorICAgIChsZXQgW2ZpbGVzIFsoY2xvanVyZS5qYXZhLmlvL2ZpbGUgInNyYyIgImRldiIgImxvZ3ZpZXdlci1zZWFyY2gtY29udGV4dC10ZXN0cy5sb2ciKQorICAgICAgICAgICAgICAgICAoY2xvanVyZS5qYXZhLmlvL2ZpbGUgInNyYyIgImRldiIgImxvZ3ZpZXdlci1zZWFyY2gtY29udGV4dC10ZXN0cy5sb2cuZ3oiKV0KKyAgICAgICAgICBtYXRjaGVzMSAoKGxvZ3ZpZXdlci9maW5kLW4tbWF0Y2hlcyBmaWxlcyAyMCAwIDAgIm5lZWRsZSIpICJtYXRjaGVzIikKKyAgICAgICAgICBtYXRjaGVzMiAoKGxvZ3ZpZXdlci9maW5kLW4tbWF0Y2hlcyBmaWxlcyAyMCAwIDEyNiAibmVlZGxlIikgIm1hdGNoZXMiKQorICAgICAgICAgIG1hdGNoZXMzICgobG9ndmlld2VyL2ZpbmQtbi1tYXRjaGVzIGZpbGVzIDIwIDEgMCAibmVlZGxlIikgIm1hdGNoZXMiKV0KKworICAgICAgKGlzICg9IDIgKGNvdW50IG1hdGNoZXMxKSkpCisgICAgICAoaXMgKD0gNCAoY291bnQgKChmaXJzdCBtYXRjaGVzMSkgIm1hdGNoZXMiKSkpKQorICAgICAgKGlzICg9IDQgKGNvdW50ICgoc2Vjb25kIG1hdGNoZXMxKSAibWF0Y2hlcyIpKSkpCisgICAgICAoaXMgKD0gKChmaXJzdCBtYXRjaGVzMSkgImZpbGVOYW1lIikgInNyYy9kZXYvbG9ndmlld2VyLXNlYXJjaC1jb250ZXh0LXRlc3RzLmxvZyIpKQorICAgICAgKGlzICg9ICgoc2Vjb25kIG1hdGNoZXMxKSAiZmlsZU5hbWUiKSAic3JjL2Rldi9sb2d2aWV3ZXItc2VhcmNoLWNvbnRleHQtdGVzdHMubG9nLmd6IikpCisKKyAgICAgIChpcyAoPSAyIChjb3VudCAoKGZpcnN0IG1hdGNoZXMyKSAibWF0Y2hlcyIpKSkpCisgICAgICAoaXMgKD0gNCAoY291bnQgKChzZWNvbmQgbWF0Y2hlczIpICJtYXRjaGVzIikpKSkKKworICAgICAgKGlzICg9IDEgKGNvdW50IG1hdGNoZXMzKSkpCisgICAgICAoaXMgKD0gNCAoY291bnQgKChmaXJzdCBtYXRjaGVzMykgIm1hdGNoZXMiKSkpKSkpKQorCisoZGVmdGVzdCB0ZXN0LWRlZXAtc2VhcmNoLWxvZ3MtZm9yLXRvcG9sb2d5CisgIChsZXQgW2ZpbGVzIFsoY2xvanVyZS5qYXZhLmlvL2ZpbGUgInNyYyIgImRldiIgImxvZ3ZpZXdlci1zZWFyY2gtY29udGV4dC10ZXN0cy5sb2ciKQorICAgICAgICAgICAgICAgKGNsb2p1cmUuamF2YS5pby9maWxlICJzcmMiICJkZXYiICJsb2d2aWV3ZXItc2VhcmNoLWNvbnRleHQtdGVzdHMubG9nLmd6IildCisgICAgICAgIGF0dHJzIChtYWtlLWFycmF5IEZpbGVBdHRyaWJ1dGUgMCkKKyAgICAgICAgdG9wby1wYXRoICguZ2V0Q2Fub25pY2FsUGF0aCAoLnRvRmlsZSAoRmlsZXMvY3JlYXRlVGVtcERpcmVjdG9yeSAidG9wb0EiIGF0dHJzKSkpCisgICAgICAgIF8gKC5jcmVhdGVOZXdGaWxlIChjbG9qdXJlLmphdmEuaW8vZmlsZSB0b3BvLXBhdGggIjY0MDAiKSkKKyAgICAgICAgXyAoLmNyZWF0ZU5ld0ZpbGUgKGNsb2p1cmUuamF2YS5pby9maWxlIHRvcG8tcGF0aCAiNjUwMCIpKQorICAgICAgICBfICguY3JlYXRlTmV3RmlsZSAoY2xvanVyZS5qYXZhLmlvL2ZpbGUgdG9wby1wYXRoICI2NjAwIikpCisgICAgICAgIF8gKC5jcmVhdGVOZXdGaWxlIChjbG9qdXJlLmphdmEuaW8vZmlsZSB0b3BvLXBhdGggIjY3MDAiKSldCisgICAgKHN0dWJiaW5nCisgICAgICBbbG9ndmlld2VyL2xvZ3MtZm9yLXBvcnQgZmlsZXMKKyAgICAgICBsb2d2aWV3ZXIvZmluZC1uLW1hdGNoZXMgbmlsXQorICAgICAgKHRlc3RpbmcgImRlZXAtc2VhcmNoLWxvZ3MtZm9yLXRvcG9sb2d5IGFsbC1wb3J0cyBzZWFyY2gtYXJjaGl2ZWQgPSB0cnVlIgorICAgICAgICAoaW5zdHJ1bWVudGluZworICAgICAgICAgIFtsb2d2aWV3ZXIvZmluZC1uLW1hdGNoZXMKKyAgICAgICAgICAgbG9ndmlld2VyL2xvZ3MtZm9yLXBvcnRdCisgICAgICAgICAgKGxvZ3ZpZXdlci9kZWVwLXNlYXJjaC1sb2dzLWZvci10b3BvbG9neSAiIiBuaWwgdG9wby1wYXRoICJzZWFyY2giICIyMCIgIioiICIyMCIgIjE5OSIgdHJ1ZSBuaWwgbmlsKQorICAgICAgICAgICh2ZXJpZnktY2FsbC10aW1lcy1mb3IgbG9ndmlld2VyL2ZpbmQtbi1tYXRjaGVzIDQpCisgICAgICAgICAgKHZlcmlmeS1jYWxsLXRpbWVzLWZvciBsb2d2aWV3ZXIvbG9ncy1mb3ItcG9ydCA0KQorICAgICAgICAgIDsgRmlsZSBvZmZzZXQgYW5kIGJ5dGUgb2Zmc2V0IHNob3VsZCBhbHdheXMgYmUgemVybyB3aGVuIHNlYXJjaGluZyBtdWx0aXBsZSB3b3JrZXJzIChtdWx0aXBsZSBwb3J0cykuCisgICAgICAgICAgKHZlcmlmeS1udGgtY2FsbC1hcmdzLWZvciAxIGxvZ3ZpZXdlci9maW5kLW4tbWF0Y2hlcyBmaWxlcyAyMCAwIDAgInNlYXJjaCIpCisgICAgICAgICAgKHZlcmlmeS1udGgtY2FsbC1hcmdzLWZvciAyIGxvZ3ZpZXdlci9maW5kLW4tbWF0Y2hlcyBmaWxlcyAyMCAwIDAgInNlYXJjaCIpCisgICAgICAgICAgKHZlcmlmeS1udGgtY2FsbC1hcmdzLWZvciAzIGxvZ3ZpZXdlci9maW5kLW4tbWF0Y2hlcyBmaWxlcyAyMCAwIDAgInNlYXJjaCIpCisgICAgICAgICAgKHZlcmlmeS1udGgtY2FsbC1hcmdzLWZvciA0IGxvZ3ZpZXdlci9maW5kLW4tbWF0Y2hlcyBmaWxlcyAyMCAwIDAgInNlYXJjaCIpKSkKKyAgICAgICh0ZXN0aW5nICJkZWVwLXNlYXJjaC1sb2dzLWZvci10b3BvbG9neSBhbGwtcG9ydHMgc2VhcmNoLWFyY2hpdmVkID0gZmFsc2UiCisgICAgICAgIChpbnN0cnVtZW50aW5nCisgICAgICAgICAgW2xvZ3ZpZXdlci9maW5kLW4tbWF0Y2hlcworICAgICAgICAgICBsb2d2aWV3ZXIvbG9ncy1mb3ItcG9ydF0KKyAgICAgICAgICAobG9ndmlld2VyL2RlZXAtc2VhcmNoLWxvZ3MtZm9yLXRvcG9sb2d5ICIiIG5pbCB0b3BvLXBhdGggInNlYXJjaCIgIjIwIiBuaWwgIjIwIiAiMTk5IiBuaWwgbmlsIG5pbCkKKyAgICAgICAgICAodmVyaWZ5LWNhbGwtdGltZXMtZm9yIGxvZ3ZpZXdlci9maW5kLW4tbWF0Y2hlcyA0KQorICAgICAgICAgICh2ZXJpZnktY2FsbC10aW1lcy1mb3IgbG9ndmlld2VyL2xvZ3MtZm9yLXBvcnQgNCkKKyAgICAgICAgICA7IEZpbGUgb2Zmc2V0IGFuZCBieXRlIG9mZnNldCBzaG91bGQgYWx3YXlzIGJlIHplcm8gd2hlbiBzZWFyY2hpbmcgbXVsdGlwbGUgd29ya2VycyAobXVsdGlwbGUgcG9ydHMpLgorICAgICAgICAgICh2ZXJpZnktbnRoLWNhbGwtYXJncy1mb3IgMSBsb2d2aWV3ZXIvZmluZC1uLW1hdGNoZXMgWyhmaXJzdCBmaWxlcyldIDIwIDAgMCAic2VhcmNoIikKKyAgICAgICAgICAodmVyaWZ5LW50aC1jYWxsLWFyZ3MtZm9yIDIgbG9ndmlld2VyL2ZpbmQtbi1tYXRjaGVzIFsoZmlyc3QgZmlsZXMpXSAyMCAwIDAgInNlYXJjaCIpCisgICAgICAgICAgKHZlcmlmeS1udGgtY2FsbC1hcmdzLWZvciAzIGxvZ3ZpZXdlci9maW5kLW4tbWF0Y2hlcyBbKGZpcnN0IGZpbGVzKV0gMjAgMCAwICJzZWFyY2giKQorICAgICAgICAgICh2ZXJpZnktbnRoLWNhbGwtYXJncy1mb3IgNCBsb2d2aWV3ZXIvZmluZC1uLW1hdGNoZXMgWyhmaXJzdCBmaWxlcyldIDIwIDAgMCAic2VhcmNoIikpKQorICAgICAgKHRlc3RpbmcgImRlZXAtc2VhcmNoLWxvZ3MtZm9yLXRvcG9sb2d5IG9uZS1wb3J0IHNlYXJjaC1hcmNoaXZlZCA9IHRydWUsIG5vIGZpbGUtb2Zmc2V0IgorICAgICAgICAoaW5zdHJ1bWVudGluZworICAgICAgICAgIFtsb2d2aWV3ZXIvZmluZC1uLW1hdGNoZXMKKyAgICAgICAgICAgbG9ndmlld2VyL2xvZ3MtZm9yLXBvcnRdCisgICAgICAgICAgKGxvZ3ZpZXdlci9kZWVwLXNlYXJjaC1sb2dzLWZvci10b3BvbG9neSAiIiBuaWwgdG9wby1wYXRoICJzZWFyY2giICIyMCIgIjY3MDAiICIwIiAiMCIgdHJ1ZSBuaWwgbmlsKQorICAgICAgICAgICh2ZXJpZnktY2FsbC10aW1lcy1mb3IgbG9ndmlld2VyL2ZpbmQtbi1tYXRjaGVzIDEpCisgICAgICAgICAgKHZlcmlmeS1jYWxsLXRpbWVzLWZvciBsb2d2aWV3ZXIvbG9ncy1mb3ItcG9ydCAyKQorICAgICAgICAgICh2ZXJpZnktbnRoLWNhbGwtYXJncy1mb3IgMSBsb2d2aWV3ZXIvZmluZC1uLW1hdGNoZXMgZmlsZXMgMjAgMCAwICJzZWFyY2giKSkpCisgICAgICAodGVzdGluZyAiZGVlcC1zZWFyY2gtbG9ncy1mb3ItdG9wb2xvZ3kgb25lLXBvcnQgc2VhcmNoLWFyY2hpdmVkID0gdHJ1ZSwgZmlsZS1vZmZzZXQgPSAxIgorICAgICAgICAoaW5zdHJ1bWVudGluZworICAgICAgICAgIFtsb2d2aWV3ZXIvZmluZC1uLW1hdGNoZXMKKyAgICAgICAgICAgbG9ndmlld2VyL2xvZ3MtZm9yLXBvcnRdCisgICAgICAgICAgKGxvZ3ZpZXdlci9kZWVwLXNlYXJjaC1sb2dzLWZvci10b3BvbG9neSAiIiBuaWwgdG9wby1wYXRoICJzZWFyY2giICIyMCIgIjY3MDAiICIxIiAiMCIgdHJ1ZSBuaWwgbmlsKQorICAgICAgICAgICh2ZXJpZnktY2FsbC10aW1lcy1mb3IgbG9ndmlld2VyL2ZpbmQtbi1tYXRjaGVzIDEpCisgICAgICAgICAgKHZlcmlmeS1jYWxsLXRpbWVzLWZvciBsb2d2aWV3ZXIvbG9ncy1mb3ItcG9ydCAyKQorICAgICAgICAgICh2ZXJpZnktbnRoLWNhbGwtYXJncy1mb3IgMSBsb2d2aWV3ZXIvZmluZC1uLW1hdGNoZXMgZmlsZXMgMjAgMSAwICJzZWFyY2giKSkpCisgICAgICAodGVzdGluZyAiZGVlcC1zZWFyY2gtbG9ncy1mb3ItdG9wb2xvZ3kgb25lLXBvcnQgc2VhcmNoLWFyY2hpdmVkID0gZmFsc2UsIGZpbGUtb2Zmc2V0ID0gMSIKKyAgICAgICAgKGluc3RydW1lbnRpbmcKKyAgICAgICAgICBbbG9ndmlld2VyL2ZpbmQtbi1tYXRjaGVzCisgICAgICAgICAgIGxvZ3ZpZXdlci9sb2dzLWZvci1wb3J0XQorICAgICAgICAgIChsb2d2aWV3ZXIvZGVlcC1zZWFyY2gtbG9ncy1mb3ItdG9wb2xvZ3kgIiIgbmlsIHRvcG8tcGF0aCAic2VhcmNoIiAiMjAiICI2NzAwIiAiMSIgIjAiIG5pbCBuaWwgbmlsKQorICAgICAgICAgICh2ZXJpZnktY2FsbC10aW1lcy1mb3IgbG9ndmlld2VyL2ZpbmQtbi1tYXRjaGVzIDEpCisgICAgICAgICAgKHZlcmlmeS1jYWxsLXRpbWVzLWZvciBsb2d2aWV3ZXIvbG9ncy1mb3ItcG9ydCAyKQorICAgICAgICAgIDsgRmlsZSBvZmZzZXQgc2hvdWxkIGJlIHplcm8sIHNpbmNlIHNlYXJjaC1hcmNoaXZlZCBpcyBmYWxzZS4KKyAgICAgICAgICAodmVyaWZ5LW50aC1jYWxsLWFyZ3MtZm9yIDEgbG9ndmlld2VyL2ZpbmQtbi1tYXRjaGVzIFsoZmlyc3QgZmlsZXMpXSAyMCAwIDAgInNlYXJjaCIpKSkKKyAgICAgICh0ZXN0aW5nICJkZWVwLXNlYXJjaC1sb2dzLWZvci10b3BvbG9neSBvbmUtcG9ydCBzZWFyY2gtYXJjaGl2ZWQgPSB0cnVlLCBmaWxlLW9mZnNldCA9IDEsIGJ5dGUtb2Zmc2V0ID0gMTAwIgorICAgICAgICAoaW5zdHJ1bWVudGluZworICAgICAgICAgIFtsb2d2aWV3ZXIvZmluZC1uLW1hdGNoZXMKKyAgICAgICAgICAgbG9ndmlld2VyL2xvZ3MtZm9yLXBvcnRdCisgICAgICAgICAgKGxvZ3ZpZXdlci9kZWVwLXNlYXJjaC1sb2dzLWZvci10b3BvbG9neSAiIiBuaWwgdG9wby1wYXRoICJzZWFyY2giICIyMCIgIjY3MDAiICIxIiAiMTAwIiB0cnVlIG5pbCBuaWwpCisgICAgICAgICAgKHZlcmlmeS1jYWxsLXRpbWVzLWZvciBsb2d2aWV3ZXIvZmluZC1uLW1hdGNoZXMgMSkKKyAgICAgICAgICAodmVyaWZ5LWNhbGwtdGltZXMtZm9yIGxvZ3ZpZXdlci9sb2dzLWZvci1wb3J0IDIpCisgICAgICAgICAgOyBGaWxlIG9mZnNldCBzaG91bGQgYmUgemVybywgc2luY2Ugc2VhcmNoLWFyY2hpdmVkIGlzIGZhbHNlLgorICAgICAgICAgICh2ZXJpZnktbnRoLWNhbGwtYXJncy1mb3IgMSBsb2d2aWV3ZXIvZmluZC1uLW1hdGNoZXMgZmlsZXMgMjAgMSAxMDAgInNlYXJjaCIpKSkKKyAgICAgICh0ZXN0aW5nICJkZWVwLXNlYXJjaC1sb2dzLWZvci10b3BvbG9neSBiYWQtcG9ydCBzZWFyY2gtYXJjaGl2ZWQgPSBmYWxzZSwgZmlsZS1vZmZzZXQgPSAxIgorICAgICAgICAoaW5zdHJ1bWVudGluZworICAgICAgICAgIFtsb2d2aWV3ZXIvZmluZC1uLW1hdGNoZXMKKyAgICAgICAgICAgbG9ndmlld2VyL2xvZ3MtZm9yLXBvcnRdCisgICAgICAgICAgKGxvZ3ZpZXdlci9kZWVwLXNlYXJjaC1sb2dzLWZvci10b3BvbG9neSAiIiBuaWwgdG9wby1wYXRoICJzZWFyY2giICIyMCIgIjI3MDAiICIxIiAiMCIgbmlsIG5pbCBuaWwpCisgICAgICAgICAgOyBDYWxsZWQgd2l0aCBhIGJhZCBwb3J0IChub3QgaW4gdGhlIGNvbmZpZykgTm8gc2VhcmNoaW5nIHNob3VsZCBiZSBkb25lLgorICAgICAgICAgICh2ZXJpZnktY2FsbC10aW1lcy1mb3IgbG9ndmlld2VyL2ZpbmQtbi1tYXRjaGVzIDApCisgICAgICAgICAgKHZlcmlmeS1jYWxsLXRpbWVzLWZvciBsb2d2aWV3ZXIvbG9ncy1mb3ItcG9ydCAwKSkpCisgICAgICAocm1yIHRvcG8tcGF0aCkpKSkKKwpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS90ZXN0L2Nsai9iYWNrdHlwZS9zdG9ybS9tZXNzYWdpbmcvbmV0dHlfaW50ZWdyYXRpb25fdGVzdC5jbGogYi9zdG9ybS1jb3JlL3Rlc3QvY2xqL2JhY2t0eXBlL3N0b3JtL21lc3NhZ2luZy9uZXR0eV9pbnRlZ3JhdGlvbl90ZXN0LmNsagppbmRleCBhOTE4YTRiLi44MDgxY2E1IDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3Rlc3QvY2xqL2JhY2t0eXBlL3N0b3JtL21lc3NhZ2luZy9uZXR0eV9pbnRlZ3JhdGlvbl90ZXN0LmNsagorKysgYi9zdG9ybS1jb3JlL3Rlc3QvY2xqL2JhY2t0eXBlL3N0b3JtL21lc3NhZ2luZy9uZXR0eV9pbnRlZ3JhdGlvbl90ZXN0LmNsagpAQCAtNTQsNSArNTQsNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJhIl0gWyJiIl0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF19CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKV0KLSAgICAgIChpcyAobXM9IChhcHBseSBjb25jYXQgKHJlcGVhdCA2IFtbMV0gWzJdIFszXSBbNF1dKSkKLSAgICAgICAgICAgICAgIChyZWFkLXR1cGxlcyByZXN1bHRzICIyIikpKSkpKQorICAgICAgICAoaXMgKD0gKCogNiA0KSAoLnNpemUgKHJlYWQtdHVwbGVzIHJlc3VsdHMgIjIiKSkpKSkpKQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS90ZXN0L2Nsai9iYWNrdHlwZS9zdG9ybS9tZXNzYWdpbmcvbmV0dHlfdW5pdF90ZXN0LmNsaiBiL3N0b3JtLWNvcmUvdGVzdC9jbGovYmFja3R5cGUvc3Rvcm0vbWVzc2FnaW5nL25ldHR5X3VuaXRfdGVzdC5jbGoKaW5kZXggZjdkMzgwMi4uMWQ2ZjEwNCAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS90ZXN0L2Nsai9iYWNrdHlwZS9zdG9ybS9tZXNzYWdpbmcvbmV0dHlfdW5pdF90ZXN0LmNsagorKysgYi9zdG9ybS1jb3JlL3Rlc3QvY2xqL2JhY2t0eXBlL3N0b3JtL21lc3NhZ2luZy9uZXR0eV91bml0X3Rlc3QuY2xqCkBAIC0xNSw3ICsxNSw4IEBACiA7OyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIChucyBiYWNrdHlwZS5zdG9ybS5tZXNzYWdpbmcubmV0dHktdW5pdC10ZXN0CiAgICg6dXNlIFtjbG9qdXJlIHRlc3RdKQotICAoOmltcG9ydCBbYmFja3R5cGUuc3Rvcm0ubWVzc2FnaW5nIFRyYW5zcG9ydEZhY3RvcnldKQorICAoOmltcG9ydCBbYmFja3R5cGUuc3Rvcm0ubWVzc2FnaW5nIFRyYW5zcG9ydEZhY3RvcnkgSUNvbm5lY3Rpb24gVGFza01lc3NhZ2UgSUNvbm5lY3Rpb25DYWxsYmFja10pCisgICg6aW1wb3J0IFtiYWNrdHlwZS5zdG9ybS51dGlscyBVdGlsc10pCiAgICg6dXNlIFtiYWNrdHlwZS5zdG9ybSB0ZXN0aW5nIHV0aWwgY29uZmlnIGxvZ10pCiAgICg6dXNlIFtiYWNrdHlwZS5zdG9ybS5kYWVtb24ud29ya2VyIDpvbmx5IFtpcy1jb25uZWN0aW9uLXJlYWR5XV0pCiAgICg6aW1wb3J0IFtqYXZhLnV0aWwgQXJyYXlMaXN0XSkpCkBAIC0zMywyMCArMzQsNTQgQEAKICAgICAgIChkbyAobG9nLW1lc3NhZ2UgIldhaXRpbmcgdW50aWwgYWxsIE5ldHR5IGNvbm5lY3Rpb25zIGFyZSByZWFkeS4uLiIpCiAgICAgICAgICAgKHdhaXQtdW50aWwtcmVhZHkgY29ubmVjdGlvbnMgMCkpKQogICAoW2Nvbm5lY3Rpb25zIHdhaXRlZC1tc10KLSAgICAobGV0IFtpbnRlcnZhbC1tcyAxMAotICAgICAgICAgIG1heC13YWl0LW1zIDUwMDBdCi0gICAgICAoaWYtbm90IChldmVyeT8gaXMtY29ubmVjdGlvbi1yZWFkeSBjb25uZWN0aW9ucykKLSAgICAgICAgKGlmICg8PSB3YWl0ZWQtbXMgbWF4LXdhaXQtbXMpCi0gICAgICAgICAgKGRvCi0gICAgICAgICAgICAoVGhyZWFkL3NsZWVwIGludGVydmFsLW1zKQotICAgICAgICAgICAgKHdhaXQtdW50aWwtcmVhZHkgY29ubmVjdGlvbnMgKCsgd2FpdGVkLW1zIGludGVydmFsLW1zKSkpCi0gICAgICAgICAgKHRocm93IChSdW50aW1lRXhjZXB0aW9uLiAoc3RyICJOZXR0eSBjb25uZWN0aW9ucyB3ZXJlIG5vdCByZWFkeSB3aXRoaW4gIiBtYXgtd2FpdC1tcyAiIG1zIikpKSkKLSAgICAgICAgKGxvZy1tZXNzYWdlICJBbGwgTmV0dHkgY29ubmVjdGlvbnMgYXJlIHJlYWR5IikpKSkpCisgICAobG9vcCBbY29ubmVjdGlvbnMgY29ubmVjdGlvbnMgd2FpdGVkLW1zIHdhaXRlZC1tc10KKyAgICAgKGxldCBbaW50ZXJ2YWwtbXMgMTAKKyAgICAgICAgICAgbWF4LXdhaXQtbXMgNTAwMF0KKyAgICAgICAoaWYtbm90IChldmVyeT8gaXMtY29ubmVjdGlvbi1yZWFkeSBjb25uZWN0aW9ucykKKyAgICAgICAgIChpZiAoPD0gd2FpdGVkLW1zIG1heC13YWl0LW1zKQorICAgICAgICAgICAoZG8KKyAgICAgICAgICAgICAoVGhyZWFkL3NsZWVwIGludGVydmFsLW1zKQorICAgICAgICAgICAgIChyZWN1ciBjb25uZWN0aW9ucyAoKyB3YWl0ZWQtbXMgaW50ZXJ2YWwtbXMpKSkKKyAgICAgICAgICAgKHRocm93IChSdW50aW1lRXhjZXB0aW9uLiAoc3RyICJOZXR0eSBjb25uZWN0aW9ucyB3ZXJlIG5vdCByZWFkeSB3aXRoaW4gIiBtYXgtd2FpdC1tcyAiIG1zIikpKSkKKyAgICAgICAgIChsb2ctbWVzc2FnZSAiQWxsIE5ldHR5IGNvbm5lY3Rpb25zIGFyZSByZWFkeSIpKSkpKSkKKworKGRlZm4gbWstY29ubmVjdGlvbi1jYWxsYmFjaworICAibWFrZSBhbiBJQ29ubmVjdGlvbkNhbGxiYWNrIgorICBbbXktZm5dCisgIChyZWlmeSBJQ29ubmVjdGlvbkNhbGxiYWNrCisgICAgKHJlY3YgW3RoaXMgYmF0Y2hdCisgICAgICAoZG9zZXEgW21zZyBiYXRjaF0KKyAgICAgICAgKG15LWZuIG1zZykpKSkpCisKKyhkZWZuIHJlZ2lzdGVyLWNhbGxiYWNrCisgICJyZWdpc3RlciB0aGUgbG9jYWwtdHJhbnNmZXItZm4gd2l0aCB0aGUgc2VydmVyIgorICBbbXktZm4gXklDb25uZWN0aW9uIHNvY2tldF0KKyAgKC5yZWdpc3RlclJlY3Ygc29ja2V0IChtay1jb25uZWN0aW9uLWNhbGxiYWNrIG15LWZuKSkpCisKKyhkZWZuLSB3YWl0LWZvci1ub3QtbmlsCisgIFthdG1dCisgICh3aGlsZS10aW1lb3V0IFRFU1QtVElNRU9VVC1NUyAobmlsPyBAYXRtKSAoVGhyZWFkL3NsZWVwIDEwKSkpCisKKyhkZWZuLSB0ZXN0LWJhc2ljLWZuIFtzdG9ybS1jb25mXQorICAobG9nLW1lc3NhZ2UgIjEuIFNob3VsZCBzZW5kIGFuZCByZWNlaXZlIGEgYmFzaWMgbWVzc2FnZSIpCisgIChsZXQgW3JlcV9tc2cgKFN0cmluZy4gIjAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIpCisgICAgICAgIGNvbnRleHQgKFRyYW5zcG9ydEZhY3RvcnkvbWFrZUNvbnRleHQgc3Rvcm0tY29uZikKKyAgICAgICAgcG9ydCAoYXZhaWxhYmxlLXBvcnQgNjcwMCkKKyAgICAgICAgcmVzcCAoYXRvbSBuaWwpCisgICAgICAgIHNlcnZlciAoLmJpbmQgY29udGV4dCBuaWwgcG9ydCkKKyAgICAgICAgXyAocmVnaXN0ZXItY2FsbGJhY2sgKGZuIFttZXNzYWdlXSAocmVzZXQhIHJlc3AgbWVzc2FnZSkpIHNlcnZlcikKKyAgICAgICAgY2xpZW50ICguY29ubmVjdCBjb250ZXh0IG5pbCAibG9jYWxob3N0IiBwb3J0KQorICAgICAgICBfICh3YWl0LXVudGlsLXJlYWR5IFtzZXJ2ZXIgY2xpZW50XSkKKyAgICAgICAgXyAoLnNlbmQgY2xpZW50IHRhc2sgKC5nZXRCeXRlcyByZXFfbXNnKSldCisgICAgKHdhaXQtZm9yLW5vdC1uaWwgcmVzcCkKKyAgICAoaXMgKD0gdGFzayAoLnRhc2sgQHJlc3ApKSkKKyAgICAoaXMgKD0gcmVxX21zZyAoU3RyaW5nLiAoLm1lc3NhZ2UgQHJlc3ApKSkpCisgICAgKC5jbG9zZSBjbGllbnQpCisgICAgKC5jbG9zZSBzZXJ2ZXIpCisgICAgKC50ZXJtIGNvbnRleHQpKSkKIAogKGRlZnRlc3QgdGVzdC1iYXNpYwotICAobG9nLW1lc3NhZ2UgIlNob3VsZCBzZW5kIGFuZCByZWNlaXZlIGEgYmFzaWMgbWVzc2FnZSIpCi0gIChsZXQgW3JlcV9tc2cgKFN0cmluZy4gIjAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIpCi0gICAgICAgIHN0b3JtLWNvbmYge1NUT1JNLU1FU1NBR0lORy1UUkFOU1BPUlQgImJhY2t0eXBlLnN0b3JtLm1lc3NhZ2luZy5uZXR0eS5Db250ZXh0IgorIChsZXQgW3N0b3JtLWNvbmYge1NUT1JNLU1FU1NBR0lORy1UUkFOU1BPUlQgImJhY2t0eXBlLnN0b3JtLm1lc3NhZ2luZy5uZXR0eS5Db250ZXh0IgogICAgICAgICAgICAgICAgICAgICBTVE9STS1NRVNTQUdJTkctTkVUVFktQVVUSEVOVElDQVRJT04gZmFsc2UKICAgICAgICAgICAgICAgICAgICAgU1RPUk0tTUVTU0FHSU5HLU5FVFRZLUJVRkZFUi1TSVpFIDEwMjQKICAgICAgICAgICAgICAgICAgICAgU1RPUk0tTUVTU0FHSU5HLU5FVFRZLU1BWC1SRVRSSUVTIDEwCkBAIC01NCwyNCArODksODAgQEAKICAgICAgICAgICAgICAgICAgICAgU1RPUk0tTUVTU0FHSU5HLU5FVFRZLU1BWC1TTEVFUC1NUyA1MDAwCiAgICAgICAgICAgICAgICAgICAgIFNUT1JNLU1FU1NBR0lORy1ORVRUWS1TRVJWRVItV09SS0VSLVRIUkVBRFMgMQogICAgICAgICAgICAgICAgICAgICBTVE9STS1NRVNTQUdJTkctTkVUVFktQ0xJRU5ULVdPUktFUi1USFJFQURTIDEKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBUT1BPTE9HWS1LUllPLUZBQ1RPUlkgImJhY2t0eXBlLnN0b3JtLnNlcmlhbGl6YXRpb24uRGVmYXVsdEtyeW9GYWN0b3J5IgorICAgICAgICAgICAgICAgICAgICBUT1BPTE9HWS1UVVBMRS1TRVJJQUxJWkVSICJiYWNrdHlwZS5zdG9ybS5zZXJpYWxpemF0aW9uLnR5cGVzLkxpc3REZWxlZ2F0ZVNlcmlhbGl6ZXIiCisgICAgICAgICAgICAgICAgICAgIFRPUE9MT0dZLUZBTEwtQkFDSy1PTi1KQVZBLVNFUklBTElaQVRJT04gZmFsc2UKKyAgICAgICAgICAgICAgICAgICAgVE9QT0xPR1ktU0tJUC1NSVNTSU5HLUtSWU8tUkVHSVNUUkFUSU9OUyBmYWxzZX0KKyAgICAgICAgc3Rvcm0tY29uZi1zYXNsIChhc3NvYyBzdG9ybS1jb25mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVE9STS1NRVNTQUdJTkctTkVUVFktQVVUSEVOVElDQVRJT04gdHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE9QT0xPR1ktTkFNRSAidG9wbzEtbmV0dHktc2FzbCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUT1JNLVpPT0tFRVBFUi1UT1BPTE9HWS1BVVRILVBBWUxPQUQgKHN0ciAoVXRpbHMvc2VjdXJlUmFuZG9tTG9uZykgIjoiIChVdGlscy9zZWN1cmVSYW5kb21Mb25nKSkpXQorICAgKHRlc3QtYmFzaWMtZm4gc3Rvcm0tY29uZikgICAgICAgICAgOzsgdGVzdCB3aXRoIHNhc2wgYXV0aGVudGljYXRpb24gZGlzYWJsZWQKKyAgICh0ZXN0LWJhc2ljLWZuIHN0b3JtLWNvbmYtc2FzbCkpKSAgIDs7IHRlc3Qgd2l0aCBzYXNsIGF1dGhlbnRpY2F0aW9uIGVuYWJsZWQKKworKGRlZm4tIHRlc3QtbG9hZC1mbiBbc3Rvcm0tY29uZl0KKyAgKGxvZy1tZXNzYWdlICIyIHRlc3QgbG9hZCIpCisgIChsZXQgW3JlcV9tc2cgKFN0cmluZy4gIjAxMjM0NTY3ODlhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiIpCiAgICAgICAgIGNvbnRleHQgKFRyYW5zcG9ydEZhY3RvcnkvbWFrZUNvbnRleHQgc3Rvcm0tY29uZikKKyAgICAgICAgcG9ydCAoYXZhaWxhYmxlLXBvcnQgNjcwMCkKKyAgICAgICAgcmVzcCAoYXRvbSBuaWwpCiAgICAgICAgIHNlcnZlciAoLmJpbmQgY29udGV4dCBuaWwgcG9ydCkKKyAgICAgICAgXyAocmVnaXN0ZXItY2FsbGJhY2sgKGZuIFttZXNzYWdlXSAocmVzZXQhIHJlc3AgbWVzc2FnZSkpIHNlcnZlcikKICAgICAgICAgY2xpZW50ICguY29ubmVjdCBjb250ZXh0IG5pbCAibG9jYWxob3N0IiBwb3J0KQogICAgICAgICBfICh3YWl0LXVudGlsLXJlYWR5IFtzZXJ2ZXIgY2xpZW50XSkKICAgICAgICAgXyAoLnNlbmQgY2xpZW50IHRhc2sgKC5nZXRCeXRlcyByZXFfbXNnKSkKLSAgICAgICAgaXRlciAoLnJlY3Ygc2VydmVyIDAgMCkKLSAgICAgICAgcmVzcCAoLm5leHQgaXRlcildCi0gICAgKGlzICg9IHRhc2sgKC50YXNrIHJlc3ApKSkKLSAgICAoaXMgKD0gcmVxX21zZyAoU3RyaW5nLiAoLm1lc3NhZ2UgcmVzcCkpKSkKKyAgICAgICAgXyAoLnNlbmRMb2FkTWV0cmljcyBzZXJ2ZXIgeyhpbnQgMSkgMC4wIChpbnQgMikgMS4wfSkKKyAgICAgICAgXyAod2hpbGUtdGltZW91dCA1MDAwIChlbXB0eT8gKC5nZXRMb2FkIGNsaWVudCBbKGludCAxKSAoaW50IDIpXSkpIChUaHJlYWQvc2xlZXAgMTApKQorICAgICAgICBsb2FkICguZ2V0TG9hZCBjbGllbnQgWyhpbnQgMSkgKGludCAyKV0pXQorICAgIChpcyAoPSAwLjAgKC5nZXRCb2x0TG9hZCAoLmdldCBsb2FkIChpbnQgMSkpKSkpCisgICAgKGlzICg9IDEuMCAoLmdldEJvbHRMb2FkICguZ2V0IGxvYWQgKGludCAyKSkpKSkKKyAgICAod2FpdC1mb3Itbm90LW5pbCByZXNwKQorICAgIChpcyAoPSB0YXNrICgudGFzayBAcmVzcCkpKQorICAgIChpcyAoPSByZXFfbXNnIChTdHJpbmcuICgubWVzc2FnZSBAcmVzcCkpKSkKKyAgICAoLmNsb3NlIGNsaWVudCkKKyAgICAoLmNsb3NlIHNlcnZlcikKKyAgICAoLnRlcm0gY29udGV4dCkpKQorCisoZGVmdGVzdCB0ZXN0LWxvYWQKKyAobGV0IFtzdG9ybS1jb25mIHtTVE9STS1NRVNTQUdJTkctVFJBTlNQT1JUICJiYWNrdHlwZS5zdG9ybS5tZXNzYWdpbmcubmV0dHkuQ29udGV4dCIKKyAgICAgICAgICAgICAgICAgICAgU1RPUk0tTUVTU0FHSU5HLU5FVFRZLUFVVEhFTlRJQ0FUSU9OIGZhbHNlCisgICAgICAgICAgICAgICAgICAgIFNUT1JNLU1FU1NBR0lORy1ORVRUWS1CVUZGRVItU0laRSAxMDI0CisgICAgICAgICAgICAgICAgICAgIFNUT1JNLU1FU1NBR0lORy1ORVRUWS1NQVgtUkVUUklFUyAxMAorICAgICAgICAgICAgICAgICAgICBTVE9STS1NRVNTQUdJTkctTkVUVFktTUlOLVNMRUVQLU1TIDEwMDAKKyAgICAgICAgICAgICAgICAgICAgU1RPUk0tTUVTU0FHSU5HLU5FVFRZLU1BWC1TTEVFUC1NUyA1MDAwCisgICAgICAgICAgICAgICAgICAgIFNUT1JNLU1FU1NBR0lORy1ORVRUWS1TRVJWRVItV09SS0VSLVRIUkVBRFMgMQorICAgICAgICAgICAgICAgICAgICBTVE9STS1NRVNTQUdJTkctTkVUVFktQ0xJRU5ULVdPUktFUi1USFJFQURTIDEKKyAgICAgICAgICAgICAgICAgICAgVE9QT0xPR1ktS1JZTy1GQUNUT1JZICJiYWNrdHlwZS5zdG9ybS5zZXJpYWxpemF0aW9uLkRlZmF1bHRLcnlvRmFjdG9yeSIKKyAgICAgICAgICAgICAgICAgICAgVE9QT0xPR1ktVFVQTEUtU0VSSUFMSVpFUiAiYmFja3R5cGUuc3Rvcm0uc2VyaWFsaXphdGlvbi50eXBlcy5MaXN0RGVsZWdhdGVTZXJpYWxpemVyIgorICAgICAgICAgICAgICAgICAgICBUT1BPTE9HWS1GQUxMLUJBQ0stT04tSkFWQS1TRVJJQUxJWkFUSU9OIGZhbHNlCisgICAgICAgICAgICAgICAgICAgIFRPUE9MT0dZLVNLSVAtTUlTU0lORy1LUllPLVJFR0lTVFJBVElPTlMgZmFsc2V9CisgICAgICAgIHN0b3JtLWNvbmYtc2FzbCAoYXNzb2Mgc3Rvcm0tY29uZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RPUk0tTUVTU0FHSU5HLU5FVFRZLUFVVEhFTlRJQ0FUSU9OIHRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRPUE9MT0dZLU5BTUUgInRvcG8xLW5ldHR5LXNhc2wiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVE9STS1aT09LRUVQRVItVE9QT0xPR1ktQVVUSC1QQVlMT0FEIChzdHIgKFV0aWxzL3NlY3VyZVJhbmRvbUxvbmcpICI6IiAoVXRpbHMvc2VjdXJlUmFuZG9tTG9uZykpKV0KKyAgICh0ZXN0LWxvYWQtZm4gc3Rvcm0tY29uZikgICAgICAgICAgOzsgdGVzdCB3aXRoIHNhc2wgYXV0aGVudGljYXRpb24gZGlzYWJsZWQKKyAgICh0ZXN0LWxvYWQtZm4gc3Rvcm0tY29uZi1zYXNsKSkpICAgOzsgdGVzdCB3aXRoIHNhc2wgYXV0aGVudGljYXRpb24gZW5hYmxlZAorCisoZGVmbiB0ZXN0LWxhcmdlLW1zZy1mbiBbc3Rvcm0tY29uZl0KKyAgKGxvZy1tZXNzYWdlICIzIFNob3VsZCBzZW5kIGFuZCByZWNlaXZlIGEgbGFyZ2UgbWVzc2FnZSIpCisgIChsZXQgW3JlcV9tc2cgKGFwcGx5IHN0ciAocmVwZWF0IDIwNDgwMDAgJ2MnKSkKKyAgICAgICAgY29udGV4dCAoVHJhbnNwb3J0RmFjdG9yeS9tYWtlQ29udGV4dCBzdG9ybS1jb25mKQorICAgICAgICBwb3J0IChhdmFpbGFibGUtcG9ydCA2NzAwKQorICAgICAgICByZXNwIChhdG9tIG5pbCkKKyAgICAgICAgc2VydmVyICguYmluZCBjb250ZXh0IG5pbCBwb3J0KQorICAgICAgICBfIChyZWdpc3Rlci1jYWxsYmFjayAoZm4gW21lc3NhZ2VdIChyZXNldCEgcmVzcCBtZXNzYWdlKSkgc2VydmVyKQorICAgICAgICBjbGllbnQgKC5jb25uZWN0IGNvbnRleHQgbmlsICJsb2NhbGhvc3QiIHBvcnQpCisgICAgICAgIF8gKHdhaXQtdW50aWwtcmVhZHkgW3NlcnZlciBjbGllbnRdKQorICAgICAgICBfICguc2VuZCBjbGllbnQgdGFzayAoLmdldEJ5dGVzIHJlcV9tc2cpKV0KKyAgICAod2FpdC1mb3Itbm90LW5pbCByZXNwKQorICAgIChpcyAoPSB0YXNrICgudGFzayBAcmVzcCkpKQorICAgIChpcyAoPSByZXFfbXNnIChTdHJpbmcuICgubWVzc2FnZSBAcmVzcCkpKSkKICAgICAoLmNsb3NlIGNsaWVudCkKICAgICAoLmNsb3NlIHNlcnZlcikKICAgICAoLnRlcm0gY29udGV4dCkpKQogCiAoZGVmdGVzdCB0ZXN0LWxhcmdlLW1zZwotICAobG9nLW1lc3NhZ2UgIlNob3VsZCBzZW5kIGFuZCByZWNlaXZlIGEgbGFyZ2UgbWVzc2FnZSIpCi0gIChsZXQgW3JlcV9tc2cgKGFwcGx5IHN0ciAocmVwZWF0IDIwNDgwMDAgJ2MnKSkKLSAgICAgICAgc3Rvcm0tY29uZiB7U1RPUk0tTUVTU0FHSU5HLVRSQU5TUE9SVCAiYmFja3R5cGUuc3Rvcm0ubWVzc2FnaW5nLm5ldHR5LkNvbnRleHQiCisgKGxldCBbc3Rvcm0tY29uZiB7U1RPUk0tTUVTU0FHSU5HLVRSQU5TUE9SVCAiYmFja3R5cGUuc3Rvcm0ubWVzc2FnaW5nLm5ldHR5LkNvbnRleHQiCiAgICAgICAgICAgICAgICAgICAgIFNUT1JNLU1FU1NBR0lORy1ORVRUWS1BVVRIRU5USUNBVElPTiBmYWxzZQogICAgICAgICAgICAgICAgICAgICBTVE9STS1NRVNTQUdJTkctTkVUVFktQlVGRkVSLVNJWkUgMTAyNDAwCiAgICAgICAgICAgICAgICAgICAgIFNUT1JNLU1FU1NBR0lORy1ORVRUWS1NQVgtUkVUUklFUyAxMApAQCAtNzksMjQgKzE3MCw5MiBAQAogICAgICAgICAgICAgICAgICAgICBTVE9STS1NRVNTQUdJTkctTkVUVFktTUFYLVNMRUVQLU1TIDUwMDAKICAgICAgICAgICAgICAgICAgICAgU1RPUk0tTUVTU0FHSU5HLU5FVFRZLVNFUlZFUi1XT1JLRVItVEhSRUFEUyAxCiAgICAgICAgICAgICAgICAgICAgIFNUT1JNLU1FU1NBR0lORy1ORVRUWS1DTElFTlQtV09SS0VSLVRIUkVBRFMgMQotICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFRPUE9MT0dZLUtSWU8tRkFDVE9SWSAiYmFja3R5cGUuc3Rvcm0uc2VyaWFsaXphdGlvbi5EZWZhdWx0S3J5b0ZhY3RvcnkiCisgICAgICAgICAgICAgICAgICAgIFRPUE9MT0dZLVRVUExFLVNFUklBTElaRVIgImJhY2t0eXBlLnN0b3JtLnNlcmlhbGl6YXRpb24udHlwZXMuTGlzdERlbGVnYXRlU2VyaWFsaXplciIKKyAgICAgICAgICAgICAgICAgICAgVE9QT0xPR1ktRkFMTC1CQUNLLU9OLUpBVkEtU0VSSUFMSVpBVElPTiBmYWxzZQorICAgICAgICAgICAgICAgICAgICBUT1BPTE9HWS1TS0lQLU1JU1NJTkctS1JZTy1SRUdJU1RSQVRJT05TIGZhbHNlfQorICAgICAgICBzdG9ybS1jb25mLXNhc2wgKGFzc29jIHN0b3JtLWNvbmYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUT1JNLU1FU1NBR0lORy1ORVRUWS1BVVRIRU5USUNBVElPTiB0cnVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUT1BPTE9HWS1OQU1FICJ0b3BvMS1uZXR0eS1zYXNsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RPUk0tWk9PS0VFUEVSLVRPUE9MT0dZLUFVVEgtUEFZTE9BRCAoc3RyIChVdGlscy9zZWN1cmVSYW5kb21Mb25nKSAiOiIgKFV0aWxzL3NlY3VyZVJhbmRvbUxvbmcpKSldCisgICAodGVzdC1sYXJnZS1tc2ctZm4gc3Rvcm0tY29uZikgICAgICAgICAgOzsgdGVzdCB3aXRoIHNhc2wgYXV0aGVudGljYXRpb24gZGlzYWJsZWQKKyAgICh0ZXN0LWxhcmdlLW1zZy1mbiBzdG9ybS1jb25mLXNhc2wpKSkgICA7OyB0ZXN0IHdpdGggc2FzbCBhdXRoZW50aWNhdGlvbiBlbmFibGVkCisKKyhkZWZuLSB0ZXN0LXNlcnZlci1kZWxheWVkLWZuIFtzdG9ybS1jb25mXQorICAobG9nLW1lc3NhZ2UgIjQuIHRlc3Qgc2VydmVyIGRlbGF5ZWQiKQorICAobGV0IFtyZXFfbXNnIChTdHJpbmcuICIwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiKQogICAgICAgICBjb250ZXh0IChUcmFuc3BvcnRGYWN0b3J5L21ha2VDb250ZXh0IHN0b3JtLWNvbmYpCi0gICAgICAgIHNlcnZlciAoLmJpbmQgY29udGV4dCBuaWwgcG9ydCkKKyAgICAgICAgcmVzcCAoYXRvbSBuaWwpCisgICAgICAgIHBvcnQgKGF2YWlsYWJsZS1wb3J0IDY3MDApCiAgICAgICAgIGNsaWVudCAoLmNvbm5lY3QgY29udGV4dCBuaWwgImxvY2FsaG9zdCIgcG9ydCkKLSAgICAgICAgXyAod2FpdC11bnRpbC1yZWFkeSBbc2VydmVyIGNsaWVudF0pCi0gICAgICAgIF8gKC5zZW5kIGNsaWVudCB0YXNrICguZ2V0Qnl0ZXMgcmVxX21zZykpCi0gICAgICAgIGl0ZXIgKC5yZWN2IHNlcnZlciAwIDApCi0gICAgICAgIHJlc3AgKC5uZXh0IGl0ZXIpXQotICAgIChpcyAoPSB0YXNrICgudGFzayByZXNwKSkpCi0gICAgKGlzICg9IHJlcV9tc2cgKFN0cmluZy4gKC5tZXNzYWdlIHJlc3ApKSkpCisKKyAgICAgICAgc2VydmVyIChUaHJlYWQuCisgICAgICAgICAgICAgICAgIChmbiBbXQorICAgICAgICAgICAgICAgICAgIChUaHJlYWQvc2xlZXAgMTAwKQorICAgICAgICAgICAgICAgICAgIChsZXQgW3NlcnZlciAoLmJpbmQgY29udGV4dCBuaWwgcG9ydCldCisgICAgICAgICAgICAgICAgICAgICAocmVnaXN0ZXItY2FsbGJhY2sgKGZuIFttZXNzYWdlXSAocmVzZXQhIHJlc3AgbWVzc2FnZSkpIHNlcnZlcikpKSldCisgICAgKC5zdGFydCBzZXJ2ZXIpCisgICAgKHdhaXQtdW50aWwtcmVhZHkgW3NlcnZlciBjbGllbnRdKQorICAgICguc2VuZCBjbGllbnQgdGFzayAoLmdldEJ5dGVzIHJlcV9tc2cpKQorCisgICAgKHdhaXQtZm9yLW5vdC1uaWwgcmVzcCkKKyAgICAoaXMgKD0gdGFzayAoLnRhc2sgQHJlc3ApKSkKKyAgICAoaXMgKD0gcmVxX21zZyAoU3RyaW5nLiAoLm1lc3NhZ2UgQHJlc3ApKSkpCisKKyAgICAoLmpvaW4gc2VydmVyKQogICAgICguY2xvc2UgY2xpZW50KQotICAgICguY2xvc2Ugc2VydmVyKQogICAgICgudGVybSBjb250ZXh0KSkpCiAKKyhkZWZ0ZXN0IHRlc3Qtc2VydmVyLWRlbGF5ZWQKKyAobGV0IFtzdG9ybS1jb25mIHtTVE9STS1NRVNTQUdJTkctVFJBTlNQT1JUICJiYWNrdHlwZS5zdG9ybS5tZXNzYWdpbmcubmV0dHkuQ29udGV4dCIKKyAgICAgICAgICAgICAgICAgICAgU1RPUk0tTUVTU0FHSU5HLU5FVFRZLUFVVEhFTlRJQ0FUSU9OIGZhbHNlCisgICAgICAgICAgICAgICAgICAgIFNUT1JNLU1FU1NBR0lORy1ORVRUWS1CVUZGRVItU0laRSAxMDI0CisgICAgICAgICAgICAgICAgICAgIFNUT1JNLU1FU1NBR0lORy1ORVRUWS1NQVgtUkVUUklFUyAxMAorICAgICAgICAgICAgICAgICAgICBTVE9STS1NRVNTQUdJTkctTkVUVFktTUlOLVNMRUVQLU1TIDEwMDAKKyAgICAgICAgICAgICAgICAgICAgU1RPUk0tTUVTU0FHSU5HLU5FVFRZLU1BWC1TTEVFUC1NUyA1MDAwCisgICAgICAgICAgICAgICAgICAgIFNUT1JNLU1FU1NBR0lORy1ORVRUWS1TRVJWRVItV09SS0VSLVRIUkVBRFMgMQorICAgICAgICAgICAgICAgICAgICBTVE9STS1NRVNTQUdJTkctTkVUVFktQ0xJRU5ULVdPUktFUi1USFJFQURTIDEKKyAgICAgICAgICAgICAgICAgICAgVE9QT0xPR1ktS1JZTy1GQUNUT1JZICJiYWNrdHlwZS5zdG9ybS5zZXJpYWxpemF0aW9uLkRlZmF1bHRLcnlvRmFjdG9yeSIKKyAgICAgICAgICAgICAgICAgICAgVE9QT0xPR1ktVFVQTEUtU0VSSUFMSVpFUiAiYmFja3R5cGUuc3Rvcm0uc2VyaWFsaXphdGlvbi50eXBlcy5MaXN0RGVsZWdhdGVTZXJpYWxpemVyIgorICAgICAgICAgICAgICAgICAgICBUT1BPTE9HWS1GQUxMLUJBQ0stT04tSkFWQS1TRVJJQUxJWkFUSU9OIGZhbHNlCisgICAgICAgICAgICAgICAgICAgIFRPUE9MT0dZLVNLSVAtTUlTU0lORy1LUllPLVJFR0lTVFJBVElPTlMgZmFsc2V9CisgICAgICAgIHN0b3JtLWNvbmYtc2FzbCAoYXNzb2Mgc3Rvcm0tY29uZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RPUk0tTUVTU0FHSU5HLU5FVFRZLUFVVEhFTlRJQ0FUSU9OIHRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRPUE9MT0dZLU5BTUUgInRvcG8xLW5ldHR5LXNhc2wiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVE9STS1aT09LRUVQRVItVE9QT0xPR1ktQVVUSC1QQVlMT0FEIChzdHIgKFV0aWxzL3NlY3VyZVJhbmRvbUxvbmcpICI6IiAoVXRpbHMvc2VjdXJlUmFuZG9tTG9uZykpKV0KKyAgICh0ZXN0LXNlcnZlci1kZWxheWVkLWZuIHN0b3JtLWNvbmYpICAgICAgICAgIDs7IHRlc3Qgd2l0aCBzYXNsIGF1dGhlbnRpY2F0aW9uIGRpc2FibGVkCisgICAodGVzdC1zZXJ2ZXItZGVsYXllZC1mbiBzdG9ybS1jb25mLXNhc2wpKSkgICA7OyB0ZXN0IHdpdGggc2FzbCBhdXRoZW50aWNhdGlvbiBlbmFibGVkCisKKworKGRlZm4tIHRlc3QtYmF0Y2gtZm4gW3N0b3JtLWNvbmZdCisgIChsb2ctbWVzc2FnZSAiNS4gdGVzdCBiYXRjaCIpCisgIChsZXQgW251bS1tZXNzYWdlcyAxMDAwMDAKKyAgICAgICAgXyAobG9nLW1lc3NhZ2UgIlNob3VsZCBzZW5kIGFuZCByZWNlaXZlIG1hbnkgbWVzc2FnZXMgKHRlc3Rpbmcgd2l0aCAiIG51bS1tZXNzYWdlcyAiIG1lc3NhZ2VzKSIpCisgICAgICAgIHJlc3AgKEFycmF5TGlzdC4pCisgICAgICAgIHJlY2VpdmVkIChhdG9tIDApCisgICAgICAgIGNvbnRleHQgKFRyYW5zcG9ydEZhY3RvcnkvbWFrZUNvbnRleHQgc3Rvcm0tY29uZikKKyAgICAgICAgcG9ydCAoYXZhaWxhYmxlLXBvcnQgNjcwMCkKKyAgICAgICAgc2VydmVyICguYmluZCBjb250ZXh0IG5pbCBwb3J0KQorICAgICAgICBfIChyZWdpc3Rlci1jYWxsYmFjayAoZm4gW21lc3NhZ2VdICguYWRkIHJlc3AgbWVzc2FnZSkgKHN3YXAhIHJlY2VpdmVkIGluYykpIHNlcnZlcikKKyAgICAgICAgY2xpZW50ICguY29ubmVjdCBjb250ZXh0IG5pbCAibG9jYWxob3N0IiBwb3J0KQorICAgICAgICBfICh3YWl0LXVudGlsLXJlYWR5IFtzZXJ2ZXIgY2xpZW50XSldCisgICAgKGRvc2VxIFtudW0gKHJhbmdlIDEgbnVtLW1lc3NhZ2VzKV0KKyAgICAgIChsZXQgW3JlcV9tc2cgKHN0ciBudW0pXQorICAgICAgICAoLnNlbmQgY2xpZW50IHRhc2sgKC5nZXRCeXRlcyByZXFfbXNnKSkpKQorCisgICAgKHdoaWxlLXRpbWVvdXQgVEVTVC1USU1FT1VULU1TICg8ICguc2l6ZSByZXNwKSAoLSBudW0tbWVzc2FnZXMgMSkpIChsb2ctbWVzc2FnZSAoLnNpemUgcmVzcCkgIiAiIG51bS1tZXNzYWdlcykgKFRocmVhZC9zbGVlcCAxMCkpCisKKyAgICAoZG9zZXEgW251bSAgKHJhbmdlIDEgbnVtLW1lc3NhZ2VzKV0KKyAgICAgIChsZXQgW3JlcV9tc2cgKHN0ciBudW0pCisgICAgICAgICAgICByZXNwX21zZyAoU3RyaW5nLiAoLm1lc3NhZ2UgKC5nZXQgcmVzcCAoLSBudW0gMSkpKSldCisgICAgICAgIChpcyAoPSByZXFfbXNnIHJlc3BfbXNnKSkpKQorCisgICAgKC5jbG9zZSBjbGllbnQpCisgICAgKC5jbG9zZSBzZXJ2ZXIpCisgICAgKC50ZXJtIGNvbnRleHQpKQogCiAoZGVmdGVzdCB0ZXN0LWJhdGNoCi0gIChsZXQgW251bS1tZXNzYWdlcyAxMDAwMDAKLSAgICAgICAgc3Rvcm0tY29uZiB7U1RPUk0tTUVTU0FHSU5HLVRSQU5TUE9SVCAiYmFja3R5cGUuc3Rvcm0ubWVzc2FnaW5nLm5ldHR5LkNvbnRleHQiCisgKGxldCBbc3Rvcm0tY29uZiB7U1RPUk0tTUVTU0FHSU5HLVRSQU5TUE9SVCAiYmFja3R5cGUuc3Rvcm0ubWVzc2FnaW5nLm5ldHR5LkNvbnRleHQiCiAgICAgICAgICAgICAgICAgICAgIFNUT1JNLU1FU1NBR0lORy1ORVRUWS1BVVRIRU5USUNBVElPTiBmYWxzZQogICAgICAgICAgICAgICAgICAgICBTVE9STS1NRVNTQUdJTkctTkVUVFktQlVGRkVSLVNJWkUgMTAyNDAwMAogICAgICAgICAgICAgICAgICAgICBTVE9STS1NRVNTQUdJTkctTkVUVFktTUFYLVJFVFJJRVMgMTAKQEAgLTEwNCwzMCArMjYzLDY1IEBACiAgICAgICAgICAgICAgICAgICAgIFNUT1JNLU1FU1NBR0lORy1ORVRUWS1NQVgtU0xFRVAtTVMgNTAwMAogICAgICAgICAgICAgICAgICAgICBTVE9STS1NRVNTQUdJTkctTkVUVFktU0VSVkVSLVdPUktFUi1USFJFQURTIDEKICAgICAgICAgICAgICAgICAgICAgU1RPUk0tTUVTU0FHSU5HLU5FVFRZLUNMSUVOVC1XT1JLRVItVEhSRUFEUyAxCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgXyAobG9nLW1lc3NhZ2UgIlNob3VsZCBzZW5kIGFuZCByZWNlaXZlIG1hbnkgbWVzc2FnZXMgKHRlc3Rpbmcgd2l0aCAiIG51bS1tZXNzYWdlcyAiIG1lc3NhZ2VzKSIpCi0gICAgICAgIGNvbnRleHQgKFRyYW5zcG9ydEZhY3RvcnkvbWFrZUNvbnRleHQgc3Rvcm0tY29uZikKLSAgICAgICAgc2VydmVyICguYmluZCBjb250ZXh0IG5pbCBwb3J0KQotICAgICAgICBjbGllbnQgKC5jb25uZWN0IGNvbnRleHQgbmlsICJsb2NhbGhvc3QiIHBvcnQpCi0gICAgICAgIF8gKHdhaXQtdW50aWwtcmVhZHkgW3NlcnZlciBjbGllbnRdKV0KLSAgICAoZG9zZXEgW251bSAgKHJhbmdlIDEgbnVtLW1lc3NhZ2VzKV0KLSAgICAgIChsZXQgW3JlcV9tc2cgKHN0ciBudW0pXQotICAgICAgICAoLnNlbmQgY2xpZW50IHRhc2sgKC5nZXRCeXRlcyByZXFfbXNnKSkpKQorICAgICAgICAgICAgICAgICAgICBUT1BPTE9HWS1LUllPLUZBQ1RPUlkgImJhY2t0eXBlLnN0b3JtLnNlcmlhbGl6YXRpb24uRGVmYXVsdEtyeW9GYWN0b3J5IgorICAgICAgICAgICAgICAgICAgICBUT1BPTE9HWS1UVVBMRS1TRVJJQUxJWkVSICJiYWNrdHlwZS5zdG9ybS5zZXJpYWxpemF0aW9uLnR5cGVzLkxpc3REZWxlZ2F0ZVNlcmlhbGl6ZXIiCisgICAgICAgICAgICAgICAgICAgIFRPUE9MT0dZLUZBTEwtQkFDSy1PTi1KQVZBLVNFUklBTElaQVRJT04gZmFsc2UKKyAgICAgICAgICAgICAgICAgICAgVE9QT0xPR1ktU0tJUC1NSVNTSU5HLUtSWU8tUkVHSVNUUkFUSU9OUyBmYWxzZX0KKyAgICAgICAgc3Rvcm0tY29uZi1zYXNsIChhc3NvYyBzdG9ybS1jb25mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVE9STS1NRVNTQUdJTkctTkVUVFktQVVUSEVOVElDQVRJT04gdHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE9QT0xPR1ktTkFNRSAidG9wbzEtbmV0dHktc2FzbCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUT1JNLVpPT0tFRVBFUi1UT1BPTE9HWS1BVVRILVBBWUxPQUQgKHN0ciAoVXRpbHMvc2VjdXJlUmFuZG9tTG9uZykgIjoiIChVdGlscy9zZWN1cmVSYW5kb21Mb25nKSkpXQorICAgKHRlc3QtYmF0Y2gtZm4gc3Rvcm0tY29uZikgICAgICAgICAgOzsgdGVzdCB3aXRoIHNhc2wgYXV0aGVudGljYXRpb24gZGlzYWJsZWQKKyAgICh0ZXN0LWJhdGNoLWZuIHN0b3JtLWNvbmYtc2FzbCkpKSAgIDs7IHRlc3Qgd2l0aCBzYXNsIGF1dGhlbnRpY2F0aW9uIGVuYWJsZWQKKykKIAotICAgIChsZXQgW3Jlc3AgKEFycmF5TGlzdC4pCi0gICAgICAgICAgcmVjZWl2ZWQgKGF0b20gMCldCi0gICAgICAod2hpbGUgKDwgQHJlY2VpdmVkICgtIG51bS1tZXNzYWdlcyAxKSkKLSAgICAgICAgKGxldCBbaXRlciAoLnJlY3Ygc2VydmVyIDAgMCldCi0gICAgICAgICAgKHdoaWxlICguaGFzTmV4dCBpdGVyKQotICAgICAgICAgICAgKGxldCBbbXNnICgubmV4dCBpdGVyKV0KLSAgICAgICAgICAgICAgKC5hZGQgcmVzcCBtc2cpCi0gICAgICAgICAgICAgIChzd2FwISByZWNlaXZlZCBpbmMpCi0gICAgICAgICAgICAgICkpKSkKLSAgICAgIChkb3NlcSBbbnVtICAocmFuZ2UgMSBudW0tbWVzc2FnZXMpXQotICAgICAgKGxldCBbcmVxX21zZyAoc3RyIG51bSkKLSAgICAgICAgICAgIHJlc3BfbXNnIChTdHJpbmcuICgubWVzc2FnZSAoLmdldCByZXNwICgtIG51bSAxKSkpKV0KLSAgICAgICAgKGlzICg9IHJlcV9tc2cgcmVzcF9tc2cpKSkpKQorKGRlZm4tIHRlc3Qtc2VydmVyLWFsd2F5cy1yZWNvbm5lY3RzLWZuIFtzdG9ybS1jb25mXQorICAobG9nLW1lc3NhZ2UgIjYuIHRlc3Qgc2VydmVyIGFsd2F5cyByZWNvbm5lY3RzIikKKyAgICAobGV0IFtyZXFfbXNnIChTdHJpbmcuICIwMTIzNDU2Nzg5YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiKQorICAgICAgICAgIHN0b3JtLWNvbmYge1NUT1JNLU1FU1NBR0lORy1UUkFOU1BPUlQgImJhY2t0eXBlLnN0b3JtLm1lc3NhZ2luZy5uZXR0eS5Db250ZXh0IgorICAgICAgICAgICAgICAgICAgICAgIFNUT1JNLU1FU1NBR0lORy1ORVRUWS1BVVRIRU5USUNBVElPTiBmYWxzZQorICAgICAgICAgICAgICAgICAgICAgIFNUT1JNLU1FU1NBR0lORy1ORVRUWS1CVUZGRVItU0laRSAxMDI0CisgICAgICAgICAgICAgICAgICAgICAgU1RPUk0tTUVTU0FHSU5HLU5FVFRZLU1BWC1SRVRSSUVTIDIKKyAgICAgICAgICAgICAgICAgICAgICBTVE9STS1NRVNTQUdJTkctTkVUVFktTUlOLVNMRUVQLU1TIDEwCisgICAgICAgICAgICAgICAgICAgICAgU1RPUk0tTUVTU0FHSU5HLU5FVFRZLU1BWC1TTEVFUC1NUyA1MAorICAgICAgICAgICAgICAgICAgICAgIFNUT1JNLU1FU1NBR0lORy1ORVRUWS1TRVJWRVItV09SS0VSLVRIUkVBRFMgMQorICAgICAgICAgICAgICAgICAgICAgIFNUT1JNLU1FU1NBR0lORy1ORVRUWS1DTElFTlQtV09SS0VSLVRIUkVBRFMgMQorICAgICAgICAgICAgICAgICAgICAgIFRPUE9MT0dZLUtSWU8tRkFDVE9SWSAiYmFja3R5cGUuc3Rvcm0uc2VyaWFsaXphdGlvbi5EZWZhdWx0S3J5b0ZhY3RvcnkiCisgICAgICAgICAgICAgICAgICAgICAgVE9QT0xPR1ktVFVQTEUtU0VSSUFMSVpFUiAiYmFja3R5cGUuc3Rvcm0uc2VyaWFsaXphdGlvbi50eXBlcy5MaXN0RGVsZWdhdGVTZXJpYWxpemVyIgorICAgICAgICAgICAgICAgICAgICAgIFRPUE9MT0dZLUZBTEwtQkFDSy1PTi1KQVZBLVNFUklBTElaQVRJT04gZmFsc2UKKyAgICAgICAgICAgICAgICAgICAgICBUT1BPTE9HWS1TS0lQLU1JU1NJTkctS1JZTy1SRUdJU1RSQVRJT05TIGZhbHNlfQorICAgICAgICAgIHJlc3AgKGF0b20gbmlsKQorICAgICAgICAgIGNvbnRleHQgKFRyYW5zcG9ydEZhY3RvcnkvbWFrZUNvbnRleHQgc3Rvcm0tY29uZikKKyAgICAgICAgICBwb3J0IChhdmFpbGFibGUtcG9ydCA2NzAwKQorICAgICAgICAgIGNsaWVudCAoLmNvbm5lY3QgY29udGV4dCBuaWwgImxvY2FsaG9zdCIgcG9ydCkKKyAgICAgICAgICBfICguc2VuZCBjbGllbnQgdGFzayAoLmdldEJ5dGVzIHJlcV9tc2cpKQorICAgICAgICAgIHNlcnZlciAoLmJpbmQgY29udGV4dCBuaWwgcG9ydCkKKyAgICAgICAgICBfIChyZWdpc3Rlci1jYWxsYmFjayAoZm4gW21lc3NhZ2VdIChyZXNldCEgcmVzcCBtZXNzYWdlKSkgc2VydmVyKQorICAgICAgICAgIF8gKHdhaXQtdW50aWwtcmVhZHkgW3NlcnZlciBjbGllbnRdKQorICAgICAgICAgIF8gKC5zZW5kIGNsaWVudCB0YXNrICguZ2V0Qnl0ZXMgcmVxX21zZykpXQorICAgICAgKHdhaXQtZm9yLW5vdC1uaWwgcmVzcCkKKyAgICAgIChpcyAoPSB0YXNrICgudGFzayBAcmVzcCkpKQorICAgICAgKGlzICg9IHJlcV9tc2cgKFN0cmluZy4gKC5tZXNzYWdlIEByZXNwKSkpKQorICAgICAgKC5jbG9zZSBjbGllbnQpCisgICAgICAoLmNsb3NlIHNlcnZlcikKKyAgICAgICgudGVybSBjb250ZXh0KSkpCiAKLSAgICAoLmNsb3NlIGNsaWVudCkKLSAgICAoLmNsb3NlIHNlcnZlcikKLSAgICAoLnRlcm0gY29udGV4dCkpKQorKGRlZnRlc3QgdGVzdC1zZXJ2ZXItYWx3YXlzLXJlY29ubmVjdHMKKyAobGV0IFtzdG9ybS1jb25mIHtTVE9STS1NRVNTQUdJTkctVFJBTlNQT1JUICJiYWNrdHlwZS5zdG9ybS5tZXNzYWdpbmcubmV0dHkuQ29udGV4dCIKKyAgICAgICAgICAgICAgICAgICAgU1RPUk0tTUVTU0FHSU5HLU5FVFRZLUFVVEhFTlRJQ0FUSU9OIGZhbHNlCisgICAgICAgICAgICAgICAgICAgIFNUT1JNLU1FU1NBR0lORy1ORVRUWS1CVUZGRVItU0laRSAxMDI0CisgICAgICAgICAgICAgICAgICAgIFNUT1JNLU1FU1NBR0lORy1ORVRUWS1NQVgtUkVUUklFUyAyCisgICAgICAgICAgICAgICAgICAgIFNUT1JNLU1FU1NBR0lORy1ORVRUWS1NSU4tU0xFRVAtTVMgMTAKKyAgICAgICAgICAgICAgICAgICAgU1RPUk0tTUVTU0FHSU5HLU5FVFRZLU1BWC1TTEVFUC1NUyA1MAorICAgICAgICAgICAgICAgICAgICBTVE9STS1NRVNTQUdJTkctTkVUVFktU0VSVkVSLVdPUktFUi1USFJFQURTIDEKKyAgICAgICAgICAgICAgICAgICAgU1RPUk0tTUVTU0FHSU5HLU5FVFRZLUNMSUVOVC1XT1JLRVItVEhSRUFEUyAxCisgICAgICAgICAgICAgICAgICAgIFRPUE9MT0dZLUtSWU8tRkFDVE9SWSAiYmFja3R5cGUuc3Rvcm0uc2VyaWFsaXphdGlvbi5EZWZhdWx0S3J5b0ZhY3RvcnkiCisgICAgICAgICAgICAgICAgICAgIFRPUE9MT0dZLVRVUExFLVNFUklBTElaRVIgImJhY2t0eXBlLnN0b3JtLnNlcmlhbGl6YXRpb24udHlwZXMuTGlzdERlbGVnYXRlU2VyaWFsaXplciIKKyAgICAgICAgICAgICAgICAgICAgVE9QT0xPR1ktRkFMTC1CQUNLLU9OLUpBVkEtU0VSSUFMSVpBVElPTiBmYWxzZQorICAgICAgICAgICAgICAgICAgICBUT1BPTE9HWS1TS0lQLU1JU1NJTkctS1JZTy1SRUdJU1RSQVRJT05TIGZhbHNlfQorICAgICAgICBzdG9ybS1jb25mLXNhc2wgKGFzc29jIHN0b3JtLWNvbmYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUT1JNLU1FU1NBR0lORy1ORVRUWS1BVVRIRU5USUNBVElPTiB0cnVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUT1BPTE9HWS1OQU1FICJ0b3BvMS1uZXR0eS1zYXNsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RPUk0tWk9PS0VFUEVSLVRPUE9MT0dZLUFVVEgtUEFZTE9BRCAoc3RyIChVdGlscy9zZWN1cmVSYW5kb21Mb25nKSAiOiIgKFV0aWxzL3NlY3VyZVJhbmRvbUxvbmcpKSldCisgICAodGVzdC1zZXJ2ZXItYWx3YXlzLXJlY29ubmVjdHMtZm4gc3Rvcm0tY29uZikgICAgICAgICAgOzsgdGVzdCB3aXRoIHNhc2wgYXV0aGVudGljYXRpb24gZGlzYWJsZWQKKyAgICh0ZXN0LXNlcnZlci1hbHdheXMtcmVjb25uZWN0cy1mbiBzdG9ybS1jb25mLXNhc2wpKSkgICA7OyB0ZXN0IHdpdGggc2FzbCBhdXRoZW50aWNhdGlvbiBlbmFibGVkCmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3Rlc3QvY2xqL2JhY2t0eXBlL3N0b3JtL21lc3NhZ2luZ190ZXN0LmNsaiBiL3N0b3JtLWNvcmUvdGVzdC9jbGovYmFja3R5cGUvc3Rvcm0vbWVzc2FnaW5nX3Rlc3QuY2xqCmluZGV4IDUzY2Q1NTUuLjg2MTYyZGQgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvdGVzdC9jbGovYmFja3R5cGUvc3Rvcm0vbWVzc2FnaW5nX3Rlc3QuY2xqCisrKyBiL3N0b3JtLWNvcmUvdGVzdC9jbGovYmFja3R5cGUvc3Rvcm0vbWVzc2FnaW5nX3Rlc3QuY2xqCkBAIC01MSw4ICs1MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiYSJdIFsiYiJdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF19CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXQotICAgICAgICAoaXMgKG1zPSAoYXBwbHkgY29uY2F0IChyZXBlYXQgNiBbWzFdIFsyXSBbM10gWzRdXSkpCi0gICAgICAgICAgICAgICAgIChyZWFkLXR1cGxlcyByZXN1bHRzICIyIikpKSkpKSkKKyAgICAgICAgKGlzICg9ICgqIDYgNCkgKC5zaXplIChyZWFkLXR1cGxlcyByZXN1bHRzICIyIikpKSkpKSkpCiAKIChleHRlbmQtdHlwZSBUZXN0RXZlbnRMb2dTcG91dAogICBDb21wbGV0YWJsZVNwb3V0CkBAIC02MiwyOCArNjEsMyBAQAogICAgICguY2xlYW51cCB0aGlzKSkKICAgKHN0YXJ0dXAgW3RoaXNdCiAgICAgKSkKLQotOzsgVGVzdCBBZGRpbmcgbW9yZSByZWNlaXZlciB0aHJlYWRzIHdvbid0IHZpb2xhdGUgdGhlIG1lc3NhZ2UgZGVsaXZlcnkgb3JkZXIgZ3VyYW50ZWUKLShkZWZ0ZXN0IHRlc3QtcmVjZWl2ZXItbWVzc2FnZS1vcmRlciAKLSAgKHdpdGgtc2ltdWxhdGVkLXRpbWUtbG9jYWwtY2x1c3RlciBbY2x1c3RlciA6c3VwZXJ2aXNvcnMgMSA6cG9ydHMtcGVyLXN1cGVydmlzb3IgMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpkYWVtb24tY29uZiB7VE9QT0xPR1ktV09SS0VSUyAyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7OyBDb25maWd1cmUgbXVsdGlwbGUgcmVjZWl2ZXIgdGhyZWFkcyBwZXIgd29ya2VyIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV09SS0VSLVJFQ0VJVkVSLVRIUkVBRC1DT1VOVCAyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVE9STS1MT0NBTC1NT0RFLVpNUSAgdHJ1ZSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUT1JNLU1FU1NBR0lORy1UUkFOU1BPUlQgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFja3R5cGUuc3Rvcm0ubWVzc2FnaW5nLm5ldHR5LkNvbnRleHQifV0KLSAgICAgIChsZXQgW3RvcG9sb2d5ICh0aHJpZnQvbWstdG9wb2xvZ3kKLSAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgIDs7IFRlc3RFdmVudExvZ1Nwb3V0IG91dHB1dChzb3VyY2VJZCwgZXZlbnRJZCksIGV2ZW50SWQgaXMgTW9ub3RvbmljYWxseSBpbmNyZWFzaW5nCi0gICAgICAgICAgICAgICAgICAgICAgIHsiMSIgKHRocmlmdC9tay1zcG91dC1zcGVjIChUZXN0RXZlbnRMb2dTcG91dC4gNDAwMCkgOnBhcmFsbGVsaXNtLWhpbnQgOCl9Ci0gICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICA7OyBmaWVsZCBncm91cGluZywgbWVzc2FnZSBmcm9tIHNhbWUgInNvdXJjZSIgdGFzayB3aWxsIGJlIGRlbGl2ZXJlZCB0byBzYW1lIGJvbHQgdGFzawotICAgICAgICAgICAgICAgICAgICAgICA7OyBXaGVuIHJlY2VpdmVkIG1lc3NhZ2Ugb3JkZXIgaXMgbm90IGtlcHQsIEVtaXQgYW4gZXJyb3IgVHVwbGUgCi0gICAgICAgICAgICAgICAgICAgICAgIHsiMiIgKHRocmlmdC9tay1ib2x0LXNwZWMgeyIxIiBbInNvdXJjZSJdfSAoVGVzdEV2ZW50T3JkZXJDaGVja0JvbHQuKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpwYXJhbGxlbGlzbS1oaW50IDQpCi0gICAgICAgICAgICAgICAgICAgICAgICB9KQotICAgICAgICAgICAgcmVzdWx0cyAoY29tcGxldGUtdG9wb2xvZ3kgY2x1c3RlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wb2xvZ3kpXQotICAgICAgICAKLSAgICAgICAgOzsgTm8gZXJyb3IgVHVwbGUgZnJvbSBCb2x0IFRlc3RFdmVudE9yZGVyQ2hlY2tCb2x0Ci0gICAgICAgIChpcyAoZW1wdHk/IChyZWFkLXR1cGxlcyByZXN1bHRzICIyIikpKSkpKQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS90ZXN0L2Nsai9iYWNrdHlwZS9zdG9ybS9tZXRyaWNzX3Rlc3QuY2xqIGIvc3Rvcm0tY29yZS90ZXN0L2Nsai9iYWNrdHlwZS9zdG9ybS9tZXRyaWNzX3Rlc3QuY2xqCmluZGV4IDkwYTNlMGMuLmFiM2E4ZWEgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvdGVzdC9jbGovYmFja3R5cGUvc3Rvcm0vbWV0cmljc190ZXN0LmNsagorKysgYi9zdG9ybS1jb3JlL3Rlc3QvY2xqL2JhY2t0eXBlL3N0b3JtL21ldHJpY3NfdGVzdC5jbGoKQEAgLTQ3LDcgKzQ3LDcgQEAKICAgICAgICAgICAgICkpKSkpKQogCiAoZGVmbiBhc3NlcnQtbG9vcCBbYWZuIGlkc10KLSAgKHdoaWxlIChub3QgKGV2ZXJ5PyBhZm4gaWRzKSkKKyAgKHdoaWxlLXRpbWVvdXQgVEVTVC1USU1FT1VULU1TIChub3QgKGV2ZXJ5PyBhZm4gaWRzKSkKICAgICAoVGhyZWFkL3NsZWVwIDEpKSkKIAogKGRlZm4gYXNzZXJ0LWFja2VkIFt0cmFja2VyICYgaWRzXQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS90ZXN0L2Nsai9iYWNrdHlwZS9zdG9ybS9tdWx0aWxhbmdfdGVzdC5jbGogYi9zdG9ybS1jb3JlL3Rlc3QvY2xqL2JhY2t0eXBlL3N0b3JtL211bHRpbGFuZ190ZXN0LmNsagppbmRleCBhNjI0NDAzLi5mZjhmMmYxIDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3Rlc3QvY2xqL2JhY2t0eXBlL3N0b3JtL211bHRpbGFuZ190ZXN0LmNsagorKysgYi9zdG9ybS1jb3JlL3Rlc3QvY2xqL2JhY2t0eXBlL3N0b3JtL211bHRpbGFuZ190ZXN0LmNsagpAQCAtNDcsOSArNDcsOSBAQAogICAgICAgICAgICAgICAgInRlc3QiCiAgICAgICAgICAgICAgICB7VE9QT0xPR1ktV09SS0VSUyAyMCBUT1BPTE9HWS1NRVNTQUdFLVRJTUVPVVQtU0VDUyAzIFRPUE9MT0dZLURFQlVHIHRydWV9CiAgICAgICAgICAgICAgICB0b3BvbG9neSkKLSAgICAgICAoVGhyZWFkL3NsZWVwIDEwMDAwKQorICAgICAgIChUaHJlYWQvc2xlZXAgMTEwMDApCiAgICAgICAgKC5raWxsVG9wb2xvZ3kgbmltYnVzICJ0ZXN0IikKLSAgICAgICAoVGhyZWFkL3NsZWVwIDEwMDAwKQorICAgICAgIChUaHJlYWQvc2xlZXAgMTEwMDApCiAgICAgICAgKSkpCiAKIApkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS90ZXN0L2Nsai9iYWNrdHlwZS9zdG9ybS9uaW1idXNfdGVzdC5jbGogYi9zdG9ybS1jb3JlL3Rlc3QvY2xqL2JhY2t0eXBlL3N0b3JtL25pbWJ1c190ZXN0LmNsagppbmRleCAwNjQ1ZjM5Li41M2Q0YmI4IDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3Rlc3QvY2xqL2JhY2t0eXBlL3N0b3JtL25pbWJ1c190ZXN0LmNsagorKysgYi9zdG9ybS1jb3JlL3Rlc3QvY2xqL2JhY2t0eXBlL3N0b3JtL25pbWJ1c190ZXN0LmNsagpAQCAtMTksMTIgKzE5LDE0IEBACiAgICg6cmVxdWlyZSBbYmFja3R5cGUuc3Rvcm0uZGFlbW9uIFtuaW1idXMgOmFzIG5pbWJ1c11dKQogICAoOnJlcXVpcmUgW2JhY2t0eXBlLnN0b3JtIFtjb252ZXJ0ZXIgOmFzIGNvbnZlcnRlcl1dKQogICAoOmltcG9ydCBbYmFja3R5cGUuc3Rvcm0udGVzdGluZyBUZXN0V29yZENvdW50ZXIgVGVzdFdvcmRTcG91dCBUZXN0R2xvYmFsQ291bnQKLSAgICAgICAgICAgIFRlc3RBZ2dyZWdhdGVzQ291bnRlciBUZXN0UGxhbm5lclNwb3V0IFRlc3RQbGFubmVyQm9sdF0pCisgICAgICAgICAgICBUZXN0QWdncmVnYXRlc0NvdW50ZXIgVGVzdFBsYW5uZXJTcG91dCBUZXN0UGxhbm5lckJvbHRdCisgICAgICAgICAgIFtiYWNrdHlwZS5zdG9ybS5uaW1idXMgSW5NZW1vcnlUb3BvbG9neUFjdGlvbk5vdGlmaWVyXSkKICAgKDppbXBvcnQgW2JhY2t0eXBlLnN0b3JtLnNjaGVkdWxlciBJTmltYnVzXSkKICAgKDppbXBvcnQgW2JhY2t0eXBlLnN0b3JtLm5pbWJ1cyBJTGVhZGVyRWxlY3RvciBOaW1idXNJbmZvXSkKICAgKDppbXBvcnQgW2JhY2t0eXBlLnN0b3JtLmdlbmVyYXRlZCBDcmVkZW50aWFscyBOb3RBbGl2ZUV4Y2VwdGlvbiBTdWJtaXRPcHRpb25zCiAgICAgICAgICAgICBUb3BvbG9neUluaXRpYWxTdGF0dXMgVG9wb2xvZ3lTdGF0dXMgQWxyZWFkeUFsaXZlRXhjZXB0aW9uIEtpbGxPcHRpb25zIFJlYmFsYW5jZU9wdGlvbnMKLSAgICAgICAgICAgIEludmFsaWRUb3BvbG9neUV4Y2VwdGlvbiBBdXRob3JpemF0aW9uRXhjZXB0aW9uXSkKKyAgICAgICAgICAgIEludmFsaWRUb3BvbG9neUV4Y2VwdGlvbiBBdXRob3JpemF0aW9uRXhjZXB0aW9uCisgICAgICAgICAgICBMb2dDb25maWcgTG9nTGV2ZWwgTG9nTGV2ZWxBY3Rpb25dKQogICAoOmltcG9ydCBbamF2YS51dGlsIEhhc2hNYXBdKQogICAoOmltcG9ydCBbamF2YS5pbyBGaWxlXSkKICAgKDppbXBvcnQgW2JhY2t0eXBlLnN0b3JtLnV0aWxzIFRpbWVdKQpAQCAtMTkwLDcgKzE5Miw3IEBACiAgICAgICApKSkKIAogKGRlZnRlc3QgdGVzdC1hc3NpZ25tZW50Ci0gICh3aXRoLWxvY2FsLWNsdXN0ZXIgW2NsdXN0ZXIgOnN1cGVydmlzb3JzIDQgOnBvcnRzLXBlci1zdXBlcnZpc29yIDMKKyAgKHdpdGgtc2ltdWxhdGVkLXRpbWUtbG9jYWwtY2x1c3RlciBbY2x1c3RlciA6c3VwZXJ2aXNvcnMgNCA6cG9ydHMtcGVyLXN1cGVydmlzb3IgMwogICAgICAgICAgICAgICAgICAgICAgICA6ZGFlbW9uLWNvbmYge1NVUEVSVklTT1ItRU5BQkxFIGZhbHNlIFRPUE9MT0dZLUFDS0VSLUVYRUNVVE9SUyAwIFRPUE9MT0dZLUVWRU5UTE9HR0VSLUVYRUNVVE9SUyAwfV0KICAgICAobGV0IFtzdGF0ZSAoOnN0b3JtLWNsdXN0ZXItc3RhdGUgY2x1c3RlcikKICAgICAgICAgICBuaW1idXMgKDpuaW1idXMgY2x1c3RlcikKQEAgLTIwNSw2ICsyMDcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICI0IiAodGhyaWZ0L21rLWJvbHQtc3BlYyB7IjEiIDpnbG9iYWwgIjIiIDpub25lfSAoVGVzdFBsYW5uZXJCb2x0LikgOnBhcmFsbGVsaXNtLWhpbnQgNCl9CiAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgXyAoc3VibWl0LWxvY2FsLXRvcG9sb2d5IG5pbWJ1cyAibXlzdG9ybSIge1RPUE9MT0dZLVdPUktFUlMgNH0gdG9wb2xvZ3kpCisgICAgICAgICAgXyAoYWR2YW5jZS1jbHVzdGVyLXRpbWUgY2x1c3RlciAxMSkKICAgICAgICAgICB0YXNrLWluZm8gKHN0b3JtLWNvbXBvbmVudC0+dGFzay1pbmZvIGNsdXN0ZXIgIm15c3Rvcm0iKV0KICAgICAgIChjaGVjay1jb25zaXN0ZW5jeSBjbHVzdGVyICJteXN0b3JtIikKICAgICAgIDs7IDMgc2hvdWxkIGJlIGFzc2lnbmVkIG9uY2UgKGlmIGl0IHdlcmUgb3B0aW1pemVkLCB3ZSdkIGhhdmUKQEAgLTIxNSw2ICsyMTgsNyBAQAogICAgICAgKGlzICg9IDEgKGNvdW50ICh0YXNrLWluZm8gIjMiKSkpKQogICAgICAgKGlzICg9IDQgKHN0b3JtLW51bS13b3JrZXJzIHN0YXRlICJteXN0b3JtIikpKQogICAgICAgKHN1Ym1pdC1sb2NhbC10b3BvbG9neSBuaW1idXMgInN0b3JtMiIge1RPUE9MT0dZLVdPUktFUlMgMjB9IHRvcG9sb2d5MikKKyAgICAgIChhZHZhbmNlLWNsdXN0ZXItdGltZSBjbHVzdGVyIDExKQogICAgICAgKGNoZWNrLWNvbnNpc3RlbmN5IGNsdXN0ZXIgInN0b3JtMiIpCiAgICAgICAoaXMgKD0gMiAoY291bnQgKC5hc3NpZ25tZW50cyBzdGF0ZSBuaWwpKSkpCiAgICAgICAobGV0IFt0YXNrLWluZm8gKHN0b3JtLWNvbXBvbmVudC0+dGFzay1pbmZvIGNsdXN0ZXIgInN0b3JtMiIpXQpAQCAtMjkzLDI4ICsyOTcsMjggQEAKICAgICAgICAgICAgICAgICAgICAgICB7IjEiICh0aHJpZnQvbWstc3BvdXQtc3BlYyAoVGVzdFBsYW5uZXJTcG91dC4gZmFsc2UpIDpwYXJhbGxlbGlzbS1oaW50IDMpfQogICAgICAgICAgICAgICAgICAgICAgIHsiMiIgKHRocmlmdC9tay1ib2x0LXNwZWMgeyIxIiA6bm9uZX0gKFRlc3RQbGFubmVyQm9sdC4pIDpwYXJhbGxlbGlzbS1oaW50IDUpCiAgICAgICAgICAgICAgICAgICAgICAgICIzIiAodGhyaWZ0L21rLWJvbHQtc3BlYyB7IjIiIDpub25lfSAoVGVzdFBsYW5uZXJCb2x0LikpfSkpCi0gICAgICAgICAgCisKICAgICAgIChzdWJtaXQtbG9jYWwtdG9wb2xvZ3kgbmltYnVzICJub25pc28iIHtUT1BPTE9HWS1XT1JLRVJTIDR9IHRvcG9sb2d5KQotICAgICAgKGFkdmFuY2UtY2x1c3Rlci10aW1lIGNsdXN0ZXIgMSkKKyAgICAgIChhZHZhbmNlLWNsdXN0ZXItdGltZSBjbHVzdGVyIDExKQogICAgICAgKGlzICg9IDQgKHRvcG9sb2d5LW51bS1ub2RlcyBzdGF0ZSAibm9uaXNvIikpKQogICAgICAgKGlzICg9IDQgKHN0b3JtLW51bS13b3JrZXJzIHN0YXRlICJub25pc28iKSkpCiAKICAgICAgIChzdWJtaXQtbG9jYWwtdG9wb2xvZ3kgbmltYnVzICJ0ZXN0ZXIxIiB7VE9QT0xPR1ktV09SS0VSUyA2fSB0b3BvbG9neSkKICAgICAgIChzdWJtaXQtbG9jYWwtdG9wb2xvZ3kgbmltYnVzICJ0ZXN0ZXIyIiB7VE9QT0xPR1ktV09SS0VSUyA2fSB0b3BvbG9neSkKLSAgICAgIChhZHZhbmNlLWNsdXN0ZXItdGltZSBjbHVzdGVyIDEpCi0gICAgCisgICAgICAoYWR2YW5jZS1jbHVzdGVyLXRpbWUgY2x1c3RlciAxMSkKKwogICAgICAgKGJpbmQgdGFzay1pbmZvLXRlc3RlcjEgKHN0b3JtLWNvbXBvbmVudC0+dGFzay1pbmZvIGNsdXN0ZXIgInRlc3RlcjEiKSkKICAgICAgIChiaW5kIHRhc2staW5mby10ZXN0ZXIyIChzdG9ybS1jb21wb25lbnQtPnRhc2staW5mbyBjbHVzdGVyICJ0ZXN0ZXIyIikpCi0gICAgICAgICAgCisKIAogICAgICAgKGlzICg9IDEgKHRvcG9sb2d5LW51bS1ub2RlcyBzdGF0ZSAibm9uaXNvIikpKQogICAgICAgKGlzICg9IDMgKHN0b3JtLW51bS13b3JrZXJzIHN0YXRlICJub25pc28iKSkpCiAKICAgICAgIChpcyAoPSB7MiAzfSAodG9wb2xvZ3ktbm9kZS1kaXN0cmlidXRpb24gc3RhdGUgInRlc3RlcjEiKSkpCiAgICAgICAoaXMgKD0gezMgMn0gKHRvcG9sb2d5LW5vZGUtZGlzdHJpYnV0aW9uIHN0YXRlICJ0ZXN0ZXIyIikpKQotICAgICAgCisKICAgICAgIChpcyAoYXBwbHkgZGlzam9pbnQ/IChtYXAgKHBhcnRpYWwgdG9wb2xvZ3ktbm9kZXMgc3RhdGUpIFsibm9uaXNvIiAidGVzdGVyMSIgInRlc3RlcjIiXSkpKQotICAgICAgCisKICAgICAgIChjaGVjay1jb25zaXN0ZW5jeSBjbHVzdGVyICJ0ZXN0ZXIxIikKICAgICAgIChjaGVjay1jb25zaXN0ZW5jeSBjbHVzdGVyICJ0ZXN0ZXIyIikKICAgICAgIChjaGVjay1jb25zaXN0ZW5jeSBjbHVzdGVyICJub25pc28iKQpAQCAtMzIyLDE2ICszMjYsMTYgQEAKICAgICAgIDs7Y2hlY2sgdGhhdCBub3RoaW5nIGdldHMgcmVhc3NpZ25lZAogICAgICAgKGJpbmQgdGVzdGVyMS1zbG90cyAodG9wb2xvZ3ktc2xvdHMgc3RhdGUgInRlc3RlcjEiKSkKICAgICAgIChiaW5kIHRlc3RlcjItc2xvdHMgKHRvcG9sb2d5LXNsb3RzIHN0YXRlICJ0ZXN0ZXIyIikpCi0gICAgICAoYmluZCBub25pc28tc2xvdHMgKHRvcG9sb2d5LXNsb3RzIHN0YXRlICJub25pc28iKSkgICAgCisgICAgICAoYmluZCBub25pc28tc2xvdHMgKHRvcG9sb2d5LXNsb3RzIHN0YXRlICJub25pc28iKSkKICAgICAgIChhZHZhbmNlLWNsdXN0ZXItdGltZSBjbHVzdGVyIDIwKQogICAgICAgKGlzICg9IHRlc3RlcjEtc2xvdHMgKHRvcG9sb2d5LXNsb3RzIHN0YXRlICJ0ZXN0ZXIxIikpKQogICAgICAgKGlzICg9IHRlc3RlcjItc2xvdHMgKHRvcG9sb2d5LXNsb3RzIHN0YXRlICJ0ZXN0ZXIyIikpKQogICAgICAgKGlzICg9IG5vbmlzby1zbG90cyAodG9wb2xvZ3ktc2xvdHMgc3RhdGUgIm5vbmlzbyIpKSkKLSAgICAgIAorCiAgICAgICApKSkKIAogKGRlZnRlc3QgdGVzdC16ZXJvLWV4ZWN1dG9yLW9yLXRhc2tzCi0gICh3aXRoLWxvY2FsLWNsdXN0ZXIgW2NsdXN0ZXIgOmRhZW1vbi1jb25mIHtTVVBFUlZJU09SLUVOQUJMRSBmYWxzZSBUT1BPTE9HWS1BQ0tFUi1FWEVDVVRPUlMgMCBUT1BPTE9HWS1FVkVOVExPR0dFUi1FWEVDVVRPUlMgMH1dCisgICh3aXRoLXNpbXVsYXRlZC10aW1lLWxvY2FsLWNsdXN0ZXIgW2NsdXN0ZXIgOmRhZW1vbi1jb25mIHtTVVBFUlZJU09SLUVOQUJMRSBmYWxzZSBUT1BPTE9HWS1BQ0tFUi1FWEVDVVRPUlMgMCBUT1BPTE9HWS1FVkVOVExPR0dFUi1FWEVDVVRPUlMgMH1dCiAgICAgKGxldCBbc3RhdGUgKDpzdG9ybS1jbHVzdGVyLXN0YXRlIGNsdXN0ZXIpCiAgICAgICAgICAgbmltYnVzICg6bmltYnVzIGNsdXN0ZXIpCiAgICAgICAgICAgdG9wb2xvZ3kgKHRocmlmdC9tay10b3BvbG9neQpAQCAtMzM5LDYgKzM0Myw3IEBACiAgICAgICAgICAgICAgICAgICAgIHsiMiIgKHRocmlmdC9tay1ib2x0LXNwZWMgeyIxIiA6bm9uZX0gKFRlc3RQbGFubmVyQm9sdC4pIDpwYXJhbGxlbGlzbS1oaW50IDEgOmNvbmYge1RPUE9MT0dZLVRBU0tTIDJ9KQogICAgICAgICAgICAgICAgICAgICAgIjMiICh0aHJpZnQvbWstYm9sdC1zcGVjIHsiMiIgOm5vbmV9IChUZXN0UGxhbm5lckJvbHQuKSA6Y29uZiB7VE9QT0xPR1ktVEFTS1MgNX0pfSkKICAgICAgICAgICBfIChzdWJtaXQtbG9jYWwtdG9wb2xvZ3kgbmltYnVzICJteXN0b3JtIiB7VE9QT0xPR1ktV09SS0VSUyA0fSB0b3BvbG9neSkKKyAgICAgICAgICBfIChhZHZhbmNlLWNsdXN0ZXItdGltZSBjbHVzdGVyIDExKQogICAgICAgICAgIHRhc2staW5mbyAoc3Rvcm0tY29tcG9uZW50LT50YXNrLWluZm8gY2x1c3RlciAibXlzdG9ybSIpXQogICAgICAgKGNoZWNrLWNvbnNpc3RlbmN5IGNsdXN0ZXIgIm15c3Rvcm0iKQogICAgICAgKGlzICg9IDAgKGNvdW50ICh0YXNrLWluZm8gIjEiKSkpKQpAQCAtMzQ4LDIwICszNTMsMjEgQEAKICAgICAgICkpKQogCiAoZGVmdGVzdCB0ZXN0LWV4ZWN1dG9yLWFzc2lnbm1lbnRzCi0gICh3aXRoLWxvY2FsLWNsdXN0ZXIgW2NsdXN0ZXIgOmRhZW1vbi1jb25mIHtTVVBFUlZJU09SLUVOQUJMRSBmYWxzZSBUT1BPTE9HWS1BQ0tFUi1FWEVDVVRPUlMgMCBUT1BPTE9HWS1FVkVOVExPR0dFUi1FWEVDVVRPUlMgMH1dCisgICh3aXRoLXNpbXVsYXRlZC10aW1lLWxvY2FsLWNsdXN0ZXJbY2x1c3RlciA6ZGFlbW9uLWNvbmYge1NVUEVSVklTT1ItRU5BQkxFIGZhbHNlIFRPUE9MT0dZLUFDS0VSLUVYRUNVVE9SUyAwIFRPUE9MT0dZLUVWRU5UTE9HR0VSLUVYRUNVVE9SUyAwfV0KICAgICAobGV0IFtuaW1idXMgKDpuaW1idXMgY2x1c3RlcikKICAgICAgICAgICB0b3BvbG9neSAodGhyaWZ0L21rLXRvcG9sb2d5CiAgICAgICAgICAgICAgICAgICAgIHsiMSIgKHRocmlmdC9tay1zcG91dC1zcGVjIChUZXN0UGxhbm5lclNwb3V0LiB0cnVlKSA6cGFyYWxsZWxpc20taGludCAzIDpjb25mIHtUT1BPTE9HWS1UQVNLUyA1fSl9CiAgICAgICAgICAgICAgICAgICAgIHsiMiIgKHRocmlmdC9tay1ib2x0LXNwZWMgeyIxIiA6bm9uZX0gKFRlc3RQbGFubmVyQm9sdC4pIDpwYXJhbGxlbGlzbS1oaW50IDggOmNvbmYge1RPUE9MT0dZLVRBU0tTIDJ9KQogICAgICAgICAgICAgICAgICAgICAgIjMiICh0aHJpZnQvbWstYm9sdC1zcGVjIHsiMiIgOm5vbmV9IChUZXN0UGxhbm5lckJvbHQuKSA6cGFyYWxsZWxpc20taGludCAzKX0pCiAgICAgICAgICAgXyAoc3VibWl0LWxvY2FsLXRvcG9sb2d5IG5pbWJ1cyAibXlzdG9ybSIge1RPUE9MT0dZLVdPUktFUlMgNH0gdG9wb2xvZ3kpCisgICAgICAgICAgXyAoYWR2YW5jZS1jbHVzdGVyLXRpbWUgY2x1c3RlciAxMSkKICAgICAgICAgICB0YXNrLWluZm8gKHN0b3JtLWNvbXBvbmVudC0+dGFzay1pbmZvIGNsdXN0ZXIgIm15c3Rvcm0iKQogICAgICAgICAgIGV4ZWN1dG9yLWluZm8gKC0+PiAoc3Rvcm0tY29tcG9uZW50LT5leGVjdXRvci1pbmZvIGNsdXN0ZXIgIm15c3Rvcm0iKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWFwLXZhbCAjKG1hcCBleGVjdXRvci1pZC0+dGFza3MgJSkpKV0KICAgICAgIChjaGVjay1jb25zaXN0ZW5jeSBjbHVzdGVyICJteXN0b3JtIikKICAgICAgIChpcyAoPSA1IChjb3VudCAodGFzay1pbmZvICIxIikpKSkKICAgICAgIChjaGVjay1kaXN0cmlidXRpb24gKGV4ZWN1dG9yLWluZm8gIjEiKSBbMiAyIDFdKQotICAgICAgCisKICAgICAgIChpcyAoPSAyIChjb3VudCAodGFzay1pbmZvICIyIikpKSkKICAgICAgIChjaGVjay1kaXN0cmlidXRpb24gKGV4ZWN1dG9yLWluZm8gIjIiKSBbMSAxXSkKIApAQCAtMzcwLDcgKzM3Niw3IEBACiAgICAgICApKSkKIAogKGRlZnRlc3QgdGVzdC1vdmVyLXBhcmFsbGVsaXNtLWFzc2lnbm1lbnQKLSAgKHdpdGgtbG9jYWwtY2x1c3RlciBbY2x1c3RlciA6c3VwZXJ2aXNvcnMgMiA6cG9ydHMtcGVyLXN1cGVydmlzb3IgNQorICAod2l0aC1zaW11bGF0ZWQtdGltZS1sb2NhbC1jbHVzdGVyIFtjbHVzdGVyIDpzdXBlcnZpc29ycyAyIDpwb3J0cy1wZXItc3VwZXJ2aXNvciA1CiAgICAgICAgICAgICAgICAgICAgICAgIDpkYWVtb24tY29uZiB7U1VQRVJWSVNPUi1FTkFCTEUgZmFsc2UgVE9QT0xPR1ktQUNLRVItRVhFQ1VUT1JTIDAgVE9QT0xPR1ktRVZFTlRMT0dHRVItRVhFQ1VUT1JTIDB9XQogICAgIChsZXQgW3N0YXRlICg6c3Rvcm0tY2x1c3Rlci1zdGF0ZSBjbHVzdGVyKQogICAgICAgICAgIG5pbWJ1cyAoOm5pbWJ1cyBjbHVzdGVyKQpAQCAtMzgxLDYgKzM4Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgIjQiICh0aHJpZnQvbWstYm9sdC1zcGVjIHsiMSIgOm5vbmV9IChUZXN0UGxhbm5lckJvbHQuKSA6cGFyYWxsZWxpc20taGludCAxMCl9CiAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgXyAoc3VibWl0LWxvY2FsLXRvcG9sb2d5IG5pbWJ1cyAidGVzdCIge1RPUE9MT0dZLVdPUktFUlMgN30gdG9wb2xvZ3kpCisgICAgICAgICAgXyAoYWR2YW5jZS1jbHVzdGVyLXRpbWUgY2x1c3RlciAxMSkKICAgICAgICAgICB0YXNrLWluZm8gKHN0b3JtLWNvbXBvbmVudC0+dGFzay1pbmZvIGNsdXN0ZXIgInRlc3QiKV0KICAgICAgIChjaGVjay1jb25zaXN0ZW5jeSBjbHVzdGVyICJ0ZXN0IikKICAgICAgIChpcyAoPSAyMSAoY291bnQgKHRhc2staW5mbyAiMSIpKSkpCkBAIC00MDgsNyArNDE1LDcgQEAKICAgICAgIChiaW5kIHN0YXRlICg6c3Rvcm0tY2x1c3Rlci1zdGF0ZSBjbHVzdGVyKSkKICAgICAgIChzdWJtaXQtbG9jYWwtdG9wb2xvZ3kgKDpuaW1idXMgY2x1c3RlcikgInRlc3QiIHtUT1BPTE9HWS1NRVNTQUdFLVRJTUVPVVQtU0VDUyAyMH0gdG9wb2xvZ3kpCiAgICAgICAoYmluZCBzdG9ybS1pZCAoZ2V0LXN0b3JtLWlkIHN0YXRlICJ0ZXN0IikpCi0gICAgICAoYWR2YW5jZS1jbHVzdGVyLXRpbWUgY2x1c3RlciA1KQorICAgICAgKGFkdmFuY2UtY2x1c3Rlci10aW1lIGNsdXN0ZXIgMTUpCiAgICAgICAoaXMgKG5vdC1uaWw/ICguc3Rvcm0tYmFzZSBzdGF0ZSBzdG9ybS1pZCBuaWwpKSkKICAgICAgIChpcyAobm90LW5pbD8gKC5hc3NpZ25tZW50LWluZm8gc3RhdGUgc3Rvcm0taWQgbmlsKSkpCiAgICAgICAoLmtpbGxUb3BvbG9neSAoOm5pbWJ1cyBjbHVzdGVyKSAidGVzdCIpCkBAIC00MjksMjMgKzQzNiwyNSBAQAogCiAgICAgICAoaXMgKHRocm93bj8gTm90QWxpdmVFeGNlcHRpb24gKC5raWxsVG9wb2xvZ3kgKDpuaW1idXMgY2x1c3RlcikgImxhbGFsYSIpKSkKICAgICAgIChzdWJtaXQtbG9jYWwtdG9wb2xvZ3kgKDpuaW1idXMgY2x1c3RlcikgIjJ0ZXN0IiB7VE9QT0xPR1ktTUVTU0FHRS1USU1FT1VULVNFQ1MgMTB9IHRvcG9sb2d5KQorICAgICAgKGFkdmFuY2UtY2x1c3Rlci10aW1lIGNsdXN0ZXIgMTEpCiAgICAgICAoaXMgKHRocm93bj8gQWxyZWFkeUFsaXZlRXhjZXB0aW9uIChzdWJtaXQtbG9jYWwtdG9wb2xvZ3kgKDpuaW1idXMgY2x1c3RlcikgIjJ0ZXN0IiB7fSB0b3BvbG9neSkpKQorICAgICAgKGFkdmFuY2UtY2x1c3Rlci10aW1lIGNsdXN0ZXIgMTEpCiAgICAgICAoYmluZCBzdG9ybS1pZCAoZ2V0LXN0b3JtLWlkIHN0YXRlICIydGVzdCIpKQogICAgICAgKGlzIChub3QtbmlsPyAoLnN0b3JtLWJhc2Ugc3RhdGUgc3Rvcm0taWQgbmlsKSkpCiAgICAgICAoLmtpbGxUb3BvbG9neSAoOm5pbWJ1cyBjbHVzdGVyKSAiMnRlc3QiKQogICAgICAgKGlzICh0aHJvd24/IEFscmVhZHlBbGl2ZUV4Y2VwdGlvbiAoc3VibWl0LWxvY2FsLXRvcG9sb2d5ICg6bmltYnVzIGNsdXN0ZXIpICIydGVzdCIge30gdG9wb2xvZ3kpKSkKLSAgICAgIChhZHZhbmNlLWNsdXN0ZXItdGltZSBjbHVzdGVyIDUpCisgICAgICAoYWR2YW5jZS1jbHVzdGVyLXRpbWUgY2x1c3RlciAxMSkKICAgICAgIChpcyAoPSAxIChjb3VudCAoLmhlYXJ0YmVhdC1zdG9ybXMgc3RhdGUpKSkpCi0gICAgICAKKwogICAgICAgKGFkdmFuY2UtY2x1c3Rlci10aW1lIGNsdXN0ZXIgNikKICAgICAgIChpcyAobmlsPyAoLnN0b3JtLWJhc2Ugc3RhdGUgc3Rvcm0taWQgbmlsKSkpCiAgICAgICAoaXMgKG5pbD8gKC5hc3NpZ25tZW50LWluZm8gc3RhdGUgc3Rvcm0taWQgbmlsKSkpCiAgICAgICAoYWR2YW5jZS1jbHVzdGVyLXRpbWUgY2x1c3RlciAxMSkKICAgICAgIChpcyAoPSAwIChjb3VudCAoLmhlYXJ0YmVhdC1zdG9ybXMgc3RhdGUpKSkpCi0gICAgICAKKwogICAgICAgKHN1Ym1pdC1sb2NhbC10b3BvbG9neSAoOm5pbWJ1cyBjbHVzdGVyKSAidGVzdDMiIHtUT1BPTE9HWS1NRVNTQUdFLVRJTUVPVVQtU0VDUyA1fSB0b3BvbG9neSkKICAgICAgIChiaW5kIHN0b3JtLWlkMyAoZ2V0LXN0b3JtLWlkIHN0YXRlICJ0ZXN0MyIpKQotICAgICAgKGFkdmFuY2UtY2x1c3Rlci10aW1lIGNsdXN0ZXIgMSkKKyAgICAgIChhZHZhbmNlLWNsdXN0ZXItdGltZSBjbHVzdGVyIDExKQogICAgICAgKC5yZW1vdmUtc3Rvcm0hIHN0YXRlIHN0b3JtLWlkMykKICAgICAgIChpcyAobmlsPyAoLnN0b3JtLWJhc2Ugc3RhdGUgc3Rvcm0taWQzIG5pbCkpKQogICAgICAgKGlzIChuaWw/ICguYXNzaWdubWVudC1pbmZvIHN0YXRlIHN0b3JtLWlkMyBuaWwpKSkKQEAgLTQ1NiwxMiArNDY1LDEzIEBACiAgICAgICA7OyB0aGlzIGd1YXJhbnRlZXMgdGhhdCBtb25pdG9yIHRocmVhZCB3b24ndCB0cmlnZ2VyIGZvciAxMCBtb3JlIHNlY29uZHMKICAgICAgIChhZHZhbmNlLXRpbWUtc2VjcyEgMTEpCiAgICAgICAod2FpdC11bnRpbC1jbHVzdGVyLXdhaXRpbmcgY2x1c3RlcikKLSAgICAgIAorCiAgICAgICAoc3VibWl0LWxvY2FsLXRvcG9sb2d5ICg6bmltYnVzIGNsdXN0ZXIpICJ0ZXN0MyIge1RPUE9MT0dZLU1FU1NBR0UtVElNRU9VVC1TRUNTIDV9IHRvcG9sb2d5KQogICAgICAgKGJpbmQgc3Rvcm0taWQzIChnZXQtc3Rvcm0taWQgc3RhdGUgInRlc3QzIikpCiAKKyAgICAgIChhZHZhbmNlLWNsdXN0ZXItdGltZSBjbHVzdGVyIDExKQogICAgICAgKGJpbmQgZXhlY3V0b3ItaWQgKGZpcnN0ICh0b3BvbG9neS1leGVjdXRvcnMgY2x1c3RlciBzdG9ybS1pZDMpKSkKLSAgICAgIAorCiAgICAgICAoZG8tZXhlY3V0b3ItaGVhcnRiZWF0IGNsdXN0ZXIgc3Rvcm0taWQzIGV4ZWN1dG9yLWlkKQogCiAgICAgICAoLmtpbGxUb3BvbG9neSAoOm5pbWJ1cyBjbHVzdGVyKSAidGVzdDMiKQpAQCAtNDcyLDEyICs0ODIsMTMgQEAKIAogICAgICAgOzsgdGVzdCBraWxsIHdpdGggb3B0cwogICAgICAgKHN1Ym1pdC1sb2NhbC10b3BvbG9neSAoOm5pbWJ1cyBjbHVzdGVyKSAidGVzdDQiIHtUT1BPTE9HWS1NRVNTQUdFLVRJTUVPVVQtU0VDUyAxMDB9IHRvcG9sb2d5KQorICAgICAgKGFkdmFuY2UtY2x1c3Rlci10aW1lIGNsdXN0ZXIgMTEpCiAgICAgICAoLmtpbGxUb3BvbG9neVdpdGhPcHRzICg6bmltYnVzIGNsdXN0ZXIpICJ0ZXN0NCIgKGRvdG8gKEtpbGxPcHRpb25zLikgKC5zZXRfd2FpdF9zZWNzIDEwKSkpCiAgICAgICAoYmluZCBzdG9ybS1pZDQgKGdldC1zdG9ybS1pZCBzdGF0ZSAidGVzdDQiKSkKICAgICAgIChhZHZhbmNlLWNsdXN0ZXItdGltZSBjbHVzdGVyIDkpCiAgICAgICAoaXMgKG5vdC1uaWw/ICguYXNzaWdubWVudC1pbmZvIHN0YXRlIHN0b3JtLWlkNCBuaWwpKSkKICAgICAgIChhZHZhbmNlLWNsdXN0ZXItdGltZSBjbHVzdGVyIDIpCi0gICAgICAoaXMgKG5pbD8gKC5hc3NpZ25tZW50LWluZm8gc3RhdGUgc3Rvcm0taWQ0IG5pbCkpKSAgICAgIAorICAgICAgKGlzIChuaWw/ICguYXNzaWdubWVudC1pbmZvIHN0YXRlIHN0b3JtLWlkNCBuaWwpKSkKICAgICAgICkpKQogCiAoZGVmdGVzdCB0ZXN0LXJlYXNzaWdubWVudApAQCAtNDk3LDEzICs1MDgsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgKSkKICAgICAgIChiaW5kIHN0YXRlICg6c3Rvcm0tY2x1c3Rlci1zdGF0ZSBjbHVzdGVyKSkKICAgICAgIChzdWJtaXQtbG9jYWwtdG9wb2xvZ3kgKDpuaW1idXMgY2x1c3RlcikgInRlc3QiIHtUT1BPTE9HWS1XT1JLRVJTIDJ9IHRvcG9sb2d5KQorICAgICAgKGFkdmFuY2UtY2x1c3Rlci10aW1lIGNsdXN0ZXIgMTEpCiAgICAgICAoY2hlY2stY29uc2lzdGVuY3kgY2x1c3RlciAidGVzdCIpCiAgICAgICAoYmluZCBzdG9ybS1pZCAoZ2V0LXN0b3JtLWlkIHN0YXRlICJ0ZXN0IikpCiAgICAgICAoYmluZCBbZXhlY3V0b3ItaWQxIGV4ZWN1dG9yLWlkMl0gICh0b3BvbG9neS1leGVjdXRvcnMgY2x1c3RlciBzdG9ybS1pZCkpCiAgICAgICAoYmluZCBhc3MxIChleGVjdXRvci1hc3NpZ25tZW50IGNsdXN0ZXIgc3Rvcm0taWQgZXhlY3V0b3ItaWQxKSkKICAgICAgIChiaW5kIGFzczIgKGV4ZWN1dG9yLWFzc2lnbm1lbnQgY2x1c3RlciBzdG9ybS1pZCBleGVjdXRvci1pZDIpKQogCi0gICAgICAoYWR2YW5jZS1jbHVzdGVyLXRpbWUgY2x1c3RlciA1OSkKKyAgICAgIChhZHZhbmNlLWNsdXN0ZXItdGltZSBjbHVzdGVyIDMwKQogICAgICAgKGRvLWV4ZWN1dG9yLWhlYXJ0YmVhdCBjbHVzdGVyIHN0b3JtLWlkIGV4ZWN1dG9yLWlkMSkKICAgICAgIChkby1leGVjdXRvci1oZWFydGJlYXQgY2x1c3RlciBzdG9ybS1pZCBleGVjdXRvci1pZDIpCiAKQEAgLTUyMyw3ICs1MzUsNyBAQAogICAgICAgKGRvLWV4ZWN1dG9yLWhlYXJ0YmVhdCBjbHVzdGVyIHN0b3JtLWlkIGV4ZWN1dG9yLWlkMSkKICAgICAgIChpcyAoPSBhc3MxIChleGVjdXRvci1hc3NpZ25tZW50IGNsdXN0ZXIgc3Rvcm0taWQgZXhlY3V0b3ItaWQxKSkpCiAgICAgICAoY2hlY2stY29uc2lzdGVuY3kgY2x1c3RlciAidGVzdCIpCi0gICAgICAKKwogICAgICAgKGFkdmFuY2UtY2x1c3Rlci10aW1lIGNsdXN0ZXIgMTEpCiAgICAgICAoaXMgKD0gYXNzMSAoZXhlY3V0b3ItYXNzaWdubWVudCBjbHVzdGVyIHN0b3JtLWlkIGV4ZWN1dG9yLWlkMSkpKQogICAgICAgKGlzIChub3Q9IGFzczIgKGV4ZWN1dG9yLWFzc2lnbm1lbnQgY2x1c3RlciBzdG9ybS1pZCBleGVjdXRvci1pZDIpKSkKQEAgLTU5NSwxMyArNjA3LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICkpCiAgICAgICAoYmluZCBzdGF0ZSAoOnN0b3JtLWNsdXN0ZXItc3RhdGUgY2x1c3RlcikpCiAgICAgICAoc3VibWl0LWxvY2FsLXRvcG9sb2d5ICg6bmltYnVzIGNsdXN0ZXIpICJ0ZXN0IiB7VE9QT0xPR1ktV09SS0VSUyAyfSB0b3BvbG9neSkKKyAgICAgIChhZHZhbmNlLWNsdXN0ZXItdGltZSBjbHVzdGVyIDExKQogICAgICAgKGNoZWNrLWNvbnNpc3RlbmN5IGNsdXN0ZXIgInRlc3QiKQogICAgICAgKGJpbmQgc3Rvcm0taWQgKGdldC1zdG9ybS1pZCBzdGF0ZSAidGVzdCIpKQogICAgICAgKGJpbmQgW2V4ZWN1dG9yLWlkMSBleGVjdXRvci1pZDJdICAodG9wb2xvZ3ktZXhlY3V0b3JzIGNsdXN0ZXIgc3Rvcm0taWQpKQogICAgICAgKGJpbmQgYXNzMSAoZXhlY3V0b3ItYXNzaWdubWVudCBjbHVzdGVyIHN0b3JtLWlkIGV4ZWN1dG9yLWlkMSkpCiAgICAgICAoYmluZCBhc3MyIChleGVjdXRvci1hc3NpZ25tZW50IGNsdXN0ZXIgc3Rvcm0taWQgZXhlY3V0b3ItaWQyKSkKLSAgICAgIAotICAgICAgKGFkdmFuY2UtY2x1c3Rlci10aW1lIGNsdXN0ZXIgNTkpCisKKyAgICAgIChhZHZhbmNlLWNsdXN0ZXItdGltZSBjbHVzdGVyIDMwKQogICAgICAgKGRvLWV4ZWN1dG9yLWhlYXJ0YmVhdCBjbHVzdGVyIHN0b3JtLWlkIGV4ZWN1dG9yLWlkMSkKICAgICAgIChkby1leGVjdXRvci1oZWFydGJlYXQgY2x1c3RlciBzdG9ybS1pZCBleGVjdXRvci1pZDIpCiAKQEAgLTY0OSw2ICs2NjIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAge30pKQogICAgICAgKGJpbmQgc3RhdGUgKDpzdG9ybS1jbHVzdGVyLXN0YXRlIGNsdXN0ZXIpKQogICAgICAgKHN1Ym1pdC1sb2NhbC10b3BvbG9neSAoOm5pbWJ1cyBjbHVzdGVyKSAidGVzdCIge1RPUE9MT0dZLVdPUktFUlMgNH0gdG9wb2xvZ3kpICA7IGRpc3RyaWJ1dGlvbiBzaG91bGQgYmUgMiwgMiwgMiwgMyBpZGVhbGx5CisgICAgICAoYWR2YW5jZS1jbHVzdGVyLXRpbWUgY2x1c3RlciAxMSkKICAgICAgIChiaW5kIHN0b3JtLWlkIChnZXQtc3Rvcm0taWQgc3RhdGUgInRlc3QiKSkKICAgICAgIChiaW5kIHNsb3QtZXhlY3V0b3JzIChzbG90LWFzc2lnbm1lbnRzIGNsdXN0ZXIgc3Rvcm0taWQpKQogICAgICAgKGNoZWNrLWV4ZWN1dG9yLWRpc3RyaWJ1dGlvbiBzbG90LWV4ZWN1dG9ycyBbOV0pCkBAIC02NzMsNyArNjg3LDcgQEAKICAgICAgIChiaW5kIGNvbW1vbiAoZmlyc3QgKGZpbmQtZmlyc3QgKGZuIFtbayB2XV0gKD0gMyAoY291bnQgdikpKSBzbG90LWV4ZWN1dG9yczIpKSkKICAgICAgIChpcyAobm90LW5pbD8gY29tbW9uKSkKICAgICAgIChpcyAoPSAoc2xvdC1leGVjdXRvcnMyIGNvbW1vbikgKHNsb3QtZXhlY3V0b3JzIGNvbW1vbikpKQotICAgICAgCisKICAgICAgIDs7IGNoZWNrIHRoYXQgc3RhcnQgdGltZXMgYXJlIGNoYW5nZWQgZm9yIGV2ZXJ5dGhpbmcgYnV0IHRoZSBjb21tb24gb25lCiAgICAgICAoYmluZCBzYW1lLWV4ZWN1dG9ycyAoc2xvdC1leGVjdXRvcnMyIGNvbW1vbikpCiAgICAgICAoYmluZCBjaGFuZ2VkLWV4ZWN1dG9ycyAoYXBwbHkgY29uY2F0ICh2YWxzIChkaXNzb2Mgc2xvdC1leGVjdXRvcnMyIGNvbW1vbikpKSkKQEAgLTY5OSwxMSArNzEzLDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7VE9QT0xPR1ktV09SS0VSUyAzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUT1BPTE9HWS1NRVNTQUdFLVRJTUVPVVQtU0VDUyA2MH0gdG9wb2xvZ3kpCisgICAgICAoYWR2YW5jZS1jbHVzdGVyLXRpbWUgY2x1c3RlciAxMSkKICAgICAgIChiaW5kIHN0b3JtLWlkIChnZXQtc3Rvcm0taWQgc3RhdGUgInRlc3QiKSkKICAgICAgIChhZGQtc3VwZXJ2aXNvciBjbHVzdGVyIDpwb3J0cyAzKQogICAgICAgKGFkZC1zdXBlcnZpc29yIGNsdXN0ZXIgOnBvcnRzIDMpCiAKLSAgICAgIChhZHZhbmNlLWNsdXN0ZXItdGltZSBjbHVzdGVyIDkxKQorICAgICAgKGFkdmFuY2UtY2x1c3Rlci10aW1lIGNsdXN0ZXIgMTEpCiAKICAgICAgIChiaW5kIHNsb3QtZXhlY3V0b3JzIChzbG90LWFzc2lnbm1lbnRzIGNsdXN0ZXIgc3Rvcm0taWQpKQogICAgICAgOzsgY2hlY2sgdGhhdCBhbGwgd29ya2VycyBhcmUgb24gb25lIG1hY2hpbmUKQEAgLTcxMSw3ICs3MjYsNyBAQAogICAgICAgKGNoZWNrLW51bS1ub2RlcyBzbG90LWV4ZWN1dG9ycyAxKQogICAgICAgKC5yZWJhbGFuY2UgKDpuaW1idXMgY2x1c3RlcikgInRlc3QiIChSZWJhbGFuY2VPcHRpb25zLikpCiAKLSAgICAgIChhZHZhbmNlLWNsdXN0ZXItdGltZSBjbHVzdGVyIDMxKQorICAgICAgKGFkdmFuY2UtY2x1c3Rlci10aW1lIGNsdXN0ZXIgMzApCiAgICAgICAoY2hlY2stZXhlY3V0b3ItZGlzdHJpYnV0aW9uIHNsb3QtZXhlY3V0b3JzIFsxIDEgMV0pCiAgICAgICAoY2hlY2stbnVtLW5vZGVzIHNsb3QtZXhlY3V0b3JzIDEpCiAKQEAgLTc0NSw2ICs3NjAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGVzdCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1RPUE9MT0dZLVdPUktFUlMgMwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE9QT0xPR1ktTUVTU0FHRS1USU1FT1VULVNFQ1MgMzB9IHRvcG9sb2d5KQorICAgICAgKGFkdmFuY2UtY2x1c3Rlci10aW1lIGNsdXN0ZXIgMTEpCiAgICAgICAoYmluZCBzdG9ybS1pZCAoZ2V0LXN0b3JtLWlkIHN0YXRlICJ0ZXN0IikpCiAgICAgICAoYmluZCBjaGVja2VyIChmbiBbZGlzdHJpYnV0aW9uXQogICAgICAgICAgICAgICAgICAgICAgIChjaGVjay1leGVjdXRvci1kaXN0cmlidXRpb24KQEAgLTgzNSw3ICs4NTEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7VE9QT0xPR1ktV09SS0VSUyAzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUT1BPTE9HWS1NRVNTQUdFLVRJTUVPVVQtU0VDUyA5MH0gdG9wb2xvZ3kzKQogCi0gICAgICAoYWR2YW5jZS1jbHVzdGVyLXRpbWUgY2x1c3RlciAzMSkKKyAgICAgIChhZHZhbmNlLWNsdXN0ZXItdGltZSBjbHVzdGVyIDExKQogCiAgICAgICAoY2hlY2stZm9yLWNvbGxpc2lvbnMgc3RhdGUpCiAgICAgICAoLnJlYmFsYW5jZSAoOm5pbWJ1cyBjbHVzdGVyKSAidGVzdCIgKGRvdG8gKFJlYmFsYW5jZU9wdGlvbnMuKQpAQCAtODc2LDcgKzg5Miw3IEBACiAgICAgICAoaXMgKHRocm93bj8gSW52YWxpZFRvcG9sb2d5RXhjZXB0aW9uCiAgICAgICAgICAgICAgICAgICAgKHN1Ym1pdC1sb2NhbC10b3BvbG9neSAoOm5pbWJ1cyBjbHVzdGVyKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3QiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7VE9QT0xPR1ktV09SS0VSUyAzfSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtUT1BPTE9HWS1XT1JLRVJTIDN9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BvbG9neSkpKQogICAgICAgKGJpbmQgdG9wb2xvZ3kgKHRocmlmdC9tay10b3BvbG9neQogICAgICAgICAgICAgICAgICAgICAgIHsiMSIgKHRocmlmdC9tay1zcG91dC1zcGVjIChUZXN0UGxhbm5lclNwb3V0LiB0cnVlKQpAQCAtMTAyMyw2ICsxMDM5LDkgQEAKIAogICAgICAgICAgICAgICA7Zmlyc3Qgd2UgdmVyaWZ5IHRoYXQgdGhlIG1hc3RlciBuaW1idXMgY2FuIHBlcmZvcm0gYWxsIGFjdGlvbnMsIGV2ZW4gd2l0aCBhbm90aGVyIG5pbWJ1cyBwcmVzZW50LgogICAgICAgICAgICAgICAoc3VibWl0LWxvY2FsLXRvcG9sb2d5IG5pbWJ1cyAidDEiIHt9IHRvcG9sb2d5KQorICAgICAgICAgICAgICA7OyBJbnN0ZWFkIG9mIHNsZWVwaW5nIHVudGlsIHRvcG9sb2d5IGlzIHNjaGVkdWxlZCwgcmViYWxhbmNlIHRvcG9sb2d5IHNvIG1rLWFzc2lnbm1lbnRzIGlzIGNhbGxlZC4KKyAgICAgICAgICAgICAgKC5yZWJhbGFuY2UgbmltYnVzICJ0MSIgKGRvdG8gKFJlYmFsYW5jZU9wdGlvbnMuKSAoLnNldF93YWl0X3NlY3MgMCkpKQorICAgICAgICAgICAgICAoVGhyZWFkL3NsZWVwIDEwMDApCiAgICAgICAgICAgICAgICguZGVhY3RpdmF0ZSBuaW1idXMgInQxIikKICAgICAgICAgICAgICAgKC5hY3RpdmF0ZSBuaW1idXMgInQxIikKICAgICAgICAgICAgICAgKC5yZWJhbGFuY2UgbmltYnVzICJ0MSIgKFJlYmFsYW5jZU9wdGlvbnMuKSkKQEAgLTEwNTQsMTUgKzEwNzMsMTUgQEAKICAgICAgICAgICAoLmRpc2Nvbm5lY3QgY2x1c3Rlci1zdGF0ZSkpKSkpKQogCiAoZGVmdGVzdCB0ZXN0LW5pbWJ1cy1pZmFjZS1zdWJtaXRUb3BvbG9neVdpdGhPcHRzLWNoZWNrcy1hdXRob3JpemF0aW9uCi0gICh3aXRoLWxvY2FsLWNsdXN0ZXIgW2NsdXN0ZXIgCi0gICAgICAgICAgICAgICAgICAgICAgIDpkYWVtb24tY29uZiB7TklNQlVTLUFVVEhPUklaRVIgCisgICh3aXRoLWxvY2FsLWNsdXN0ZXIgW2NsdXN0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgOmRhZW1vbi1jb25mIHtOSU1CVVMtQVVUSE9SSVpFUgogICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFja3R5cGUuc3Rvcm0uc2VjdXJpdHkuYXV0aC5hdXRob3JpemVyLkRlbnlBdXRob3JpemVyIn1dCiAgICAgKGxldCBbCiAgICAgICAgICAgbmltYnVzICg6bmltYnVzIGNsdXN0ZXIpCiAgICAgICAgICAgdG9wb2xvZ3kgKHRocmlmdC9tay10b3BvbG9neSB7fSB7fSkKICAgICAgICAgIF0KICAgICAgIChpcyAodGhyb3duPyBBdXRob3JpemF0aW9uRXhjZXB0aW9uCi0gICAgICAgICAgKHN1Ym1pdC1sb2NhbC10b3BvbG9neS13aXRoLW9wdHMgbmltYnVzICJteXN0b3JtIiB7fSB0b3BvbG9neSAKKyAgICAgICAgICAoc3VibWl0LWxvY2FsLXRvcG9sb2d5LXdpdGgtb3B0cyBuaW1idXMgIm15c3Rvcm0iIHt9IHRvcG9sb2d5CiAgICAgICAgICAgICAoU3VibWl0T3B0aW9ucy4gVG9wb2xvZ3lJbml0aWFsU3RhdHVzL0lOQUNUSVZFKSkKICAgICAgICAgKSkKICAgICApCkBAIC0xMDcwLDggKzEwODksOCBAQAogKQogCiAoZGVmdGVzdCB0ZXN0LW5pbWJ1cy1pZmFjZS1tZXRob2RzLWNoZWNrLWF1dGhvcml6YXRpb24KLSAgKHdpdGgtbG9jYWwtY2x1c3RlciBbY2x1c3RlciAKLSAgICAgICAgICAgICAgICAgICAgICAgOmRhZW1vbi1jb25mIHtOSU1CVVMtQVVUSE9SSVpFUiAKKyAgKHdpdGgtbG9jYWwtY2x1c3RlciBbY2x1c3RlcgorICAgICAgICAgICAgICAgICAgICAgICA6ZGFlbW9uLWNvbmYge05JTUJVUy1BVVRIT1JJWkVSCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYWNrdHlwZS5zdG9ybS5zZWN1cml0eS5hdXRoLmF1dGhvcml6ZXIuRGVueUF1dGhvcml6ZXIifV0KICAgICAobGV0IFsKICAgICAgICAgICBuaW1idXMgKDpuaW1idXMgY2x1c3RlcikKQEAgLTEwNzksNyArMTA5OCw3IEBACiAgICAgICAgICBdCiAgICAgICA7IEZha2UgZ29vZCBhdXRob3JpemF0aW9uIGFzIHBhcnQgb2Ygc2V0dXAuCiAgICAgICAobW9ja2luZyBbbmltYnVzL2NoZWNrLWF1dGhvcml6YXRpb24hXQotICAgICAgICAgIChzdWJtaXQtbG9jYWwtdG9wb2xvZ3ktd2l0aC1vcHRzIG5pbWJ1cyAidGVzdCIge30gdG9wb2xvZ3kgCisgICAgICAgICAgKHN1Ym1pdC1sb2NhbC10b3BvbG9neS13aXRoLW9wdHMgbmltYnVzICJ0ZXN0IiB7fSB0b3BvbG9neQogICAgICAgICAgICAgICAoU3VibWl0T3B0aW9ucy4gVG9wb2xvZ3lJbml0aWFsU3RhdHVzL0lOQUNUSVZFKSkKICAgICAgICkKICAgICAgIChzdHViYmluZyBbbmltYnVzL3N0b3JtLWFjdGl2ZT8gdHJ1ZV0KQEAgLTEyMTQsMTYgKzEyMzMsMTYgQEAKICAgICAgIChzdHViYmluZyBbdG9wb2xvZ3ktYmFzZXMgYm9ndXMtYmFzZXNdCiAgICAgICAgIChsZXQgW3RvcG9zICguZ2V0X3RvcG9sb2dpZXMgKC5nZXRDbHVzdGVySW5mbyBuaW1idXMpKV0KICAgICAgICAgICA7IFRoZSBudW1iZXIgb2YgdG9wb2xvZ2llcyBpbiB0aGUgc3VtbWFyeSBpcyBjb3JyZWN0LgotICAgICAgICAgIChpcyAoPSAoY291bnQgCisgICAgICAgICAgKGlzICg9IChjb3VudAogICAgICAgICAgICAgKGZpbHRlciAoZm4gW2JdIChzZWNvbmQgYikpIGJvZ3VzLWJhc2VzKSkgKGNvdW50IHRvcG9zKSkpCiAgICAgICAgICAgOyBFYWNoIHRvcG9sb2d5IHByZXNlbnQgaGFzIGEgdmFsaWQgbmFtZS4KICAgICAgICAgICAoaXMgKGVtcHR5PwogICAgICAgICAgICAgKGZpbHRlciAoZm4gW3RdIChvciAobmlsPyB0KSAobmlsPyAoLmdldF9uYW1lIHQpKSkpIHRvcG9zKSkpCiAgICAgICAgICAgOyBUaGUgdG9wb2xvZ2llcyBhcmUgdGhvc2Ugd2l0aCB2YWxpZCBiYXNlcy4KICAgICAgICAgICAoaXMgKGVtcHR5PwotICAgICAgICAgICAgKGZpbHRlciAoZm4gW3RdIAotICAgICAgICAgICAgICAob3IgCi0gICAgICAgICAgICAgICAgKG5pbD8gdCkgCisgICAgICAgICAgICAoZmlsdGVyIChmbiBbdF0KKyAgICAgICAgICAgICAgKG9yCisgICAgICAgICAgICAgICAgKG5pbD8gdCkKICAgICAgICAgICAgICAgICAobm90IChudW1iZXI/IChyZWFkLXN0cmluZyAoLmdldF9pZCB0KSkpKQogICAgICAgICAgICAgICAgIChvZGQ/IChyZWFkLXN0cmluZyAoLmdldF9pZCB0KSkpCiAgICAgICAgICAgICAgICkpIHRvcG9zKSkpCkBAIC0xMjQ5LDcgKzEyNjgsOCBAQAogICAgICAgICAgICAgICAgICAgICAgTklNQlVTLVRIUklGVC1QT1JUIDY2NjZ9CiAgICAgICAgICAgZXhwZWN0ZWQtYWNscyBuaW1idXMvTklNQlVTLVpLLUFDTFMKICAgICAgICAgICBmYWtlLWluaW1idXMgKHJlaWZ5IElOaW1idXMgKGdldEZvcmNlZFNjaGVkdWxlciBbdGhpc10gbmlsKSldCi0gICAgICAoc3R1YmJpbmcgW21rLWF1dGhvcml6YXRpb24taGFuZGxlciBuaWwKKyAgICAgIChzdHViYmluZyBbbmltYnVzLXRvcG8taGlzdG9yeS1zdGF0ZSBuaWwKKyAgICAgICAgICAgICAgICAgbWstYXV0aG9yaXphdGlvbi1oYW5kbGVyIG5pbAogICAgICAgICAgICAgICAgICBjbHVzdGVyL21rLXN0b3JtLWNsdXN0ZXItc3RhdGUgbmlsCiAgICAgICAgICAgICAgICAgIG5pbWJ1cy9maWxlLWNhY2hlLW1hcCBuaWwKICAgICAgICAgICAgICAgICAgdXB0aW1lLWNvbXB1dGVyIG5pbApAQCAtMTMxMiw2ICsxMzMyLDQ0IEBACiAgICAgICAgICguZGlzY29ubmVjdCBjbHVzdGVyLXN0YXRlKQogICAgICAgICApKSkpCiAKKyhkZWZ0ZXN0IHRlc3QtdG9wb2xvZ3ktYWN0aW9uLW5vdGlmaWVyCisgICh3aXRoLWlucHJvY2Vzcy16b29rZWVwZXIgemstcG9ydAorICAgICh3aXRoLWxvY2FsLXRtcCBbbmltYnVzLWRpcl0KKyAgICAgIChzdHViYmluZyBbemstbGVhZGVyLWVsZWN0b3IgKG1vY2stbGVhZGVyLWVsZWN0b3IpXQorICAgICAgICAobGV0bG9jYWxzCisgICAgICAgICAgKGJpbmQgY29uZiAobWVyZ2UgKHJlYWQtc3Rvcm0tY29uZmlnKQorICAgICAgICAgICAgICAgICAgICAgICB7U1RPUk0tWk9PS0VFUEVSLVNFUlZFUlMgWyJsb2NhbGhvc3QiXQorICAgICAgICAgICAgICAgICAgICAgICAgU1RPUk0tQ0xVU1RFUi1NT0RFICJsb2NhbCIKKyAgICAgICAgICAgICAgICAgICAgICAgIFNUT1JNLVpPT0tFRVBFUi1QT1JUIHprLXBvcnQKKyAgICAgICAgICAgICAgICAgICAgICAgIFNUT1JNLUxPQ0FMLURJUiBuaW1idXMtZGlyCisgICAgICAgICAgICAgICAgICAgICAgICBOSU1CVVMtVE9QT0xPR1ktQUNUSU9OLU5PVElGSUVSLVBMVUdJTiAoLmdldE5hbWUgSW5NZW1vcnlUb3BvbG9neUFjdGlvbk5vdGlmaWVyKX0pKQorICAgICAgICAgIChiaW5kIGNsdXN0ZXItc3RhdGUgKGNsdXN0ZXIvbWstc3Rvcm0tY2x1c3Rlci1zdGF0ZSBjb25mKSkKKyAgICAgICAgICAoYmluZCBuaW1idXMgKG5pbWJ1cy9zZXJ2aWNlLWhhbmRsZXIgY29uZiAobmltYnVzL3N0YW5kYWxvbmUtbmltYnVzKSkpCisgICAgICAgICAgKGJpbmQgbm90aWZpZXIgKEluTWVtb3J5VG9wb2xvZ3lBY3Rpb25Ob3RpZmllci4pKQorICAgICAgICAgIChzbGVlcC1zZWNzIDEpCisgICAgICAgICAgKGJpbmQgdG9wb2xvZ3kgKHRocmlmdC9tay10b3BvbG9neQorICAgICAgICAgICAgICAgICAgICAgICAgICAgeyIxIiAodGhyaWZ0L21rLXNwb3V0LXNwZWMgKFRlc3RQbGFubmVyU3BvdXQuIHRydWUpIDpwYXJhbGxlbGlzbS1oaW50IDMpfQorICAgICAgICAgICAgICAgICAgICAgICAgICAge30pKQorICAgICAgICAgIChzdWJtaXQtbG9jYWwtdG9wb2xvZ3kgbmltYnVzICJ0ZXN0LW5vdGlmaWNhdGlvbiIge1RPUE9MT0dZLU1FU1NBR0UtVElNRU9VVC1TRUNTIDMwfSB0b3BvbG9neSkKKworICAgICAgICAgICguZGVhY3RpdmF0ZSBuaW1idXMgInRlc3Qtbm90aWZpY2F0aW9uIikKKworICAgICAgICAgICguYWN0aXZhdGUgbmltYnVzICJ0ZXN0LW5vdGlmaWNhdGlvbiIpCisKKyAgICAgICAgICAoLnJlYmFsYW5jZSBuaW1idXMgInRlc3Qtbm90aWZpY2F0aW9uIiAoZG90byAoUmViYWxhbmNlT3B0aW9ucy4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLnNldF93YWl0X3NlY3MgMCkpKQorCisgICAgICAgICAgKC5raWxsVG9wb2xvZ3lXaXRoT3B0cyBuaW1idXMgInRlc3Qtbm90aWZpY2F0aW9uIiAoZG90byAoS2lsbE9wdGlvbnMuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC5zZXRfd2FpdF9zZWNzIDApKSkKKworICAgICAgICAgICguc2h1dGRvd24gbmltYnVzKQorCisgICAgICAgICAgOyBlbnN1cmUgbm90aWZpZXIgd2FzIGludm9rZWQgZm9yIGVhY2ggYWN0aW9uLGFuZCBpbiB0aGUgY29ycmVjdCBvcmRlci4KKyAgICAgICAgICAoaXMgKD0gWyJzdWJtaXRUb3BvbG9neSIsICJhY3RpdmF0ZSIsICJkZWFjdGl2YXRlIiwgImFjdGl2YXRlIiwgInJlYmFsYW5jZSIsICJraWxsVG9wb2xvZ3kiXQorICAgICAgICAgICAgICAgICguZ2V0VG9wb2xvZ3lBY3Rpb25zIG5vdGlmaWVyICJ0ZXN0LW5vdGlmaWNhdGlvbiIpKSkKKyAgICAgICAgICAoLmRpc2Nvbm5lY3QgY2x1c3Rlci1zdGF0ZSkKKyAgICAgICAgICApKSkpKQorCiAoZGVmdGVzdCB0ZXN0LWRlYnVnLW9uLWNvbXBvbmVudAogICAod2l0aC1sb2NhbC1jbHVzdGVyIFtjbHVzdGVyXQogICAgIChsZXQgW25pbWJ1cyAoOm5pbWJ1cyBjbHVzdGVyKQpAQCAtMTMyOSwzICsxMzg3LDU2IEBACiAgICAgICAgICAgICAgICAgICAgICB7fSldCiAgICAgICAoc3VibWl0LWxvY2FsLXRvcG9sb2d5IG5pbWJ1cyAidDEiIHtUT1BPTE9HWS1XT1JLRVJTIDF9IHRvcG9sb2d5KQogICAgICAgKC5kZWJ1ZyBuaW1idXMgInQxIiAiIiB0cnVlIDEwMCkpKSkKKworOzsgaWYgdGhlIHVzZXIgc2VuZHMgYW4gZW1wdHkgbG9nIGNvbmZpZywgbmltYnVzIHdpbGwgc2F5IHRoYXQgYWxsIAorOzsgbG9nIGNvbmZpZ3MgaXQgY29udGFpbnMgYXJlIExvZ0xldmVsQWN0aW9uL1VOQ0hBTkdFRAorKGRlZnRlc3QgZW1wdHktc2F2ZS1jb25maWctcmVzdWx0cy1pbi1hbGwtdW5jaGFuZ2VkLWFjdGlvbnMKKyAgKHdpdGgtbG9jYWwtY2x1c3RlciBbY2x1c3Rlcl0KKyAgICAobGV0IFtuaW1idXMgKDpuaW1idXMgY2x1c3RlcikKKyAgICAgICAgICBwcmV2aW91cy1jb25maWcgKExvZ0NvbmZpZy4pCisgICAgICAgICAgbGV2ZWwgKExvZ0xldmVsLikKKyAgICAgICAgICBtb2NrLWNvbmZpZyAoTG9nQ29uZmlnLildCisgICAgICA7OyBzZW5kIHNvbWV0aGluZyB3aXRoIGNvbnRlbnQgdG8gbmltYnVzIGJlZm9yZWhhbmQKKyAgICAgICguc2V0X3RhcmdldF9sb2dfbGV2ZWwgbGV2ZWwgIkVSUk9SIikKKyAgICAgICguc2V0X2FjdGlvbiBsZXZlbCBMb2dMZXZlbEFjdGlvbi9VUERBVEUpCisgICAgICAoLnB1dF90b19uYW1lZF9sb2dnZXJfbGV2ZWwgcHJldmlvdXMtY29uZmlnICJ0ZXN0IiBsZXZlbCkKKyAgICAgIChzdHViYmluZyBbbmltYnVzL2NoZWNrLXN0b3JtLWFjdGl2ZSEgbmlsCisgICAgICAgICAgICAgICAgIG5pbWJ1cy90cnktcmVhZC1zdG9ybS1jb25mIHt9XQorICAgICAgICAoLnNldExvZ0NvbmZpZyBuaW1idXMgImZvbyIgcHJldmlvdXMtY29uZmlnKQorICAgICAgICAoLnNldExvZ0NvbmZpZyBuaW1idXMgImZvbyIgbW9jay1jb25maWcpCisgICAgICAgIChsZXQgW3NhdmVkLWNvbmZpZyAoLmdldExvZ0NvbmZpZyBuaW1idXMgImZvbyIpCisgICAgICAgICAgICAgIGxldmVscyAoLmdldF9uYW1lZF9sb2dnZXJfbGV2ZWwgc2F2ZWQtY29uZmlnKV0KKyAgICAgICAgICAgKGlzICg9ICguZ2V0X2FjdGlvbiAoLmdldCBsZXZlbHMgInRlc3QiKSkgTG9nTGV2ZWxBY3Rpb24vVU5DSEFOR0VEKSkpKSkpKQorCisoZGVmdGVzdCBsb2ctbGV2ZWwtdXBkYXRlLW1lcmdlcy1hbmQtZmxhZ3MtZXhpc3RlbnQtbG9nLWxldmVsCisgICh3aXRoLWxvY2FsLWNsdXN0ZXIgW2NsdXN0ZXJdCisgICAgKHN0dWJiaW5nIFtuaW1idXMvY2hlY2stc3Rvcm0tYWN0aXZlISBuaWwKKyAgICAgICAgICAgICAgIG5pbWJ1cy90cnktcmVhZC1zdG9ybS1jb25mIHt9XQorICAgICAgKGxldCBbbmltYnVzICg6bmltYnVzIGNsdXN0ZXIpCisgICAgICAgICAgICBwcmV2aW91cy1jb25maWcgKExvZ0NvbmZpZy4pCisgICAgICAgICAgICBsZXZlbCAoTG9nTGV2ZWwuKQorICAgICAgICAgICAgb3RoZXItbGV2ZWwgKExvZ0xldmVsLikKKyAgICAgICAgICAgIG1vY2stY29uZmlnIChMb2dDb25maWcuKV0KKyAgICAgICAgOzsgc2VuZCBzb21ldGhpbmcgd2l0aCBjb250ZW50IHRvIG5pbWJ1cyBiZWZvcmVoYW5kCisgICAgICAgICguc2V0X3RhcmdldF9sb2dfbGV2ZWwgbGV2ZWwgIkVSUk9SIikKKyAgICAgICAgKC5zZXRfYWN0aW9uIGxldmVsIExvZ0xldmVsQWN0aW9uL1VQREFURSkKKyAgICAgICAgKC5wdXRfdG9fbmFtZWRfbG9nZ2VyX2xldmVsIHByZXZpb3VzLWNvbmZpZyAidGVzdCIgbGV2ZWwpCisKKyAgICAgICAgKC5zZXRfdGFyZ2V0X2xvZ19sZXZlbCBvdGhlci1sZXZlbCAiREVCVUciKQorICAgICAgICAoLnNldF9hY3Rpb24gb3RoZXItbGV2ZWwgTG9nTGV2ZWxBY3Rpb24vVVBEQVRFKQorICAgICAgICAoLnB1dF90b19uYW1lZF9sb2dnZXJfbGV2ZWwgcHJldmlvdXMtY29uZmlnICJvdGhlci10ZXN0IiBvdGhlci1sZXZlbCkKKyAgICAgICAgKC5zZXRMb2dDb25maWcgbmltYnVzICJmb28iIHByZXZpb3VzLWNvbmZpZykKKworICAgICAgICA7OyBvbmx5IGNoYW5nZSAidGVzdCIKKyAgICAgICAgKC5zZXRfdGFyZ2V0X2xvZ19sZXZlbCBsZXZlbCAiSU5GTyIpCisgICAgICAgICguc2V0X2FjdGlvbiBsZXZlbCBMb2dMZXZlbEFjdGlvbi9VUERBVEUpCisgICAgICAgICgucHV0X3RvX25hbWVkX2xvZ2dlcl9sZXZlbCBtb2NrLWNvbmZpZyAidGVzdCIgbGV2ZWwpCisgICAgICAgICguc2V0TG9nQ29uZmlnIG5pbWJ1cyAiZm9vIiBtb2NrLWNvbmZpZykKKworICAgICAgICAobGV0IFtzYXZlZC1jb25maWcgKC5nZXRMb2dDb25maWcgbmltYnVzICJmb28iKQorICAgICAgICAgICAgICBsZXZlbHMgKC5nZXRfbmFtZWRfbG9nZ2VyX2xldmVsIHNhdmVkLWNvbmZpZyldCisgICAgICAgICAgIChpcyAoPSAoLmdldF9hY3Rpb24gKC5nZXQgbGV2ZWxzICJ0ZXN0IikpIExvZ0xldmVsQWN0aW9uL1VQREFURSkpCisgICAgICAgICAgIChpcyAoPSAoLmdldF90YXJnZXRfbG9nX2xldmVsICguZ2V0IGxldmVscyAidGVzdCIpKSAiSU5GTyIpKQorCisgICAgICAgICAgIChpcyAoPSAoLmdldF9hY3Rpb24gKC5nZXQgbGV2ZWxzICJvdGhlci10ZXN0IikpIExvZ0xldmVsQWN0aW9uL1VOQ0hBTkdFRCkpCisgICAgICAgICAgIChpcyAoPSAoLmdldF90YXJnZXRfbG9nX2xldmVsICguZ2V0IGxldmVscyAib3RoZXItdGVzdCIpKSAiREVCVUciKSkpKSkpKQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS90ZXN0L2Nsai9iYWNrdHlwZS9zdG9ybS9zY2hlZHVsZXIvbXVsdGl0ZW5hbnRfc2NoZWR1bGVyX3Rlc3QuY2xqIGIvc3Rvcm0tY29yZS90ZXN0L2Nsai9iYWNrdHlwZS9zdG9ybS9zY2hlZHVsZXIvbXVsdGl0ZW5hbnRfc2NoZWR1bGVyX3Rlc3QuY2xqCmluZGV4IGQzNDdlZDUuLjRlN2U4ODQgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvdGVzdC9jbGovYmFja3R5cGUvc3Rvcm0vc2NoZWR1bGVyL211bHRpdGVuYW50X3NjaGVkdWxlcl90ZXN0LmNsagorKysgYi9zdG9ybS1jb3JlL3Rlc3QvY2xqL2JhY2t0eXBlL3N0b3JtL3NjaGVkdWxlci9tdWx0aXRlbmFudF9zY2hlZHVsZXJfdGVzdC5jbGoKQEAgLTQyLDcgKzQyLDcgQEAKIAogKGRlZnRlc3QgdGVzdC1ub2RlCiAgIChsZXQgW3N1cGVycyAoZ2VuLXN1cGVydmlzb3JzIDUpCi0gICAgICAgY2x1c3RlciAoQ2x1c3Rlci4gKG5pbWJ1cy9zdGFuZGFsb25lLW5pbWJ1cykgc3VwZXJzIHt9KQorICAgICAgIGNsdXN0ZXIgKENsdXN0ZXIuIChuaW1idXMvc3RhbmRhbG9uZS1uaW1idXMpIHN1cGVycyB7fSBuaWwpCiAgICAgICAgbm9kZS1tYXAgKE5vZGUvZ2V0QWxsTm9kZXNGcm9tIGNsdXN0ZXIpXQogICAgIChpcyAoPSA1ICguc2l6ZSBub2RlLW1hcCkpKQogICAgIChsZXQgW25vZGUgKC5nZXQgbm9kZS1tYXAgInN1cGVyMCIpXQpAQCAtODcsNyArODcsNyBAQAogCiAoZGVmdGVzdCB0ZXN0LWZyZWUtcG9vbAogICAobGV0IFtzdXBlcnMgKGdlbi1zdXBlcnZpc29ycyA1KQotICAgICAgIGNsdXN0ZXIgKENsdXN0ZXIuIChuaW1idXMvc3RhbmRhbG9uZS1uaW1idXMpIHN1cGVycyB7fSkKKyAgICAgICBjbHVzdGVyIChDbHVzdGVyLiAobmltYnVzL3N0YW5kYWxvbmUtbmltYnVzKSBzdXBlcnMge30gbmlsKQogICAgICAgIG5vZGUtbWFwIChOb2RlL2dldEFsbE5vZGVzRnJvbSBjbHVzdGVyKQogICAgICAgIGZyZWUtcG9vbCAoRnJlZVBvb2wuICldCiAgICAgOzsgYXNzaWduIG9uZSBub2RlIHNvIGl0IGlzIG5vdCBpbiB0aGUgcG9vbApAQCAtMTI1LDcgKzEyNSw3IEBACiAKIChkZWZ0ZXN0IHRlc3QtZGVmYXVsdC1wb29sLXNpbXBsZQogICAobGV0IFtzdXBlcnMgKGdlbi1zdXBlcnZpc29ycyA1KQotICAgICAgIGNsdXN0ZXIgKENsdXN0ZXIuIChuaW1idXMvc3RhbmRhbG9uZS1uaW1idXMpIHN1cGVycyB7fSkKKyAgICAgICBjbHVzdGVyIChDbHVzdGVyLiAobmltYnVzL3N0YW5kYWxvbmUtbmltYnVzKSBzdXBlcnMge30gbmlsKQogICAgICAgIG5vZGUtbWFwIChOb2RlL2dldEFsbE5vZGVzRnJvbSBjbHVzdGVyKQogICAgICAgIGZyZWUtcG9vbCAoRnJlZVBvb2wuICkKICAgICAgICBkZWZhdWx0LXBvb2wgKERlZmF1bHRQb29sLiApCkBAIC0xNjIsNyArMTYyLDcgQEAKIAogKGRlZnRlc3QgdGVzdC1kZWZhdWx0LXBvb2wtYmlnLXJlcXVlc3QKICAgKGxldCBbc3VwZXJzIChnZW4tc3VwZXJ2aXNvcnMgNSkKLSAgICAgICBjbHVzdGVyIChDbHVzdGVyLiAobmltYnVzL3N0YW5kYWxvbmUtbmltYnVzKSBzdXBlcnMge30pCisgICAgICAgY2x1c3RlciAoQ2x1c3Rlci4gKG5pbWJ1cy9zdGFuZGFsb25lLW5pbWJ1cykgc3VwZXJzIHt9IG5pbCkKICAgICAgICBub2RlLW1hcCAoTm9kZS9nZXRBbGxOb2Rlc0Zyb20gY2x1c3RlcikKICAgICAgICBmcmVlLXBvb2wgKEZyZWVQb29sLiApCiAgICAgICAgZGVmYXVsdC1wb29sIChEZWZhdWx0UG9vbC4gKQpAQCAtMTk5LDcgKzE5OSw3IEBACiAKIChkZWZ0ZXN0IHRlc3QtZGVmYXVsdC1wb29sLWJpZy1yZXF1ZXN0LTIKICAgKGxldCBbc3VwZXJzIChnZW4tc3VwZXJ2aXNvcnMgMSkKLSAgICAgICBjbHVzdGVyIChDbHVzdGVyLiAobmltYnVzL3N0YW5kYWxvbmUtbmltYnVzKSBzdXBlcnMge30pCisgICAgICAgY2x1c3RlciAoQ2x1c3Rlci4gKG5pbWJ1cy9zdGFuZGFsb25lLW5pbWJ1cykgc3VwZXJzIHt9IG5pbCkKICAgICAgICBub2RlLW1hcCAoTm9kZS9nZXRBbGxOb2Rlc0Zyb20gY2x1c3RlcikKICAgICAgICBmcmVlLXBvb2wgKEZyZWVQb29sLiApCiAgICAgICAgZGVmYXVsdC1wb29sIChEZWZhdWx0UG9vbC4gKQpAQCAtMjQxLDcgKzI0MSw3IEBACiAoZGVmdGVzdCB0ZXN0LWRlZmF1bHQtcG9vbC1mdWxsCiAgIChsZXQgW3N1cGVycyAoZ2VuLXN1cGVydmlzb3JzIDIpIDs7bWFrZSAyIHN1cGVydmlzb3JzIGJ1dCBvbmx5IHNjaGVkdWxlIHdpdGggb25lIG9mIHRoZW0KICAgICAgICBzaW5nbGUtc3VwZXIgeyhmZmlyc3Qgc3VwZXJzKSAoc2Vjb25kIChmaXJzdCBzdXBlcnMpKX0KLSAgICAgICBzaW5nbGUtY2x1c3RlciAoQ2x1c3Rlci4gKG5pbWJ1cy9zdGFuZGFsb25lLW5pbWJ1cykgc2luZ2xlLXN1cGVyIHt9KQorICAgICAgIHNpbmdsZS1jbHVzdGVyIChDbHVzdGVyLiAobmltYnVzL3N0YW5kYWxvbmUtbmltYnVzKSBzaW5nbGUtc3VwZXIge30gbmlsKQogICAgICAgIGV4ZWN1dG9yMSAoZWQgMSkKICAgICAgICBleGVjdXRvcjIgKGVkIDIpCiAgICAgICAgZXhlY3V0b3IzIChlZCAzKQpAQCAtMjY4LDcgKzI2OCw3IEBACiAgICAgICAoaXMgKD0gIlJ1bm5pbmcgd2l0aCBmZXdlciBzbG90cyB0aGFuIHJlcXVlc3RlZCAoNC81KSIgKC5nZXQgKC5nZXRTdGF0dXNNYXAgc2luZ2xlLWNsdXN0ZXIpICJ0b3BvbG9neTEiKSkpCiAgICAgKQogCi0gICAgKGxldCBbY2x1c3RlciAoQ2x1c3Rlci4gKG5pbWJ1cy9zdGFuZGFsb25lLW5pbWJ1cykgc3VwZXJzICguZ2V0QXNzaWdubWVudHMgc2luZ2xlLWNsdXN0ZXIpKQorICAgIChsZXQgW2NsdXN0ZXIgKENsdXN0ZXIuIChuaW1idXMvc3RhbmRhbG9uZS1uaW1idXMpIHN1cGVycyAoLmdldEFzc2lnbm1lbnRzIHNpbmdsZS1jbHVzdGVyKSBuaWwpCiAgICAgICAgICBub2RlLW1hcCAoTm9kZS9nZXRBbGxOb2Rlc0Zyb20gY2x1c3RlcikKICAgICAgICAgIGZyZWUtcG9vbCAoRnJlZVBvb2wuICkKICAgICAgICAgIGRlZmF1bHQtcG9vbCAoRGVmYXVsdFBvb2wuICldCkBAIC0yODUsNyArMjg1LDcgQEAKIAogKGRlZnRlc3QgdGVzdC1kZWZhdWx0LXBvb2wtY29tcGxleAogICAobGV0IFtzdXBlcnMgKGdlbi1zdXBlcnZpc29ycyA1KQotICAgICAgIGNsdXN0ZXIgKENsdXN0ZXIuIChuaW1idXMvc3RhbmRhbG9uZS1uaW1idXMpIHN1cGVycyB7fSkKKyAgICAgICBjbHVzdGVyIChDbHVzdGVyLiAobmltYnVzL3N0YW5kYWxvbmUtbmltYnVzKSBzdXBlcnMge30gbmlsKQogICAgICAgIG5vZGUtbWFwIChOb2RlL2dldEFsbE5vZGVzRnJvbSBjbHVzdGVyKQogICAgICAgIGZyZWUtcG9vbCAoRnJlZVBvb2wuICkKICAgICAgICBkZWZhdWx0LXBvb2wgKERlZmF1bHRQb29sLiApCkBAIC0zNjcsNyArMzY3LDcgQEAKIAogKGRlZnRlc3QgdGVzdC1pc29sYXRlZC1wb29sLXNpbXBsZQogICAobGV0IFtzdXBlcnMgKGdlbi1zdXBlcnZpc29ycyA1KQotICAgICAgIGNsdXN0ZXIgKENsdXN0ZXIuIChuaW1idXMvc3RhbmRhbG9uZS1uaW1idXMpIHN1cGVycyB7fSkKKyAgICAgICBjbHVzdGVyIChDbHVzdGVyLiAobmltYnVzL3N0YW5kYWxvbmUtbmltYnVzKSBzdXBlcnMge30gbmlsKQogICAgICAgIG5vZGUtbWFwIChOb2RlL2dldEFsbE5vZGVzRnJvbSBjbHVzdGVyKQogICAgICAgIGZyZWUtcG9vbCAoRnJlZVBvb2wuICkKICAgICAgICBpc29sYXRlZC1wb29sIChJc29sYXRlZFBvb2wuIDUpCkBAIC00MTEsNyArNDExLDcgQEAKIAogKGRlZnRlc3QgdGVzdC1pc29sYXRlZC1wb29sLWJpZy1hc2sKICAgKGxldCBbc3VwZXJzIChnZW4tc3VwZXJ2aXNvcnMgNSkKLSAgICAgICBjbHVzdGVyIChDbHVzdGVyLiAobmltYnVzL3N0YW5kYWxvbmUtbmltYnVzKSBzdXBlcnMge30pCisgICAgICAgY2x1c3RlciAoQ2x1c3Rlci4gKG5pbWJ1cy9zdGFuZGFsb25lLW5pbWJ1cykgc3VwZXJzIHt9IG5pbCkKICAgICAgICBub2RlLW1hcCAoTm9kZS9nZXRBbGxOb2Rlc0Zyb20gY2x1c3RlcikKICAgICAgICBmcmVlLXBvb2wgKEZyZWVQb29sLiApCiAgICAgICAgaXNvbGF0ZWQtcG9vbCAoSXNvbGF0ZWRQb29sLiA1KQpAQCAtNDU1LDcgKzQ1NSw3IEBACiAKIChkZWZ0ZXN0IHRlc3QtaXNvbGF0ZWQtcG9vbC1jb21wbGV4CiAgIChsZXQgW3N1cGVycyAoZ2VuLXN1cGVydmlzb3JzIDUpCi0gICAgICAgY2x1c3RlciAoQ2x1c3Rlci4gKG5pbWJ1cy9zdGFuZGFsb25lLW5pbWJ1cykgc3VwZXJzIHt9KQorICAgICAgIGNsdXN0ZXIgKENsdXN0ZXIuIChuaW1idXMvc3RhbmRhbG9uZS1uaW1idXMpIHN1cGVycyB7fSBuaWwpCiAgICAgICAgbm9kZS1tYXAgKE5vZGUvZ2V0QWxsTm9kZXNGcm9tIGNsdXN0ZXIpCiAgICAgICAgZnJlZS1wb29sIChGcmVlUG9vbC4gKQogICAgICAgIGlzb2xhdGVkLXBvb2wgKElzb2xhdGVkUG9vbC4gNSkKQEAgLTU1OSw3ICs1NTksNyBAQAogCiAoZGVmdGVzdCB0ZXN0LWlzb2xhdGVkLXBvb2wtY29tcGxleC0yCiAgIChsZXQgW3N1cGVycyAoZ2VuLXN1cGVydmlzb3JzIDUpCi0gICAgICAgY2x1c3RlciAoQ2x1c3Rlci4gKG5pbWJ1cy9zdGFuZGFsb25lLW5pbWJ1cykgc3VwZXJzIHt9KQorICAgICAgIGNsdXN0ZXIgKENsdXN0ZXIuIChuaW1idXMvc3RhbmRhbG9uZS1uaW1idXMpIHN1cGVycyB7fSBuaWwpCiAgICAgICAgbm9kZS1tYXAgKE5vZGUvZ2V0QWxsTm9kZXNGcm9tIGNsdXN0ZXIpCiAgICAgICAgZnJlZS1wb29sIChGcmVlUG9vbC4gKQogICAgICAgIDs7bGlrZSBiZWZvcmUgYnV0IG5vdyB3ZSBjYW4gb25seSBob2xkIDIgbm9kZXMgbWF4LiAgRG9uJ3QgZ28gb3ZlcgpAQCAtNjU3LDcgKzY1Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiYm9sdDIyIiAxMCAyMF0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJib2x0MjMiIDIwIDMwXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbImJvbHQyNCIgMzAgNDBdXSkpCi0gICAgICAgY2x1c3RlciAoQ2x1c3Rlci4gKG5pbWJ1cy9zdGFuZGFsb25lLW5pbWJ1cykgc3VwZXJzIHt9KQorICAgICAgIGNsdXN0ZXIgKENsdXN0ZXIuIChuaW1idXMvc3RhbmRhbG9uZS1uaW1idXMpIHN1cGVycyB7fSBuaWwpCiAgICAgICAgbm9kZS1tYXAgKE5vZGUvZ2V0QWxsTm9kZXNGcm9tIGNsdXN0ZXIpCiAgICAgICAgdG9wb2xvZ2llcyAoVG9wb2xvZ2llcy4gKHRvLXRvcC1tYXAgW3RvcG9sb2d5MSB0b3BvbG9neTIgdG9wb2xvZ3kzXSkpCiAgICAgICAgY29uZiB7TVVMVElURU5BTlQtU0NIRURVTEVSLVVTRVItUE9PTFMgeyJ1c2VyQSIgNSAidXNlckIiIDV9fQpAQCAtNjk2LDcgKzY5Niw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEV4ZWN1dG9yRGV0YWlscy4gMTAgMTUpIChXb3JrZXJTbG90LiAic3VwZXIwIiAxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChFeGVjdXRvckRldGFpbHMuIDE1IDIwKSAoV29ya2VyU2xvdC4gInN1cGVyMCIgMSl9KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgY2x1c3RlciAoQ2x1c3Rlci4gKG5pbWJ1cy9zdGFuZGFsb25lLW5pbWJ1cykgc3VwZXJzIGV4aXN0aW5nLWFzc2lnbm1lbnRzKQorICAgICAgICBjbHVzdGVyIChDbHVzdGVyLiAobmltYnVzL3N0YW5kYWxvbmUtbmltYnVzKSBzdXBlcnMgZXhpc3RpbmctYXNzaWdubWVudHMgbmlsKQogICAgICAgICBub2RlLW1hcCAoTm9kZS9nZXRBbGxOb2Rlc0Zyb20gY2x1c3RlcikKICAgICAgICAgdG9wb2xvZ2llcyAoVG9wb2xvZ2llcy4gKHRvLXRvcC1tYXAgW3RvcG9sb2d5MV0pKQogICAgICAgICBjb25mIHtNVUxUSVRFTkFOVC1TQ0hFRFVMRVItVVNFUi1QT09MUyB7InVzZXJBIiA1ICJ1c2VyQiIgNX19CkBAIC03NDEsNyArNzQxLDcgQEAKICAgICAgICAgICB3b3JrZXItc2xvdC13aXRoLW11bHRpcGxlLWFzc2lnbm1lbnRzIChXb3JrZXJTbG90LiAic3VwZXIxIiAxKQogICAgICAgICAgIGV4aXN0aW5nLWFzc2lnbm1lbnRzIHsidG9wb2xvZ3kyIiAoU2NoZWR1bGVyQXNzaWdubWVudEltcGwuICJ0b3BvbG9neTIiIHsoRXhlY3V0b3JEZXRhaWxzLiAxIDEpIHdvcmtlci1zbG90LXdpdGgtbXVsdGlwbGUtYXNzaWdubWVudHN9KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidG9wb2xvZ3kzIiAoU2NoZWR1bGVyQXNzaWdubWVudEltcGwuICJ0b3BvbG9neTMiIHsoRXhlY3V0b3JEZXRhaWxzLiAyIDIpIHdvcmtlci1zbG90LXdpdGgtbXVsdGlwbGUtYXNzaWdubWVudHN9KX0KLSAgICAgICAgICBjbHVzdGVyIChDbHVzdGVyLiAobmltYnVzL3N0YW5kYWxvbmUtbmltYnVzKSBzdXBlcnMgZXhpc3RpbmctYXNzaWdubWVudHMpCisgICAgICAgICAgY2x1c3RlciAoQ2x1c3Rlci4gKG5pbWJ1cy9zdGFuZGFsb25lLW5pbWJ1cykgc3VwZXJzIGV4aXN0aW5nLWFzc2lnbm1lbnRzIG5pbCkKICAgICAgICAgICB0b3BvbG9naWVzIChUb3BvbG9naWVzLiAodG8tdG9wLW1hcCBbdG9wb2xvZ3kxIHRvcG9sb2d5MiB0b3BvbG9neTNdKSkKICAgICAgICAgICBjb25mIHtNVUxUSVRFTkFOVC1TQ0hFRFVMRVItVVNFUi1QT09MUyB7InVzZXJBIiAyICJ1c2VyQiIgMX19CiAgICAgICAgICAgc2NoZWR1bGVyIChNdWx0aXRlbmFudFNjaGVkdWxlci4pXQpAQCAtNzY5LDcgKzc2OSw3IEBACiAgICAgICAgICAgZXhpc3RpbmctYXNzaWdubWVudHMgeyJ0b3BvbG9neTEiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTY2hlZHVsZXJBc3NpZ25tZW50SW1wbC4gInRvcG9sb2d5MSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KEV4ZWN1dG9yRGV0YWlscy4gMCAwKSAoV29ya2VyU2xvdC4gInN1cGVyMCIgcG9ydC1ub3QtcmVwb3J0ZWQtYnktc3VwZXJ2aXNvcil9KX0KLSAgICAgICAgICBjbHVzdGVyIChDbHVzdGVyLiAobmltYnVzL3N0YW5kYWxvbmUtbmltYnVzKSBzdXBlcnMgZXhpc3RpbmctYXNzaWdubWVudHMpCisgICAgICAgICAgY2x1c3RlciAoQ2x1c3Rlci4gKG5pbWJ1cy9zdGFuZGFsb25lLW5pbWJ1cykgc3VwZXJzIGV4aXN0aW5nLWFzc2lnbm1lbnRzIG5pbCkKICAgICAgICAgICB0b3BvbG9naWVzIChUb3BvbG9naWVzLiAodG8tdG9wLW1hcCBbdG9wb2xvZ3kxXSkpCiAgICAgICAgICAgY29uZiB7fQogICAgICAgICAgIHNjaGVkdWxlciAoTXVsdGl0ZW5hbnRTY2hlZHVsZXIuKV0KQEAgLTgwOSw3ICs4MDksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU2NoZWR1bGVyQXNzaWdubWVudEltcGwuICJ0b3BvbG9neTIiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyhFeGVjdXRvckRldGFpbHMuIDQgNCkgd29ya2VyLXNsb3Qtd2l0aC1tdWx0aXBsZS1hc3NpZ25tZW50cwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRXhlY3V0b3JEZXRhaWxzLiA1IDUpIChXb3JrZXJTbG90LiBkZWFkLXN1cGVydmlzb3IgcG9ydC1ub3QtcmVwb3J0ZWQtYnktc3VwZXJ2aXNvcil9KX0KLSAgICAgICAgICBjbHVzdGVyIChDbHVzdGVyLiAobmltYnVzL3N0YW5kYWxvbmUtbmltYnVzKSBzdXBlcnMgZXhpc3RpbmctYXNzaWdubWVudHMpCisgICAgICAgICAgY2x1c3RlciAoQ2x1c3Rlci4gKG5pbWJ1cy9zdGFuZGFsb25lLW5pbWJ1cykgc3VwZXJzIGV4aXN0aW5nLWFzc2lnbm1lbnRzIG5pbCkKICAgICAgICAgICB0b3BvbG9naWVzIChUb3BvbG9naWVzLiAodG8tdG9wLW1hcCBbdG9wb2xvZ3kxIHRvcG9sb2d5Ml0pKQogICAgICAgICAgIGNvbmYge30KICAgICAgICAgICBzY2hlZHVsZXIgKE11bHRpdGVuYW50U2NoZWR1bGVyLildCmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3Rlc3QvY2xqL2JhY2t0eXBlL3N0b3JtL3NjaGVkdWxlci9yZXNvdXJjZV9hd2FyZV9zY2hlZHVsZXJfdGVzdC5jbGogYi9zdG9ybS1jb3JlL3Rlc3QvY2xqL2JhY2t0eXBlL3N0b3JtL3NjaGVkdWxlci9yZXNvdXJjZV9hd2FyZV9zY2hlZHVsZXJfdGVzdC5jbGoKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVjMjk3ZAotLS0gL2Rldi9udWxsCisrKyBiL3N0b3JtLWNvcmUvdGVzdC9jbGovYmFja3R5cGUvc3Rvcm0vc2NoZWR1bGVyL3Jlc291cmNlX2F3YXJlX3NjaGVkdWxlcl90ZXN0LmNsagpAQCAtMCwwICsxLDY2OSBAQAorOzsgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorOzsgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCis7OyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorOzsgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorOzsgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorOzsgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorOzsgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOzsKKzs7IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOzsKKzs7IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzs7IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis7OyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzs7IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzs7IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKG5zIGJhY2t0eXBlLnN0b3JtLnNjaGVkdWxlci5yZXNvdXJjZS1hd2FyZS1zY2hlZHVsZXItdGVzdAorICAoOnVzZSBbY2xvanVyZSB0ZXN0XSkKKyAgKDp1c2UgW2JhY2t0eXBlLnN0b3JtIGNvbmZpZyB0ZXN0aW5nIHRocmlmdF0pCisgICg6cmVxdWlyZSBbYmFja3R5cGUuc3Rvcm0udXRpbCA6cmVmZXIgW21hcC12YWwgcmV2ZXJzZS1tYXAgc3VtXV0pCisgICg6cmVxdWlyZSBbYmFja3R5cGUuc3Rvcm0uZGFlbW9uIFtuaW1idXMgOmFzIG5pbWJ1c11dKQorICAoOmltcG9ydCBbYmFja3R5cGUuc3Rvcm0uZ2VuZXJhdGVkIFN0b3JtVG9wb2xvZ3ldCisgICAgICAgICAgIFtiYWNrdHlwZS5zdG9ybSBDb25maWddCisgICAgICAgICAgIFtiYWNrdHlwZS5zdG9ybS50ZXN0aW5nIFRlc3RXb3JkU3BvdXQgVGVzdFdvcmRDb3VudGVyXQorICAgICAgICAgICBbYmFja3R5cGUuc3Rvcm0udG9wb2xvZ3kgVG9wb2xvZ3lCdWlsZGVyXSkKKyAgKDppbXBvcnQgW2JhY2t0eXBlLnN0b3JtLnNjaGVkdWxlciBDbHVzdGVyIFN1cGVydmlzb3JEZXRhaWxzIFdvcmtlclNsb3QgRXhlY3V0b3JEZXRhaWxzCisgICAgICAgICAgICBTY2hlZHVsZXJBc3NpZ25tZW50SW1wbCBUb3BvbG9naWVzIFRvcG9sb2d5RGV0YWlsc10pCisgICg6aW1wb3J0IFtiYWNrdHlwZS5zdG9ybS5zY2hlZHVsZXIucmVzb3VyY2UgUkFTX05vZGUgUmVzb3VyY2VBd2FyZVNjaGVkdWxlcl0pCisgICg6aW1wb3J0IFtiYWNrdHlwZS5zdG9ybSBDb25maWcgU3Rvcm1TdWJtaXR0ZXJdKQorICAoOmltcG9ydCBbYmFja3R5cGUuc3Rvcm0gTG9jYWxEUlBDIExvY2FsQ2x1c3Rlcl0pCisgICg6aW1wb3J0IFtqYXZhLnV0aWwgSGFzaE1hcF0pKQorCisoZGVmbiBnZW4tc3VwZXJ2aXNvcnMgW2NvdW50IHBvcnRzXQorICAoaW50byB7fSAoZm9yIFtpZCAocmFuZ2UgY291bnQpCisgICAgICAgICAgICAgICAgOmxldCBbc3VwZXJ2aXNvciAoU3VwZXJ2aXNvckRldGFpbHMuIChzdHIgImlkIiBpZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHIgImhvc3QiIGlkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxpc3QgKSAobWFwIGludCAocmFuZ2UgcG9ydHMpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Q29uZmlnL1NVUEVSVklTT1JfTUVNT1JZX0NBUEFDSVRZX01CIDIwMDAuMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlnL1NVUEVSVklTT1JfQ1BVX0NBUEFDSVRZIDQwMC4wfSldXQorICAgICAgICAgICAgeyguZ2V0SWQgc3VwZXJ2aXNvcikgc3VwZXJ2aXNvcn0pKSkKKworKGRlZm4gdG8tdG9wLW1hcCBbdG9wb2xvZ2llc10KKyAgKGludG8ge30gKGZvciBbdG9wIHRvcG9sb2dpZXNdIHsoLmdldElkIHRvcCkgdG9wfSkpKQorCisoZGVmbiBlZCBbaWRdIChFeGVjdXRvckRldGFpbHMuIChpbnQgaWQpIChpbnQgaWQpKSkKKworKGRlZm4gbWstZWQtbWFwIFthcmddCisgIChpbnRvIHt9CisgICAgKGZvciBbW25hbWUgc3RhcnQgZW5kXSBhcmddCisgICAgICAoaW50byB7fQorICAgICAgICAoZm9yIFthdCAocmFuZ2Ugc3RhcnQgZW5kKV0KKyAgICAgICAgICB7KGVkIGF0KSBuYW1lfSkpKSkpCisKKzs7IGdldCB0aGUgc3VwZXItPm1lbSBIYXNoTWFwIGJ5IGNvdW50aW5nIHRoZSBlZHMnIG1lbSB1c2FnZSBvZiBhbGwgdG9wb3Mgb24gZWFjaCBzdXBlcgorKGRlZm4gZ2V0LXN1cGVyLT5tZW0tdXNhZ2UgW15DbHVzdGVyIGNsdXN0ZXIgXlRvcG9sb2dpZXMgdG9wb2xvZ2llc10KKyAgKGxldCBbYXNzaWdubWVudHMgKC52YWx1ZXMgKC5nZXRBc3NpZ25tZW50cyBjbHVzdGVyKSkKKyAgICAgICAgc3VwZXJzICgudmFsdWVzICguZ2V0U3VwZXJ2aXNvcnMgY2x1c3RlcikpCisgICAgICAgIHN1cGVyLT5tZW0tdXNhZ2UgKEhhc2hNYXAuKQorICAgICAgICBfIChkb3NlcSBbc3VwZXIgc3VwZXJzXSAKKyAgICAgICAgICAgICAoLnB1dCBzdXBlci0+bWVtLXVzYWdlIHN1cGVyIDApKV0gIDs7IGluaXRpYWxpemUgdGhlIG1lbS11c2FnZSBhcyAwIGZvciBhbGwgc3VwZXJzCisgICAgKGRvc2VxIFthc3NpZ25tZW50IGFzc2lnbm1lbnRzXQorICAgICAgKGxldCBbZWQtPnN1cGVyIChpbnRvIHt9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvciBbW2VkIHNsb3RdICguZ2V0RXhlY3V0b3JUb1Nsb3QgYXNzaWdubWVudCldCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ZWQgKC5nZXRTdXBlcnZpc29yQnlJZCBjbHVzdGVyICguZ2V0Tm9kZUlkIHNsb3QpKX0pKQorICAgICAgICAgICAgc3VwZXItPmVkcyAocmV2ZXJzZS1tYXAgZWQtPnN1cGVyKQorICAgICAgICAgICAgdG9wb2xvZ3kgKC5nZXRCeUlkIHRvcG9sb2dpZXMgKC5nZXRUb3BvbG9neUlkIGFzc2lnbm1lbnQpKQorICAgICAgICAgICAgc3VwZXItPm1lbS1wZXJ0b3BvIChtYXAtdmFsIChmbiBbZWRzXSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZWR1Y2UgKyAobWFwICMoLmdldFRvdGFsTWVtUmVxVGFzayB0b3BvbG9neSAlKSBlZHMpKSkgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXItPmVkcyldICA7OyBzdW0gdXAgdGhlIG9uZSB0b3BvJ3MgZWRzJyBtZW0gdXNhZ2Ugb24gYSBzdXBlciAKKyAgICAgICAgICAgIChkb3NlcSBbW3N1cGVyIG1lbV0gc3VwZXItPm1lbS1wZXJ0b3BvXQorICAgICAgICAgICAgICAoLnB1dCBzdXBlci0+bWVtLXVzYWdlIAorICAgICAgICAgICAgICAgICAgICBzdXBlciAoKyBtZW0gKC5nZXQgc3VwZXItPm1lbS11c2FnZSBzdXBlcikpKSkpKSA7OyBhZGQgYWxsIHRvcG8ncyBtZW0gdXNhZ2UgZm9yIGVhY2ggc3VwZXIKKyAgICBzdXBlci0+bWVtLXVzYWdlKSkKKworOzsgZ2V0IHRoZSBzdXBlci0+Y3B1IEhhc2hNYXAgYnkgY291bnRpbmcgdGhlIGVkcycgY3B1IHVzYWdlIG9mIGFsbCB0b3BvcyBvbiBlYWNoIHN1cGVyCisoZGVmbiBnZXQtc3VwZXItPmNwdS11c2FnZSBbXkNsdXN0ZXIgY2x1c3RlciBeVG9wb2xvZ2llcyB0b3BvbG9naWVzXQorICAobGV0IFthc3NpZ25tZW50cyAoLnZhbHVlcyAoLmdldEFzc2lnbm1lbnRzIGNsdXN0ZXIpKQorICAgICAgICBzdXBlcnMgKC52YWx1ZXMgKC5nZXRTdXBlcnZpc29ycyBjbHVzdGVyKSkKKyAgICAgICAgc3VwZXItPmNwdS11c2FnZSAoSGFzaE1hcC4pCisgICAgICAgIF8gKGRvc2VxIFtzdXBlciBzdXBlcnNdIAorICAgICAgICAgICAgICgucHV0IHN1cGVyLT5jcHUtdXNhZ2Ugc3VwZXIgMCkpXSA7OyBpbml0aWFsaXplIHRoZSBjcHUtdXNhZ2UgYXMgMCBmb3IgYWxsIHN1cGVycworICAgIChkb3NlcSBbYXNzaWdubWVudCBhc3NpZ25tZW50c10KKyAgICAgIChsZXQgW2VkLT5zdXBlciAoaW50byB7fQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb3IgW1tlZCBzbG90XSAoLmdldEV4ZWN1dG9yVG9TbG90IGFzc2lnbm1lbnQpXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2VkICguZ2V0U3VwZXJ2aXNvckJ5SWQgY2x1c3RlciAoLmdldE5vZGVJZCBzbG90KSl9KSkKKyAgICAgICAgICAgIHN1cGVyLT5lZHMgKHJldmVyc2UtbWFwIGVkLT5zdXBlcikKKyAgICAgICAgICAgIHRvcG9sb2d5ICguZ2V0QnlJZCB0b3BvbG9naWVzICguZ2V0VG9wb2xvZ3lJZCBhc3NpZ25tZW50KSkKKyAgICAgICAgICAgIHN1cGVyLT5jcHUtcGVydG9wbyAobWFwLXZhbCAoZm4gW2Vkc10gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVkdWNlICsgKG1hcCAjKC5nZXRUb3RhbENwdVJlcVRhc2sgdG9wb2xvZ3kgJSkgZWRzKSkpIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLT5lZHMpXSA7OyBzdW0gdXAgdGhlIG9uZSB0b3BvJ3MgZWRzJyBjcHUgdXNhZ2Ugb24gYSBzdXBlciAKKyAgICAgICAgICAgIChkb3NlcSBbW3N1cGVyIGNwdV0gc3VwZXItPmNwdS1wZXJ0b3BvXQorICAgICAgICAgICAgICAoLnB1dCBzdXBlci0+Y3B1LXVzYWdlIAorICAgICAgICAgICAgICAgICAgICBzdXBlciAoKyBjcHUgKC5nZXQgc3VwZXItPmNwdS11c2FnZSBzdXBlcikpKSkpKSAgOzsgYWRkIGFsbCB0b3BvJ3MgY3B1IHVzYWdlIGZvciBlYWNoIHN1cGVyCisgICAgc3VwZXItPmNwdS11c2FnZSkpCisKKzs7IHRlc3RpbmcgcmVzb3VyY2UvTm9kZSBjbGFzcworKGRlZnRlc3QgdGVzdC1ub2RlCisgIChsZXQgW3N1cGVycyAoZ2VuLXN1cGVydmlzb3JzIDUgNCkKKyAgICAgICAgY2x1c3RlciAoQ2x1c3Rlci4gKG5pbWJ1cy9zdGFuZGFsb25lLW5pbWJ1cykgc3VwZXJzIHt9IHt9KQorICAgICAgICB0b3BvbG9naWVzIChUb3BvbG9naWVzLiAodG8tdG9wLW1hcCBbXSkpCisgICAgICAgIG5vZGUtbWFwIChSQVNfTm9kZS9nZXRBbGxOb2Rlc0Zyb20gY2x1c3RlciB0b3BvbG9naWVzKQorICAgICAgICB0b3BvbG9neTEgKFRvcG9sb2d5RGV0YWlscy4gInRvcG9sb2d5MSIge30gbmlsIDApCisgICAgICAgIHRvcG9sb2d5MiAoVG9wb2xvZ3lEZXRhaWxzLiAidG9wb2xvZ3kyIiB7fSBuaWwgMCldCisgICAgKGlzICg9IDUgKC5zaXplIG5vZGUtbWFwKSkpCisgICAgKGxldCBbbm9kZSAoLmdldCBub2RlLW1hcCAiaWQwIildCisgICAgICAoaXMgKD0gImlkMCIgKC5nZXRJZCBub2RlKSkpCisgICAgICAoaXMgKD0gdHJ1ZSAoLmlzQWxpdmUgbm9kZSkpKQorICAgICAgKGlzICg9IDAgKC5zaXplICguZ2V0UnVubmluZ1RvcG9sb2dpZXMgbm9kZSkpKSkKKyAgICAgIChpcyAoPSB0cnVlICguaXNUb3RhbGx5RnJlZSBub2RlKSkpCisgICAgICAoaXMgKD0gNCAoLnRvdGFsU2xvdHNGcmVlIG5vZGUpKSkKKyAgICAgIChpcyAoPSAwICgudG90YWxTbG90c1VzZWQgbm9kZSkpKQorICAgICAgKGlzICg9IDQgKC50b3RhbFNsb3RzIG5vZGUpKSkKKyAgICAgICguYXNzaWduIG5vZGUgdG9wb2xvZ3kxIChsaXN0IChFeGVjdXRvckRldGFpbHMuIDEgMSkpIGNsdXN0ZXIpCisgICAgICAoaXMgKD0gMSAoLnNpemUgKC5nZXRSdW5uaW5nVG9wb2xvZ2llcyBub2RlKSkpKQorICAgICAgKGlzICg9IGZhbHNlICguaXNUb3RhbGx5RnJlZSBub2RlKSkpCisgICAgICAoaXMgKD0gMyAoLnRvdGFsU2xvdHNGcmVlIG5vZGUpKSkKKyAgICAgIChpcyAoPSAxICgudG90YWxTbG90c1VzZWQgbm9kZSkpKQorICAgICAgKGlzICg9IDQgKC50b3RhbFNsb3RzIG5vZGUpKSkKKyAgICAgICguYXNzaWduIG5vZGUgdG9wb2xvZ3kxIChsaXN0IChFeGVjdXRvckRldGFpbHMuIDIgMikpIGNsdXN0ZXIpCisgICAgICAoaXMgKD0gMSAoLnNpemUgKC5nZXRSdW5uaW5nVG9wb2xvZ2llcyBub2RlKSkpKQorICAgICAgKGlzICg9IGZhbHNlICguaXNUb3RhbGx5RnJlZSBub2RlKSkpCisgICAgICAoaXMgKD0gMiAoLnRvdGFsU2xvdHNGcmVlIG5vZGUpKSkKKyAgICAgIChpcyAoPSAyICgudG90YWxTbG90c1VzZWQgbm9kZSkpKQorICAgICAgKGlzICg9IDQgKC50b3RhbFNsb3RzIG5vZGUpKSkKKyAgICAgICguYXNzaWduIG5vZGUgdG9wb2xvZ3kyIChsaXN0IChFeGVjdXRvckRldGFpbHMuIDEgMSkpIGNsdXN0ZXIpCisgICAgICAoaXMgKD0gMiAoLnNpemUgKC5nZXRSdW5uaW5nVG9wb2xvZ2llcyBub2RlKSkpKQorICAgICAgKGlzICg9IGZhbHNlICguaXNUb3RhbGx5RnJlZSBub2RlKSkpCisgICAgICAoaXMgKD0gMSAoLnRvdGFsU2xvdHNGcmVlIG5vZGUpKSkKKyAgICAgIChpcyAoPSAzICgudG90YWxTbG90c1VzZWQgbm9kZSkpKQorICAgICAgKGlzICg9IDQgKC50b3RhbFNsb3RzIG5vZGUpKSkKKyAgICAgICguYXNzaWduIG5vZGUgdG9wb2xvZ3kyIChsaXN0IChFeGVjdXRvckRldGFpbHMuIDIgMikpIGNsdXN0ZXIpCisgICAgICAoaXMgKD0gMiAoLnNpemUgKC5nZXRSdW5uaW5nVG9wb2xvZ2llcyBub2RlKSkpKQorICAgICAgKGlzICg9IGZhbHNlICguaXNUb3RhbGx5RnJlZSBub2RlKSkpCisgICAgICAoaXMgKD0gMCAoLnRvdGFsU2xvdHNGcmVlIG5vZGUpKSkKKyAgICAgIChpcyAoPSA0ICgudG90YWxTbG90c1VzZWQgbm9kZSkpKQorICAgICAgKGlzICg9IDQgKC50b3RhbFNsb3RzIG5vZGUpKSkKKyAgICAgICguZnJlZUFsbFNsb3RzIG5vZGUgY2x1c3RlcikKKyAgICAgIChpcyAoPSAwICguc2l6ZSAoLmdldFJ1bm5pbmdUb3BvbG9naWVzIG5vZGUpKSkpCisgICAgICAoaXMgKD0gdHJ1ZSAoLmlzVG90YWxseUZyZWUgbm9kZSkpKQorICAgICAgKGlzICg9IDQgKC50b3RhbFNsb3RzRnJlZSBub2RlKSkpCisgICAgICAoaXMgKD0gMCAoLnRvdGFsU2xvdHNVc2VkIG5vZGUpKSkKKyAgICAgIChpcyAoPSA0ICgudG90YWxTbG90cyBub2RlKSkpCisgICAgKSkpCisKKyhkZWZ0ZXN0IHRlc3Qtc2FuaXR5LXJlc291cmNlLWF3YXJlLXNjaGVkdWxlcgorICAobGV0IFtidWlsZGVyIChUb3BvbG9neUJ1aWxkZXIuKQorICAgICAgICBfICguc2V0U3BvdXQgYnVpbGRlciAid29yZFNwb3V0IiAoVGVzdFdvcmRTcG91dC4pIDEpCisgICAgICAgIF8gKC5zaHVmZmxlR3JvdXBpbmcgKC5zZXRCb2x0IGJ1aWxkZXIgIndvcmRDb3VudEJvbHQiIChUZXN0V29yZENvdW50ZXIuKSAxKSAid29yZFNwb3V0IikKKyAgICAgICAgc3VwZXJzIChnZW4tc3VwZXJ2aXNvcnMgMSAyKQorICAgICAgICBzdG9ybS10b3BvbG9neSAoLmNyZWF0ZVRvcG9sb2d5IGJ1aWxkZXIpCisgICAgICAgIHRvcG9sb2d5MSAoVG9wb2xvZ3lEZXRhaWxzLiAidG9wb2xvZ3kxIgorICAgICAgICAgICAgICAgICAgICB7VE9QT0xPR1ktTkFNRSAidG9wb2xvZ3ktbmFtZS0xIgorICAgICAgICAgICAgICAgICAgICAgVE9QT0xPR1ktU1VCTUlUVEVSLVVTRVIgInVzZXJDIgorICAgICAgICAgICAgICAgICAgICAgVE9QT0xPR1ktQ09NUE9ORU5ULVJFU09VUkNFUy1PTkhFQVAtTUVNT1JZLU1CIDEyOC4wCisgICAgICAgICAgICAgICAgICAgICBUT1BPTE9HWS1DT01QT05FTlQtUkVTT1VSQ0VTLU9GRkhFQVAtTUVNT1JZLU1CIDAuMAorICAgICAgICAgICAgICAgICAgICAgVE9QT0xPR1ktQ09NUE9ORU5ULUNQVS1QQ09SRS1QRVJDRU5UIDEwLjAKKyAgICAgICAgICAgICAgICAgICAgIFRPUE9MT0dZLVdPUktFUi1NQVgtSEVBUC1TSVpFLU1CIDgxOTIuMH0KKyAgICAgICAgICAgICAgICAgICAgc3Rvcm0tdG9wb2xvZ3kKKyAgICAgICAgICAgICAgICAgICAgMQorICAgICAgICAgICAgICAgICAgICAobWstZWQtbWFwIFtbIndvcmRTcG91dCIgMCAxXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIndvcmRDb3VudEJvbHQiIDEgMl1dKSkKKyAgICAgICAgY2x1c3RlciAoQ2x1c3Rlci4gKG5pbWJ1cy9zdGFuZGFsb25lLW5pbWJ1cykgc3VwZXJzIHt9CisgICAgICAgICAgICAgICAgICB7U1RPUk0tTkVUV09SSy1UT1BPR1JBUEhZLVBMVUdJTgorICAgICAgICAgICAgICAgICAgICJiYWNrdHlwZS5zdG9ybS5uZXR3b3JrdG9wb2dyYXBoeS5EZWZhdWx0UmFja0ROU1RvU3dpdGNoTWFwcGluZyJ9KQorICAgICAgICB0b3BvbG9naWVzIChUb3BvbG9naWVzLiAodG8tdG9wLW1hcCBbdG9wb2xvZ3kxXSkpCisgICAgICAgIG5vZGUtbWFwIChSQVNfTm9kZS9nZXRBbGxOb2Rlc0Zyb20gY2x1c3RlciB0b3BvbG9naWVzKQorICAgICAgICBzY2hlZHVsZXIgKFJlc291cmNlQXdhcmVTY2hlZHVsZXIuKV0KKyAgICAoLnNjaGVkdWxlIHNjaGVkdWxlciB0b3BvbG9naWVzIGNsdXN0ZXIpCisgICAgKGxldCBbYXNzaWdubWVudCAoLmdldEFzc2lnbm1lbnRCeUlkIGNsdXN0ZXIgInRvcG9sb2d5MSIpCisgICAgICAgICAgYXNzaWduZWQtc2xvdHMgKC5nZXRTbG90cyBhc3NpZ25tZW50KQorICAgICAgICAgIGV4ZWN1dG9ycyAoLmdldEV4ZWN1dG9ycyBhc3NpZ25tZW50KV0KKyAgICAgIChpcyAoPSAxICguc2l6ZSBhc3NpZ25lZC1zbG90cykpKQorICAgICAgKGlzICg9IDEgKC5zaXplIChpbnRvICN7fSAoZm9yIFtzbG90IGFzc2lnbmVkLXNsb3RzXSAoLmdldE5vZGVJZCBzbG90KSkpKSkpCisgICAgICAoaXMgKD0gMiAoLnNpemUgZXhlY3V0b3JzKSkpKQorICAgIChpcyAoPSAiRnVsbHkgU2NoZWR1bGVkIiAoLmdldCAoLmdldFN0YXR1c01hcCBjbHVzdGVyKSAidG9wb2xvZ3kxIikpKSkpCisKKyhkZWZ0ZXN0IHRlc3QtdG9wb2xvZ3ktd2l0aC1tdWx0aXBsZS1zcG91dHMKKyAgKGxldCBbYnVpbGRlcjEgKFRvcG9sb2d5QnVpbGRlci4pICA7OyBhIHRvcG9sb2d5IHdpdGggbXVsdGlwbGUgc3BvdXRzCisgICAgICAgIF8gKC5zZXRTcG91dCBidWlsZGVyMSAid29yZFNwb3V0MSIgKFRlc3RXb3JkU3BvdXQuKSAxKQorICAgICAgICBfICguc2V0U3BvdXQgYnVpbGRlcjEgIndvcmRTcG91dDIiIChUZXN0V29yZFNwb3V0LikgMSkKKyAgICAgICAgXyAoZG90bworICAgICAgICAgICAgKC5zZXRCb2x0IGJ1aWxkZXIxICJ3b3JkQ291bnRCb2x0MSIgKFRlc3RXb3JkQ291bnRlci4pIDEpCisgICAgICAgICAgICAoLnNodWZmbGVHcm91cGluZyAid29yZFNwb3V0MSIpCisgICAgICAgICAgICAoLnNodWZmbGVHcm91cGluZyAid29yZFNwb3V0MiIpKQorICAgICAgICBfICguc2h1ZmZsZUdyb3VwaW5nICguc2V0Qm9sdCBidWlsZGVyMSAid29yZENvdW50Qm9sdDIiIChUZXN0V29yZENvdW50ZXIuKSAxKSAid29yZENvdW50Qm9sdDEiKQorICAgICAgICBfICguc2h1ZmZsZUdyb3VwaW5nICguc2V0Qm9sdCBidWlsZGVyMSAid29yZENvdW50Qm9sdDMiIChUZXN0V29yZENvdW50ZXIuKSAxKSAid29yZENvdW50Qm9sdDEiKQorICAgICAgICBfICguc2h1ZmZsZUdyb3VwaW5nICguc2V0Qm9sdCBidWlsZGVyMSAid29yZENvdW50Qm9sdDQiIChUZXN0V29yZENvdW50ZXIuKSAxKSAid29yZENvdW50Qm9sdDIiKQorICAgICAgICBfICguc2h1ZmZsZUdyb3VwaW5nICguc2V0Qm9sdCBidWlsZGVyMSAid29yZENvdW50Qm9sdDUiIChUZXN0V29yZENvdW50ZXIuKSAxKSAid29yZFNwb3V0MiIpCisgICAgICAgIHN0b3JtLXRvcG9sb2d5MSAoLmNyZWF0ZVRvcG9sb2d5IGJ1aWxkZXIxKQorICAgICAgICB0b3BvbG9neTEgKFRvcG9sb2d5RGV0YWlscy4gInRvcG9sb2d5MSIKKyAgICAgICAgICAgICAgICAgICAge1RPUE9MT0dZLU5BTUUgInRvcG9sb2d5LW5hbWUtMSIKKyAgICAgICAgICAgICAgICAgICAgIFRPUE9MT0dZLVNVQk1JVFRFUi1VU0VSICJ1c2VyQyIKKyAgICAgICAgICAgICAgICAgICAgIFRPUE9MT0dZLUNPTVBPTkVOVC1SRVNPVVJDRVMtT05IRUFQLU1FTU9SWS1NQiAxMjguMAorICAgICAgICAgICAgICAgICAgICAgVE9QT0xPR1ktQ09NUE9ORU5ULVJFU09VUkNFUy1PRkZIRUFQLU1FTU9SWS1NQiAwLjAKKyAgICAgICAgICAgICAgICAgICAgIFRPUE9MT0dZLUNPTVBPTkVOVC1DUFUtUENPUkUtUEVSQ0VOVCAxMC4wCisgICAgICAgICAgICAgICAgICAgICBUT1BPTE9HWS1XT1JLRVItTUFYLUhFQVAtU0laRS1NQiA4MTkyLjB9CisgICAgICAgICAgICAgICAgICAgIHN0b3JtLXRvcG9sb2d5MQorICAgICAgICAgICAgICAgICAgICAxCisgICAgICAgICAgICAgICAgICAgIChtay1lZC1tYXAgW1sid29yZFNwb3V0MSIgMCAxXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIndvcmRTcG91dDIiIDEgMl0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJ3b3JkQ291bnRCb2x0MSIgMiAzXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIndvcmRDb3VudEJvbHQyIiAzIDRdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsid29yZENvdW50Qm9sdDMiIDQgNV0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyJ3b3JkQ291bnRCb2x0NCIgNSA2XQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIndvcmRDb3VudEJvbHQ1IiA2IDddXSkpCisgICAgICAgIGJ1aWxkZXIyIChUb3BvbG9neUJ1aWxkZXIuKSAgOzsgYSB0b3BvbG9neSB3aXRoIHR3byB1bmNvbm5lY3RlZCBwYXJ0aXRpb25zCisgICAgICAgIF8gKC5zZXRTcG91dCBidWlsZGVyMiAid29yZFNwb3V0WCIgKFRlc3RXb3JkU3BvdXQuKSAxKQorICAgICAgICBfICguc2V0U3BvdXQgYnVpbGRlcjIgIndvcmRTcG91dFkiIChUZXN0V29yZFNwb3V0LikgMSkKKyAgICAgICAgc3Rvcm0tdG9wb2xvZ3kyICguY3JlYXRlVG9wb2xvZ3kgYnVpbGRlcjEpCisgICAgICAgIHRvcG9sb2d5MiAoVG9wb2xvZ3lEZXRhaWxzLiAidG9wb2xvZ3kyIgorICAgICAgICAgICAgICAgICAgICB7VE9QT0xPR1ktTkFNRSAidG9wb2xvZ3ktbmFtZS0yIgorICAgICAgICAgICAgICAgICAgICAgVE9QT0xPR1ktU1VCTUlUVEVSLVVTRVIgInVzZXJDIgorICAgICAgICAgICAgICAgICAgICAgVE9QT0xPR1ktQ09NUE9ORU5ULVJFU09VUkNFUy1PTkhFQVAtTUVNT1JZLU1CIDEyOC4wCisgICAgICAgICAgICAgICAgICAgICBUT1BPTE9HWS1DT01QT05FTlQtUkVTT1VSQ0VTLU9GRkhFQVAtTUVNT1JZLU1CIDAuMAorICAgICAgICAgICAgICAgICAgICAgVE9QT0xPR1ktQ09NUE9ORU5ULUNQVS1QQ09SRS1QRVJDRU5UIDEwLjAKKyAgICAgICAgICAgICAgICAgICAgIFRPUE9MT0dZLVdPUktFUi1NQVgtSEVBUC1TSVpFLU1CIDgxOTIuMH0KKyAgICAgICAgICAgICAgICAgICAgc3Rvcm0tdG9wb2xvZ3kyCisgICAgICAgICAgICAgICAgICAgIDEKKyAgICAgICAgICAgICAgICAgICAgKG1rLWVkLW1hcCBbWyJ3b3JkU3BvdXRYIiAwIDFdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsid29yZFNwb3V0WSIgMSAyXV0pKQorICAgICAgICBzdXBlcnMgKGdlbi1zdXBlcnZpc29ycyAyIDQpCisgICAgICAgIGNsdXN0ZXIgKENsdXN0ZXIuIChuaW1idXMvc3RhbmRhbG9uZS1uaW1idXMpIHN1cGVycyB7fQorICAgICAgICAgICAgICAgICAge1NUT1JNLU5FVFdPUkstVE9QT0dSQVBIWS1QTFVHSU4KKyAgICAgICAgICAgICAgICAgICAiYmFja3R5cGUuc3Rvcm0ubmV0d29ya3RvcG9ncmFwaHkuRGVmYXVsdFJhY2tETlNUb1N3aXRjaE1hcHBpbmcifSkKKyAgICAgICAgdG9wb2xvZ2llcyAoVG9wb2xvZ2llcy4gKHRvLXRvcC1tYXAgW3RvcG9sb2d5MSB0b3BvbG9neTJdKSkKKyAgICAgICAgc2NoZWR1bGVyIChSZXNvdXJjZUF3YXJlU2NoZWR1bGVyLildCisgICAgKC5zY2hlZHVsZSBzY2hlZHVsZXIgdG9wb2xvZ2llcyBjbHVzdGVyKQorICAgIChsZXQgW2Fzc2lnbm1lbnQgKC5nZXRBc3NpZ25tZW50QnlJZCBjbHVzdGVyICJ0b3BvbG9neTEiKQorICAgICAgICAgIGFzc2lnbmVkLXNsb3RzICguZ2V0U2xvdHMgYXNzaWdubWVudCkKKyAgICAgICAgICBleGVjdXRvcnMgKC5nZXRFeGVjdXRvcnMgYXNzaWdubWVudCldCisgICAgICAoaXMgKD0gMSAoLnNpemUgYXNzaWduZWQtc2xvdHMpKSkKKyAgICAgIChpcyAoPSAxICguc2l6ZSAoaW50byAje30gKGZvciBbc2xvdCBhc3NpZ25lZC1zbG90c10gKC5nZXROb2RlSWQgc2xvdCkpKSkpKQorICAgICAgKGlzICg9IDcgKC5zaXplIGV4ZWN1dG9ycykpKSkKKyAgICAoaXMgKD0gIkZ1bGx5IFNjaGVkdWxlZCIgKC5nZXQgKC5nZXRTdGF0dXNNYXAgY2x1c3RlcikgInRvcG9sb2d5MSIpKSkKKyAgICAobGV0IFthc3NpZ25tZW50ICguZ2V0QXNzaWdubWVudEJ5SWQgY2x1c3RlciAidG9wb2xvZ3kyIikKKyAgICAgICAgICBhc3NpZ25lZC1zbG90cyAoLmdldFNsb3RzIGFzc2lnbm1lbnQpCisgICAgICAgICAgZXhlY3V0b3JzICguZ2V0RXhlY3V0b3JzIGFzc2lnbm1lbnQpXQorICAgICAgKGlzICg9IDEgKC5zaXplIGFzc2lnbmVkLXNsb3RzKSkpCisgICAgICAoaXMgKD0gMSAoLnNpemUgKGludG8gI3t9IChmb3IgW3Nsb3QgYXNzaWduZWQtc2xvdHNdICguZ2V0Tm9kZUlkIHNsb3QpKSkpKSkKKyAgICAgIChpcyAoPSAyICguc2l6ZSBleGVjdXRvcnMpKSkpCisgICAgKGlzICg9ICJGdWxseSBTY2hlZHVsZWQiICguZ2V0ICguZ2V0U3RhdHVzTWFwIGNsdXN0ZXIpICJ0b3BvbG9neTIiKSkpKSkKKworKGRlZnRlc3QgdGVzdC10b3BvbG9neS1zZXQtbWVtb3J5LWFuZC1jcHUtbG9hZAorICAobGV0IFtidWlsZGVyIChUb3BvbG9neUJ1aWxkZXIuKQorICAgICAgICBfICguc2V0U3BvdXQgYnVpbGRlciAid29yZFNwb3V0IiAoVGVzdFdvcmRTcG91dC4pIDEpCisgICAgICAgIF8gKGRvdG8KKyAgICAgICAgICAgICguc2V0Qm9sdCBidWlsZGVyICJ3b3JkQ291bnRCb2x0IiAoVGVzdFdvcmRDb3VudGVyLikgMSkKKyAgICAgICAgICAgICguc2V0TWVtb3J5TG9hZCAxMTAuMCkKKyAgICAgICAgICAgICguc2V0Q1BVTG9hZCAyMC4wKQorICAgICAgICAgICAgKC5zaHVmZmxlR3JvdXBpbmcgIndvcmRTcG91dCIpKQorICAgICAgICBzdXBlcnMgKGdlbi1zdXBlcnZpc29ycyAyIDIpICA7OyB0byB0ZXN0IHdoZXRoZXIgdHdvIHRhc2tzIHdpbGwgYmUgYXNzaWduZWQgdG8gb25lIG9yIHR3byBub2RlcworICAgICAgICBzdG9ybS10b3BvbG9neSAoLmNyZWF0ZVRvcG9sb2d5IGJ1aWxkZXIpCisgICAgICAgIHRvcG9sb2d5MiAoVG9wb2xvZ3lEZXRhaWxzLiAidG9wb2xvZ3kyIgorICAgICAgICAgICAgICAgICAgICB7VE9QT0xPR1ktTkFNRSAidG9wb2xvZ3ktbmFtZS0yIgorICAgICAgICAgICAgICAgICAgICAgVE9QT0xPR1ktU1VCTUlUVEVSLVVTRVIgInVzZXJDIgorICAgICAgICAgICAgICAgICAgICAgVE9QT0xPR1ktQ09NUE9ORU5ULVJFU09VUkNFUy1PTkhFQVAtTUVNT1JZLU1CIDEyOC4wCisgICAgICAgICAgICAgICAgICAgICBUT1BPTE9HWS1DT01QT05FTlQtUkVTT1VSQ0VTLU9GRkhFQVAtTUVNT1JZLU1CIDAuMAorICAgICAgICAgICAgICAgICAgICAgVE9QT0xPR1ktQ09NUE9ORU5ULUNQVS1QQ09SRS1QRVJDRU5UIDEwLjAKKyAgICAgICAgICAgICAgICAgICAgIFRPUE9MT0dZLVdPUktFUi1NQVgtSEVBUC1TSVpFLU1CIDgxOTIuMH0KKyAgICAgICAgICAgICAgICAgICAgc3Rvcm0tdG9wb2xvZ3kKKyAgICAgICAgICAgICAgICAgICAgMgorICAgICAgICAgICAgICAgICAgICAobWstZWQtbWFwIFtbIndvcmRTcG91dCIgMCAxXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIndvcmRDb3VudEJvbHQiIDEgMl1dKSkKKyAgICAgICAgY2x1c3RlciAoQ2x1c3Rlci4gKG5pbWJ1cy9zdGFuZGFsb25lLW5pbWJ1cykgc3VwZXJzIHt9CisgICAgICAgICAgICAgICAgICB7U1RPUk0tTkVUV09SSy1UT1BPR1JBUEhZLVBMVUdJTgorICAgICAgICAgICAgICAgICAgICJiYWNrdHlwZS5zdG9ybS50ZXN0aW5nLkFsdGVybmF0ZVJhY2tETlNUb1N3aXRjaE1hcHBpbmcifSkKKyAgICAgICAgdG9wb2xvZ2llcyAoVG9wb2xvZ2llcy4gKHRvLXRvcC1tYXAgW3RvcG9sb2d5Ml0pKQorICAgICAgICBzY2hlZHVsZXIgKFJlc291cmNlQXdhcmVTY2hlZHVsZXIuKV0KKyAgICAoLnNjaGVkdWxlIHNjaGVkdWxlciB0b3BvbG9naWVzIGNsdXN0ZXIpCisgICAgKGxldCBbYXNzaWdubWVudCAoLmdldEFzc2lnbm1lbnRCeUlkIGNsdXN0ZXIgInRvcG9sb2d5MiIpCisgICAgICAgICAgYXNzaWduZWQtc2xvdHMgKC5nZXRTbG90cyBhc3NpZ25tZW50KQorICAgICAgICAgIGV4ZWN1dG9ycyAoLmdldEV4ZWN1dG9ycyBhc3NpZ25tZW50KV0KKyAgICAgIDs7IDQgc2xvdHMgb24gMSBtYWNoaW5lLCBhbGwgZXhlY3V0b3JzIGFzc2lnbmVkCisgICAgICAoaXMgKD0gMSAoLnNpemUgYXNzaWduZWQtc2xvdHMpKSkKKyAgICAgIChpcyAoPSAxICguc2l6ZSAoaW50byAje30gKGZvciBbc2xvdCBhc3NpZ25lZC1zbG90c10gKC5nZXROb2RlSWQgc2xvdCkpKSkpKQorICAgICAgKGlzICg9IDIgKC5zaXplIGV4ZWN1dG9ycykpKSkKKyAgICAoaXMgKD0gIkZ1bGx5IFNjaGVkdWxlZCIgKC5nZXQgKC5nZXRTdGF0dXNNYXAgY2x1c3RlcikgInRvcG9sb2d5MiIpKSkpKQorCisoZGVmdGVzdCB0ZXN0LXJlc291cmNlLWxpbWl0YXRpb24KKyAgKGxldCBbYnVpbGRlciAoVG9wb2xvZ3lCdWlsZGVyLikKKyAgICAgICAgXyAoZG90byAoLnNldFNwb3V0IGJ1aWxkZXIgIndvcmRTcG91dCIgKFRlc3RXb3JkU3BvdXQuKSAyKQorICAgICAgICAgICAgKC5zZXRNZW1vcnlMb2FkIDEwMDAuMCAyMDAuMCkKKyAgICAgICAgICAgICguc2V0Q1BVTG9hZCAyNTAuMCkpCisgICAgICAgIF8gKGRvdG8gKC5zZXRCb2x0IGJ1aWxkZXIgIndvcmRDb3VudEJvbHQiIChUZXN0V29yZENvdW50ZXIuKSAxKQorICAgICAgICAgICAgKC5zaHVmZmxlR3JvdXBpbmcgICJ3b3JkU3BvdXQiKQorICAgICAgICAgICAgKC5zZXRNZW1vcnlMb2FkIDUwMC4wIDEwMC4wKQorICAgICAgICAgICAgKC5zZXRDUFVMb2FkIDEwMC4wKSkKKyAgICAgICAgc3VwZXJzIChnZW4tc3VwZXJ2aXNvcnMgMiAyKSAgOzsgbmVlZCBhdCBsZWFzdCB0d28gbm9kZXMgdG8gaG9sZCB0aGVzZSBleGVjdXRvcnMKKyAgICAgICAgc3Rvcm0tdG9wb2xvZ3kgKC5jcmVhdGVUb3BvbG9neSBidWlsZGVyKQorICAgICAgICB0b3BvbG9neTEgKFRvcG9sb2d5RGV0YWlscy4gInRvcG9sb2d5MSIKKyAgICAgICAgICAgICAgICAgICAge1RPUE9MT0dZLU5BTUUgInRvcG9sb2d5LW5hbWUtMSIKKyAgICAgICAgICAgICAgICAgICAgIFRPUE9MT0dZLVNVQk1JVFRFUi1VU0VSICJ1c2VyQyIKKyAgICAgICAgICAgICAgICAgICAgIFRPUE9MT0dZLUNPTVBPTkVOVC1SRVNPVVJDRVMtT05IRUFQLU1FTU9SWS1NQiAxMjguMAorICAgICAgICAgICAgICAgICAgICAgVE9QT0xPR1ktQ09NUE9ORU5ULVJFU09VUkNFUy1PRkZIRUFQLU1FTU9SWS1NQiAwLjAKKyAgICAgICAgICAgICAgICAgICAgIFRPUE9MT0dZLUNPTVBPTkVOVC1DUFUtUENPUkUtUEVSQ0VOVCAxMC4wCisgICAgICAgICAgICAgICAgICAgICBUT1BPTE9HWS1XT1JLRVItTUFYLUhFQVAtU0laRS1NQiA4MTkyLjB9CisgICAgICAgICAgICAgICAgICAgIHN0b3JtLXRvcG9sb2d5CisgICAgICAgICAgICAgICAgICAgIDIgOzsgbmVlZCB0d28gd29ya2VycywgZWFjaCBvbiBvbmUgbm9kZQorICAgICAgICAgICAgICAgICAgICAobWstZWQtbWFwIFtbIndvcmRTcG91dCIgMCAyXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIndvcmRDb3VudEJvbHQiIDIgM11dKSkKKyAgICAgICAgY2x1c3RlciAoQ2x1c3Rlci4gKG5pbWJ1cy9zdGFuZGFsb25lLW5pbWJ1cykgc3VwZXJzIHt9CisgICAgICAgICAgICAgICAgICB7U1RPUk0tTkVUV09SSy1UT1BPR1JBUEhZLVBMVUdJTgorICAgICAgICAgICAgICAgICAgICJiYWNrdHlwZS5zdG9ybS5uZXR3b3JrdG9wb2dyYXBoeS5EZWZhdWx0UmFja0ROU1RvU3dpdGNoTWFwcGluZyJ9KQorICAgICAgICB0b3BvbG9naWVzIChUb3BvbG9naWVzLiAodG8tdG9wLW1hcCBbdG9wb2xvZ3kxXSkpCisgICAgICAgIHNjaGVkdWxlciAoUmVzb3VyY2VBd2FyZVNjaGVkdWxlci4pXQorICAgICguc2NoZWR1bGUgc2NoZWR1bGVyIHRvcG9sb2dpZXMgY2x1c3RlcikKKyAgICAobGV0IFthc3NpZ25tZW50ICguZ2V0QXNzaWdubWVudEJ5SWQgY2x1c3RlciAidG9wb2xvZ3kxIikKKyAgICAgICAgICBhc3NpZ25lZC1zbG90cyAoLmdldFNsb3RzIGFzc2lnbm1lbnQpCisgICAgICAgICAgbm9kZS1pZHMgKG1hcCAjKC5nZXROb2RlSWQgJSkgYXNzaWduZWQtc2xvdHMpCisgICAgICAgICAgZXhlY3V0b3JzICguZ2V0RXhlY3V0b3JzIGFzc2lnbm1lbnQpCisgICAgICAgICAgZXBzaWxvbiAwLjAwMDAwMQorICAgICAgICAgIGFzc2lnbmVkLWVkLW1lbSAoc29ydCAobWFwICMoLmdldFRvdGFsTWVtUmVxVGFzayB0b3BvbG9neTEgJSkgZXhlY3V0b3JzKSkKKyAgICAgICAgICBhc3NpZ25lZC1lZC1jcHUgKHNvcnQgKG1hcCAjKC5nZXRUb3RhbENwdVJlcVRhc2sgdG9wb2xvZ3kxICUpIGV4ZWN1dG9ycykpCisgICAgICAgICAgZWQtPnN1cGVyIChpbnRvIHt9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvciBbW2VkIHNsb3RdICguZ2V0RXhlY3V0b3JUb1Nsb3QgYXNzaWdubWVudCldCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ZWQgKC5nZXRTdXBlcnZpc29yQnlJZCBjbHVzdGVyICguZ2V0Tm9kZUlkIHNsb3QpKX0pKQorICAgICAgICAgIHN1cGVyLT5lZHMgKHJldmVyc2UtbWFwIGVkLT5zdXBlcikKKyAgICAgICAgICBtZW0tYXZhaWwtPnVzZWQgKGludG8gW10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmb3IgW1tzdXBlciBlZHNdIHN1cGVyLT5lZHNdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoLmdldFRvdGFsTWVtb3J5IHN1cGVyKSAoc3VtIChtYXAgIyguZ2V0VG90YWxNZW1SZXFUYXNrIHRvcG9sb2d5MSAlKSBlZHMpKV0pKQorICAgICAgICAgIGNwdS1hdmFpbC0+dXNlZCAoaW50byBbXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvciBbW3N1cGVyIGVkc10gc3VwZXItPmVkc10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyguZ2V0VG90YWxDUFUgc3VwZXIpIChzdW0gKG1hcCAjKC5nZXRUb3RhbENwdVJlcVRhc2sgdG9wb2xvZ3kxICUpIGVkcykpXSkpXQorICAgIDs7IDQgc2xvdHMgb24gMSBtYWNoaW5lLCBhbGwgZXhlY3V0b3JzIGFzc2lnbmVkCisgICAgKGlzICg9IDIgKC5zaXplIGFzc2lnbmVkLXNsb3RzKSkpICA7OyBleGVjdXRvcjAgcmVzaWRlcyBvbmUgb25lIHdvcmtlciAob24gb25lKSwgZXhlY3V0b3IxIGFuZCBleGVjdXRvcjIgb24gYW5vdGhlciB3b3JrZXIgKG9uIHRoZSBvdGhlciBub2RlKQorICAgIChpcyAoPSAyICguc2l6ZSAoaW50byAje30gKGZvciBbc2xvdCBhc3NpZ25lZC1zbG90c10gKC5nZXROb2RlSWQgc2xvdCkpKSkpKQorICAgIChpcyAoPSAzICguc2l6ZSBleGVjdXRvcnMpKSkKKyAgICA7OyBtYWtlIHN1cmUgcmVzb3VyY2UgKG1lbS9jcHUpIGFzc2lnbmVkIGVxdWFscyB0byByZXNvdXJjZSBzcGVjaWZpZWQKKyAgICAoaXMgKDwgKE1hdGgvYWJzICgtIDYwMC4wIChmaXJzdCBhc3NpZ25lZC1lZC1tZW0pKSkgZXBzaWxvbikpCisgICAgKGlzICg8IChNYXRoL2FicyAoLSAxMjAwLjAgKHNlY29uZCBhc3NpZ25lZC1lZC1tZW0pKSkgZXBzaWxvbikpCisgICAgKGlzICg8IChNYXRoL2FicyAoLSAxMjAwLjAgKGxhc3QgYXNzaWduZWQtZWQtbWVtKSkpIGVwc2lsb24pKQorICAgIChpcyAoPCAoTWF0aC9hYnMgKC0gMTAwLjAgKGZpcnN0IGFzc2lnbmVkLWVkLWNwdSkpKSBlcHNpbG9uKSkKKyAgICAoaXMgKDwgKE1hdGgvYWJzICgtIDI1MC4wIChzZWNvbmQgYXNzaWduZWQtZWQtY3B1KSkpIGVwc2lsb24pKQorICAgIChpcyAoPCAoTWF0aC9hYnMgKC0gMjUwLjAgKGxhc3QgYXNzaWduZWQtZWQtY3B1KSkpIGVwc2lsb24pKQorICAgIChkb3NlcSBbW2F2YWlsIHVzZWRdIG1lbS1hdmFpbC0+dXNlZF0gOzsgZm9yIGVhY2ggbm9kZSwgYXNzaWduZWQgbWVtIHNtYWxsZXIgdGhhbiB0b3RhbCAKKyAgICAgIChpcyAoPj0gYXZhaWwgdXNlZCkpKQorICAgIChkb3NlcSBbW2F2YWlsIHVzZWRdIGNwdS1hdmFpbC0+dXNlZF0gOzsgZm9yIGVhY2ggbm9kZSwgYXNzaWduZWQgY3B1IHNtYWxsZXIgdGhhbiB0b3RhbAorICAgICAgKGlzICg+PSBhdmFpbCB1c2VkKSkpKQorICAoaXMgKD0gIkZ1bGx5IFNjaGVkdWxlZCIgKC5nZXQgKC5nZXRTdGF0dXNNYXAgY2x1c3RlcikgInRvcG9sb2d5MSIpKSkpKQorCisoZGVmdGVzdCB0ZXN0LXNjaGVkdWxpbmctcmVzaWxpZW5jZQorICAobGV0IFtzdXBlcnMgKGdlbi1zdXBlcnZpc29ycyAyIDIpCisgICAgICAgICBidWlsZGVyMSAoVG9wb2xvZ3lCdWlsZGVyLikKKyAgICAgICAgIF8gKC5zZXRTcG91dCBidWlsZGVyMSAic3BvdXQxIiAoVGVzdFdvcmRTcG91dC4pIDIpCisgICAgICAgICBzdG9ybS10b3BvbG9neTEgKC5jcmVhdGVUb3BvbG9neSBidWlsZGVyMSkKKyAgICAgICAgIHRvcG9sb2d5MSAoVG9wb2xvZ3lEZXRhaWxzLiAidG9wb2xvZ3kxIgorICAgICAgICAgICAgICAgICAgICAge1RPUE9MT0dZLU5BTUUgInRvcG9sb2d5LW5hbWUtMSIKKyAgICAgICAgICAgICAgICAgICAgICBUT1BPTE9HWS1TVUJNSVRURVItVVNFUiAidXNlckMiCisgICAgICAgICAgICAgICAgICAgICAgVE9QT0xPR1ktQ09NUE9ORU5ULVJFU09VUkNFUy1PTkhFQVAtTUVNT1JZLU1CIDEyOC4wCisgICAgICAgICAgICAgICAgICAgICAgVE9QT0xPR1ktQ09NUE9ORU5ULVJFU09VUkNFUy1PRkZIRUFQLU1FTU9SWS1NQiAwLjAKKyAgICAgICAgICAgICAgICAgICAgICBUT1BPTE9HWS1DT01QT05FTlQtQ1BVLVBDT1JFLVBFUkNFTlQgMTAuMAorICAgICAgICAgICAgICAgICAgICAgIFRPUE9MT0dZLVdPUktFUi1NQVgtSEVBUC1TSVpFLU1CIDgxOTIuMH0KKyAgICAgICAgICAgICAgICAgICAgIHN0b3JtLXRvcG9sb2d5MQorICAgICAgICAgICAgICAgICAgICAgMyA7OyB0aHJlZSB3b3JrZXJzIHRvIGhvbGQgdGhyZWUgZXhlY3V0b3JzCisgICAgICAgICAgICAgICAgICAgICAobWstZWQtbWFwIFtbInNwb3V0MSIgMCAzXV0pKQorICAgICAgICAgYnVpbGRlcjIgKFRvcG9sb2d5QnVpbGRlci4pCisgICAgICAgICBfICguc2V0U3BvdXQgYnVpbGRlcjIgInNwb3V0MiIgKFRlc3RXb3JkU3BvdXQuKSAyKQorICAgICAgICAgc3Rvcm0tdG9wb2xvZ3kyICguY3JlYXRlVG9wb2xvZ3kgYnVpbGRlcjIpCisgICAgICAgICB0b3BvbG9neTIgKFRvcG9sb2d5RGV0YWlscy4gInRvcG9sb2d5MiIKKyAgICAgICAgICAgICAgICAgICAgIHtUT1BPTE9HWS1OQU1FICJ0b3BvbG9neS1uYW1lLTIiCisgICAgICAgICAgICAgICAgICAgICAgVE9QT0xPR1ktU1VCTUlUVEVSLVVTRVIgInVzZXJDIgorICAgICAgICAgICAgICAgICAgICAgIFRPUE9MT0dZLUNPTVBPTkVOVC1SRVNPVVJDRVMtT05IRUFQLU1FTU9SWS1NQiAxMjgwLjAgOzsgbGFyZ2UgZW5vdWdoIHRodXMgdHdvIGVkcyBjYW4gbm90IGJlIGZ1bGx5IGFzc2lnbmVkIHRvIG9uZSBub2RlCisgICAgICAgICAgICAgICAgICAgICAgVE9QT0xPR1ktQ09NUE9ORU5ULVJFU09VUkNFUy1PRkZIRUFQLU1FTU9SWS1NQiAwLjAKKyAgICAgICAgICAgICAgICAgICAgICBUT1BPTE9HWS1DT01QT05FTlQtQ1BVLVBDT1JFLVBFUkNFTlQgMTAuMAorICAgICAgICAgICAgICAgICAgICAgIFRPUE9MT0dZLVdPUktFUi1NQVgtSEVBUC1TSVpFLU1CIDgxOTIuMH0KKyAgICAgICAgICAgICAgICAgICAgIHN0b3JtLXRvcG9sb2d5MgorICAgICAgICAgICAgICAgICAgICAgMiAgOzsgdHdvIHdvcmtlcnMsIGVhY2ggaG9sZHMgb25lIGV4ZWN1dG9yIGFuZCByZXNpZGVzIG9uIG9uZSBub2RlCisgICAgICAgICAgICAgICAgICAgICAobWstZWQtbWFwIFtbInNwb3V0MiIgMCAyXV0pKQorICAgICAgICBzY2hlZHVsZXIgKFJlc291cmNlQXdhcmVTY2hlZHVsZXIuKV0KKworICAgICh0ZXN0aW5nICJXaGVuIGEgd29ya2VyIGZhaWxzLCBSQVMgZG9lcyBub3QgYWx0ZXIgZXhpc3RpbmcgYXNzaWdubWVudHMgb24gaGVhbHRoeSB3b3JrZXJzIgorICAgICAgKGxldCBbY2x1c3RlciAoQ2x1c3Rlci4gKG5pbWJ1cy9zdGFuZGFsb25lLW5pbWJ1cykgc3VwZXJzIHt9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7U1RPUk0tTkVUV09SSy1UT1BPR1JBUEhZLVBMVUdJTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYWNrdHlwZS5zdG9ybS5uZXR3b3JrdG9wb2dyYXBoeS5EZWZhdWx0UmFja0ROU1RvU3dpdGNoTWFwcGluZyJ9KQorICAgICAgICAgICAgdG9wb2xvZ2llcyAoVG9wb2xvZ2llcy4gKHRvLXRvcC1tYXAgW3RvcG9sb2d5Ml0pKQorICAgICAgICAgICAgXyAoLnNjaGVkdWxlIHNjaGVkdWxlciB0b3BvbG9naWVzIGNsdXN0ZXIpCisgICAgICAgICAgICBhc3NpZ25tZW50ICguZ2V0QXNzaWdubWVudEJ5SWQgY2x1c3RlciAidG9wb2xvZ3kyIikKKyAgICAgICAgICAgIGZhaWxlZC13b3JrZXIgKGZpcnN0ICh2ZWMgKC5nZXRTbG90cyBhc3NpZ25tZW50KSkpICA7OyBjaG9vc2UgYSB3b3JrZXIgdG8gbW9jayBhcyBmYWlsZWQKKyAgICAgICAgICAgIGVkLT5zbG90ICguZ2V0RXhlY3V0b3JUb1Nsb3QgYXNzaWdubWVudCkKKyAgICAgICAgICAgIGZhaWxlZC1lZHMgKC5nZXQgKHJldmVyc2UtbWFwIGVkLT5zbG90KSBmYWlsZWQtd29ya2VyKQorICAgICAgICAgICAgXyAoZG9zZXEgW2VkIGZhaWxlZC1lZHNdICgucmVtb3ZlIGVkLT5zbG90IGVkKSkgIDs7IHJlbW92ZSBleGVjdXRvciBkZXRhaWxzIGFzc2lnbmVkIHRvIHRoZSB3b3JrZXIKKyAgICAgICAgICAgIGNvcHktb2xkLW1hcHBpbmcgKEhhc2hNYXAuIGVkLT5zbG90KQorICAgICAgICAgICAgaGVhbHRoeS1lZHMgKC5rZXlTZXQgY29weS1vbGQtbWFwcGluZykKKyAgICAgICAgICAgIF8gKC5zY2hlZHVsZSBzY2hlZHVsZXIgdG9wb2xvZ2llcyBjbHVzdGVyKQorICAgICAgICAgICAgbmV3LWFzc2lnbm1lbnQgKC5nZXRBc3NpZ25tZW50QnlJZCBjbHVzdGVyICJ0b3BvbG9neTIiKQorICAgICAgICAgICAgbmV3LWVkLT5zbG90ICguZ2V0RXhlY3V0b3JUb1Nsb3QgbmV3LWFzc2lnbm1lbnQpXQorICAgICAgICA7OyBmb3IgZWFjaCBleGVjdXRvciB0aGF0IHdhcyBzY2hlZHVsZWQgb24gaGVhbHRoeSB3b3JrZXJzLCB0aGVpciBzbG90cyBzaG91bGQgcmVtYWluIHVuY2hhbmdlZCBhZnRlciBhIG5ldyBzY2hlZHVsaW5nCisgICAgICAgIChkb3NlcSBbZWQgaGVhbHRoeS1lZHNdCisgICAgICAgICAgKGlzICguZXF1YWxzICguZ2V0IGNvcHktb2xkLW1hcHBpbmcgZWQpICguZ2V0IG5ldy1lZC0+c2xvdCBlZCkpKSkKKyAgICAgICAgKGlzICg9ICJGdWxseSBTY2hlZHVsZWQiICguZ2V0ICguZ2V0U3RhdHVzTWFwIGNsdXN0ZXIpICJ0b3BvbG9neTIiKSkpKSkKKyAgICAKKyAgICAodGVzdGluZyAiV2hlbiBhIHN1cGVydmlzb3IgZmFpbHMsIFJBUyBkb2VzIG5vdCBhbHRlciBleGlzdGluZyBhc3NpZ25tZW50cyIKKyAgICAgIChsZXQgW2V4aXN0aW5nLWFzc2lnbm1lbnRzIHsidG9wb2xvZ3kxIiAoU2NoZWR1bGVyQXNzaWdubWVudEltcGwuICJ0b3BvbG9neTEiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7KEV4ZWN1dG9yRGV0YWlscy4gMCAwKSAoV29ya2VyU2xvdC4gImlkMCIgMCkgICAgOzsgd29ya2VyIDAgb24gdGhlIGZhaWxlZCBzdXBlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChFeGVjdXRvckRldGFpbHMuIDEgMSkgKFdvcmtlclNsb3QuICJpZDAiIDEpICAgIDs7IHdvcmtlciAxIG9uIHRoZSBmYWlsZWQgc3VwZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRXhlY3V0b3JEZXRhaWxzLiAyIDIpIChXb3JrZXJTbG90LiAiaWQxIiAxKX0pfSA7OyB3b3JrZXIgMiBvbiB0aGUgaGVhbHRoIHN1cGVyCisgICAgICAgICAgICBjbHVzdGVyIChDbHVzdGVyLiAobmltYnVzL3N0YW5kYWxvbmUtbmltYnVzKSBzdXBlcnMgZXhpc3RpbmctYXNzaWdubWVudHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtTVE9STS1ORVRXT1JLLVRPUE9HUkFQSFktUExVR0lOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhY2t0eXBlLnN0b3JtLm5ldHdvcmt0b3BvZ3JhcGh5LkRlZmF1bHRSYWNrRE5TVG9Td2l0Y2hNYXBwaW5nIn0pCisgICAgICAgICAgICB0b3BvbG9naWVzIChUb3BvbG9naWVzLiAodG8tdG9wLW1hcCBbdG9wb2xvZ3kxXSkpCisgICAgICAgICAgICBhc3NpZ25tZW50ICguZ2V0QXNzaWdubWVudEJ5SWQgY2x1c3RlciAidG9wb2xvZ3kxIikKKyAgICAgICAgICAgIGVkLT5zbG90ICguZ2V0RXhlY3V0b3JUb1Nsb3QgYXNzaWdubWVudCkKKyAgICAgICAgICAgIGNvcHktb2xkLW1hcHBpbmcgKEhhc2hNYXAuIGVkLT5zbG90KQorICAgICAgICAgICAgZXhpc3RpbmctZWRzICgua2V5U2V0IGNvcHktb2xkLW1hcHBpbmcpICA7OyBhbGwgdGhlIHRocmVlIGVkcyBvbiB0aHJlZSB3b3JrZXJzCisgICAgICAgICAgICBuZXctY2x1c3RlciAoQ2x1c3Rlci4gKG5pbWJ1cy9zdGFuZGFsb25lLW5pbWJ1cykgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRpc3NvYyBzdXBlcnMgImlkMCIpICAgICAgICA7OyBtb2NrIHRoZSBzdXBlcjAgYXMgYSBmYWlsZWQgc3VwZXJ2aXNvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICguZ2V0QXNzaWdubWVudHMgY2x1c3RlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7U1RPUk0tTkVUV09SSy1UT1BPR1JBUEhZLVBMVUdJTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFja3R5cGUuc3Rvcm0ubmV0d29ya3RvcG9ncmFwaHkuRGVmYXVsdFJhY2tETlNUb1N3aXRjaE1hcHBpbmcifSkKKyAgICAgICAgICAgIF8gKC5zY2hlZHVsZSBzY2hlZHVsZXIgdG9wb2xvZ2llcyBuZXctY2x1c3RlcikgOzsgdGhlIGFjdHVhbCBzY2hlZHVsZSBmb3IgdGhpcyB0b3BvIHdpbGwgbm90IHJ1biBzaW5jZSBpdCBpcyBmdWxseSBhc3NpZ25lZAorICAgICAgICAgICAgbmV3LWFzc2lnbm1lbnQgKC5nZXRBc3NpZ25tZW50QnlJZCBuZXctY2x1c3RlciAidG9wb2xvZ3kxIikKKyAgICAgICAgICAgIG5ldy1lZC0+c2xvdCAoLmdldEV4ZWN1dG9yVG9TbG90IG5ldy1hc3NpZ25tZW50KV0KKyAgICAgICAgKGRvc2VxIFtlZCBleGlzdGluZy1lZHNdCisgICAgICAgICAgKGlzICguZXF1YWxzICguZ2V0IGNvcHktb2xkLW1hcHBpbmcgZWQpICguZ2V0IG5ldy1lZC0+c2xvdCBlZCkpKSkKKyAgICAgICAgKGlzICg9ICJGdWxseSBTY2hlZHVsZWQiICguZ2V0ICguZ2V0U3RhdHVzTWFwIG5ldy1jbHVzdGVyKSAidG9wb2xvZ3kxIikpKSkpCisKKyAgICAodGVzdGluZyAiV2hlbiBhIHN1cGVydmlzb3IgYW5kIGEgd29ya2VyIG9uIGl0IGZhaWxzLCBSQVMgZG9lcyBub3QgYWx0ZXIgZXhpc3RpbmcgYXNzaWdubWVudHMiCisgICAgICAobGV0IFtleGlzdGluZy1hc3NpZ25tZW50cyB7InRvcG9sb2d5MSIgKFNjaGVkdWxlckFzc2lnbm1lbnRJbXBsLiAidG9wb2xvZ3kxIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyhFeGVjdXRvckRldGFpbHMuIDAgMCkgKFdvcmtlclNsb3QuICJpZDAiIDEpICAgIDs7IHRoZSB3b3JrZXIgdG8gb3JwaGFuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEV4ZWN1dG9yRGV0YWlscy4gMSAxKSAoV29ya2VyU2xvdC4gImlkMCIgMikgICAgOzsgdGhlIHdvcmtlciB0byBraWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEV4ZWN1dG9yRGV0YWlscy4gMiAyKSAoV29ya2VyU2xvdC4gImlkMSIgMSl9KX0gOzsgdGhlIGhlYWx0aHkgd29ya2VyCisgICAgICAgICAgICBjbHVzdGVyIChDbHVzdGVyLiAobmltYnVzL3N0YW5kYWxvbmUtbmltYnVzKSBzdXBlcnMgZXhpc3RpbmctYXNzaWdubWVudHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtTVE9STS1ORVRXT1JLLVRPUE9HUkFQSFktUExVR0lOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhY2t0eXBlLnN0b3JtLm5ldHdvcmt0b3BvZ3JhcGh5LkRlZmF1bHRSYWNrRE5TVG9Td2l0Y2hNYXBwaW5nIn0pCisgICAgICAgICAgICB0b3BvbG9naWVzIChUb3BvbG9naWVzLiAodG8tdG9wLW1hcCBbdG9wb2xvZ3kxXSkpCisgICAgICAgICAgICBhc3NpZ25tZW50ICguZ2V0QXNzaWdubWVudEJ5SWQgY2x1c3RlciAidG9wb2xvZ3kxIikKKyAgICAgICAgICAgIGVkLT5zbG90ICguZ2V0RXhlY3V0b3JUb1Nsb3QgYXNzaWdubWVudCkKKyAgICAgICAgICAgIF8gKC5yZW1vdmUgZWQtPnNsb3QgKEV4ZWN1dG9yRGV0YWlscy4gMSAxKSkgIDs7IGRlbGV0ZSBvbmUgd29ya2VyIG9mIHN1cGVyMCAoZmFpbGVkKSBmcm9tIHRvcG8xIGFzc2lnbm1lbnQgdG8gZW5hYmxlIGFjdHVhbCBzY2hlZHVsZSBmb3IgdGVzdGluZworICAgICAgICAgICAgY29weS1vbGQtbWFwcGluZyAoSGFzaE1hcC4gZWQtPnNsb3QpCisgICAgICAgICAgICBleGlzdGluZy1lZHMgKC5rZXlTZXQgY29weS1vbGQtbWFwcGluZykgIDs7IG5hbWVseSB0aGUgdHdvIGVkcyBvbiB0aGUgb3JwaGFuZWQgd29ya2VyIGFuZCB0aGUgaGVhbHRoeSB3b3JrZXIKKyAgICAgICAgICAgIG5ldy1jbHVzdGVyIChDbHVzdGVyLiAobmltYnVzL3N0YW5kYWxvbmUtbmltYnVzKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGlzc29jIHN1cGVycyAiaWQwIikgICAgICAgIDs7IG1vY2sgdGhlIHN1cGVyMCBhcyBhIGZhaWxlZCBzdXBlcnZpc29yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC5nZXRBc3NpZ25tZW50cyBjbHVzdGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtTVE9STS1ORVRXT1JLLVRPUE9HUkFQSFktUExVR0lOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYWNrdHlwZS5zdG9ybS5uZXR3b3JrdG9wb2dyYXBoeS5EZWZhdWx0UmFja0ROU1RvU3dpdGNoTWFwcGluZyJ9KQorICAgICAgICAgICAgXyAoLnNjaGVkdWxlIHNjaGVkdWxlciB0b3BvbG9naWVzIG5ldy1jbHVzdGVyKQorICAgICAgICAgICAgbmV3LWFzc2lnbm1lbnQgKC5nZXRBc3NpZ25tZW50QnlJZCBuZXctY2x1c3RlciAidG9wb2xvZ3kxIikKKyAgICAgICAgICAgIG5ldy1lZC0+c2xvdCAoLmdldEV4ZWN1dG9yVG9TbG90IG5ldy1hc3NpZ25tZW50KV0KKyAgICAgICAgKGRvc2VxIFtlZCBleGlzdGluZy1lZHNdCisgICAgICAgICAgKGlzICguZXF1YWxzICguZ2V0IGNvcHktb2xkLW1hcHBpbmcgZWQpICguZ2V0IG5ldy1lZC0+c2xvdCBlZCkpKSkKKyAgICAgICAgKGlzICg9ICJGdWxseSBTY2hlZHVsZWQiICguZ2V0ICguZ2V0U3RhdHVzTWFwIG5ldy1jbHVzdGVyKSAidG9wb2xvZ3kxIikpKSkpCisKKyAgICAodGVzdGluZyAiU2NoZWR1bGluZyBhIG5ldyB0b3BvbG9neSBkb2VzIG5vdCBkaXN0dXJiIG90aGVyIGFzc2lnbm1lbnRzIHVubmVjZXNzYXJpbHkiCisgICAgICAobGV0IFtjbHVzdGVyIChDbHVzdGVyLiAobmltYnVzL3N0YW5kYWxvbmUtbmltYnVzKSBzdXBlcnMge30KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtTVE9STS1ORVRXT1JLLVRPUE9HUkFQSFktUExVR0lOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhY2t0eXBlLnN0b3JtLm5ldHdvcmt0b3BvZ3JhcGh5LkRlZmF1bHRSYWNrRE5TVG9Td2l0Y2hNYXBwaW5nIn0pCisgICAgICAgICAgICB0b3BvbG9naWVzIChUb3BvbG9naWVzLiAodG8tdG9wLW1hcCBbdG9wb2xvZ3kxXSkpCisgICAgICAgICAgICBfICguc2NoZWR1bGUgc2NoZWR1bGVyIHRvcG9sb2dpZXMgY2x1c3RlcikKKyAgICAgICAgICAgIGFzc2lnbm1lbnQgKC5nZXRBc3NpZ25tZW50QnlJZCBjbHVzdGVyICJ0b3BvbG9neTEiKQorICAgICAgICAgICAgZWQtPnNsb3QgKC5nZXRFeGVjdXRvclRvU2xvdCBhc3NpZ25tZW50KQorICAgICAgICAgICAgY29weS1vbGQtbWFwcGluZyAoSGFzaE1hcC4gZWQtPnNsb3QpCisgICAgICAgICAgICBuZXctdG9wb2xvZ2llcyAoVG9wb2xvZ2llcy4gKHRvLXRvcC1tYXAgW3RvcG9sb2d5MSB0b3BvbG9neTJdKSkgIDs7IGEgc2Vjb25kIHRvcG9sb2d5IGpvaW5zCisgICAgICAgICAgICBfICguc2NoZWR1bGUgc2NoZWR1bGVyIG5ldy10b3BvbG9naWVzIGNsdXN0ZXIpCisgICAgICAgICAgICBuZXctYXNzaWdubWVudCAoLmdldEFzc2lnbm1lbnRCeUlkIGNsdXN0ZXIgInRvcG9sb2d5MSIpCisgICAgICAgICAgICBuZXctZWQtPnNsb3QgKC5nZXRFeGVjdXRvclRvU2xvdCBuZXctYXNzaWdubWVudCldCisgICAgICAgIChkb3NlcSBbZWQgKC5rZXlTZXQgY29weS1vbGQtbWFwcGluZyldCisgICAgICAgICAgKGlzICguZXF1YWxzICguZ2V0IGNvcHktb2xkLW1hcHBpbmcgZWQpICguZ2V0IG5ldy1lZC0+c2xvdCBlZCkpKSkgIDs7IHRoZSBhc3NpZ25tZW50IGZvciB0b3BvMSBzaG91bGQgbm90IGNoYW5nZQorICAgICAgICAoaXMgKD0gIkZ1bGx5IFNjaGVkdWxlZCIgKC5nZXQgKC5nZXRTdGF0dXNNYXAgY2x1c3RlcikgInRvcG9sb2d5MSIpKSkKKyAgICAgICAgKGlzICg9ICJGdWxseSBTY2hlZHVsZWQiICguZ2V0ICguZ2V0U3RhdHVzTWFwIGNsdXN0ZXIpICJ0b3BvbG9neTIiKSkpKSkpKQorCis7OyBBdXRvbWF0ZWQgdGVzdHMgZm9yIGhldGVyb2dlbmVvdXMgY2x1c3RlcgorKGRlZnRlc3QgdGVzdC1oZXRlcm9nZW5lb3VzLWNsdXN0ZXIKKyAgKGxldCBbc3VwZXJzIChpbnRvIHt9IChmb3IgW3N1cGVyIFsoU3VwZXJ2aXNvckRldGFpbHMuIChzdHIgImlkIiAwKSAoc3RyICJob3N0IiAwKSAobGlzdCApIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hcCBpbnQgKGxpc3QgMSAyIDMgNCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Q29uZmlnL1NVUEVSVklTT1JfTUVNT1JZX0NBUEFDSVRZX01CIDQwOTYuMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZy9TVVBFUlZJU09SX0NQVV9DQVBBQ0lUWSA4MDAuMH0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN1cGVydmlzb3JEZXRhaWxzLiAoc3RyICJpZCIgMSkgKHN0ciAiaG9zdCIgMSkgKGxpc3QgKSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXAgaW50IChsaXN0IDEgMiAzIDQpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0NvbmZpZy9TVVBFUlZJU09SX01FTU9SWV9DQVBBQ0lUWV9NQiAxMDI0LjAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWcvU1VQRVJWSVNPUl9DUFVfQ0FQQUNJVFkgMjAwLjB9KV1dCisgICAgICAgICAgICAgICAgICAgICAgICAgIHsoLmdldElkIHN1cGVyKSBzdXBlcn0pKQorICAgICAgICBidWlsZGVyMSAoVG9wb2xvZ3lCdWlsZGVyLikgIDs7IHRvcG8xIGhhcyBvbmUgc2luZ2xlIGh1Z2UgdGFzayB0aGF0IGNhbiBub3QgYmUgaGFuZGxlZCBieSB0aGUgc21hbGwtc3VwZXIKKyAgICAgICAgXyAoZG90byAoLnNldFNwb3V0IGJ1aWxkZXIxICJzcG91dDEiIChUZXN0V29yZFNwb3V0LikgMSkgCisgICAgICAgICAgICAoLnNldE1lbW9yeUxvYWQgMjAwMC4wIDQ4LjApCisgICAgICAgICAgICAoLnNldENQVUxvYWQgMzAwLjApKQorICAgICAgICBzdG9ybS10b3BvbG9neTEgKC5jcmVhdGVUb3BvbG9neSBidWlsZGVyMSkKKyAgICAgICAgdG9wb2xvZ3kxIChUb3BvbG9neURldGFpbHMuICJ0b3BvbG9neTEiCisgICAgICAgICAgICAgICAgICAgIHtUT1BPTE9HWS1OQU1FICJ0b3BvbG9neS1uYW1lLTEiCisgICAgICAgICAgICAgICAgICAgICBUT1BPTE9HWS1TVUJNSVRURVItVVNFUiAidXNlckMiCisgICAgICAgICAgICAgICAgICAgICBUT1BPTE9HWS1DT01QT05FTlQtUkVTT1VSQ0VTLU9OSEVBUC1NRU1PUlktTUIgMTI4LjAKKyAgICAgICAgICAgICAgICAgICAgIFRPUE9MT0dZLUNPTVBPTkVOVC1SRVNPVVJDRVMtT0ZGSEVBUC1NRU1PUlktTUIgMC4wCisgICAgICAgICAgICAgICAgICAgICBUT1BPTE9HWS1DT01QT05FTlQtQ1BVLVBDT1JFLVBFUkNFTlQgMTAuMAorICAgICAgICAgICAgICAgICAgICAgVE9QT0xPR1ktV09SS0VSLU1BWC1IRUFQLVNJWkUtTUIgODE5Mi4wfQorICAgICAgICAgICAgICAgICAgICBzdG9ybS10b3BvbG9neTEKKyAgICAgICAgICAgICAgICAgICAgMQorICAgICAgICAgICAgICAgICAgICAobWstZWQtbWFwIFtbInNwb3V0MSIgMCAxXV0pKQorICAgICAgICBidWlsZGVyMiAoVG9wb2xvZ3lCdWlsZGVyLikgIDs7IHRvcG8yIGhhcyA0IGxhcmdlIHRhc2tzCisgICAgICAgIF8gKGRvdG8gKC5zZXRTcG91dCBidWlsZGVyMiAic3BvdXQyIiAoVGVzdFdvcmRTcG91dC4pIDQpCisgICAgICAgICAgICAoLnNldE1lbW9yeUxvYWQgNTAwLjAgMTIuMCkKKyAgICAgICAgICAgICguc2V0Q1BVTG9hZCAxMDAuMCkpCisgICAgICAgIHN0b3JtLXRvcG9sb2d5MiAoLmNyZWF0ZVRvcG9sb2d5IGJ1aWxkZXIyKQorICAgICAgICB0b3BvbG9neTIgKFRvcG9sb2d5RGV0YWlscy4gInRvcG9sb2d5MiIKKyAgICAgICAgICAgICAgICAgICAge1RPUE9MT0dZLU5BTUUgInRvcG9sb2d5LW5hbWUtMiIKKyAgICAgICAgICAgICAgICAgICAgIFRPUE9MT0dZLVNVQk1JVFRFUi1VU0VSICJ1c2VyQyIKKyAgICAgICAgICAgICAgICAgICAgIFRPUE9MT0dZLUNPTVBPTkVOVC1SRVNPVVJDRVMtT05IRUFQLU1FTU9SWS1NQiAxMjguMAorICAgICAgICAgICAgICAgICAgICAgVE9QT0xPR1ktQ09NUE9ORU5ULVJFU09VUkNFUy1PRkZIRUFQLU1FTU9SWS1NQiAwLjAKKyAgICAgICAgICAgICAgICAgICAgIFRPUE9MT0dZLUNPTVBPTkVOVC1DUFUtUENPUkUtUEVSQ0VOVCAxMC4wCisgICAgICAgICAgICAgICAgICAgICBUT1BPTE9HWS1XT1JLRVItTUFYLUhFQVAtU0laRS1NQiA4MTkyLjB9CisgICAgICAgICAgICAgICAgICAgIHN0b3JtLXRvcG9sb2d5MgorICAgICAgICAgICAgICAgICAgICAyIAorICAgICAgICAgICAgICAgICAgICAobWstZWQtbWFwIFtbInNwb3V0MiIgMCA0XV0pKQorICAgICAgICBidWlsZGVyMyAoVG9wb2xvZ3lCdWlsZGVyLikgOzsgdG9wbzMgaGFzIDQgbWVkaXVtIHRhc2tzLCBsYXVuY2hpbmcgdG9wbyAxLTMgdG9nZXRoZXIgcmVxdWlyZXMgdGhlIHNhbWUgbWVtIGFzIHRoZSBjbHVzdGVyJ3MgbWVtIGNhcGFjaXR5ICg1RykKKyAgICAgICAgXyAoZG90byAoLnNldFNwb3V0IGJ1aWxkZXIzICJzcG91dDMiIChUZXN0V29yZFNwb3V0LikgNCkKKyAgICAgICAgICAgICguc2V0TWVtb3J5TG9hZCAyMDAuMCA1Ni4wKQorICAgICAgICAgICAgKC5zZXRDUFVMb2FkIDIwLjApKQorICAgICAgICBzdG9ybS10b3BvbG9neTMgKC5jcmVhdGVUb3BvbG9neSBidWlsZGVyMykKKyAgICAgICAgdG9wb2xvZ3kzIChUb3BvbG9neURldGFpbHMuICJ0b3BvbG9neTMiCisgICAgICAgICAgICAgICAgICAgIHtUT1BPTE9HWS1OQU1FICJ0b3BvbG9neS1uYW1lLTMiCisgICAgICAgICAgICAgICAgICAgICBUT1BPTE9HWS1TVUJNSVRURVItVVNFUiAidXNlckMiCisgICAgICAgICAgICAgICAgICAgICBUT1BPTE9HWS1DT01QT05FTlQtUkVTT1VSQ0VTLU9OSEVBUC1NRU1PUlktTUIgMTI4LjAKKyAgICAgICAgICAgICAgICAgICAgIFRPUE9MT0dZLUNPTVBPTkVOVC1SRVNPVVJDRVMtT0ZGSEVBUC1NRU1PUlktTUIgMC4wCisgICAgICAgICAgICAgICAgICAgICBUT1BPTE9HWS1DT01QT05FTlQtQ1BVLVBDT1JFLVBFUkNFTlQgMTAuMAorICAgICAgICAgICAgICAgICAgICAgVE9QT0xPR1ktV09SS0VSLU1BWC1IRUFQLVNJWkUtTUIgODE5Mi4wfQorICAgICAgICAgICAgICAgICAgICBzdG9ybS10b3BvbG9neTMKKyAgICAgICAgICAgICAgICAgICAgMiAKKyAgICAgICAgICAgICAgICAgICAgKG1rLWVkLW1hcCBbWyJzcG91dDMiIDAgNF1dKSkKKyAgICAgICAgYnVpbGRlcjQgKFRvcG9sb2d5QnVpbGRlci4pIDs7IHRvcG80IGhhcyAxMiBzbWFsbCB0YXNrcywgZWFjaCdzIG1lbSByZXEgZG9lcyBub3QgZXhhY3RseSBkaXZpZGUgYSBub2RlJ3MgbWVtIGNhcGFjaXR5CisgICAgICAgIF8gKGRvdG8gKC5zZXRTcG91dCBidWlsZGVyNCAic3BvdXQ0IiAoVGVzdFdvcmRTcG91dC4pIDIpCisgICAgICAgICAgICAoLnNldE1lbW9yeUxvYWQgMTAwLjAgMC4wKQorICAgICAgICAgICAgKC5zZXRDUFVMb2FkIDMwLjApKQorICAgICAgICBzdG9ybS10b3BvbG9neTQgKC5jcmVhdGVUb3BvbG9neSBidWlsZGVyNCkKKyAgICAgICAgdG9wb2xvZ3k0IChUb3BvbG9neURldGFpbHMuICJ0b3BvbG9neTQiCisgICAgICAgICAgICAgICAgICAgIHtUT1BPTE9HWS1OQU1FICJ0b3BvbG9neS1uYW1lLTQiCisgICAgICAgICAgICAgICAgICAgICBUT1BPTE9HWS1TVUJNSVRURVItVVNFUiAidXNlckMiCisgICAgICAgICAgICAgICAgICAgICBUT1BPTE9HWS1DT01QT05FTlQtUkVTT1VSQ0VTLU9OSEVBUC1NRU1PUlktTUIgMTI4LjAKKyAgICAgICAgICAgICAgICAgICAgIFRPUE9MT0dZLUNPTVBPTkVOVC1SRVNPVVJDRVMtT0ZGSEVBUC1NRU1PUlktTUIgMC4wCisgICAgICAgICAgICAgICAgICAgICBUT1BPTE9HWS1DT01QT05FTlQtQ1BVLVBDT1JFLVBFUkNFTlQgMTAuMAorICAgICAgICAgICAgICAgICAgICAgVE9QT0xPR1ktV09SS0VSLU1BWC1IRUFQLVNJWkUtTUIgODE5Mi4wfQorICAgICAgICAgICAgICAgICAgICBzdG9ybS10b3BvbG9neTQKKyAgICAgICAgICAgICAgICAgICAgMiAKKyAgICAgICAgICAgICAgICAgICAgKG1rLWVkLW1hcCBbWyJzcG91dDQiIDAgMTJdXSkpCisgICAgICAgIGJ1aWxkZXI1IChUb3BvbG9neUJ1aWxkZXIuKSA7OyB0b3BvNSBoYXMgNDAgc21hbGwgdGFza3MsIGl0IHNob3VsZCBiZSBhYmxlIHRvIGV4YWN0bHkgdXNlIHVwIGJvdGggdGhlIGNwdSBhbmQgbWVtIGluIHRlaCBjbHVzdGVyCisgICAgICAgIF8gKGRvdG8gKC5zZXRTcG91dCBidWlsZGVyNSAic3BvdXQ1IiAoVGVzdFdvcmRTcG91dC4pIDQwKQorICAgICAgICAgICAgKC5zZXRNZW1vcnlMb2FkIDEwMC4wIDI4LjApCisgICAgICAgICAgICAoLnNldENQVUxvYWQgMjUuMCkpCisgICAgICAgIHN0b3JtLXRvcG9sb2d5NSAoLmNyZWF0ZVRvcG9sb2d5IGJ1aWxkZXI1KQorICAgICAgICB0b3BvbG9neTUgKFRvcG9sb2d5RGV0YWlscy4gInRvcG9sb2d5NSIKKyAgICAgICAgICAgICAgICAgICAge1RPUE9MT0dZLU5BTUUgInRvcG9sb2d5LW5hbWUtNSIKKyAgICAgICAgICAgICAgICAgICAgIFRPUE9MT0dZLVNVQk1JVFRFUi1VU0VSICJ1c2VyQyIKKyAgICAgICAgICAgICAgICAgICAgIFRPUE9MT0dZLUNPTVBPTkVOVC1SRVNPVVJDRVMtT05IRUFQLU1FTU9SWS1NQiAxMjguMAorICAgICAgICAgICAgICAgICAgICAgVE9QT0xPR1ktQ09NUE9ORU5ULVJFU09VUkNFUy1PRkZIRUFQLU1FTU9SWS1NQiAwLjAKKyAgICAgICAgICAgICAgICAgICAgIFRPUE9MT0dZLUNPTVBPTkVOVC1DUFUtUENPUkUtUEVSQ0VOVCAxMC4wCisgICAgICAgICAgICAgICAgICAgICBUT1BPTE9HWS1XT1JLRVItTUFYLUhFQVAtU0laRS1NQiA4MTkyLjB9CisgICAgICAgICAgICAgICAgICAgIHN0b3JtLXRvcG9sb2d5NQorICAgICAgICAgICAgICAgICAgICAyIAorICAgICAgICAgICAgICAgICAgICAobWstZWQtbWFwIFtbInNwb3V0NSIgMCA0MF1dKSkKKyAgICAgICAgZXBzaWxvbiAwLjAwMDAwMQorICAgICAgICB0b3BvbG9naWVzIChUb3BvbG9naWVzLiAodG8tdG9wLW1hcCBbdG9wb2xvZ3kxIHRvcG9sb2d5Ml0pKQorICAgICAgICBzY2hlZHVsZXIgKFJlc291cmNlQXdhcmVTY2hlZHVsZXIuKV0KKworICAgICh0ZXN0aW5nICJMYXVuY2ggdG9wbyAxLTMgdG9nZXRoZXIsIGl0IHNob3VsZCBiZSBhYmxlIHRvIHVzZSB1cCBlaXRoZXIgbWVtIG9yIGNwdSByZXNvdXJjZSBkdWUgdG8gZXhhY3QgZGl2aXNpb24iCisgICAgICAobGV0IFtjbHVzdGVyIChDbHVzdGVyLiAobmltYnVzL3N0YW5kYWxvbmUtbmltYnVzKSBzdXBlcnMge30KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtTVE9STS1ORVRXT1JLLVRPUE9HUkFQSFktUExVR0lOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhY2t0eXBlLnN0b3JtLm5ldHdvcmt0b3BvZ3JhcGh5LkRlZmF1bHRSYWNrRE5TVG9Td2l0Y2hNYXBwaW5nIn0pCisgICAgICAgICAgICB0b3BvbG9naWVzIChUb3BvbG9naWVzLiAodG8tdG9wLW1hcCBbdG9wb2xvZ3kxIHRvcG9sb2d5MiB0b3BvbG9neTNdKSkKKyAgICAgICAgICAgIF8gKC5zY2hlZHVsZSBzY2hlZHVsZXIgdG9wb2xvZ2llcyBjbHVzdGVyKQorICAgICAgICAgICAgc3VwZXItPm1lbS11c2FnZSAoZ2V0LXN1cGVyLT5tZW0tdXNhZ2UgY2x1c3RlciB0b3BvbG9naWVzKQorICAgICAgICAgICAgc3VwZXItPmNwdS11c2FnZSAoZ2V0LXN1cGVyLT5jcHUtdXNhZ2UgY2x1c3RlciB0b3BvbG9naWVzKV0KKyAgICAgICAgKGlzICg9ICJGdWxseSBTY2hlZHVsZWQiICguZ2V0ICguZ2V0U3RhdHVzTWFwIGNsdXN0ZXIpICJ0b3BvbG9neTEiKSkpCisgICAgICAgIChpcyAoPSAiRnVsbHkgU2NoZWR1bGVkIiAoLmdldCAoLmdldFN0YXR1c01hcCBjbHVzdGVyKSAidG9wb2xvZ3kyIikpKQorICAgICAgICAoaXMgKD0gIkZ1bGx5IFNjaGVkdWxlZCIgKC5nZXQgKC5nZXRTdGF0dXNNYXAgY2x1c3RlcikgInRvcG9sb2d5MyIpKSkKKyAgICAgICAgKGRvc2VxIFtzdXBlciAoLnZhbHVlcyBzdXBlcnMpXSAKKyAgICAgICAgICAobGV0IFttZW0tYXZhaWwgKC5nZXRUb3RhbE1lbW9yeSBzdXBlcikKKyAgICAgICAgICAgICAgICBtZW0tdXNlZCAoLmdldCBzdXBlci0+bWVtLXVzYWdlIHN1cGVyKQorICAgICAgICAgICAgICAgIGNwdS1hdmFpbCAoLmdldFRvdGFsQ1BVIHN1cGVyKQorICAgICAgICAgICAgICAgIGNwdS11c2VkICguZ2V0IHN1cGVyLT5jcHUtdXNhZ2Ugc3VwZXIpXQorICAgICAgICAgICAgKGlzIChvciAoPD0gKE1hdGgvYWJzICgtIG1lbS1hdmFpbCBtZW0tdXNlZCkpIGVwc2lsb24pCisgICAgICAgICAgICAgICAgICAgICg8PSAoTWF0aC9hYnMgKC0gY3B1LWF2YWlsIGNwdS11c2VkKSkgZXBzaWxvbikpKSkpKSkKKworICAgICh0ZXN0aW5nICJMYXVuY2ggdG9wbyAxLCAyIGFuZCA0LCB0aGV5IHRvZ2V0aGVyIHJlcXVlc3QgYSBsaXR0bGUgbW9yZSBtZW0gdGhhbiBhdmFpbGFibGUsIHNvIG9uZSBvZiB0aGUgMyB0b3BvcyB3aWxsIG5vdCBiZSBzY2hlZHVsZWQiCisgICAgICAobGV0IFtjbHVzdGVyIChDbHVzdGVyLiAobmltYnVzL3N0YW5kYWxvbmUtbmltYnVzKSBzdXBlcnMge30KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtTVE9STS1ORVRXT1JLLVRPUE9HUkFQSFktUExVR0lOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhY2t0eXBlLnN0b3JtLm5ldHdvcmt0b3BvZ3JhcGh5LkRlZmF1bHRSYWNrRE5TVG9Td2l0Y2hNYXBwaW5nIn0pCisgICAgICAgICAgICB0b3BvbG9naWVzIChUb3BvbG9naWVzLiAodG8tdG9wLW1hcCBbdG9wb2xvZ3kxIHRvcG9sb2d5MiB0b3BvbG9neTNdKSkKKyAgICAgICAgICAgIF8gKC5zY2hlZHVsZSBzY2hlZHVsZXIgdG9wb2xvZ2llcyBjbHVzdGVyKQorICAgICAgICAgICAgICAgIHNjaGVkdWxlZC10b3BvcyAoaWYgKD0gIkZ1bGx5IFNjaGVkdWxlZCIgKC5nZXQgKC5nZXRTdGF0dXNNYXAgY2x1c3RlcikgInRvcG9sb2d5MSIpKSAxIDApCisgICAgICAgICAgICAgICAgc2NoZWR1bGVkLXRvcG9zICgrIHNjaGVkdWxlZC10b3BvcyAoaWYgKD0gIkZ1bGx5IFNjaGVkdWxlZCIgKC5nZXQgKC5nZXRTdGF0dXNNYXAgY2x1c3RlcikgInRvcG9sb2d5MiIpKSAxIDApKQorICAgICAgICAgICAgICAgIHNjaGVkdWxlZC10b3BvcyAoKyBzY2hlZHVsZWQtdG9wb3MgKGlmICg9ICJGdWxseSBTY2hlZHVsZWQiICguZ2V0ICguZ2V0U3RhdHVzTWFwIGNsdXN0ZXIpICJ0b3BvbG9neTQiKSkgMSAwKSldCisgICAgICAgICAgICAoaXMgKD0gc2NoZWR1bGVkLXRvcG9zIDIpKSkpIDs7IG9ubHkgMiB0b3BvcyB3aWxsIGdldCAoZnVsbHkpIHNjaGVkdWxlZAorCisgICAgKHRlc3RpbmcgIkxhdW5jaCB0b3BvNSBvbmx5LCBib3RoIG1lbSBhbmQgY3B1IHNob3VsZCBiZSBleGFjdGx5IHVzZWQgdXAiCisgICAgICAobGV0IFtjbHVzdGVyIChDbHVzdGVyLiAobmltYnVzL3N0YW5kYWxvbmUtbmltYnVzKSBzdXBlcnMge30KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtTVE9STS1ORVRXT1JLLVRPUE9HUkFQSFktUExVR0lOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhY2t0eXBlLnN0b3JtLm5ldHdvcmt0b3BvZ3JhcGh5LkRlZmF1bHRSYWNrRE5TVG9Td2l0Y2hNYXBwaW5nIn0pCisgICAgICAgICAgICB0b3BvbG9naWVzIChUb3BvbG9naWVzLiAodG8tdG9wLW1hcCBbdG9wb2xvZ3k1XSkpCisgICAgICAgICAgICBfICguc2NoZWR1bGUgc2NoZWR1bGVyIHRvcG9sb2dpZXMgY2x1c3RlcikKKyAgICAgICAgICAgIHN1cGVyLT5tZW0tdXNhZ2UgKGdldC1zdXBlci0+bWVtLXVzYWdlIGNsdXN0ZXIgdG9wb2xvZ2llcykKKyAgICAgICAgICAgIHN1cGVyLT5jcHUtdXNhZ2UgKGdldC1zdXBlci0+Y3B1LXVzYWdlIGNsdXN0ZXIgdG9wb2xvZ2llcyldCisgICAgICAgIChpcyAoPSAiRnVsbHkgU2NoZWR1bGVkIiAoLmdldCAoLmdldFN0YXR1c01hcCBjbHVzdGVyKSAidG9wb2xvZ3k1IikpKQorICAgICAgICAoZG9zZXEgW3N1cGVyICgudmFsdWVzIHN1cGVycyldIAorICAgICAgICAgIChsZXQgW21lbS1hdmFpbCAoLmdldFRvdGFsTWVtb3J5IHN1cGVyKQorICAgICAgICAgICAgICAgIG1lbS11c2VkICguZ2V0IHN1cGVyLT5tZW0tdXNhZ2Ugc3VwZXIpCisgICAgICAgICAgICAgICAgY3B1LWF2YWlsICguZ2V0VG90YWxDUFUgXlN1cGVydmlzb3JEZXRhaWxzIHN1cGVyKQorICAgICAgICAgICAgICAgIGNwdS11c2VkICguZ2V0IHN1cGVyLT5jcHUtdXNhZ2Ugc3VwZXIpXQorICAgICAgICAgICAgKGlzIChhbmQgKDw9IChNYXRoL2FicyAoLSBtZW0tYXZhaWwgbWVtLXVzZWQpKSBlcHNpbG9uKQorICAgICAgICAgICAgICAgICAgICAoPD0gKE1hdGgvYWJzICgtIGNwdS1hdmFpbCBjcHUtdXNlZCkpIGVwc2lsb24pKSkpKSkpKSkKKworKGRlZnRlc3QgdGVzdC10b3BvbG9neS13b3JrZXItbWF4LWhlYXAtc2l6ZQorICAobGV0IFtzdXBlcnMgKGdlbi1zdXBlcnZpc29ycyAyIDIpXQorICAgICh0ZXN0aW5nICJ0ZXN0IGlmIFJBUyB3aWxsIHNwcmVhZCBleGVjdXRvcnMgYWNyb3NzIG11bGl0cGxlIHdvcmtlcnMgYmFzZWQgb24gdGhlIHNldCBsaW1pdCBmb3IgYSB3b3JrZXIgdXNlZCBieSB0aGUgdG9wb2xvZ3kiKQorICAgIChsZXQgW2NsdXN0ZXIgKENsdXN0ZXIuIChuaW1idXMvc3RhbmRhbG9uZS1uaW1idXMpIHN1cGVycyB7fQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1NUT1JNLU5FVFdPUkstVE9QT0dSQVBIWS1QTFVHSU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFja3R5cGUuc3Rvcm0ubmV0d29ya3RvcG9ncmFwaHkuRGVmYXVsdFJhY2tETlNUb1N3aXRjaE1hcHBpbmcifSkKKyAgICAgICAgICBzY2hlZHVsZXIgKFJlc291cmNlQXdhcmVTY2hlZHVsZXIuKQorICAgICAgICAgIGJ1aWxkZXIxIChUb3BvbG9neUJ1aWxkZXIuKQorICAgICAgICAgIF8gKC5zZXRTcG91dCBidWlsZGVyMSAic3BvdXQxIiAoVGVzdFdvcmRTcG91dC4pIDIpCisgICAgICAgICAgc3Rvcm0tdG9wb2xvZ3kxICguY3JlYXRlVG9wb2xvZ3kgYnVpbGRlcjEpCisgICAgICAgICAgdG9wb2xvZ3kxIChUb3BvbG9neURldGFpbHMuICJ0b3BvbG9neTEiCisgICAgICAgICAgICAgICAgICAgICAge1RPUE9MT0dZLU5BTUUgInRvcG9sb2d5LW5hbWUtMSIKKyAgICAgICAgICAgICAgICAgICAgICAgVE9QT0xPR1ktU1VCTUlUVEVSLVVTRVIgInVzZXJDIgorICAgICAgICAgICAgICAgICAgICAgICBUT1BPTE9HWS1DT01QT05FTlQtUkVTT1VSQ0VTLU9OSEVBUC1NRU1PUlktTUIgMTI4LjAKKyAgICAgICAgICAgICAgICAgICAgICAgVE9QT0xPR1ktQ09NUE9ORU5ULVJFU09VUkNFUy1PRkZIRUFQLU1FTU9SWS1NQiAwLjAKKyAgICAgICAgICAgICAgICAgICAgICAgVE9QT0xPR1ktQ09NUE9ORU5ULUNQVS1QQ09SRS1QRVJDRU5UIDEwLjAKKyAgICAgICAgICAgICAgICAgICAgICAgVE9QT0xPR1ktV09SS0VSLU1BWC1IRUFQLVNJWkUtTUIgMTI4LjB9CisgICAgICAgICAgICAgICAgICAgICAgc3Rvcm0tdG9wb2xvZ3kxCisgICAgICAgICAgICAgICAgICAgICAgMQorICAgICAgICAgICAgICAgICAgICAgIChtay1lZC1tYXAgW1sic3BvdXQxIiAwIDRdXSkpCisgICAgICAgICAgdG9wb2xvZ2llcyAoVG9wb2xvZ2llcy4gKHRvLXRvcC1tYXAgW3RvcG9sb2d5MV0pKV0KKyAgICAgICguc2NoZWR1bGUgc2NoZWR1bGVyIHRvcG9sb2dpZXMgY2x1c3RlcikKKyAgICAgIChpcyAoPSAoLmdldCAoLmdldFN0YXR1c01hcCBjbHVzdGVyKSAidG9wb2xvZ3kxIikgIkZ1bGx5IFNjaGVkdWxlZCIpKQorICAgICAgKGlzICg9ICguZ2V0QXNzaWduZWROdW1Xb3JrZXJzIGNsdXN0ZXIgdG9wb2xvZ3kxKSA0KSkpCisgICAgKHRlc3RpbmcgInRlc3Qgd2hlbiBubyBtb3JlIHdvcmtlcnMgYXJlIGF2YWlsYWJsZSBkdWUgdG8gdG9wb2xvZ3kgd29ya2VyIG1heCBoZWFwIHNpemUgbGltaXQgYnV0IHRoZXJlIGlzIG1lbW9yeSBpcyBzdGlsbCBhdmFpbGFibGUiKQorICAgIChsZXQgW2NsdXN0ZXIgKENsdXN0ZXIuIChuaW1idXMvc3RhbmRhbG9uZS1uaW1idXMpIHN1cGVycyB7fQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1NUT1JNLU5FVFdPUkstVE9QT0dSQVBIWS1QTFVHSU4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFja3R5cGUuc3Rvcm0ubmV0d29ya3RvcG9ncmFwaHkuRGVmYXVsdFJhY2tETlNUb1N3aXRjaE1hcHBpbmcifSkKKyAgICAgICAgICBzY2hlZHVsZXIgKFJlc291cmNlQXdhcmVTY2hlZHVsZXIuKQorICAgICAgICAgIGJ1aWxkZXIxIChUb3BvbG9neUJ1aWxkZXIuKQorICAgICAgICAgIF8gKC5zZXRTcG91dCBidWlsZGVyMSAic3BvdXQxIiAoVGVzdFdvcmRTcG91dC4pIDIpCisgICAgICAgICAgc3Rvcm0tdG9wb2xvZ3kxICguY3JlYXRlVG9wb2xvZ3kgYnVpbGRlcjEpCisgICAgICAgICAgdG9wb2xvZ3kxIChUb3BvbG9neURldGFpbHMuICJ0b3BvbG9neTEiCisgICAgICAgICAgICAgICAgICAgICAge1RPUE9MT0dZLU5BTUUgInRvcG9sb2d5LW5hbWUtMSIKKyAgICAgICAgICAgICAgICAgICAgICAgVE9QT0xPR1ktU1VCTUlUVEVSLVVTRVIgInVzZXJDIgorICAgICAgICAgICAgICAgICAgICAgICBUT1BPTE9HWS1DT01QT05FTlQtUkVTT1VSQ0VTLU9OSEVBUC1NRU1PUlktTUIgMTI4LjAKKyAgICAgICAgICAgICAgICAgICAgICAgVE9QT0xPR1ktQ09NUE9ORU5ULVJFU09VUkNFUy1PRkZIRUFQLU1FTU9SWS1NQiAwLjAKKyAgICAgICAgICAgICAgICAgICAgICAgVE9QT0xPR1ktQ09NUE9ORU5ULUNQVS1QQ09SRS1QRVJDRU5UIDEwLjAKKyAgICAgICAgICAgICAgICAgICAgICAgVE9QT0xPR1ktV09SS0VSLU1BWC1IRUFQLVNJWkUtTUIgMTI4LjB9CisgICAgICAgICAgICAgICAgICAgICAgc3Rvcm0tdG9wb2xvZ3kxCisgICAgICAgICAgICAgICAgICAgICAgMQorICAgICAgICAgICAgICAgICAgICAgIChtay1lZC1tYXAgW1sic3BvdXQxIiAwIDVdXSkpCisgICAgICAgICAgdG9wb2xvZ2llcyAoVG9wb2xvZ2llcy4gKHRvLXRvcC1tYXAgW3RvcG9sb2d5MV0pKV0KKyAgICAgICguc2NoZWR1bGUgc2NoZWR1bGVyIHRvcG9sb2dpZXMgY2x1c3RlcikKKyAgICAgIDs7c3BvdXQxIGlzIGdvaW5nIHRvIGNvbnRhaW4gNSBleGVjdXRvcnMgdGhhdCBuZWVkcyBzY2hlZHVsaW5nLiBFYWNoIG9mIHRob3NlIGV4ZWN1dG9ycyBoYXMgYSBtZW1vcnkgcmVxdWlyZW1lbnQgb2YgMTI4LjAgTUIKKyAgICAgIDs7VGhlIGNsdXN0ZXIgY29udGFpbnMgNCBmcmVlIFdvcmtlclNsb3RzLiBGb3IgdGhpcyB0b3BvbG9sb2d5IGVhY2ggd29ya2VyIGlzIGxpbWl0ZWQgdG8gYSBtYXggaGVhcCBzaXplIG9mIDEyOC4wCisgICAgICA7O1RodXMsIG9uZSBleGVjdXRvciBub3QgZ29pbmcgdG8gYmUgYWJsZSB0byBnZXQgc2NoZWR1bGVkIHRodXMgZmFpbGluZyB0aGUgc2NoZWR1bGluZyBvZiB0aGlzIHRvcG9sb2d5IGFuZCBubyBleGVjdXRvcnMgb2YgdGhpcyB0b3BvbG9neSB3aWxsIGJlIHNjaGVkdWxlZGVkCisgICAgICAoaXMgKD0gKC5zaXplICguZ2V0VW5hc3NpZ25lZEV4ZWN1dG9ycyBjbHVzdGVyIHRvcG9sb2d5MSkpIDUpKQorICAgICAgKGlzICg9ICguZ2V0ICguZ2V0U3RhdHVzTWFwIGNsdXN0ZXIpICJ0b3BvbG9neTEiKSAgIlVuc3VjY2Vzc2Z1bCBpbiBzY2hlZHVsaW5nIikpKQorICAgIAorICAgIChsZXQgW2NsdXN0ZXIgKENsdXN0ZXIuIChuaW1idXMvc3RhbmRhbG9uZS1uaW1idXMpIHN1cGVycyB7fQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7U1RPUk0tTkVUV09SSy1UT1BPR1JBUEhZLVBMVUdJTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhY2t0eXBlLnN0b3JtLm5ldHdvcmt0b3BvZ3JhcGh5LkRlZmF1bHRSYWNrRE5TVG9Td2l0Y2hNYXBwaW5nIn0pCisgICAgICAgICAgY2x1c3RlciAoTG9jYWxDbHVzdGVyLikKKyAgICAgICAgICBidWlsZGVyMSAoVG9wb2xvZ3lCdWlsZGVyLikKKyAgICAgICAgICBfICguc2V0U3BvdXQgYnVpbGRlcjEgInNwb3V0MSIgKFRlc3RXb3JkU3BvdXQuKSAyKQorICAgICAgICAgIHN0b3JtLXRvcG9sb2d5MSAoLmNyZWF0ZVRvcG9sb2d5IGJ1aWxkZXIxKQorICAgICAgICAgIGNvbmYgIHtUT1BPTE9HWS1OQU1FICJ0b3BvbG9neS1uYW1lLTEiCisgICAgICAgICAgICAgICAgICAgICAgIFRPUE9MT0dZLVNVQk1JVFRFUi1VU0VSICJ1c2VyQyIKKyAgICAgICAgICAgICAgICAgICAgICAgVE9QT0xPR1ktQ09NUE9ORU5ULVJFU09VUkNFUy1PTkhFQVAtTUVNT1JZLU1CIDEyOS4wCisgICAgICAgICAgICAgICAgICAgICAgIFRPUE9MT0dZLUNPTVBPTkVOVC1SRVNPVVJDRVMtT0ZGSEVBUC1NRU1PUlktTUIgMC4wCisgICAgICAgICAgICAgICAgICAgICAgIFRPUE9MT0dZLUNPTVBPTkVOVC1DUFUtUENPUkUtUEVSQ0VOVCAxMC4wCisgICAgICAgICAgICAgICAgICAgICAgIFRPUE9MT0dZLVdPUktFUi1NQVgtSEVBUC1TSVpFLU1CIDEyOC4wfQorICAgICAgICAgIHRvcG9sb2d5MSAoVG9wb2xvZ3lEZXRhaWxzLiAidG9wb2xvZ3kxIgorICAgICAgICAgICAgICAgICAgICAgIGNvbmYKKyAgICAgICAgICAgICAgICAgICAgICBzdG9ybS10b3BvbG9neTEKKyAgICAgICAgICAgICAgICAgICAgICAxCisgICAgICAgICAgICAgICAgICAgICAgKG1rLWVkLW1hcCBbWyJzcG91dDEiIDAgNV1dKSkKKyAgICAgICAgICB0b3BvbG9naWVzIChUb3BvbG9naWVzLiAodG8tdG9wLW1hcCBbdG9wb2xvZ3kxXSkpXQorICAgICAgKGlzICh0aHJvd24/IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAgICAgICAgKFN0b3JtU3VibWl0dGVyL3N1Ym1pdFRvcG9sb2d5V2l0aFByb2dyZXNzQmFyICJ0ZXN0IiBjb25mIHN0b3JtLXRvcG9sb2d5MSkpKQorICAgICAgIAorICApKSkKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvdGVzdC9jbGovYmFja3R5cGUvc3Rvcm0vc2NoZWR1bGVyX3Rlc3QuY2xqIGIvc3Rvcm0tY29yZS90ZXN0L2Nsai9iYWNrdHlwZS9zdG9ybS9zY2hlZHVsZXJfdGVzdC5jbGoKaW5kZXggNDVhY2Y3NS4uNDM2MGU5ZCAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS90ZXN0L2Nsai9iYWNrdHlwZS9zdG9ybS9zY2hlZHVsZXJfdGVzdC5jbGoKKysrIGIvc3Rvcm0tY29yZS90ZXN0L2Nsai9iYWNrdHlwZS9zdG9ybS9zY2hlZHVsZXJfdGVzdC5jbGoKQEAgLTEyOSw3ICsxMjksOCBAQAogICAgICAgICBhc3NpZ25tZW50MyAoU2NoZWR1bGVyQXNzaWdubWVudEltcGwuICJ0b3BvbG9neTMiIGV4ZWN1dG9yLT5zbG90MykKICAgICAgICAgY2x1c3RlciAoQ2x1c3Rlci4gKG5pbWJ1cy9zdGFuZGFsb25lLW5pbWJ1cykKICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJzdXBlcnZpc29yMSIgc3VwZXJ2aXNvcjEgInN1cGVydmlzb3IyIiBzdXBlcnZpc29yMn0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgeyJ0b3BvbG9neTEiIGFzc2lnbm1lbnQxICJ0b3BvbG9neTIiIGFzc2lnbm1lbnQyICJ0b3BvbG9neTMiIGFzc2lnbm1lbnQzfSldCisgICAgICAgICAgICAgICAgICAgICAgICAgIHsidG9wb2xvZ3kxIiBhc3NpZ25tZW50MSAidG9wb2xvZ3kyIiBhc3NpZ25tZW50MiAidG9wb2xvZ3kzIiBhc3NpZ25tZW50M30KKyAgICAgICAgICAgICAgICAgIG5pbCldCiAgICAgOzsgdGVzdCBDbHVzdGVyIGNvbnN0cnVjdG9yCiAgICAgKGlzICg9ICN7InN1cGVydmlzb3IxIiAic3VwZXJ2aXNvcjIifQogICAgICAgICAgICAoLT4+IGNsdXN0ZXIKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvdGVzdC9jbGovYmFja3R5cGUvc3Rvcm0vc2VjdXJpdHkvYXV0aC9EZWZhdWx0SHR0cENyZWRlbnRpYWxzUGx1Z2luX3Rlc3QuY2xqIGIvc3Rvcm0tY29yZS90ZXN0L2Nsai9iYWNrdHlwZS9zdG9ybS9zZWN1cml0eS9hdXRoL0RlZmF1bHRIdHRwQ3JlZGVudGlhbHNQbHVnaW5fdGVzdC5jbGoKaW5kZXggZTdiNDRjZi4uMDBjMWQ3NiAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS90ZXN0L2Nsai9iYWNrdHlwZS9zdG9ybS9zZWN1cml0eS9hdXRoL0RlZmF1bHRIdHRwQ3JlZGVudGlhbHNQbHVnaW5fdGVzdC5jbGoKKysrIGIvc3Rvcm0tY29yZS90ZXN0L2Nsai9iYWNrdHlwZS9zdG9ybS9zZWN1cml0eS9hdXRoL0RlZmF1bHRIdHRwQ3JlZGVudGlhbHNQbHVnaW5fdGVzdC5jbGoKQEAgLTQ4LDIyICs0OCwyOCBAQAogICAgICAgICAoaXMgKC5lcXVhbHMgZXhwLW5hbWUgKC5nZXRVc2VyTmFtZSBoYW5kbGVyIHJlcSkpKSkpCiAKICAgICAodGVzdGluZyAicmV0dXJucyBkb0FzVXNlciBmcm9tIHJlcXVlc3RzIHByaW5jaXBhbCB3aGVuIEhlYWRlciBoYXMgZG9Bc1VzZXIgcGFyYW0gc2V0IgotICAgICAgKGxldCBbZXhwLW5hbWUgIkFsaWNlIgotICAgICAgICAgICAgZG8tYXMtdXNlci1uYW1lICJCb2IiCi0gICAgICAgICAgICBwcmluYyAoU2luZ2xlVXNlclByaW5jaXBhbC4gZXhwLW5hbWUpCi0gICAgICAgICAgICByZXEgKE1vY2tpdG8vbW9jayBIdHRwU2VydmxldFJlcXVlc3QpCi0gICAgICAgICAgICBfICguIChNb2NraXRvL3doZW4gKC4gcmVxIGdldFVzZXJQcmluY2lwYWwpKQotICAgICAgICAgICAgICB0aGVuUmV0dXJuIHByaW5jKQotICAgICAgICAgICAgXyAoLiAoTW9ja2l0by93aGVuICguIHJlcSBnZXRIZWFkZXIgImRvQXNVc2VyIikpCi0gICAgICAgICAgICAgIHRoZW5SZXR1cm4gZG8tYXMtdXNlci1uYW1lKQotICAgICAgICAgICAgY29udGV4dCAoLnBvcHVsYXRlQ29udGV4dCBoYW5kbGVyIChSZXFDb250ZXh0L2NvbnRleHQpIHJlcSldCi0gICAgICAgIChpcyAoPSB0cnVlICguaXNJbXBlcnNvbmF0aW5nIGNvbnRleHQpKSkKLSAgICAgICAgKGlzICguZXF1YWxzIGV4cC1uYW1lICguZ2V0TmFtZSAoLnJlYWxQcmluY2lwYWwgY29udGV4dCkpKSkKLSAgICAgICAgKGlzICguZXF1YWxzIGRvLWFzLXVzZXItbmFtZSAoLmdldE5hbWUgKC5wcmluY2lwYWwgY29udGV4dCkpKSkpKSkpCisgICAgICAodHJ5CisgICAgICAgIChsZXQgW2V4cC1uYW1lICJBbGljZSIKKyAgICAgICAgICAgICAgZG8tYXMtdXNlci1uYW1lICJCb2IiCisgICAgICAgICAgICAgIHByaW5jIChTaW5nbGVVc2VyUHJpbmNpcGFsLiBleHAtbmFtZSkKKyAgICAgICAgICAgICAgcmVxIChNb2NraXRvL21vY2sgSHR0cFNlcnZsZXRSZXF1ZXN0KQorICAgICAgICAgICAgICBfICguIChNb2NraXRvL3doZW4gKC4gcmVxIGdldFVzZXJQcmluY2lwYWwpKQorICAgICAgICAgICAgICAgIHRoZW5SZXR1cm4gcHJpbmMpCisgICAgICAgICAgICAgIF8gKC4gKE1vY2tpdG8vd2hlbiAoLiByZXEgZ2V0SGVhZGVyICJkb0FzVXNlciIpKQorICAgICAgICAgICAgICAgIHRoZW5SZXR1cm4gZG8tYXMtdXNlci1uYW1lKQorICAgICAgICAgICAgICBjb250ZXh0ICgucG9wdWxhdGVDb250ZXh0IGhhbmRsZXIgKFJlcUNvbnRleHQvY29udGV4dCkgcmVxKV0KKyAgICAgICAgICAoaXMgKD0gdHJ1ZSAoLmlzSW1wZXJzb25hdGluZyBjb250ZXh0KSkpCisgICAgICAgICAgKGlzICguZXF1YWxzIGV4cC1uYW1lICguZ2V0TmFtZSAoLnJlYWxQcmluY2lwYWwgY29udGV4dCkpKSkKKyAgICAgICAgICAoaXMgKC5lcXVhbHMgZG8tYXMtdXNlci1uYW1lICguZ2V0TmFtZSAoLnByaW5jaXBhbCBjb250ZXh0KSkpKSkKKyAgICAgICAgKGZpbmFsbHkKKyAgICAgICAgICAoUmVxQ29udGV4dC9yZXNldCkpKSkpKQogCiAoZGVmdGVzdCB0ZXN0LXBvcHVsYXRlLXJlcS1jb250ZXh0LW9uLW51bGwtdXNlcgotICAobGV0IFtyZXEgKE1vY2tpdG8vbW9jayBIdHRwU2VydmxldFJlcXVlc3QpCi0gICAgICAgIGhhbmRsZXIgKGRvdG8gKERlZmF1bHRIdHRwQ3JlZGVudGlhbHNQbHVnaW4uKSAoLnByZXBhcmUge30pKQotICAgICAgICBzdWJqIChTdWJqZWN0LiBmYWxzZSAoc2V0IFsoU2luZ2xlVXNlclByaW5jaXBhbC4gInRlc3QiKV0pIChzZXQgW10pIChzZXQgW10pKQotICAgICAgICBjb250ZXh0IChSZXFDb250ZXh0LiBzdWJqKV0KLSAgICAoaXMgKD0gMCAoLT4gaGFuZGxlciAoLnBvcHVsYXRlQ29udGV4dCBjb250ZXh0IHJlcSkgKC5zdWJqZWN0KSAoLmdldFByaW5jaXBhbHMpICguc2l6ZSkpKSkpKQorICAodHJ5CisgICAgKGxldCBbcmVxIChNb2NraXRvL21vY2sgSHR0cFNlcnZsZXRSZXF1ZXN0KQorICAgICAgICAgIGhhbmRsZXIgKGRvdG8gKERlZmF1bHRIdHRwQ3JlZGVudGlhbHNQbHVnaW4uKSAoLnByZXBhcmUge30pKQorICAgICAgICAgIHN1YmogKFN1YmplY3QuIGZhbHNlIChzZXQgWyhTaW5nbGVVc2VyUHJpbmNpcGFsLiAidGVzdCIpXSkgKHNldCBbXSkgKHNldCBbXSkpCisgICAgICAgICAgY29udGV4dCAoUmVxQ29udGV4dC4gc3ViaildCisgICAgICAoaXMgKD0gMCAoLT4gaGFuZGxlciAoLnBvcHVsYXRlQ29udGV4dCBjb250ZXh0IHJlcSkgKC5zdWJqZWN0KSAoLmdldFByaW5jaXBhbHMpICguc2l6ZSkpKSkpCisgICAgKGZpbmFsbHkKKyAgICAgIChSZXFDb250ZXh0L3Jlc2V0KSkpKQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS90ZXN0L2Nsai9iYWNrdHlwZS9zdG9ybS9zZXJpYWxpemF0aW9uX3Rlc3QuY2xqIGIvc3Rvcm0tY29yZS90ZXN0L2Nsai9iYWNrdHlwZS9zdG9ybS9zZXJpYWxpemF0aW9uX3Rlc3QuY2xqCmluZGV4IDdmMWMwYTkuLjY4YTcxMGMgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvdGVzdC9jbGovYmFja3R5cGUvc3Rvcm0vc2VyaWFsaXphdGlvbl90ZXN0LmNsagorKysgYi9zdG9ybS1jb3JlL3Rlc3QvY2xqL2JhY2t0eXBlL3N0b3JtL3NlcmlhbGl6YXRpb25fdGVzdC5jbGoKQEAgLTE4LDEwICsxOCw4IEBACiAgICg6aW1wb3J0IFtiYWNrdHlwZS5zdG9ybS5zZXJpYWxpemF0aW9uIEtyeW9UdXBsZVNlcmlhbGl6ZXIgS3J5b1R1cGxlRGVzZXJpYWxpemVyCiAgICAgICAgICAgICBLcnlvVmFsdWVzU2VyaWFsaXplciBLcnlvVmFsdWVzRGVzZXJpYWxpemVyXSkKICAgKDppbXBvcnQgW2JhY2t0eXBlLnN0b3JtLnRlc3RpbmcgVGVzdFNlck9iamVjdCBUZXN0S3J5b0RlY29yYXRvcl0pCi0gICg6aW1wb3J0IFtiYWNrdHlwZS5zdG9ybSBDb25maWdWYWxpZGF0aW9uXSkKLSAgKDp1c2UgW2JhY2t0eXBlLnN0b3JtIHV0aWwgY29uZmlnXSkKLSAgKQotCisgICg6aW1wb3J0IFtiYWNrdHlwZS5zdG9ybS52YWxpZGF0aW9uIENvbmZpZ1ZhbGlkYXRpb24kS3J5b1JlZ1ZhbGlkYXRvcl0pCisgICg6dXNlIFtiYWNrdHlwZS5zdG9ybSB1dGlsIGNvbmZpZ10pKQogCiAoZGVmbiBtay1jb25mIFtleHRyYV0KICAgKG1lcmdlIChyZWFkLWRlZmF1bHQtY29uZmlnKSBleHRyYSkpCkBAIC00MiwxOSArNDAsMTkgQEAKICAgICAoZGVzZXJpYWxpemUgKHNlcmlhbGl6ZSB2YWxzIGNvbmYpIGNvbmYpKSkKIAogKGRlZnRlc3QgdmFsaWRhdGUta3J5by1jb25mLWJhc2ljCi0gICgudmFsaWRhdGVGaWVsZCBDb25maWdWYWxpZGF0aW9uL0tyeW9SZWdWYWxpZGF0b3IgInRlc3QiIFsiYSIgImIiICJjIiB7ImQiICJlIn0geyJmIiAiZyJ9XSkpCisgICgudmFsaWRhdGVGaWVsZCAoQ29uZmlnVmFsaWRhdGlvbiRLcnlvUmVnVmFsaWRhdG9yLiApICJ0ZXN0IiBbImEiICJiIiAiYyIgeyJkIiAiZSJ9IHsiZiIgImcifV0pKQogCiAoZGVmdGVzdCB2YWxpZGF0ZS1rcnlvLWNvbmYtZmFpbAogICAodHJ5Ci0gICAgKC52YWxpZGF0ZUZpZWxkIENvbmZpZ1ZhbGlkYXRpb24vS3J5b1JlZ1ZhbGlkYXRvciAidGVzdCIgeyJmIiAiZyJ9KQorICAgICgudmFsaWRhdGVGaWVsZCAoQ29uZmlnVmFsaWRhdGlvbiRLcnlvUmVnVmFsaWRhdG9yLiApICJ0ZXN0IiB7ImYiICJnIn0pCiAgICAgKGFzc2VydCBmYWxzZSkKICAgICAoY2F0Y2ggSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpKQogICAodHJ5Ci0gICAgKC52YWxpZGF0ZUZpZWxkIENvbmZpZ1ZhbGlkYXRpb24vS3J5b1JlZ1ZhbGlkYXRvciAidGVzdCIgWzFdKQorICAgICgudmFsaWRhdGVGaWVsZCAoQ29uZmlnVmFsaWRhdGlvbiRLcnlvUmVnVmFsaWRhdG9yLiApICJ0ZXN0IiBbMV0pCiAgICAgKGFzc2VydCBmYWxzZSkKICAgICAoY2F0Y2ggSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpKQogICAodHJ5Ci0gICAgKC52YWxpZGF0ZUZpZWxkIENvbmZpZ1ZhbGlkYXRpb24vS3J5b1JlZ1ZhbGlkYXRvciAidGVzdCIgW3siYSIgMX1dKQorICAgICgudmFsaWRhdGVGaWVsZCAoQ29uZmlnVmFsaWRhdGlvbiRLcnlvUmVnVmFsaWRhdG9yLiApICJ0ZXN0IiBbeyJhIiAxfV0pCiAgICAgKGFzc2VydCBmYWxzZSkKICAgICAoY2F0Y2ggSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpKQogKQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS90ZXN0L2Nsai9iYWNrdHlwZS9zdG9ybS9zdXBlcnZpc29yX3Rlc3QuY2xqIGIvc3Rvcm0tY29yZS90ZXN0L2Nsai9iYWNrdHlwZS9zdG9ybS9zdXBlcnZpc29yX3Rlc3QuY2xqCmluZGV4IGIxN2VhNWUuLjA0Yzg2MDAgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvdGVzdC9jbGovYmFja3R5cGUvc3Rvcm0vc3VwZXJ2aXNvcl90ZXN0LmNsagorKysgYi9zdG9ybS1jb3JlL3Rlc3QvY2xqL2JhY2t0eXBlL3N0b3JtL3N1cGVydmlzb3JfdGVzdC5jbGoKQEAgLTIzLDYgKzIzLDkgQEAKICAgKDppbXBvcnQgW2JhY2t0eXBlLnN0b3JtLnNjaGVkdWxlciBJU3VwZXJ2aXNvcl0pCiAgICg6aW1wb3J0IFtiYWNrdHlwZS5zdG9ybS5nZW5lcmF0ZWQgUmViYWxhbmNlT3B0aW9uc10pCiAgICg6aW1wb3J0IFtqYXZhLnV0aWwgVVVJRF0pCisgICg6aW1wb3J0IFtqYXZhLmlvIEZpbGVdKQorICAoOmltcG9ydCBbamF2YS5uaW8uZmlsZSBGaWxlc10pCisgICg6aW1wb3J0IFtqYXZhLm5pby5maWxlLmF0dHJpYnV0ZSBGaWxlQXR0cmlidXRlXSkKICAgKDp1c2UgW2JhY2t0eXBlLnN0b3JtIGNvbmZpZyB0ZXN0aW5nIHV0aWwgdGltZXJdKQogICAoOnVzZSBbYmFja3R5cGUuc3Rvcm0uZGFlbW9uIGNvbW1vbl0pCiAgICg6cmVxdWlyZSBbYmFja3R5cGUuc3Rvcm0uZGFlbW9uIFt3b3JrZXIgOmFzIHdvcmtlcl0gW3N1cGVydmlzb3IgOmFzIHN1cGVydmlzb3JdXQpAQCAtNzUsNyArNzgsNyBAQAogCiAoZGVmdGVzdCBsYXVuY2hlcy1hc3NpZ25tZW50CiAgICh3aXRoLXNpbXVsYXRlZC10aW1lLWxvY2FsLWNsdXN0ZXIgW2NsdXN0ZXIgOnN1cGVydmlzb3JzIDAKLSAgICA6ZGFlbW9uLWNvbmYge05JTUJVUy1SRUFTU0lHTiBmYWxzZQorICAgIDpkYWVtb24tY29uZiB7TklNQlVTLURPLU5PVC1SRUFTU0lHTiB0cnVlCiAgICAgICAgICAgICAgICAgICBTVVBFUlZJU09SLVdPUktFUi1TVEFSVC1USU1FT1VULVNFQ1MgNQogICAgICAgICAgICAgICAgICAgU1VQRVJWSVNPUi1XT1JLRVItVElNRU9VVC1TRUNTIDE1CiAgICAgICAgICAgICAgICAgICBTVVBFUlZJU09SLU1PTklUT1ItRlJFUVVFTkNZLVNFQ1MgM31dCkBAIC04NSwyMyArODgsMjkgQEAKICAgICAgICAgICAgICAgICAgICAgICAge30pKQogICAgICAgKGJpbmQgc3VwMSAoYWRkLXN1cGVydmlzb3IgY2x1c3RlciA6aWQgInN1cDEiIDpwb3J0cyBbMSAyIDMgNF0pKQogICAgICAgKGJpbmQgY2hhbmdlZCAoY2FwdHVyZS1jaGFuZ2VkLXdvcmtlcnMKLSAgICAgICAgICAgICAgICAgICAgICAgIChzdWJtaXQtbW9ja2VkLWFzc2lnbm1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKDpuaW1idXMgY2x1c3RlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3QiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHtUT1BPTE9HWS1XT1JLRVJTIDN9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHRvcG9sb2d5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHsxICIxIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAiMSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgIjEiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA0ICIxIn0KLSAgICAgICAgICAgICAgICAgICAgICAgICAge1sxIDFdIFsic3VwMSIgMV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFsyIDJdIFsic3VwMSIgMl0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFszIDNdIFsic3VwMSIgM10KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFs0IDRdIFsic3VwMSIgM10KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCi0gICAgICAgICAgICAgICAgICAgICAgICAoYWR2YW5jZS1jbHVzdGVyLXRpbWUgY2x1c3RlciAyKQotICAgICAgICAgICAgICAgICAgICAgICAgKGhlYXJ0YmVhdC13b3JrZXJzIGNsdXN0ZXIgInN1cDEiIFsxIDIgM10pCi0gICAgICAgICAgICAgICAgICAgICAgICAoYWR2YW5jZS1jbHVzdGVyLXRpbWUgY2x1c3RlciAxMCkpKQorICAgICAgICAgICAgICAgICAgICAgIChzdWJtaXQtbW9ja2VkLWFzc2lnbm1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICg6bmltYnVzIGNsdXN0ZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAoOnN0b3JtLWNsdXN0ZXItc3RhdGUgY2x1c3RlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0IgorICAgICAgICAgICAgICAgICAgICAgICAge1RPUE9MT0dZLVdPUktFUlMgM30KKyAgICAgICAgICAgICAgICAgICAgICAgIHRvcG9sb2d5CisgICAgICAgICAgICAgICAgICAgICAgICB7MSAiMSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAyICIxIgorICAgICAgICAgICAgICAgICAgICAgICAgIDMgIjEiCisgICAgICAgICAgICAgICAgICAgICAgICAgNCAiMSJ9CisgICAgICAgICAgICAgICAgICAgICAgICB7WzEgMV0gWyJzdXAxIiAxXQorICAgICAgICAgICAgICAgICAgICAgICAgIFsyIDJdIFsic3VwMSIgMl0KKyAgICAgICAgICAgICAgICAgICAgICAgICBbMyAzXSBbInN1cDEiIDNdCisgICAgICAgICAgICAgICAgICAgICAgICAgWzQgNF0gWyJzdXAxIiAzXX0KKyAgICAgICAgICAgICAgICAgICAgICAgIHtbInN1cDEiIDFdIFswLjAgMC4wIDAuMF0KKyAgICAgICAgICAgICAgICAgICAgICAgICBbInN1cDEiIDJdIFswLjAgMC4wIDAuMF0KKyAgICAgICAgICAgICAgICAgICAgICAgICBbInN1cDEiIDNdIFswLjAgMC4wIDAuMF0KKyAgICAgICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgICAgICAgIDs7IEluc3RlYWQgb2Ygc2xlZXBpbmcgdW50aWwgdG9wb2xvZ3kgaXMgc2NoZWR1bGVkLCByZWJhbGFuY2UgdG9wb2xvZ3kgc28gbWstYXNzaWdubWVudHMgaXMgY2FsbGVkLgorICAgICAgICAgICAgICAgICAgICAgICgucmViYWxhbmNlICg6bmltYnVzIGNsdXN0ZXIpICJ0ZXN0IiAoZG90byAoUmViYWxhbmNlT3B0aW9ucy4pICguc2V0X3dhaXRfc2VjcyAwKSkpCisgICAgICAgICAgICAgICAgICAgICAgKGFkdmFuY2UtY2x1c3Rlci10aW1lIGNsdXN0ZXIgMikKKyAgICAgICAgICAgICAgICAgICAgICAoaGVhcnRiZWF0LXdvcmtlcnMgY2x1c3RlciAic3VwMSIgWzEgMiAzXSkKKyAgICAgICAgICAgICAgICAgICAgICAoYWR2YW5jZS1jbHVzdGVyLXRpbWUgY2x1c3RlciAxMCkpKQogICAgICAgKGJpbmQgc3Rvcm0taWQgKGdldC1zdG9ybS1pZCAoOnN0b3JtLWNsdXN0ZXItc3RhdGUgY2x1c3RlcikgInRlc3QiKSkKICAgICAgIChpcyAoZW1wdHk/ICg6c2h1dGRvd24gY2hhbmdlZCkpKQogICAgICAgKHZhbGlkYXRlLWxhdW5jaGVkLW9uY2UgKDpsYXVuY2hlZCBjaGFuZ2VkKSB7InN1cDEiIFsxIDIgM119IHN0b3JtLWlkKQpAQCAtMTIyLDcgKzEzMSw3IEBACiAKIChkZWZ0ZXN0IHRlc3QtbXVsdGlwbGUtYWN0aXZlLXN0b3Jtcy1tdWx0aXBsZS1zdXBlcnZpc29ycwogICAod2l0aC1zaW11bGF0ZWQtdGltZS1sb2NhbC1jbHVzdGVyIFtjbHVzdGVyIDpzdXBlcnZpc29ycyAwCi0gICAgOmRhZW1vbi1jb25mIHtOSU1CVVMtUkVBU1NJR04gZmFsc2UKKyAgICA6ZGFlbW9uLWNvbmYge05JTUJVUy1ETy1OT1QtUkVBU1NJR04gdHJ1ZQogICAgICAgICAgICAgICAgICAgU1VQRVJWSVNPUi1XT1JLRVItU1RBUlQtVElNRU9VVC1TRUNTIDUKICAgICAgICAgICAgICAgICAgIFNVUEVSVklTT1ItV09SS0VSLVRJTUVPVVQtU0VDUyAxNQogICAgICAgICAgICAgICAgICAgU1VQRVJWSVNPUi1NT05JVE9SLUZSRVFVRU5DWS1TRUNTIDN9XQpAQCAtMTM2LDQ0ICsxNDUsNTUgQEAKICAgICAgIChiaW5kIHN1cDEgKGFkZC1zdXBlcnZpc29yIGNsdXN0ZXIgOmlkICJzdXAxIiA6cG9ydHMgWzEgMiAzIDRdKSkKICAgICAgIChiaW5kIHN1cDIgKGFkZC1zdXBlcnZpc29yIGNsdXN0ZXIgOmlkICJzdXAyIiA6cG9ydHMgWzEgMl0pKQogICAgICAgKGJpbmQgY2hhbmdlZCAoY2FwdHVyZS1jaGFuZ2VkLXdvcmtlcnMKLSAgICAgICAgICAgICAgICAgICAgICAgIChzdWJtaXQtbW9ja2VkLWFzc2lnbm1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKDpuaW1idXMgY2x1c3RlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3QiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHtUT1BPTE9HWS1XT1JLRVJTIDMgVE9QT0xPR1ktTUVTU0FHRS1USU1FT1VULVNFQ1MgNDB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHRvcG9sb2d5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHsxICIxIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAiMSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgIjEiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA0ICIxIn0KLSAgICAgICAgICAgICAgICAgICAgICAgICAge1sxIDFdIFsic3VwMSIgMV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFsyIDJdIFsic3VwMSIgMl0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFszIDNdIFsic3VwMiIgMV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFs0IDRdIFsic3VwMiIgMV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCi0gICAgICAgICAgICAgICAgICAgICAgICAoYWR2YW5jZS1jbHVzdGVyLXRpbWUgY2x1c3RlciAyKQotICAgICAgICAgICAgICAgICAgICAgICAgKGhlYXJ0YmVhdC13b3JrZXJzIGNsdXN0ZXIgInN1cDEiIFsxIDJdKQotICAgICAgICAgICAgICAgICAgICAgICAgKGhlYXJ0YmVhdC13b3JrZXJzIGNsdXN0ZXIgInN1cDIiIFsxXSkKLSAgICAgICAgICAgICAgICAgICAgICAgICkpCisgICAgICAgICAgICAgICAgICAgICAgKHN1Ym1pdC1tb2NrZWQtYXNzaWdubWVudAorICAgICAgICAgICAgICAgICAgICAgICAgKDpuaW1idXMgY2x1c3RlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICg6c3Rvcm0tY2x1c3Rlci1zdGF0ZSBjbHVzdGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgInRlc3QiCisgICAgICAgICAgICAgICAgICAgICAgICB7VE9QT0xPR1ktV09SS0VSUyAzIFRPUE9MT0dZLU1FU1NBR0UtVElNRU9VVC1TRUNTIDQwfQorICAgICAgICAgICAgICAgICAgICAgICAgdG9wb2xvZ3kKKyAgICAgICAgICAgICAgICAgICAgICAgIHsxICIxIgorICAgICAgICAgICAgICAgICAgICAgICAgIDIgIjEiCisgICAgICAgICAgICAgICAgICAgICAgICAgMyAiMSIKKyAgICAgICAgICAgICAgICAgICAgICAgICA0ICIxIn0KKyAgICAgICAgICAgICAgICAgICAgICAgIHtbMSAxXSBbInN1cDEiIDFdCisgICAgICAgICAgICAgICAgICAgICAgICAgWzIgMl0gWyJzdXAxIiAyXQorICAgICAgICAgICAgICAgICAgICAgICAgIFszIDNdIFsic3VwMiIgMV0KKyAgICAgICAgICAgICAgICAgICAgICAgICBbNCA0XSBbInN1cDIiIDFdfQorICAgICAgICAgICAgICAgICAgICAgICAge1sic3VwMSIgMV0gWzAuMCAwLjAgMC4wXQorICAgICAgICAgICAgICAgICAgICAgICAgIFsic3VwMSIgMl0gWzAuMCAwLjAgMC4wXQorICAgICAgICAgICAgICAgICAgICAgICAgIFsic3VwMiIgMV0gWzAuMCAwLjAgMC4wXQorICAgICAgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAgICAgOzsgSW5zdGVhZCBvZiBzbGVlcGluZyB1bnRpbCB0b3BvbG9neSBpcyBzY2hlZHVsZWQsIHJlYmFsYW5jZSB0b3BvbG9neSBzbyBtay1hc3NpZ25tZW50cyBpcyBjYWxsZWQuCisgICAgICAgICAgICAgICAgICAgICAgKC5yZWJhbGFuY2UgKDpuaW1idXMgY2x1c3RlcikgInRlc3QiIChkb3RvIChSZWJhbGFuY2VPcHRpb25zLikgKC5zZXRfd2FpdF9zZWNzIDApKSkKKyAgICAgICAgICAgICAgICAgICAgICAoYWR2YW5jZS1jbHVzdGVyLXRpbWUgY2x1c3RlciAyKQorICAgICAgICAgICAgICAgICAgICAgIChoZWFydGJlYXQtd29ya2VycyBjbHVzdGVyICJzdXAxIiBbMSAyXSkKKyAgICAgICAgICAgICAgICAgICAgICAoaGVhcnRiZWF0LXdvcmtlcnMgY2x1c3RlciAic3VwMiIgWzFdKQorICAgICAgICAgICAgICAgICAgICAgICkpCiAgICAgICAoYmluZCBzdG9ybS1pZCAoZ2V0LXN0b3JtLWlkICg6c3Rvcm0tY2x1c3Rlci1zdGF0ZSBjbHVzdGVyKSAidGVzdCIpKQogICAgICAgKGlzIChlbXB0eT8gKDpzaHV0ZG93biBjaGFuZ2VkKSkpCiAgICAgICAodmFsaWRhdGUtbGF1bmNoZWQtb25jZSAoOmxhdW5jaGVkIGNoYW5nZWQpIHsic3VwMSIgWzEgMl0gInN1cDIiIFsxXX0gc3Rvcm0taWQpCiAgICAgICAoYmluZCBjaGFuZ2VkIChjYXB0dXJlLWNoYW5nZWQtd29ya2VycwotICAgICAgICAgICAgICAgICAgICAgICAgKHN1Ym1pdC1tb2NrZWQtYXNzaWdubWVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAoOm5pbWJ1cyBjbHVzdGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAidGVzdDIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHtUT1BPTE9HWS1XT1JLRVJTIDJ9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHRvcG9sb2d5MgotICAgICAgICAgICAgICAgICAgICAgICAgICB7MSAiMSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgIjEiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAzICIxIn0KLSAgICAgICAgICAgICAgICAgICAgICAgICAge1sxIDFdIFsic3VwMSIgM10KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFsyIDJdIFsic3VwMSIgM10KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFszIDNdIFsic3VwMiIgMl0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCi0gICAgICAgICAgICAgICAgICAgICAgICAoYWR2YW5jZS1jbHVzdGVyLXRpbWUgY2x1c3RlciAyKQotICAgICAgICAgICAgICAgICAgICAgICAgKGhlYXJ0YmVhdC13b3JrZXJzIGNsdXN0ZXIgInN1cDEiIFszXSkKLSAgICAgICAgICAgICAgICAgICAgICAgIChoZWFydGJlYXQtd29ya2VycyBjbHVzdGVyICJzdXAyIiBbMl0pCi0gICAgICAgICAgICAgICAgICAgICAgICApKQorICAgICAgICAgICAgICAgICAgICAgIChzdWJtaXQtbW9ja2VkLWFzc2lnbm1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICg6bmltYnVzIGNsdXN0ZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAoOnN0b3JtLWNsdXN0ZXItc3RhdGUgY2x1c3RlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICJ0ZXN0MiIKKyAgICAgICAgICAgICAgICAgICAgICAgIHtUT1BPTE9HWS1XT1JLRVJTIDJ9CisgICAgICAgICAgICAgICAgICAgICAgICB0b3BvbG9neTIKKyAgICAgICAgICAgICAgICAgICAgICAgIHsxICIxIgorICAgICAgICAgICAgICAgICAgICAgICAgIDIgIjEiCisgICAgICAgICAgICAgICAgICAgICAgICAgMyAiMSJ9CisgICAgICAgICAgICAgICAgICAgICAgICB7WzEgMV0gWyJzdXAxIiAzXQorICAgICAgICAgICAgICAgICAgICAgICAgIFsyIDJdIFsic3VwMSIgM10KKyAgICAgICAgICAgICAgICAgICAgICAgICBbMyAzXSBbInN1cDIiIDJdfQorICAgICAgICAgICAgICAgICAgICAgICAge1sic3VwMSIgM10gWzAuMCAwLjAgMC4wXQorICAgICAgICAgICAgICAgICAgICAgICAgIFsic3VwMiIgMl0gWzAuMCAwLjAgMC4wXQorICAgICAgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAgICAgOzsgSW5zdGVhZCBvZiBzbGVlcGluZyB1bnRpbCB0b3BvbG9neSBpcyBzY2hlZHVsZWQsIHJlYmFsYW5jZSB0b3BvbG9neSBzbyBtay1hc3NpZ25tZW50cyBpcyBjYWxsZWQuCisgICAgICAgICAgICAgICAgICAgICAgKC5yZWJhbGFuY2UgKDpuaW1idXMgY2x1c3RlcikgInRlc3QyIiAoZG90byAoUmViYWxhbmNlT3B0aW9ucy4pICguc2V0X3dhaXRfc2VjcyAwKSkpCisgICAgICAgICAgICAgICAgICAgICAgKGFkdmFuY2UtY2x1c3Rlci10aW1lIGNsdXN0ZXIgMikKKyAgICAgICAgICAgICAgICAgICAgICAoaGVhcnRiZWF0LXdvcmtlcnMgY2x1c3RlciAic3VwMSIgWzNdKQorICAgICAgICAgICAgICAgICAgICAgIChoZWFydGJlYXQtd29ya2VycyBjbHVzdGVyICJzdXAyIiBbMl0pCisgICAgICAgICAgICAgICAgICAgICAgKSkKICAgICAgIChiaW5kIHN0b3JtLWlkMiAoZ2V0LXN0b3JtLWlkICg6c3Rvcm0tY2x1c3Rlci1zdGF0ZSBjbHVzdGVyKSAidGVzdDIiKSkKICAgICAgIChpcyAoZW1wdHk/ICg6c2h1dGRvd24gY2hhbmdlZCkpKQogICAgICAgKHZhbGlkYXRlLWxhdW5jaGVkLW9uY2UgKDpsYXVuY2hlZCBjaGFuZ2VkKSB7InN1cDEiIFszXSAic3VwMiIgWzJdfSBzdG9ybS1pZDIpCkBAIC0yNTEsMzAgKzI3MSwzNSBAQAogICAgIChsZXQgW21vY2stcG9ydCAiNDIiCiAgICAgICAgICAgbW9jay1zdG9ybS1pZCAiZmFrZS1zdG9ybS1pZCIKICAgICAgICAgICBtb2NrLXdvcmtlci1pZCAiZmFrZS13b3JrZXItaWQiCisgICAgICAgICAgbW9jay1tZW0tb25oZWFwIDUxMgogICAgICAgICAgIG1vY2stY3AgKHN0ciBmaWxlLXBhdGgtc2VwYXJhdG9yICJiYXNlIiBjbGFzcy1wYXRoLXNlcGFyYXRvciBmaWxlLXBhdGgtc2VwYXJhdG9yICJzdG9ybWphci5qYXIiKQogICAgICAgICAgIG1vY2stc2Vuc2l0aXZpdHkgIlMzIgogICAgICAgICAgIG1vY2stY3AgIi9iYXNlOi9zdG9ybWphci5qYXIiCiAgICAgICAgICAgZXhwLWFyZ3MtZm4gKGZuIFtvcHRzIHRvcG8tb3B0cyBjbGFzc3BhdGhdCi0gICAgICAgICAgICAgICAgICAgICAgIChjb25jYXQgWyhzdXBlcnZpc29yL2phdmEtY21kKSAiLWNwIiBjbGFzc3BhdGggCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0ciAiLURsb2dmaWxlLm5hbWU9IiBtb2NrLXN0b3JtLWlkICItd29ya2VyLSIgbW9jay1wb3J0ICIubG9nIikKKyAgICAgICAgICAgICAgICAgICAgICAgKGNvbmNhdCBbKHN1cGVydmlzb3IvamF2YS1jbWQpICItY3AiIGNsYXNzcGF0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHIgIi1EbG9nZmlsZS5uYW1lPSIgIndvcmtlci5sb2ciKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItRHN0b3JtLmhvbWU9IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RyICItRHN0b3JtLmlkPSIgbW9jay1zdG9ybS1pZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0ciAiLUR3b3JrZXIuaWQ9IiBtb2NrLXdvcmtlci1pZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0ciAiLUR3b3JrZXIucG9ydD0iIG1vY2stcG9ydCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RyICItRHdvcmtlcnMuYXJ0aWZhY3RzPSIgIi90bXAvd29ya2Vycy1hcnRpZmFjdHMiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHIgIi1Ec3Rvcm0uaWQ9IiBtb2NrLXN0b3JtLWlkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHIgIi1Ed29ya2VyLmlkPSIgbW9jay13b3JrZXItaWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0ciAiLUR3b3JrZXIucG9ydD0iIG1vY2stcG9ydCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLURzdG9ybS5sb2cuZGlyPS9sb2dzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItRGxvZzRqLmNvbmZpZ3VyYXRpb25GaWxlPS9sb2c0ajIvd29ya2VyLnhtbCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLURMb2c0akNvbnRleHRTZWxlY3Rvcj1vcmcuYXBhY2hlLmxvZ2dpbmcubG9nNGouY29yZS5zZWxlY3Rvci5CYXNpY0NvbnRleHRTZWxlY3RvciIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFja3R5cGUuc3Rvcm0uTG9nV3JpdGVyIl0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKHN1cGVydmlzb3IvamF2YS1jbWQpICItc2VydmVyIl0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wby1vcHRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyItRGphdmEubGlicmFyeS5wYXRoPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0ciAiLURsb2dmaWxlLm5hbWU9IiBtb2NrLXN0b3JtLWlkICItd29ya2VyLSIgbW9jay1wb3J0ICIubG9nIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0ciAiLURsb2dmaWxlLm5hbWU9IiAid29ya2VyLmxvZyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICItRHN0b3JtLmhvbWU9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLUR3b3JrZXJzLmFydGlmYWN0cz0vdG1wL3dvcmtlcnMtYXJ0aWZhY3RzIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLURzdG9ybS5jb25mLmZpbGU9IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLURzdG9ybS5vcHRpb25zPSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0ciAiLURzdG9ybS5sb2cuZGlyPSIgZmlsZS1wYXRoLXNlcGFyYXRvciAibG9ncyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHIgIi1EbG9nZ2luZy5zZW5zaXRpdml0eT0iIG1vY2stc2Vuc2l0aXZpdHkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHIgIi1EbG9nNGouY29uZmlndXJhdGlvbkZpbGU9IiBmaWxlLXBhdGgtc2VwYXJhdG9yICJsb2c0ajIiIGZpbGUtcGF0aC1zZXBhcmF0b3IgIndvcmtlci54bWwiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLURMb2c0akNvbnRleHRTZWxlY3Rvcj1vcmcuYXBhY2hlLmxvZ2dpbmcubG9nNGouY29yZS5zZWxlY3Rvci5CYXNpY0NvbnRleHRTZWxlY3RvciIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0ciAiLURzdG9ybS5pZD0iIG1vY2stc3Rvcm0taWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHIgIi1Ed29ya2VyLmlkPSIgbW9jay13b3JrZXItaWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHIgIi1Ed29ya2VyLnBvcnQ9IiBtb2NrLXBvcnQpCkBAIC0yOTgsMTEgKzMyMywxMyBAQAogICAgICAgICAgICAgICAgICAgICAgbGF1bmNoLXByb2Nlc3MgbmlsCiAgICAgICAgICAgICAgICAgICAgICBzZXQtd29ya2VyLXVzZXIhIG5pbAogICAgICAgICAgICAgICAgICAgICAgc3VwZXJ2aXNvci9qbHAgbmlsCisgICAgICAgICAgICAgICAgICAgICB3b3JrZXItYXJ0aWZhY3RzLXJvb3QgIi90bXAvd29ya2Vycy1hcnRpZmFjdHMiCiAgICAgICAgICAgICAgICAgICAgICBzdXBlcnZpc29yL3dyaXRlLWxvZy1tZXRhZGF0YSEgbmlsXQogICAgICAgICAgICAgKHN1cGVydmlzb3IvbGF1bmNoLXdvcmtlciBtb2NrLXN1cGVydmlzb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9jay1zdG9ybS1pZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2NrLXBvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9jay13b3JrZXItaWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vY2std29ya2VyLWlkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vY2stbWVtLW9uaGVhcCkKICAgICAgICAgICAgICh2ZXJpZnktZmlyc3QtY2FsbC1hcmdzLWZvci1pbmRpY2VzIGxhdW5jaC1wcm9jZXNzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMF0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cC1hcmdzKSkpKQpAQCAtMzE5LDExICszNDYsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgIGxhdW5jaC1wcm9jZXNzIG5pbAogICAgICAgICAgICAgICAgICAgICAgc2V0LXdvcmtlci11c2VyISBuaWwKICAgICAgICAgICAgICAgICAgICAgIHN1cGVydmlzb3IvamxwIG5pbAorICAgICAgICAgICAgICAgICAgICAgd29ya2VyLWFydGlmYWN0cy1yb290ICIvdG1wL3dvcmtlcnMtYXJ0aWZhY3RzIgogICAgICAgICAgICAgICAgICAgICAgc3VwZXJ2aXNvci93cml0ZS1sb2ctbWV0YWRhdGEhIG5pbF0KICAgICAgICAgICAgIChzdXBlcnZpc29yL2xhdW5jaC13b3JrZXIgbW9jay1zdXBlcnZpc29yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vY2stc3Rvcm0taWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9jay1wb3J0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vY2std29ya2VyLWlkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2NrLXdvcmtlci1pZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2NrLW1lbS1vbmhlYXApCiAgICAgICAgICAgICAodmVyaWZ5LWZpcnN0LWNhbGwtYXJncy1mb3ItaW5kaWNlcyBsYXVuY2gtcHJvY2VzcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzBdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHAtYXJncykpKSkKQEAgLTMzNCw2ICszNjMsNyBAQAogICAgICAgICAgIChzdHViYmluZyBbcmVhZC1zdXBlcnZpc29yLXN0b3JtLWNvbmYge1RPUE9MT0dZLUNMQVNTUEFUSCB0b3BvLWNwfQogICAgICAgICAgICAgICAgICAgICAgc3VwZXJ2aXNvci1zdG9ybWRpc3Qtcm9vdCBuaWwKICAgICAgICAgICAgICAgICAgICAgIHN1cGVydmlzb3IvamxwIG5pbAorICAgICAgICAgICAgICAgICAgICAgd29ya2VyLWFydGlmYWN0cy1yb290ICIvdG1wL3dvcmtlcnMtYXJ0aWZhY3RzIgogICAgICAgICAgICAgICAgICAgICAgc2V0LXdvcmtlci11c2VyISBuaWwKICAgICAgICAgICAgICAgICAgICAgIHN1cGVydmlzb3Ivd3JpdGUtbG9nLW1ldGFkYXRhISBuaWwKICAgICAgICAgICAgICAgICAgICAgIGxhdW5jaC1wcm9jZXNzIG5pbApAQCAtMzQxLDcgKzM3MSw4IEBACiAgICAgICAgICAgICAgICAgICAgIChzdXBlcnZpc29yL2xhdW5jaC13b3JrZXIgbW9jay1zdXBlcnZpc29yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9jay1zdG9ybS1pZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vY2stcG9ydAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vY2std29ya2VyLWlkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vY2std29ya2VyLWlkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9jay1tZW0tb25oZWFwKQogICAgICAgICAgICAgICAgICAgICAodmVyaWZ5LWZpcnN0LWNhbGwtYXJncy1mb3ItaW5kaWNlcyBsYXVuY2gtcHJvY2VzcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMF0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwLWFyZ3MpKSkpCkBAIC0zNTMsNiArMzg0LDcgQEAKICAgICAgICAgICAoc3R1YmJpbmcgW3JlYWQtc3VwZXJ2aXNvci1zdG9ybS1jb25mIHtUT1BPTE9HWS1FTlZJUk9OTUVOVCB0b3BvLWVudn0KICAgICAgICAgICAgICAgICAgICAgIHN1cGVydmlzb3Itc3Rvcm1kaXN0LXJvb3QgbmlsCiAgICAgICAgICAgICAgICAgICAgICBzdXBlcnZpc29yL2pscCBuaWwKKyAgICAgICAgICAgICAgICAgICAgIHdvcmtlci1hcnRpZmFjdHMtcm9vdCAiL3RtcC93b3JrZXJzLWFydGlmYWN0cyIKICAgICAgICAgICAgICAgICAgICAgIGxhdW5jaC1wcm9jZXNzIG5pbAogICAgICAgICAgICAgICAgICAgICAgc2V0LXdvcmtlci11c2VyISBuaWwKICAgICAgICAgICAgICAgICAgICAgIHN1cGVydmlzb3Ivd3JpdGUtbG9nLW1ldGFkYXRhISBuaWwKQEAgLTM2MCwyNSArMzkyLDIyIEBACiAgICAgICAgICAgICAgICAgICAgIChzdXBlcnZpc29yL2xhdW5jaC13b3JrZXIgbW9jay1zdXBlcnZpc29yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9jay1zdG9ybS1pZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vY2stcG9ydAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vY2std29ya2VyLWlkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vY2std29ya2VyLWlkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9jay1tZW0tb25oZWFwKQogICAgICAgICAgICAgICAgICAgICAodmVyaWZ5LWZpcnN0LWNhbGwtYXJncy1mb3ItaW5kaWNlcyBsYXVuY2gtcHJvY2VzcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMl0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVsbC1lbnYpKSkpKSkpCiAKLShkZWZuIHJtLXIgW2ZdCi0gIChpZiAoLmlzRGlyZWN0b3J5IGYpCi0gICAgKGZvciBbc3ViICgubGlzdEZpbGVzIGYpXSAocm0tciBzdWIpKQotICAgICguZGVsZXRlIGYpCi0gICkpCi0KIChkZWZ0ZXN0IHRlc3Qtd29ya2VyLWxhdW5jaC1jb21tYW5kLXJ1bi1hcy11c2VyCiAgICh0ZXN0aW5nICIqLndvcmtlci5jaGlsZG9wdHMgY29uZmlndXJhdGlvbiIKICAgICAobGV0IFttb2NrLXBvcnQgIjQyIgogICAgICAgICAgIG1vY2stc3Rvcm0taWQgImZha2Utc3Rvcm0taWQiCiAgICAgICAgICAgbW9jay13b3JrZXItaWQgImZha2Utd29ya2VyLWlkIgorICAgICAgICAgIG1vY2stbWVtLW9uaGVhcCA1MTIKICAgICAgICAgICBtb2NrLXNlbnNpdGl2aXR5ICJTMyIKICAgICAgICAgICBtb2NrLWNwICJtb2NrLWNsYXNzcGF0aCdxdW90ZS1vbi1wdXJwb3NlIgotICAgICAgICAgIHN0b3JtLWxvY2FsIChzdHIgIi90bXAvIiAoVVVJRC9yYW5kb21VVUlEKSkKKyAgICAgICAgICBhdHRycyAobWFrZS1hcnJheSBGaWxlQXR0cmlidXRlIDApCisgICAgICAgICAgc3Rvcm0tbG9jYWwgKC5nZXRDYW5vbmljYWxQYXRoICgudG9GaWxlIChGaWxlcy9jcmVhdGVUZW1wRGlyZWN0b3J5ICJzdG9ybS1sb2NhbCIgYXR0cnMpKSkKICAgICAgICAgICB3b3JrZXItc2NyaXB0IChzdHIgc3Rvcm0tbG9jYWwgIi93b3JrZXJzLyIgbW9jay13b3JrZXItaWQgIi9zdG9ybS13b3JrZXItc2NyaXB0LnNoIikKICAgICAgICAgICBleHAtbGF1bmNoIFsiL2Jpbi93b3JrZXItbGF1bmNoZXIiCiAgICAgICAgICAgICAgICAgICAgICAgIm1lIgpAQCAtMzg2LDkyICs0MTUsMTAwIEBACiAgICAgICAgICAgICAgICAgICAgICAgKHN0ciBzdG9ybS1sb2NhbCAiL3dvcmtlcnMvIiBtb2NrLXdvcmtlci1pZCkKICAgICAgICAgICAgICAgICAgICAgICB3b3JrZXItc2NyaXB0XQogICAgICAgICAgIGV4cC1zY3JpcHQtZm4gKGZuIFtvcHRzIHRvcG8tb3B0c10KLSAgICAgICAgICAgICAgICAgICAgICAgKHN0ciAiIyEvYmluL2Jhc2hcbidleHBvcnQnICdMRF9MSUJSQVJZX1BBVEg9JztcblxuZXhlYyAnamF2YSciCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgJy1jcCcgJ21vY2stY2xhc3NwYXRoJ1wiJ1wiJ3F1b3RlLW9uLXB1cnBvc2UnIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICctRGxvZ2ZpbGUubmFtZT0iIG1vY2stc3Rvcm0taWQgIi13b3JrZXItIiBtb2NrLXBvcnQgIi5sb2cnIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICctRHN0b3JtLmhvbWU9JyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAnLURzdG9ybS5pZD0iIG1vY2stc3Rvcm0taWQgIiciCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgJy1Ed29ya2VyLmlkPSIgbW9jay13b3JrZXItaWQgIiciCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgJy1Ed29ya2VyLnBvcnQ9IiBtb2NrLXBvcnQgIiciCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgJy1Ec3Rvcm0ubG9nLmRpcj0vbG9ncyciCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgJy1EbG9nNGouY29uZmlndXJhdGlvbkZpbGU9L2xvZzRqMi93b3JrZXIueG1sJyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAnYmFja3R5cGUuc3Rvcm0uTG9nV3JpdGVyJyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAnamF2YScgJy1zZXJ2ZXInIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICIgKHNoZWxsLWNtZCBvcHRzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICIgKHNoZWxsLWNtZCB0b3BvLW9wdHMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgJy1EamF2YS5saWJyYXJ5LnBhdGg9JyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAnLURsb2dmaWxlLm5hbWU9IiBtb2NrLXN0b3JtLWlkICItd29ya2VyLSIgbW9jay1wb3J0ICIubG9nJyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAnLURzdG9ybS5ob21lPSciCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgJy1Ec3Rvcm0uY29uZi5maWxlPSciCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgJy1Ec3Rvcm0ub3B0aW9ucz0nIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICctRHN0b3JtLmxvZy5kaXI9L2xvZ3MnIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICctRGxvZ2dpbmcuc2Vuc2l0aXZpdHk9IiBtb2NrLXNlbnNpdGl2aXR5ICInIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICctRGxvZzRqLmNvbmZpZ3VyYXRpb25GaWxlPS9sb2c0ajIvd29ya2VyLnhtbCciCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgJy1Ec3Rvcm0uaWQ9IiBtb2NrLXN0b3JtLWlkICInIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICctRHdvcmtlci5pZD0iIG1vY2std29ya2VyLWlkICInIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICctRHdvcmtlci5wb3J0PSIgbW9jay1wb3J0ICInIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICctY3AnICdtb2NrLWNsYXNzcGF0aCdcIidcIidxdW90ZS1vbi1wdXJwb3NlJyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAnYmFja3R5cGUuc3Rvcm0uZGFlbW9uLndvcmtlciciCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgJyIgbW9jay1zdG9ybS1pZCAiJyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAnIiBtb2NrLXBvcnQgIiciCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgJyIgbW9jay13b3JrZXItaWQgIic7IikpXQorICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RyICIjIS9iaW4vYmFzaFxuJ2V4cG9ydCcgJ0xEX0xJQlJBUllfUEFUSD0nO1xuXG5leGVjICdqYXZhJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICctY3AnICdtb2NrLWNsYXNzcGF0aCdcIidcIidxdW90ZS1vbi1wdXJwb3NlJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICctRGxvZ2ZpbGUubmFtZT0iICJ3b3JrZXIubG9nJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICctRHN0b3JtLmhvbWU9JyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICctRHdvcmtlcnMuYXJ0aWZhY3RzPSIgKHN0ciBzdG9ybS1sb2NhbCAiL3dvcmtlcnMtYXJ0aWZhY3RzJyIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAnLURzdG9ybS5pZD0iIG1vY2stc3Rvcm0taWQgIiciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAnLUR3b3JrZXIuaWQ9IiBtb2NrLXdvcmtlci1pZCAiJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICctRHdvcmtlci5wb3J0PSIgbW9jay1wb3J0ICInIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgJy1Ec3Rvcm0ubG9nLmRpcj0vbG9ncyciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAnLURsb2c0ai5jb25maWd1cmF0aW9uRmlsZT0vbG9nNGoyL3dvcmtlci54bWwnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgJy1ETG9nNGpDb250ZXh0U2VsZWN0b3I9b3JnLmFwYWNoZS5sb2dnaW5nLmxvZzRqLmNvcmUuc2VsZWN0b3IuQmFzaWNDb250ZXh0U2VsZWN0b3InIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgJ2JhY2t0eXBlLnN0b3JtLkxvZ1dyaXRlciciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAnamF2YScgJy1zZXJ2ZXInIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIiAoc2hlbGwtY21kIG9wdHMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAiIChzaGVsbC1jbWQgdG9wby1vcHRzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgJy1EamF2YS5saWJyYXJ5LnBhdGg9JyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICctRGxvZ2ZpbGUubmFtZT0iICJ3b3JrZXIubG9nJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICctRHN0b3JtLmhvbWU9JyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICctRHdvcmtlcnMuYXJ0aWZhY3RzPSIgKHN0ciBzdG9ybS1sb2NhbCAiL3dvcmtlcnMtYXJ0aWZhY3RzJyIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAnLURzdG9ybS5jb25mLmZpbGU9JyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICctRHN0b3JtLm9wdGlvbnM9JyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICctRHN0b3JtLmxvZy5kaXI9L2xvZ3MnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgJy1EbG9nZ2luZy5zZW5zaXRpdml0eT0iIG1vY2stc2Vuc2l0aXZpdHkgIiciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAnLURsb2c0ai5jb25maWd1cmF0aW9uRmlsZT0vbG9nNGoyL3dvcmtlci54bWwnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgJy1ETG9nNGpDb250ZXh0U2VsZWN0b3I9b3JnLmFwYWNoZS5sb2dnaW5nLmxvZzRqLmNvcmUuc2VsZWN0b3IuQmFzaWNDb250ZXh0U2VsZWN0b3InIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgJy1Ec3Rvcm0uaWQ9IiBtb2NrLXN0b3JtLWlkICInIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgJy1Ed29ya2VyLmlkPSIgbW9jay13b3JrZXItaWQgIiciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAnLUR3b3JrZXIucG9ydD0iIG1vY2stcG9ydCAiJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICctY3AnICdtb2NrLWNsYXNzcGF0aCdcIidcIidxdW90ZS1vbi1wdXJwb3NlJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICdiYWNrdHlwZS5zdG9ybS5kYWVtb24ud29ya2VyJyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICciIG1vY2stc3Rvcm0taWQgIiciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAnIiBtb2NrLXBvcnQgIiciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAnIiBtb2NrLXdvcmtlci1pZCAiJzsiKSldCisgICAgICAodHJ5CisgICAgICAgICh0ZXN0aW5nICJ0ZXN0aW5nICoud29ya2VyLmNoaWxkb3B0cyBhcyBzdHJpbmdzIHdpdGggZXh0cmEgc3BhY2VzIgorICAgICAgICAgIChsZXQgW3N0cmluZy1vcHRzICItRGZvbz1iYXIgIC1YbXgxMDI0bSIKKyAgICAgICAgICAgICAgICB0b3BvLXN0cmluZy1vcHRzICItRGthdT1hdXggICAtWG14MjA0OG0iCisgICAgICAgICAgICAgICAgZXhwLXNjcmlwdCAoZXhwLXNjcmlwdC1mbiBbIi1EZm9vPWJhciIgIi1YbXgxMDI0bSJdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIi1Ea2F1PWF1eCIgIi1YbXgyMDQ4bSJdKQorICAgICAgICAgICAgICAgIF8gKC5ta2RpcnMgKGlvL2ZpbGUgc3Rvcm0tbG9jYWwgIndvcmtlcnMiIG1vY2std29ya2VyLWlkKSkKKyAgICAgICAgICAgICAgICBtb2NrLXN1cGVydmlzb3Igezpjb25mIHtTVE9STS1DTFVTVEVSLU1PREUgOmRpc3RyaWJ1dGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RPUk0tTE9DQUwtRElSIHN0b3JtLWxvY2FsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1VQRVJWSVNPUi1SVU4tV09SS0VSLUFTLVVTRVIgdHJ1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdPUktFUi1DSElMRE9QVFMgc3RyaW5nLW9wdHN9fV0KKyAgICAgICAgICAgIChzdHViYmluZyBbcmVhZC1zdXBlcnZpc29yLXN0b3JtLWNvbmYge1RPUE9MT0dZLVdPUktFUi1DSElMRE9QVFMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcG8tc3RyaW5nLW9wdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRPUE9MT0dZLVNVQk1JVFRFUi1VU0VSICJtZSJ9CisgICAgICAgICAgICAgICAgICAgICAgIGFkZC10by1jbGFzc3BhdGggbW9jay1jcAorICAgICAgICAgICAgICAgICAgICAgICBzdXBlcnZpc29yLXN0b3JtZGlzdC1yb290IG5pbAorICAgICAgICAgICAgICAgICAgICAgICBsYXVuY2gtcHJvY2VzcyBuaWwKKyAgICAgICAgICAgICAgICAgICAgICAgc2V0LXdvcmtlci11c2VyISBuaWwKKyAgICAgICAgICAgICAgICAgICAgICAgc3VwZXJ2aXNvci9qYXZhLWNtZCAiamF2YSIKKyAgICAgICAgICAgICAgICAgICAgICAgc3VwZXJ2aXNvci9qbHAgbmlsCisgICAgICAgICAgICAgICAgICAgICAgIHN1cGVydmlzb3Ivd3JpdGUtbG9nLW1ldGFkYXRhISBuaWxdCisgICAgICAgICAgICAgICAgICAgICAgKHN1cGVydmlzb3IvbGF1bmNoLXdvcmtlciBtb2NrLXN1cGVydmlzb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vY2stc3Rvcm0taWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vY2stcG9ydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9jay13b3JrZXItaWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vY2stbWVtLW9uaGVhcCkKKyAgICAgICAgICAgICAgICAgICAgICAodmVyaWZ5LWZpcnN0LWNhbGwtYXJncy1mb3ItaW5kaWNlcyBsYXVuY2gtcHJvY2VzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFswXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cC1sYXVuY2gpKQorICAgICAgICAgICAgKGlzICg9IChzbHVycCB3b3JrZXItc2NyaXB0KSBleHAtc2NyaXB0KSkpKQorICAgICAgICAoZmluYWxseSAocm1yIHN0b3JtLWxvY2FsKSkpCiAgICAgICAoLm1rZGlycyAoaW8vZmlsZSBzdG9ybS1sb2NhbCAid29ya2VycyIgbW9jay13b3JrZXItaWQpKQogICAgICAgKHRyeQotICAgICAgKHRlc3RpbmcgInRlc3RpbmcgKi53b3JrZXIuY2hpbGRvcHRzIGFzIHN0cmluZ3Mgd2l0aCBleHRyYSBzcGFjZXMiCi0gICAgICAgIChsZXQgW3N0cmluZy1vcHRzICItRGZvbz1iYXIgIC1YbXgxMDI0bSIKLSAgICAgICAgICAgICAgdG9wby1zdHJpbmctb3B0cyAiLURrYXU9YXV4ICAgLVhteDIwNDhtIgotICAgICAgICAgICAgICBleHAtc2NyaXB0IChleHAtc2NyaXB0LWZuIFsiLURmb289YmFyIiAiLVhteDEwMjRtIl0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsiLURrYXU9YXV4IiAiLVhteDIwNDhtIl0pCi0gICAgICAgICAgICAgIG1vY2stc3VwZXJ2aXNvciB7OmNvbmYge1NUT1JNLUNMVVNURVItTU9ERSA6ZGlzdHJpYnV0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RPUk0tTE9DQUwtRElSIHN0b3JtLWxvY2FsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVUEVSVklTT1ItUlVOLVdPUktFUi1BUy1VU0VSIHRydWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV09SS0VSLUNISUxET1BUUyBzdHJpbmctb3B0c319XQotICAgICAgICAgIChzdHViYmluZyBbcmVhZC1zdXBlcnZpc29yLXN0b3JtLWNvbmYge1RPUE9MT0dZLVdPUktFUi1DSElMRE9QVFMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BvLXN0cmluZy1vcHRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE9QT0xPR1ktU1VCTUlUVEVSLVVTRVIgIm1lIn0KLSAgICAgICAgICAgICAgICAgICAgIGFkZC10by1jbGFzc3BhdGggbW9jay1jcAotICAgICAgICAgICAgICAgICAgICAgc3VwZXJ2aXNvci1zdG9ybWRpc3Qtcm9vdCBuaWwKLSAgICAgICAgICAgICAgICAgICAgIGxhdW5jaC1wcm9jZXNzIG5pbAotICAgICAgICAgICAgICAgICAgICAgc2V0LXdvcmtlci11c2VyISBuaWwKLSAgICAgICAgICAgICAgICAgICAgIHN1cGVydmlzb3IvamF2YS1jbWQgImphdmEiCi0gICAgICAgICAgICAgICAgICAgICBzdXBlcnZpc29yL2pscCBuaWwKLSAgICAgICAgICAgICAgICAgICAgIHN1cGVydmlzb3Ivd3JpdGUtbG9nLW1ldGFkYXRhISBuaWxdCi0gICAgICAgICAgICAoc3VwZXJ2aXNvci9sYXVuY2gtd29ya2VyIG1vY2stc3VwZXJ2aXNvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2NrLXN0b3JtLWlkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vY2stcG9ydAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2NrLXdvcmtlci1pZCkKLSAgICAgICAgICAgICh2ZXJpZnktZmlyc3QtY2FsbC1hcmdzLWZvci1pbmRpY2VzIGxhdW5jaC1wcm9jZXNzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbMF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cC1sYXVuY2gpKQotICAgICAgICAgIChpcyAoPSAoc2x1cnAgd29ya2VyLXNjcmlwdCkgZXhwLXNjcmlwdCkpKSkKLSAgICAgICh0ZXN0aW5nICJ0ZXN0aW5nICoud29ya2VyLmNoaWxkb3B0cyBhcyBsaXN0IG9mIHN0cmluZ3MsIHdpdGggc3BhY2VzIGluIHZhbHVlcyIKLSAgICAgICAgKGxldCBbbGlzdC1vcHRzICcoIi1Eb3B0MT0ndGhpcyBoYXMgYSBzcGFjZSBpbiBpdCciICItWG14MTAyNG0iKQotICAgICAgICAgICAgICB0b3BvLWxpc3Qtb3B0cyAnKCItRG9wdDI9J3ZhbCB3aXRoIHNwYWNlcyciICItWG14MjA0OG0iKQotICAgICAgICAgICAgICBleHAtc2NyaXB0IChleHAtc2NyaXB0LWZuIGxpc3Qtb3B0cyB0b3BvLWxpc3Qtb3B0cykKLSAgICAgICAgICAgICAgbW9jay1zdXBlcnZpc29yIHs6Y29uZiB7U1RPUk0tQ0xVU1RFUi1NT0RFIDpkaXN0cmlidXRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTVE9STS1MT0NBTC1ESVIgc3Rvcm0tbG9jYWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1VQRVJWSVNPUi1SVU4tV09SS0VSLUFTLVVTRVIgdHJ1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXT1JLRVItQ0hJTERPUFRTIGxpc3Qtb3B0c319XQotICAgICAgICAgIChzdHViYmluZyBbcmVhZC1zdXBlcnZpc29yLXN0b3JtLWNvbmYge1RPUE9MT0dZLVdPUktFUi1DSElMRE9QVFMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BvLWxpc3Qtb3B0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRPUE9MT0dZLVNVQk1JVFRFUi1VU0VSICJtZSJ9Ci0gICAgICAgICAgICAgICAgICAgICBhZGQtdG8tY2xhc3NwYXRoIG1vY2stY3AKLSAgICAgICAgICAgICAgICAgICAgIHN1cGVydmlzb3Itc3Rvcm1kaXN0LXJvb3QgbmlsCi0gICAgICAgICAgICAgICAgICAgICBsYXVuY2gtcHJvY2VzcyBuaWwKLSAgICAgICAgICAgICAgICAgICAgIHNldC13b3JrZXItdXNlciEgbmlsCi0gICAgICAgICAgICAgICAgICAgICBzdXBlcnZpc29yL2phdmEtY21kICJqYXZhIgotICAgICAgICAgICAgICAgICAgICAgc3VwZXJ2aXNvci9qbHAgbmlsCi0gICAgICAgICAgICAgICAgICAgICBzdXBlcnZpc29yL3dyaXRlLWxvZy1tZXRhZGF0YSEgbmlsXQotICAgICAgICAgICAgKHN1cGVydmlzb3IvbGF1bmNoLXdvcmtlciBtb2NrLXN1cGVydmlzb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9jay1zdG9ybS1pZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2NrLXBvcnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9jay13b3JrZXItaWQpCi0gICAgICAgICAgICAodmVyaWZ5LWZpcnN0LWNhbGwtYXJncy1mb3ItaW5kaWNlcyBsYXVuY2gtcHJvY2VzcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzBdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHAtbGF1bmNoKSkKLSAgICAgICAgICAoaXMgKD0gKHNsdXJwIHdvcmtlci1zY3JpcHQpIGV4cC1zY3JpcHQpKSkpCi0oZmluYWxseSAocm0tciAoaW8vZmlsZSBzdG9ybS1sb2NhbCkpKQotKSkpKQorICAgICAgICAodGVzdGluZyAidGVzdGluZyAqLndvcmtlci5jaGlsZG9wdHMgYXMgbGlzdCBvZiBzdHJpbmdzLCB3aXRoIHNwYWNlcyBpbiB2YWx1ZXMiCisgICAgICAgICAgKGxldCBbbGlzdC1vcHRzICcoIi1Eb3B0MT0ndGhpcyBoYXMgYSBzcGFjZSBpbiBpdCciICItWG14MTAyNG0iKQorICAgICAgICAgICAgICAgIHRvcG8tbGlzdC1vcHRzICcoIi1Eb3B0Mj0ndmFsIHdpdGggc3BhY2VzJyIgIi1YbXgyMDQ4bSIpCisgICAgICAgICAgICAgICAgZXhwLXNjcmlwdCAoZXhwLXNjcmlwdC1mbiBsaXN0LW9wdHMgdG9wby1saXN0LW9wdHMpCisgICAgICAgICAgICAgICAgbW9jay1zdXBlcnZpc29yIHs6Y29uZiB7U1RPUk0tQ0xVU1RFUi1NT0RFIDpkaXN0cmlidXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUT1JNLUxPQ0FMLURJUiBzdG9ybS1sb2NhbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVUEVSVklTT1ItUlVOLVdPUktFUi1BUy1VU0VSIHRydWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXT1JLRVItQ0hJTERPUFRTIGxpc3Qtb3B0c319XQorICAgICAgICAgICAgKHN0dWJiaW5nIFtyZWFkLXN1cGVydmlzb3Itc3Rvcm0tY29uZiB7VE9QT0xPR1ktV09SS0VSLUNISUxET1BUUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wby1saXN0LW9wdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRPUE9MT0dZLVNVQk1JVFRFUi1VU0VSICJtZSJ9CisgICAgICAgICAgICAgICAgICAgICAgIGFkZC10by1jbGFzc3BhdGggbW9jay1jcAorICAgICAgICAgICAgICAgICAgICAgICBzdXBlcnZpc29yLXN0b3JtZGlzdC1yb290IG5pbAorICAgICAgICAgICAgICAgICAgICAgICBsYXVuY2gtcHJvY2VzcyBuaWwKKyAgICAgICAgICAgICAgICAgICAgICAgc2V0LXdvcmtlci11c2VyISBuaWwKKyAgICAgICAgICAgICAgICAgICAgICAgc3VwZXJ2aXNvci9qYXZhLWNtZCAiamF2YSIKKyAgICAgICAgICAgICAgICAgICAgICAgc3VwZXJ2aXNvci9qbHAgbmlsCisgICAgICAgICAgICAgICAgICAgICAgIHN1cGVydmlzb3Ivd3JpdGUtbG9nLW1ldGFkYXRhISBuaWxdCisgICAgICAgICAgICAgICAgICAgICAgKHN1cGVydmlzb3IvbGF1bmNoLXdvcmtlciBtb2NrLXN1cGVydmlzb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vY2stc3Rvcm0taWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vY2stcG9ydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9jay13b3JrZXItaWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vY2stbWVtLW9uaGVhcCkKKyAgICAgICAgICAgICAgICAgICAgICAodmVyaWZ5LWZpcnN0LWNhbGwtYXJncy1mb3ItaW5kaWNlcyBsYXVuY2gtcHJvY2VzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFswXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cC1sYXVuY2gpKQorICAgICAgICAgICAgKGlzICg9IChzbHVycCB3b3JrZXItc2NyaXB0KSBleHAtc2NyaXB0KSkpKQorICAgICAgICAoZmluYWxseSAocm1yIHN0b3JtLWxvY2FsKSkpKSkpCiAKIChkZWZ0ZXN0IHRlc3Qtd29ya2Vycy1nby1iYW5hbmFzCiAgIDs7IHRlc3QgdGhhdCBtdWx0aXBsZSB3b3JrZXJzIGFyZSBzdGFydGVkIGZvciBhIHBvcnQsIGFuZCB0ZXN0IHRoYXQKQEAgLTU1NCw5ICs1OTEsMTAgQEAKICAgICAobGV0IFt3b3JrZXItaWQgInctMDEiCiAgICAgICAgICAgdG9wb2xvZ3ktaWQgInMtMDEiCiAgICAgICAgICAgcG9ydCA5OTk5Ci0gICAgICAgICAgY2hpbGRvcHRzICItWGxvZ2djOi9ob21lL3kvbGliL3N0b3JtL2N1cnJlbnQvbG9ncy9nYy53b3JrZXItJUlEJS0lVE9QT0xPR1ktSUQlLSVXT1JLRVItSUQlLSVXT1JLRVItUE9SVCUubG9nIC1YbXMyNTZtIgotICAgICAgICAgIGV4cGVjdGVkLWNoaWxkb3B0cyAnKCItWGxvZ2djOi9ob21lL3kvbGliL3N0b3JtL2N1cnJlbnQvbG9ncy9nYy53b3JrZXItOTk5OS1zLTAxLXctMDEtOTk5OS5sb2ciICItWG1zMjU2bSIpCi0gICAgICAgICAgY2hpbGRvcHRzLXdpdGgtaWRzIChzdXBlcnZpc29yL3N1YnN0aXR1dGUtY2hpbGRvcHRzIGNoaWxkb3B0cyB3b3JrZXItaWQgdG9wb2xvZ3ktaWQgcG9ydCldCisgICAgICAgICAgbWVtLW9uaGVhcCA1MTIKKyAgICAgICAgICBjaGlsZG9wdHMgIi1YbG9nZ2M6L2hvbWUveS9saWIvc3Rvcm0vY3VycmVudC9sb2dzL2djLndvcmtlci0lSUQlLSVUT1BPTE9HWS1JRCUtJVdPUktFUi1JRCUtJVdPUktFUi1QT1JUJS5sb2cgLVhtczI1Nm0gLVhteCVIRUFQLU1FTSVtIgorICAgICAgICAgIGV4cGVjdGVkLWNoaWxkb3B0cyAnKCItWGxvZ2djOi9ob21lL3kvbGliL3N0b3JtL2N1cnJlbnQvbG9ncy9nYy53b3JrZXItOTk5OS1zLTAxLXctMDEtOTk5OS5sb2ciICItWG1zMjU2bSIgIi1YbXg1MTJtIikKKyAgICAgICAgICBjaGlsZG9wdHMtd2l0aC1pZHMgKHN1cGVydmlzb3Ivc3Vic3RpdHV0ZS1jaGlsZG9wdHMgY2hpbGRvcHRzIHdvcmtlci1pZCB0b3BvbG9neS1pZCBwb3J0IG1lbS1vbmhlYXApXQogICAgICAgKGlzICg9IGV4cGVjdGVkLWNoaWxkb3B0cyBjaGlsZG9wdHMtd2l0aC1pZHMpKSkpKQogCiAoZGVmdGVzdCB0ZXN0LXN1YnN0aXR1dGUtY2hpbGRvcHRzLWhhcHB5LXBhdGgtbGlzdApAQCAtNTY0LDkgKzYwMiwyMSBAQAogICAgIChsZXQgW3dvcmtlci1pZCAidy0wMSIKICAgICAgICAgICB0b3BvbG9neS1pZCAicy0wMSIKICAgICAgICAgICBwb3J0IDk5OTkKLSAgICAgICAgICBjaGlsZG9wdHMgJygiLVhsb2dnYzovaG9tZS95L2xpYi9zdG9ybS9jdXJyZW50L2xvZ3MvZ2Mud29ya2VyLSVJRCUtJVRPUE9MT0dZLUlEJS0lV09SS0VSLUlEJS0lV09SS0VSLVBPUlQlLmxvZyIgIi1YbXMyNTZtIikKLSAgICAgICAgICBleHBlY3RlZC1jaGlsZG9wdHMgJygiLVhsb2dnYzovaG9tZS95L2xpYi9zdG9ybS9jdXJyZW50L2xvZ3MvZ2Mud29ya2VyLTk5OTktcy0wMS13LTAxLTk5OTkubG9nIiAiLVhtczI1Nm0iKQotICAgICAgICAgIGNoaWxkb3B0cy13aXRoLWlkcyAoc3VwZXJ2aXNvci9zdWJzdGl0dXRlLWNoaWxkb3B0cyBjaGlsZG9wdHMgd29ya2VyLWlkIHRvcG9sb2d5LWlkIHBvcnQpXQorICAgICAgICAgIG1lbS1vbmhlYXAgNTEyCisgICAgICAgICAgY2hpbGRvcHRzICcoIi1YbG9nZ2M6L2hvbWUveS9saWIvc3Rvcm0vY3VycmVudC9sb2dzL2djLndvcmtlci0lSUQlLSVUT1BPTE9HWS1JRCUtJVdPUktFUi1JRCUtJVdPUktFUi1QT1JUJS5sb2ciICItWG1zMjU2bSIgIi1YbXglSEVBUC1NRU0lbSIpCisgICAgICAgICAgZXhwZWN0ZWQtY2hpbGRvcHRzICcoIi1YbG9nZ2M6L2hvbWUveS9saWIvc3Rvcm0vY3VycmVudC9sb2dzL2djLndvcmtlci05OTk5LXMtMDEtdy0wMS05OTk5LmxvZyIgIi1YbXMyNTZtIiAiLVhteDUxMm0iKQorICAgICAgICAgIGNoaWxkb3B0cy13aXRoLWlkcyAoc3VwZXJ2aXNvci9zdWJzdGl0dXRlLWNoaWxkb3B0cyBjaGlsZG9wdHMgd29ya2VyLWlkIHRvcG9sb2d5LWlkIHBvcnQgbWVtLW9uaGVhcCldCisgICAgICAoaXMgKD0gZXhwZWN0ZWQtY2hpbGRvcHRzIGNoaWxkb3B0cy13aXRoLWlkcykpKSkpCisKKyhkZWZ0ZXN0IHRlc3Qtc3Vic3RpdHV0ZS1jaGlsZG9wdHMtaGFwcHktcGF0aC1saXN0LWFycmF5bGlzdAorICAodGVzdGluZyAid29ya2VyLWxhdW5jaGVyIHJlcGxhY2VzIGlkcyBpbiBjaGlsZG9wdHMiCisgICAgKGxldCBbd29ya2VyLWlkICJ3LTAxIgorICAgICAgICAgIHRvcG9sb2d5LWlkICJzLTAxIgorICAgICAgICAgIHBvcnQgOTk5OQorICAgICAgICAgIG1lbS1vbmhlYXAgNTEyCisgICAgICAgICAgY2hpbGRvcHRzICdbIi1YbG9nZ2M6L2hvbWUveS9saWIvc3Rvcm0vY3VycmVudC9sb2dzL2djLndvcmtlci0lSUQlLSVUT1BPTE9HWS1JRCUtJVdPUktFUi1JRCUtJVdPUktFUi1QT1JUJS5sb2ciICItWG1zMjU2bSIgIi1YbXglSEVBUC1NRU0lbSJdCisgICAgICAgICAgZXhwZWN0ZWQtY2hpbGRvcHRzICcoIi1YbG9nZ2M6L2hvbWUveS9saWIvc3Rvcm0vY3VycmVudC9sb2dzL2djLndvcmtlci05OTk5LXMtMDEtdy0wMS05OTk5LmxvZyIgIi1YbXMyNTZtIiAiLVhteDUxMm0iKQorICAgICAgICAgIGNoaWxkb3B0cy13aXRoLWlkcyAoc3VwZXJ2aXNvci9zdWJzdGl0dXRlLWNoaWxkb3B0cyBjaGlsZG9wdHMgd29ya2VyLWlkIHRvcG9sb2d5LWlkIHBvcnQgbWVtLW9uaGVhcCldCiAgICAgICAoaXMgKD0gZXhwZWN0ZWQtY2hpbGRvcHRzIGNoaWxkb3B0cy13aXRoLWlkcykpKSkpCiAKIChkZWZ0ZXN0IHRlc3Qtc3Vic3RpdHV0ZS1jaGlsZG9wdHMtdG9wb2xvZ3ktaWQtYWxvbmUKQEAgLTU3NCw5ICs2MjQsMTAgQEAKICAgICAobGV0IFt3b3JrZXItaWQgInctMDEiCiAgICAgICAgICAgdG9wb2xvZ3ktaWQgInMtMDEiCiAgICAgICAgICAgcG9ydCA5OTk5CisgICAgICAgICAgbWVtLW9uaGVhcCA1MTIKICAgICAgICAgICBjaGlsZG9wdHMgIi1YbG9nZ2M6L2hvbWUveS9saWIvc3Rvcm0vY3VycmVudC9sb2dzL2djLndvcmtlci0lVE9QT0xPR1ktSUQlLmxvZyIKICAgICAgICAgICBleHBlY3RlZC1jaGlsZG9wdHMgJygiLVhsb2dnYzovaG9tZS95L2xpYi9zdG9ybS9jdXJyZW50L2xvZ3MvZ2Mud29ya2VyLXMtMDEubG9nIikKLSAgICAgICAgICBjaGlsZG9wdHMtd2l0aC1pZHMgKHN1cGVydmlzb3Ivc3Vic3RpdHV0ZS1jaGlsZG9wdHMgY2hpbGRvcHRzIHdvcmtlci1pZCB0b3BvbG9neS1pZCBwb3J0KV0KKyAgICAgICAgICBjaGlsZG9wdHMtd2l0aC1pZHMgKHN1cGVydmlzb3Ivc3Vic3RpdHV0ZS1jaGlsZG9wdHMgY2hpbGRvcHRzIHdvcmtlci1pZCB0b3BvbG9neS1pZCBwb3J0IG1lbS1vbmhlYXApXQogICAgICAgKGlzICg9IGV4cGVjdGVkLWNoaWxkb3B0cyBjaGlsZG9wdHMtd2l0aC1pZHMpKSkpKQogCiAoZGVmdGVzdCB0ZXN0LXN1YnN0aXR1dGUtY2hpbGRvcHRzLW5vLWtleXMKQEAgLTU4NCw5ICs2MzUsMTAgQEAKICAgICAobGV0IFt3b3JrZXItaWQgInctMDEiCiAgICAgICAgICAgdG9wb2xvZ3ktaWQgInMtMDEiCiAgICAgICAgICAgcG9ydCA5OTk5CisgICAgICAgICAgbWVtLW9uaGVhcCA1MTIKICAgICAgICAgICBjaGlsZG9wdHMgIi1YbG9nZ2M6L2hvbWUveS9saWIvc3Rvcm0vY3VycmVudC9sb2dzL2djLndvcmtlci5sb2ciCiAgICAgICAgICAgZXhwZWN0ZWQtY2hpbGRvcHRzICcoIi1YbG9nZ2M6L2hvbWUveS9saWIvc3Rvcm0vY3VycmVudC9sb2dzL2djLndvcmtlci5sb2ciKQotICAgICAgICAgIGNoaWxkb3B0cy13aXRoLWlkcyAoc3VwZXJ2aXNvci9zdWJzdGl0dXRlLWNoaWxkb3B0cyBjaGlsZG9wdHMgd29ya2VyLWlkIHRvcG9sb2d5LWlkIHBvcnQpXQorICAgICAgICAgIGNoaWxkb3B0cy13aXRoLWlkcyAoc3VwZXJ2aXNvci9zdWJzdGl0dXRlLWNoaWxkb3B0cyBjaGlsZG9wdHMgd29ya2VyLWlkIHRvcG9sb2d5LWlkIHBvcnQgbWVtLW9uaGVhcCldCiAgICAgICAoaXMgKD0gZXhwZWN0ZWQtY2hpbGRvcHRzIGNoaWxkb3B0cy13aXRoLWlkcykpKSkpCiAKIChkZWZ0ZXN0IHRlc3Qtc3Vic3RpdHV0ZS1jaGlsZG9wdHMtbmlsLWNoaWxkb3B0cwpAQCAtNTk0LDkgKzY0NiwxMCBAQAogICAgIChsZXQgW3dvcmtlci1pZCAidy0wMSIKICAgICAgICAgICB0b3BvbG9neS1pZCAicy0wMSIKICAgICAgICAgICBwb3J0IDk5OTkKKyAgICAgICAgICBtZW0tb25oZWFwIDUxMgogICAgICAgICAgIGNoaWxkb3B0cyBuaWwKICAgICAgICAgICBleHBlY3RlZC1jaGlsZG9wdHMgbmlsCi0gICAgICAgICAgY2hpbGRvcHRzLXdpdGgtaWRzIChzdXBlcnZpc29yL3N1YnN0aXR1dGUtY2hpbGRvcHRzIGNoaWxkb3B0cyB3b3JrZXItaWQgdG9wb2xvZ3ktaWQgcG9ydCldCisgICAgICAgICAgY2hpbGRvcHRzLXdpdGgtaWRzIChzdXBlcnZpc29yL3N1YnN0aXR1dGUtY2hpbGRvcHRzIGNoaWxkb3B0cyB3b3JrZXItaWQgdG9wb2xvZ3ktaWQgcG9ydCBtZW0tb25oZWFwKV0KICAgICAgIChpcyAoPSBleHBlY3RlZC1jaGlsZG9wdHMgY2hpbGRvcHRzLXdpdGgtaWRzKSkpKSkKIAogKGRlZnRlc3QgdGVzdC1zdWJzdGl0dXRlLWNoaWxkb3B0cy1uaWwtaWRzCkBAIC02MDQsMTYgKzY1NywxNyBAQAogICAgIChsZXQgW3dvcmtlci1pZCBuaWwKICAgICAgICAgICB0b3BvbG9neS1pZCAicy0wMSIKICAgICAgICAgICBwb3J0IDk5OTkKKyAgICAgICAgICBtZW0tb25oZWFwIDUxMgogICAgICAgICAgIGNoaWxkb3B0cyAiLVhsb2dnYzovaG9tZS95L2xpYi9zdG9ybS9jdXJyZW50L2xvZ3MvZ2Mud29ya2VyLSVJRCUtJVRPUE9MT0dZLUlEJS0lV09SS0VSLUlEJS0lV09SS0VSLVBPUlQlLmxvZyIKICAgICAgICAgICBleHBlY3RlZC1jaGlsZG9wdHMgJygiLVhsb2dnYzovaG9tZS95L2xpYi9zdG9ybS9jdXJyZW50L2xvZ3MvZ2Mud29ya2VyLTk5OTktcy0wMS0tOTk5OS5sb2ciKQotICAgICAgICAgIGNoaWxkb3B0cy13aXRoLWlkcyAoc3VwZXJ2aXNvci9zdWJzdGl0dXRlLWNoaWxkb3B0cyBjaGlsZG9wdHMgd29ya2VyLWlkIHRvcG9sb2d5LWlkIHBvcnQpXQorICAgICAgICAgIGNoaWxkb3B0cy13aXRoLWlkcyAoc3VwZXJ2aXNvci9zdWJzdGl0dXRlLWNoaWxkb3B0cyBjaGlsZG9wdHMgd29ya2VyLWlkIHRvcG9sb2d5LWlkIHBvcnQgbWVtLW9uaGVhcCldCiAgICAgICAoaXMgKD0gZXhwZWN0ZWQtY2hpbGRvcHRzIGNoaWxkb3B0cy13aXRoLWlkcykpKSkpCiAKIChkZWZ0ZXN0IHRlc3QtcmV0cnktcmVhZC1hc3NpZ25tZW50cwogICAod2l0aC1zaW11bGF0ZWQtdGltZS1sb2NhbC1jbHVzdGVyIFtjbHVzdGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpzdXBlcnZpc29ycyAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpwb3J0cy1wZXItc3VwZXJ2aXNvciAyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpkYWVtb24tY29uZiB7TklNQlVTLVJFQVNTSUdOIGZhbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpkYWVtb24tY29uZiB7TklNQlVTLURPLU5PVC1SRUFTU0lHTiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTklNQlVTLU1PTklUT1ItRlJFUS1TRUNTIDEwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVE9QT0xPR1ktTUVTU0FHRS1USU1FT1VULVNFQ1MgMzAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUT1BPTE9HWS1BQ0tFUi1FWEVDVVRPUlMgMH1dCkBAIC02MjksMjUgKzY4MywzMiBAQAogICAgICAoYmluZCBjaGFuZ2VkIChjYXB0dXJlLWNoYW5nZWQtd29ya2VycwogICAgICAgICAgICAgICAgICAgICAoc3VibWl0LW1vY2tlZC1hc3NpZ25tZW50CiAgICAgICAgICAgICAgICAgICAgICAoOm5pbWJ1cyBjbHVzdGVyKQorICAgICAgICAgICAgICAgICAgICAgKDpzdG9ybS1jbHVzdGVyLXN0YXRlIGNsdXN0ZXIpCiAgICAgICAgICAgICAgICAgICAgICAidG9wb2xvZ3kxIgogICAgICAgICAgICAgICAgICAgICAge1RPUE9MT0dZLVdPUktFUlMgMn0KICAgICAgICAgICAgICAgICAgICAgIHRvcG9sb2d5MQogICAgICAgICAgICAgICAgICAgICAgezEgIjEiCiAgICAgICAgICAgICAgICAgICAgICAgMiAiMSJ9CiAgICAgICAgICAgICAgICAgICAgICB7WzEgMV0gWyJzdXAxIiAxXQotICAgICAgICAgICAgICAgICAgICAgIFsyIDJdIFsic3VwMSIgMl0KKyAgICAgICAgICAgICAgICAgICAgICBbMiAyXSBbInN1cDEiIDJdfQorICAgICAgICAgICAgICAgICAgICAge1sic3VwMSIgMV0gWzAuMCAwLjAgMC4wXQorICAgICAgICAgICAgICAgICAgICAgIFsic3VwMSIgMl0gWzAuMCAwLjAgMC4wXQogICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgIChzdWJtaXQtbW9ja2VkLWFzc2lnbm1lbnQKICAgICAgICAgICAgICAgICAgICAgICg6bmltYnVzIGNsdXN0ZXIpCisgICAgICAgICAgICAgICAgICAgICAoOnN0b3JtLWNsdXN0ZXItc3RhdGUgY2x1c3RlcikKICAgICAgICAgICAgICAgICAgICAgICJ0b3BvbG9neTIiCiAgICAgICAgICAgICAgICAgICAgICB7VE9QT0xPR1ktV09SS0VSUyAyfQogICAgICAgICAgICAgICAgICAgICAgdG9wb2xvZ3kyCiAgICAgICAgICAgICAgICAgICAgICB7MSAiMSIKICAgICAgICAgICAgICAgICAgICAgICAyICIxIn0KICAgICAgICAgICAgICAgICAgICAgIHtbMSAxXSBbInN1cDEiIDFdCi0gICAgICAgICAgICAgICAgICAgICAgWzIgMl0gWyJzdXAxIiAyXQorICAgICAgICAgICAgICAgICAgICAgIFsyIDJdIFsic3VwMSIgMl19CisgICAgICAgICAgICAgICAgICAgICB7WyJzdXAxIiAxXSBbMC4wIDAuMCAwLjBdCisgICAgICAgICAgICAgICAgICAgICAgWyJzdXAxIiAyXSBbMC4wIDAuMCAwLjBdCiAgICAgICAgICAgICAgICAgICAgICAgfSkKLSAgICAgICAgICAgICAgICAgICAgKGFkdmFuY2UtY2x1c3Rlci10aW1lIGNsdXN0ZXIgMTApCisgICAgICAgICAgICAgICAgICAgIDs7IEluc3RlYWQgb2Ygc2xlZXBpbmcgdW50aWwgdG9wb2xvZ3kgaXMgc2NoZWR1bGVkLCByZWJhbGFuY2UgdG9wb2xvZ3kgc28gbWstYXNzaWdubWVudHMgaXMgY2FsbGVkLgorICAgICAgICAgICAgICAgICAgICAoLnJlYmFsYW5jZSAoOm5pbWJ1cyBjbHVzdGVyKSAidG9wb2xvZ3kxIiAoZG90byAoUmViYWxhbmNlT3B0aW9ucy4pICguc2V0X3dhaXRfc2VjcyAwKSkpCiAgICAgICAgICAgICAgICAgICAgICkpCiAgICAgIChpcyAoZW1wdHk/ICg6bGF1bmNoZWQgY2hhbmdlZCkpKQogICAgICAoYmluZCBvcHRpb25zIChSZWJhbGFuY2VPcHRpb25zLikpCmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3Rlc3QvY2xqL2JhY2t0eXBlL3N0b3JtL3Rlc3Rpbmc0al90ZXN0LmNsaiBiL3N0b3JtLWNvcmUvdGVzdC9jbGovYmFja3R5cGUvc3Rvcm0vdGVzdGluZzRqX3Rlc3QuY2xqCmluZGV4IDM2ZjNkZjYuLmI1MDRmMjggMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvdGVzdC9jbGovYmFja3R5cGUvc3Rvcm0vdGVzdGluZzRqX3Rlc3QuY2xqCisrKyBiL3N0b3JtLWNvcmUvdGVzdC9jbGovYmFja3R5cGUvc3Rvcm0vdGVzdGluZzRqX3Rlc3QuY2xqCkBAIC0xMTgsNiArMTE4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgInRlc3QtYWNraW5nMiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgKENvbmZpZy4pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICguZ2V0VG9wb2xvZ3kgdHJhY2tlZCkpCisgICAgICAgICAoYWR2YW5jZS1jbHVzdGVyLXRpbWUgKC5nZXRTdGF0ZSBjbHVzdGVyKSAxMSkKICAgICAgICAgICguZmVlZCBmZWVkZXIgWzFdKQogICAgICAgICAgKFRlc3RpbmcvdHJhY2tlZFdhaXQgdHJhY2tlZCAoaW50IDEpKQogICAgICAgICAgKGNoZWNrZXIgMCkKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvdGVzdC9jbGovYmFja3R5cGUvc3Rvcm0vdHJhbnNhY3Rpb25hbF90ZXN0LmNsaiBiL3N0b3JtLWNvcmUvdGVzdC9jbGovYmFja3R5cGUvc3Rvcm0vdHJhbnNhY3Rpb25hbF90ZXN0LmNsagppbmRleCBmYzkxMzdkLi4xNDNkZjBjIDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3Rlc3QvY2xqL2JhY2t0eXBlL3N0b3JtL3RyYW5zYWN0aW9uYWxfdGVzdC5jbGoKKysrIGIvc3Rvcm0tY29yZS90ZXN0L2Nsai9iYWNrdHlwZS9zdG9ybS90cmFuc2FjdGlvbmFsX3Rlc3QuY2xqCkBAIC0yMCw2ICsyMCw3IEBACiAgICg6aW1wb3J0IFtiYWNrdHlwZS5zdG9ybS50cmFuc2FjdGlvbmFsIFRyYW5zYWN0aW9uYWxTcG91dENvb3JkaW5hdG9yIElUcmFuc2FjdGlvbmFsU3BvdXQgSVRyYW5zYWN0aW9uYWxTcG91dCRDb29yZGluYXRvciBUcmFuc2FjdGlvbkF0dGVtcHQKICAgICAgICAgICAgIFRyYW5zYWN0aW9uYWxUb3BvbG9neUJ1aWxkZXJdKQogICAoOmltcG9ydCBbYmFja3R5cGUuc3Rvcm0udHJhbnNhY3Rpb25hbC5zdGF0ZSBUcmFuc2FjdGlvbmFsU3RhdGUgVGVzdFRyYW5zYWN0aW9uYWxTdGF0ZSBSb3RhdGluZ1RyYW5zYWN0aW9uYWxTdGF0ZSBSb3RhdGluZ1RyYW5zYWN0aW9uYWxTdGF0ZSRTdGF0ZUluaXRpYWxpemVyXSkKKyAgKDppbXBvcnQgW2JhY2t0eXBlLnN0b3JtLmdlbmVyYXRlZCBSZWJhbGFuY2VPcHRpb25zXSkKICAgKDppbXBvcnQgW2JhY2t0eXBlLnN0b3JtLnNwb3V0IFNwb3V0T3V0cHV0Q29sbGVjdG9yIElTcG91dE91dHB1dENvbGxlY3Rvcl0pCiAgICg6aW1wb3J0IFtiYWNrdHlwZS5zdG9ybS50YXNrIE91dHB1dENvbGxlY3RvciBJT3V0cHV0Q29sbGVjdG9yXSkKICAgKDppbXBvcnQgW2JhY2t0eXBlLnN0b3JtLmNvb3JkaW5hdGlvbiBCYXRjaEJvbHRFeGVjdXRvcl0pCkBAIC00MTEsNyArNDEyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmFuc2FjdGlvbmFsLXRlc3QiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7VE9QT0xPR1ktTUFYLVNQT1VULVBFTkRJTkcgMn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICg6dG9wb2xvZ3kgdG9wby1pbmZvKSkKLQorICAgICAgIChhZHZhbmNlLWNsdXN0ZXItdGltZSBjbHVzdGVyIDExKQogICAgICAgIChiaW5kIGFjay10eCEgKGZuIFt0eGlkXQogICAgICAgICAgICAgICAgICAgICAgICAobGV0IFtbdG8tYWNrIG5vdC10by1hY2tdIChzZXBhcmF0ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjKC0+ICUKQEAgLTY2Niw3ICs2NjcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1RPUE9MT0dZLU1BWC1TUE9VVC1QRU5ESU5HIDIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoOnRvcG9sb2d5IHRvcG8taW5mbykpCi0KKyAgICAgICAoYWR2YW5jZS1jbHVzdGVyLXRpbWUgY2x1c3RlciAxMSkKICAgICAgICAoYmluZCBhY2stdHghIChmbiBbdHhpZF0KICAgICAgICAgICAgICAgICAgICAgICAgKGxldCBbW3RvLWFjayBub3QtdG8tYWNrXSAoc2VwYXJhdGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIygtPiAlCmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3Rlc3QvY2xqL2JhY2t0eXBlL3N0b3JtL3dvcmtlcl90ZXN0LmNsaiBiL3N0b3JtLWNvcmUvdGVzdC9jbGovYmFja3R5cGUvc3Rvcm0vd29ya2VyX3Rlc3QuY2xqCmluZGV4IDJlMDUzM2QuLmI4ZTVmMGYgMTAwNjQ0Ci0tLSBhL3N0b3JtLWNvcmUvdGVzdC9jbGovYmFja3R5cGUvc3Rvcm0vd29ya2VyX3Rlc3QuY2xqCisrKyBiL3N0b3JtLWNvcmUvdGVzdC9jbGovYmFja3R5cGUvc3Rvcm0vd29ya2VyX3Rlc3QuY2xqCkBAIC0xNSwxNSArMTUsMTg0IEBACiA7OyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIChucyBiYWNrdHlwZS5zdG9ybS53b3JrZXItdGVzdAogICAoOnVzZSBbY2xvanVyZSB0ZXN0XSkKKyAgKDpyZXF1aXJlIFtiYWNrdHlwZS5zdG9ybS5kYWVtb24gW3dvcmtlciA6YXMgd29ya2VyXV0pCisgICg6cmVxdWlyZSBbYmFja3R5cGUuc3Rvcm0gW3V0aWwgOmFzIHV0aWxdXSkKKyAgKDpyZXF1aXJlIFtjb25qdXJlLmNvcmVdKQorICAoOnJlcXVpcmUgW2Nsai10aW1lLmNvcmUgOmFzIHRpbWVdKQorICAoOnJlcXVpcmUgW2Nsai10aW1lLmNvZXJjZSA6YXMgY29lcmNlXSkKKyAgKDppbXBvcnQgW2JhY2t0eXBlLnN0b3JtLmdlbmVyYXRlZCBMb2dDb25maWcgTG9nTGV2ZWwgTG9nTGV2ZWxBY3Rpb25dKQorICAoOmltcG9ydCBbb3JnLmFwYWNoZS5sb2dnaW5nLmxvZzRqIExldmVsIExvZ01hbmFnZXJdKQorICAoOmltcG9ydCBbb3JnLnNsZjRqIExvZ2dlcl0pCisgICg6dXNlIFtjb25qdXJlIGNvcmVdKQorICAoOnVzZSBbYmFja3R5cGUuc3Rvcm0gdGVzdGluZyBsb2ddKQorICAoOnVzZSBbYmFja3R5cGUuc3Rvcm0uZGFlbW9uIGNvbW1vbl0pCisgICg6dXNlIFtjbG9qdXJlLnN0cmluZyA6b25seSBbam9pbl1dKQogICAoOmltcG9ydCBbYmFja3R5cGUuc3Rvcm0ubWVzc2FnaW5nIFRhc2tNZXNzYWdlIElDb250ZXh0IElDb25uZWN0aW9uIENvbm5lY3Rpb25XaXRoU3RhdHVzIENvbm5lY3Rpb25XaXRoU3RhdHVzJFN0YXR1c10pCiAgICg6aW1wb3J0IFtvcmcubW9ja2l0byBNb2NraXRvXSkKLSAgKDp1c2UgW2JhY2t0eXBlLnN0b3JtIHRlc3RpbmddKQotICAoOnVzZSBbYmFja3R5cGUuc3Rvcm0uZGFlbW9uIGNvbW1vbl0pCi0KLSAgKDpyZXF1aXJlIFtiYWNrdHlwZS5zdG9ybS5kYWVtb24gW3dvcmtlciA6YXMgd29ya2VyXV0pCiAgICkKIAogCisoZGVmdGVzdCB0ZXN0LWxvZy1yZXNldC1zaG91bGQtbm90LXRyaWdnZXItZm9yLWZ1dHVyZS10aW1lCisgICh3aXRoLWxvY2FsLWNsdXN0ZXIgW2NsdXN0ZXJdCisgICAgKGxldCBbd29ya2VyICg6d29ya2VyIGNsdXN0ZXIpCisgICAgICAgICAgcHJlc2VudCAodGltZS9ub3cpCisgICAgICAgICAgdGhlLWZ1dHVyZSAoY29lcmNlL3RvLWxvbmcgKHRpbWUvcGx1cyBwcmVzZW50ICh0aW1lL3NlY3MgMSkpKQorICAgICAgICAgIG1vY2stY29uZmlnIHsiZm9vIiB7OnRpbWVvdXQgdGhlLWZ1dHVyZX19CisgICAgICAgICAgbW9jay1jb25maWctYXRvbSAoYXRvbSBtb2NrLWNvbmZpZyldCisgICAgICAoc3R1YmJpbmcgW3RpbWUvbm93IHByZXNlbnRdCisgICAgICAgICh3b3JrZXIvcmVzZXQtbG9nLWxldmVscyBtb2NrLWNvbmZpZy1hdG9tKQorICAgICAgICA7OyBpZiB0aGUgd29ya2VyIGRvZXNuJ3QgcmVzZXQgbG9nIGxldmVscywgdGhlIGF0b20gc2hvdWxkIG5vdCBiZSBuaWwKKyAgICAgICAgKGlzIChub3QoPSBAbW9jay1jb25maWctYXRvbSBuaWwpKSkpKSkpCisKKyhkZWZ0ZXN0IHRlc3QtbG9nLXJlc2V0LXRyaWdnZXJzLWZvci1wYXN0LXRpbWUKKyAgKHdpdGgtbG9jYWwtY2x1c3RlciBbY2x1c3Rlcl0KKyAgICAobGV0IFt3b3JrZXIgKDp3b3JrZXIgY2x1c3RlcikKKyAgICAgICAgICBwcmVzZW50ICh0aW1lL25vdykKKyAgICAgICAgICBwYXN0ICh0aW1lL3BsdXMgcHJlc2VudCAodGltZS9zZWNzIC0xKSkKKyAgICAgICAgICBtb2NrLWNvbmZpZyB7ImZvbyIgeyA6dGltZW91dCAoY29lcmNlL3RvLWxvbmcgcGFzdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6dGFyZ2V0LWxvZy1sZXZlbCBMZXZlbC9JTkZPCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOnJlc2V0LWxvZy1sZXZlbCBMZXZlbC9XQVJOfX0KKyAgICAgICAgICBtb2NrLWNvbmZpZy1hdG9tIChhdG9tIG1vY2stY29uZmlnKV0KKyAgICAgIChzdHViYmluZyBbdGltZS9ub3cgcHJlc2VudF0KKyAgICAgICAgKHdvcmtlci9yZXNldC1sb2ctbGV2ZWxzIG1vY2stY29uZmlnLWF0b20pCisgICAgICAgIDs7IHRoZSBsb2dnZXIgY29uZmlnIGlzIHJlbW92ZWQgZnJvbSBhdG9tCisgICAgICAgIChpcyAoPSBAbW9jay1jb25maWctYXRvbSB7fSkpKSkpKQorCisoZGVmdGVzdCB0ZXN0LWxvZy1yZXNldC1yZXNldHMtZG9lcy1ub3RoaW5nLWZvci1lbXB0eS1sb2ctY29uZmlnCisgICh3aXRoLWxvY2FsLWNsdXN0ZXIgW2NsdXN0ZXJdCisgICAgKGxldCBbd29ya2VyICg6d29ya2VyIGNsdXN0ZXIpCisgICAgICAgICAgcHJlc2VudCAodGltZS9ub3cpCisgICAgICAgICAgcGFzdCAoY29lcmNlL3RvLWxvbmcgKHRpbWUvcGx1cyBwcmVzZW50ICh0aW1lL3NlY3MgLTEpKSkKKyAgICAgICAgICBtb2NrLWNvbmZpZyB7fQorICAgICAgICAgIG1vY2stY29uZmlnLWF0b20gKGF0b20gbW9jay1jb25maWcpXQorICAgICAgKHN0dWJiaW5nIFt3b3JrZXIvc2V0LWxvZ2dlci1sZXZlbCBuaWwKKyAgICAgICAgICAgICAgICAgdGltZS9ub3cgcHJlc2VudF0KKyAgICAgICAgKHdvcmtlci9yZXNldC1sb2ctbGV2ZWxzIG1vY2stY29uZmlnLWF0b20pCisgICAgICAgIDs7IGlmIHRoZSB3b3JrZXIgcmVzZXRzIGxvZyBsZXZlbCwgdGhlIGF0b20gaXMgbmlsJ2VkIG91dAorICAgICAgICAoaXMgKD0gQG1vY2stY29uZmlnLWF0b20ge30pKQorICAgICAgICA7OyB0ZXN0IHRoYXQgdGhlIHNldC1sb2dnZXItbGV2ZWwgZnVuY3Rpb24gd2FzIG5vdCBjYWxsZWQKKyAgICAgICAgKHZlcmlmeS1jYWxsLXRpbWVzLWZvciB3b3JrZXIvc2V0LWxvZ2dlci1sZXZlbCAwKSkpKSkKKworKGRlZnRlc3QgdGVzdC1sb2ctcmVzZXQtcmVzZXRzLXJvb3QtbG9nZ2VyLWlmLXNldAorICAod2l0aC1sb2NhbC1jbHVzdGVyIFtjbHVzdGVyXQorICAgIChsZXQgW3dvcmtlciAoOndvcmtlciBjbHVzdGVyKQorICAgICAgICAgIHByZXNlbnQgKHRpbWUvbm93KQorICAgICAgICAgIHBhc3QgKGNvZXJjZS90by1sb25nICh0aW1lL3BsdXMgcHJlc2VudCAodGltZS9zZWNzIC0xKSkpCisgICAgICAgICAgbW9jay1jb25maWcge0xvZ01hbmFnZXIvUk9PVF9MT0dHRVJfTkFNRSAgezp0aW1lb3V0IHBhc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOnRhcmdldC1sb2ctbGV2ZWwgTGV2ZWwvREVCVUcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOnJlc2V0LWxvZy1sZXZlbCBMZXZlbC9XQVJOfX0KKyAgICAgICAgICBtb2NrLWNvbmZpZy1hdG9tIChhdG9tIG1vY2stY29uZmlnKV0KKyAgICAgIChzdHViYmluZyBbd29ya2VyL3NldC1sb2dnZXItbGV2ZWwgbmlsCisgICAgICAgICAgICAgICAgIHRpbWUvbm93IHByZXNlbnRdCisgICAgICAgICh3b3JrZXIvcmVzZXQtbG9nLWxldmVscyBtb2NrLWNvbmZpZy1hdG9tKQorICAgICAgICA7OyBpZiB0aGUgd29ya2VyIHJlc2V0cyBsb2cgbGV2ZWwsIHRoZSBhdG9tIGlzIHJlc2V0IHRvIHt9CisgICAgICAgIChpcyAoPSBAbW9jay1jb25maWctYXRvbSB7fSkpCisgICAgICAgIDs7IGVuc3VyZSB3ZSByZXNldCBiYWNrIHRvIFdBUk4gbGV2ZWwKKyAgICAgICAgKHZlcmlmeS1jYWxsLXRpbWVzLWZvciB3b3JrZXIvc2V0LWxvZ2dlci1sZXZlbCAxKQorICAgICAgICAodmVyaWZ5LWZpcnN0LWNhbGwtYXJncy1mb3ItaW5kaWNlcyB3b3JrZXIvc2V0LWxvZ2dlci1sZXZlbCBbMSAyXSBMb2dNYW5hZ2VyL1JPT1RfTE9HR0VSX05BTUUgTGV2ZWwvV0FSTikpKSkpCisKKzs7VGhpcyBzaG91bGQgYmUgcmVtb3ZlZCB3aGVuIGl0IGdvZXMgaW50byBjb25qdXJlCisoZGVmbWFjcm8gdmVyaWZ5LW50aC1jYWxsLWFyZ3MtZm9yLWluZGljZXMKKyAgIkFzc2VydHMgdGhhdCB0aGUgZnVuY3Rpb24gd2FzIGNhbGxlZCBhdCBsZWFzdCBvbmNlLCBhbmQgdGhlIG50aCBjYWxsIHdhcworICAgcGFzc2VkIHRoZSBhcmdzIHNwZWNpZmllZCwgaW50byB0aGUgaW5kaWNlcyBvZiB0aGUgYXJnbGlzdCBzcGVjaWZpZWQuIEluCisgICBvdGhlciB3b3JkcywgaXQgY2hlY2tzIG9ubHkgdGhlIHBhcnRpY3VsYXIgYXJncyB5b3UgY2FyZSBhYm91dC4iCisgIFtuIGZuLW5hbWUgaW5kaWNlcyAmIGFyZ3NdCisgIGAoZG8KKyAgICAgKGFzc2VydC1pbi1mYWtlLWNvbnRleHQgInZlcmlmeS1maXJzdC1jYWxsLWFyZ3MtZm9yLWluZGljZXMiKQorICAgICAoYXNzZXJ0LWNvbmp1cmlmaWVkLWZuICJ2ZXJpZnktZmlyc3QtY2FsbC1hcmdzLWZvci1pbmRpY2VzIiB+Zm4tbmFtZSkKKyAgICAgKGlzICg8IH5uIChjb3VudCAoZ2V0IEBjYWxsLXRpbWVzIH5mbi1uYW1lKSkpCisgICAgICAgICAoc3RyICIodmVyaWZ5LW50aC1jYWxsLWFyZ3MtZm9yLWluZGljZXMgIiB+biAiICIgfmZuLW5hbWUgIiAiIH5pbmRpY2VzICIgIiB+KGpvaW4gIiAiIGFyZ3MpICIpIikpCisgICAgIChsZXQgW250aC1jYWxsLWFyZ3MjIChudGggKGdldCBAY2FsbC10aW1lcyB+Zm4tbmFtZSkgfm4pCisgICAgICAgICAgIGluZGljZXMtaW4tcmFuZ2U/IyAoPCAoYXBwbHkgbWF4IH5pbmRpY2VzKSAoY291bnQgbnRoLWNhbGwtYXJncyMpKV0KKyAgICAgICAoaWYgaW5kaWNlcy1pbi1yYW5nZT8jCisgICAgICAgICAoaXMgKD0gfih2ZWMgYXJncykgKG1hcCAjKG50aCBudGgtY2FsbC1hcmdzIyAlKSB+aW5kaWNlcykpCisgICAgICAgICAgICAgKHN0ciAiKHZlcmlmeS1maXJzdC1jYWxsLWFyZ3MtZm9yLWluZGljZXMgIiB+biAiICIgfmZuLW5hbWUgIiAiIH5pbmRpY2VzICIgIiB+KGpvaW4gIiAiIGFyZ3MpICIpIikpCisgICAgICAgICAoaXMgKD0gOmZhaWwgKGZvcm1hdCAiaW5kaWNlcyAlcyBhcmUgb3V0IG9mIHJhbmdlIGZvciB0aGUgYXJncywgJXMiIH5pbmRpY2VzIH4odmVjIGFyZ3MpKSkKKyAgICAgICAgICAgICAoc3RyICIodmVyaWZ5LWZpcnN0LWNhbGwtYXJncy1mb3ItaW5kaWNlcyAiIH5uICIgIiB+Zm4tbmFtZSAiICIgfmluZGljZXMgIiAiIH4oam9pbiAiICIgYXJncykgIikiKSkpKSkpCisKKyhkZWZ0ZXN0IHRlc3QtbG9nLXJlc2V0cy1uYW1lZC1sb2dnZXJzLXdpdGgtcGFzdC10aW1lb3V0CisgICh3aXRoLWxvY2FsLWNsdXN0ZXIgW2NsdXN0ZXJdCisgICAgKGxldCBbd29ya2VyICg6d29ya2VyIGNsdXN0ZXIpCisgICAgICAgICAgcHJlc2VudCAodGltZS9ub3cpCisgICAgICAgICAgcGFzdCAoY29lcmNlL3RvLWxvbmcgKHRpbWUvcGx1cyBwcmVzZW50ICh0aW1lL3NlY3MgLTEpKSkKKyAgICAgICAgICBtb2NrLWNvbmZpZyB7Im15X2RlYnVnX2xvZ2dlciIgezp0aW1lb3V0IHBhc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDp0YXJnZXQtbG9nLWxldmVsIExldmVsL0RFQlVHCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6cmVzZXQtbG9nLWxldmVsIExldmVsL0lORk99IAorICAgICAgICAgICAgICAgICAgICAgICAibXlfaW5mb19sb2dnZXIiIHs6dGltZW91dCBwYXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDp0YXJnZXQtbG9nLWxldmVsIExldmVsL0lORk8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOnJlc2V0LWxvZy1sZXZlbCBMZXZlbC9XQVJOfQorICAgICAgICAgICAgICAgICAgICAgICAibXlfZXJyb3JfbG9nZ2VyIiB7OnRpbWVvdXQgcGFzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOnRhcmdldC1sb2ctbGV2ZWwgTGV2ZWwvRVJST1IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpyZXNldC1sb2ctbGV2ZWwgTGV2ZWwvSU5GT319CisgICAgICAgICAgcmVzdWx0IChhdG9tIHt9KQorICAgICAgICAgIG1vY2stY29uZmlnLWF0b20gKGF0b20gbW9jay1jb25maWcpXQorICAgICAgKHN0dWJiaW5nIFt3b3JrZXIvc2V0LWxvZ2dlci1sZXZlbCBuaWwKKyAgICAgICAgICAgICAgICAgdGltZS9ub3cgcHJlc2VudF0KKyAgICAgICAgICAod29ya2VyL3Jlc2V0LWxvZy1sZXZlbHMgbW9jay1jb25maWctYXRvbSkKKyAgICAgICAgICA7OyBpZiB0aGUgd29ya2VyIHJlc2V0cyBsb2cgbGV2ZWwsIHRoZSBhdG9tIGlzIHJlc2V0IHRvIHt9CisgICAgICAgICAgKGlzICg9IEBtb2NrLWNvbmZpZy1hdG9tIHt9KSkKKyAgICAgICAgICAodmVyaWZ5LWNhbGwtdGltZXMtZm9yIHdvcmtlci9zZXQtbG9nZ2VyLWxldmVsIDMpCisgICAgICAgICAgKHZlcmlmeS1udGgtY2FsbC1hcmdzLWZvci1pbmRpY2VzIDAgd29ya2VyL3NldC1sb2dnZXItbGV2ZWwgWzEgMl0gIm15X2RlYnVnX2xvZ2dlciIgTGV2ZWwvSU5GTykKKyAgICAgICAgICAodmVyaWZ5LW50aC1jYWxsLWFyZ3MtZm9yLWluZGljZXMgMSB3b3JrZXIvc2V0LWxvZ2dlci1sZXZlbCBbMSAyXSAibXlfZXJyb3JfbG9nZ2VyIiBMZXZlbC9JTkZPKQorICAgICAgICAgICh2ZXJpZnktbnRoLWNhbGwtYXJncy1mb3ItaW5kaWNlcyAyIHdvcmtlci9zZXQtbG9nZ2VyLWxldmVsIFsxIDJdICJteV9pbmZvX2xvZ2dlciIgTGV2ZWwvV0FSTikpKSkpCisKKyhkZWZ0ZXN0IHRlc3QtcHJvY2Vzcy1yb290LWxvZy1sZXZlbC10by1kZWJ1Zy1zZXRzLWxvZ2dlci1hbmQtdGltZW91dC0yCisgICh3aXRoLWxvY2FsLWNsdXN0ZXIgW2NsdXN0ZXJdCisgICAgKGxldCBbd29ya2VyICg6d29ya2VyIGNsdXN0ZXIpCisgICAgICAgICAgbW9jay1jb25maWcgKExvZ0NvbmZpZy4pCisgICAgICAgICAgcm9vdC1sZXZlbCAoTG9nTGV2ZWwuKQorICAgICAgICAgIG1vY2stY29uZmlnLWF0b20gKGF0b20gbmlsKQorICAgICAgICAgIG9yaWctbGV2ZWxzIChhdG9tIHt9KQorICAgICAgICAgIHByZXNlbnQgKHRpbWUvbm93KQorICAgICAgICAgIGluLXRoaXJ0eS1zZWNvbmRzIChjb2VyY2UvdG8tbG9uZyAodGltZS9wbHVzIHByZXNlbnQgKHRpbWUvc2VjcyAzMCkpKV0KKyAgICAgIDs7IGNvbmZpZ3VyZSB0aGUgcm9vdCBsb2dnZXIgdG8gYmUgZGVidWcKKyAgICAgICguc2V0X3Jlc2V0X2xvZ19sZXZlbF90aW1lb3V0X2Vwb2NoIHJvb3QtbGV2ZWwgaW4tdGhpcnR5LXNlY29uZHMpCisgICAgICAoLnNldF90YXJnZXRfbG9nX2xldmVsIHJvb3QtbGV2ZWwgIkRFQlVHIikKKyAgICAgICguc2V0X2FjdGlvbiByb290LWxldmVsIExvZ0xldmVsQWN0aW9uL1VQREFURSkKKyAgICAgICgucHV0X3RvX25hbWVkX2xvZ2dlcl9sZXZlbCBtb2NrLWNvbmZpZyAiUk9PVCIgcm9vdC1sZXZlbCkKKyAgICAgIChzdHViYmluZyBbd29ya2VyL3NldC1sb2dnZXItbGV2ZWwgbmlsCisgICAgICAgICAgICAgICAgIHRpbWUvbm93IHByZXNlbnRdCisgICAgICAgICAgKHdvcmtlci9wcm9jZXNzLWxvZy1jb25maWctY2hhbmdlIG1vY2stY29uZmlnLWF0b20gb3JpZy1sZXZlbHMgbW9jay1jb25maWcpCisgICAgICAgICAgOzsgdGVzdCB0aGF0IHRoZSBzZXQtbG9nZ2VyLWxldmVsIGZ1bmN0aW9uIHdhcyBub3QgY2FsbGVkCisgICAgICAgICAgKGxvZy1tZXNzYWdlICJUZXN0cyAiIEBtb2NrLWNvbmZpZy1hdG9tKQorICAgICAgICAgICh2ZXJpZnktY2FsbC10aW1lcy1mb3Igd29ya2VyL3NldC1sb2dnZXItbGV2ZWwgMSkKKyAgICAgICAgICAodmVyaWZ5LW50aC1jYWxsLWFyZ3MtZm9yLWluZGljZXMgMCB3b3JrZXIvc2V0LWxvZ2dlci1sZXZlbCBbMSAyXSAiIiBMZXZlbC9ERUJVRykKKyAgICAgICAgICAobGV0IFtyb290LXJlc3VsdCAoZ2V0IEBtb2NrLWNvbmZpZy1hdG9tIExvZ01hbmFnZXIvUk9PVF9MT0dHRVJfTkFNRSldCisgICAgICAgICAgICAoaXMgKD0gKDphY3Rpb24gcm9vdC1yZXN1bHQpIExvZ0xldmVsQWN0aW9uL1VQREFURSkpCisgICAgICAgICAgICAoaXMgKD0gKDp0YXJnZXQtbG9nLWxldmVsIHJvb3QtcmVzdWx0KSBMZXZlbC9ERUJVRykpCisgICAgICAgICAgICA7OyBkZWZhdWx0cyB0byBJTkZPIGxldmVsIHdoZW4gdGhlIGxvZ2dlciBpc24ndCBmb3VuZCBwcmV2aW91c2x5CisgICAgICAgICAgICAoaXMgKD0gKDpyZXNldC1sb2ctbGV2ZWwgcm9vdC1yZXN1bHQpIExldmVsL0lORk8pKQorICAgICAgICAgICAgKGlzICg9ICg6dGltZW91dCByb290LXJlc3VsdCkgaW4tdGhpcnR5LXNlY29uZHMpKSkpKSkpCisKKyhkZWZ0ZXN0IHRlc3QtcHJvY2Vzcy1yb290LWxvZy1sZXZlbC10by1kZWJ1Zy1zZXRzLWxvZ2dlci1hbmQtdGltZW91dAorICAod2l0aC1sb2NhbC1jbHVzdGVyIFtjbHVzdGVyXQorICAgIChsZXQgW3dvcmtlciAoOndvcmtlciBjbHVzdGVyKQorICAgICAgICAgIG1vY2stY29uZmlnIChMb2dDb25maWcuKQorICAgICAgICAgIHJvb3QtbGV2ZWwgKExvZ0xldmVsLikKKyAgICAgICAgICBvcmlnLWxldmVscyAoYXRvbSB7fSkKKyAgICAgICAgICBwcmVzZW50ICh0aW1lL25vdykKKyAgICAgICAgICBpbi10aGlydHktc2Vjb25kcyAoY29lcmNlL3RvLWxvbmcgKHRpbWUvcGx1cyBwcmVzZW50ICh0aW1lL3NlY3MgMzApKSkKKyAgICAgICAgICBtb2NrLWNvbmZpZy1hdG9tIChhdG9tIHt9KV0KKyAgICAgIDs7IGNvbmZpZ3VyZSB0aGUgcm9vdCBsb2dnZXIgdG8gYmUgZGVidWcKKyAgICAgIChkb3NlcSBbbmFtZWQgeyJST09UIiAiREVCVUciCisgICAgICAgICAgICAgICAgICAgICAibXlfZGVidWdfbG9nZ2VyIiAiREVCVUciCisgICAgICAgICAgICAgICAgICAgICAibXlfaW5mb19sb2dnZXIiICJJTkZPIgorICAgICAgICAgICAgICAgICAgICAgIm15X2Vycm9yX2xvZ2dlciIgIkVSUk9SIn1dCisgICAgICAgIChsZXQgW2xldmVsIChMb2dMZXZlbC4pXQorICAgICAgICAgICguc2V0X2FjdGlvbiBsZXZlbCBMb2dMZXZlbEFjdGlvbi9VUERBVEUpCisgICAgICAgICAgKC5zZXRfcmVzZXRfbG9nX2xldmVsX3RpbWVvdXRfZXBvY2ggbGV2ZWwgaW4tdGhpcnR5LXNlY29uZHMpCisgICAgICAgICAgKC5zZXRfdGFyZ2V0X2xvZ19sZXZlbCBsZXZlbCAodmFsIG5hbWVkKSkKKyAgICAgICAgICAoLnB1dF90b19uYW1lZF9sb2dnZXJfbGV2ZWwgbW9jay1jb25maWcgKGtleSBuYW1lZCkgbGV2ZWwpKSkKKyAgICAgIChsb2ctbWVzc2FnZSAiVGVzdHMgIiBtb2NrLWNvbmZpZykKKyAgICAgIChzdHViYmluZyBbd29ya2VyL3NldC1sb2dnZXItbGV2ZWwgbmlsCisgICAgICAgICAgICAgICAgIHRpbWUvbm93IHByZXNlbnRdCisgICAgICAgICAgKHdvcmtlci9wcm9jZXNzLWxvZy1jb25maWctY2hhbmdlIG1vY2stY29uZmlnLWF0b20gb3JpZy1sZXZlbHMgbW9jay1jb25maWcpCisgICAgICAgICAgKHZlcmlmeS1jYWxsLXRpbWVzLWZvciB3b3JrZXIvc2V0LWxvZ2dlci1sZXZlbCA0KQorICAgICAgICAgICh2ZXJpZnktbnRoLWNhbGwtYXJncy1mb3ItaW5kaWNlcyAwIHdvcmtlci9zZXQtbG9nZ2VyLWxldmVsIFsxIDJdICIiIExldmVsL0RFQlVHKQorICAgICAgICAgICh2ZXJpZnktbnRoLWNhbGwtYXJncy1mb3ItaW5kaWNlcyAxIHdvcmtlci9zZXQtbG9nZ2VyLWxldmVsIFsxIDJdICJteV9kZWJ1Z19sb2dnZXIiIExldmVsL0RFQlVHKQorICAgICAgICAgICh2ZXJpZnktbnRoLWNhbGwtYXJncy1mb3ItaW5kaWNlcyAyIHdvcmtlci9zZXQtbG9nZ2VyLWxldmVsIFsxIDJdICJteV9lcnJvcl9sb2dnZXIiIExldmVsL0VSUk9SKQorICAgICAgICAgICh2ZXJpZnktbnRoLWNhbGwtYXJncy1mb3ItaW5kaWNlcyAzIHdvcmtlci9zZXQtbG9nZ2VyLWxldmVsIFsxIDJdICJteV9pbmZvX2xvZ2dlciIgTGV2ZWwvSU5GTykpKSkpCisKIChkZWZ0ZXN0IHRlc3Qtd29ya2VyLWlzLWNvbm5lY3Rpb24tcmVhZHkKICAgKGxldCBbY29ubmVjdGlvbiAoTW9ja2l0by9tb2NrIENvbm5lY3Rpb25XaXRoU3RhdHVzKV0KICAgICAoLiAoTW9ja2l0by93aGVuICguc3RhdHVzIGNvbm5lY3Rpb24pKSB0aGVuUmV0dXJuIENvbm5lY3Rpb25XaXRoU3RhdHVzJFN0YXR1cy9SZWFkeSkKQEAgLTM0LDQgKzIwMyw0IEBACiAKICAgICAoLiAoTW9ja2l0by93aGVuICguc3RhdHVzIGNvbm5lY3Rpb24pKSB0aGVuUmV0dXJuIENvbm5lY3Rpb25XaXRoU3RhdHVzJFN0YXR1cy9DbG9zZWQpCiAgICAgKGlzICg9IGZhbHNlICh3b3JrZXIvaXMtY29ubmVjdGlvbi1yZWFkeSBjb25uZWN0aW9uKSkpCi0gICkpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorICApKQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS90ZXN0L2Nsai9vcmcvYXBhY2hlL3N0b3JtL3BhY2VtYWtlcl9zdGF0ZV9mYWN0b3J5X3Rlc3QuY2xqIGIvc3Rvcm0tY29yZS90ZXN0L2Nsai9vcmcvYXBhY2hlL3N0b3JtL3BhY2VtYWtlcl9zdGF0ZV9mYWN0b3J5X3Rlc3QuY2xqCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxM2FlODQKLS0tIC9kZXYvbnVsbAorKysgYi9zdG9ybS1jb3JlL3Rlc3QvY2xqL29yZy9hcGFjaGUvc3Rvcm0vcGFjZW1ha2VyX3N0YXRlX2ZhY3RvcnlfdGVzdC5jbGoKQEAgLTAsMCArMSwxNTAgQEAKKzs7IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKzs7IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorOzsgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKzs7IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKzs7IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKzs7ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKzs7IHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKzs7Cis7OyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKzs7Cis7OyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCis7OyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorOzsgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCis7OyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCis7OyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyhucyBvcmcuYXBhY2hlLnN0b3JtLnBhY2VtYWtlci1zdGF0ZS1mYWN0b3J5LXRlc3QKKyAgKDpyZXF1aXJlIFtjbG9qdXJlLnRlc3QgOnJlZmVyIDphbGxdCisgICAgICAgICAgICBbY29uanVyZS5jb3JlIDpyZWZlciA6YWxsXQorICAgICAgICAgICAgW29yZy5hcGFjaGUuc3Rvcm0ucGFjZW1ha2VyIFtwYWNlbWFrZXItc3RhdGUtZmFjdG9yeSA6YXMgcHNmXV0pCisgICg6aW1wb3J0IFtiYWNrdHlwZS5zdG9ybS5nZW5lcmF0ZWQKKyAgICAgICAgICAgIEhCRXhlY3V0aW9uRXhjZXB0aW9uIEhCTm9kZXMgSEJSZWNvcmRzCisgICAgICAgICAgICBIQlNlcnZlck1lc3NhZ2VUeXBlIEhCTWVzc2FnZSBIQk1lc3NhZ2VEYXRhIEhCUHVsc2VdCisgICAgICAgICAgIFtiYWNrdHlwZS5zdG9ybS5jbHVzdGVyIENsdXN0ZXJTdGF0ZUNvbnRleHRdCisgICAgICAgICAgIFtvcmcubW9ja2l0byBNb2NraXRvIE1hdGNoZXJzXSkpCisKKyhkZWZuLSBzdHJpbmctdG8tYnl0ZXMgW3N0cmluZ10KKyAgKGJ5dGUtYXJyYXkgKG1hcCBpbnQgc3RyaW5nKSkpCisKKyhkZWZuLSBieXRlcy10by1zdHJpbmcgW2J5dGV6XQorICAoYXBwbHkgc3RyIChtYXAgY2hhciBieXRleikpKQorCisoZGVmcHJvdG9jb2wgc2VuZC1jYXB0dXJlCisgIChzZW5kIFt0aGlzIHNvbWV0aGluZ10pCisgIChjaGVjay1jYXB0dXJlZCBbdGhpc10pKQorCisoZGVmbi0gbWFrZS1zZW5kLWNhcHR1cmUgW3Jlc3BvbnNlXQorICAobGV0IFtjYXB0dXJlZCAoYXRvbSBuaWwpXQorICAgIChyZWlmeSBzZW5kLWNhcHR1cmUKKyAgICAgIChzZW5kIFt0aGlzIHNvbWV0aGluZ10gKHJlc2V0ISBjYXB0dXJlZCBzb21ldGhpbmcpIHJlc3BvbnNlKQorICAgICAgKGNoZWNrLWNhcHR1cmVkIFt0aGlzXSBAY2FwdHVyZWQpKSkpCisKKyhkZWZtYWNybyB3aXRoLW1vY2stcGFjZW1ha2VyLWNsaWVudC1hbmQtc3RhdGUgW2NsaWVudCBzdGF0ZSByZXNwb25zZSAmIGJvZHldCisgIGAobGV0IFt+Y2xpZW50IChtYWtlLXNlbmQtY2FwdHVyZSB+cmVzcG9uc2UpXQorICAgICAoc3R1YmJpbmcgW3BzZi9tYWtlWktTdGF0ZSBuaWwKKyAgICAgICAgICAgICAgICBwc2YvbWFrZUNsaWVudCB+Y2xpZW50XQorICAgICAgICAgICAgICAgKGxldCBbfnN0YXRlIChwc2YvLW1rU3RhdGUgbmlsIG5pbCBuaWwgbmlsIChDbHVzdGVyU3RhdGVDb250ZXh0LikpXQorICAgICAgICAgICAgICAgICB+QGJvZHkpKSkpCisKKworKGRlZnRlc3QgcGFjZW1ha2VyX3N0YXRlX3NldF93b3JrZXJfaGIKKyAgKHRlc3RpbmcgInNldF93b3JrZXJfaGIiCisgICAgKHdpdGgtbW9jay1wYWNlbWFrZXItY2xpZW50LWFuZC1zdGF0ZQorICAgICAgY2xpZW50IHN0YXRlCisgICAgICAoSEJNZXNzYWdlLiBIQlNlcnZlck1lc3NhZ2VUeXBlL1NFTkRfUFVMU0VfUkVTUE9OU0UgbmlsKQorCisgICAgICAoLnNldF93b3JrZXJfaGIgc3RhdGUgIi9mb28iIChzdHJpbmctdG8tYnl0ZXMgImRhdGEiKSBuaWwpCisgICAgICAobGV0IFtzZW50ICguY2hlY2stY2FwdHVyZWQgY2xpZW50KQorICAgICAgICAgICAgcHVsc2UgKC5nZXRfcHVsc2UgKC5nZXRfZGF0YSBzZW50KSldCisgICAgICAgIChpcyAoPSAoLmdldF90eXBlIHNlbnQpIEhCU2VydmVyTWVzc2FnZVR5cGUvU0VORF9QVUxTRSkpCisgICAgICAgIChpcyAoPSAoLmdldF9pZCBwdWxzZSkgIi9mb28iKSkKKyAgICAgICAgKGlzICg9IChieXRlcy10by1zdHJpbmcgKC5nZXRfZGV0YWlscyBwdWxzZSkpICJkYXRhIikpKSkpCisKKyAgKHRlc3RpbmcgInNldF93b3JrZXJfaGIiCisgICAgKHdpdGgtbW9jay1wYWNlbWFrZXItY2xpZW50LWFuZC1zdGF0ZQorICAgICAgY2xpZW50IHN0YXRlCisgICAgICAoSEJNZXNzYWdlLiBIQlNlcnZlck1lc3NhZ2VUeXBlL1NFTkRfUFVMU0UgbmlsKQorCisgICAgICAoaXMgKHRocm93bj8gSEJFeGVjdXRpb25FeGNlcHRpb24gICAgICAKKyAgICAgICAgICAgICAgICAgICAoLnNldF93b3JrZXJfaGIgc3RhdGUgIi9mb28iIChzdHJpbmctdG8tYnl0ZXMgImRhdGEiKSBuaWwpKSkpKSkKKworICAgICAgCisKKyhkZWZ0ZXN0IHBhY2VtYWtlcl9zdGF0ZV9kZWxldGVfd29ya2VyX2hiCisgICh0ZXN0aW5nICJkZWxldGVfd29ya2VyX2hiIgorICAgICh3aXRoLW1vY2stcGFjZW1ha2VyLWNsaWVudC1hbmQtc3RhdGUKKyAgICAgIGNsaWVudCBzdGF0ZQorICAgICAgKEhCTWVzc2FnZS4gSEJTZXJ2ZXJNZXNzYWdlVHlwZS9ERUxFVEVfUEFUSF9SRVNQT05TRSBuaWwpCisKKyAgICAgICguZGVsZXRlX3dvcmtlcl9oYiBzdGF0ZSAiL2Zvby9iYXIiKQorICAgICAgKGxldCBbc2VudCAoLmNoZWNrLWNhcHR1cmVkIGNsaWVudCldCisgICAgICAgIChpcyAoPSAoLmdldF90eXBlIHNlbnQpIEhCU2VydmVyTWVzc2FnZVR5cGUvREVMRVRFX1BBVEgpKQorICAgICAgICAoaXMgKD0gKC5nZXRfcGF0aCAoLmdldF9kYXRhIHNlbnQpKSAiL2Zvby9iYXIiKSkpKSkKKworICAgICh0ZXN0aW5nICJkZWxldGVfd29ya2VyX2hiIgorICAgICAgKHdpdGgtbW9jay1wYWNlbWFrZXItY2xpZW50LWFuZC1zdGF0ZQorICAgICAgICBjbGllbnQgc3RhdGUKKyAgICAgICAgKEhCTWVzc2FnZS4gSEJTZXJ2ZXJNZXNzYWdlVHlwZS9ERUxFVEVfUEFUSCBuaWwpCisgICAgICAgIAorICAgICAgICAoaXMgKHRocm93bj8gSEJFeGVjdXRpb25FeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICguZGVsZXRlX3dvcmtlcl9oYiBzdGF0ZSAiL2Zvby9iYXIiKSkpKSkpCisKKyhkZWZ0ZXN0IHBhY2VtYWtlcl9zdGF0ZV9nZXRfd29ya2VyX2hiCisgICh0ZXN0aW5nICJnZXRfd29ya2VyX2hiIgorICAgICh3aXRoLW1vY2stcGFjZW1ha2VyLWNsaWVudC1hbmQtc3RhdGUKKyAgICAgIGNsaWVudCBzdGF0ZQorICAgICAgKEhCTWVzc2FnZS4gSEJTZXJ2ZXJNZXNzYWdlVHlwZS9HRVRfUFVMU0VfUkVTUE9OU0UKKyAgICAgICAgICAgICAgICAoSEJNZXNzYWdlRGF0YS9wdWxzZQorICAgICAgICAgICAgICAgICAoZG90byAoSEJQdWxzZS4pCisgICAgICAgICAgICAgICAgICAgKC5zZXRfaWQgIi9mb28iKQorICAgICAgICAgICAgICAgICAgICguc2V0X2RldGFpbHMgKHN0cmluZy10by1ieXRlcyAic29tZSBkYXRhIikpKSkpCisKKyAgICAgICguZ2V0X3dvcmtlcl9oYiBzdGF0ZSAiL2ZvbyIgZmFsc2UpCisgICAgICAobGV0IFtzZW50ICguY2hlY2stY2FwdHVyZWQgY2xpZW50KV0KKyAgICAgICAgKGlzICg9ICguZ2V0X3R5cGUgc2VudCkgSEJTZXJ2ZXJNZXNzYWdlVHlwZS9HRVRfUFVMU0UpKQorICAgICAgICAoaXMgKD0gKC5nZXRfcGF0aCAoLmdldF9kYXRhIHNlbnQpKSAiL2ZvbyIpKSkpKQorCisgICh0ZXN0aW5nICJnZXRfd29ya2VyX2hiIC0gZmFpbCAoYmFkIHJlc3BvbnNlKSIKKyAgICAod2l0aC1tb2NrLXBhY2VtYWtlci1jbGllbnQtYW5kLXN0YXRlCisgICAgICBjbGllbnQgc3RhdGUKKyAgICAgIChIQk1lc3NhZ2UuIEhCU2VydmVyTWVzc2FnZVR5cGUvR0VUX1BVTFNFIG5pbCkKKyAgICAgIAorICAgICAgKGlzICh0aHJvd24/IEhCRXhlY3V0aW9uRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgKC5nZXRfd29ya2VyX2hiIHN0YXRlICIvZm9vIiBmYWxzZSkpKSkpCisgIAorICAodGVzdGluZyAiZ2V0X3dvcmtlcl9oYiAtIGZhaWwgKGJhZCBkYXRhKSIKKyAgICAod2l0aC1tb2NrLXBhY2VtYWtlci1jbGllbnQtYW5kLXN0YXRlCisgICAgICBjbGllbnQgc3RhdGUKKyAgICAgIChIQk1lc3NhZ2UuIEhCU2VydmVyTWVzc2FnZVR5cGUvR0VUX1BVTFNFX1JFU1BPTlNFIG5pbCkKKyAgICAgIAorICAgICAgKGlzICh0aHJvd24/IEhCRXhlY3V0aW9uRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgKC5nZXRfd29ya2VyX2hiIHN0YXRlICIvZm9vIiBmYWxzZSkpKSkpKQorCisoZGVmdGVzdCBwYWNlbWFrZXJfc3RhdGVfZ2V0X3dvcmtlcl9oYl9jaGlsZHJlbgorICAodGVzdGluZyAiZ2V0X3dvcmtlcl9oYl9jaGlsZHJlbiIKKyAgICAod2l0aC1tb2NrLXBhY2VtYWtlci1jbGllbnQtYW5kLXN0YXRlCisgICAgICBjbGllbnQgc3RhdGUKKyAgICAgIChIQk1lc3NhZ2UuIEhCU2VydmVyTWVzc2FnZVR5cGUvR0VUX0FMTF9OT0RFU19GT1JfUEFUSF9SRVNQT05TRQorICAgICAgICAgICAgICAgIChIQk1lc3NhZ2VEYXRhL25vZGVzCisgICAgICAgICAgICAgICAgIChIQk5vZGVzLiBbXSkpKQorCisgICAgICAoLmdldF93b3JrZXJfaGJfY2hpbGRyZW4gc3RhdGUgIi9mb28iIGZhbHNlKQorICAgICAgKGxldCBbc2VudCAoLmNoZWNrLWNhcHR1cmVkIGNsaWVudCldCisgICAgICAgIChpcyAoPSAoLmdldF90eXBlIHNlbnQpIEhCU2VydmVyTWVzc2FnZVR5cGUvR0VUX0FMTF9OT0RFU19GT1JfUEFUSCkpCisgICAgICAgIChpcyAoPSAoLmdldF9wYXRoICguZ2V0X2RhdGEgc2VudCkpICIvZm9vIikpKSkpCisKKyAgKHRlc3RpbmcgImdldF93b3JrZXJfaGJfY2hpbGRyZW4gLSBmYWlsIChiYWQgcmVzcG9uc2UpIgorICAgICh3aXRoLW1vY2stcGFjZW1ha2VyLWNsaWVudC1hbmQtc3RhdGUKKyAgICAgIGNsaWVudCBzdGF0ZQorICAgICAgKEhCTWVzc2FnZS4gSEJTZXJ2ZXJNZXNzYWdlVHlwZS9ERUxFVEVfUEFUSCBuaWwpCisKKyAgICAgIChpcyAodGhyb3duPyBIQkV4ZWN1dGlvbkV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICguZ2V0X3dvcmtlcl9oYl9jaGlsZHJlbiBzdGF0ZSAiL2ZvbyIgZmFsc2UpKSkpKQorCisgICAgKHRlc3RpbmcgImdldF93b3JrZXJfaGJfY2hpbGRyZW4gLSBmYWlsIChiYWQgZGF0YSkiCisgICAgKHdpdGgtbW9jay1wYWNlbWFrZXItY2xpZW50LWFuZC1zdGF0ZQorICAgICAgY2xpZW50IHN0YXRlCisgICAgICAoSEJNZXNzYWdlLiBIQlNlcnZlck1lc3NhZ2VUeXBlL0dFVF9BTExfTk9ERVNfRk9SX1BBVEhfUkVTUE9OU0UgbmlsKQorICAgICAgCisgICAgICAoaXMgKHRocm93bj8gSEJFeGVjdXRpb25FeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAoLmdldF93b3JrZXJfaGJfY2hpbGRyZW4gc3RhdGUgIi9mb28iIGZhbHNlKSkpKSkpCmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3Rlc3QvY2xqL29yZy9hcGFjaGUvc3Rvcm0vcGFjZW1ha2VyX3Rlc3QuY2xqIGIvc3Rvcm0tY29yZS90ZXN0L2Nsai9vcmcvYXBhY2hlL3N0b3JtL3BhY2VtYWtlcl90ZXN0LmNsagpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTg3OTIzCi0tLSAvZGV2L251bGwKKysrIGIvc3Rvcm0tY29yZS90ZXN0L2Nsai9vcmcvYXBhY2hlL3N0b3JtL3BhY2VtYWtlcl90ZXN0LmNsagpAQCAtMCwwICsxLDI0MiBAQAorOzsgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorOzsgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCis7OyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorOzsgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorOzsgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorOzsgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorOzsgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorOzsKKzs7IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorOzsKKzs7IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKzs7IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCis7OyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKzs7IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKzs7IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKG5zIG9yZy5hcGFjaGUuc3Rvcm0ucGFjZW1ha2VyLXRlc3QKKyAgKDpyZXF1aXJlIFtjbG9qdXJlLnRlc3QgOnJlZmVyIDphbGxdCisgICAgICAgICAgICBbb3JnLmFwYWNoZS5zdG9ybS5wYWNlbWFrZXIgW3BhY2VtYWtlciA6YXMgcGFjZW1ha2VyXV0KKyAgICAgICAgICAgIFtjb25qdXJlLmNvcmUgOmFzIGNvbmp1cmVdKQorICAoOmltcG9ydCBbYmFja3R5cGUuc3Rvcm0uZ2VuZXJhdGVkCisgICAgICAgICAgICBIQkV4ZWN1dGlvbkV4Y2VwdGlvbiBIQlNlcnZlck1lc3NhZ2VUeXBlCisgICAgICAgICAgICBIQk1lc3NhZ2UgSEJNZXNzYWdlRGF0YSBIQlB1bHNlXSkpCisKKyhkZWZuLSBtZXNzYWdlLXdpdGgtcmFuZC1pZCBbdHlwZSBkYXRhXQorICAobGV0IFttaWQgKHJhbmQtaW50IDEwMDApCisgICAgICAgIG1lc3NhZ2UgKEhCTWVzc2FnZS4gdHlwZSBkYXRhKV0KKyAgICAoLnNldF9tZXNzYWdlX2lkIG1lc3NhZ2UgbWlkKQorICAgIFttZXNzYWdlIG1pZF0pKQorCisoZGVmbi0gc3RyaW5nLXRvLWJ5dGVzIFtzdHJpbmddCisgIChieXRlLWFycmF5IChtYXAgaW50IHN0cmluZykpKQorCisoZGVmbi0gYnl0ZXMtdG8tc3RyaW5nIFtieXRlel0KKyAgKGFwcGx5IHN0ciAobWFwIGNoYXIgYnl0ZXopKSkKKworKGRlZm4tIG1ha2Vub2RlIFtoYW5kbGVyIHBhdGhdCisgICguaGFuZGxlTWVzc2FnZSBoYW5kbGVyCisgICAgICAgICAgICAgICAgICAoSEJNZXNzYWdlLgorICAgICAgICAgICAgICAgICAgIEhCU2VydmVyTWVzc2FnZVR5cGUvU0VORF9QVUxTRQorICAgICAgICAgICAgICAgICAgIChIQk1lc3NhZ2VEYXRhL3B1bHNlCisgICAgICAgICAgICAgICAgICAgIChkb3RvIChIQlB1bHNlLikKKyAgICAgICAgICAgICAgICAgICAgICAoLnNldF9pZCBwYXRoKQorICAgICAgICAgICAgICAgICAgICAgICguc2V0X2RldGFpbHMgKHN0cmluZy10by1ieXRlcyAibm90aGluZyIpKSkpKQorICAgICAgICAgICAgICAgICAgdHJ1ZSkpCisKKyhkZWZ0ZXN0IHBhY2VtYWtlci1zZXJ2ZXItY3JlYXRlLXBhdGgKKyAgKGNvbmp1cmUvc3R1YmJpbmcKKyAgIFtwYWNlbWFrZXIvcmVnaXN0ZXIgbmlsXQorICAgKGxldCBbaGFuZGxlciAocGFjZW1ha2VyL21rLWhhbmRsZXIge30pXQorICAgICAodGVzdGluZyAiQ1JFQVRFX1BBVEgiCisgICAgICAgKGxldCBbW21lc3NhZ2UgbWlkXSAobWVzc2FnZS13aXRoLXJhbmQtaWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQlNlcnZlck1lc3NhZ2VUeXBlL0NSRUFURV9QQVRICisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEhCTWVzc2FnZURhdGEvcGF0aCAiL3Rlc3RwYXRoIikpCisgICAgICAgICAgICAgcmVzcG9uc2UgKC5oYW5kbGVNZXNzYWdlIGhhbmRsZXIgbWVzc2FnZSB0cnVlKV0KKyAgICAgICAgIChpcyAoPSAoLmdldF9tZXNzYWdlX2lkIHJlc3BvbnNlKSBtaWQpKQorICAgICAgICAgKGlzICg9ICguZ2V0X3R5cGUgcmVzcG9uc2UpIEhCU2VydmVyTWVzc2FnZVR5cGUvQ1JFQVRFX1BBVEhfUkVTUE9OU0UpKQorICAgICAgICAgKGlzICg9ICguZ2V0X2RhdGEgcmVzcG9uc2UpIG5pbCkpKSkpKSkKKworKGRlZnRlc3QgcGFjZW1ha2VyLXNlcnZlci1leGlzdHMKKyAgKGNvbmp1cmUvc3R1YmJpbmcKKyAgIFtwYWNlbWFrZXIvcmVnaXN0ZXIgbmlsXQorICAgKGxldCBbaGFuZGxlciAocGFjZW1ha2VyL21rLWhhbmRsZXIge30pXQorICAgICAodGVzdGluZyAiRVhJU1RTIC0gZmFsc2UiCisgICAgICAgKGxldCBbW21lc3NhZ2UgbWlkXSAobWVzc2FnZS13aXRoLXJhbmQtaWQgSEJTZXJ2ZXJNZXNzYWdlVHlwZS9FWElTVFMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSEJNZXNzYWdlRGF0YS9wYXRoICIvdGVzdHBhdGgiKSkKKyAgICAgICAgICAgICBiYWQtcmVzcG9uc2UgKC5oYW5kbGVNZXNzYWdlIGhhbmRsZXIgbWVzc2FnZSBmYWxzZSkKKyAgICAgICAgICAgICBnb29kLXJlc3BvbnNlICguaGFuZGxlTWVzc2FnZSBoYW5kbGVyIG1lc3NhZ2UgdHJ1ZSldCisgICAgICAgICAoaXMgKD0gKC5nZXRfbWVzc2FnZV9pZCBiYWQtcmVzcG9uc2UpIG1pZCkpCisgICAgICAgICAoaXMgKD0gKC5nZXRfdHlwZSBiYWQtcmVzcG9uc2UpIEhCU2VydmVyTWVzc2FnZVR5cGUvTk9UX0FVVEhPUklaRUQpKQorCisgICAgICAgICAoaXMgKD0gKC5nZXRfbWVzc2FnZV9pZCBnb29kLXJlc3BvbnNlKSBtaWQpKQorICAgICAgICAgKGlzICg9ICguZ2V0X3R5cGUgZ29vZC1yZXNwb25zZSkgSEJTZXJ2ZXJNZXNzYWdlVHlwZS9FWElTVFNfUkVTUE9OU0UpKQorICAgICAgICAgKGlzICg9ICguZ2V0X2Jvb2x2YWwgKC5nZXRfZGF0YSBnb29kLXJlc3BvbnNlKSkgZmFsc2UpKSkpCisKKyAgICAgKHRlc3RpbmcgIkVYSVNUUyAtIHRydWUiCisgICAgICAgKGxldCBbcGF0aCAiL2V4aXN0c19wYXRoIgorICAgICAgICAgICAgIGRhdGEtc3RyaW5nICJwdWxzZSBkYXRhIl0KKyAgICAgICAgIChsZXQgW1tzZW5kIF9dIChtZXNzYWdlLXdpdGgtcmFuZC1pZAorICAgICAgICAgICAgICAgICAgICAgICAgIEhCU2VydmVyTWVzc2FnZVR5cGUvU0VORF9QVUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgIChIQk1lc3NhZ2VEYXRhL3B1bHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgIChkb3RvIChIQlB1bHNlLikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLnNldF9pZCBwYXRoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICguc2V0X2RldGFpbHMgKHN0cmluZy10by1ieXRlcyBkYXRhLXN0cmluZykpKSkpCisgICAgICAgICAgICAgICBfICguaGFuZGxlTWVzc2FnZSBoYW5kbGVyIHNlbmQgdHJ1ZSkKKyAgICAgICAgICAgICAgIFttZXNzYWdlIG1pZF0gKG1lc3NhZ2Utd2l0aC1yYW5kLWlkIEhCU2VydmVyTWVzc2FnZVR5cGUvRVhJU1RTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSEJNZXNzYWdlRGF0YS9wYXRoIHBhdGgpKQorICAgICAgICAgICAgICAgYmFkLXJlc3BvbnNlICguaGFuZGxlTWVzc2FnZSBoYW5kbGVyIG1lc3NhZ2UgZmFsc2UpCisgICAgICAgICAgICAgICBnb29kLXJlc3BvbnNlICguaGFuZGxlTWVzc2FnZSBoYW5kbGVyIG1lc3NhZ2UgdHJ1ZSldCisgICAgICAgICAgIChpcyAoPSAoLmdldF9tZXNzYWdlX2lkIGJhZC1yZXNwb25zZSkgbWlkKSkKKyAgICAgICAgICAgKGlzICg9ICguZ2V0X3R5cGUgYmFkLXJlc3BvbnNlKSBIQlNlcnZlck1lc3NhZ2VUeXBlL05PVF9BVVRIT1JJWkVEKSkKKworICAgICAgICAgICAoaXMgKD0gKC5nZXRfbWVzc2FnZV9pZCBnb29kLXJlc3BvbnNlKSBtaWQpKQorICAgICAgICAgICAoaXMgKD0gKC5nZXRfdHlwZSBnb29kLXJlc3BvbnNlKSBIQlNlcnZlck1lc3NhZ2VUeXBlL0VYSVNUU19SRVNQT05TRSkpCisgICAgICAgICAgIChpcyAoPSAoLmdldF9ib29sdmFsICguZ2V0X2RhdGEgZ29vZC1yZXNwb25zZSkpIHRydWUpKSkpKSkpKQorCisoZGVmdGVzdCBwYWNlbWFrZXItc2VydmVyLXNlbmQtcHVsc2UtZ2V0LXB1bHNlCisgIChjb25qdXJlL3N0dWJiaW5nCisgICBbcGFjZW1ha2VyL3JlZ2lzdGVyIG5pbF0KKyAgIChsZXQgW2hhbmRsZXIgKHBhY2VtYWtlci9tay1oYW5kbGVyIHt9KV0KKyAgICAgKHRlc3RpbmcgIlNFTkRfUFVMU0UgLSBHRVRfUFVMU0UiCisgICAgICAgKGxldCBbcGF0aCAiL3B1bHNlcGF0aCIKKyAgICAgICAgICAgICBkYXRhLXN0cmluZyAicHVsc2UgZGF0YSJdCisgICAgICAgICAobGV0IFtbbWVzc2FnZSBtaWRdIChtZXNzYWdlLXdpdGgtcmFuZC1pZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEJTZXJ2ZXJNZXNzYWdlVHlwZS9TRU5EX1BVTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSEJNZXNzYWdlRGF0YS9wdWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkb3RvIChIQlB1bHNlLikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICguc2V0X2lkIHBhdGgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLnNldF9kZXRhaWxzIChzdHJpbmctdG8tYnl0ZXMgZGF0YS1zdHJpbmcpKSkpKQorICAgICAgICAgICAgICAgcmVzcG9uc2UgKC5oYW5kbGVNZXNzYWdlIGhhbmRsZXIgbWVzc2FnZSB0cnVlKV0KKyAgICAgICAgICAgKGlzICg9ICguZ2V0X21lc3NhZ2VfaWQgcmVzcG9uc2UpIG1pZCkpCisgICAgICAgICAgIChpcyAoPSAoLmdldF90eXBlIHJlc3BvbnNlKSBIQlNlcnZlck1lc3NhZ2VUeXBlL1NFTkRfUFVMU0VfUkVTUE9OU0UpKQorICAgICAgICAgICAoaXMgKD0gKC5nZXRfZGF0YSByZXNwb25zZSkgbmlsKSkpCisgICAgICAgICAobGV0IFtbbWVzc2FnZSBtaWRdIChtZXNzYWdlLXdpdGgtcmFuZC1pZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEJTZXJ2ZXJNZXNzYWdlVHlwZS9HRVRfUFVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChIQk1lc3NhZ2VEYXRhL3BhdGggcGF0aCkpCisgICAgICAgICAgICAgICByZXNwb25zZSAoLmhhbmRsZU1lc3NhZ2UgaGFuZGxlciBtZXNzYWdlIHRydWUpXQorICAgICAgICAgICAoaXMgKD0gKC5nZXRfbWVzc2FnZV9pZCByZXNwb25zZSkgbWlkKSkKKyAgICAgICAgICAgKGlzICg9ICguZ2V0X3R5cGUgcmVzcG9uc2UpIEhCU2VydmVyTWVzc2FnZVR5cGUvR0VUX1BVTFNFX1JFU1BPTlNFKSkKKyAgICAgICAgICAgKGlzICg9IChieXRlcy10by1zdHJpbmcgKC5nZXRfZGV0YWlscyAoLmdldF9wdWxzZSAoLmdldF9kYXRhIHJlc3BvbnNlKSkpKSBkYXRhLXN0cmluZykpKSkpKSkpCisKKyhkZWZ0ZXN0IHBhY2VtYWtlci1zZXJ2ZXItZ2V0LWFsbC1wdWxzZS1mb3ItcGF0aAorICAoY29uanVyZS9zdHViYmluZworICAgW3BhY2VtYWtlci9yZWdpc3RlciBuaWxdCisgICAobGV0IFtoYW5kbGVyIChwYWNlbWFrZXIvbWstaGFuZGxlciB7fSldCisgICAgICh0ZXN0aW5nICJHRVRfQUxMX1BVTFNFX0ZPUl9QQVRIIgorICAgICAgIChsZXQgW1ttZXNzYWdlIG1pZF0gKG1lc3NhZ2Utd2l0aC1yYW5kLWlkIEhCU2VydmVyTWVzc2FnZVR5cGUvR0VUX0FMTF9QVUxTRV9GT1JfUEFUSAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChIQk1lc3NhZ2VEYXRhL3BhdGggIi90ZXN0cGF0aCIpKQorICAgICAgICAgICAgIGJhZC1yZXNwb25zZSAoLmhhbmRsZU1lc3NhZ2UgaGFuZGxlciBtZXNzYWdlIGZhbHNlKQorICAgICAgICAgICAgIGdvb2QtcmVzcG9uc2UgKC5oYW5kbGVNZXNzYWdlIGhhbmRsZXIgbWVzc2FnZSB0cnVlKV0KKyAgICAgICAgIChpcyAoPSAoLmdldF9tZXNzYWdlX2lkIGJhZC1yZXNwb25zZSkgbWlkKSkKKyAgICAgICAgIChpcyAoPSAoLmdldF90eXBlIGJhZC1yZXNwb25zZSkgSEJTZXJ2ZXJNZXNzYWdlVHlwZS9OT1RfQVVUSE9SSVpFRCkpCisKKyAgICAgICAgIChpcyAoPSAoLmdldF9tZXNzYWdlX2lkIGdvb2QtcmVzcG9uc2UpIG1pZCkpCisgICAgICAgICAoaXMgKD0gKC5nZXRfdHlwZSBnb29kLXJlc3BvbnNlKSBIQlNlcnZlck1lc3NhZ2VUeXBlL0dFVF9BTExfUFVMU0VfRk9SX1BBVEhfUkVTUE9OU0UpKQorICAgICAgICAgKGlzICg9ICguZ2V0X2RhdGEgZ29vZC1yZXNwb25zZSkgbmlsKSkpKSkpKQorCisoZGVmdGVzdCBwYWNlbWFrZXItc2VydmVyLWdldC1hbGwtbm9kZXMtZm9yLXBhdGgKKyAgKGNvbmp1cmUvc3R1YmJpbmcKKyAgIFtwYWNlbWFrZXIvcmVnaXN0ZXIgbmlsXQorICAgKGxldCBbaGFuZGxlciAocGFjZW1ha2VyL21rLWhhbmRsZXIge30pXQorICAgICAodGVzdGluZyAiR0VUX0FMTF9OT0RFU19GT1JfUEFUSCIKKyAgICAgICAobWFrZW5vZGUgaGFuZGxlciAiL3NvbWUtcm9vdC1wYXRoL2ZvbyIpCisgICAgICAgKG1ha2Vub2RlIGhhbmRsZXIgIi9zb21lLXJvb3QtcGF0aC9iYXIiKQorICAgICAgIChtYWtlbm9kZSBoYW5kbGVyICIvc29tZS1yb290LXBhdGgvYmF6IikKKyAgICAgICAobWFrZW5vZGUgaGFuZGxlciAiL3NvbWUtcm9vdC1wYXRoL2JvbyIpCisgICAgICAgKGxldCBbW21lc3NhZ2UgbWlkXSAobWVzc2FnZS13aXRoLXJhbmQtaWQgSEJTZXJ2ZXJNZXNzYWdlVHlwZS9HRVRfQUxMX05PREVTX0ZPUl9QQVRICisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEhCTWVzc2FnZURhdGEvcGF0aCAiL3NvbWUtcm9vdC1wYXRoIikpCisgICAgICAgICAgICAgYmFkLXJlc3BvbnNlICguaGFuZGxlTWVzc2FnZSBoYW5kbGVyIG1lc3NhZ2UgZmFsc2UpCisgICAgICAgICAgICAgZ29vZC1yZXNwb25zZSAoLmhhbmRsZU1lc3NhZ2UgaGFuZGxlciBtZXNzYWdlIHRydWUpCisgICAgICAgICAgICAgaWRzIChpbnRvICN7fSAoLmdldF9wdWxzZUlkcyAoLmdldF9ub2RlcyAoLmdldF9kYXRhIGdvb2QtcmVzcG9uc2UpKSkpXQorICAgICAgICAgKGlzICg9ICguZ2V0X21lc3NhZ2VfaWQgYmFkLXJlc3BvbnNlKSBtaWQpKQorICAgICAgICAgKGlzICg9ICguZ2V0X3R5cGUgYmFkLXJlc3BvbnNlKSBIQlNlcnZlck1lc3NhZ2VUeXBlL05PVF9BVVRIT1JJWkVEKSkKKworICAgICAgICAgKGlzICg9ICguZ2V0X21lc3NhZ2VfaWQgZ29vZC1yZXNwb25zZSkgbWlkKSkKKyAgICAgICAgIChpcyAoPSAoLmdldF90eXBlIGdvb2QtcmVzcG9uc2UpIEhCU2VydmVyTWVzc2FnZVR5cGUvR0VUX0FMTF9OT0RFU19GT1JfUEFUSF9SRVNQT05TRSkpCisgICAgICAgICAoaXMgKGNvbnRhaW5zPyBpZHMgImZvbyIpKQorICAgICAgICAgKGlzIChjb250YWlucz8gaWRzICJiYXIiKSkKKyAgICAgICAgIChpcyAoY29udGFpbnM/IGlkcyAiYmF6IikpCisgICAgICAgICAoaXMgKGNvbnRhaW5zPyBpZHMgImJvbyIpKSkKKworICAgICAgIChtYWtlbm9kZSBoYW5kbGVyICIvc29tZS9kZWVwZXIvcGF0aC9mb28iKQorICAgICAgIChtYWtlbm9kZSBoYW5kbGVyICIvc29tZS9kZWVwZXIvcGF0aC9iYXIiKQorICAgICAgIChtYWtlbm9kZSBoYW5kbGVyICIvc29tZS9kZWVwZXIvcGF0aC9iYXoiKQorICAgICAgIChsZXQgW1ttZXNzYWdlIG1pZF0gKG1lc3NhZ2Utd2l0aC1yYW5kLWlkIEhCU2VydmVyTWVzc2FnZVR5cGUvR0VUX0FMTF9OT0RFU19GT1JfUEFUSAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChIQk1lc3NhZ2VEYXRhL3BhdGggIi9zb21lL2RlZXBlci9wYXRoIikpCisgICAgICAgICAgICAgYmFkLXJlc3BvbnNlICguaGFuZGxlTWVzc2FnZSBoYW5kbGVyIG1lc3NhZ2UgZmFsc2UpCisgICAgICAgICAgICAgZ29vZC1yZXNwb25zZSAoLmhhbmRsZU1lc3NhZ2UgaGFuZGxlciBtZXNzYWdlIHRydWUpCisgICAgICAgICAgICAgaWRzIChpbnRvICN7fSAoLmdldF9wdWxzZUlkcyAoLmdldF9ub2RlcyAoLmdldF9kYXRhIGdvb2QtcmVzcG9uc2UpKSkpXQorICAgICAgICAgKGlzICg9ICguZ2V0X21lc3NhZ2VfaWQgYmFkLXJlc3BvbnNlKSBtaWQpKQorICAgICAgICAgKGlzICg9ICguZ2V0X3R5cGUgYmFkLXJlc3BvbnNlKSBIQlNlcnZlck1lc3NhZ2VUeXBlL05PVF9BVVRIT1JJWkVEKSkKKworICAgICAgICAgKGlzICg9ICguZ2V0X21lc3NhZ2VfaWQgZ29vZC1yZXNwb25zZSkgbWlkKSkKKyAgICAgICAgIChpcyAoPSAoLmdldF90eXBlIGdvb2QtcmVzcG9uc2UpIEhCU2VydmVyTWVzc2FnZVR5cGUvR0VUX0FMTF9OT0RFU19GT1JfUEFUSF9SRVNQT05TRSkpCisgICAgICAgICAoaXMgKGNvbnRhaW5zPyBpZHMgImZvbyIpKQorICAgICAgICAgKGlzIChjb250YWlucz8gaWRzICJiYXIiKSkKKyAgICAgICAgIChpcyAoY29udGFpbnM/IGlkcyAiYmF6IikpKSkpKSkKKworKGRlZnRlc3QgcGFjZW1ha2VyLXNlcnZlci1nZXQtcHVsc2UKKyAgKGNvbmp1cmUvc3R1YmJpbmcKKyAgIFtwYWNlbWFrZXIvcmVnaXN0ZXIgbmlsXQorICAgKGxldCBbaGFuZGxlciAocGFjZW1ha2VyL21rLWhhbmRsZXIge30pXQorICAgICAodGVzdGluZyAiR0VUX1BVTFNFIgorICAgICAgIChtYWtlbm9kZSBoYW5kbGVyICIvc29tZS1yb290L0dFVF9QVUxTRSIpCisgICAgICAgKGxldCBbW21lc3NhZ2UgbWlkXSAobWVzc2FnZS13aXRoLXJhbmQtaWQgSEJTZXJ2ZXJNZXNzYWdlVHlwZS9HRVRfUFVMU0UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSEJNZXNzYWdlRGF0YS9wYXRoICIvc29tZS1yb290L0dFVF9QVUxTRSIpKQorICAgICAgICAgICAgIGJhZC1yZXNwb25zZSAoLmhhbmRsZU1lc3NhZ2UgaGFuZGxlciBtZXNzYWdlIGZhbHNlKQorICAgICAgICAgICAgIGdvb2QtcmVzcG9uc2UgKC5oYW5kbGVNZXNzYWdlIGhhbmRsZXIgbWVzc2FnZSB0cnVlKQorICAgICAgICAgICAgIGdvb2QtcHVsc2UgKC5nZXRfcHVsc2UgKC5nZXRfZGF0YSBnb29kLXJlc3BvbnNlKSldCisgICAgICAgICAoaXMgKD0gKC5nZXRfbWVzc2FnZV9pZCBiYWQtcmVzcG9uc2UpIG1pZCkpCisgICAgICAgICAoaXMgKD0gKC5nZXRfdHlwZSBiYWQtcmVzcG9uc2UpIEhCU2VydmVyTWVzc2FnZVR5cGUvTk9UX0FVVEhPUklaRUQpKQorICAgICAgICAgKGlzICg9ICguZ2V0X2RhdGEgYmFkLXJlc3BvbnNlKSBuaWwpKQorCisgICAgICAgICAoaXMgKD0gKC5nZXRfbWVzc2FnZV9pZCBnb29kLXJlc3BvbnNlKSBtaWQpKQorICAgICAgICAgKGlzICg9ICguZ2V0X3R5cGUgZ29vZC1yZXNwb25zZSkgSEJTZXJ2ZXJNZXNzYWdlVHlwZS9HRVRfUFVMU0VfUkVTUE9OU0UpKQorICAgICAgICAgKGlzICg9ICguZ2V0X2lkIGdvb2QtcHVsc2UpICIvc29tZS1yb290L0dFVF9QVUxTRSIpKQorICAgICAgICAgKGlzICg9IChieXRlcy10by1zdHJpbmcgKC5nZXRfZGV0YWlscyBnb29kLXB1bHNlKSkgIm5vdGhpbmciKSkpKSkpKQorCisoZGVmdGVzdCBwYWNlbWFrZXItc2VydmVyLWRlbGV0ZS1wYXRoCisgIChjb25qdXJlL3N0dWJiaW5nCisgICBbcGFjZW1ha2VyL3JlZ2lzdGVyIG5pbF0KKyAgIChsZXQgW2hhbmRsZXIgKHBhY2VtYWtlci9tay1oYW5kbGVyIHt9KV0KKyAgICAgKHRlc3RpbmcgIkRFTEVURV9QQVRIIgorICAgICAgIChtYWtlbm9kZSBoYW5kbGVyICIvc29tZS1yb290L0RFTEVURV9QQVRIL2ZvbyIpCisgICAgICAgKG1ha2Vub2RlIGhhbmRsZXIgIi9zb21lLXJvb3QvREVMRVRFX1BBVEgvYmFyIikKKyAgICAgICAobWFrZW5vZGUgaGFuZGxlciAiL3NvbWUtcm9vdC9ERUxFVEVfUEFUSC9iYXoiKQorICAgICAgIChtYWtlbm9kZSBoYW5kbGVyICIvc29tZS1yb290L0RFTEVURV9QQVRIL2JvbyIpCisgICAgICAgKGxldCBbW21lc3NhZ2UgbWlkXSAobWVzc2FnZS13aXRoLXJhbmQtaWQgSEJTZXJ2ZXJNZXNzYWdlVHlwZS9ERUxFVEVfUEFUSAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChIQk1lc3NhZ2VEYXRhL3BhdGggIi9zb21lLXJvb3QvREVMRVRFX1BBVEgiKSkKKyAgICAgICAgICAgICByZXNwb25zZSAoLmhhbmRsZU1lc3NhZ2UgaGFuZGxlciBtZXNzYWdlIHRydWUpXQorICAgICAgICAgKGlzICg9ICguZ2V0X21lc3NhZ2VfaWQgcmVzcG9uc2UpIG1pZCkpCisgICAgICAgICAoaXMgKD0gKC5nZXRfdHlwZSByZXNwb25zZSkgSEJTZXJ2ZXJNZXNzYWdlVHlwZS9ERUxFVEVfUEFUSF9SRVNQT05TRSkpCisgICAgICAgICAoaXMgKD0gKC5nZXRfZGF0YSByZXNwb25zZSkgbmlsKSkpCisgICAgICAgKGxldCBbW21lc3NhZ2UgbWlkXSAobWVzc2FnZS13aXRoLXJhbmQtaWQgSEJTZXJ2ZXJNZXNzYWdlVHlwZS9HRVRfQUxMX05PREVTX0ZPUl9QQVRICisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEhCTWVzc2FnZURhdGEvcGF0aCAiL3NvbWUtcm9vdC9ERUxFVEVfUEFUSCIpKQorICAgICAgICAgICAgIHJlc3BvbnNlICguaGFuZGxlTWVzc2FnZSBoYW5kbGVyIG1lc3NhZ2UgdHJ1ZSkKKyAgICAgICAgICAgICBpZHMgKGludG8gI3t9ICguZ2V0X3B1bHNlSWRzICguZ2V0X25vZGVzICguZ2V0X2RhdGEgcmVzcG9uc2UpKSkpXQorICAgICAgICAgKGlzICg9ICguZ2V0X21lc3NhZ2VfaWQgcmVzcG9uc2UpIG1pZCkpCisgICAgICAgICAoaXMgKD0gKC5nZXRfdHlwZSByZXNwb25zZSkgSEJTZXJ2ZXJNZXNzYWdlVHlwZS9HRVRfQUxMX05PREVTX0ZPUl9QQVRIX1JFU1BPTlNFKSkKKyAgICAgICAgIChpcyAoZW1wdHk/IGlkcykpKSkpKSkKKworKGRlZnRlc3QgcGFjZW1ha2VyLXNlcnZlci1kZWxldGUtcHVsc2UtaWQKKyAgKGNvbmp1cmUvc3R1YmJpbmcKKyAgIFtwYWNlbWFrZXIvcmVnaXN0ZXIgbmlsXQorICAgKGxldCBbaGFuZGxlciAocGFjZW1ha2VyL21rLWhhbmRsZXIge30pXQorICAgICAodGVzdGluZyAiREVMRVRFX1BVTFNFX0lEIgorICAgICAgIChtYWtlbm9kZSBoYW5kbGVyICIvc29tZS1yb290L0RFTEVURV9QVUxTRV9JRC9mb28iKQorICAgICAgIChtYWtlbm9kZSBoYW5kbGVyICIvc29tZS1yb290L0RFTEVURV9QVUxTRV9JRC9iYXIiKQorICAgICAgIChtYWtlbm9kZSBoYW5kbGVyICIvc29tZS1yb290L0RFTEVURV9QVUxTRV9JRC9iYXoiKQorICAgICAgIChtYWtlbm9kZSBoYW5kbGVyICIvc29tZS1yb290L0RFTEVURV9QVUxTRV9JRC9ib28iKQorICAgICAgIChsZXQgW1ttZXNzYWdlIG1pZF0gKG1lc3NhZ2Utd2l0aC1yYW5kLWlkIEhCU2VydmVyTWVzc2FnZVR5cGUvREVMRVRFX1BVTFNFX0lECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEhCTWVzc2FnZURhdGEvcGF0aCAiL3NvbWUtcm9vdC9ERUxFVEVfUFVMU0VfSUQvZm9vIikpCisgICAgICAgICAgICAgcmVzcG9uc2UgKC5oYW5kbGVNZXNzYWdlIGhhbmRsZXIgbWVzc2FnZSB0cnVlKV0KKyAgICAgICAgIChpcyAoPSAoLmdldF9tZXNzYWdlX2lkIHJlc3BvbnNlKSBtaWQpKQorICAgICAgICAgKGlzICg9ICguZ2V0X3R5cGUgcmVzcG9uc2UpIEhCU2VydmVyTWVzc2FnZVR5cGUvREVMRVRFX1BVTFNFX0lEX1JFU1BPTlNFKSkKKyAgICAgICAgIChpcyAoPSAoLmdldF9kYXRhIHJlc3BvbnNlKSBuaWwpKSkKKyAgICAgICAobGV0IFtbbWVzc2FnZSBtaWRdIChtZXNzYWdlLXdpdGgtcmFuZC1pZCBIQlNlcnZlck1lc3NhZ2VUeXBlL0dFVF9BTExfTk9ERVNfRk9SX1BBVEgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSEJNZXNzYWdlRGF0YS9wYXRoICIvc29tZS1yb290L0RFTEVURV9QVUxTRV9JRCIpKQorICAgICAgICAgICAgIHJlc3BvbnNlICguaGFuZGxlTWVzc2FnZSBoYW5kbGVyIG1lc3NhZ2UgdHJ1ZSkKKyAgICAgICAgICAgICBpZHMgKGludG8gI3t9ICguZ2V0X3B1bHNlSWRzICguZ2V0X25vZGVzICguZ2V0X2RhdGEgcmVzcG9uc2UpKSkpXQorICAgICAgICAgKGlzICg9ICguZ2V0X21lc3NhZ2VfaWQgcmVzcG9uc2UpIG1pZCkpCisgICAgICAgICAoaXMgKD0gKC5nZXRfdHlwZSByZXNwb25zZSkgSEJTZXJ2ZXJNZXNzYWdlVHlwZS9HRVRfQUxMX05PREVTX0ZPUl9QQVRIX1JFU1BPTlNFKSkKKyAgICAgICAgIChpcyAobm90IChjb250YWlucz8gaWRzICJmb28iKSkpKSkpKSkKZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvdGVzdC9qdm0vYmFja3R5cGUvc3Rvcm0vVGVzdENvbmZpZ1ZhbGlkYXRlLmphdmEgYi9zdG9ybS1jb3JlL3Rlc3QvanZtL2JhY2t0eXBlL3N0b3JtL1Rlc3RDb25maWdWYWxpZGF0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMTkzY2MKLS0tIC9kZXYvbnVsbAorKysgYi9zdG9ybS1jb3JlL3Rlc3QvanZtL2JhY2t0eXBlL3N0b3JtL1Rlc3RDb25maWdWYWxpZGF0ZS5qYXZhCkBAIC0wLDAgKzEsNjYwIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGJhY2t0eXBlLnN0b3JtOworCitpbXBvcnQgYmFja3R5cGUuc3Rvcm0udXRpbHMuVXRpbHM7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0udmFsaWRhdGlvbi5Db25maWdWYWxpZGF0aW9uOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnZhbGlkYXRpb24uQ29uZmlnVmFsaWRhdGlvbi4qOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnZhbGlkYXRpb24uQ29uZmlnVmFsaWRhdGlvbkFubm90YXRpb25zLio7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuc2xmNGouTG9nZ2VyOworaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5OworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworcHVibGljIGNsYXNzIFRlc3RDb25maWdWYWxpZGF0ZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoVGVzdENvbmZpZ1ZhbGlkYXRlLmNsYXNzKTsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdmFsaWRQYWNlbWFrZXJBdXRoVGVzdCgpIHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uLCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKKyAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBjb25mID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisgICAgICAgIGNvbmYucHV0KENvbmZpZy5QQUNFTUFLRVJfQVVUSF9NRVRIT0QsICJOT05FIik7CisgICAgICAgIENvbmZpZ1ZhbGlkYXRpb24udmFsaWRhdGVGaWVsZHMoY29uZik7CisgICAgICAgIGNvbmYucHV0KENvbmZpZy5QQUNFTUFLRVJfQVVUSF9NRVRIT0QsICJESUdFU1QiKTsKKyAgICAgICAgQ29uZmlnVmFsaWRhdGlvbi52YWxpZGF0ZUZpZWxkcyhjb25mKTsKKyAgICAgICAgY29uZi5wdXQoQ29uZmlnLlBBQ0VNQUtFUl9BVVRIX01FVEhPRCwgIktFUkJFUk9TIik7CisgICAgICAgIENvbmZpZ1ZhbGlkYXRpb24udmFsaWRhdGVGaWVsZHMoY29uZik7CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgaW52YWxpZFBhY2VtYWtlckF1dGhUZXN0KCkgdGhyb3dzIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIE5vU3VjaEZpZWxkRXhjZXB0aW9uLCBOb1N1Y2hNZXRob2RFeGNlcHRpb24sIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24geworICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbmYgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKyAgICAgICAgY29uZi5wdXQoQ29uZmlnLlBBQ0VNQUtFUl9BVVRIX01FVEhPRCwgImludmFsaWQiKTsKKyAgICAgICAgQ29uZmlnVmFsaWRhdGlvbi52YWxpZGF0ZUZpZWxkcyhjb25mKTsKKyAgICB9CisgICAgCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB2YWxpZENvbmZpZ1Rlc3QoKSB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgTm9TdWNoRmllbGRFeGNlcHRpb24sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7CisKKworICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbmYgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKyAgICAgICAgY29uZi5wdXQoQ29uZmlnLlNUT1JNX01FU1NBR0lOR19ORVRUWV9TT0NLRVRfQkFDS0xPRywgNSk7CisgICAgICAgIGNvbmYucHV0KENvbmZpZy5TVE9STV9NRVNTQUdJTkdfTkVUVFlfTUlOX1NMRUVQX01TLCA1MDApOworICAgICAgICBjb25mLnB1dChDb25maWcuU1RPUk1fTUVTU0FHSU5HX05FVFRZX0FVVEhFTlRJQ0FUSU9OLCB0cnVlKTsKKworICAgICAgICBDb25maWdWYWxpZGF0aW9uLnZhbGlkYXRlRmllbGRzKGNvbmYpOworICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIGludmFsaWRDb25maWdUZXN0KCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwgTm9TdWNoRmllbGRFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24geworICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbmYgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKyAgICAgICAgY29uZi5wdXQoQ29uZmlnLlNUT1JNX01FU1NBR0lOR19ORVRUWV9TT0NLRVRfQkFDS0xPRywgNSk7CisgICAgICAgIGNvbmYucHV0KENvbmZpZy5TVE9STV9NRVNTQUdJTkdfTkVUVFlfTUlOX1NMRUVQX01TLCA1MDApOworICAgICAgICBjb25mLnB1dChDb25maWcuU1RPUk1fTUVTU0FHSU5HX05FVFRZX0FVVEhFTlRJQ0FUSU9OLCAiaW52YWxpZCIpOworCisgICAgICAgIENvbmZpZ1ZhbGlkYXRpb24udmFsaWRhdGVGaWVsZHMoY29uZik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBkZWZhdWx0WWFtbFRlc3QoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uLCBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7CisgICAgICAgIE1hcCBjb25mID0gVXRpbHMucmVhZFN0b3JtQ29uZmlnKCk7CisgICAgICAgIENvbmZpZ1ZhbGlkYXRpb24udmFsaWRhdGVGaWVsZHMoY29uZik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9wb2xvZ3lXb3JrZXJzSXNJbnRlZ2VyKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwgTm9TdWNoRmllbGRFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24geworICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbmYgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKyAgICAgICAgY29uZi5wdXQoQ29uZmlnLlRPUE9MT0dZX1dPUktFUlMsIDQyKTsKKyAgICAgICAgQ29uZmlnVmFsaWRhdGlvbi52YWxpZGF0ZUZpZWxkcyhjb25mKTsKKworICAgICAgICBjb25mLnB1dChDb25maWcuVE9QT0xPR1lfV09SS0VSUywgMy4xNDE1OSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDb25maWdWYWxpZGF0aW9uLnZhbGlkYXRlRmllbGRzKGNvbmYpOworICAgICAgICAgICAgQXNzZXJ0LmZhaWwoIkV4cGVjdGVkIEV4Y2VwdGlvbiBub3QgVGhyb3duIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgeworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9wb2xvZ3lTdGF0c1NhbXBsZVJhdGVJc0Zsb2F0KCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwgTm9TdWNoRmllbGRFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24geworICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbmYgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKyAgICAgICAgY29uZi5wdXQoQ29uZmlnLlRPUE9MT0dZX1NUQVRTX1NBTVBMRV9SQVRFLCAwLjUpOworICAgICAgICBDb25maWdWYWxpZGF0aW9uLnZhbGlkYXRlRmllbGRzKGNvbmYpOworICAgICAgICBjb25mLnB1dChDb25maWcuVE9QT0xPR1lfU1RBVFNfU0FNUExFX1JBVEUsIDEwKTsKKyAgICAgICAgQ29uZmlnVmFsaWRhdGlvbi52YWxpZGF0ZUZpZWxkcyhjb25mKTsKKyAgICAgICAgY29uZi5wdXQoQ29uZmlnLlRPUE9MT0dZX1NUQVRTX1NBTVBMRV9SQVRFLCBEb3VibGUuTUFYX1ZBTFVFKTsKKyAgICAgICAgQ29uZmlnVmFsaWRhdGlvbi52YWxpZGF0ZUZpZWxkcyhjb25mKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJc29sYXRpb25TY2hlZHVsZXJNYWNoaW5lc0lzTWFwKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwgTm9TdWNoRmllbGRFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24geworICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbmYgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKyAgICAgICAgTWFwPFN0cmluZywgSW50ZWdlcj4gaXNvbGF0aW9uTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOworICAgICAgICBjb25mLnB1dChDb25maWcuSVNPTEFUSU9OX1NDSEVEVUxFUl9NQUNISU5FUywgaXNvbGF0aW9uTWFwKTsKKyAgICAgICAgQ29uZmlnVmFsaWRhdGlvbi52YWxpZGF0ZUZpZWxkcyhjb25mKTsKKworICAgICAgICBpc29sYXRpb25NYXAucHV0KCJob3N0MCIsIDEpOworICAgICAgICBpc29sYXRpb25NYXAucHV0KCJob3N0MSIsIDIpOworCisgICAgICAgIGNvbmYucHV0KENvbmZpZy5JU09MQVRJT05fU0NIRURVTEVSX01BQ0hJTkVTLCBpc29sYXRpb25NYXApOworICAgICAgICBDb25maWdWYWxpZGF0aW9uLnZhbGlkYXRlRmllbGRzKGNvbmYpOworCisgICAgICAgIGNvbmYucHV0KENvbmZpZy5JU09MQVRJT05fU0NIRURVTEVSX01BQ0hJTkVTLCA0Mik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDb25maWdWYWxpZGF0aW9uLnZhbGlkYXRlRmllbGRzKGNvbmYpOworICAgICAgICAgICAgQXNzZXJ0LmZhaWwoIkV4cGVjdGVkIEV4Y2VwdGlvbiBub3QgVGhyb3duIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgeworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V29ya2VyQ2hpbGRvcHRzSXNTdHJpbmdPclN0cmluZ0xpc3QoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uLCBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7CisgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gY29uZiA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworICAgICAgICBDb2xsZWN0aW9uPE9iamVjdD4gcGFzc0Nhc2VzID0gbmV3IExpbmtlZExpc3Q8T2JqZWN0PigpOworICAgICAgICBDb2xsZWN0aW9uPE9iamVjdD4gZmFpbENhc2VzID0gbmV3IExpbmtlZExpc3Q8T2JqZWN0PigpOworCisgICAgICAgIHBhc3NDYXNlcy5hZGQobnVsbCk7CisgICAgICAgIHBhc3NDYXNlcy5hZGQoInNvbWUgc3RyaW5nIik7CisgICAgICAgIFN0cmluZ1tdIHN0dWZmID0geyJzb21lIiwgInN0cmluZyIsICJsaXN0In07CisgICAgICAgIHBhc3NDYXNlcy5hZGQoQXJyYXlzLmFzTGlzdChzdHVmZikpOworCisgICAgICAgIGZhaWxDYXNlcy5hZGQoNDIpOworICAgICAgICBJbnRlZ2VyW10gd3JvbmdTdHVmZiA9IHsxLCAyLCAzfTsKKyAgICAgICAgZmFpbENhc2VzLmFkZChBcnJheXMuYXNMaXN0KHdyb25nU3R1ZmYpKTsKKworICAgICAgICAvL3dvcmtlci5jaGlsZG9wdHMgdmFsaWRhdGVzCisgICAgICAgIGZvciAoT2JqZWN0IHZhbHVlIDogcGFzc0Nhc2VzKSB7CisgICAgICAgICAgICBjb25mLnB1dChDb25maWcuV09SS0VSX0NISUxET1BUUywgdmFsdWUpOworICAgICAgICAgICAgQ29uZmlnVmFsaWRhdGlvbi52YWxpZGF0ZUZpZWxkcyhjb25mKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoT2JqZWN0IHZhbHVlIDogZmFpbENhc2VzKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNvbmYucHV0KENvbmZpZy5XT1JLRVJfQ0hJTERPUFRTLCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgQ29uZmlnVmFsaWRhdGlvbi52YWxpZGF0ZUZpZWxkcyhjb25mKTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuZmFpbCgiRXhwZWN0ZWQgRXhjZXB0aW9uIG5vdCBUaHJvd24gZm9yIHZhbHVlOiAiICsgdmFsdWUpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIEV4KSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvL3RvcG9sb2d5Lndvcmtlci5jaGlsZG9wdHMgdmFsaWRhdGVzCisgICAgICAgIGNvbmYgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKyAgICAgICAgZm9yIChPYmplY3QgdmFsdWUgOiBwYXNzQ2FzZXMpIHsKKyAgICAgICAgICAgIGNvbmYucHV0KENvbmZpZy5UT1BPTE9HWV9XT1JLRVJfQ0hJTERPUFRTLCB2YWx1ZSk7CisgICAgICAgICAgICBDb25maWdWYWxpZGF0aW9uLnZhbGlkYXRlRmllbGRzKGNvbmYpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChPYmplY3QgdmFsdWUgOiBmYWlsQ2FzZXMpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY29uZi5wdXQoQ29uZmlnLlRPUE9MT0dZX1dPUktFUl9DSElMRE9QVFMsIHZhbHVlKTsKKyAgICAgICAgICAgICAgICBDb25maWdWYWxpZGF0aW9uLnZhbGlkYXRlRmllbGRzKGNvbmYpOworICAgICAgICAgICAgICAgIEFzc2VydC5mYWlsKCJFeHBlY3RlZCBFeGNlcHRpb24gbm90IFRocm93biBmb3IgdmFsdWU6ICIgKyB2YWx1ZSk7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gRXgpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN1cGVydmlzb3JTbG90c1BvcnRzKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwgTm9TdWNoRmllbGRFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24geworICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbmYgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKyAgICAgICAgQ29sbGVjdGlvbjxPYmplY3Q+IHBhc3NDYXNlcyA9IG5ldyBMaW5rZWRMaXN0PE9iamVjdD4oKTsKKyAgICAgICAgQ29sbGVjdGlvbjxPYmplY3Q+IGZhaWxDYXNlcyA9IG5ldyBMaW5rZWRMaXN0PE9iamVjdD4oKTsKKworICAgICAgICBJbnRlZ2VyW10gdGVzdDEgPSB7MTIzMywgMTIzNCwgMTIzNX07CisgICAgICAgIEludGVnZXJbXSB0ZXN0MiA9IHsxMjMzfTsKKyAgICAgICAgcGFzc0Nhc2VzLmFkZChBcnJheXMuYXNMaXN0KHRlc3QxKSk7CisgICAgICAgIHBhc3NDYXNlcy5hZGQoQXJyYXlzLmFzTGlzdCh0ZXN0MikpOworCisgICAgICAgIFN0cmluZ1tdIHRlc3QzID0geyIxMjMzIiwgIjEyMzQiLCAiMTIzNSJ9OworICAgICAgICAvL2R1cGxpY2F0ZSBjYXNlCisgICAgICAgIEludGVnZXJbXSB0ZXN0NCA9IHsxMjMzLCAxMjMzLCAxMjM1fTsKKyAgICAgICAgZmFpbENhc2VzLmFkZCh0ZXN0Myk7CisgICAgICAgIGZhaWxDYXNlcy5hZGQodGVzdDQpOworICAgICAgICBmYWlsQ2FzZXMuYWRkKG51bGwpOworICAgICAgICBmYWlsQ2FzZXMuYWRkKCIxMjM0Iik7CisgICAgICAgIGZhaWxDYXNlcy5hZGQoMTIzNCk7CisKKyAgICAgICAgZm9yIChPYmplY3QgdmFsdWUgOiBwYXNzQ2FzZXMpIHsKKyAgICAgICAgICAgIGNvbmYucHV0KENvbmZpZy5TVVBFUlZJU09SX1NMT1RTX1BPUlRTLCB2YWx1ZSk7CisgICAgICAgICAgICBDb25maWdWYWxpZGF0aW9uLnZhbGlkYXRlRmllbGRzKGNvbmYpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChPYmplY3QgdmFsdWUgOiBmYWlsQ2FzZXMpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY29uZi5wdXQoQ29uZmlnLlNVUEVSVklTT1JfU0xPVFNfUE9SVFMsIHZhbHVlKTsKKyAgICAgICAgICAgICAgICBDb25maWdWYWxpZGF0aW9uLnZhbGlkYXRlRmllbGRzKGNvbmYpOworICAgICAgICAgICAgICAgIEFzc2VydC5mYWlsKCJFeHBlY3RlZCBFeGNlcHRpb24gbm90IFRocm93biBmb3IgdmFsdWU6ICIgKyB2YWx1ZSk7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gRXgpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFZhbGlkaXR5KCkgeworICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IGNvbmYgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKyAgICAgICAgY29uZi5wdXQoQ29uZmlnLlRPUE9MT0dZX0RFQlVHLCB0cnVlKTsKKyAgICAgICAgY29uZi5wdXQoInEiLCAiYXNhc2Rhc2QiKTsKKyAgICAgICAgY29uZi5wdXQoImFhYSIsIG5ldyBJbnRlZ2VyKCIxMjMiKSk7CisgICAgICAgIGNvbmYucHV0KCJiYmIiLCBuZXcgTG9uZygiNDU2IikpOworICAgICAgICBMaXN0PE9iamVjdD4gdGVzdExpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKKyAgICAgICAgdGVzdExpc3QuYWRkKDEpOworICAgICAgICB0ZXN0TGlzdC5hZGQoMik7CisgICAgICAgIHRlc3RMaXN0LmFkZChuZXcgSW50ZWdlcigiMyIpKTsKKyAgICAgICAgdGVzdExpc3QuYWRkKG5ldyBMb25nKCI0IikpOworICAgICAgICBjb25mLnB1dCgiZWVlIiwgdGVzdExpc3QpOworICAgICAgICBVdGlscy5pc1ZhbGlkQ29uZihjb25mKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQb3dlck9mMlZhbGlkYXRvcigpIHsKKyAgICAgICAgUG93ZXJPZjJWYWxpZGF0b3IgdmFsaWRhdG9yID0gbmV3IFBvd2VyT2YyVmFsaWRhdG9yKCk7CisKKyAgICAgICAgT2JqZWN0W10gZmFpbENhc2VzID0gezQyLjQyLCA0MiwgLTMzLCAyMzQyMzQyMzQyMy4wLCAtMzIsIC0xLCAtMC4wMDAwMSwgMCwgLTAsICJGb3J0eS10d28ifTsKKyAgICAgICAgZm9yIChPYmplY3QgdmFsdWUgOiBmYWlsQ2FzZXMpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdmFsaWRhdG9yLnZhbGlkYXRlRmllbGQoInRlc3QiLCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LmZhaWwoIkV4cGVjdGVkIEV4Y2VwdGlvbiBub3QgVGhyb3duIGZvciB2YWx1ZTogIiArIHZhbHVlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBFeCkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgT2JqZWN0W10gcGFzc0Nhc2VzID0gezY0LCA0Mjk0OTY3Mjk2LjAsIDEsIG51bGx9OworICAgICAgICBmb3IgKE9iamVjdCB2YWx1ZSA6IHBhc3NDYXNlcykgeworICAgICAgICAgICAgdmFsaWRhdG9yLnZhbGlkYXRlRmllbGQoInRlc3QiLCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQb3NpdGl2ZU51bWJlclZhbGlkYXRvcigpIHsKKyAgICAgICAgUG9zaXRpdmVOdW1iZXJWYWxpZGF0b3IgdmFsaWRhdG9yID0gbmV3IFBvc2l0aXZlTnVtYmVyVmFsaWRhdG9yKCk7CisKKyAgICAgICAgT2JqZWN0W10gcGFzc0Nhc2VzID0ge251bGwsIDEuMCwgMC4wMSwgMSwgMjE0NzQ4MzY0NywgNDJ9OworCisgICAgICAgIGZvciAoT2JqZWN0IHZhbHVlIDogcGFzc0Nhc2VzKSB7CisgICAgICAgICAgICB2YWxpZGF0b3IudmFsaWRhdGVGaWVsZCgidGVzdCIsIHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIE9iamVjdFtdIGZhaWxDYXNlcyA9IHstMS4wLCAtMSwgLTAuMDEsIDAuMCwgMCwgIjQzIiwgInN0cmluZyJ9OworCisgICAgICAgIGZvciAoT2JqZWN0IHZhbHVlIDogZmFpbENhc2VzKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHZhbGlkYXRvci52YWxpZGF0ZUZpZWxkKCJ0ZXN0IiwgdmFsdWUpOworICAgICAgICAgICAgICAgIEFzc2VydC5mYWlsKCJFeHBlY3RlZCBFeGNlcHRpb24gbm90IFRocm93biBmb3IgdmFsdWU6ICIgKyB2YWx1ZSk7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gRXgpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIE9iamVjdFtdIHBhc3NDYXNlc0luY2x1ZGVaZXJvID0ge251bGwsIDEuMCwgMC4wMSwgMCwgMjE0NzQ4MzY0NywgMC4wfTsKKworICAgICAgICBmb3IgKE9iamVjdCB2YWx1ZSA6IHBhc3NDYXNlc0luY2x1ZGVaZXJvKSB7CisgICAgICAgICAgICB2YWxpZGF0b3IudmFsaWRhdGVGaWVsZCgidGVzdCIsIHRydWUsIHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIE9iamVjdFtdIGZhaWxDYXNlc0luY2x1ZGVaZXJvID0gey0xLjAsIC0xLCAtMC4wMSwgIjQzIiwgInN0cmluZyJ9OworCisgICAgICAgIGZvciAoT2JqZWN0IHZhbHVlIDogZmFpbENhc2VzSW5jbHVkZVplcm8pIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdmFsaWRhdG9yLnZhbGlkYXRlRmllbGQoInRlc3QiLCB0cnVlLCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LmZhaWwoIkV4cGVjdGVkIEV4Y2VwdGlvbiBub3QgVGhyb3duIGZvciB2YWx1ZTogIiArIHZhbHVlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBFeCkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW50ZWdlclZhbGlkYXRvcigpIHsKKyAgICAgICAgSW50ZWdlclZhbGlkYXRvciB2YWxpZGF0b3IgPSBuZXcgSW50ZWdlclZhbGlkYXRvcigpOworCisgICAgICAgIE9iamVjdFtdIHBhc3NDYXNlcyA9IHtudWxsLCAxMDAwLCBJbnRlZ2VyLk1BWF9WQUxVRX07CisKKyAgICAgICAgZm9yIChPYmplY3QgdmFsdWUgOiBwYXNzQ2FzZXMpIHsKKyAgICAgICAgICAgIHZhbGlkYXRvci52YWxpZGF0ZUZpZWxkKCJ0ZXN0IiwgdmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgT2JqZWN0W10gZmFpbENhc2VzID0gezEuMzQsIG5ldyBMb25nKEludGVnZXIuTUFYX1ZBTFVFKSArIDF9OworCisgICAgICAgIGZvciAoT2JqZWN0IHZhbHVlIDogZmFpbENhc2VzKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHZhbGlkYXRvci52YWxpZGF0ZUZpZWxkKCJ0ZXN0IiwgdmFsdWUpOworICAgICAgICAgICAgICAgIEFzc2VydC5mYWlsKCJFeHBlY3RlZCBFeGNlcHRpb24gbm90IFRocm93biBmb3IgdmFsdWU6ICIgKyB2YWx1ZSk7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gRXgpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgTm9EdXBsaWNhdGVJbkxpc3RWYWxpZGF0b3IoKSB7CisgICAgICAgIE5vRHVwbGljYXRlSW5MaXN0VmFsaWRhdG9yIHZhbGlkYXRvciA9IG5ldyBOb0R1cGxpY2F0ZUluTGlzdFZhbGlkYXRvcigpOworICAgICAgICBDb2xsZWN0aW9uPE9iamVjdD4gcGFzc0Nhc2VzID0gbmV3IExpbmtlZExpc3Q8T2JqZWN0PigpOworICAgICAgICBDb2xsZWN0aW9uPE9iamVjdD4gZmFpbENhc2VzID0gbmV3IExpbmtlZExpc3Q8T2JqZWN0PigpOworCisgICAgICAgIE9iamVjdFtdIHBhc3NDYXNlMSA9IHsxMDAwLCAwLCAtMTAwMH07CisgICAgICAgIE9iamVjdFtdIHBhc3NDYXNlMiA9IHsib25lIiwgInR3byIsICJ0aHJlZSJ9OworICAgICAgICBPYmplY3RbXSBwYXNzQ2FzZTMgPSB7ZmFsc2UsIHRydWV9OworICAgICAgICBPYmplY3RbXSBwYXNzQ2FzZTQgPSB7ZmFsc2UsIHRydWUsIDEwMDAsIDAsIC0xMDAwLCAib25lIiwgInR3byIsICJ0aHJlZSJ9OworICAgICAgICBPYmplY3RbXSBwYXNzQ2FzZTUgPSB7MTAwMC4wLCAwLjAsIC0xMDAwLjB9OworICAgICAgICBwYXNzQ2FzZXMuYWRkKEFycmF5cy5hc0xpc3QocGFzc0Nhc2UxKSk7CisgICAgICAgIHBhc3NDYXNlcy5hZGQoQXJyYXlzLmFzTGlzdChwYXNzQ2FzZTIpKTsKKyAgICAgICAgcGFzc0Nhc2VzLmFkZChBcnJheXMuYXNMaXN0KHBhc3NDYXNlMykpOworICAgICAgICBwYXNzQ2FzZXMuYWRkKEFycmF5cy5hc0xpc3QocGFzc0Nhc2U0KSk7CisgICAgICAgIHBhc3NDYXNlcy5hZGQoQXJyYXlzLmFzTGlzdChwYXNzQ2FzZTUpKTsKKyAgICAgICAgcGFzc0Nhc2VzLmFkZChudWxsKTsKKworICAgICAgICBmb3IgKE9iamVjdCB2YWx1ZSA6IHBhc3NDYXNlcykgeworICAgICAgICAgICAgdmFsaWRhdG9yLnZhbGlkYXRlRmllbGQoInRlc3QiLCB2YWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICBPYmplY3RbXSBmYWlsQ2FzZTEgPSB7MTAwMCwgMCwgMTAwMH07CisgICAgICAgIE9iamVjdFtdIGZhaWxDYXNlMiA9IHsib25lIiwgIm9uZSIsICJ0d28ifTsKKyAgICAgICAgT2JqZWN0W10gZmFpbENhc2UzID0gezUuMCwgNS4wLCA2fTsKKyAgICAgICAgZmFpbENhc2VzLmFkZChBcnJheXMuYXNMaXN0KGZhaWxDYXNlMSkpOworICAgICAgICBmYWlsQ2FzZXMuYWRkKEFycmF5cy5hc0xpc3QoZmFpbENhc2UyKSk7CisgICAgICAgIGZhaWxDYXNlcy5hZGQoQXJyYXlzLmFzTGlzdChmYWlsQ2FzZTMpKTsKKyAgICAgICAgZm9yIChPYmplY3QgdmFsdWUgOiBmYWlsQ2FzZXMpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdmFsaWRhdG9yLnZhbGlkYXRlRmllbGQoInRlc3QiLCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LmZhaWwoIkV4cGVjdGVkIEV4Y2VwdGlvbiBub3QgVGhyb3duIGZvciB2YWx1ZTogIiArIHZhbHVlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBFeCkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGlzdEVudHJ5VHlwZVZhbGlkYXRvcigpIHsKKyAgICAgICAgQ29sbGVjdGlvbjxPYmplY3Q+IHRlc3RDYXNlczEgPSBuZXcgTGlua2VkTGlzdDxPYmplY3Q+KCk7CisgICAgICAgIENvbGxlY3Rpb248T2JqZWN0PiB0ZXN0Q2FzZXMyID0gbmV3IExpbmtlZExpc3Q8T2JqZWN0PigpOworICAgICAgICBDb2xsZWN0aW9uPE9iamVjdD4gdGVzdENhc2VzMyA9IG5ldyBMaW5rZWRMaXN0PE9iamVjdD4oKTsKKworICAgICAgICBPYmplY3RbXSB0ZXN0Q2FzZTEgPSB7Im9uZSIsICJ0d28iLCAidGhyZWUifTsKKyAgICAgICAgOworICAgICAgICBPYmplY3RbXSB0ZXN0Q2FzZTIgPSB7InRocmVlIn07CisgICAgICAgIHRlc3RDYXNlczEuYWRkKEFycmF5cy5hc0xpc3QodGVzdENhc2UxKSk7CisgICAgICAgIHRlc3RDYXNlczEuYWRkKEFycmF5cy5hc0xpc3QodGVzdENhc2UyKSk7CisKKyAgICAgICAgZm9yIChPYmplY3QgdmFsdWUgOiB0ZXN0Q2FzZXMxKSB7CisgICAgICAgICAgICBMaXN0RW50cnlUeXBlVmFsaWRhdG9yLnZhbGlkYXRlRmllbGQoInRlc3QiLCBTdHJpbmcuY2xhc3MsIHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoT2JqZWN0IHZhbHVlIDogdGVzdENhc2VzMSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBMaXN0RW50cnlUeXBlVmFsaWRhdG9yLnZhbGlkYXRlRmllbGQoInRlc3QiLCBOdW1iZXIuY2xhc3MsIHZhbHVlKTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuZmFpbCgiRXhwZWN0ZWQgRXhjZXB0aW9uIG5vdCBUaHJvd24gZm9yIHZhbHVlOiAiICsgdmFsdWUpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIEV4KSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBPYmplY3RbXSB0ZXN0Q2FzZTMgPSB7MTAwMCwgMCwgMTAwMH07CisgICAgICAgIE9iamVjdFtdIHRlc3RDYXNlNCA9IHs1fTsKKyAgICAgICAgT2JqZWN0W10gdGVzdENhc2U1ID0gezUuMCwgNS4wLCA2fTsKKyAgICAgICAgdGVzdENhc2VzMi5hZGQoQXJyYXlzLmFzTGlzdCh0ZXN0Q2FzZTMpKTsKKyAgICAgICAgdGVzdENhc2VzMi5hZGQoQXJyYXlzLmFzTGlzdCh0ZXN0Q2FzZTQpKTsKKyAgICAgICAgdGVzdENhc2VzMi5hZGQoQXJyYXlzLmFzTGlzdCh0ZXN0Q2FzZTUpKTsKKyAgICAgICAgZm9yIChPYmplY3QgdmFsdWUgOiB0ZXN0Q2FzZXMyKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIExpc3RFbnRyeVR5cGVWYWxpZGF0b3IudmFsaWRhdGVGaWVsZCgidGVzdCIsIFN0cmluZy5jbGFzcywgdmFsdWUpOworICAgICAgICAgICAgICAgIEFzc2VydC5mYWlsKCJFeHBlY3RlZCBFeGNlcHRpb24gbm90IFRocm93biBmb3IgdmFsdWU6ICIgKyB2YWx1ZSk7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gRXgpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3IgKE9iamVjdCB2YWx1ZSA6IHRlc3RDYXNlczIpIHsKKyAgICAgICAgICAgIExpc3RFbnRyeVR5cGVWYWxpZGF0b3IudmFsaWRhdGVGaWVsZCgidGVzdCIsIE51bWJlci5jbGFzcywgdmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgT2JqZWN0W10gdGVzdENhc2U2ID0gezEwMDAsIDAsIDEwMDAsICI1In07CisgICAgICAgIE9iamVjdFtdIHRlc3RDYXNlNyA9IHsiNCIsICI1IiwgNX07CisgICAgICAgIHRlc3RDYXNlczMuYWRkKEFycmF5cy5hc0xpc3QodGVzdENhc2U2KSk7CisgICAgICAgIHRlc3RDYXNlczMuYWRkKEFycmF5cy5hc0xpc3QodGVzdENhc2U3KSk7CisgICAgICAgIGZvciAoT2JqZWN0IHZhbHVlIDogdGVzdENhc2VzMykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBMaXN0RW50cnlUeXBlVmFsaWRhdG9yLnZhbGlkYXRlRmllbGQoInRlc3QiLCBTdHJpbmcuY2xhc3MsIHZhbHVlKTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuZmFpbCgiRXhwZWN0ZWQgRXhjZXB0aW9uIG5vdCBUaHJvd24gZm9yIHZhbHVlOiAiICsgdmFsdWUpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIEV4KSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChPYmplY3QgdmFsdWUgOiB0ZXN0Q2FzZXMxKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIExpc3RFbnRyeVR5cGVWYWxpZGF0b3IudmFsaWRhdGVGaWVsZCgidGVzdCIsIE51bWJlci5jbGFzcywgdmFsdWUpOworICAgICAgICAgICAgICAgIEFzc2VydC5mYWlsKCJFeHBlY3RlZCBFeGNlcHRpb24gbm90IFRocm93biBmb3IgdmFsdWU6ICIgKyB2YWx1ZSk7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gRXgpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1hcEVudHJ5VHlwZUFubm90YXRpb24oKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uLCBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7CisgICAgICAgIFRlc3RDb25maWcgY29uZmlnID0gbmV3IFRlc3RDb25maWcoKTsKKyAgICAgICAgQ29sbGVjdGlvbjxPYmplY3Q+IHBhc3NDYXNlcyA9IG5ldyBMaW5rZWRMaXN0PE9iamVjdD4oKTsKKyAgICAgICAgQ29sbGVjdGlvbjxPYmplY3Q+IGZhaWxDYXNlcyA9IG5ldyBMaW5rZWRMaXN0PE9iamVjdD4oKTsKKyAgICAgICAgTWFwPE9iamVjdCwgT2JqZWN0PiBwYXNzQ2FzZTEgPSBuZXcgSGFzaE1hcDxPYmplY3QsIE9iamVjdD4oKTsKKyAgICAgICAgcGFzc0Nhc2UxLnB1dCgiYWFhIiwgNSk7CisgICAgICAgIHBhc3NDYXNlMS5wdXQoImJiYiIsIDYpOworICAgICAgICBwYXNzQ2FzZTEucHV0KCJjY2MiLCA3KTsKKyAgICAgICAgcGFzc0Nhc2VzLmFkZChwYXNzQ2FzZTEpOworICAgICAgICBwYXNzQ2FzZXMuYWRkKG51bGwpOworCisgICAgICAgIGZvciAoT2JqZWN0IHZhbHVlIDogcGFzc0Nhc2VzKSB7CisgICAgICAgICAgICBjb25maWcucHV0KFRlc3RDb25maWcuVEVTVF9NQVBfQ09ORklHLCB2YWx1ZSk7CisgICAgICAgICAgICBDb25maWdWYWxpZGF0aW9uLnZhbGlkYXRlRmllbGRzKGNvbmZpZywgVGVzdENvbmZpZy5jbGFzcyk7CisgICAgICAgIH0KKworICAgICAgICBNYXA8T2JqZWN0LCBPYmplY3Q+IGZhaWxDYXNlMSA9IG5ldyBIYXNoTWFwPE9iamVjdCwgT2JqZWN0PigpOworICAgICAgICBmYWlsQ2FzZTEucHV0KCJhYWEiLCA1KTsKKyAgICAgICAgZmFpbENhc2UxLnB1dCg1LCA2KTsKKyAgICAgICAgZmFpbENhc2UxLnB1dCgiY2NjIiwgNyk7CisgICAgICAgIE1hcDxPYmplY3QsIE9iamVjdD4gZmFpbENhc2UyID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBPYmplY3Q+KCk7CisgICAgICAgIGZhaWxDYXNlMi5wdXQoImFhYSIsICJzdHIiKTsKKyAgICAgICAgZmFpbENhc2UyLnB1dCgiYmJiIiwgNik7CisgICAgICAgIGZhaWxDYXNlMi5wdXQoImNjYyIsIDcpOworCisgICAgICAgIGZhaWxDYXNlcy5hZGQoZmFpbENhc2UxKTsKKyAgICAgICAgZmFpbENhc2VzLmFkZChmYWlsQ2FzZTIpOworICAgICAgICBmb3IgKE9iamVjdCB2YWx1ZSA6IGZhaWxDYXNlcykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjb25maWcucHV0KFRlc3RDb25maWcuVEVTVF9NQVBfQ09ORklHLCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgQ29uZmlnVmFsaWRhdGlvbi52YWxpZGF0ZUZpZWxkcyhjb25maWcsIFRlc3RDb25maWcuY2xhc3MpOworICAgICAgICAgICAgICAgIEFzc2VydC5mYWlsKCJFeHBlY3RlZCBFeGNlcHRpb24gbm90IFRocm93biBmb3IgdmFsdWU6ICIgKyB2YWx1ZSk7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gRXgpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1hcEVudHJ5Q3VzdG9tQW5ub3RhdGlvbigpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBOb1N1Y2hNZXRob2RFeGNlcHRpb24sIE5vU3VjaEZpZWxkRXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKKyAgICAgICAgVGVzdENvbmZpZyBjb25maWcgPSBuZXcgVGVzdENvbmZpZygpOworICAgICAgICBDb2xsZWN0aW9uPE9iamVjdD4gcGFzc0Nhc2VzID0gbmV3IExpbmtlZExpc3Q8T2JqZWN0PigpOworICAgICAgICBDb2xsZWN0aW9uPE9iamVjdD4gZmFpbENhc2VzID0gbmV3IExpbmtlZExpc3Q8T2JqZWN0PigpOworICAgICAgICBNYXA8T2JqZWN0LCBPYmplY3Q+IHBhc3NDYXNlMSA9IG5ldyBIYXNoTWFwPE9iamVjdCwgT2JqZWN0PigpOworICAgICAgICBwYXNzQ2FzZTEucHV0KCJhYWEiLCA1KTsKKyAgICAgICAgcGFzc0Nhc2UxLnB1dCgiYmJiIiwgMTAwKTsKKyAgICAgICAgcGFzc0Nhc2UxLnB1dCgiY2NjIiwgSW50ZWdlci5NQVhfVkFMVUUpOworICAgICAgICBwYXNzQ2FzZXMuYWRkKHBhc3NDYXNlMSk7CisgICAgICAgIHBhc3NDYXNlcy5hZGQobnVsbCk7CisKKyAgICAgICAgZm9yIChPYmplY3QgdmFsdWUgOiBwYXNzQ2FzZXMpIHsKKyAgICAgICAgICAgIGNvbmZpZy5wdXQoVGVzdENvbmZpZy5URVNUX01BUF9DT05GSUdfMiwgdmFsdWUpOworICAgICAgICAgICAgQ29uZmlnVmFsaWRhdGlvbi52YWxpZGF0ZUZpZWxkcyhjb25maWcsIFRlc3RDb25maWcuY2xhc3MpOworICAgICAgICB9CisKKyAgICAgICAgTWFwPE9iamVjdCwgT2JqZWN0PiBmYWlsQ2FzZTEgPSBuZXcgSGFzaE1hcDxPYmplY3QsIE9iamVjdD4oKTsKKyAgICAgICAgZmFpbENhc2UxLnB1dCgiYWFhIiwgNSk7CisgICAgICAgIGZhaWxDYXNlMS5wdXQoNSwgNik7CisgICAgICAgIGZhaWxDYXNlMS5wdXQoImNjYyIsIDcpOworICAgICAgICBNYXA8T2JqZWN0LCBPYmplY3Q+IGZhaWxDYXNlMiA9IG5ldyBIYXNoTWFwPE9iamVjdCwgT2JqZWN0PigpOworICAgICAgICBmYWlsQ2FzZTIucHV0KCJhYWEiLCAic3RyIik7CisgICAgICAgIGZhaWxDYXNlMi5wdXQoImJiYiIsIDYpOworICAgICAgICBmYWlsQ2FzZTIucHV0KCJjY2MiLCA3KTsKKyAgICAgICAgTWFwPE9iamVjdCwgT2JqZWN0PiBmYWlsQ2FzZTMgPSBuZXcgSGFzaE1hcDxPYmplY3QsIE9iamVjdD4oKTsKKyAgICAgICAgZmFpbENhc2UzLnB1dCgiYWFhIiwgLTEpOworICAgICAgICBmYWlsQ2FzZTMucHV0KCJiYmIiLCA2KTsKKyAgICAgICAgZmFpbENhc2UzLnB1dCgiY2NjIiwgNyk7CisgICAgICAgIE1hcDxPYmplY3QsIE9iamVjdD4gZmFpbENhc2U0ID0gbmV3IEhhc2hNYXA8T2JqZWN0LCBPYmplY3Q+KCk7CisgICAgICAgIGZhaWxDYXNlNC5wdXQoImFhYSIsIDEpOworICAgICAgICBmYWlsQ2FzZTQucHV0KCJiYmIiLCA2KTsKKyAgICAgICAgZmFpbENhc2U0LnB1dCgiY2NjIiwgNy40KTsKKworICAgICAgICBmYWlsQ2FzZXMuYWRkKGZhaWxDYXNlMSk7CisgICAgICAgIGZhaWxDYXNlcy5hZGQoZmFpbENhc2UyKTsKKyAgICAgICAgZmFpbENhc2VzLmFkZChmYWlsQ2FzZTMpOworICAgICAgICBmYWlsQ2FzZXMuYWRkKGZhaWxDYXNlNCk7CisgICAgICAgIGZvciAoT2JqZWN0IHZhbHVlIDogZmFpbENhc2VzKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNvbmZpZy5wdXQoVGVzdENvbmZpZy5URVNUX01BUF9DT05GSUdfMiwgdmFsdWUpOworICAgICAgICAgICAgICAgIENvbmZpZ1ZhbGlkYXRpb24udmFsaWRhdGVGaWVsZHMoY29uZmlnLCBUZXN0Q29uZmlnLmNsYXNzKTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuZmFpbCgiRXhwZWN0ZWQgRXhjZXB0aW9uIG5vdCBUaHJvd24gZm9yIHZhbHVlOiAiICsgdmFsdWUpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIEV4KSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMaXN0RW50cnlUeXBlQW5ub3RhdGlvbigpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBOb1N1Y2hNZXRob2RFeGNlcHRpb24sIE5vU3VjaEZpZWxkRXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKKyAgICAgICAgVGVzdENvbmZpZyBjb25maWcgPSBuZXcgVGVzdENvbmZpZygpOworICAgICAgICBDb2xsZWN0aW9uPE9iamVjdD4gcGFzc0Nhc2VzID0gbmV3IExpbmtlZExpc3Q8T2JqZWN0PigpOworICAgICAgICBDb2xsZWN0aW9uPE9iamVjdD4gZmFpbENhc2VzID0gbmV3IExpbmtlZExpc3Q8T2JqZWN0PigpOworICAgICAgICBPYmplY3RbXSBwYXNzQ2FzZTEgPSB7MSwgNS4wLCAtMC4wMSwgMCwgSW50ZWdlci5NQVhfVkFMVUUsIERvdWJsZS5NSU5fVkFMVUV9OworICAgICAgICBPYmplY3RbXSBwYXNzQ2FzZTIgPSB7MX07CisgICAgICAgIHBhc3NDYXNlcy5hZGQoQXJyYXlzLmFzTGlzdChwYXNzQ2FzZTEpKTsKKyAgICAgICAgcGFzc0Nhc2VzLmFkZChBcnJheXMuYXNMaXN0KHBhc3NDYXNlMikpOworCisgICAgICAgIGZvciAoT2JqZWN0IHZhbHVlIDogcGFzc0Nhc2VzKSB7CisgICAgICAgICAgICBjb25maWcucHV0KFRlc3RDb25maWcuVEVTVF9NQVBfQ09ORklHXzMsIHZhbHVlKTsKKyAgICAgICAgICAgIENvbmZpZ1ZhbGlkYXRpb24udmFsaWRhdGVGaWVsZHMoY29uZmlnLCBUZXN0Q29uZmlnLmNsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIE9iamVjdFtdIGZhaWxDYXNlMSA9IHsxLCA1LjAsIC0wLjAxLCAwLCAiYWFhIn07CisgICAgICAgIE9iamVjdFtdIGZhaWxDYXNlMiA9IHsiYWFhIn07CisgICAgICAgIGZhaWxDYXNlcy5hZGQoZmFpbENhc2UxKTsKKyAgICAgICAgZmFpbENhc2VzLmFkZChmYWlsQ2FzZTIpOworICAgICAgICBmYWlsQ2FzZXMuYWRkKDEpOworICAgICAgICBmYWlsQ2FzZXMuYWRkKCJiIik7CisgICAgICAgIGZhaWxDYXNlcy5hZGQobnVsbCk7CisgICAgICAgIGZvciAoT2JqZWN0IHZhbHVlIDogZmFpbENhc2VzKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNvbmZpZy5wdXQoVGVzdENvbmZpZy5URVNUX01BUF9DT05GSUdfMywgdmFsdWUpOworICAgICAgICAgICAgICAgIENvbmZpZ1ZhbGlkYXRpb24udmFsaWRhdGVGaWVsZHMoY29uZmlnLCBUZXN0Q29uZmlnLmNsYXNzKTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuZmFpbCgiRXhwZWN0ZWQgRXhjZXB0aW9uIG5vdCBUaHJvd24gZm9yIHZhbHVlOiAiICsgdmFsdWUpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIEV4KSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMaXN0RW50cnlDdXN0b21Bbm5vdGF0aW9uKCkgdGhyb3dzIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiwgTm9TdWNoRmllbGRFeGNlcHRpb24sIEluc3RhbnRpYXRpb25FeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24geworICAgICAgICBUZXN0Q29uZmlnIGNvbmZpZyA9IG5ldyBUZXN0Q29uZmlnKCk7CisgICAgICAgIENvbGxlY3Rpb248T2JqZWN0PiBwYXNzQ2FzZXMgPSBuZXcgTGlua2VkTGlzdDxPYmplY3Q+KCk7CisgICAgICAgIENvbGxlY3Rpb248T2JqZWN0PiBmYWlsQ2FzZXMgPSBuZXcgTGlua2VkTGlzdDxPYmplY3Q+KCk7CisgICAgICAgIE9iamVjdFtdIHBhc3NDYXNlMSA9IHsxLCA1LjAsIDAuMDEsIERvdWJsZS5NQVhfVkFMVUV9OworICAgICAgICBPYmplY3RbXSBwYXNzQ2FzZTIgPSB7MX07CisgICAgICAgIHBhc3NDYXNlcy5hZGQoQXJyYXlzLmFzTGlzdChwYXNzQ2FzZTEpKTsKKyAgICAgICAgcGFzc0Nhc2VzLmFkZChBcnJheXMuYXNMaXN0KHBhc3NDYXNlMikpOworCisgICAgICAgIGZvciAoT2JqZWN0IHZhbHVlIDogcGFzc0Nhc2VzKSB7CisgICAgICAgICAgICBjb25maWcucHV0KFRlc3RDb25maWcuVEVTVF9NQVBfQ09ORklHXzQsIHZhbHVlKTsKKyAgICAgICAgICAgIENvbmZpZ1ZhbGlkYXRpb24udmFsaWRhdGVGaWVsZHMoY29uZmlnLCBUZXN0Q29uZmlnLmNsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIE9iamVjdFtdIGZhaWxDYXNlMSA9IHsxLCA1LjAsIC0wLjAxLCAzLjB9OworICAgICAgICBPYmplY3RbXSBmYWlsQ2FzZTIgPSB7MSwgNS4wLCAtMC4wMSwgMX07CisgICAgICAgIE9iamVjdFtdIGZhaWxDYXNlMyA9IHsiYWFhIiwgImJiYiIsICJhYWEifTsKKyAgICAgICAgT2JqZWN0W10gZmFpbENhc2U0ID0gezEsIDUuMCwgbnVsbCwgMX07CisgICAgICAgIE9iamVjdFtdIGZhaWxDYXNlNSA9IHsxLCA1LjAsIDAsIDF9OworCisgICAgICAgIGZhaWxDYXNlcy5hZGQoQXJyYXlzLmFzTGlzdChmYWlsQ2FzZTEpKTsKKyAgICAgICAgZmFpbENhc2VzLmFkZChBcnJheXMuYXNMaXN0KGZhaWxDYXNlMikpOworICAgICAgICBmYWlsQ2FzZXMuYWRkKEFycmF5cy5hc0xpc3QoZmFpbENhc2UzKSk7CisgICAgICAgIGZhaWxDYXNlcy5hZGQoQXJyYXlzLmFzTGlzdChmYWlsQ2FzZTQpKTsKKyAgICAgICAgZmFpbENhc2VzLmFkZChBcnJheXMuYXNMaXN0KGZhaWxDYXNlNSkpOworICAgICAgICBmYWlsQ2FzZXMuYWRkKDEpOworICAgICAgICBmYWlsQ2FzZXMuYWRkKCJiIik7CisgICAgICAgIGZvciAoT2JqZWN0IHZhbHVlIDogZmFpbENhc2VzKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNvbmZpZy5wdXQoVGVzdENvbmZpZy5URVNUX01BUF9DT05GSUdfNCwgdmFsdWUpOworICAgICAgICAgICAgICAgIENvbmZpZ1ZhbGlkYXRpb24udmFsaWRhdGVGaWVsZHMoY29uZmlnLCBUZXN0Q29uZmlnLmNsYXNzKTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuZmFpbCgiRXhwZWN0ZWQgRXhjZXB0aW9uIG5vdCBUaHJvd24gZm9yIHZhbHVlOiAiICsgdmFsdWUpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIEV4KSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIFRlc3RBY2NlcHRlZFN0cmluZ3MoKSB0aHJvd3MgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uLCBOb1N1Y2hGaWVsZEV4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7CisgICAgICAgIFRlc3RDb25maWcgY29uZmlnID0gbmV3IFRlc3RDb25maWcoKTsKKyAgICAgICAgU3RyaW5nW10gcGFzc0Nhc2VzID0geyJhYWEiLCAiYmJiIiwgImNjYyJ9OworCisgICAgICAgIGZvciAoT2JqZWN0IHZhbHVlIDogcGFzc0Nhc2VzKSB7CisgICAgICAgICAgICBjb25maWcucHV0KFRlc3RDb25maWcuVEVTVF9NQVBfQ09ORklHXzUsIHZhbHVlKTsKKyAgICAgICAgICAgIENvbmZpZ1ZhbGlkYXRpb24udmFsaWRhdGVGaWVsZHMoY29uZmlnLCBUZXN0Q29uZmlnLmNsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZ1tdIGZhaWxDYXNlcyA9IHsiYWEiLCAiYmIiLCAiY2MiLCAiYWJjIiwgImEiLCAiYiIsICJjIiwgIiJ9OworICAgICAgICBmb3IgKE9iamVjdCB2YWx1ZSA6IGZhaWxDYXNlcykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjb25maWcucHV0KFRlc3RDb25maWcuVEVTVF9NQVBfQ09ORklHXzUsIHZhbHVlKTsKKyAgICAgICAgICAgICAgICBDb25maWdWYWxpZGF0aW9uLnZhbGlkYXRlRmllbGRzKGNvbmZpZywgVGVzdENvbmZpZy5jbGFzcyk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LmZhaWwoIkV4cGVjdGVkIEV4Y2VwdGlvbiBub3QgVGhyb3duIGZvciB2YWx1ZTogIiArIHZhbHVlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBFeCkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBUZXN0SW1wZXJzb25hdGlvbkFjbFVzZXJFbnRyeVZhbGlkYXRvcigpIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBOb1N1Y2hNZXRob2RFeGNlcHRpb24sIE5vU3VjaEZpZWxkRXhjZXB0aW9uLCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKKyAgICAgICAgVGVzdENvbmZpZyBjb25maWcgPSBuZXcgVGVzdENvbmZpZygpOworICAgICAgICBDb2xsZWN0aW9uPE9iamVjdD4gcGFzc0Nhc2VzID0gbmV3IExpbmtlZExpc3Q8T2JqZWN0PigpOworICAgICAgICBDb2xsZWN0aW9uPE9iamVjdD4gZmFpbENhc2VzID0gbmV3IExpbmtlZExpc3Q8T2JqZWN0PigpOworCisgICAgICAgIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4+IHBhc3NDYXNlMSA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+Pj4oKTsKKyAgICAgICAgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBwYXNzQ2FzZTFfaG9zdHNBbmRHcm91cHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4oKTsKKyAgICAgICAgU3RyaW5nW10gaG9zdHMgPSB7Imhvc3QuMSIsICJob3N0LjIiLCAiaG9zdC4zIn07CisgICAgICAgIHBhc3NDYXNlMV9ob3N0c0FuZEdyb3Vwcy5wdXQoImhvc3RzIiwgQXJyYXlzLmFzTGlzdChob3N0cykpOworICAgICAgICBTdHJpbmdbXSBncm91cHMgPSB7Imdyb3VwLjEiLCAiZ3JvdXAuMiIsICJncm91cC4zIn07CisgICAgICAgIHBhc3NDYXNlMV9ob3N0c0FuZEdyb3Vwcy5wdXQoImdyb3VwcyIsIEFycmF5cy5hc0xpc3QoZ3JvdXBzKSk7CisgICAgICAgIHBhc3NDYXNlMS5wdXQoImplcnJ5IiwgcGFzc0Nhc2UxX2hvc3RzQW5kR3JvdXBzKTsKKyAgICAgICAgcGFzc0Nhc2VzLmFkZChwYXNzQ2FzZTEpOworCisgICAgICAgIGZvciAoT2JqZWN0IHZhbHVlIDogcGFzc0Nhc2VzKSB7CisgICAgICAgICAgICBjb25maWcucHV0KFRlc3RDb25maWcuVEVTVF9NQVBfQ09ORklHXzYsIHZhbHVlKTsKKyAgICAgICAgICAgIENvbmZpZ1ZhbGlkYXRpb24udmFsaWRhdGVGaWVsZHMoY29uZmlnLCBUZXN0Q29uZmlnLmNsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIE1hcDxTdHJpbmcsIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4+IGZhaWxDYXNlMSA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+Pj4oKTsKKyAgICAgICAgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBmYWlsQ2FzZTFfaG9zdHNBbmRHcm91cHMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4oKTsKKyAgICAgICAgU3RyaW5nW10gZmFpbGhvc3RzID0geyJob3N0LjEiLCAiaG9zdC4yIiwgImhvc3QuMyJ9OworICAgICAgICBmYWlsQ2FzZTFfaG9zdHNBbmRHcm91cHMucHV0KCJob3N0cyIsIEFycmF5cy5hc0xpc3QoaG9zdHMpKTsKKyAgICAgICAgZmFpbENhc2UxLnB1dCgiamVycnkiLCBmYWlsQ2FzZTFfaG9zdHNBbmRHcm91cHMpOworCisKKyAgICAgICAgTWFwPFN0cmluZywgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+Pj4gZmFpbENhc2UyID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+PigpOworICAgICAgICBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGZhaWxDYXNlMl9ob3N0c0FuZEdyb3VwcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PigpOworICAgICAgICBTdHJpbmdbXSBmYWlsZ3JvdXBzID0geyJncm91cC4xIiwgImdyb3VwLjIiLCAiZ3JvdXAuMyJ9OworICAgICAgICBmYWlsQ2FzZTJfaG9zdHNBbmRHcm91cHMucHV0KCJncm91cHMiLCBBcnJheXMuYXNMaXN0KGdyb3VwcykpOworICAgICAgICBmYWlsQ2FzZTIucHV0KCJqZXJyeSIsIGZhaWxDYXNlMl9ob3N0c0FuZEdyb3Vwcyk7CisKKyAgICAgICAgZmFpbENhc2VzLmFkZChmYWlsQ2FzZTEpOworICAgICAgICBmYWlsQ2FzZXMuYWRkKGZhaWxDYXNlMik7CisgICAgICAgIGZhaWxDYXNlcy5hZGQoInN0dWZmIik7CisgICAgICAgIGZhaWxDYXNlcy5hZGQoNSk7CisKKyAgICAgICAgZm9yIChPYmplY3QgdmFsdWUgOiBmYWlsQ2FzZXMpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY29uZmlnLnB1dChUZXN0Q29uZmlnLlRFU1RfTUFQX0NPTkZJR182LCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgQ29uZmlnVmFsaWRhdGlvbi52YWxpZGF0ZUZpZWxkcyhjb25maWcsIFRlc3RDb25maWcuY2xhc3MpOworICAgICAgICAgICAgICAgIEFzc2VydC5mYWlsKCJFeHBlY3RlZCBFeGNlcHRpb24gbm90IFRocm93biBmb3IgdmFsdWU6ICIgKyB2YWx1ZSk7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gRXgpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKworICAgIH0KKworICAgIHB1YmxpYyBjbGFzcyBUZXN0Q29uZmlnIGV4dGVuZHMgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4geworICAgICAgICBAaXNNYXBFbnRyeVR5cGUoa2V5VHlwZSA9IFN0cmluZy5jbGFzcywgdmFsdWVUeXBlID0gSW50ZWdlci5jbGFzcykKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9NQVBfQ09ORklHID0gInRlc3QubWFwLmNvbmZpZyI7CisKKyAgICAgICAgQGlzTWFwRW50cnlDdXN0b20oCisgICAgICAgICAgICAgICAga2V5VmFsaWRhdG9yQ2xhc3NlcyA9IHtTdHJpbmdWYWxpZGF0b3IuY2xhc3N9LAorICAgICAgICAgICAgICAgIHZhbHVlVmFsaWRhdG9yQ2xhc3NlcyA9IHtQb3NpdGl2ZU51bWJlclZhbGlkYXRvci5jbGFzcywgSW50ZWdlclZhbGlkYXRvci5jbGFzc30pCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfTUFQX0NPTkZJR18yID0gInRlc3QubWFwLmNvbmZpZy4yIjsKKworICAgICAgICBAaXNMaXN0RW50cnlUeXBlKHR5cGUgPSBOdW1iZXIuY2xhc3MpCisgICAgICAgIEBOb3ROdWxsCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfTUFQX0NPTkZJR18zID0gInRlc3QubWFwLmNvbmZpZy4zIjsKKworICAgICAgICBAaXNMaXN0RW50cnlDdXN0b20oCisgICAgICAgICAgICAgICAgZW50cnlWYWxpZGF0b3JDbGFzc2VzID0ge1Bvc2l0aXZlTnVtYmVyVmFsaWRhdG9yLmNsYXNzLCBOb3ROdWxsVmFsaWRhdG9yLmNsYXNzfSkKKyAgICAgICAgQGlzTm9EdXBsaWNhdGVJbkxpc3QKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9NQVBfQ09ORklHXzQgPSAidGVzdC5tYXAuY29uZmlnLjQiOworCisgICAgICAgIEBpc1N0cmluZyhhY2NlcHRlZFZhbHVlcyA9IHsiYWFhIiwgImJiYiIsICJjY2MifSkKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9NQVBfQ09ORklHXzUgPSAidGVzdC5tYXAuY29uZmlnLjUiOworCisgICAgICAgIEBpc01hcEVudHJ5Q3VzdG9tKGtleVZhbGlkYXRvckNsYXNzZXMgPSB7U3RyaW5nVmFsaWRhdG9yLmNsYXNzfSwgdmFsdWVWYWxpZGF0b3JDbGFzc2VzID0ge0ltcGVyc29uYXRpb25BY2xVc2VyRW50cnlWYWxpZGF0b3IuY2xhc3N9KQorICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX01BUF9DT05GSUdfNiA9ICJ0ZXN0Lm1hcC5jb25maWcuNiI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS90ZXN0L2p2bS9iYWNrdHlwZS9zdG9ybS9tZXRyaWMvaW50ZXJuYWwvQ291bnRTdGF0QW5kTWV0cmljVGVzdC5qYXZhIGIvc3Rvcm0tY29yZS90ZXN0L2p2bS9iYWNrdHlwZS9zdG9ybS9tZXRyaWMvaW50ZXJuYWwvQ291bnRTdGF0QW5kTWV0cmljVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYTgwODcKLS0tIC9kZXYvbnVsbAorKysgYi9zdG9ybS1jb3JlL3Rlc3QvanZtL2JhY2t0eXBlL3N0b3JtL21ldHJpYy9pbnRlcm5hbC9Db3VudFN0YXRBbmRNZXRyaWNUZXN0LmphdmEKQEAgLTAsMCArMSw4NiBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKiA8cC8+CisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqIDxwLz4KKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGJhY2t0eXBlLnN0b3JtLm1ldHJpYy5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKjsKKworLyoqCisgKiBVbml0IHRlc3QgZm9yIENvdW50U3RhdEFuZE1ldHJpYworICovCitwdWJsaWMgY2xhc3MgQ291bnRTdGF0QW5kTWV0cmljVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKyAgICBmaW5hbCBsb25nIFRFTl9NSU4gPSAxMCAqIDYwICogMTAwMDsKKyAgICBmaW5hbCBsb25nIFRISVJUWV9TRUMgPSAzMCAqIDEwMDA7CisgICAgZmluYWwgbG9uZyBUSFJFRV9IT1VSID0gMyAqIDYwICogNjAgKiAxMDAwOworICAgIGZpbmFsIGxvbmcgT05FX0RBWSA9IDI0ICogNjAgKiA2MCAqIDEwMDA7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCYXNpYygpIHsKKyAgICAgICAgbG9uZyB0aW1lID0gMGw7CisgICAgICAgIENvdW50U3RhdEFuZE1ldHJpYyBjb3VudCA9IG5ldyBDb3VudFN0YXRBbmRNZXRyaWMoMTAsIHRpbWUpOworICAgICAgICB3aGlsZSAodGltZSA8IFRFTl9NSU4pIHsKKyAgICAgICAgICAgIC8vRm9yIHRoaXMgcGFydCBvZiB0aGUgdGVzdCB3ZSBpbnRlcmxldmUgdGhlIGRpZmZlcm50IHJvdGF0aW9uIHR5cGVzLgorICAgICAgICAgICAgY291bnQuaW5jQnkoNTApOworICAgICAgICAgICAgdGltZSArPSBUSElSVFlfU0VDLzI7CisgICAgICAgICAgICBjb3VudC5yb3RhdGVTY2hlZCh0aW1lKTsKKyAgICAgICAgICAgIGNvdW50LmluY0J5KDUwKTsKKyAgICAgICAgICAgIHRpbWUgKz0gVEhJUlRZX1NFQy8yOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEwMGwsICgoTG9uZyljb3VudC5nZXRWYWx1ZUFuZFJlc2V0KHRpbWUpKS5sb25nVmFsdWUoKSk7CisgICAgICAgIH0KKworICAgICAgICBsb25nIHZhbCA9IDEwMCAqIFRFTl9NSU4vVEhJUlRZX1NFQzsKKyAgICAgICAgTWFwPFN0cmluZywgTG9uZz4gZXhwZWN0ZWQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExvbmc+KCk7CisgICAgICAgIGV4cGVjdGVkLnB1dCgiNjAwIiwgdmFsKTsKKyAgICAgICAgZXhwZWN0ZWQucHV0KCIxMDgwMCIsIHZhbCk7CisgICAgICAgIGV4cGVjdGVkLnB1dCgiODY0MDAiLCB2YWwpOworICAgICAgICBleHBlY3RlZC5wdXQoIjphbGwtdGltZSIsIHZhbCk7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgY291bnQuZ2V0VGltZUNvdW50cyh0aW1lKSk7CisKKyAgICAgICAgd2hpbGUgKHRpbWUgPCBUSFJFRV9IT1VSKSB7CisgICAgICAgICAgICBjb3VudC5pbmNCeSgxMDApOworICAgICAgICAgICAgdGltZSArPSBUSElSVFlfU0VDOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEwMGwsICgoTG9uZyljb3VudC5nZXRWYWx1ZUFuZFJlc2V0KHRpbWUpKS5sb25nVmFsdWUoKSk7CisgICAgICAgIH0KKworICAgICAgICB2YWwgPSAxMDAgKiBUSFJFRV9IT1VSL1RISVJUWV9TRUM7CisgICAgICAgIGV4cGVjdGVkID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBMb25nPigpOworICAgICAgICBleHBlY3RlZC5wdXQoIjYwMCIsIDEwMCAqIFRFTl9NSU4vVEhJUlRZX1NFQyk7CisgICAgICAgIGV4cGVjdGVkLnB1dCgiMTA4MDAiLCB2YWwpOworICAgICAgICBleHBlY3RlZC5wdXQoIjg2NDAwIiwgdmFsKTsKKyAgICAgICAgZXhwZWN0ZWQucHV0KCI6YWxsLXRpbWUiLCB2YWwpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGNvdW50LmdldFRpbWVDb3VudHModGltZSkpOworCisgICAgICAgIHdoaWxlICh0aW1lIDwgT05FX0RBWSkgeworICAgICAgICAgICAgY291bnQuaW5jQnkoMTAwKTsKKyAgICAgICAgICAgIHRpbWUgKz0gVEhJUlRZX1NFQzsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxMDBsLCAoKExvbmcpY291bnQuZ2V0VmFsdWVBbmRSZXNldCh0aW1lKSkubG9uZ1ZhbHVlKCkpOworICAgICAgICB9CisKKyAgICAgICAgdmFsID0gMTAwICogT05FX0RBWS9USElSVFlfU0VDOworICAgICAgICBleHBlY3RlZCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTG9uZz4oKTsKKyAgICAgICAgZXhwZWN0ZWQucHV0KCI2MDAiLCAxMDAgKiBURU5fTUlOL1RISVJUWV9TRUMpOworICAgICAgICBleHBlY3RlZC5wdXQoIjEwODAwIiwgMTAwICogVEhSRUVfSE9VUi9USElSVFlfU0VDKTsKKyAgICAgICAgZXhwZWN0ZWQucHV0KCI4NjQwMCIsIHZhbCk7CisgICAgICAgIGV4cGVjdGVkLnB1dCgiOmFsbC10aW1lIiwgdmFsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBjb3VudC5nZXRUaW1lQ291bnRzKHRpbWUpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3Rlc3QvanZtL2JhY2t0eXBlL3N0b3JtL21ldHJpYy9pbnRlcm5hbC9MYXRlbmN5U3RhdEFuZE1ldHJpY1Rlc3QuamF2YSBiL3N0b3JtLWNvcmUvdGVzdC9qdm0vYmFja3R5cGUvc3Rvcm0vbWV0cmljL2ludGVybmFsL0xhdGVuY3lTdGF0QW5kTWV0cmljVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiODNkOTUKLS0tIC9kZXYvbnVsbAorKysgYi9zdG9ybS1jb3JlL3Rlc3QvanZtL2JhY2t0eXBlL3N0b3JtL21ldHJpYy9pbnRlcm5hbC9MYXRlbmN5U3RhdEFuZE1ldHJpY1Rlc3QuamF2YQpAQCAtMCwwICsxLDgzIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqIDxwLz4KKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICogPHAvPgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYmFja3R5cGUuc3Rvcm0ubWV0cmljLmludGVybmFsOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qOworCisvKioKKyAqIFVuaXQgdGVzdCBmb3IgTGF0ZW5jeVN0YXRBbmRNZXRyaWMKKyAqLworcHVibGljIGNsYXNzIExhdGVuY3lTdGF0QW5kTWV0cmljVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKKyAgICBmaW5hbCBsb25nIFRFTl9NSU4gPSAxMCAqIDYwICogMTAwMDsKKyAgICBmaW5hbCBsb25nIFRISVJUWV9TRUMgPSAzMCAqIDEwMDA7CisgICAgZmluYWwgbG9uZyBUSFJFRV9IT1VSID0gMyAqIDYwICogNjAgKiAxMDAwOworICAgIGZpbmFsIGxvbmcgT05FX0RBWSA9IDI0ICogNjAgKiA2MCAqIDEwMDA7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCYXNpYygpIHsKKyAgICAgICAgbG9uZyB0aW1lID0gMGw7CisgICAgICAgIExhdGVuY3lTdGF0QW5kTWV0cmljIGxhdCA9IG5ldyBMYXRlbmN5U3RhdEFuZE1ldHJpYygxMCwgdGltZSk7CisgICAgICAgIHdoaWxlICh0aW1lIDwgVEVOX01JTikgeworICAgICAgICAgICAgbGF0LnJlY29yZCgxMDApOworICAgICAgICAgICAgdGltZSArPSBUSElSVFlfU0VDOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEwMC4wLCAoKERvdWJsZSlsYXQuZ2V0VmFsdWVBbmRSZXNldCh0aW1lKSkuZG91YmxlVmFsdWUoKSwgMC4wMSk7CisgICAgICAgIH0KKworICAgICAgICBNYXA8U3RyaW5nLCBEb3VibGU+IGZvdW5kID0gbGF0LmdldFRpbWVMYXRBdmcodGltZSk7CisgICAgICAgIGFzc2VydEVxdWFscyg0LCBmb3VuZC5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMTAwLjAsIGZvdW5kLmdldCgiNjAwIikuZG91YmxlVmFsdWUoKSwgMC4wMSk7CisgICAgICAgIGFzc2VydEVxdWFscygxMDAuMCwgZm91bmQuZ2V0KCIxMDgwMCIpLmRvdWJsZVZhbHVlKCksIDAuMDEpOworICAgICAgICBhc3NlcnRFcXVhbHMoMTAwLjAsIGZvdW5kLmdldCgiODY0MDAiKS5kb3VibGVWYWx1ZSgpLCAwLjAxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEwMC4wLCBmb3VuZC5nZXQoIjphbGwtdGltZSIpLmRvdWJsZVZhbHVlKCksIDAuMDEpOworCisgICAgICAgIHdoaWxlICh0aW1lIDwgVEhSRUVfSE9VUikgeworICAgICAgICAgICAgbGF0LnJlY29yZCgyMDApOworICAgICAgICAgICAgdGltZSArPSBUSElSVFlfU0VDOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMC4wLCAoKERvdWJsZSlsYXQuZ2V0VmFsdWVBbmRSZXNldCh0aW1lKSkuZG91YmxlVmFsdWUoKSwgMC4wMSk7CisgICAgICAgIH0KKworICAgICAgICBkb3VibGUgZXhwZWN0ZWQgPSAoKDEwMC4wICogVEVOX01JTi9USElSVFlfU0VDKSArICgyMDAuMCAqIChUSFJFRV9IT1VSIC0gVEVOX01JTikvVEhJUlRZX1NFQykpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgKFRIUkVFX0hPVVIvVEhJUlRZX1NFQyk7CisgICAgICAgIGZvdW5kID0gbGF0LmdldFRpbWVMYXRBdmcodGltZSk7CisgICAgICAgIGFzc2VydEVxdWFscyg0LCBmb3VuZC5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLjAsIGZvdW5kLmdldCgiNjAwIikuZG91YmxlVmFsdWUoKSwgMC4wMSk7IC8vZmx1c2hlZCB0aGUgYnVmZmVycyBjb21wbGV0ZWx5CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgZm91bmQuZ2V0KCIxMDgwMCIpLmRvdWJsZVZhbHVlKCksIDAuMDEpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGZvdW5kLmdldCgiODY0MDAiKS5kb3VibGVWYWx1ZSgpLCAwLjAxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBmb3VuZC5nZXQoIjphbGwtdGltZSIpLmRvdWJsZVZhbHVlKCksIDAuMDEpOworCisgICAgICAgIHdoaWxlICh0aW1lIDwgT05FX0RBWSkgeworICAgICAgICAgICAgbGF0LnJlY29yZCgzMDApOworICAgICAgICAgICAgdGltZSArPSBUSElSVFlfU0VDOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMwMC4wLCAoKERvdWJsZSlsYXQuZ2V0VmFsdWVBbmRSZXNldCh0aW1lKSkuZG91YmxlVmFsdWUoKSwgMC4wMSk7CisgICAgICAgIH0KKworICAgICAgICBleHBlY3RlZCA9ICgoMTAwLjAgKiBURU5fTUlOL1RISVJUWV9TRUMpICsgKDIwMC4wICogKFRIUkVFX0hPVVIgLSBURU5fTUlOKS9USElSVFlfU0VDKSArICgzMDAuMCAqIChPTkVfREFZIC0gVEhSRUVfSE9VUikvVEhJUlRZX1NFQykpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgKE9ORV9EQVkvVEhJUlRZX1NFQyk7CisgICAgICAgIGZvdW5kID0gbGF0LmdldFRpbWVMYXRBdmcodGltZSk7CisgICAgICAgIGFzc2VydEVxdWFscyg0LCBmb3VuZC5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMzAwLjAsIGZvdW5kLmdldCgiNjAwIikuZG91YmxlVmFsdWUoKSwgMC4wMSk7IC8vZmx1c2hlZCB0aGUgYnVmZmVycyBjb21wbGV0ZWx5CisgICAgICAgIGFzc2VydEVxdWFscygzMDAuMCwgZm91bmQuZ2V0KCIxMDgwMCIpLmRvdWJsZVZhbHVlKCksIDAuMDEpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGZvdW5kLmdldCgiODY0MDAiKS5kb3VibGVWYWx1ZSgpLCAwLjAxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBmb3VuZC5nZXQoIjphbGwtdGltZSIpLmRvdWJsZVZhbHVlKCksIDAuMDEpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvdGVzdC9qdm0vYmFja3R5cGUvc3Rvcm0vbWV0cmljL2ludGVybmFsL1JhdGVUcmFja2VyVGVzdC5qYXZhIGIvc3Rvcm0tY29yZS90ZXN0L2p2bS9iYWNrdHlwZS9zdG9ybS9tZXRyaWMvaW50ZXJuYWwvUmF0ZVRyYWNrZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGViYjkyMgotLS0gL2Rldi9udWxsCisrKyBiL3N0b3JtLWNvcmUvdGVzdC9qdm0vYmFja3R5cGUvc3Rvcm0vbWV0cmljL2ludGVybmFsL1JhdGVUcmFja2VyVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTQgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICogPHAvPgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiA8cC8+CisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBiYWNrdHlwZS5zdG9ybS5tZXRyaWMuaW50ZXJuYWw7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuKjsKKworLyoqCisgKiBVbml0IHRlc3QgZm9yIFJhdGVUcmFja2VyCisgKi8KK3B1YmxpYyBjbGFzcyBSYXRlVHJhY2tlclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFeGFjdFJhdGUoKSB7CisgICAgICAgIC8vVGhpcyB0ZXN0IGlzIGluIHR3byBwaGFzZXMuICBUaGUgZmlyc3QgcGhhc2UgZmlsbHMgdXAgdGhlIDEwIGJ1Y2tldHMgd2l0aCAxMCB0dXBsZXMgZWFjaAorICAgICAgICAvLyBXZSBwdXJwb3NlbHkgc2ltdWxhdGUgYSAxIHNlY29uZCBidWNrZXQgc2l6ZSBzbyB0aGUgcmF0ZSB3aWxsIGFsd2F5cyBiZSAxMCBwZXIgc2Vjb25kLgorICAgICAgICBmaW5hbCBsb25nIGludGVydmFsID0gMTAwMGw7CisgICAgICAgIGxvbmcgdGltZSA9IDBsOworICAgICAgICBSYXRlVHJhY2tlciBydCA9IG5ldyBSYXRlVHJhY2tlcigxMDAwMCwgMTAsIHRpbWUpOworICAgICAgICBkb3VibGUgW10gZXhwZWN0ZWQgPSBuZXcgZG91YmxlW10gezEwLjAsIDEwLjAsIDEwLjAsIDEwLjAsIDEwLjAsIDEwLjAsIDEwLjAsIDEwLjAsIDEwLjAsIDEwLjB9OworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBkb3VibGUgZXhwID0gZXhwZWN0ZWRbaV07CisgICAgICAgICAgICBydC5ub3RpZnkoMTApOworICAgICAgICAgICAgdGltZSArPSBpbnRlcnZhbDsKKyAgICAgICAgICAgIGRvdWJsZSBhY3R1YWwgPSBydC5yZXBvcnRSYXRlKHRpbWUpOworICAgICAgICAgICAgcnQuZm9yY2VSb3RhdGUoMSwgaW50ZXJ2YWwpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCByYXRlIG9uIGl0ZXJhdGlvbiAiK2krIiBpcyB3cm9uZy4iLCBleHAsIGFjdHVhbCwgMC4wMDAwMSk7CisgICAgICAgIH0KKyAgICAgICAgLy9JbiB0aGUgc2Vjb25kIHBhcnQgb2YgdGhlIHRlc3QgdGhlIHJhdGUgZG91YmxlcyB0byAyMCBwZXIgc2Vjb25kIGJ1dCB0aGUgcmF0ZSB0cmFja2VyCisgICAgICAgIC8vIGluY3JlYXNlcyBpdHMgcmVzdWx0IHNsb3dseSBhcyB3ZSBwdXNoIHRoZSAxMCB0dXBsZXMgcGVyIHNlY29uZCBidWNrZXRzIG91dCBhbmQgcmVscGFjZSB0aGVtCisgICAgICAgIC8vIHdpdGggMjAgdHVwbGVzIHBlciBzZWNvbmQuIAorICAgICAgICBleHBlY3RlZCA9IG5ldyBkb3VibGVbXSB7MTEuMCwgMTIuMCwgMTMuMCwgMTQuMCwgMTUuMCwgMTYuMCwgMTcuMCwgMTguMCwgMTkuMCwgMjAuMH07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWQubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGRvdWJsZSBleHAgPSBleHBlY3RlZFtpXTsKKyAgICAgICAgICAgIHJ0Lm5vdGlmeSgyMCk7CisgICAgICAgICAgICB0aW1lICs9IGludGVydmFsOworICAgICAgICAgICAgZG91YmxlIGFjdHVhbCA9IHJ0LnJlcG9ydFJhdGUodGltZSk7CisgICAgICAgICAgICBydC5mb3JjZVJvdGF0ZSgxLCBpbnRlcnZhbCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIHJhdGUgb24gaXRlcmF0aW9uICIraSsiIGlzIHdyb25nLiIsIGV4cCwgYWN0dWFsLCAwLjAwMDAxKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RWNsaXBzZWRBbGxXaW5kb3dzKCkgeworICAgICAgICBsb25nIHRpbWUgPSAwOworICAgICAgICBSYXRlVHJhY2tlciBydCA9IG5ldyBSYXRlVHJhY2tlcigxMDAwMCwgMTAsIHRpbWUpOworICAgICAgICBydC5ub3RpZnkoMTApOworICAgICAgICBydC5mb3JjZVJvdGF0ZSgxMCwgMTAwMGwpOworICAgICAgICBhc3NlcnRFcXVhbHMoMC4wLCBydC5yZXBvcnRSYXRlKDEwMDAwbCksIDAuMDAwMDEpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVjbGlwc2VkT25lV2luZG93KCkgeworICAgICAgICBsb25nIHRpbWUgPSAwOworICAgICAgICBSYXRlVHJhY2tlciBydCA9IG5ldyBSYXRlVHJhY2tlcigxMDAwMCwgMTAsIHRpbWUpOworICAgICAgICBydC5ub3RpZnkoMSk7CisgICAgICAgIGRvdWJsZSByMSA9IHJ0LnJlcG9ydFJhdGUoMTAwMGwpOworICAgICAgICBydC5mb3JjZVJvdGF0ZSgxLCAxMDAwbCk7CisgICAgICAgIHJ0Lm5vdGlmeSgxKTsKKyAgICAgICAgZG91YmxlIHIyID0gcnQucmVwb3J0UmF0ZSgyMDAwbCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHIxLCByMiwgMC4wMDAwMSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RWNsaXBzZWROaW5lV2luZG93cygpIHsKKyAgICAgICAgbG9uZyB0aW1lID0gMDsKKyAgICAgICAgUmF0ZVRyYWNrZXIgcnQgPSBuZXcgUmF0ZVRyYWNrZXIoMTAwMDAsIDEwLCB0aW1lKTsKKyAgICAgICAgcnQubm90aWZ5KDEpOworICAgICAgICBkb3VibGUgcjEgPSBydC5yZXBvcnRSYXRlKDEwMDApOworICAgICAgICBydC5mb3JjZVJvdGF0ZSg5LCAxMDAwKTsKKyAgICAgICAgcnQubm90aWZ5KDkpOworICAgICAgICBkb3VibGUgcjIgPSBydC5yZXBvcnRSYXRlKDEwMDAwKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMocjEsIHIyLCAwLjAwMDAxKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3Rlc3QvanZtL2JhY2t0eXBlL3N0b3JtL25pbWJ1cy9Jbk1lbW9yeVRvcG9sb2d5QWN0aW9uTm90aWZpZXIuamF2YSBiL3N0b3JtLWNvcmUvdGVzdC9qdm0vYmFja3R5cGUvc3Rvcm0vbmltYnVzL0luTWVtb3J5VG9wb2xvZ3lBY3Rpb25Ob3RpZmllci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2Y2FjNzYKLS0tIC9kZXYvbnVsbAorKysgYi9zdG9ybS1jb3JlL3Rlc3QvanZtL2JhY2t0eXBlL3N0b3JtL25pbWJ1cy9Jbk1lbW9yeVRvcG9sb2d5QWN0aW9uTm90aWZpZXIuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBiYWNrdHlwZS5zdG9ybS5uaW1idXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworCitwdWJsaWMgY2xhc3MgSW5NZW1vcnlUb3BvbG9neUFjdGlvbk5vdGlmaWVyIGltcGxlbWVudHMgIElUb3BvbG9neUFjdGlvbk5vdGlmaWVyUGx1Z2luIHsKKworICAgIC8vc3RhdGljIHRvIGVuc3VyZSBldmVudGhvdWdoIHRoZSBjbGFzcyBpcyBjcmVhdGVkIHVzaW5nIHJlZmxlY3Rpb24gd2UgY2FuIHN0aWxsIGdldAorICAgIC8vdGhlIHRvcG9sb2d5IHRvIGFjdGlvbnMKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBMaW5rZWRMaXN0PFN0cmluZz4+IHRvcG9sb2d5VG9BY3Rpb25zID0gbmV3IEhhc2hNYXA8PigpOworCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBwcmVwYXJlKE1hcCBTdG9ybUNvbmYpIHsKKyAgICAgICAgLy9uby1vcAorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBub3RpZnkoU3RyaW5nIHRvcG9sb2d5TmFtZSwgU3RyaW5nIGFjdGlvbikgeworICAgICAgICBpZighdG9wb2xvZ3lUb0FjdGlvbnMuY29udGFpbnNLZXkodG9wb2xvZ3lOYW1lKSkgeworICAgICAgICAgICAgdG9wb2xvZ3lUb0FjdGlvbnMucHV0KHRvcG9sb2d5TmFtZSwgbmV3IExpbmtlZExpc3Q8U3RyaW5nPigpKTsKKyAgICAgICAgfQorICAgICAgICB0b3BvbG9neVRvQWN0aW9ucy5nZXQodG9wb2xvZ3lOYW1lKS5hZGRMYXN0KGFjdGlvbik7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRUb3BvbG9neUFjdGlvbnMoU3RyaW5nIHRvcG9sb2d5TmFtZSkgeworICAgICAgICByZXR1cm4gdG9wb2xvZ3lUb0FjdGlvbnMuZ2V0KHRvcG9sb2d5TmFtZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2xlYW51cCgpIHsKKyAgICAgICAgLy9uby1vcAorICAgIH0KK30KZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvdGVzdC9qdm0vYmFja3R5cGUvc3Rvcm0vdG9wb2xvZ3kvVG9wb2xvZ3lCdWlsZGVyVGVzdC5qYXZhIGIvc3Rvcm0tY29yZS90ZXN0L2p2bS9iYWNrdHlwZS9zdG9ybS90b3BvbG9neS9Ub3BvbG9neUJ1aWxkZXJUZXN0LmphdmEKaW5kZXggOTM0YmQ2OS4uYzA4OTFhNiAxMDA2NDQKLS0tIGEvc3Rvcm0tY29yZS90ZXN0L2p2bS9iYWNrdHlwZS9zdG9ybS90b3BvbG9neS9Ub3BvbG9neUJ1aWxkZXJUZXN0LmphdmEKKysrIGIvc3Rvcm0tY29yZS90ZXN0L2p2bS9iYWNrdHlwZS9zdG9ybS90b3BvbG9neS9Ub3BvbG9neUJ1aWxkZXJUZXN0LmphdmEKQEAgLTM5LDYgKzM5LDExIEBACiAgICAgICAgIGJ1aWxkZXIuc2V0U3BvdXQoInNwb3V0IiwgbW9jayhJUmljaFNwb3V0LmNsYXNzKSwgMCk7CiAgICAgfQogCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdEFkZFdvcmtlckhvb2soKSB7CisgICAgICAgIGJ1aWxkZXIuYWRkV29ya2VySG9vayhudWxsKTsKKyAgICB9CisKICAgICAvLyBUT0RPIGVuYWJsZSBpZiBzZXRTdGF0ZVNwb3V0IGdldHMgaW1wbGVtZW50ZWQKIC8vICAgIEBUZXN0KGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQogLy8gICAgcHVibGljIHZvaWQgdGVzdFNldFN0YXRlU3BvdXQoKSB7CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3Rlc3QvanZtL2JhY2t0eXBlL3N0b3JtL3V0aWxzL0Rpc3J1cHRvclF1ZXVlQmFja3ByZXNzdXJlVGVzdC5qYXZhIGIvc3Rvcm0tY29yZS90ZXN0L2p2bS9iYWNrdHlwZS9zdG9ybS91dGlscy9EaXNydXB0b3JRdWV1ZUJhY2twcmVzc3VyZVRlc3QuamF2YQppbmRleCAxOTc3NDRmLi5mYzEwYWExIDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3Rlc3QvanZtL2JhY2t0eXBlL3N0b3JtL3V0aWxzL0Rpc3J1cHRvclF1ZXVlQmFja3ByZXNzdXJlVGVzdC5qYXZhCisrKyBiL3N0b3JtLWNvcmUvdGVzdC9qdm0vYmFja3R5cGUvc3Rvcm0vdXRpbHMvRGlzcnVwdG9yUXVldWVCYWNrcHJlc3N1cmVUZXN0LmphdmEKQEAgLTIwLDkgKzIwLDggQEAKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljQm9vbGVhbjsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljTG9uZzsKIAotaW1wb3J0IGNvbS5sbWF4LmRpc3J1cHRvci5CbG9ja2luZ1dhaXRTdHJhdGVneTsKIGltcG9ydCBjb20ubG1heC5kaXNydXB0b3IuRXZlbnRIYW5kbGVyOwotaW1wb3J0IGNvbS5sbWF4LmRpc3J1cHRvci5NdWx0aVRocmVhZGVkQ2xhaW1TdHJhdGVneTsKK2ltcG9ydCBjb20ubG1heC5kaXNydXB0b3IuZHNsLlByb2R1Y2VyVHlwZTsKIGltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OwogaW1wb3J0IG9yZy5qdW5pdC5UZXN0OwogaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKQEAgLTMwLDcgKzI5LDYgQEAKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIAogcHVibGljIGNsYXNzIERpc3J1cHRvclF1ZXVlQmFja3ByZXNzdXJlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXJGYWN0b3J5LmdldExvZ2dlcihEaXNydXB0b3JRdWV1ZUJhY2twcmVzc3VyZVRlc3QuY2xhc3MpOwogCiAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgaW50IE1FU1NBR0VTID0gMTAwOwpAQCAtMzgsNyArMzYsNiBAQAogICAgIHByaXZhdGUgZmluYWwgc3RhdGljIGRvdWJsZSBISUdIX1dBVEVSTUFSSyA9IDAuNjsKICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBkb3VibGUgTE9XX1dBVEVSTUFSSyA9IDAuMjsKIAotCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0QmFja1ByZXNzdXJlQ2FsbGJhY2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKIApAQCAtNTMsNyArNTAsNiBAQAogCiAgICAgICAgIERpc3J1cHRvckJhY2twcmVzc3VyZUNhbGxiYWNrSW1wbCBjYiA9IG5ldyBEaXNydXB0b3JCYWNrcHJlc3N1cmVDYWxsYmFja0ltcGwocXVldWUsIHRocm90dGxlT24sIGNvbnN1bWVyQ3Vyc29yKTsKICAgICAgICAgcXVldWUucmVnaXN0ZXJCYWNrcHJlc3N1cmVDYWxsYmFjayhjYik7Ci0gICAgICAgIHF1ZXVlLmNvbnN1bWVyU3RhcnRlZCgpOwogCiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUVTU0FHRVM7IGkrKykgewogICAgICAgICAgICAgcXVldWUucHVibGlzaChTdHJpbmcudmFsdWVPZihpKSk7CkBAIC02OSw5ICs2NSw5IEBACiAKIAogICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJDaGVjayB0aGUgY2FsbGluZyB0aW1lIG9mIHRocm90dGxlIG9uLiAiLAotICAgICAgICAgICAgICAgIGNiLmhpZ2hXYXRlck1hcmtDYWxsZWRQb3B1bGF0aW9uLCBxdWV1ZS5nZXRIaWdoV2F0ZXJNYXJrKCkpOworICAgICAgICAgICAgICAgIHF1ZXVlLmdldEhpZ2hXYXRlck1hcmsoKSwgY2IuaGlnaFdhdGVyTWFya0NhbGxlZFBvcHVsYXRpb24pOwogICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJDaGVja2luZyB0aGUgY2FsbGluZyB0aW1lIG9mIHRocm90dGxlIG9mZi4gIiwKLSAgICAgICAgICAgICAgICBjYi5sb3dXYXRlck1hcmtDYWxsZWRQb3B1bGF0aW9uLCBxdWV1ZS5nZXRMb3dXYXRlck1hcmsoKSk7CisgICAgICAgICAgICAgICAgcXVldWUuZ2V0TG93V2F0ZXJNYXJrKCksIGNiLmxvd1dhdGVyTWFya0NhbGxlZFBvcHVsYXRpb24pOwogICAgIH0KIAogICAgIGNsYXNzIERpc3J1cHRvckJhY2twcmVzc3VyZUNhbGxiYWNrSW1wbCBpbXBsZW1lbnRzIERpc3J1cHRvckJhY2twcmVzc3VyZUNhbGxiYWNrIHsKQEAgLTk0LDcgKzkwLDcgQEAKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIGhpZ2hXYXRlck1hcmsoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgICAgIGlmICghdGhyb3R0bGVPbi5nZXQoKSkgewotICAgICAgICAgICAgICAgIGhpZ2hXYXRlck1hcmtDYWxsZWRQb3B1bGF0aW9uID0gcXVldWUuZ2V0TWV0cmljcygpLnBvcHVsYXRpb24oKTsKKyAgICAgICAgICAgICAgICBoaWdoV2F0ZXJNYXJrQ2FsbGVkUG9wdWxhdGlvbiA9IHF1ZXVlLmdldE1ldHJpY3MoKS5wb3B1bGF0aW9uKCkgKyBxdWV1ZS5nZXRNZXRyaWNzKCkub3ZlcmZsb3coKTsKICAgICAgICAgICAgICAgICB0aHJvdHRsZU9uLnNldCh0cnVlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTAyLDE0ICs5OCwxMyBAQAogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgbG93V2F0ZXJNYXJrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICAgaWYgKHRocm90dGxlT24uZ2V0KCkpIHsKLSAgICAgICAgICAgICAgICAgbG93V2F0ZXJNYXJrQ2FsbGVkUG9wdWxhdGlvbiA9IHF1ZXVlLmdldE1ldHJpY3MoKS53cml0ZVBvcygpIC0gY29uc3VtZXJDdXJzb3IuZ2V0KCk7CisgICAgICAgICAgICAgICAgIGxvd1dhdGVyTWFya0NhbGxlZFBvcHVsYXRpb24gPSBxdWV1ZS5nZXRNZXRyaWNzKCkud3JpdGVQb3MoKSAtIGNvbnN1bWVyQ3Vyc29yLmdldCgpICsgcXVldWUuZ2V0TWV0cmljcygpLm92ZXJmbG93KCk7CiAgICAgICAgICAgICAgICAgIHRocm90dGxlT24uc2V0KGZhbHNlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBEaXNydXB0b3JRdWV1ZSBjcmVhdGVRdWV1ZShTdHJpbmcgbmFtZSwgaW50IHF1ZXVlU2l6ZSkgewotICAgICAgICByZXR1cm4gbmV3IERpc3J1cHRvclF1ZXVlKG5hbWUsIG5ldyBNdWx0aVRocmVhZGVkQ2xhaW1TdHJhdGVneSgKLSAgICAgICAgICAgICAgICBxdWV1ZVNpemUpLCBuZXcgQmxvY2tpbmdXYWl0U3RyYXRlZ3koKSwgMTBMKTsKKyAgICAgICAgcmV0dXJuIG5ldyBEaXNydXB0b3JRdWV1ZShuYW1lLCBQcm9kdWNlclR5cGUuTVVMVEksIHF1ZXVlU2l6ZSwgMEwsIDEsIDFMKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3Rlc3QvanZtL2JhY2t0eXBlL3N0b3JtL3V0aWxzL0Rpc3J1cHRvclF1ZXVlVGVzdC5qYXZhIGIvc3Rvcm0tY29yZS90ZXN0L2p2bS9iYWNrdHlwZS9zdG9ybS91dGlscy9EaXNydXB0b3JRdWV1ZVRlc3QuamF2YQppbmRleCBkZGMwOTgyLi4yYWUyZDM1IDEwMDY0NAotLS0gYS9zdG9ybS1jb3JlL3Rlc3QvanZtL2JhY2t0eXBlL3N0b3JtL3V0aWxzL0Rpc3J1cHRvclF1ZXVlVGVzdC5qYXZhCisrKyBiL3N0b3JtLWNvcmUvdGVzdC9qdm0vYmFja3R5cGUvc3Rvcm0vdXRpbHMvRGlzcnVwdG9yUXVldWVUZXN0LmphdmEKQEAgLTIwLDEwICsyMCw4IEBACiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0Jvb2xlYW47CiBpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY1JlZmVyZW5jZTsKIAotaW1wb3J0IGNvbS5sbWF4LmRpc3J1cHRvci5CbG9ja2luZ1dhaXRTdHJhdGVneTsKIGltcG9ydCBjb20ubG1heC5kaXNydXB0b3IuRXZlbnRIYW5kbGVyOwotaW1wb3J0IGNvbS5sbWF4LmRpc3J1cHRvci5JbnN1ZmZpY2llbnRDYXBhY2l0eUV4Y2VwdGlvbjsKLWltcG9ydCBjb20ubG1heC5kaXNydXB0b3IuTXVsdGlUaHJlYWRlZENsYWltU3RyYXRlZ3k7CitpbXBvcnQgY29tLmxtYXguZGlzcnVwdG9yLmRzbC5Qcm9kdWNlclR5cGU7CiBpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKIGltcG9ydCBvcmcuanVuaXQuVGVzdDsKIGltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7CkBAIC00MCw5ICszOCw5IEBACiAKICAgICAgICAgcXVldWUucHVibGlzaCgiRklSU1QiKTsKIAotICAgICAgICBSdW5uYWJsZSBwcm9kdWNlciA9IG5ldyBQcm9kdWNlcihxdWV1ZSwgU3RyaW5nLnZhbHVlT2YoaSkpOworICAgICAgICBSdW5uYWJsZSBwcm9kdWNlciA9IG5ldyBJbmNQcm9kdWNlcihxdWV1ZSwgaSsxMDApOwogCi0gICAgICAgIGZpbmFsIEF0b21pY1JlZmVyZW5jZTxPYmplY3Q+IHJlc3VsdCA9IG5ldyBBdG9taWNSZWZlcmVuY2U8T2JqZWN0PigpOworICAgICAgICBmaW5hbCBBdG9taWNSZWZlcmVuY2U8T2JqZWN0PiByZXN1bHQgPSBuZXcgQXRvbWljUmVmZXJlbmNlPD4oKTsKICAgICAgICAgUnVubmFibGUgY29uc3VtZXIgPSBuZXcgQ29uc3VtZXIocXVldWUsIG5ldyBFdmVudEhhbmRsZXI8T2JqZWN0PigpIHsKICAgICAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBoZWFkID0gdHJ1ZTsKIApAQCAtNTYsNzkgKzU0LDEwNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9KTsKIAotICAgICAgICBydW4ocHJvZHVjZXIsIGNvbnN1bWVyKTsKKyAgICAgICAgcnVuKHByb2R1Y2VyLCBjb25zdW1lciwgcXVldWUpOwogICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJXZSBleHBlY3QgdG8gcmVjZWl2ZSBmaXJzdCBwdWJsaXNoZWQgbWVzc2FnZSBmaXJzdCwgYnV0IHJlY2VpdmVkICIgKyByZXN1bHQuZ2V0KCksCiAgICAgICAgICAgICAgICAgIkZJUlNUIiwgcmVzdWx0LmdldCgpKTsKICAgICAgIH0KICAgICB9CiAgICAKICAgICBAVGVzdCAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3VtZXJIYW5nKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgQXRvbWljQm9vbGVhbiBtZXNzYWdlQ29uc3VtZWQgPSBuZXcgQXRvbWljQm9vbGVhbihmYWxzZSk7CisgICAgcHVibGljIHZvaWQgdGVzdEluT3JkZXIoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBmaW5hbCBBdG9taWNCb29sZWFuIGFsbEluT3JkZXIgPSBuZXcgQXRvbWljQm9vbGVhbih0cnVlKTsKIAotICAgICAgICAvLyBTZXQgcXVldWUgbGVuZ3RoIHRvIDEsIHNvIHRoYXQgdGhlIFJpbmdCdWZmZXIgY2FuIGJlIGVhc2lseSBmdWxsCi0gICAgICAgIC8vIHRvIHRyaWdnZXIgY29uc3VtZXIgYmxvY2tpbmcKLSAgICAgICAgRGlzcnVwdG9yUXVldWUgcXVldWUgPSBjcmVhdGVRdWV1ZSgiY29uc3VtZXJIYW5nIiwgMSk7Ci0gICAgICAgIFJ1bm5hYmxlIHByb2R1Y2VyID0gbmV3IFByb2R1Y2VyKHF1ZXVlLCAibXNnIik7CisgICAgICAgIERpc3J1cHRvclF1ZXVlIHF1ZXVlID0gY3JlYXRlUXVldWUoImNvbnN1bWVySGFuZyIsIDEwMjQpOworICAgICAgICBSdW5uYWJsZSBwcm9kdWNlciA9IG5ldyBJbmNQcm9kdWNlcihxdWV1ZSwgMTAyNCoxMDI0KTsKICAgICAgICAgUnVubmFibGUgY29uc3VtZXIgPSBuZXcgQ29uc3VtZXIocXVldWUsIG5ldyBFdmVudEhhbmRsZXI8T2JqZWN0PigpIHsKKyAgICAgICAgICAgIGxvbmcgX2V4cGVjdGVkID0gMDsKICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIHZvaWQgb25FdmVudChPYmplY3Qgb2JqLCBsb25nIHNlcXVlbmNlLCBib29sZWFuIGVuZE9mQmF0Y2gpCiAgICAgICAgICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICAgICAgICAgIG1lc3NhZ2VDb25zdW1lZC5zZXQodHJ1ZSk7CisgICAgICAgICAgICAgICAgaWYgKF9leHBlY3RlZCAhPSAoKE51bWJlcilvYmopLmxvbmdWYWx1ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGFsbEluT3JkZXIuc2V0KGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFeHBlY3RlZCAiK19leHBlY3RlZCsiIGJ1dCBnb3QgIitvYmopOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBfZXhwZWN0ZWQrKzsKICAgICAgICAgICAgIH0KICAgICAgICAgfSk7CiAKLSAgICAgICAgcnVuKHByb2R1Y2VyLCBjb25zdW1lcik7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJkaXNydXB0b3IgbWVzc2FnZSBpcyBuZXZlciBjb25zdW1lZCBkdWUgdG8gY29uc3VtZXIgdGhyZWFkIGhhbmdzIiwKLSAgICAgICAgICAgICAgICBtZXNzYWdlQ29uc3VtZWQuZ2V0KCkpOworICAgICAgICBydW4ocHJvZHVjZXIsIGNvbnN1bWVyLCBxdWV1ZSwgMTAwMCwgMSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJNZXNzYWdlcyBkZWxpdmVyZWQgb3V0IG9mIG9yZGVyIiwKKyAgICAgICAgICAgICAgICBhbGxJbk9yZGVyLmdldCgpKTsKKyAgICB9CisKKyAgICBAVGVzdCAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5PcmRlckJhdGNoKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQXRvbWljQm9vbGVhbiBhbGxJbk9yZGVyID0gbmV3IEF0b21pY0Jvb2xlYW4odHJ1ZSk7CisKKyAgICAgICAgRGlzcnVwdG9yUXVldWUgcXVldWUgPSBjcmVhdGVRdWV1ZSgiY29uc3VtZXJIYW5nIiwgMTAsIDEwMjQpOworICAgICAgICBSdW5uYWJsZSBwcm9kdWNlciA9IG5ldyBJbmNQcm9kdWNlcihxdWV1ZSwgMTAyNCoxMDI0KTsKKyAgICAgICAgUnVubmFibGUgY29uc3VtZXIgPSBuZXcgQ29uc3VtZXIocXVldWUsIG5ldyBFdmVudEhhbmRsZXI8T2JqZWN0PigpIHsKKyAgICAgICAgICAgIGxvbmcgX2V4cGVjdGVkID0gMDsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25FdmVudChPYmplY3Qgb2JqLCBsb25nIHNlcXVlbmNlLCBib29sZWFuIGVuZE9mQmF0Y2gpCisgICAgICAgICAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgICAgIGlmIChfZXhwZWN0ZWQgIT0gKChOdW1iZXIpb2JqKS5sb25nVmFsdWUoKSkgeworICAgICAgICAgICAgICAgICAgICBhbGxJbk9yZGVyLnNldChmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXhwZWN0ZWQgIitfZXhwZWN0ZWQrIiBidXQgZ290ICIrb2JqKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgX2V4cGVjdGVkKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIHJ1bihwcm9kdWNlciwgY29uc3VtZXIsIHF1ZXVlLCAxMDAwLCAxKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIk1lc3NhZ2VzIGRlbGl2ZXJlZCBvdXQgb2Ygb3JkZXIiLAorICAgICAgICAgICAgICAgIGFsbEluT3JkZXIuZ2V0KCkpOwogICAgIH0KIAogCi0gICAgcHJpdmF0ZSB2b2lkIHJ1bihSdW5uYWJsZSBwcm9kdWNlciwgUnVubmFibGUgY29uc3VtZXIpCisgICAgcHJpdmF0ZSB2b2lkIHJ1bihSdW5uYWJsZSBwcm9kdWNlciwgUnVubmFibGUgY29uc3VtZXIsIERpc3J1cHRvclF1ZXVlIHF1ZXVlKQorICAgICAgICAgICAgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgcnVuKHByb2R1Y2VyLCBjb25zdW1lciwgcXVldWUsIDEwLCBQUk9EVUNFUl9OVU0pOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBydW4oUnVubmFibGUgcHJvZHVjZXIsIFJ1bm5hYmxlIGNvbnN1bWVyLCBEaXNydXB0b3JRdWV1ZSBxdWV1ZSwgaW50IHNsZWVwTXMsIGludCBwcm9kdWNlck51bSkKICAgICAgICAgICAgIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CiAKLSAgICAgICAgVGhyZWFkW10gcHJvZHVjZXJUaHJlYWRzID0gbmV3IFRocmVhZFtQUk9EVUNFUl9OVU1dOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFBST0RVQ0VSX05VTTsgaSsrKSB7CisgICAgICAgIFRocmVhZFtdIHByb2R1Y2VyVGhyZWFkcyA9IG5ldyBUaHJlYWRbcHJvZHVjZXJOdW1dOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb2R1Y2VyTnVtOyBpKyspIHsKICAgICAgICAgICAgIHByb2R1Y2VyVGhyZWFkc1tpXSA9IG5ldyBUaHJlYWQocHJvZHVjZXIpOwogICAgICAgICAgICAgcHJvZHVjZXJUaHJlYWRzW2ldLnN0YXJ0KCk7CiAgICAgICAgIH0KICAgICAgICAgCiAgICAgICAgIFRocmVhZCBjb25zdW1lclRocmVhZCA9IG5ldyBUaHJlYWQoY29uc3VtZXIpOwogICAgICAgICBjb25zdW1lclRocmVhZC5zdGFydCgpOwotICAgICAgICBUaHJlYWQuc2xlZXAoMTApOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFBST0RVQ0VSX05VTTsgaSsrKSB7CisgICAgICAgIFRocmVhZC5zbGVlcChzbGVlcE1zKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm9kdWNlck51bTsgaSsrKSB7CiAgICAgICAgICAgICBwcm9kdWNlclRocmVhZHNbaV0uaW50ZXJydXB0KCk7CiAgICAgICAgIH0KLSAgICAgICAgY29uc3VtZXJUaHJlYWQuaW50ZXJydXB0KCk7CiAgICAgICAgIAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFBST0RVQ0VSX05VTTsgaSsrKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvZHVjZXJOdW07IGkrKykgewogICAgICAgICAgICAgcHJvZHVjZXJUaHJlYWRzW2ldLmpvaW4oVElNRU9VVCk7CiAgICAgICAgICAgICBhc3NlcnRGYWxzZSgicHJvZHVjZXIgIitpKyIgaXMgc3RpbGwgYWxpdmUiLCBwcm9kdWNlclRocmVhZHNbaV0uaXNBbGl2ZSgpKTsKICAgICAgICAgfQorICAgICAgICBxdWV1ZS5oYWx0V2l0aEludGVycnVwdCgpOwogICAgICAgICBjb25zdW1lclRocmVhZC5qb2luKFRJTUVPVVQpOwogICAgICAgICBhc3NlcnRGYWxzZSgiY29uc3VtZXIgaXMgc3RpbGwgYWxpdmUiLCBjb25zdW1lclRocmVhZC5pc0FsaXZlKCkpOwogICAgIH0KIAotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFByb2R1Y2VyIGltcGxlbWVudHMgUnVubmFibGUgewotICAgICAgICBwcml2YXRlIFN0cmluZyBtc2c7CisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSW5jUHJvZHVjZXIgaW1wbGVtZW50cyBSdW5uYWJsZSB7CiAgICAgICAgIHByaXZhdGUgRGlzcnVwdG9yUXVldWUgcXVldWU7CisgICAgICAgIHByaXZhdGUgbG9uZyBfbWF4OwogCi0gICAgICAgIFByb2R1Y2VyKERpc3J1cHRvclF1ZXVlIHF1ZXVlLCBTdHJpbmcgbXNnKSB7Ci0gICAgICAgICAgICB0aGlzLm1zZyA9IG1zZzsKKyAgICAgICAgSW5jUHJvZHVjZXIoRGlzcnVwdG9yUXVldWUgcXVldWUsIGxvbmcgbWF4KSB7CiAgICAgICAgICAgICB0aGlzLnF1ZXVlID0gcXVldWU7CisgICAgICAgICAgICB0aGlzLl9tYXggPSBtYXg7CiAgICAgICAgIH0KIAogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgICAgICAgICBxdWV1ZS5wdWJsaXNoKG1zZywgZmFsc2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKEluc3VmZmljaWVudENhcGFjaXR5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBmb3IgKGxvbmcgaSA9IDA7IGkgPCBfbWF4ICYmICEoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pc0ludGVycnVwdGVkKCkpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBxdWV1ZS5wdWJsaXNoKGkpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgfTsKKyAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDb25zdW1lciBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKICAgICAgICAgcHJpdmF0ZSBFdmVudEhhbmRsZXIgaGFuZGxlcjsKQEAgLTE0MSwxOSArMTY3LDIxIEBACiAKICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIHF1ZXVlLmNvbnN1bWVyU3RhcnRlZCgpOwogICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICB3aGlsZSh0cnVlKSB7CiAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLmNvbnN1bWVCYXRjaFdoZW5BdmFpbGFibGUoaGFuZGxlcik7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfWNhdGNoKFJ1bnRpbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgfSBjYXRjaChSdW50aW1lRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAvL2JyZWFrCiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICB9OworICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIERpc3J1cHRvclF1ZXVlIGNyZWF0ZVF1ZXVlKFN0cmluZyBuYW1lLCBpbnQgcXVldWVTaXplKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRGlzcnVwdG9yUXVldWUobmFtZSwgbmV3IE11bHRpVGhyZWFkZWRDbGFpbVN0cmF0ZWd5KAotICAgICAgICAgICAgICAgIHF1ZXVlU2l6ZSksIG5ldyBCbG9ja2luZ1dhaXRTdHJhdGVneSgpLCAxMEwpOworICAgICAgICByZXR1cm4gbmV3IERpc3J1cHRvclF1ZXVlKG5hbWUsIFByb2R1Y2VyVHlwZS5NVUxUSSwgcXVldWVTaXplLCAwTCwgMSwgMUwpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIERpc3J1cHRvclF1ZXVlIGNyZWF0ZVF1ZXVlKFN0cmluZyBuYW1lLCBpbnQgYmF0Y2hTaXplLCBpbnQgcXVldWVTaXplKSB7CisgICAgICAgIHJldHVybiBuZXcgRGlzcnVwdG9yUXVldWUobmFtZSwgUHJvZHVjZXJUeXBlLk1VTFRJLCBxdWV1ZVNpemUsIDBMLCBiYXRjaFNpemUsIDFMKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9zdG9ybS1zdGFydGVyL3Rlc3QvanZtL3N0b3JtL3N0YXJ0ZXIvdG9vbHMvTW9ja1R1cGxlSGVscGVycy5qYXZhIGIvc3Rvcm0tY29yZS90ZXN0L2p2bS9iYWNrdHlwZS9zdG9ybS91dGlscy9Nb2NrVHVwbGVIZWxwZXJzLmphdmEKc2ltaWxhcml0eSBpbmRleCA4MiUKcmVuYW1lIGZyb20gZXhhbXBsZXMvc3Rvcm0tc3RhcnRlci90ZXN0L2p2bS9zdG9ybS9zdGFydGVyL3Rvb2xzL01vY2tUdXBsZUhlbHBlcnMuamF2YQpyZW5hbWUgdG8gc3Rvcm0tY29yZS90ZXN0L2p2bS9iYWNrdHlwZS9zdG9ybS91dGlscy9Nb2NrVHVwbGVIZWxwZXJzLmphdmEKaW5kZXggYjI1MzM1MC4uYTc4YTE2OCAxMDA2NDQKLS0tIGEvZXhhbXBsZXMvc3Rvcm0tc3RhcnRlci90ZXN0L2p2bS9zdG9ybS9zdGFydGVyL3Rvb2xzL01vY2tUdXBsZUhlbHBlcnMuamF2YQorKysgYi9zdG9ybS1jb3JlL3Rlc3QvanZtL2JhY2t0eXBlL3N0b3JtL3V0aWxzL01vY2tUdXBsZUhlbHBlcnMuamF2YQpAQCAtMTUsMTIgKzE1LDEyIEBACiAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwotcGFja2FnZSBzdG9ybS5zdGFydGVyLnRvb2xzOworcGFja2FnZSBiYWNrdHlwZS5zdG9ybS51dGlsczsKIAogaW1wb3J0IGJhY2t0eXBlLnN0b3JtLkNvbnN0YW50czsKIGltcG9ydCBiYWNrdHlwZS5zdG9ybS50dXBsZS5UdXBsZTsKIAotaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLio7CitpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0bzsKIAogcHVibGljIGZpbmFsIGNsYXNzIE1vY2tUdXBsZUhlbHBlcnMgewogCkBAIC0zMiw5ICszMiw5IEBACiAgIH0KIAogICBwdWJsaWMgc3RhdGljIFR1cGxlIG1vY2tUdXBsZShTdHJpbmcgY29tcG9uZW50SWQsIFN0cmluZyBzdHJlYW1JZCkgewotICAgIFR1cGxlIHR1cGxlID0gbW9jayhUdXBsZS5jbGFzcyk7Ci0gICAgd2hlbih0dXBsZS5nZXRTb3VyY2VDb21wb25lbnQoKSkudGhlblJldHVybihjb21wb25lbnRJZCk7Ci0gICAgd2hlbih0dXBsZS5nZXRTb3VyY2VTdHJlYW1JZCgpKS50aGVuUmV0dXJuKHN0cmVhbUlkKTsKKyAgICBUdXBsZSB0dXBsZSA9IE1vY2tpdG8ubW9jayhUdXBsZS5jbGFzcyk7CisgICAgTW9ja2l0by53aGVuKHR1cGxlLmdldFNvdXJjZUNvbXBvbmVudCgpKS50aGVuUmV0dXJuKGNvbXBvbmVudElkKTsKKyAgICBNb2NraXRvLndoZW4odHVwbGUuZ2V0U291cmNlU3RyZWFtSWQoKSkudGhlblJldHVybihzdHJlYW1JZCk7CiAgICAgcmV0dXJuIHR1cGxlOwogICB9CiB9CmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3Rlc3QvanZtL2JhY2t0eXBlL3N0b3JtL3V0aWxzL1JhdGVUcmFja2VyVGVzdC5qYXZhIGIvc3Rvcm0tY29yZS90ZXN0L2p2bS9iYWNrdHlwZS9zdG9ybS91dGlscy9SYXRlVHJhY2tlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDExYmJmNi4uMDAwMDAwMAotLS0gYS9zdG9ybS1jb3JlL3Rlc3QvanZtL2JhY2t0eXBlL3N0b3JtL3V0aWxzL1JhdGVUcmFja2VyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoqCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiA8cC8+Ci0gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIDxwLz4KLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGJhY2t0eXBlLnN0b3JtLnV0aWxzOwotCi1pbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLS8qKgotICogVW5pdCB0ZXN0IGZvciBSYXRlVHJhY2tlcgotICovCi1wdWJsaWMgY2xhc3MgUmF0ZVRyYWNrZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RWNsaXBzZWRBbGxXaW5kb3dzKCkgewotICAgICAgICBSYXRlVHJhY2tlciBydCA9IG5ldyBSYXRlVHJhY2tlcigxMDAwMCwgMTAsIHRydWUpOwotICAgICAgICBydC5ub3RpZnkoMTApOwotICAgICAgICBydC5mb3JjZVVwZGF0ZVNsaWRlcygxMCk7Ci0gICAgICAgIGFzc2VydCAocnQucmVwb3J0UmF0ZSgpID09IDApOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEVjbGlwc2VkT25lV2luZG93KCkgewotICAgICAgICBSYXRlVHJhY2tlciBydCA9IG5ldyBSYXRlVHJhY2tlcigxMDAwMCwgMTAsIHRydWUpOwotICAgICAgICBydC5ub3RpZnkoMSk7Ci0gICAgICAgIGZsb2F0IHIxID0gcnQucmVwb3J0UmF0ZSgpOwotICAgICAgICBydC5mb3JjZVVwZGF0ZVNsaWRlcygxKTsKLSAgICAgICAgcnQubm90aWZ5KDEpOwotICAgICAgICBmbG9hdCByMiA9IHJ0LnJlcG9ydFJhdGUoKTsKLQotICAgICAgICBTeXN0ZW0ub3V0LmZvcm1hdCgicjE6JWYsIHIyOiVmXG4iLCByMSwgcjIpOwotCi0gICAgICAgIGFzc2VydCAocjEgPT0gcjIpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEVjbGlwc2VkTmluZVdpbmRvd3MoKSB7Ci0gICAgICAgIFJhdGVUcmFja2VyIHJ0ID0gbmV3IFJhdGVUcmFja2VyKDEwMDAwLCAxMCwgdHJ1ZSk7Ci0gICAgICAgIHJ0Lm5vdGlmeSgxKTsKLSAgICAgICAgZmxvYXQgcjEgPSBydC5yZXBvcnRSYXRlKCk7Ci0gICAgICAgIHJ0LmZvcmNlVXBkYXRlU2xpZGVzKDkpOwotICAgICAgICBydC5ub3RpZnkoOSk7Ci0gICAgICAgIGZsb2F0IHIyID0gcnQucmVwb3J0UmF0ZSgpOwotCi0gICAgICAgIGFzc2VydCAocjEgPT0gcjIpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zdG9ybS1jb3JlL3Rlc3QvanZtL2JhY2t0eXBlL3N0b3JtL3V0aWxzL1RocmlmdFRvcG9sb2d5VXRpbHNUZXN0LmphdmEgYi9zdG9ybS1jb3JlL3Rlc3QvanZtL2JhY2t0eXBlL3N0b3JtL3V0aWxzL1RocmlmdFRvcG9sb2d5VXRpbHNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc5MzY2NQotLS0gL2Rldi9udWxsCisrKyBiL3N0b3JtLWNvcmUvdGVzdC9qdm0vYmFja3R5cGUvc3Rvcm0vdXRpbHMvVGhyaWZ0VG9wb2xvZ3lVdGlsc1Rlc3QuamF2YQpAQCAtMCwwICsxLDk0IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBiYWNrdHlwZS5zdG9ybS51dGlsczsKKworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLmdlbmVyYXRlZC4qOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLmhvb2tzLkJhc2VXb3JrZXJIb29rOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTWFwOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlU2V0OworaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitwdWJsaWMgY2xhc3MgVGhyaWZ0VG9wb2xvZ3lVdGlsc1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNXb3JrZXJIb29rKCkgeworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGZhbHNlLCBUaHJpZnRUb3BvbG9neVV0aWxzLmlzV29ya2VySG9vayhTdG9ybVRvcG9sb2d5Ll9GaWVsZHMuQk9MVFMpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhmYWxzZSwgVGhyaWZ0VG9wb2xvZ3lVdGlscy5pc1dvcmtlckhvb2soU3Rvcm1Ub3BvbG9neS5fRmllbGRzLlNQT1VUUykpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGZhbHNlLCBUaHJpZnRUb3BvbG9neVV0aWxzLmlzV29ya2VySG9vayhTdG9ybVRvcG9sb2d5Ll9GaWVsZHMuU1RBVEVfU1BPVVRTKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHModHJ1ZSwgVGhyaWZ0VG9wb2xvZ3lVdGlscy5pc1dvcmtlckhvb2soU3Rvcm1Ub3BvbG9neS5fRmllbGRzLldPUktFUl9IT09LUykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldENvbXBvbmVudElkc1dpdGhXb3JrZXJIb29rKCkgeworICAgICAgICBTdG9ybVRvcG9sb2d5IHN0b3JtVG9wb2xvZ3kgPSBnZW5lcmVhdGVTdG9ybVRvcG9sb2d5KHRydWUpOworICAgICAgICBTZXQ8U3RyaW5nPiBjb21wb25lbnRJZHMgPSBUaHJpZnRUb3BvbG9neVV0aWxzLmdldENvbXBvbmVudElkcyhzdG9ybVRvcG9sb2d5KTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiV2UgZXhwZWN0IHRvIGdldCB0aGUgSURzIG9mIHRoZSBjb21wb25lbnRzIHNhbnMgdGhlIFdvcmtlciBIb29rIiwKKyAgICAgICAgICAgICAgICBJbW11dGFibGVTZXQub2YoImJvbHQtMSIsICJzcG91dC0xIiksCisgICAgICAgICAgICAgICAgY29tcG9uZW50SWRzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRDb21wb25lbnRJZHNXaXRob3V0V29ya2VySG9vaygpIHsKKyAgICAgICAgU3Rvcm1Ub3BvbG9neSBzdG9ybVRvcG9sb2d5ID0gZ2VuZXJlYXRlU3Rvcm1Ub3BvbG9neShmYWxzZSk7CisgICAgICAgIFNldDxTdHJpbmc+IGNvbXBvbmVudElkcyA9IFRocmlmdFRvcG9sb2d5VXRpbHMuZ2V0Q29tcG9uZW50SWRzKHN0b3JtVG9wb2xvZ3kpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICJXZSBleHBlY3QgdG8gZ2V0IHRoZSBJRHMgb2YgdGhlIGNvbXBvbmVudHMgc2FucyB0aGUgV29ya2VyIEhvb2siLAorICAgICAgICAgICAgICAgIEltbXV0YWJsZVNldC5vZigiYm9sdC0xIiwgInNwb3V0LTEiKSwKKyAgICAgICAgICAgICAgICBjb21wb25lbnRJZHMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldENvbXBvbmVudENvbW1vbldpdGhXb3JrZXJIb29rKCkgeworICAgICAgICBTdG9ybVRvcG9sb2d5IHN0b3JtVG9wb2xvZ3kgPSBnZW5lcmVhdGVTdG9ybVRvcG9sb2d5KHRydWUpOworICAgICAgICBDb21wb25lbnRDb21tb24gY29tcG9uZW50Q29tbW9uID0gVGhyaWZ0VG9wb2xvZ3lVdGlscy5nZXRDb21wb25lbnRDb21tb24oc3Rvcm1Ub3BvbG9neSwgImJvbHQtMSIpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICJXZSBleHBlY3QgdG8gZ2V0IGJvbHQtMSdzIGNvbW1vbiIsCisgICAgICAgICAgICAgICAgbmV3IEJvbHQoKS5nZXRfY29tbW9uKCksCisgICAgICAgICAgICAgICAgY29tcG9uZW50Q29tbW9uKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRDb21wb25lbnRDb21tb25XaXRob3V0V29ya2VySG9vaygpIHsKKyAgICAgICAgU3Rvcm1Ub3BvbG9neSBzdG9ybVRvcG9sb2d5ID0gZ2VuZXJlYXRlU3Rvcm1Ub3BvbG9neShmYWxzZSk7CisgICAgICAgIENvbXBvbmVudENvbW1vbiBjb21wb25lbnRDb21tb24gPSBUaHJpZnRUb3BvbG9neVV0aWxzLmdldENvbXBvbmVudENvbW1vbihzdG9ybVRvcG9sb2d5LCAiYm9sdC0xIik7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIldlIGV4cGVjdCB0byBnZXQgYm9sdC0xJ3MgY29tbW9uIiwKKyAgICAgICAgICAgICAgICBuZXcgQm9sdCgpLmdldF9jb21tb24oKSwKKyAgICAgICAgICAgICAgICBjb21wb25lbnRDb21tb24pOworICAgIH0KKworICAgIHByaXZhdGUgU3Rvcm1Ub3BvbG9neSBnZW5lcmVhdGVTdG9ybVRvcG9sb2d5KGJvb2xlYW4gd2l0aFdvcmtlckhvb2spIHsKKyAgICAgICAgSW1tdXRhYmxlTWFwPFN0cmluZyxTcG91dFNwZWM+IHNwb3V0cyA9IEltbXV0YWJsZU1hcC5vZigic3BvdXQtMSIsIG5ldyBTcG91dFNwZWMoKSk7CisgICAgICAgIEltbXV0YWJsZU1hcDxTdHJpbmcsQm9sdD4gYm9sdHMgPSBJbW11dGFibGVNYXAub2YoImJvbHQtMSIsIG5ldyBCb2x0KCkpOworICAgICAgICBJbW11dGFibGVNYXA8U3RyaW5nLFN0YXRlU3BvdXRTcGVjPiBzdGF0ZV9zcG91dHMgPSBJbW11dGFibGVNYXAub2YoKTsKKworICAgICAgICBTdG9ybVRvcG9sb2d5IHN0b3JtVG9wb2xvZ3kgPSBuZXcgU3Rvcm1Ub3BvbG9neShzcG91dHMsIGJvbHRzLCBzdGF0ZV9zcG91dHMpOworCisgICAgICAgIGlmKHdpdGhXb3JrZXJIb29rKSB7CisgICAgICAgICAgICBCYXNlV29ya2VySG9vayB3b3JrZXJIb29rID0gbmV3IEJhc2VXb3JrZXJIb29rKCk7CisgICAgICAgICAgICBzdG9ybVRvcG9sb2d5LmFkZF90b193b3JrZXJfaG9va3MoQnl0ZUJ1ZmZlci53cmFwKFV0aWxzLmphdmFTZXJpYWxpemUod29ya2VySG9vaykpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzdG9ybVRvcG9sb2d5OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3N0b3JtLWNvcmUvdGVzdC9qdm0vYmFja3R5cGUvc3Rvcm0vd2luZG93aW5nL1dpbmRvd01hbmFnZXJUZXN0LmphdmEgYi9zdG9ybS1jb3JlL3Rlc3QvanZtL2JhY2t0eXBlL3N0b3JtL3dpbmRvd2luZy9XaW5kb3dNYW5hZ2VyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MzE4MTcKLS0tIC9kZXYvbnVsbAorKysgYi9zdG9ybS1jb3JlL3Rlc3QvanZtL2JhY2t0eXBlL3N0b3JtL3dpbmRvd2luZy9XaW5kb3dNYW5hZ2VyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjUwIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBiYWNrdHlwZS5zdG9ybS53aW5kb3dpbmc7CisKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCitpbXBvcnQgc3RhdGljIGJhY2t0eXBlLnN0b3JtLnRvcG9sb2d5LmJhc2UuQmFzZVdpbmRvd2VkQm9sdC5Db3VudDsKK2ltcG9ydCBzdGF0aWMgYmFja3R5cGUuc3Rvcm0udG9wb2xvZ3kuYmFzZS5CYXNlV2luZG93ZWRCb2x0LkR1cmF0aW9uOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIFVuaXQgdGVzdHMgZm9yIHtAbGluayBXaW5kb3dNYW5hZ2VyfQorICovCitwdWJsaWMgY2xhc3MgV2luZG93TWFuYWdlclRlc3QgeworICAgIHByaXZhdGUgV2luZG93TWFuYWdlcjxJbnRlZ2VyPiB3aW5kb3dNYW5hZ2VyOworICAgIHByaXZhdGUgTGlzdGVuZXIgbGlzdGVuZXI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBMaXN0ZW5lciBpbXBsZW1lbnRzIFdpbmRvd0xpZmVjeWNsZUxpc3RlbmVyPEludGVnZXI+IHsKKyAgICAgICAgTGlzdDxJbnRlZ2VyPiBvbkV4cGlyeUV2ZW50cyA9IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworICAgICAgICBMaXN0PEludGVnZXI+IG9uQWN0aXZhdGlvbkV2ZW50cyA9IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworICAgICAgICBMaXN0PEludGVnZXI+IG9uQWN0aXZhdGlvbk5ld0V2ZW50cyA9IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworICAgICAgICBMaXN0PEludGVnZXI+IG9uQWN0aXZhdGlvbkV4cGlyZWRFdmVudHMgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25FeHBpcnkoTGlzdDxJbnRlZ2VyPiBldmVudHMpIHsKKyAgICAgICAgICAgIG9uRXhwaXJ5RXZlbnRzID0gZXZlbnRzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQWN0aXZhdGlvbihMaXN0PEludGVnZXI+IGV2ZW50cywgTGlzdDxJbnRlZ2VyPiBuZXdFdmVudHMsIExpc3Q8SW50ZWdlcj4gZXhwaXJlZCkgeworICAgICAgICAgICAgb25BY3RpdmF0aW9uRXZlbnRzID0gZXZlbnRzOworICAgICAgICAgICAgb25BY3RpdmF0aW9uTmV3RXZlbnRzID0gbmV3RXZlbnRzOworICAgICAgICAgICAgb25BY3RpdmF0aW9uRXhwaXJlZEV2ZW50cyA9IGV4cGlyZWQ7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGNsZWFyKCkgeworICAgICAgICAgICAgb25FeHBpcnlFdmVudHMgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKyAgICAgICAgICAgIG9uQWN0aXZhdGlvbkV2ZW50cyA9IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworICAgICAgICAgICAgb25BY3RpdmF0aW9uTmV3RXZlbnRzID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgICAgICAgICAgICBvbkFjdGl2YXRpb25FeHBpcmVkRXZlbnRzID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIGxpc3RlbmVyID0gbmV3IExpc3RlbmVyKCk7CisgICAgICAgIHdpbmRvd01hbmFnZXIgPSBuZXcgV2luZG93TWFuYWdlcjw+KGxpc3RlbmVyKTsKKyAgICB9CisKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKKyAgICAgICAgd2luZG93TWFuYWdlci5zaHV0ZG93bigpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvdW50QmFzZWRXaW5kb3coKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgd2luZG93TWFuYWdlci5zZXRXaW5kb3dMZW5ndGgobmV3IENvdW50KDUpKTsKKyAgICAgICAgd2luZG93TWFuYWdlci5zZXRTbGlkaW5nSW50ZXJ2YWwobmV3IENvdW50KDIpKTsKKyAgICAgICAgd2luZG93TWFuYWdlci5hZGQoMSk7CisgICAgICAgIHdpbmRvd01hbmFnZXIuYWRkKDIpOworICAgICAgICAvLyBub3RoaW5nIGV4cGlyZWQgeWV0CisgICAgICAgIGFzc2VydFRydWUobGlzdGVuZXIub25FeHBpcnlFdmVudHMuaXNFbXB0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHNlcSgxLCAyKSwgbGlzdGVuZXIub25BY3RpdmF0aW9uRXZlbnRzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHNlcSgxLCAyKSwgbGlzdGVuZXIub25BY3RpdmF0aW9uTmV3RXZlbnRzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShsaXN0ZW5lci5vbkFjdGl2YXRpb25FeHBpcmVkRXZlbnRzLmlzRW1wdHkoKSk7CisgICAgICAgIHdpbmRvd01hbmFnZXIuYWRkKDMpOworICAgICAgICB3aW5kb3dNYW5hZ2VyLmFkZCg0KTsKKyAgICAgICAgLy8gbm90aGluZyBleHBpcmVkIHlldAorICAgICAgICBhc3NlcnRUcnVlKGxpc3RlbmVyLm9uRXhwaXJ5RXZlbnRzLmlzRW1wdHkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhzZXEoMSwgNCksIGxpc3RlbmVyLm9uQWN0aXZhdGlvbkV2ZW50cyk7CisgICAgICAgIGFzc2VydEVxdWFscyhzZXEoMywgNCksIGxpc3RlbmVyLm9uQWN0aXZhdGlvbk5ld0V2ZW50cyk7CisgICAgICAgIGFzc2VydFRydWUobGlzdGVuZXIub25BY3RpdmF0aW9uRXhwaXJlZEV2ZW50cy5pc0VtcHR5KCkpOworICAgICAgICB3aW5kb3dNYW5hZ2VyLmFkZCg1KTsKKyAgICAgICAgd2luZG93TWFuYWdlci5hZGQoNik7CisgICAgICAgIC8vIDEgZXhwaXJlZAorICAgICAgICBhc3NlcnRFcXVhbHMoc2VxKDEpLCBsaXN0ZW5lci5vbkV4cGlyeUV2ZW50cyk7CisgICAgICAgIGFzc2VydEVxdWFscyhzZXEoMiwgNiksIGxpc3RlbmVyLm9uQWN0aXZhdGlvbkV2ZW50cyk7CisgICAgICAgIGFzc2VydEVxdWFscyhzZXEoNSwgNiksIGxpc3RlbmVyLm9uQWN0aXZhdGlvbk5ld0V2ZW50cyk7CisgICAgICAgIGFzc2VydEVxdWFscyhzZXEoMSksIGxpc3RlbmVyLm9uQWN0aXZhdGlvbkV4cGlyZWRFdmVudHMpOworICAgICAgICBsaXN0ZW5lci5jbGVhcigpOworICAgICAgICB3aW5kb3dNYW5hZ2VyLmFkZCg3KTsKKyAgICAgICAgLy8gbm90aGluZyBleHBpcmVzIHVudGlsIHRocmVzaG9sZCBpcyBoaXQKKyAgICAgICAgYXNzZXJ0VHJ1ZShsaXN0ZW5lci5vbkV4cGlyeUV2ZW50cy5pc0VtcHR5KCkpOworICAgICAgICB3aW5kb3dNYW5hZ2VyLmFkZCg4KTsKKyAgICAgICAgLy8gMSBleHBpcmVkCisgICAgICAgIGFzc2VydEVxdWFscyhzZXEoMiwgMyksIGxpc3RlbmVyLm9uRXhwaXJ5RXZlbnRzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHNlcSg0LCA4KSwgbGlzdGVuZXIub25BY3RpdmF0aW9uRXZlbnRzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHNlcSg3LCA4KSwgbGlzdGVuZXIub25BY3RpdmF0aW9uTmV3RXZlbnRzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHNlcSgyLCAzKSwgbGlzdGVuZXIub25BY3RpdmF0aW9uRXhwaXJlZEV2ZW50cyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhwaXJlVGhyZXNob2xkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGludCB0aHJlc2hvbGQgPSBXaW5kb3dNYW5hZ2VyLkVYUElSRV9FVkVOVFNfVEhSRVNIT0xEOworICAgICAgICBpbnQgd2luZG93TGVuZ3RoID0gNTsKKyAgICAgICAgd2luZG93TWFuYWdlci5zZXRXaW5kb3dMZW5ndGgobmV3IENvdW50KDUpKTsKKyAgICAgICAgd2luZG93TWFuYWdlci5zZXRTbGlkaW5nSW50ZXJ2YWwobmV3IER1cmF0aW9uKDEsIFRpbWVVbml0LkhPVVJTKSk7CisgICAgICAgIGZvciAoaW50IGkgOiBzZXEoMSwgNSkpIHsKKyAgICAgICAgICAgIHdpbmRvd01hbmFnZXIuYWRkKGkpOworICAgICAgICB9CisgICAgICAgIC8vIG5vdGhpbmcgZXhwaXJlZCB5ZXQKKyAgICAgICAgYXNzZXJ0VHJ1ZShsaXN0ZW5lci5vbkV4cGlyeUV2ZW50cy5pc0VtcHR5KCkpOworICAgICAgICBmb3IgKGludCBpIDogc2VxKDYsIDEwKSkgeworICAgICAgICAgICAgd2luZG93TWFuYWdlci5hZGQoaSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA6IHNlcSgxMSwgdGhyZXNob2xkKSkgeworICAgICAgICAgICAgd2luZG93TWFuYWdlci5hZGQoaSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gd2luZG93IHNob3VsZCBiZSBjb21wYWN0ZWQgYW5kIGV2ZW50cyBzaG91bGQgYmUgZXhwaXJlZC4KKyAgICAgICAgYXNzZXJ0RXF1YWxzKHNlcSgxLCB0aHJlc2hvbGQgLSB3aW5kb3dMZW5ndGgpLCBsaXN0ZW5lci5vbkV4cGlyeUV2ZW50cyk7CisgICAgfQorCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUaW1lQmFzZWRXaW5kb3coKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgd2luZG93TWFuYWdlci5zZXRXaW5kb3dMZW5ndGgobmV3IER1cmF0aW9uKDEsIFRpbWVVbml0LlNFQ09ORFMpKTsKKyAgICAgICAgd2luZG93TWFuYWdlci5zZXRTbGlkaW5nSW50ZXJ2YWwobmV3IER1cmF0aW9uKDEwMCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKSk7CisgICAgICAgIGxvbmcgbm93ID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKyAgICAgICAgLy8gYWRkIHdpdGggcGFzdCB0cworICAgICAgICBmb3IgKGludCBpIDogc2VxKDEsIDUwKSkgeworICAgICAgICAgICAgd2luZG93TWFuYWdlci5hZGQoaSwgbm93IC0gMTAwMCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBhZGQgd2l0aCBjdXJyZW50IHRzCisgICAgICAgIGZvciAoaW50IGkgOiBzZXEoNTEsIFdpbmRvd01hbmFnZXIuRVhQSVJFX0VWRU5UU19USFJFU0hPTEQpKSB7CisgICAgICAgICAgICB3aW5kb3dNYW5hZ2VyLmFkZChpLCBub3cpOworICAgICAgICB9CisgICAgICAgIC8vIGZpcnN0IDUwIHNob3VsZCBoYXZlIGV4cGlyZWQgZHVlIHRvIGV4cGlyZSBldmVudHMgdGhyZXNob2xkCisgICAgICAgIGFzc2VydEVxdWFscyg1MCwgbGlzdGVuZXIub25FeHBpcnlFdmVudHMuc2l6ZSgpKTsKKworICAgICAgICAvLyBhZGQgbW9yZSBldmVudHMgd2l0aCBwYXN0IHRzCisgICAgICAgIGZvciAoaW50IGkgOiBzZXEoV2luZG93TWFuYWdlci5FWFBJUkVfRVZFTlRTX1RIUkVTSE9MRCArIDEsIFdpbmRvd01hbmFnZXIuRVhQSVJFX0VWRU5UU19USFJFU0hPTEQgKyAxMDApKSB7CisgICAgICAgICAgICB3aW5kb3dNYW5hZ2VyLmFkZChpLCBub3cgLSAxMDAwKTsKKyAgICAgICAgfQorICAgICAgICAvLyB3YWl0IGZvciB0aW1lIHRyaWdnZXIKKyAgICAgICAgVGhyZWFkLnNsZWVwKDEyMCk7CisKKyAgICAgICAgLy8gMTAwIGV2ZW50cyB3aXRoIHBhc3QgdHMgc2hvdWxkIGV4cGlyZQorICAgICAgICBhc3NlcnRFcXVhbHMoMTAwLCBsaXN0ZW5lci5vbkV4cGlyeUV2ZW50cy5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoc2VxKFdpbmRvd01hbmFnZXIuRVhQSVJFX0VWRU5UU19USFJFU0hPTEQgKyAxLCBXaW5kb3dNYW5hZ2VyLkVYUElSRV9FVkVOVFNfVEhSRVNIT0xEICsgMTAwKSwKKyAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLm9uRXhwaXJ5RXZlbnRzKTsKKyAgICAgICAgTGlzdDxJbnRlZ2VyPiBhY3RpdmF0aW9uc0V2ZW50cyA9IHNlcSg1MSwgV2luZG93TWFuYWdlci5FWFBJUkVfRVZFTlRTX1RIUkVTSE9MRCk7CisgICAgICAgIGFzc2VydEVxdWFscyhzZXEoNTEsIFdpbmRvd01hbmFnZXIuRVhQSVJFX0VWRU5UU19USFJFU0hPTEQpLCBsaXN0ZW5lci5vbkFjdGl2YXRpb25FdmVudHMpOworICAgICAgICBhc3NlcnRFcXVhbHMoc2VxKDUxLCBXaW5kb3dNYW5hZ2VyLkVYUElSRV9FVkVOVFNfVEhSRVNIT0xEKSwgbGlzdGVuZXIub25BY3RpdmF0aW9uTmV3RXZlbnRzKTsKKyAgICAgICAgLy8gYWN0aXZhdGlvbiBleHBpcmVkIGxpc3Qgc2hvdWxkIGNvbnRhaW4gZXZlbiB0aGUgb25lcyBleHBpcmVkIGR1ZSB0byBFWFBJUkVfRVZFTlRTX1RIUkVTSE9MRAorICAgICAgICBMaXN0PEludGVnZXI+IGV4cGlyZWRMaXN0ID0gc2VxKDEsIDUwKTsKKyAgICAgICAgZXhwaXJlZExpc3QuYWRkQWxsKHNlcShXaW5kb3dNYW5hZ2VyLkVYUElSRV9FVkVOVFNfVEhSRVNIT0xEICsgMSwgV2luZG93TWFuYWdlci5FWFBJUkVfRVZFTlRTX1RIUkVTSE9MRCArIDEwMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwaXJlZExpc3QsIGxpc3RlbmVyLm9uQWN0aXZhdGlvbkV4cGlyZWRFdmVudHMpOworCisgICAgICAgIGxpc3RlbmVyLmNsZWFyKCk7CisgICAgICAgIC8vIGFkZCBtb3JlIGV2ZW50cyB3aXRoIGN1cnJlbnQgdHMKKyAgICAgICAgTGlzdDxJbnRlZ2VyPiBuZXdFdmVudHMgPSBzZXEoV2luZG93TWFuYWdlci5FWFBJUkVfRVZFTlRTX1RIUkVTSE9MRCArIDEwMSwgV2luZG93TWFuYWdlci5FWFBJUkVfRVZFTlRTX1RIUkVTSE9MRCArIDIwMCk7CisgICAgICAgIGZvciAoaW50IGkgOiBuZXdFdmVudHMpIHsKKyAgICAgICAgICAgIHdpbmRvd01hbmFnZXIuYWRkKGksIG5vdyk7CisgICAgICAgIH0KKyAgICAgICAgYWN0aXZhdGlvbnNFdmVudHMuYWRkQWxsKG5ld0V2ZW50cyk7CisgICAgICAgIC8vIHdhaXQgZm9yIHRpbWUgdHJpZ2dlcgorICAgICAgICBUaHJlYWQuc2xlZXAoMTIwKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShsaXN0ZW5lci5vbkV4cGlyeUV2ZW50cy5pc0VtcHR5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoYWN0aXZhdGlvbnNFdmVudHMsIGxpc3RlbmVyLm9uQWN0aXZhdGlvbkV2ZW50cyk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXdFdmVudHMsIGxpc3RlbmVyLm9uQWN0aXZhdGlvbk5ld0V2ZW50cyk7CisKKyAgICB9CisKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRpbWVCYXNlZFdpbmRvd0V4cGlyeSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB3aW5kb3dNYW5hZ2VyLnNldFdpbmRvd0xlbmd0aChuZXcgRHVyYXRpb24oMTAwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKTsKKyAgICAgICAgd2luZG93TWFuYWdlci5zZXRTbGlkaW5nSW50ZXJ2YWwobmV3IER1cmF0aW9uKDYwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKTsKKyAgICAgICAgLy8gYWRkIDEwIGV2ZW50cworICAgICAgICBmb3IgKGludCBpIDogc2VxKDEsIDEwKSkgeworICAgICAgICAgICAgd2luZG93TWFuYWdlci5hZGQoaSk7CisgICAgICAgIH0KKyAgICAgICAgVGhyZWFkLnNsZWVwKDcwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHNlcSgxLCAxMCksIGxpc3RlbmVyLm9uQWN0aXZhdGlvbkV2ZW50cyk7CisgICAgICAgIGFzc2VydFRydWUobGlzdGVuZXIub25BY3RpdmF0aW9uRXhwaXJlZEV2ZW50cy5pc0VtcHR5KCkpOworICAgICAgICBsaXN0ZW5lci5jbGVhcigpOworICAgICAgICAvLyB3YWl0IHNvIGFsbCBldmVudHMgZXhwaXJlCisgICAgICAgIFRocmVhZC5zbGVlcCg3MCk7CisgICAgICAgIGFzc2VydEVxdWFscyhzZXEoMSwgMTApLCBsaXN0ZW5lci5vbkFjdGl2YXRpb25FeHBpcmVkRXZlbnRzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShsaXN0ZW5lci5vbkFjdGl2YXRpb25FdmVudHMuaXNFbXB0eSgpKTsKKyAgICAgICAgbGlzdGVuZXIuY2xlYXIoKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKDcwKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShsaXN0ZW5lci5vbkFjdGl2YXRpb25FeHBpcmVkRXZlbnRzLmlzRW1wdHkoKSk7CisgICAgICAgIGFzc2VydFRydWUobGlzdGVuZXIub25BY3RpdmF0aW9uRXZlbnRzLmlzRW1wdHkoKSk7CisKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUdW1ibGluZ1dpbmRvdygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB3aW5kb3dNYW5hZ2VyLnNldFdpbmRvd0xlbmd0aChuZXcgQ291bnQoMykpOworICAgICAgICB3aW5kb3dNYW5hZ2VyLnNldFNsaWRpbmdJbnRlcnZhbChuZXcgQ291bnQoMykpOworICAgICAgICB3aW5kb3dNYW5hZ2VyLmFkZCgxKTsKKyAgICAgICAgd2luZG93TWFuYWdlci5hZGQoMik7CisgICAgICAgIC8vIG5vdGhpbmcgZXhwaXJlZCB5ZXQKKyAgICAgICAgYXNzZXJ0VHJ1ZShsaXN0ZW5lci5vbkV4cGlyeUV2ZW50cy5pc0VtcHR5KCkpOworICAgICAgICB3aW5kb3dNYW5hZ2VyLmFkZCgzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShsaXN0ZW5lci5vbkV4cGlyeUV2ZW50cy5pc0VtcHR5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoc2VxKDEsIDMpLCBsaXN0ZW5lci5vbkFjdGl2YXRpb25FdmVudHMpOworICAgICAgICBhc3NlcnRUcnVlKGxpc3RlbmVyLm9uQWN0aXZhdGlvbkV4cGlyZWRFdmVudHMuaXNFbXB0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHNlcSgxLCAzKSwgbGlzdGVuZXIub25BY3RpdmF0aW9uTmV3RXZlbnRzKTsKKworICAgICAgICBsaXN0ZW5lci5jbGVhcigpOworICAgICAgICB3aW5kb3dNYW5hZ2VyLmFkZCg0KTsKKyAgICAgICAgd2luZG93TWFuYWdlci5hZGQoNSk7CisgICAgICAgIHdpbmRvd01hbmFnZXIuYWRkKDYpOworCisgICAgICAgIGFzc2VydEVxdWFscyhzZXEoMSwgMyksIGxpc3RlbmVyLm9uRXhwaXJ5RXZlbnRzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHNlcSg0LCA2KSwgbGlzdGVuZXIub25BY3RpdmF0aW9uRXZlbnRzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHNlcSgxLCAzKSwgbGlzdGVuZXIub25BY3RpdmF0aW9uRXhwaXJlZEV2ZW50cyk7CisgICAgICAgIGFzc2VydEVxdWFscyhzZXEoNCwgNiksIGxpc3RlbmVyLm9uQWN0aXZhdGlvbk5ld0V2ZW50cyk7CisKKyAgICB9CisKKyAgICBwcml2YXRlIExpc3Q8SW50ZWdlcj4gc2VxKGludCBzdGFydCkgeworICAgICAgICByZXR1cm4gc2VxKHN0YXJ0LCBzdGFydCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBMaXN0PEludGVnZXI+IHNlcShpbnQgc3RhcnQsIGludCBzdG9wKSB7CisgICAgICAgIExpc3Q8SW50ZWdlcj4gaW50cyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPD0gc3RvcDsgaSsrKSB7CisgICAgICAgICAgICBpbnRzLmFkZChpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaW50czsKKyAgICB9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3Rvcm0tY29yZS90ZXN0L2p2bS9zdG9ybS90cmlkZW50L1Rlc3RUcmlkZW50VG9wb2xvZ3kuamF2YSBiL3N0b3JtLWNvcmUvdGVzdC9qdm0vc3Rvcm0vdHJpZGVudC9UZXN0VHJpZGVudFRvcG9sb2d5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIwMjE4YQotLS0gL2Rldi9udWxsCisrKyBiL3N0b3JtLWNvcmUvdGVzdC9qdm0vc3Rvcm0vdHJpZGVudC9UZXN0VHJpZGVudFRvcG9sb2d5LmphdmEKQEAgLTAsMCArMSw3NiBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBzdG9ybS50cmlkZW50OworCitpbXBvcnQgYmFja3R5cGUuc3Rvcm0uZ2VuZXJhdGVkLkJvbHQ7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0uZ2VuZXJhdGVkLlN0b3JtVG9wb2xvZ3k7CitpbXBvcnQgYmFja3R5cGUuc3Rvcm0udHVwbGUuRmllbGRzOworaW1wb3J0IGJhY2t0eXBlLnN0b3JtLnR1cGxlLlZhbHVlczsKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0b3JtLnRyaWRlbnQub3BlcmF0aW9uLmJ1aWx0aW4uQ291bnQ7CitpbXBvcnQgc3Rvcm0udHJpZGVudC5vcGVyYXRpb24uYnVpbHRpbi5TdW07CitpbXBvcnQgc3Rvcm0udHJpZGVudC50ZXN0aW5nLkZpeGVkQmF0Y2hTcG91dDsKK2ltcG9ydCBzdG9ybS50cmlkZW50LnRlc3RpbmcuU3BsaXQ7CitpbXBvcnQgc3Rvcm0udHJpZGVudC50ZXN0aW5nLlN0cmluZ0xlbmd0aDsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworcHVibGljIGNsYXNzIFRlc3RUcmlkZW50VG9wb2xvZ3kgeworCisgICAgcHJpdmF0ZSBTdG9ybVRvcG9sb2d5IGJ1aWxkVG9wb2xvZ3koKSB7CisgICAgICAgIEZpeGVkQmF0Y2hTcG91dCBzcG91dCA9IG5ldyBGaXhlZEJhdGNoU3BvdXQobmV3IEZpZWxkcygic2VudGVuY2UiKSwgMywKKyAgICAgICAgICAgICAgICBuZXcgVmFsdWVzKCJ0aGUgY293IGp1bXBlZCBvdmVyIHRoZSBtb29uIiksCisgICAgICAgICAgICAgICAgbmV3IFZhbHVlcygidGhlIG1hbiB3ZW50IHRvIHRoZSBzdG9yZSBhbmQgYm91Z2h0IHNvbWUgY2FuZHkiKSwKKyAgICAgICAgICAgICAgICBuZXcgVmFsdWVzKCJmb3VyIHNjb3JlIGFuZCBzZXZlbiB5ZWFycyBhZ28iKSwKKyAgICAgICAgICAgICAgICBuZXcgVmFsdWVzKCJob3cgbWFueSBhcHBsZXMgY2FuIHlvdSBlYXQiKSk7CisgICAgICAgIHNwb3V0LnNldEN5Y2xlKHRydWUpOworCisgICAgICAgIFRyaWRlbnRUb3BvbG9neSB0b3BvbG9neSA9IG5ldyBUcmlkZW50VG9wb2xvZ3koKTsKKyAgICAgICAgdG9wb2xvZ3kubmV3U3RyZWFtKCJzcG91dCIsIHNwb3V0KQorICAgICAgICAgICAgICAgIC8vbm8gbmFtZQorICAgICAgICAgICAgICAgIC5lYWNoKG5ldyBGaWVsZHMoInNlbnRlbmNlIiksIG5ldyBTcGxpdCgpLCBuZXcgRmllbGRzKCJ3b3JkIikpCisgICAgICAgICAgICAgICAgLnBhcnRpdGlvbkJ5KG5ldyBGaWVsZHMoIndvcmQiKSkKKyAgICAgICAgICAgICAgICAubmFtZSgiYWJjIikKKyAgICAgICAgICAgICAgICAuZWFjaChuZXcgRmllbGRzKCJ3b3JkIiksIG5ldyBTdHJpbmdMZW5ndGgoKSwgbmV3IEZpZWxkcygibGVuZ3RoIikpCisgICAgICAgICAgICAgICAgLnBhcnRpdGlvbkJ5KG5ldyBGaWVsZHMoImxlbmd0aCIpKQorICAgICAgICAgICAgICAgIC5uYW1lKCJkZWYiKQorICAgICAgICAgICAgICAgIC5hZ2dyZWdhdGUobmV3IEZpZWxkcygibGVuZ3RoIiksIG5ldyBDb3VudCgpLCBuZXcgRmllbGRzKCJjb3VudCIpKQorICAgICAgICAgICAgICAgIC5wYXJ0aXRpb25CeShuZXcgRmllbGRzKCJjb3VudCIpKQorICAgICAgICAgICAgICAgIC5uYW1lKCJnaGkiKQorICAgICAgICAgICAgICAgIC5hZ2dyZWdhdGUobmV3IEZpZWxkcygiY291bnQiKSwgbmV3IFN1bSgpLCBuZXcgRmllbGRzKCJzdW0iKSk7CisgICAgICAgIHJldHVybiB0b3BvbG9neS5idWlsZCgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdlbkJvbHRJZCgpIHsKKyAgICAgICAgU2V0PFN0cmluZz4gcHJlID0gbnVsbDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykgeworICAgICAgICAgICAgU3Rvcm1Ub3BvbG9neSB0b3BvbG9neSA9IGJ1aWxkVG9wb2xvZ3koKTsKKyAgICAgICAgICAgIE1hcDxTdHJpbmcsIEJvbHQ+IGN1ciA9IHRvcG9sb2d5LmdldF9ib2x0cygpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGN1ci5rZXlTZXQoKSk7CisgICAgICAgICAgICBpZiAocHJlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiYm9sZCBpZCBub3QgY29uc2lzdGVudCB3aXRoIGdyb3VwIG5hbWUiLCBwcmUuZXF1YWxzKGN1ci5rZXlTZXQoKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJlID0gY3VyLmtleVNldCgpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9zdG9ybS1kaXN0L2JpbmFyeS9MSUNFTlNFIGIvc3Rvcm0tZGlzdC9iaW5hcnkvTElDRU5TRQppbmRleCBiNTJhNmI1Li42OTNjZmFmIDEwMDY0NAotLS0gYS9zdG9ybS1kaXN0L2JpbmFyeS9MSUNFTlNFCisrKyBiL3N0b3JtLWRpc3QvYmluYXJ5L0xJQ0VOU0UKQEAgLTU2OCwzICs1NjgsMzIgQEAKIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCiBTT0ZUV0FSRS4KIAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRm9yIHN0YXRpc3RpYyBpbWFnZQorCitzdG9ybS1jb3JlL3NyYy91aS9wdWJsaWMvaW1hZ2VzL3N0YXRpc3RpYy5wbmcKKworQ29weXJpZ2h0IChjKSAyMDE1IEdpdGh1YiwgSW5jLgorCisKK1Blcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkKK29mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCitpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCit0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsCitjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKK2Z1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKworVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KK2FsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKK0FVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKK0xJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCitPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCitUSEUgU09GVFdBUkUuCisKZGlmZiAtLWdpdCBhL3N0b3JtLWRpc3QvYmluYXJ5L3NyYy9tYWluL2Fzc2VtYmx5L2JpbmFyeS54bWwgYi9zdG9ybS1kaXN0L2JpbmFyeS9zcmMvbWFpbi9hc3NlbWJseS9iaW5hcnkueG1sCmluZGV4IDlmNmM4ZjcuLmNmZDRmYWIgMTAwNjQ0Ci0tLSBhL3N0b3JtLWRpc3QvYmluYXJ5L3NyYy9tYWluL2Fzc2VtYmx5L2JpbmFyeS54bWwKKysrIGIvc3Rvcm0tZGlzdC9iaW5hcnkvc3JjL21haW4vYXNzZW1ibHkvYmluYXJ5LnhtbApAQCAtMzAsMzggKzMwLDYgQEAKICAgICAgICAgICAgIDx1c2VQcm9qZWN0QXJ0aWZhY3Q+ZmFsc2U8L3VzZVByb2plY3RBcnRpZmFjdD4KICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+bGliPC9vdXRwdXREaXJlY3Rvcnk+CiAgICAgICAgICAgICA8dW5wYWNrPmZhbHNlPC91bnBhY2s+Ci0gICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnLmFwYWNoZS50aHJpZnQ6KjwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZT5pby5uZXR0eTpuZXR0eTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZT5jb20uZ29vZ2xlLmd1YXZhOmd1YXZhPC9leGNsdWRlPgotICAgICAgICAgICAgICAgIDxleGNsdWRlPm9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHM6aHR0cCo8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnLmFwYWNoZS56b29rZWVwZXI6em9va2VlcGVyPC9leGNsdWRlPgotICAgICAgICAgICAgICAgIDxleGNsdWRlPm9yZy5hcGFjaGUuY3VyYXRvcjoqPC9leGNsdWRlPgotICAgICAgICAgICAgICAgIDxleGNsdWRlPm9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHM6aHR0cCo8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnLmFwYWNoZS56b29rZWVwZXI6em9va2VlcGVyPC9leGNsdWRlPgotICAgICAgICAgICAgICAgIDxleGNsdWRlPm9yZy5hcGFjaGUuY3VyYXRvcjoqPC9leGNsdWRlPgotICAgICAgICAgICAgICAgIDxleGNsdWRlPmNvbS50d2l0dGVyOmNhcmJvbml0ZTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZT5jb20udHdpdHRlcjpjaGlsbC1qYXZhPC9leGNsdWRlPgotICAgICAgICAgICAgICAgIDxleGNsdWRlPm9yZy5vYmplbmVzaXM6b2JqZW5lc2lzPC9leGNsdWRlPgotICAgICAgICAgICAgICAgIDxleGNsdWRlPm9yZy50dWthYW5pOnh6PC9leGNsdWRlPgotICAgICAgICAgICAgICAgIDxleGNsdWRlPm9yZy55YW1sOnNuYWtleWFtbDwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZT5vcmcuamdyYXBodDpqZ3JhcGh0LWNvcmU8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGU+Y29tbW9ucy1odHRwY2xpZW50OmNvbW1vbnMtaHR0cGNsaWVudDwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZT5vcmcuYXBhY2hlLmNvbW1vbnM6Y29tbW9ucy1jb21wcmVzczwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZT5vcmcuYXBhY2hlLmNvbW1vbnM6Y29tbW9ucy1leGVjPC9leGNsdWRlPgotICAgICAgICAgICAgICAgIDxleGNsdWRlPmNvbW1vbnMtaW86Y29tbW9ucy1pbzwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZT5jb21tb25zLWNvZGVjOmNvbW1vbnMtY29kZWM8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGU+Y29tbW9ucy1maWxldXBsb2FkOmNvbW1vbnMtZmlsZXVwbG9hZDwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZT5jb21tb25zLWxhbmc6Y29tbW9ucy1sYW5nPC9leGNsdWRlPgotICAgICAgICAgICAgICAgIDxleGNsdWRlPmNvbS5nb29nbGVjb2RlLmpzb24tc2ltcGxlOmpzb24tc2ltcGxlPC9leGNsdWRlPgotICAgICAgICAgICAgICAgIDxleGNsdWRlPm9yZy5jbG9qdXJlOm1hdGgubnVtZXJpYy10b3dlcjwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZT5vcmcuY2xvanVyZTp0b29scy5jbGk8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnLmNsb2p1cmU6dG9vbHMubWFjcm88L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGU+am9kYS10aW1lOmpvZGEtdGltZTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICA8ZXhjbHVkZT5vcmcuZWNsaXBzZS5qZXR0eToqPC9leGNsdWRlPgotICAgICAgICAgICAgICAgIDxleGNsdWRlPmNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5jb3JlOio8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgPGV4Y2x1ZGU+Y29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFmb3JtYXQ6KjwvZXhjbHVkZT4KLSAgICAgICAgICAgIDwvZXhjbHVkZXM+CiAgICAgICAgIDwvZGVwZW5kZW5jeVNldD4KICAgICA8L2RlcGVuZGVuY3lTZXRzPgogCkBAIC0zNDksMTEgKzMxNyw2IEBACiAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5Pi88L291dHB1dERpcmVjdG9yeT4KICAgICAgICAgPC9maWxlPgogICAgICAgICA8ZmlsZT4KLSAgICAgICAgICAgIDxzb3VyY2U+JHtwcm9qZWN0LmJhc2VkaXJ9Ly4uLy4uL0RJU0NMQUlNRVI8L3NvdXJjZT4KLSAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+Lzwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICA8L2ZpbGU+Ci0KLSAgICAgICAgPGZpbGU+CiAgICAgICAgICAgICA8c291cmNlPiR7cHJvamVjdC5iYXNlZGlyfS8uLi8uLi9DSEFOR0VMT0cubWQ8L3NvdXJjZT4KICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+Lzwvb3V0cHV0RGlyZWN0b3J5PgogICAgICAgICA8L2ZpbGU+Cg==